関数がすでに値を戻している場合の処理について

 
 
 

いくつかの Softimage 関数は、出力引数戻り値の両方を戻します。 関数に明示的に定義された戻り値がある場合は、関数が代わりに特定の値を戻すため、ISIVTCollection から出力引数を抽出できません。

ヒント:

コマンドとスクリプト リファレンス』の「戻り値」セクションでは、コマンドが明示的な戻り値を使用するかどうか、またその値が何であるかを調べることができます。

この場合、VBScript は出力引数を介して情報を取得するために出力パラメータを渡す必要があります。ただし、JScript および Python では、他の方法を考慮する必要があります。

方法と回避策

ほとんどの場合、これらの関数には出力引数と戻り値を使用する特別版の関数が用意されています。 一般に、この特別版の関数名は、出力引数バージョンの関数と同じ名前に「2」が付いたものです。 たとえば、NurbsSurface.GetTrim 関数では出力引数を使用できますが(「VBScript の例: メソッドから出力引数を取得する」を参照)、NurbsSurface.GetTrim2 関数は出力値の配列を返します(「JScript の例: メソッド「2」の回避策の使用」を参照)。

カスタム コマンドによる回避策

関数の代替(対応した)バージョンがない場合の回避策としては、VBScript のカスタム コマンドを作成して、対応していないコマンドを呼び出したり、出力引数と戻り値の両方を含む配列を戻す方法があります。

VBScript の例: 回避コマンドを定義する

このコードには、カスタム コマンド用の Execute コールバックが含まれていることに注意してください。 このプラグインを完全実装するための詳細については、「例: 出力引数と戻り値のカスタム コマンドによる回避策」を参照してください。

' Execute callback for the custom command
function MyGetSkeleton_Execute( InputObj )
	' Call the GetSkeleton command and pack the output 
	' argument and the return value in an array 
	set oSkel = GetSkeleton( InputObj, lIndex )
	aReturn = Array( lIndex, oSkel )

	' Return the array
	MyGetSkeleton_Execute = aReturn 
end function

JScript の例: 回避コマンドの呼び出し

' Execute callback for the custom command
function MyGetSkeleton_Execute( InputObj )
	' Call the GetSkeleton command and pack the output 
	' argument and the return value in an array 
	set oSkel = GetSkeleton( InputObj, lIndex )
	aReturn = Array( lIndex, oSkel )

	' Return the array
	MyGetSkeleton_Execute = aReturn 
end function

JScript の例: 回避コマンドの呼び出し

NewScene( null, false );

Create2DSkeleton( -3.004, 2.152, 0.000, -1.531, -1.163, 0.000, 0.000, 0.000, 1.000, 1 );
AppendBone( "eff", 0.853, 1.396, 0.000 );
AppendBone( "eff", 2.578, -1.532, 0.000 );

// Returns a VBArray, which must be converted to a JS Array
var RtnArray = MyGetSkeleton( "bone1" ).toArray();

// The output argument is the first item (a Long)
var MyObjIndex = RtnArray[0];
LogMessage( "Index of objects in skeleton: " + MyObjIndex );

// The return value is the second item (XSICollection)
var MySkeleton = RtnArray[1];
for ( i=0; i<MySkeleton.Count; i++ ) {
	LogMessage( "Item[" + i + "] = " + MySkeleton(i) );
}

// So both are available now in JScript
// INFO : Index of objects in skeleton: 2
// INFO : Item[0] = root
// INFO : Item[1] = bone
// INFO : Item[2] = bone1
// INFO : Item[3] = bone2
// INFO : Item[4] = eff