v5.1
Returns information in XML format about which objects read from
and write to an object. The connection stack is called the ConstructionHistory in the context
of a Primitive.
The connection stack can contain connections to Operators, FCurves,
Shaders and other objects, so it is more
than just a "Operator Stack". The order of the objects in the
connection stack is important because it determines the order in
which the scene is evaluated. For example, if a scripted operator
reads from a Primitive above a deform operator that reads and
writes to the Primitive, then the scripted operator will read the
deformed version of the geometry, not the original version.
This method returns low-level information, including the presence
of hidden objects, that is intended for internal Softimage usage.
It is exposed in the SDK primarily to help users write and debug
CustomOperators.
The format of the XML may change in the future. Currently it
returns the following possible attributes:
object - SIObject.FullName of
the object. Empty if there is no active connection.
type - "in" or "out". If "in" it means that the object being
queried is reading data from the connected object.
localparameter - Some connections read and write to a specific
Parameter. In that case this contains
the Parameter.ScriptName.
remoteparameter - If the connection is to a specific parameter on
the connected object, then this contains its Parameter.ScriptName.
hidden - "true" if the object has the siNotInspectable capability.
See ProjectItem.Capabilities.
region - For internal use.
datacopy - For internal use. This is the internal handle to the
object, for example "0x1c9f0448". The value of this handle serves
no meaningful purpose in the context of the SDK. Softimage may
create several temporary "datacopies" of an individual object to
assist in the clean evaluation of the scene.
oString = DataRepository.GetConnectionStackInfo( Object ); |
XML String, containing the connections in a top-to-bottom ordering.
Parameter | Type | Description |
---|---|---|
Object | Softimage Object | Object to query, for example a Property or Primitive. Connections are managed at the object level, not the Parameter level. |
/* This example demonstrates how to use DataRepository.GetConnectionStackInfo to find which objects read from a particular object. */ NewScene( null, false ) ; CreatePrim( "Sphere", "MeshSurface" ); ApplyOp( "Twist", "sphere", 3, siPersistentOperation, null, 0 ); SetSelFilter( "Vertex" ); AddToSelection( "sphere.pnt[26,33]", null, true ); Translate( null, 1, 0.2, -1.2, siRelative, siView, siObj, siXYZ ); SelectObj( "Sphere.polymsh" ) ; // Get the connection information var oDR = XSIUtils.DataRepository ; opInfo = oDR.GetConnectionStackInfo( Selection(0) ) // This line would dump the actual XML content: //Application.LogMessage( "\n----------------\nRAW XML OUTPUT\n------------------\n" + opInfo ) ; // Get the list of output objects aOutputs = GetOutputObjects( opInfo ) ; Application.LogMessage( "Objects that read from the Sphere primitive:\n" + aOutputs.join("\n") ) ; // Helper function to load the XML data using the Microsoft // implementation of the DOM (see msdn.microsoft.com for documentation) function ParseXML( strXML ) { var oXMLParser = new ActiveXObject( "Microsoft.XMLDOM" ) oXMLParser.async = false oXMLParser.loadXML( opInfo ) ; if (oXMLParser.parseError.errorCode != 0) { Application.LogMessage( "Invalid XML " + oXMLParser.parseError.reason , siError ) ; return null ; } // the xsi_file node // If this is NULL we must have failed to load the XML var oTopNode = oXMLParser.documentElement ; return oTopNode ; } // Go through the connection information and determine which connected // operators/objects are reading from the object // // opInfo is the XML string returned by calling DataRespository.GetOperatorStackInfo function GetOutputObjects( opInfo ) { aOutputs = new Array() ; var oTopNode = ParseXML( opInfo ) ; if ( oTopNode == null ) return aOutputs ; var oConnections = oTopNode.childNodes ; for ( var i = 0 ; i < oConnections.length ; i++ ) { oConnection= oConnections.item(i) ; oObjNode = oConnection.selectSingleNode( "object" ) ; strObj = oObjNode.text ; oTypeNode = oConnection.selectSingleNode( "type" ) ; if ( oTypeNode != null && oTypeNode.text == "out" ) aOutputs[aOutputs.length] = strObj ; } return aOutputs ; } //Example output: // //INFO : Objects that read from the Sphere primitive: //sphere.polymsh.secondaryshapemarker //sphere.polymsh.animationmarker //sphere.polymsh.shapemarker //sphere.polymsh.modelingmarker //sphere.polymsh.movecomponentop //sphere.polymsh.cls.Point_INTERNAL.AddToClsOp //sphere.polymsh.twistop //sphere.polymsh.cls.default_Point.SetClsOp |
/* This example demonstrates how to use DataRepository.GetConnectionStackInfo to find which objects are influenced by a parameter. */ // Create simple scene NewScene( null, false ); var oSphere = ActiveSceneRoot.AddGeometry( "Sphere", "MeshSurface", "sphere" ) ; var oSphereGlobalPosx = oSphere.Kinematics.Global.posx ; // posy parameter on light will be driven by posx parameter of the sphere. // (This creates an Expression object between the two parameters) CopyPaste( oSphereGlobalPosx, null, "light.kine.global.posy", 1 ); // posz parameter will also be driven by the posx parameter CopyPaste( oSphereGlobalPosx, null, "light.kine.global.posz", 1 ); aDependentData = FindDataDrivenByParameter( oSphereGlobalPosx ) for ( var i = 0 ; i < aDependentData.length ; i++ ) { Application.LogMessage( aDependentData[i] ) ; } // Get the connection information for a particular parameter. It returns an // array of strings with the full name of the expression operator or other // object that is reading the value of the in_Parameter argument function FindDataDrivenByParameter( in_Parameter ) { var aConnections = [] ; // Connection information is managed at the Object level, not Parameter level var oObj = in_Parameter.Parent ; var oDR = XSIUtils.DataRepository ; opInfo = oDR.GetConnectionStackInfo( oObj ) var oXMLParser = new ActiveXObject( "Microsoft.XMLDOM" ) oXMLParser.async = false oXMLParser.loadXML( opInfo ) ; var oTopNode = oXMLParser.documentElement ; var oConnections = oTopNode.childNodes ; for ( var i = 0 ; i < oConnections.length ; i++ ) { var oConnection = oConnections(i) ; oObjNode = oConnection.selectSingleNode( "object" ) ; if ( oObjNode == null ) continue ; // Not connected to anything // See if this is a connection to the parameter we are interested in oParameterNode = oConnection.selectSingleNode( "localparameter" ) ; if ( oParameterNode != null ) { strConnectedParameter = oParameterNode.text ; if ( strConnectedParameter == in_Parameter.ScriptName ) { // Found a connection to this parameter strType = oConnection.selectSingleNode( "type" ).text ; if ( strType == "out" ) { aConnections[aConnections.length] =oObjNode.text } // Tip if the type was "in" then it means that the connection is controlling the // value of this parameter, e.g. a FCurve, expression, operator. This information // can also be retrieved with Parameter.Source } } } return aConnections ; } //Output of this example: //INFO : light.kine.global.pos.posz.Expression //INFO : light.kine.global.Expression |