许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  求读取CATIA标注的方法或样例代码(Annotation)

求读取CATIA标注的方法或样例代码(Annotation)

阅读数 2
点赞 0
article_banner

求读取CATIA标注的方法或者样例代码 Annotion

文章来源 : http://bbs.csdn.net/topics/360008012

我是新手,接触CATIA 二次开发 不久,想要读取CATIA图纸上的标注信息,请问有什么方法可以实现。说明下,是装配图,即三维图纸,所读取的标注信息也是三维的。

在图纸上,标注集是挂在子零件上的,然后标注集下面有各种标注,我现在就只取注解下面的文本,包括文本的内容,位置,方向,对齐方式等信息。

   下图是所用图纸——图一:  http://byhh.net/f/House/1294899029/annotation.png  


   我查了一些资料,也试了很多方法:下面是我尝试的方法,请各位大侠指点:

   我首先得到图纸的文档指针,然后遍历出各子节点,已经可以取到子零件的文档指针和模型指针。由于标注集是隶属于某一个节点的,我现在所用的图纸是有一个子零件下有标注集,从上图可以看到相应的树结构关系。


   int DDBCatiaRW::GetTextofAnnotation(CATDocument *pDoc)

   {

   HRESULT rc = 0;


   CATIProduct *piProduct = GetProductFromDocument(pDoc);

   if( piProduct == NULL )
return -1;


   CATListValCATBaseUnknown_var* ListChildren = piProduct->GetChildren();

   CATIAMODELTYPE type = CATPART;

   if( ListChildren != NULL )

   type = CATPRODUCT;


   piProduct->Release();

   piProduct = NULL;


   if(NULL != ListChildren )

   {

   int numberOfChildren = ListChildren->Size();

   CATIProduct_var spChild = NULL_var;

   for (int i=1;i<=numberOfChildren;i++)

   {

   spChild = (*ListChildren)[i];

   if ( NULL_var == spChild )

   {

   TRACE(_T("spChild = NULL"));

   return -1;

   }


   CATIProduct *pChild = NULL;

   rc = spChild->QueryInterface(IID_CATIProduct, (void**) &pChild);


   //得到零件序号

   CATUnicodeString instanceName (" ");

   rc = spChild->GetPrdInstanceName( instanceName );

   if( FAILED(rc) )

   return FALSE;


   CATDocument* pChildDoc = GetModelDocumentFromProduct(pChild);

              到这里得到了遍历到了图纸中的各个子零件。

   方法一:然后我尝试了用子零件的文档指针来QueryInterface CATITPSText,结果是空的,QI CATIDrwAnnotation和CATIView也都是空的。

   当QI CATISpecObject是有值

   CATISpecObject* piSpecObjectOnProduct = NULL;

   if( pChild != NULL )

   rc = pChild -> QueryInterface(IID_CATISpecObject, (void**) &piSpecObjectOnProduct);

   sType = piSpecObjectOnProduct->GetType();

   sSuperType = piSpecObjectOnProduct->GetSuperType();


   CATListValCATISpecObject_var* piListSpecObject = NULL;

   piListSpecObject = piSpecObjectOnProduct->ListComponents();


   int nSpecList = piListSpecObject->Size();

   在这里每个子零件的 size都是2,不知道为什么,也不知道这个值代表什么??请问可以用这种方式去标注吗?


   方法二:走到这又没得进展了,后来找到CATIA的一个 VB  的帮助文档,里面有这个层次结构,如下图:

   图二:http://byhh.net/f/House/1294900548/CAAVBHelp1.png  


   图三:http://byhh.net/f/House/1294900620/CAAVBHelp2.png


   图四:http://byhh.net/f/House/1294900650/CAAVBHelp3.png

    看到这种结构我当时很是兴奋,因为这个和图纸的结构时完全一致的,也就是说我可以按照这种结构顺次往下就可以取到 标注信息 了,可以后来发现在我的代码工程里,压根就没有这些接口和类,我安装的是CATIAV5R14,用的是CATIAV5R14的开发包,看来这种方法又行不通了,有哪位大侠可以解释分析下这个VB的帮助文档的这些结构图是什么意思,为什么没有相应的实现接口。


   方法三:后来发现有一个CAT3DAnnotationTextGP接口,好像是跟Annotations相关的,可是我又不知道怎么取到这个类型对象的值,我现在只有到各子零件的文档指针,请问这个接口可以实现吗,可以从零件的文档指针得到这个对象的值吗,这个对象和图一上面的那个注释是什么关系?

我现在真的是没的办法了,哪位好心的高手请指教,本人将不甚感激!!


这么长时间都没人顶下,我自己来了。

   呵呵,经过一段时间的摸索和尝试,终于把标注信息取到了,顺便也知道了取其它三维模型信息的方法。拿过来和大家分享下,希望对以后做这块的兄弟姐妹有点帮助。


   先说下大概思路吧。

   首先以装配图的文档指针对象pDOc为入口,遍历所有的子节点,即零件,得到的是零件的文档指针。因为所有的三维模型信息都是挂在零件节点上的,(不清楚的可以看看CATIA的图纸就明白了)。然后对每个零件做相同的操作:先 初始化  零件,得到零件容器指针,再得到零件的零件对象指针,注意与上面的文档指针不同。然后由零件对象获取所有的子孙对象,遍历所有的子孙对象就可以取出模型信息,我这里是用CATISpecObject遍历的,可能还有其它方法,有兴趣的同志可以继续探索。我这里只取了标注,其它的模型信息可按类似的方式取得。

   还是用代码说话吧!


   //得到装配图的注解(文本内容,坐标,方向,对齐方式,所属零件等信息)pDoc为装配图的文档指针

   int DDBCatiaRW::GetTextofAnnotation(CATDocument *pDoc)

   {

   ddb_MessageLog(16,_T(""),"进入GetTextofAnnotation");//自定义的日志文件

   HRESULT rc = 0;


   CATIProduct *piProduct = GetProductFromDocument(pDoc);//从文档对象指针得到部件对象指针

   if( piProduct == NULL )

   return -1;


   CATListValCATBaseUnknown_var* ListChildren = piProduct->GetChildren();//得到部件的零件列表

   CATIAMODELTYPE type = CATPART;

   if( ListChildren != NULL )

   type = CATPRODUCT;


   piProduct->Release();//注意要释放指针

   piProduct = NULL;



   if(NULL != ListChildren && m_bModelStruct ) //装配件,则递归下去

   {

   int numberOfChildren = ListChildren->Size();

   CATIProduct_var spChild = NULL_var;

   for (int i=1;i<=numberOfChildren;i++)//遍历零件节点

   {

   spChild = (*ListChildren)[i];

   if ( NULL_var == spChild )

   {

   TRACE(_T("spChild = NULL"));

   return -1;

   }


   CATIProduct *pChild = NULL;

   rc = spChild->QueryInterface(IID_CATIProduct, (void**) &pChild);

   if( FAILED(rc) || pChild == NULL)

   return -1;


   //得到零件的名称

   CATUnicodeString instanceName (" ");

   spChild->GetPrdInstanceName( instanceName );

   CString sInstanceName = instanceName.ConvertToChar();


   CATDocument* pChildDoc = GetModelDocumentFromProduct(pChild);//得到零件的文档对象

   if( pChildDoc == NULL )

   return -1;


   if (pChild)

   {

   pChild->Release();

   pChild = NULL;

   }


   CATInit_var spInitOnDoc(pChildDoc);//初始化零件节点

   if(NULL_var == spInitOnDoc)

   return -1;


   if (pChildDoc)

   {

   pChildDoc->Release();

   pChildDoc = NULL;

   }

   //得到零件节点的容器

   CATIPrtContainer *spPrtCont =(CATIPrtContainer*)spInitOnDoc->GetRootContainer("CATIPrtContainer");

   if( spPrtCont == NULL)

   return -1;


   CATIPrtPart_var spPart;

   if(spPrtCont)

   {

   spPart = spPrtCont->GetPart();//得到零件节点对象

   spPrtCont->Release();

   spPrtCont=NULL;

   }


   if (spPart != NULL_var)

   {

   CATIDescendants *piPartAsDescendant = NULL;

   rc = spPart->QueryInterface(IID_CATIDescendants, (void**)&piPartAsDescendant);//取到零件的所有子孙

   if (FAILED(rc) || piPartAsDescendant == NULL)

   return -1;


   int iNumDescendant = piPartAsDescendant->GetNumberOfChildren();

   for (iNumDescendant; iNumDescendant >= 1; iNumDescendant--)

   {

   CATISpecObject_var TheSpeObj = piPartAsDescendant->GetChildAtPosition(iNumDescendant);//得到各子孙节点对象

   if( TheSpeObj != NULL_var)

   { ListSpecObj(sInstanceName,TheSpeObj);//自定义函数,递归遍历子孙节点,可取出所有的模型信息,函数定义下面有

   }

   }

   if (piPartAsDescendant)

   {

   piPartAsDescendant->Release();

   piPartAsDescendant = NULL;

   }

   }

   }

   }

   ddb_MessageLog(16,_T(""),"退出GetTextofAnnotation");//自定义的输出日志函数,方便调试用的

   return TRUE;

   }



   //遍历列取零件的所有对象

   int DDBCatiaRW::ListSpecObj(CString sName, CATISpecObject_var pSpeObj)

   {

   //调试使用

   CATUnicodeString sUniType,sUniSuperType,sUniDisName,spUniName,sFather;

   CString sTypeOut,sSuperTypeOut,sDisNameOut,spNameOut,sFatherName,sPutOut;


   if (pSpeObj == NULL_var)

   return -1;


   sUniType = pSpeObj->GetType();

   sUniSuperType = pSpeObj->GetSuperType();

   sUniDisName = pSpeObj->GetDisplayName();

   spUniName = pSpeObj->GetName();

   sFather = pSpeObj->GetFather()->GetDisplayName();


   sTypeOut = sUniType.ConvertToChar();

   sSuperTypeOut = sUniSuperType.ConvertToChar();

   sDisNameOut = sUniDisName.ConvertToChar();

   spNameOut = spUniName.ConvertToChar();

   sFatherName = sFather.ConvertToChar();

   sPutOut = sTypeOut+"\r\t"+sSuperTypeOut+"\r\t"+sDisNameOut+"\r\t"+spNameOut+"\r\t"+sFatherName+"\r\t";


   ddb_MessageLog(8,sPutOut,"ListSpecObj");

   //end 调试使用


   if ( (sTypeOut.Compare(_T("CATTPSText")) == 0)

   || (sTypeOut.Compare(_T("CATTPSSet")) ==0)

   || (sTypeOut.Compare(_T("CATTPSView")) == 0) )

   {

   CATListValCATISpecObject_var* piList = pSpeObj->ListComponents();//得到特殊对象的成员列表


   if (piList == NULL)

   return -1;

   int iList = piList->Size();



   CATIDrwAnnotation* piAnnot = NULL;

   pSpeObj->QueryInterface(IID_CATIDrwAnnotation,(void **)&piAnnot);//得到标注对象

   //GetAssociativeOrientation_var assOri;

   double dOrit= 0.0,OritRef = 0.0;

   double dX,dY;

   if( piAnnot)

   {

   dOrit = piAnnot->GetOrientation();//标注的方向

   //piAnnot->GetAssociativeOrientation(assOri);

   //  CATBaseUnknown* pUnk = pSpeObj->GetFather();

   //  piAnnot->GetAssociativePosition(pUnk,Ass_Contour);

   piAnnot->GetPosition(dX,dY);//标注的坐标

   CATIDrwText* piText = NULL;

   CATUnicodeString sAnnotText;

   int OriRef;

   double dWidth;

   piAnnot->QueryInterface(IID_CATIDrwText,(void**) &piText);//得到文本对象

   if(piText)

   {

   piText->GetPosition(dX,dY);

   piText->GetStringAt(sAnnotText);//文本内容

   dOrit = piText->GetOrientation();

   OriRef = piText->GetOrientationReference();

   piText->GetWrappingWidth(dWidth);

   CString sAnnotofText = sAnnotText.ConvertToChar();

   CString sTextInfo;

   sTextInfo.Format(_T("文本标注的坐标为:X = %.2f, Y = %.2f\n 方向为:%.2f\n\r\t相对方向为:%d\n\r\t宽度为:%.20f\n\r\t"),

   dX,dY,dOrit,OritRef,dWidth);

   sAnnotofText += "\r\t"+ sTextInfo;

   ddb_MessageLog(8,sAnnotofText,"ListSpecObj");

   }

   if (piText)

   {

   piText->Release();

   piText = NULL;

   }

   }

   if (piAnnot)

   {

   piAnnot->Release();

   piAnnot = NULL;

   }



   if (iList < 1)

   return -1;

   for (iList; iList >= 1; iList--)

   {

   CATISpecObject_var pSpec = (*piList)[iList];

   if( pSpec != NULL_var)

   ListSpecObj(sName,pSpec);//递归遍历

   }

   }


   return TRUE;

   }


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空