admin 发表于 2022-6-1 14:33:25

一文搞懂NX关于Tag,TaggedObject,Handle之间的转换关系

Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:这里假定变量:TaggedObject * getObject 为 对象指针; getObjectTag为Tag类型,handle为handle类型,直接通过代码看:这里选择了一个体,打印下结果如下:
// tag --> Object
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
// Object --> Tag
//直接通过对象的Tag()方法获取
tag_t getObjectTag = getObject ->Tag();
//tag-->handle
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
// handle --> tag
// ... 往后看....

GetHandle: RMHPressureSymbol.prt R0000068a00000028GetTag: 52583
这个handle就是唯一标识,永久(相对来说)保持不变,那么假想存储这个值后,关闭软件,重新读取就不用重复选择了。通常情况下,保持一些特殊的对象能够存储下来,需要通过这样的方式进行。那么是否一定需要存储这个字符串,如何通过字符串再去找到tag,进行操作呢。那么接下来介绍三种方法供参考。(1) 通过UF_TAG_decompose_handle方法可以获取到fileID,ID,version,然后通过 UF_TAG_compose_handle(file_data, ID, version, &handle); 就可以获取handle,有了handle就可以获取UF_TAG_ask_tag_of_handle ;这种方法,存储完整的handle字符串,字符串太长,没有必要。

std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
{
stringstream ss;
ss.clear();
unsigned int
    ID,
    version;
char
    * file_data,
    * handle,
    msg;
if (objectTag)
{
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
    ss << file_data << "_"<< ID <<"_" << version;
    UF_free(handle);
    UF_free(file_data);
}

return ss.str();
}(2)通过存储file_data, ID, version的组合,这三个值结果是这样的,如果能够存储这三个值,那么通过Compose的方法就可以组合handle,这样就饿可以查找了。handle:RMHPressureSymbol.prt R0000068a00000028file_data:RMHPressureSymbol.prt RID:1674version:40(3)非常简单的方式,通过FindObject去进行查找,只需要存储ID就可以,(当然这个ID是不是一定唯一还需考量),通过 "HANDLE R-ID “ 的组合,使用 NXOpen::Session::GetSession()->Parts()->Work()->FindObject(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
{
vector<TaggedObject*> getObjects;
getObjects.clear();

string attributeName("");
string attributeValue("");
vector<string> stringArray;
stringArray.clear();
//get the attribute value
// get the attribute name

attributeName = GetAttributeName_FromType(typeT);
if (isStringEmpty(attributeName))
{
    return getObjects;
}
//get the attribute value
bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
if (!hasAtt)
{
    return getObjects;
}

attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();

if (isStringEmpty(attributeValue))
{
    return getObjects;
}


//get the key based on the split value
String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
for (string item : stringArray)
{
    //read the string to get the object
   TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
   
   if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
   {
       getObjects.push_back(tempObject);
   }
}

return getObjects;
}



更多实例视频和专辑课程陆续分享!

欢迎转载学习!
更多精彩内容请关注PLM之家http://www.plmhome.com



ENDPLM之家plmhomehttps://mmbiz.qpic.cn/mmbiz_jpg/N6x8IJWZW5hqicgwQsFR48mHmZ7OJ2SqiavCqV0P04ghufWGO5oziaT2EJpORVo9aIkicXkfzfOhBu63cCX7JtBY1Q/640?wx_fmt=jpeg
▲长按二维码“识别”关注

~~~~往期经典文章链接~~~~
NX表达式视频
PLM之家表达式专题视频-1 表达式概述
PLM之家表达式专题视频-2 创建、编辑表达式
PLM之家表达式专题视频-3 用户表达式、系统表达式
PLM之家表达式专题视频-4 表达式的导入导出
PLM之家表达式专题视频-5 条件表达式
PLM之家表达式专题视频-6 部件间表达式
PLM之家表达式专题视频-7 表达式建模综合练习
NX冲压分析可成形一步式视频
冲压模具分析工具 1 分析可成形性 - 一步式介绍
冲压模具分析工具 2 分析可成形性 - 一步式类型及功能
冲压模具分析工具 3 全部展开实例
冲压模具分析工具 4 中间展开实例)
PLM之家-NX9.0冲压模具分析工具 5 高级展开实例
NX产品模板工作室PTS视频1 产品模版工作室概述
2 产品模版工作室界面
3 创建一个基本的模版
4 PTS高级模版技巧
5 PTS添加需求HD3D
6 添加装配模版
8 产品模版技巧实例NX高精可视化HD3D视频
1. PLM之家NX全息3D培训-HD3D概述
2. PLM之家NX全息3D培训-HD3D基本使用
3. PLM之家NX全息3D培训-HD3D客户化展示
4. PLM之家NX全息3D培训-创建HD3D
5. PLM之家NX全息3D培训-创建多维可视化报告
NX模型检查一致性check-mate视频
1. Check-Mate基本概念及使用流程2 Check-Mate结合HD3D的使用3 Check-Mate问题修复方法4 创建自定义企业的Check-Mate规范5 客户化规范验证和Check-Mate报告管理6 使用check-mate Viewer创建报告7 使用质量仪表Quality Dashboard9 中国包中的Check-Mate插件使用
NX入门视频实例教程(8 小时)1 二次开发环境配置2 二次开发模式3 简单的消息框5 使用ufun创建圆柱体8 NXOpen对象选择功能9 ufun对象选择功能10 二次开发工程项目创建11 菜单MenuScrip脚本12 NX6之前老的UI设计13 新的Block UI对话框设计14 使用uistyler和C创建block15 使用uistyler和C++创建block16 创建Block(1)UI设计16 创建Block(2)代码模版分析16 创建Block(3)特征创建16 创建Block(4)创建完成17 Block UI创建圆柱体特征(1)对话框设计17 Block UI创建圆柱体特征(2)获取UI值17 Block UI创建圆柱体特征(3)程序创建18二次开发利器:JA的使用技巧19 NXOpen结合.net的使用20 完善JA的选择功能21 JA作为程序调用22 Snap最新简易开发程序23 BodyCollector选择容器24 创建自定义基准CSYS控件使用(1)24 创建自定义基准CSYS控件使用(2)24 创建自定义基准CSYS控件使用(3)24 创建自定义基准CSYS控件使用(4)24 创建自定义基准CSYS控件使用(5)25 遍历整个部件对不同的面设置颜色(1)25 遍历整个部件对不同的面设置颜色(2)26 NX Open C++获取装配所有组件(1)26 NX Open C++获取装配所有组件(2)26 NX Open C++获取装配所有组件(3)27 NX Open 获取装配组件加载状态28 TreeList显示装配组件和加载状态(1)28 TreeList显示装配组件和加载状态(2)28 TreeList显示装配组件和加载状态(3)28 TreeList显示装配组件和加载状态(4)28 TreeList显示装配组件和加载状态(5)29 TreeList添加快捷菜单功能(1)29 TreeList添加快捷菜单功能(2)29 TreeList添加快捷菜单功能(3)30 UFUN获取实体的最小包络尺寸(1)30 UFUN获取实体的最小包络尺寸(2)31 NXOpen C++草图的创建(1)31 NXOpen C++草图的创建(2)31 NXOpen C++草图的创建(3)31 NXOpen C++草图的创建(4)31 NXOpen C++草图的创建(5)31 NXOpen C++草图的创建(6)31 NXOpen C++草图的创建(7)31 NXOpen C++草图的创建(8)32 NXOpen C++创建拉伸草图(1)32 NXOpen C++创建拉伸草图(2)33 NXOpen C++创建旋转草图(1)33 NXOpen C++创建旋转草图(2)33 NXOpen C++创建旋转草图(3)33 NXOpen C++创建旋转草图(4)34 创建基本特征高级UI组合(1)34 创建基本特征高级UI组合(2)34 创建基本特征高级UI组合(3)34 创建基本特征高级UI组合(4)34 创建基本特征高级UI组合(5)34 创建基本特征高级UI组合(6)34 建基本特征高级UI组合(7)35 Block UI 弹出另一个UI对话框(1)35 Block UI 弹出另一个UI对话框(2)

NX机管道布置培训课程(10小时)
1 管道模块简介1.1 管道模块简介1.3 NX管道对象及选择1.2 NX创建管道装配及配置
2 创建编辑路径2.1 创建路径2.3 编辑删除路径2.2 指派拐角2.4 变换路
3 审核部件3 审核部件

4 添加部件到管道系统4.1 管道标准件库4.3 切割弯头4.2 放置部件4.4 添加自动弯头
5 添加型材5.1 型材Stock简介5.3 创建编辑型材Stock5.5 相连曲线5.2 型材Stock默认设置5.4 处理非圆形型材
6 HVAC管道功能6.1 型材过渡6.2 拆分管道
7 管理管道布置装配7.1 管道中的装配约束7.3 统一路径7.5 转换型材为装配组件7.7 设计规则检测7.2 常用命令7.4 不连续点处理7.6 水密连接件
8 管理管道部件选择8.1 了解管道规范8.3 创建管道过滤实例8.2 过滤管道部件库8.4 创建管道后置处理
9 创建管道通路9.1 关于管道通路9.3 定义管道通路9.2 定义管道通路
10 创建管线布置逻辑图10.1管道逻辑图简介10.3 创建逻辑图管路10.2 创建逻辑图
11 创建标准库11.1 管道零件库环境简介11.3 创建自己的库11.2 库工作原理
NX二次开发入门经典教程(35小时)1.1 NX 二次开发API简介1.2 NX二次开发API选择及帮助文档1.3 NX二次开发模式及环境变量3.3 ufun创建圆柱中心线实例3.2 ufun链表的使用4.2 ufun其他常用函数讲解4.3 ufun实例-竖直边倒圆角5.1 菜单脚本开发5.3 Block Sytler简介6.1 block sytler模板Code讲解6.3 创建圆柱体长方体界面切换及功能实现7.1 Journal日志录制及DeBug技巧7.3 NXOpen对象操作8.2 NXOpen部件操作
其他重点咨询
工业互联网咨询:《工业互联网创新发展行动计划(2021-2023年)》解读
工业互联网创新发展行动计划(2021-2023年)
智算中心纳入新基建-风口正当时工业软件APP:西门子NX创建机械管道--创建编辑型材Stock基本功能使用
西门子NX管道设计模块-- 添加管道设计部件到布置中
西门子NX管道设计,创建标准件库库工作原理
NX软件机械布管模块--创建自己的管道标准件库-原创教程
NX机械布管中统一路径的用法,一个小技巧,节省你很多的时间数字化转型:工业4.0新利器-数字化制造应用程序-3D技术文档发布功能
Gartner发布2020年十大战略科技发展趋势
快速了解如何使用Teamcenter(AW)|NX|Polarion|Mentor进行跨领域BOM管理工业互联网技术栈:干货来袭!NX二次开发之单机版 VS Teamcenter集成开发环境下文件操作方法40多页PPT看懂最全的焊接符号,真的一点儿都不难
NX二次开发几何关系判断技巧:如何判断两个面是否相切
Threejs 基于webGL的3D开发神器西门子NX软件二次开发高效开发环境搭建技巧
基于WebGL的三维建模是否可以成为国产CAD的突破口
页: [1]
查看完整版本: 一文搞懂NX关于Tag,TaggedObject,Handle之间的转换关系