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

Camille 2011-01-13 02:48:31
我是新手,接触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相关的,可是我又不知道怎么取到这个类型对象的值,我现在只有到各子零件的文档指针,请问这个接口可以实现吗,可以从零件的文档指针得到这个对象的值吗,这个对象和图一上面的那个注释是什么关系?

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




...全文
1194 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc635343 2013-03-29
  • 打赏
  • 举报
回复
高手呀,不是新手了,佩服
harrison1573 2012-09-20
  • 打赏
  • 举报
回复
多谢楼主提供是思路~
yuhuimoon 2011-10-25
  • 打赏
  • 举报
回复
不错,学习一下,多谢楼主分享!
ts10295770203 2011-02-10
  • 打赏
  • 举报
回复
转换后的2D图纸的数据,怎么样才能导出来呢,求救~
ts10295770203 2011-02-10
  • 打赏
  • 举报
回复
我想取得3D图中的数据,怎么弄呢,
因为很多都是 做版本升级,我想做个版本对照的功能,
看看 都哪些数据被改动了, 3D转2D图, 2D图中的数据,怎么取得呢?
Camille 2011-01-25
  • 打赏
  • 举报
回复
这么长时间都没人顶下,我自己来了。
呵呵,经过一段时间的摸索和尝试,终于把标注信息取到了,顺便也知道了取其它三维模型信息的方法。拿过来和大家分享下,希望对以后做这块的兄弟姐妹有点帮助。

先说下大概思路吧。
首先以装配图的文档指针对象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;
}
Camille 2011-01-13
  • 打赏
  • 举报
回复
是啊,网上资料也很少,对于我这个新手,就是想实现这么一个小功能也是摸索了好久,仍是求解中。
中望3DTM是由中望公司最新推出的一款高性价比的CAD/CAM一体化解决方案,同时也是中国唯一一款具有全球自主知识产权的三维设计软件。 中望3D拥有完备的功能模块,造型、模具、装配、加工、逆向工程、钣金等功能模块一应俱全,具有兼容性强、易学易用等特点,并能和主流的三维设计软件实现数据的高度兼容,帮助工程师轻松完成从概念到产品的设计。采用中望3D是企业大幅提高生产力并降低设计和制造成本,从而实现从设计到加工的最佳途径。 中望3D2011版功能介绍: 易学易用 中望3D内嵌“边学边用”系统,具有丰富的练习案例,相当于一本3D教学教材,设计师能按他们自己的节奏去学习,能帮助用户最大限度削减培训成本,缩短软件学习周期。 强大数据交互能力 能够读取CATIA,NX,SolidWorks,Pro/E,Inventor和其它模型文件,支持市面上所有主流设计系统的2D和3D数据交换与分享,提升供应链的协作。 创新的建模能力 强大的OverdriveTM混合建模内核,全相关的2D草图、零件库与数据管理,使复杂模型从概念到完成的设计变得简单。 直接编辑和快速编辑 中望3D SmoothflowTM直接编辑功能允许修改和操作开放或封闭的模型。这种交互式人机图形编辑命令提高了在复杂建模时的工作效率,让设计师专注于设计,而不是设计系统。 零件库 中望3D里集成了PartSolutionsTM零件库,提供国际标准零件和主流的厂商零件,包括ANSI、DIN、EN、GB、ISO、JB、JIS、DME、HASCO、MISUMI等。 完善的模具设计工具 混合建模工具为仅用简单步骤建立拔模,分模,模具型芯型腔制作提供了可能,模具模型建立更容易。模具功能中还提供一些主要的模具设计模块,如滑块、抽芯、顶针和冷却水道等。零件库功能提供一些主流厂商的模架零件,方便用户快速建立整个模具系统。 自动工具可以快速、批量地创建加工电极,电极底座也可同时生成,并可生成电极表。特征识别让生成电极起来非常方便。 中望3D引导用户从建立模具过程,到查询、模拟和分析设计,以保证设计出的模具可加工和实用性,为中望3D CAM加工步骤做好准备。 钣金设计 针对钣金零件,中望3D里可以根据钣金件的特点,进行钣金折弯、创建加强筋或凹陷,增加百叶窗等。并能够对设计好的钣金件进行展开或折叠,从而方便快速地创建钣金实体。 先进的CNC加工技术 中望3D提供强大的CAM功能,能够生成2轴至5轴的CNC程序。自动分析中望3D的模型,使用自动加工策略,能够自动识别零件中的腔体、孔和曲面等特征,并运用最合适的加工刀具和加工路线。 粗加工和精加工方法考虑了坯料,夹具和每次加工余量,最小化空切,根据刀具的情况提供最适合的加工进给率控制,从而延长刀具使用寿命,并提高最后加工零件的质量。高速铣方式运用在硬质材料,提供高速光滑流线加工路线,达到加工表面均匀且高质量。 可选择性的5轴刀路策略提供了一套让编程者选择的刀路,像平面铣用来保持刀具垂直加工表面,以及边侧铣削保持刀具的一侧与加工表面进行贴合。 高性价比 造型、模具、装配、加工、逆向工程、钣金等功能模块一应俱全,价格公道,为企业降低设计成本。 中望3DTM下载说明:由于中望3DTM安装包较大,为方便用户下载使用,特将中望3DTM安装包分为运行包和素材包。运行包主要包括支撑中望3DTM运行的全部文件;素材包主要包括帮助文档、培训手册、零件库以及实例图纸等内容。安装时,用户需要先安装运行包,然后安装素材包。欢迎下载使用! 素材包地址:http://www.zwcad.com/download_detail_7_95.html 中望3DTM是由中望公司最新推出的一款高性价比的CAD/CAM一体化解决方案,同时也是中国唯一一款具有全球自主知识产权的三维设计软件。 中望3D拥有完备的功能模块,造型、模具、装配、加工、逆向工程、钣金等功能模块一应俱全,具有兼容性强、易学易用等特点,并能和主流的三维设计软件实现数据的高度兼容,帮助工程师轻松完成从概念到产品的设计。采用中望3D是企业大幅提高生产力并降低设计和制造成本,从而实现从设计到加工的最佳途径。 中望3D2011版功能介绍: 易学易用 中望3D内嵌“边学边用”系统,具有丰富的练习案例,相当于一本3D教学教材,设计师能按他们自己的节奏去学习,能帮助用户最大限度削减培训成本,缩短软件学习周期。 强大数据交互能力 能够读取CATIA,NX,SolidWorks,Pro/E,Inventor和其它模型文件,支持市面上所有主流设计系统的2D和3D数据交换与分享,提升供应链的协作。 创新的建模能力 强大的OverdriveTM混合建模内核,全相关的2D草图、零件库与数据管理,使复杂模型从概念到完成的设计变得简单。 直接编辑和快速编辑 中望3D SmoothflowTM直接编辑功能允许修改和操作开放或封闭的模型。这种交互式人机图形编辑命令提高了在复杂建模时的工作效率,让设计师专注于设计,而不是设计系统。 零件库 中望3D里集成了PartSolutionsTM零件库,提供国际标准零件和主流的厂商零件,包括ANSI、DIN、EN、GB、ISO、JB、JIS、DME、HASCO、MISUMI等。 完善的模具设计工具 混合建模工具为仅用简单步骤建立拔模,分模,模具型芯型腔制作提供了可能,模具模型建立更容易。模具功能中还提供一些主要的模具设计模块,如滑块、抽芯、顶针和冷却水道等。零件库功能提供一些主流厂商的模架零件,方便用户快速建立整个模具系统。 自动工具可以快速、批量地创建加工电极,电极底座也可同时生成,并可生成电极表。特征识别让生成电极起来非常方便。 中望3D引导用户从建立模具过程,到查询、模拟和分析设计,以保证设计出的模具可加工和实用性,为中望3D CAM加工步骤做好准备。 钣金设计 针对钣金零件,中望3D里可以根据钣金件的特点,进行钣金折弯、创建加强筋或凹陷,增加百叶窗等。并能够对设计好的钣金件进行展开或折叠,从而方便快速地创建钣金实体。 先进的CNC加工技术 中望3D提供强大的CAM功能,能够生成2轴至5轴的CNC程序。自动分析中望3D的模型,使用自动加工策略,能够自动识别零件中的腔体、孔和曲面等特征,并运用最合适的加工刀具和加工路线。 粗加工和精加工方法考虑了坯料,夹具和每次加工余量,最小化空切,根据刀具的情况提供最适合的加工进给率控制,从而延长刀具使用寿命,并提高最后加工零件的质量。高速铣方式运用在硬质材料,提供高速光滑流线加工路线,达到加工表面均匀且高质量。 可选择性的5轴刀路策略提供了一套让编程者选择的刀路,像平面铣用来保持刀具垂直加工表面,以及边侧铣削保持刀具的一侧与加工表面进行贴合。 高性价比 造型、模具、装配、加工、逆向工程、钣金等功能模块一应俱全,价格公道,为企业降低设计成本。 中望3D是广州中望龙腾软件股份有限公司拥有全球自主知识产权的高端三维CAD/CAM一体化产品。中望3D技术建立在一个独特的、高性能的Overdrive混合建模内核上,这使得计算速度更快,精度更高,也使中望3D处理复杂图形和海量数据有了保证。使用速度极快的中望3D混合建模工具,工程师们能够充分感受快速实体和曲面混合建模的强大功能,自带的CAM模块使得从设计到加工不存在任何文件衔接问题,钣金、模具设计、逆向工程、渲染、分析等模块的应用丰富了用户的工作需,从入门级的模型设计到全面的一体化解决方案,中望3D都能提供强大的功能以及卓越的性能。 中望3D标准版包含中望3D产品里所有的高级设计模块,提供了一个功能强大、并且有着极高效率的建模工具。利用混合建模您可以在同一个环境下控制实体和曲面无缝结合。高效易用的钣金设计、模型修补功能这些附加的模块使中望3D标准版成为一个功能强大的设计软件包。(对应的素材包过大,请到中望官网下载。) 中望3D标准版主要功能亮点有: 超快数据转换 通过内置转换程序,轻松读取所有设计系统的数据 支持Catia V4、Catia V5、NX(Unigraphics)、Pro/E、Parasolid、SAT、STEP、DWG/DXF、STL、VDA等文件格式 随心所欲的建模 中望3D集线框体、曲面与实体的功能于一体。设计者可以使用实体工具如拉伸、旋转、扫描、放样产生基本实体再加上特征如切除、挖孔、倒圆角等完成设计。可让设计者通过参数化的方式建立复杂的实体和曲面建模功能 中望3D的钣金设计功能让您的设计构想付诸现实 2D工程图 从3D模型生成2D图并可自动更新,及时反映模型或装配体的变化 自动布局三视图、剖面图、局部放大图,并自动标注 自动生成BOM表、孔表和电极表 让图片内容立体起来 充满艺术感的浮雕效果和变形功能让图片变成生动的立体图形 极富操作乐趣的学习 这不是简单意义上的教程,“边学边用”内嵌于中望3DTM软件之中,学习者可以一边观看学习示例,一边操作软件;操作提示、功能介绍皆在眼前 让您一步一步跟随操作,轻松完成复杂的建模和装配,甚至加工的学习 装配体运动仿真和验证 运动仿真让您对设计中可能存在的干涉了如指掌,从而提前避免或及时排除可能遇到的问题 实体验证功能,可以让用户快速观察到模拟验证的情况,可以减少所需的实物样机数量 即刻修改出现的问题 干涉、倒拔模斜度、弯曲变形等问题实时显示出来 自由设计 可以自上向下,自下向上或同时以两种方式构建装配 组件可以灵活地保存在一个或多个中望3D文件中 轻松处理大文件 Burst技术通过动态数据检索轻松处理大型装配 消除模型的间隙和破面 存在间隙或破面的不封闭实体或曲面,不用修复就能像封闭实体一样进行操作 中望3D强大的曲面造型和方便的修复和缝合工具极大的方便了间隙和破面的修补

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧