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

 
 
 

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

CComAPIHandler

CComAPIHandler クラスは、Automation オブジェクトのメンバへのアクセスを可能にします。CComAPIHandler::Call(メソッドの場合)、および CComAPIHandler::GetPropertyCComAPIHandler::PutProperty(プロパティの場合)を使用します。たとえば以下のようになります。

// 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 );