Softimage は、AddProp、GetFCurveInfo、SICreateImageClip など、一部のスクリプト コマンドで出力引数を使用します。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 を使用してコマンド スタブを作成する方法です。詳細については、同じフォルダのヘルプページを参照してください。