Catia二开很痛苦,明明已经找到接口类,但是却不知道怎么获得这个接口类的对象。
例如获得一个部件的体积,找到相关接口CATIAAnalyze,但是这个部件的CATIAAnalyze的对象不知道如何获取。一般是这样获取一个对象:
CATIAAnalyze* pAnalyze = NULL;
XXX->QueryInterface(IID_CATIAAnalyze, (void**)&pAnalyze);
但是QueryInterface左边的这个XXX不知道是什么鬼,找了一下CATIAAnalyze的文档,也没有看出什么玩意儿!真服了达索这些傻逼,文档不给全。
探索了很久,尝试录制宏,打开部件属性窗口,然后随意设置一些属性(必须改变一些东西才能录制成功,否则不会录制到任何东西),再看录制的结果,发现原来CATIAAnalyze是从Product那里来的
发现有一个Product关键字,猜想 QueryInterface左边的这个XXX应该就是一个Product对象吧,玛德全靠猜。尝试一下在VBA里点一下
好像是的,写C++代码:
CATFrmEditor* pFrmEditor = NULL;
pFrmEditor = CATFrmEditor::GetCurrentEditor();
if (NULL == pFrmEditor)
{
return;
}
//获取当前编译器对应的CATDocument
CATDocument* pDoc = NULL;
pDoc = pFrmEditor->GetDocument();
//获得Editor、获得Document、获得DocumentRoot
CATIDocRoots* pDocRootsOnDoc = NULL;
CATBaseUnknown_var spBaseTemp = NULL;
HRESULT rc = E_FAIL;
rc = pDoc->QueryInterface(IID_CATIDocRoots, (void**) &pDocRootsOnDoc);
if (!pDocRootsOnDoc)
return;
CATListValCATBaseUnknown_var* pRootProducts = pDocRootsOnDoc->GiveDocRoots();
if (NULL != pRootProducts)
{
if (pRootProducts->Size())
{
spBaseTemp = (*pRootProducts)[1];
}
delete pRootProducts;
pRootProducts = NULL;
}
pDocRootsOnDoc->Release();
pDocRootsOnDoc=NULL;
if (!spBaseTemp)
return;
CATIProduct_var prd = spBaseTemp;
CATIAAnalyze* pAnalyze = NULL;
prd->QueryInterface(IID_CATIAAnalyze, (void**)&pAnalyze);
总结一下,写Catia二开代码,就像漂亮国那款《莫里秀》 又名《爸爸死哪了》的综艺节目,大部分时间都是在找爸爸!玛德去死吧。