我是新手,接触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相关的,可是我又不知道怎么取到这个类型对象的值,我现在只有到各子零件的文档指针,请问这个接口可以实现吗,可以从零件的文档指针得到这个对象的值吗,这个对象和图一上面的那个注释是什么关系?
我现在真的是没的办法了,哪位好心的高手请指教,本人将不甚感激!!