## 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.CreateObjectFromPreset2( 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