v1.0
Adds properties to objects.
Notice that UV cluster properties and vertex color properties can
only be added to clusters which are always complete, see Geometry.AddCluster
method.
Note: This command uses output
arguments. C# and some scripting languages (such as JScript,
PerlScript and Python) don't support arguments passed by reference
so you need to use the best workaround for your situation:
For scripting languages this command returns an ISIVTCollection which you can
use to get the output arguments.
For C# you can use the XSIApplication.ExecuteCommand
method to call this command. ExecuteCommand packs the output
arguments into a C# System.Object containing an Array of the output arguments (see
Calling
Commands from C#).
AddProp( PresetObj, [InputObjs], [Propagation], [PropertyName], [Value] ); |
| Parameter | Type | Description |
|---|---|---|
| PresetObj | String or a preset object (see SIGetPreset) | One of the Property Presets |
| InputObjs | String | List of objects.
Default Value: Currently selected objects |
| Propagation | siPropagationType | Propagation type for property
Default Value: siDefaultPropagation (node) |
| PropertyName | String | Name of property |
| Value | XSICollection | Returns the new properties in an XSICollection. Note: For backwards compatibility, ClassName returns "Object" when you test this collection, but if you test it with XSICollection.Type, it returns "XSICollection". Tip: Each member of the returned collection is a Property object. |
'
' This example demonstrates how to add the RenderMap property to both a sphere and
' a cube and then shows how you can use the returned Property objects by accessing
' them as members of the returned collection.
'
' Note: In this example we are using the XSIApplication.ClassName method instead
' of the VBScript TypeName function to provide a distinction between
' class type and what we test with the Type property, but you can use
' either.
'
NewScene , false
' Add a sphere to the scene
Set oSphere = CreatePrim( "Sphere", "NurbsSurface" )
' Add a sphere to the scene
Set oCube = CreatePrim( "Cube", "NurbsSurface" )
' Create rendermaps on the sphere and cube; the AddProp command returns the
' output object as an XSICollection of 2, so you can get each RenderMap
' as a Property object from the returned collection
AddProp "RenderMap", oSphere & "," & oCube, , , oRtnColl
' Test the type of the return value
PrintInfo oRtnColl
' Get only the sphere's rendermap as a Property object
' Note: We could also use 'Set oRMap = oRtnColl(0)' to
' accomplish the same thing, but this is more precise
For Each mbr In oRtnColl
If mbr.Parent = oSphere Then
Set oRMap = mbr
End If
Next
' Specify a destination directory and name for the new image file
' Note: Since the new object is a real Property object, we can use
' the object model to get its parameters
oRMap.Parameters( "imagefile" ).Value = InstallationPath( siUserPath ) _
& "\temp\rendermap.pic"
' Add a texture projection to the sphere and attach the rendermap to it
CreateProjection oSphere, siTxtUV, siTxtDefaultSpherical, sSupport, sProj
SetInstanceDataValue , oRMap.Parameters( "uvprop" ), sProj
' Now add an annotation property to the sphere and test it
AddProp "Annotation", oSphere, , , oNewRtnColl
PrintInfo oNewRtnColl
' This is just a utility function to separate the printing procedure
' from the rest of the example
function PrintInfo( in_coll )
' Print the class type (ie., Object, X3DObject, Property, etc.)
LogMessage "========="
LogMessage "ClassName: " & ClassName( in_coll )
' This prevents an error if the specified object is invalid
if ClassName( in_coll ) <> "Nothing" then
' This prevents us from trying to use collection functions
' on a non-collection object (XSICollections returned from
' commands report that they have the "Object" class type:
' this is for backwards compatibility)
if ( ClassName( in_coll ) = "Object" AND in_coll.Type = "XSICollection" ) _
OR ClassName( in_coll ) = "ISIVTCollection" _
then
' ISIVTCollections can be enumerated but they don't
' support the Type property, so we'll skip that for
' ISIVTCollections
if ClassName( in_coll ) = "ISIVTCollection" then
' Convert the ISIVTCollection to an XSICollection (now
' we can continue with the XSICollection-specific tests)
Set in_coll = in_coll.item(1)
' Test it again to make sure it's really an XSICollection
LogMessage "Type after conversion: " & in_coll.Type
end if
' Loop through the collection and print the name, type and
' class type of each item
LogMessage ""
LogMessage "This collection contains the following ( " _
& in_coll.Count & " ) members ........"
for each member in in_coll
' Note: None of this information will be printed if the
' collection is empty
LogMessage vbTab & "Name: " & member.Name
LogMessage vbTab & "Type: " & member.Type
LogMessage vbTab & "ClassName: " & ClassName( member )
LogMessage "---------"
next
elseif ClassName( in_coll ) = "CollectionItem" then
' Print the name, type and class type of the item
LogMessage vbTab & "Name: " & member.Name
LogMessage vbTab & "Type: " & member.Type
LogMessage vbTab & "ClassName: " & ClassName( member )
end if
end if
LogMessage "End of collection information.................................."
end function
' Output of above script:
'INFO : "========="
'INFO : "ClassName: Object"
'INFO : ""
'INFO : "This collection contains the following ( 2 ) members ........"
'INFO : " Name: RenderMap"
'INFO : " Type: rendermap"
'INFO : " ClassName: Property"
'INFO : "---------"
'INFO : " Name: RenderMap"
'INFO : " Type: rendermap"
'INFO : " ClassName: Property"
'INFO : "---------"
'INFO : "End of collection information.................................."
CreateProjection "sphere", siTxtUV, siTxtDefaultSpherical, , "Texture_Projection", , siRelDefault
SetInstanceDataValue , "sphere.RenderMap.uvprop", "Texture_Projection"
AddProp "Annotation", "sphere", siDefaultPropagation
'INFO : "========="
'INFO : "ClassName: Object"
'INFO : ""
'INFO : "This collection contains the following ( 1 ) members ........"
'INFO : " Name: Annotation"
'INFO : " Type: customparamset"
'INFO : " ClassName: CustomProperty"
'INFO : "---------"
'INFO : "End of collection information.................................."
|
/*
This JScript example illustrates how to use the AddProp command to add an
annotation property to a null object. Of special interest in this example
is how we use the returned object to extract an array of output arguments
(since JScript does not support output arguments).
Note: In this example we are using the XSIApplication.ClassName method
which is the equivalent of the VBScript TypeName function (for which
there is no native JScript equivalent).
*/
NewScene( null , false );
// Add a null to the scene
var oSphere = GetPrim( "Null" );
// Add an annotation to the null; the AddProp command returns the output
// object as an XSICollection of 1, so you can get the actual annotation
// as a Property object by resetting the object pointer to the first
// member of the returned collection
var oRtnColl = AddProp( "Annotation", oSphere, siDefaultPropagation, "Jenny" );
// Test the type of the return value
PrintInfo( oRtnColl );
// To get the Property object, set the reference to the first member of
// the collection
//var oRMap = oRtnColl(0);
// This is just a utility function to separate the printing procedure
// from the rest of the example
function PrintInfo( in_coll )
{
// Print the class type (ie., Object, X3DObject, Property, etc.)
LogMessage( "=========" );
LogMessage( "ClassName: " + ClassName( in_coll ) );
// This prevents an error if the specified object is invalid
if ( ClassName( in_coll ) != "Nothing" )
{
// This prevents us from trying to use collection functions
// on a non-collection object (XSICollections returned from
// commands report that they have the "Object" class type:
// this is for backwards compatibility)
if ( ( ClassName( in_coll ) == "Object" && in_coll.Type() == "XSICollection" ) ||
ClassName( in_coll ) == "ISIVTCollection" )
{
// ISIVTCollections can be enumerated but they don't
// support the Type property, so we'll skip that for
// ISIVTCollections
if ( ClassName( in_coll ) == "ISIVTCollection" )
{
// Convert the ISIVTCollection to an XSICollection (now
// we can continue with the XSICollection-specific tests)
in_coll = in_coll.item(1);
// Test it again to make sure it's really an XSICollection
LogMessage( "Type after conversion: " + in_coll.Type );
}
// Loop through the collection and print the name, type and
// class type of each item
LogMessage( "" );
LogMessage( "This collection contains the following ( "
+ in_coll.Count + " ) members ........" );
for ( i=0; i<in_coll.count; i++ )
{
LogMessage( "\tName: " + in_coll.item(i).Name );
LogMessage( "\tType: " + in_coll.item(i).Type);
LogMessage( "\tClassName: " + ClassName( in_coll.item(i) ) );
}
}
else
{
// Print error message
LogMessage( "Object is not a collection at all." );
}
}
LogMessage( "End of collection information.................................." );
}
// Output of above script:
//INFO : "========="
//INFO : "ClassName: ISIVTCollection"
//INFO : "Type after conversion: XSICollection"
//INFO : ""
//INFO : "This collection contains the following ( 1 ) members ........"
//INFO : " Name: Jenny"
//INFO : " Type: customparamset"
//INFO : " ClassName: CustomProperty"
//INFO : "End of collection information.................................."
|