C++ API と Softimage オブジェクト モデルの混在

 
 
 

C++ API では、CComAPIHandler クラスおよび ConvertObject 関数を使用して、C++ API および Softimage オブジェクト モデル間で変換を管理することができます。 2 つの違いは、ConvertObject()は実装の Automation(ActiveX)オブジェクトを提供するのに対し、CComAPIHandler はオブジェクト モデルの C++ API ラッパーである点です。

CComAPIHandler

CComAPIHandler クラスでは、CComAPIHandler::Call(メソッド用)、CComAPIHandler::GetProperty および CComAPIHandler::PutProperty(プロパティ用)を使用して Automation オブジェクトのメンバにアクセスすることができます。 たとえば以下のようになります。

// Use the object model version of the Model::AddActionSource() function
ActionSource oSource( in_oSelItem );
CRef oModel = oSource.GetModel().GetRef();

// To define an Automation object in C++ code, use the CComAPIHandler class
CValue retVal;
CComAPIHandler comHandler( oModel.GetRef() );

// Now that you have an instance of the Model interface, you can use the
// CComAPIHandler::Call member to execute the AddActionSource method
comHandler.Call(  L"AddActionSource", retVal, L"OO_" + oSource.GetName() );

この例は、CComAPIHandler を使用して DataRepository オブジェクトにアクセスする方法を示しています。

CRef oObj = Application().GetSelection().GetItem(0);

CComAPIHandler ccomXSIUtils;

ccomXSIUtils.CreateInstance( L"XSI.Utils");

CComAPIHandler dataRep(ccomXSIUtils.GetProperty( L"DataRepository" )) ; 

XSI::CStatus ret;
CValue ioID;
CValueArray inArgs;
inArgs.Add(CValue(oObj));
inArgs.Add(2L);
ret = dataRep.Call( L"GetIdentifier", ioID, inArgs);

Application().LogMessage(L"Selected Object GUID is " + ioID.GetAsText(),siInfoMsg);

ConvertObject

グローバル関数 ConvertObject()は、CRef オブジェクトを Softimage Automation オブジェクトに変換します(その逆の変換も行います)。 これにより、オブジェクト モデルと純粋な C++ をコード内で混在させることができます。

// Use the object model version of the Model::AddActionSource() function
ActionSource oSource( in_oSelItem );
CRef oModel = oSource.GetModel().GetRef();

// Pass a CRef to ConvertObject and get an IDispatch* through a void* ptr
ModelPtr oModelCOM = ( IDispatch* )ConvertObject( oModel );

// Now you can use the new pointer to get at the object model methods
ActionSourcePtr oNewSourceCOM = oModelCOM->AddActionSource( "OO_" & oSource.GetName() );

// Convert the new ActiveX Source object back to C++
ActionSource oNewSource = ConvertObject( oNewSourceCOM );