求读取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;
}





  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值