最近需要读取标注内容,然后法线有一种标注方式,需要获取形位公差,但是形位公差标注在附加文本以引用的形式出现,无法直接获取对象,通过各种尝试发现没有直接获取的API,所以只能另辟蹊径,通过其他办法解决
1、效果展示

2、实现方法
由于没有直接读取的API,所以只能通过其他方式,通过代码录制我们发现这个对象在附加文本中是以用户符号的形式存储的,通过UI查看引用的时候是有歧义的,每次打开模型,所有的引用名称都是一样的,例如:“<!SYM=Ref1*0>”,实际上通过API从标注获取的附加文本并非是这样的,而是“<!SYM=RMA01-0181-00484-PMI标注.prt R000079670000000d>”,其中“R000079670000000d”就是引用的对象的唯一标识,那么我们只需要找到与这个唯一标识一致的对象就是我们要找的那个对象了
2.2、首先需要遍历所有的对象,获取指定的类型的tag
通过录制代码我们可以自行获取该引用对象的类型为:UF_drafting_entity_type,UF_draft_user_defined_subtype,所以这里我们就过滤这个类型的对象,并保存他们的引用字符串(万恶的西门子,接口文档里居然没有CreateEmbeddedAnnotationText()这个方法的说明)
//获取自定义符号标注
//创建引用字符串类
NXOpen::Annotations::AssociativeText *assText = workPart->Annotations()->CreateAssociativeText();
std::map<std::string,tag_t> customSymbolMap;
tag_t obj_tag = NULL_TAG;
obj_tag = UF_OBJ_cycle_all ( workPart->Tag(), NULL_TAG );//遍历part下所有的对象
while( obj_tag != NULL_TAG )
{
int type = 0;
int subtype = 0;
UF_OBJ_ask_type_and_subtype(obj_tag,&type,&subtype);//获取对象的类型
if(type == UF_drafting_entity_type && subtype == UF_draft_user_defined_subtype){//判断是自定义符号
NXOpen::NXObject *obj = dynamic_cast<NXOpen::NXObject*>(NXOpen::NXObjectManager::Get(obj_tag));
if(obj) {
NXOpen::Annotations::CustomSymbol *customSymbol(dynamic_cast<NXOpen::Annotations::CustomSymbol *>(obj));
if(customSymbol != NULL){//获取自定义符号对象
//创建对象引用文本
NXString assStr = assText->CreateEmbeddedAnnotationText(customSymbol);
customSymbolMap[assStr.GetUTF8Text()] = obj_tag;
}
}
}
obj_tag = UF_OBJ_cycle_all ( workPart->Tag(), obj_tag );
}
2.3、匹配引用字符串找到引用对象
然后获取附加文本的引用字符串,与上面的比较,一致的就是你要找的那个引用对象了
//读取附加文本
for(auto text : dim->GetAppendedText()->GetAboveText()){//上
auto tags = extractTags(text.GetUTF8Text());//用于解析<tag>这种类型的字符串
for(std::string tag : tags){
auto it = customSymbolMap.find(tag);//查找是否有匹配的引用字符串
if(it != customSymbolMap.end()){
NXOpen::NXObject *obj = dynamic_cast<NXOpen::NXObject*>(NXOpen::NXObjectManager::Get(it->second));//通过tag获取对象
if(obj) {
//获取自定义符号对象
NXOpen::Annotations::CustomSymbol *customSymbol1(dynamic_cast<NXOpen::Annotations::CustomSymbol *>(obj));
//获取特征控制框对象,这个是固定的,不知道什么逻辑
NXOpen::Annotations::DraftingFcf *draftingFcf1(dynamic_cast<NXOpen::Annotations::DraftingFcf *>(customSymbol1->FindObject("Custom Symbol Geometry-1")));
//获取构造对象
NXOpen::Annotations::DraftingFeatureControlFrameBuilder *draftingFeatureControlFrameBuilder = workPart->Annotations()->CreateDraftingFeatureControlFrameBuilder(draftingFcf1);
NXOpen::TaggedObject *taggedObject = draftingFeatureControlFrameBuilder->FeatureControlFrameDataList()->FindItem(0);
if(taggedObject){
//特征控制框对象
NXOpen::Annotations::FeatureControlFrameDataBuilder *featureControlFrameDataBuilder1(dynamic_cast<NXOpen::Annotations::FeatureControlFrameDataBuilder *>(taggedObject));
featureControlFrameDataBuilder1->SetToleranceValue("0.11");
NXOpen::NXObject *nXObject1;
nXObject1 = draftingFeatureControlFrameBuilder->Commit();
draftingFeatureControlFrameBuilder->Destroy();
}
}
}
}
}
3、总结
这种二次开发的活真的是太恶心人了,好多功能接口不开放不说,已有的接口说明那叫一个晦涩难懂,怪不得大家都还是喜欢用UFUN开发,C++的接口既繁琐又各种找不到,接口文档说明就一句话,好好学学UFUN的接口说明吧
6028

被折叠的 条评论
为什么被折叠?



