作者:馒头君
链接:https://zhuanlan.zhihu.com/p/32205741
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
干涉检查的接口很诡异(猜测为CATIClash等),在CAA Help view中无法找到,百科全书亦没有。然而,我们却可以从CNextObjectBrowser中查询到该接口,也就意外着CATIA应该是开放该接口的,事实上,我们是可以基于Automation的方式进行开发的。
干涉简述
干涉检查是装配设计中应用非常广泛的功能之一,例如,通过干涉检查可以判断多个对象之间在静态位置和相对运动时的交涉情况,从而能够保证装配质量。虽然CATIA提供了干涉检查的相关功能,但是有时候,我们是需要去定制干涉结果或者借助干涉结果去实现其他功能。为了明确程序开发的输入输出,编者首先在这里介绍下CATIA自带的功能。如下图,可知该功能的实现主要需要输入三个参数:干涉类型、选择方式以及待干涉Product的结点。
本文假定选择方式为“两个选择之间”,此处已经获取的文档结点为spRootProduct,Instance CATIProduct为InstProduct1和InstProduct2,干涉Demo程序如下,大家举一反三。
干涉检查代码示例
void ClashCompute(CATIProduct_var spRootProduct, CATIProduct_var
InstProduct1, CATIProduct_var InstProduct2)
{
//开始获取CATIAClashs
CATIAProduct* pCATIAPrd = NULL;
spRootProduct ->QueryInterface( IID_CATIAProduct, (void **)&pCATIAPrd );
CATIAClashes* pCATIAClashes = NULL;
CATUnicodeString strname = "Clashes";
CATBSTR BSTR;
strname.ConvertToBSTR(&BSTR );
CATBaseDispatch* pBaseDis = NULL;
pCATIAPrd->GetTechnologicalObject( BSTR, pBaseDis); //获取Object对象
pBaseDis->QueryInterface( IID_CATIAClashes, (void **)&pCATIAClashes );
//创建一个CATIClash并添加到CATIAClashs集中
CATIAClash* pCATIAClash = NULL;
pCATIAClashes->Add( pCATIAClash);
CATIClash* pClash = NULL;
pCATIAClash->QueryInterface( IID_CATIClash, (void **)&pClash );
//设置CATIClash的参数并计算
CATListValCATBaseUnknown_var InstProduct1List;
InstProduct1List.Add(InstProduct1);
CATListValCATBaseUnknown_var InstProduct2List;
InstProduct2List.Add(InstProduct2);
pClash->SetGroupMode(CATGroupModeBetweenTwo);//设定选择方式
pClash->SetGroup(1, InstProduct1List); //设定图44中的“选择:1”
pClash->SetGroup(2, InstProduct2List); //设定图44中的“选择:2”
CATComputationCase iCase = CATComputationCaseClashContact;
pClash->SetComputationCase(iCase); //设定干涉类型“接触+碰撞”
pClash->Compute();
//读取计算结果
CATIClashResult* pResult = NULL;
pClash->GetResult(pResult);
int count = 0;
pResult->CountConflicts(count);
//输出结果
for (int k=0;k<count;k++)
{
CATIConflict*pResultConflict=NULL;
pResult->GetConflict(k,pResultConflict);
CATIProduct*oFirstProduct=NULL;
CATUnicodeString oShapeName1;
CATIProduct*oSecondProduct=NULL;
CATUnicodeString oShapeName2;
pResultConflict->GetFirstProduct( oFirstProduct, oShapeName1);
pResultConflict->GetSecondProduct( oSecondProduct, oShapeName2);
/*
其中,第K个相互干涉(碰撞和接触)的两个Product结点指针:oFirstProduct和oSecondProduct
开发者可以捕获干涉记录中相互干涉的对象,然后依据该结果并根据一定的标准去进行后续的开发
可输出结果例如:
cout<<”FirstProductNumber:”<<oFirstProduct->GetPartNumber()<<endl;
*/
}
}
分析:本处的编程方式可理解为“先形式,后内容”,即首先创建一个干涉的空壳实例,然后设定各种参数,最终完成干涉结果的检查。大家可以有意地分段测试函数,查看效果。同时,这里用到一种以CATIA为前缀的接口,这种接口(如CATIASection:断面剖切)的实现很多会涉及GetTechnologicalObject对象的获取,而编程均属于上述方式。