找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 19266|回复: 2
打印 上一主题 下一主题

CAA中如何使用CreateConstraint()建立装配约束并更新对象?

[复制链接]
跳转到指定楼层
1
发表于 2008-11-3 14:47:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
大家好!我参考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);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2008-11-6 13:10:36 | 只看该作者
另外,我试了一下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);
3
发表于 2008-11-11 18:24:11 | 只看该作者
找到临时解决方案了:
不会获取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();

问题暂时得到了解决,不知道哪位有比较完美的实现方法啊,还请赐教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-25 16:59 , Processed in 0.034238 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表