我以为,约束的目的多是装配,其本质是姿态矩阵的变换,只是系统已经为你打包成一个“工具”而已。因此,我们可以好好利用现成的“工具”,达到组件快速装配的目的。
约束简介
约束是装配的重要手段,常见的约束有固定、平行、相合、平移、角度、接触等约束,如catCstTypeReference表示固定约束,约束类型如下图所示。通过约束关系,可以使组件之间的相对关系发生变化。而在这个变化过程中,用户不需要考虑姿态是如何变换的,只需要简单去设定约束类型即可,固定约束是约束中输入最少,相对而言比较容易理解的约束,本文将以固定约束为例,阐述约束的创建。进行固定约束开发,可主要划分下节的三个步骤,具体见如下代码:
装配约束
Demo代码
可复制到notepad 等查看,在头条上面,格式会乱(sorry)
void CreateConstraint(){ // 打开一个Proudct文件 pProductDocument CATDocument * pProductDocument = NULL; HRESULT rc= CATDocumentServices::OpenDocument(iArgv[1],pProductDocument); //①获取文档的Root Product spRootProduct CATIDocRoots *piDocRootsOnDoc = NULL; pProductDocument->QueryInterface(IID_CATIDocRoots, (void**) &piDocRootsOnDoc); CATListValCATBaseUnknown_var *pRootProducts = piDocRootsOnDoc->GiveDocRoots(); CATIProduct_var spRootProduct = NULL_var; if( NULL != pRootProducts ) { if(0 != pRootProducts->Size()) { spRootProduct = (*pRootProducts)[1]; delete pRootProducts; pRootProducts = NULL; } piDocRootsOnDoc->Release(); piDocRootsOnDoc = NULL; } // 找到第一个Product并将其设置为固定约束 spProdToConstraint int nbChild = spRootProduct->GetChildrenCount(); CATListValCATBaseUnknown_var* pListChild = spRootProduct->GetChildren(\”CATIProduct\”); CATIProduct_var spProdToConstraint; if( (NULL != pListChild) && (0 != pListChild->Size()) ) { spProdToConstraint = ( (*pListChild)[1] ); delete pListChild; pListChild = NULL; } //②创建connector pConnector CATIConnector * pConnector = NULL; CATIProduct * pActiveComponent = NULL; CATIProduct * pInstanceComponent = NULL; CATILinkableObject * pGeometry = NULL; int iCreation = 0; spRootProduct->QueryInterface(IID_CATIProduct,(void **)&pActiveComponent); spProdToConstraint->QueryInterface(IID_CATIProduct,(void **)&pInstanceComponent); spProdToConstraint->QueryInterface(IID_CATILinkableObject,(void **)&pGeometry); GetProductConnector(pGeometry,pInstanceComponent,pActiveComponent,0,pConnector,iCreation); //③创建约束 CATICst *pCst = NULL; CATLISTV (CATBaseUnknown_var) ConnectorList; ConnectorList.Append(pConnector); pConnector->Release(); CreateConstraint(catCstTypeReference,ConnectorList,NULL,pActiveComponent,&pCst); pActiveComponent->Release(); pActiveComponent = NULL;}
代码分析
创建约束的函数如下:
CreateConstraint( CatConstraintType iConstraintType, const CATLISTV(CATBaseUnknown_var)&iConnectorList, CATICkeParm* iCkeValue, CATIProduct* iReferenceProduct, CATICst** ioConstraint)
大家只需关注如下三个输入对象即可,其中
1) iConstraintType是约束枚举类型
2) iConnectorList是进行约束的对象
3) iReferenceProduct是约束所属文档的reference product
在进行开发之前,大家可先想想利用CATIA去创建约束的过程:①约束的创建是在一个激活的结点下工作的,②同时用户需要选择一个或多个约束的对象,③并且去打开约束命令,选择约束类型,然后才能创建约束。其实给我们的接口同自身功能的输入输出是一致的,因此在二次开发中,进行约束创建步骤可简单归纳如下:
1) 获知约束到底创建哪个位置,这里表现为一个Product结点
2) 将待约束的对象都创建成一个Connector,构成一个对象集
3) 设置约束类型并给定其他参数,并可创建约束。
当然,这里需要保证你给定的对象集能够满足给定约束类型的创建,否则返回错误,这个需要开发人员去保证。在本例中,由于固定约束的创建只需一个对象即可,因此只有一个Connector,若要创建相合约束,主要区别就在于Connector个数的不同,其他开发均如出一辙。
本人将不断更新CATIA二次开发相关文章
大家也可关注本人小店(来个馒头:https://weidian.com/item.html?itemID=1646419866)
开发深似海,疑义相与析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。