NX2306 C++二次开发系列(九)标注的附加文本中引用对象的读取方法

最近需要读取标注内容,然后法线有一种标注方式,需要获取形位公差,但是形位公差标注在附加文本以引用的形式出现,无法直接获取对象,通过各种尝试发现没有直接获取的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的接口说明吧

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

守护暗神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值