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