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

iCAx开思网

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

旧话重提:CAAR11版零件间布尔运算如何进行?

[复制链接]
跳转到指定楼层
1
发表于 2005-8-26 12:03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
      如题,在进行零件间布尔运算的时候,如果拷贝进来进行,则出现位置差异,进行的是原始位置的运算;但是又没有直接的布尔运算的API可以实现零件间的运算。
  
     曾经尝试得到零件在装配环境下的坐标,但是总是得不到正确的,不知道为何。程序如下:
  CATIPrtPart_var spPart2 = piPrtCont2->GetPart();
  CATIProduct_var spProductofbody2 = spPart2->GetProduct();
  CATIProduct_var spReferenceProduct = spProductofbody2 ->GetReferenceProduct();
  
  CATIMovable_var piMovableInBody2 = NULL_var;
  
  CATMathTransformation LaterAbposition;
  HRESULT rc2 = spReferenceProduct->QueryInterface(IID_CATIMovable, (void**) [$piMovableInBody2)]
  
  
  if( SUCCEEDED(rc2))
  {
    rc = piMovableInBody2->GetAbsPosition(LaterAbposition);
  
        double iCod[12];
        LaterAbposition.GetCoef(iCod);
    for(int i=0;i<12;i++)
      cout<<"-------"<<iCod<<endl;
    
  }
  
但是如果我用程序去移动这个零件,即rc = piMovableInBody2->SetAbsPosition(OriginAbpotion);
则得到的会是OriginAbpotion;如果在界面中拖动零件,则始终是原始位置。
  
趁现在人多,多请教大家,呵呵。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2005-8-26 12:16:12 | 只看该作者
//-------------------------------------------------------------------------
// GetTransformationToTopProduct()  
//-------------------------------------------------------------------------
CATMathTransformation WSHCmdUtil::GetTransformationToTopProduct(
  const CATIProduct_var& ispProduct
)
{
  HRESULT rc = S_OK;
  CATMathTransformation trans;
  do {
    CATIProduct_var spToProduct = ispProduct;
    if( !spToProduct ) {
      spToProduct = GetCurrentProduct();
    }
    if( !spToProduct ) {
      break;
    }
    CATIMovable_var spMovableOnToProduct = spToProduct;
    if( !spMovableOnToProduct ) {
      break;
    }
    CATMathTransformation transAbs;
    rc = spMovableOnToProduct->GetAbsPosition( transAbs );
    if( FAILED(rc) ) {
      break;
    }
    trans = transAbs;
  } while(FALSE);
  return trans;
}
//-------------------------------------------------------------------------
// GetTransformationFromTopProduct()  
//-------------------------------------------------------------------------
CATMathTransformation WSHCmdUtil::GetTransformationFromTopProduct(
  const CATIProduct_var& ispProduct
)
{
  HRESULT rc = S_OK;
  CATMathTransformation trans;
  do {
    CATMathTransformation transAbs = GetTransformationToTopProduct( ispProduct );
    CATMathTransformation transInv;
  
    if( !transAbs.Inverse( transInv ) ) {
      break;
    }
  
    trans = transInv;
  } while(FALSE);
  return trans;
}
3
发表于 2005-8-26 13:00:48 | 只看该作者
刚发的帖子又没了,太不稳定了。
  
说说我的理解。
我认为有两个问题:
1。你用了一个ReferenceProduct来得到CATIMovable。
不知道你对ReferenceProduct的理解是什么,我的理解是,ReferenceProduct就是本来的那个product文件,是一个外部文件(我认为我的理解是对的:p)
而当前Session内的只是一个它的Instance. 从ReferenceProduct来QI得到的CATIMovable,永远会得到一个以它本来的原点为原点的matrix,没有和其他Product的位置关系。
2。你用的是CATIMovable的Set/GetAbsPosition,这对于简单情况下应该可以应付。可是对于Product层数有很多,还可能存在变动的情况下,就可能会出问题。
因为这是一个绝对位置信息而不是相对的。
  
解决方法:
1。不用ReferenceProduct,而用你直接得到的Product(这是一个Instance)来QI得到CATIMovable
2。用Set/GetPosition 而不是Set/GetAbsPosition,第一个CATIMovable参数是从它的上层Product QI 得到的CATIMovable,这样Get/Set的matrix就是相对于
它的上层Product的
  
我想很多初学者害怕使用Set/GetPosition的一个原因可能就是不知道怎么使用这个CATIMovable参数,其实就是设置一个参考系。
  
都是个人理解,有不妥之处请大家指正。
4
发表于 2005-8-26 15:15:01 | 只看该作者
看了两位的回帖,获益良多。
  
开始我也是不明白个ReferenceProduct的含义,不过最近好像理解多了些,大概就是saeba讲的。
  
另外,我得到位置的目的无非是移动我的拷贝的Body的位置到零件相应位置来进行布尔运算,感觉这样很烦,也比较笨。是否有比较简单的方式?
  
在CATIA中,可以使用外部参考(external reference)来使用外部零件的特征,如参考别的零件的面来建立面,可以设定他们间的约束(重合,Offset)等。在程序里如何实现external reference这个功能?
5
发表于 2005-8-26 15:33:17 | 只看该作者
我想问一下,如何得到Product Instance?
CATIPrtPart::GetProduct()返回的是不是ReferenceProduct?下面这段摘自关于CATIPrtPart::GetProduct()文档:
  
Returns the product associated with the MechanicalPart feature.  
Role:This ASMProduct feature represents the reference of all the instantiations of the Part in the Product documents. You can handle it with the CATIProduct interface. It enables you to make the publication.  
Each instantiation of this ASMProduct feature in a Product document holds the position of the Part inside the Product. Refer to the CATIMovable interface.
  
我用过死方法, 就是取得所有的Products, 然后用CATIProduct:sReference()判断它是否为Instance, 再用CATIProduct::GetPrdInstanceName()来判断是不是我所要的那个.
有没有更好的方法呢?
6
发表于 2005-8-26 16:42:49 | 只看该作者
是否有比较简单的方式?  
================
据我所知,好像没有。
你要知道,CAA不是需要讲究美感的理论语言,只要能够达到目的就够了,也就没有人会去改善它了。。。
  
在程序里如何实现external reference这个功能?
=============================
生成external reference的API好像还没有公开。
对于已有的external reference, 有一个CATIMechanicalImport可以用来做一些操作。
  
CATIPrtPart::GetProduct()返回的是不是ReferenceProduct?
=====================================
就它的解释看,是ReferenceProduct,是本Part在当前Product里所有的Instance的reference.
如何得到Product Instance?
不是有个FindInstance()方法么?
7
发表于 2005-8-26 16:51:51 | 只看该作者
呵呵,看来也就只能这么先实现了……
  
CATIPrtPart::GetProduct()返回的是不是ReferenceProduct?  
=====================================  
就它的解释看,是ReferenceProduct,是本Part在当前Product里所有的Instance的reference.  
如何得到Product Instance?  
不是有个FindInstance()方法么?
  
我做过FindInstance(),但是当Product有好几个Instance的时候,它找到的始终是第一个。似乎也不是很管用。当然,只有一个Instance的时候是没问题的。
8
发表于 2005-8-26 19:13:24 | 只看该作者
ExternalReference可以用CATICutAndPastable来实现.
拷贝之后,会在目标零件里自动生成ExternalReference
9
发表于 2005-8-26 20:35:47 | 只看该作者
ExternalReference可以用CATICutAndPastable来实现.  
拷贝之后,会在目标零件里自动生成ExternalReference
=================================
好办法!
10
发表于 2005-8-27 01:19:32 | 只看该作者
CATIMechanicalImport在R15开始被停了,如果你可以拿到V5R15的sp3的HotFix2了话,它暂时恢复了这个interface(Unisys要求的)
但估计在R16还是会被停,只是暂时ds还给不出代替的interface
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2024-12-24 01:01 , Processed in 0.028352 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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