我的机械网

搜索
查看: 1248|回复: 5

CATIA二次开发之装配约束

[复制链接]
发表于 2018-6-7 20:52:32 | |阅读模式
各位网友请注意:我的机械网所有附件、百度网盘提取码、机械资料、PDF资料、压缩包文件均需要回帖后才能下载!
我以为,约束的目的多是装配,其本质是姿态矩阵的变换,只是系统已经为你打包成一个“工具”而已。因此,我们可以好好利用现成的“工具”,达到组件快速装配的目的。
约束简介
约束是装配的重要手段,常见的约束有固定、平行、相合、平移、角度、接触等约束,如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
开发深似海,疑义相与析

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 一键登录:

x
发表于 2018-11-28 09:13:31 |
机械小王子
发表于 2018-11-29 23:06:32 |
回忆

0

主题

5412

回帖

3万

积分

论坛元老

Rank: 8Rank: 8

积分
37740
发表于 2021-11-30 00:06:35 |
楼上的能详细介绍一下么?
发表于 2021-12-3 07:28:52 |
楼上的说的很好!
发表于 2021-12-3 11:48:54 |
收藏了,很不错的内容!
快速回复 返回顶部 返回列表