出力引数を操作する

 
 
 

Softimage は、AddPropGetFCurveInfoSICreateImageClip など、一部のスクリプト コマンドで出力引数を使用します。C++ は出力引数をサポートしますが、更新された値は、値を初期化するために使用された変数内ではなく、渡された CValueArray 内に入ります。

Application app;

// Trying to get output arguments via the variable
Camera cam;
Null camInt;

CValue retVal;
CValueArray inArgs(8);
inArgs[0]	= L"Telephoto";
inArgs[1]	= L"MyCamera";
inArgs[4]	= cam;
inArgs[5]	= camInt;
app.ExecuteCommand( L"SIGetPrimCamera", inArgs, retVal );

// Testing the 'output' arguments to see if they're valid
if ( cam.GetRef().IsValid() ) {
	app.LogMessage( cam.GetName() + L" is valid" );
} else {
	app.LogMessage( L"'cam' is not valid" );
}

if ( camInt.GetRef().IsValid() ) {
	app.LogMessage( camInt.GetName() + L" is valid" );
} else {
	app.LogMessage( L"'camInt' is not valid" );
}

/* The following is logged to history:
'INFO : 'cam' is not valid
'INFO : 'camInt' is not valid
*/

出力引数を抽出するには、出力引数配列(CValueArray)から出力引数を取得しておいてから、その配列の各メンバを、CValue から次のような適切なデータ型またはクラスに変換することができます。

Application app;

CValue retVal;
CValueArray inArgs(8);
inArgs[0]	= L"Telephoto";
inArgs[1]	= L"MyCamera";
inArgs[4]	= CValue(); // newly created Camera and Interest are returned as output arguments
inArgs[5]	= CValue();
app.ExecuteCommand( L"SIGetPrimCamera", inArgs, retVal );

// The camera is in inArgs[4] and its interest in inArgs[5]
Camera cam( inArgs[4] );
Null camInt( inArgs[5] );

app.LogMessage( cam.GetName() + L" is at position " 
	+ CString(cam.GetParameterValue(L"posx")) + L"," 
	+ CString(cam.GetParameterValue(L"posy")) + L"," 
	+ CString(cam.GetParameterValue(L"posz")) 
);

app.LogMessage( camInt.GetName() + L" is at position " 
	+ CString(camInt.GetParameterValue(L"posx")) + L"," 
	+ CString(camInt.GetParameterValue(L"posy")) + L"," 
	+ CString(camInt.GetParameterValue(L"posz")) 
);

/* The following is logged to history:
'INFO : Number of output arguments in the returned array: 4
'INFO : MyCamera is at position 0,2,20
'INFO : CameraInterest is at position 0,0,0
*/
ヒント:

Application::ExecuteCommand 関数を使用した簡単な方法もあります。<factory location>\XSISDK\utils\cmdstubs ディレクトリ下の the cmdstubs_generator.js を使用してコマンド スタブを作成する方法です。詳細については、同じフォルダのヘルプページを参照してください。