DataRepository.GetConnectionStackInfo

導入

v 5.1

詳細

オブジェクトから読み書きされるオブジェクトについての xML フォーマットの情報を戻します。接続スタックは、プリミティブではConstructionHistoryと呼ばれています。

接続スタックにはへの接続OperatorFCurve、およびShaderとその他のオブジェクトを含むことができるので、単なる「オペレータスタック」以上の役目を果たします。接続スタックのオブジェクトの順序は、評価するシーンの順序を決定するので重要です。たとえば、スクリプトオペレータが、プリミティブに対して読み書きするデフォームオペレータの上のプリミティブから読み取る場合は、元のバージョンではなく、ジオメトリのデフォームバージョンを読み取ります。

このメソッドは、非表示オブジェクトの存在を含むローレベルの情報を戻します(つまり、Softimage での内部使用のために用意されています)。このメソッドは、主として CustomOperator の書き出しおよびデバッグに役立つように、SDK で公開されます。

XML フォーマットは、将来変更されることがあります。 現在、次の属性を戻します。

オブジェクト: オブジェクトの SIObject.FullName。アクティブな接続がない場合は空になります。

type:"in"または"out"。"in"の場合は、クエリされているオブジェクトが接続オブジェクトからデータを読み取ります。

localparameter:特定のParameterに対して読み書きする一部の接続。この場合は、Parameter.ScriptNameが含まれます。

remoteparameter:接続されているオブジェクトの特定のパラメータに対して接続される場合は、Parameter.ScriptNameが含まれます。

hidden:オブジェクトが siNotInspectable 機能を持つ場合は"true"です。ProjectItem.Capabilitiesを参照してください。

region:内部でのみ使用されます。

datacopy:内部でのみ使用されます。この属性は、オブジェクトへの内部ハンドルです("0x1c9f0448"など)。このハンドルの値は、SDKでは特に意味を持ちません。Softimage は、シーンのクリーン評価をアシストするために、個々のオブジェクトの一時的な"datacopies"を複数作成することがあります。

スクリプト 構文

oString = DataRepository.GetConnectionStackInfo( Object );

戻り値

XMLString。接続が上から下に並んで表示されます。

パラメータ

パラメータ タイプ 詳細
オブジェクト Softimage オブジェクト PropertyPrimitiveなどのクエリするオブジェクト。接続はParameterレベルではなく、オブジェクトレベルで管理されます。

1. JScript の例

/*
        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

2. JScript の例

/*
        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