iCAx开思工具箱

标题: CATIA CAA如何外部参考引用零件中发布(Publication)的元素 [打印本页]

作者: 大步往前走    时间: 2017-3-24 17:05
标题: CATIA CAA如何外部参考引用零件中发布(Publication)的元素
在零件中发布了一个轴系的原点和平面,如下图,现在想通过(复制/选择性粘贴)将Part1发布的原点外部参考到Part2中。
我的思路是通过CATIPrdObjectPublisher获取到【原点】的发布,再通过GetFinalObject或GetDirectObject获取发布的对象,将发布的对象QI转成CATIConnector,并通过CATIConnector::GiveReferenceObject()方法获取关联的几何对象,该方法返回值为CATILinkableObject_var指针,QI为CATISpecObject_var指针,再通过CATMmrInterPartCopy复制到Part2中。但是现在上述过程得到的 CATISpecObject_var指针为空。
各位大神有没有解决思路?

代码如下:
  1.     CATIPrdObjectPublisher *piPublisher = NULL;

  2.         if (NULL != ipiCntProduct)//ipiCntProduct为Part1实例
  3.         {
  4.                 HRESULT rc = ipiCntProduct->QueryInterface(IID_CATIPrdObjectPublisher,
  5.                                                                                 (void **) &piPublisher);
  6.                         if( SUCCEEDED(rc) && piPublisher )
  7.                         {
  8.                                 CATUnicodeString pName = "原点";//名为【原点】的发布元素

  9.                                 CATBaseUnknown* publisher = NULL;

  10.                                 publisher = piPublisher->GetFinalObject(pName);

  11.                                 
  12.                                 if(publisher)
  13.                                 {
  14.                                         CATIConnector* pCnt = NULL;
  15.                                         rc = publisher->QueryInterface(IID_CATIConnector,(void**)&pCnt);
  16.                                         if(SUCCEEDED(rc) && pCnt)
  17.                                         {
  18.                                                 CATILinkableObject_var spLinkObject = pCnt->GiveReferenceObject();
  19.                                                 if( spLinkObject != NULL_var)
  20.                                                 {
  21.                                                         CATISpecObject_var spPObject = NULL_var;

  22.                                                        rc =
  23. spLinkObject->QueryInterface(IID_CATISpecObject,
  24. (void**)&spPObject);//QI失败,spPObject为空
  25.                                                         if(SUCCEEDED(rc) && spPObject!=NULL_var)
  26.                                                         {
  27.                                                                 //调用自定义方法CopyWithLink,该方法是基于CATMmrInterPartCopy实现带链接的复制粘贴
  28.                                                         }

  29.                                                 }
  30.                                         }
  31.                                 }        
  32.                                        
  33.                         }
  34.                                                 
  35.                 }

复制代码


作者: 大步往前走    时间: 2017-3-27 09:39
有没有大神帮忙给点思路??
作者: liuhuapin1981    时间: 2017-4-7 14:03
另外请教楼主,编程发布是如何实现的,直接使用 CATIPrdObjectPublisher接口里的
public virtual int Publish(const CATUnicodeString& iName,
const CATBaseUnknown* iObject= NULL )= 0  发布函数发布后都是无法和几何元素相关联,还是 在使用Publish()函数前还有什么设置函数,还是
iObject几何元素的获取有特殊的讲究,望赐教!

作者: liuhuapin1981    时间: 2017-4-7 14:57
在论坛上看到别人做的一个类似例子,借花献福:

CATIPrdObjectPublisher *piPublisher = NULL;

   CATIConnector* pCnt = NULL;
        if (NULL != ipiCntProduct)//ipiCntProduct为Part1实例
        {
                HRESULT rc = ipiCntProduct->QueryInterface(IID_CATIPrdObjectPublisher,
                                                                                (void **) &piPublisher);


                        if( SUCCEEDED(rc) && piPublisher )
                        {
                                CATUnicodeString pName = "原点";//名为【原点】的发布元素

                                CATBaseUnknown* publisher = NULL;



  if( publisher = piPublisher->GetFinalObject(pName)!=NULL)
{


                     CATPoint* pPoint = (CATPoint*)publisher;

                     CATISpecObject_var  spPoint = pPoint;

                     CATILinkableObject_var spLinkPoint = spPoint;


                    int iCreation=0;


::GetProductConnector(spLinkPoint,
                                                                   ipiCntProduct,                                          
                                                                   piProductOnRoot,//根产品接口
                                                                   0,
                                                                   pCnt,   
                                                                   iCreation);



}



                                        if( pCnt!=NULL)
                                        {
                                                CATILinkableObject_var spLinkObject = pCnt->GiveReferenceObject();
                                                if( spLinkObject != NULL_var)
                                                {
                                                        CATISpecObject_var spPObject = NULL_var;

                                                       rc =
spLinkObject->QueryInterface(IID_CATISpecObject,
(void**)&spPObject);//QI失败,spPObject为空
                                                        if(SUCCEEDED(rc) && spPObject!=NULL_var)
                                                        {
                                                                //调用自定义方法CopyWithLink,该方法是基于CATMmrInterPartCopy实现带链接的复制粘贴
                                                        }

                                                }
                                        }
                                }        

                        }

                }






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