iCAx开思工具箱
标题:
CAA中如何使用CreateConstraint()建立装配约束并更新对象?
[打印本页]
作者:
qoop
时间:
2008-11-3 14:47
标题:
CAA中如何使用CreateConstraint()建立装配约束并更新对象?
大家好!我参考CAAAssemblyUI.edu中的例子,将Product中的两个Part建立约束装配在一起,但建立约束后保存的Product文件必须在CATIA中更新一下Constraint才能正常显示零件之间的约束,请问,如何在程序中用代码实现更新?另外,我的代码中在调用CreateConstraint()时指定的CATICkeParm *参数好像并未起作用,帮我看看是哪里出了问题。
我的建立Constraint的代码如下:
rc = pSpecContainer -> QueryInterface(IID_CATIGSMFactory ,(void**)&pFact);
if (SUCCEEDED(rc) ) {
spGsmFact = pFact;
if (pFact) pFact -> Release(); pFact = NULL;
}
CATICkeParmFactory_var spCkeFact = spGsmFact;
CATICkeParm_var spParm = NULL_var;
spParm = spCkeFact -> CreateLength("Offset", 100.);
if (NULL_var == spParm) {
cout << "ERROR in creating Cke length paramater" << endl << flush;
}
rc = CreateConstraint(catCstTypeDistance,ConnectorList, spParm, piProductOnRoot, &pCst);
作者:
qoop
时间:
2008-11-6 13:10
另外,我试了一下AssemblyUI.edu\CAAAuiCreateCstOnParts.m\src\CAAAuiCreateCstOnParts.cpp,
这个例子中是在两个Part的XY平面建了两个Connector,然后建了两个面的平行约束,
这时用CATIA打开新生成的Product文件是不用更新。
但是,如果我把其中一个平面改成YZ平面,这时生成的Product文件中的平行约束是没有被更新的,也就是
两个Part还都是原来的位置坐标,Constraint的状态也是“未更新”,需要在CATIA中手动更新一下,两个Part的相对
位置约束才能生效。
请问,如何在程序里更新该Constraint呢?
还有就是这个例子中CreateConstraint()中的第三个参数是NULL, 即没有使用CATICkeParm_var参数,如果我想创建
一些位移约束等,该参数应该如何指定呢?我试了一下,使用下面的代码后,生成的Constraint中的长度等都是0,
没有正确的生成,这个参数该如何指定呢?下面代码只给出了生成CATICkeParm_var的过程:
CATInit *pDocAsInit = NULL;
_pDoc->QueryInterface(IID_CATInit, (void**)&pDocAsInit) ;
if ( NULL != pDocAsInit ) {
_piProductCont = (CATIPrtContainer *)pDocAsInit->GetRootContainer("CATIProductContainer");
}
CATIGSMFactory_var spGsmFact;
CATIGSMFactory * _pFact =NULL;
rc = _piProductCont -> QueryInterface(IID_CATIGSMFactory ,(void**)&_pFact);
spGsmFact = _pFact;
CATICkeParmFactory_var spCkeFact = spGsmFact;
CATICkeParm_var spParm = NULL_var;
spParm = spCkeFact->CreateLength("L", 100./1000.);
rc = ::CreateConstraint(catCstTypeParallelism, ConnectorList2, NULL, _piProductOnRoot, &pCst2);
作者:
qoop
时间:
2008-11-11 18:24
找到临时解决方案了:
不会获取CATICkeParmFactory,所以采取下面的替代办法:
CATICkeParm_var rParm = pCst2->GetValue();
CATCke::Boolean isset = rParm->IsSet();
rParm->Valuate(500./1000.);
pCst2->SetValue(1, rParm);
不知道创建Constraint后为什么不刷新,所以用下面的方法主动更新:
CATISpecObject *spec;
_piProductOnRoot->QueryInterface(IID_CATISpecObject,(void **)&spec);
spec->Update();
问题暂时得到了解决,不知道哪位有比较完美的实现方法啊,还请赐教!
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3