CATIA二次開發之裝配約束

饅頭以為,約束的目的多是裝配,其本質是姿態矩陣的變換,只是系統已經為你打包成一個「工具」而已。因此,我們可以好好利用現成的「工具」,達到組件快速裝配的目的。

約束簡介

約束是裝配的重要手段,常見的約束有固定、平行、相合、平移、角度、接觸等約束,如catCstTypeReference表示固定約束,約束類型如下圖所示。通過約束關係,可以使組件之間的相對關係發生變化。而在這個變化過程中,用戶不需要考慮姿態是如何變換的,只需要簡單去設定約束類型即可,固定約束是約束中輸入最少,相對而言比較容易理解的約束,本文將以固定約束為例,闡述約束的創建。進行固定約束開發,可主要劃分下節的三個步驟,具體見如下代碼:

Demo代碼

void CreateConstraint()n{n // 打開一個Proudct文件 pProductDocumentn CATDocument * pProductDocument = NULL;n HRESULT rc= CATDocumentServices::OpenDocument(iArgv[1],pProductDocument);n //①獲取文檔的Root Product spRootProductn CATIDocRoots *piDocRootsOnDoc = NULL;n pProductDocument->QueryInterface(IID_CATIDocRoots, (void**) &piDocRootsOnDoc);n CATListValCATBaseUnknown_var *pRootProducts = piDocRootsOnDoc->GiveDocRoots();n CATIProduct_var spRootProduct = NULL_var;n if( NULL != pRootProducts )n { n if(0 != pRootProducts->Size())n {n spRootProduct = (*pRootProducts)[1];n delete pRootProducts; n pRootProducts = NULL;n } n piDocRootsOnDoc->Release(); n piDocRootsOnDoc = NULL;n }n // 找到第一個Product並將其設置為固定約束 spProdToConstraintn int nbChild = spRootProduct->GetChildrenCount();n CATListValCATBaseUnknown_var* pListChild = spRootProduct->GetChildren("CATIProduct");n CATIProduct_var spProdToConstraint;n if( (NULL != pListChild) && (0 != pListChild->Size()) )n {n spProdToConstraint = ( (*pListChild)[1] );n delete pListChild; n pListChild = NULL;n }n //②創建connector pConnectorn CATIConnector * pConnector = NULL;n CATIProduct * pActiveComponent = NULL;n CATIProduct * pInstanceComponent = NULL;n CATILinkableObject * pGeometry = NULL;n int iCreation = 0;n spRootProduct->QueryInterface(IID_CATIProduct,(void **)&pActiveComponent);n spProdToConstraint->QueryInterface(IID_CATIProduct,(void **)&pInstanceComponent);n spProdToConstraint->QueryInterface(IID_CATILinkableObject,(void **)&pGeometry); n GetProductConnector(pGeometry,pInstanceComponent,pActiveComponent,0,pConnector,iCreation);n //③創建約束n CATICst *pCst = NULL;n CATLISTV (CATBaseUnknown_var) ConnectorList;n ConnectorList.Append(pConnector);n pConnector->Release(); n CreateConstraint(catCstTypeReference,ConnectorList,NULL,pActiveComponent,&pCst);n pActiveComponent->Release(); n pActiveComponent = NULL;n}n

代碼分析

創建約束的函數如下:

CreateConstraint( CatConstraintType iConstraintType, const CATLISTV(CATBaseUnknown_var)&iConnectorList, CATICkeParm* iCkeValue, CATIProduct* iReferenceProduct, CATICst** ioConstraint)n

大家只需關注如下三個輸入對象即可,其中

1) iConstraintType是約束枚舉類型

2) iConnectorList是進行約束的對象

3) iReferenceProduct是約束所屬文檔的reference product

在進行開發之前,大家可先想想利用CATIA去創建約束的過程:①約束的創建是在一個激活的結點下工作的,②同時用戶需要選擇一個或多個約束的對象,③並且去打開約束命令,選擇約束類型,然後才能創建約束。其實給我們的介面同自身功能的輸入輸出是一致的,因此在二次開發中,進行約束創建步驟可簡單歸納如下:

1) 獲知約束到底創建哪個位置,這裡表現為一個Product結點

2) 將待約束的對象都創建成一個Connector,構成一個對象集

3) 設置約束類型並給定其他參數,並可創建約束。

當然,這裡需要保證你給定的對象集能夠滿足給定約束類型的創建,否則返回錯誤,這個需要開發人員去保證。在本例中,由於固定約束的創建只需一個對象即可,因此只有一個Connector,若要創建相合約束,主要區別就在於Connector個數的不同,其他開發均如出一轍。

歡迎關註:CAA二次開發(微信公眾號)

開發深似海、疑義相與析!

推薦閱讀:

CATIA機械設計,一般一個月有多少薪水?
Workbench的歸屬問題及其它
使用Python進行3DEXPERIENCE的COM開發的測試
為什麼達索公司同時開發Catia和SolidWorks?

TAG:caa | 二次开发 | CATIA |