## CopyPaste

### Introduced

v1.0

### Description

Pastes a copy of something without going through the clipboard. This is the scripting equivalent of a drag-and-drop operation. You can use this command to move items that already exist in the scene (for example, reparenting a scene object) or to paste items that are sitting in the TransientObjectContainer (for example, instances of built-in property sets such as the Annotation).
Note: The CopyPaste command is the only way to transfer things from the TransientObjectContainer to the current scene, because the TransientObjectContainer is inaccessible from the UI.
Warning: Prior to v7.0, you could also use this command to create a shader from preset and copy it to the TransientObjectContainer until you were ready to connect it in the RenderTree. However, this command no longer supports that functionality: now you must create a temporary copy of the shader in the scene's material library ("Sources.Materials.DefaultLib.Scene_Material") using the CreateShaderFromPreset command instead. See the ReplaceShader reference page for an example.

### Scripting Syntax

    CopyPaste( [Source], [FileName], Target, [Mode] );

### Parameters

Parameter | Type | Description
--- | --- | ---
Source | String | Object to copy
FileName | String | File or preset to import in the scene
Target | String | Target object
Mode | vbCopyPaste constant or Integer | The (VisualBasic) mode to copy paste. Default Value: vbDefaultCopyPaste
Possible Values: | Description:
vbDefaultCopyPaste (0) | Use the default mode of copy paste.
vbCutSource (1) | Cut and paste
vbCopySource (2) | Copy and paste
vbLinkSource (3) | Link source to destination.

### Examples

#### 1. Python Example

    #
    # Example of creating a temporary custom property (aka custom pset)
    # which can be written to before actually depositing in the scene
    #
    app = Application
    from win32com.client import constants as c
    app.NewScene( "", 0 )
    # Demonstrate how you can use it to create a built-in custom pset
    presetFullPath = XSIUtils.BuildPath(
            app.InstallationPath(c.siFactoryPath),
            "Data", "DSPresets", "Properties", "Annotation.Preset"
    )
    oAnnotation = app.CreateObjectFromPreset( presetFullPath, "Notes" )
    if ( oAnnotation ) :
            # Even though it only exists on the clipboard you can still populate it
            app.InspectObj( oAnnotation, "", "Annotation Test", "siModal", 0 )
            # Notice how the owner of this annotation doesn't have to
            # exist until you are ready to cut-and-paste it
            oNull = app.ActiveSceneRoot.AddModel("", "Jerry")
            app.CopyPaste(oAnnotation, "", oNull, 1)
            # Just to prove that it exists any modifications
            for oParam in oNull.Properties("Notes").Parameters :
                    app.LogMessage( oParam.Name + ": " + str(oParam.Value) )
    else :
            app.LogMessage( "Couldn't create Annotatation property." )
    # Expected results (similar to):
    # INFO : Title:
    # INFO : Text: need to refine right bicep
    # INFO : Keyword: modeling
    # INFO : Flag 1: False
    # INFO : Flag 2: True

#### 2. JScript Example

    /*
            This example demonstrates how to use the CopyPaste command to
            reparent scene objects by physically moving objects under
            their new parents (a la drag-and-drop in the UI).
    */
    // Create a new scene with 4 nulls
    var app = Application;
    NewScene(null, false);
    GetPrim("Null");
    GetPrim("Null");
    GetPrim("Null");
    GetPrim("Null");
    // Reparent null2 and null3 under null1
    CopyPaste("null3", null, "null1", 1);
    CopyPaste("null2", null, "null1", 1);
    // Reparent null under null2
    CopyPaste("null", null, "null2", 1);
    // Print the visual hierarchy
    ShowMeTheHierarchy(app.ActiveSceneRoot, "");
    // Expected results:
    // INFO : Camera_Root
    // INFO : ...Camera
    // INFO : ...Camera_Interest
    // INFO : light
    // INFO : null1
    // INFO : ...null3
    // INFO : ...null2
    // INFO : ......null
    // Convenience function to print out a graphical representation
    // of the hierarchy in the scene starting at the specified object
    function ShowMeTheHierarchy(in_parent, in_depth)
    {
            var kid = new Enumerator(in_parent.Children);
            for (; !kid.atEnd(); kid.moveNext()) {
                    app.LogMessage(in_depth + kid.item().FullName);
                    if (kid.item().Children.Count) {
                            ShowMeTheHierarchy(kid.item(), in_depth + "...");
                    }
            }
    }

### See Also

Copy Cut Paste CopyAnimation