iCAx开思工具箱

标题: 旧话重提:CAAR11版零件间布尔运算如何进行? [打印本页]

作者: cms_nuaa    时间: 2005-8-26 12:03
标题: 旧话重提:CAAR11版零件间布尔运算如何进行?
      如题,在进行零件间布尔运算的时候,如果拷贝进来进行,则出现位置差异,进行的是原始位置的运算;但是又没有直接的布尔运算的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;如果在界面中拖动零件,则始终是原始位置。
  
趁现在人多,多请教大家,呵呵。
作者: acoka    时间: 2005-8-26 12:16
//-------------------------------------------------------------------------
// 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;
}
作者: saeba    时间: 2005-8-26 13:00
刚发的帖子又没了,太不稳定了。
  
说说我的理解。
我认为有两个问题:
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参数,其实就是设置一个参考系。
  
都是个人理解,有不妥之处请大家指正。
作者: cms_nuaa    时间: 2005-8-26 15:15
看了两位的回帖,获益良多。
  
开始我也是不明白个ReferenceProduct的含义,不过最近好像理解多了些,大概就是saeba讲的。
  
另外,我得到位置的目的无非是移动我的拷贝的Body的位置到零件相应位置来进行布尔运算,感觉这样很烦,也比较笨。是否有比较简单的方式?
  
在CATIA中,可以使用外部参考(external reference)来使用外部零件的特征,如参考别的零件的面来建立面,可以设定他们间的约束(重合,Offset)等。在程序里如何实现external reference这个功能?
作者: xyzhu    时间: 2005-8-26 15:33
我想问一下,如何得到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()来判断是不是我所要的那个.
有没有更好的方法呢?
作者: saeba    时间: 2005-8-26 16:42
是否有比较简单的方式?  
================
据我所知,好像没有。
你要知道,CAA不是需要讲究美感的理论语言,只要能够达到目的就够了,也就没有人会去改善它了。。。
  
在程序里如何实现external reference这个功能?
=============================
生成external reference的API好像还没有公开。
对于已有的external reference, 有一个CATIMechanicalImport可以用来做一些操作。
  
CATIPrtPart::GetProduct()返回的是不是ReferenceProduct?
=====================================
就它的解释看,是ReferenceProduct,是本Part在当前Product里所有的Instance的reference.
如何得到Product Instance?
不是有个FindInstance()方法么?
作者: cms_nuaa    时间: 2005-8-26 16:51
呵呵,看来也就只能这么先实现了……
  
CATIPrtPart::GetProduct()返回的是不是ReferenceProduct?  
=====================================  
就它的解释看,是ReferenceProduct,是本Part在当前Product里所有的Instance的reference.  
如何得到Product Instance?  
不是有个FindInstance()方法么?
  
我做过FindInstance(),但是当Product有好几个Instance的时候,它找到的始终是第一个。似乎也不是很管用。当然,只有一个Instance的时候是没问题的。
作者: xyzhu    时间: 2005-8-26 19:13
ExternalReference可以用CATICutAndPastable来实现.
拷贝之后,会在目标零件里自动生成ExternalReference
作者: saeba    时间: 2005-8-26 20:35
ExternalReference可以用CATICutAndPastable来实现.  
拷贝之后,会在目标零件里自动生成ExternalReference
=================================
好办法!
作者: acoka    时间: 2005-8-27 01:19
CATIMechanicalImport在R15开始被停了,如果你可以拿到V5R15的sp3的HotFix2了话,它暂时恢复了这个interface(Unisys要求的)
但估计在R16还是会被停,只是暂时ds还给不出代替的interface
作者: acoka    时间: 2005-8-27 01:24
谁来评论一下这个做法
  
CATIProduct_var WSHUtil::GetInstanceProduct( const CATIProduct_var& ispProduct )
{
  
  CATIProduct_var spInstanceProduct = NULL_var;
  
  do {
  
    if ( !ispProduct ) {
      break;
    }
    CATIProduct_var spFatherProduct = ispProduct->GetFatherProduct();
    if( !spFatherProduct ) {
      break;
    }
    CATIProduct_var spReferenceProduct = spFatherProduct->GetReferenceProduct();
    if( !spReferenceProduct ) {
      break;
    }
    spInstanceProduct = ispProduct->FindInstance( spReferenceProduct );
    if( !spInstanceProduct ) {
      break;
    }
  } while(FALSE);
  
  return spInstanceProduct;
  
}
作者: acoka    时间: 2005-8-27 01:28
这种copy我比较喜欢用CATMmrInterPartCopy
  
因为它可以自动处理坐标转换
作者: cms_nuaa    时间: 2005-8-27 08:49
CATMmrInterPartCopy是14以后才有的,11是没有的,所以只好自己去做变换。自己去做变换后好像已经实现与外部零件的相关性?还有,在一个零件内部对body进行坐标变换,我是用CATTransfoManager来实现的,不过这样处理起来比较麻烦,是否还有其他的办法?CATIPrtFactory有CreateTranslate 、CreateRotate 等,但都比较弱。
  
acoka 发的GetInstanceProduct函数,感觉有点问题。CATIProduct_var spFatherProduct = ispProduct->GetFatherProduct(); 这一行,如果ispProduct是ReferenceProduct的话,得不到父Product,我以前试过的,不应该是我的方法有问题?acoka 这个函数是应用过的么?另外,得到父结点,如果同一父结点下有多个Instance,仍然存在问题吧……
作者: saeba    时间: 2005-8-27 10:37
呵呵,acoka消息还真灵通,这也就是这几天的事儿吧。
让我看看。。。过几天再说。。。
作者: cms_nuaa    时间: 2005-8-28 16:37
怎么,没有人继续讨论了么?看来是周末,大家都休息去了啊。
作者: xyzhu    时间: 2005-8-29 20:29
我来谈谈对acoka那段Code的理解.
首先,参数ispProduct应该已经是一个Instance, 那么为什么有了Instance后,还要用ispProduct->FindInstance()去再找Instance呢?因为当你要移动Product 的时候,由于运动都是相对的,你需要一个参照体,而这个参照体就是FindInstance所要求的参数,在acoka的函数里用了ispProduct父节点的Reference.
结论是,FindInstance用来规定Move的Context, 它返回的Product中包含了Context的信息.
  
比如:  
1. 将ispProduct QI 到CATIMovable,然后SetPosition到(12,12,12).
2. spInstanceProduct = ispProduct->FindInstance( spReferenceProduct );  
   spInstanceProduct QI 到CATIMovable, 再SetPosition到(77,77,77).
这时候如果用GetAbsPosition得到的是(89,89,89). spInstanceProduct对ispProduct 作了相对运动.
  
CAADoc 中有个例子: CAAPstMovable.cpp.
作者: cms_nuaa    时间: 2005-8-29 22:06
楼上的,你的理解好像有偏差……
“参数ispProduct应该已经是一个Instance?”不是这样的。CATIPrtPart::GetProduct()得到的并不是一个Instance,不信你去获取它的InstanceName,是空值。
作者: xyzhu    时间: 2005-8-29 22:38
我的意思是参数ispProduct必需是Instance,否则用它来FindInstance就没有意义了.
换句话说, FindInstance实际上是用来规定Move的context的,而不时用来取Instance的.
至于如何取到Instance,则是另外问题了.




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3