PLM之家PLMHome

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

[复制链接]

2022-6-1 14:33:25 249 0

admin 发表于 2022-6-1 14:33:25 |阅读模式

admin 楼主

2022-6-1 14:33:25

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:
这里假定变量:
TaggedObject * getObject 为 对象指针;
getObjectTag为Tag类型,
handle为handle类型,
直接通过代码看:这里选择了一个体,打印下结果如下:
640.png
[C++] 纯文本查看 复制代码
// 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 
// ... 往后看....

* r; @& V3 W2 \# n
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
/ u) T9 M* d; @$ T( J6 @
这个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字符串,字符串太长,没有必要。
[C++] 纯文本查看 复制代码

std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
{
  stringstream ss;
  ss.clear();
  unsigned int
    ID,
    version;
  char
    * file_data,
    * handle,
    msg[30];
  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 R0000068a00000028
file_data:RMHPressureSymbol.prt R
ID:1674
version:40
(3)非常简单的方式,通过FindObject去进行查找,只需要存储ID就可以,(当然这个ID是不是一定唯一还需考量),通过 "HANDLE R-ID “ 的组合,使用 NXOpen::Session::GetSession()->Parts()->Work()->FindObject(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

3 H! k9 Q  m/ U; f( A6 r* W
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[C++] 纯文本查看 复制代码
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;
}
) A' f& w& U9 P' y3 B
, n$ `- k( ~9 x7 M

' X" B$ }5 o, r8 q) M) t  ^5 a* v9 D& E
更多实例视频和专辑课程陆续分享!
. b. y& j4 \; {+ Z2 M1 V4 m
$ Q- P0 U2 n* i* x; h. g+ Q
欢迎转载学习!

/ w1 s4 Q+ p% c1 d; f; n8 H
更多精彩内容请关注PLM之家
http://www.plmhome.com
; f0 `& M. K7 q% s8 e

6 o1 h' \. m+ E
# ^5 n+ d% w2 t% ~* }
: Q" S6 N. q/ d, w4 g. F
END
PLM之家plmhome
4 p. j! X. u. G* U' |- z
                               
登录/注册后可看大图

9 A9 r$ o: u4 h6 b3 j/ J! L▲长按二维码“识别”关注
- R# F; w# c9 e$ H, `
# D/ w$ ^# l# ]( L8 T% j' A' z/ p
~~~~往期经典文章链接~~~~

) a2 P0 V, i- B. n4 i( M, l
NX表达式视频
: R% M  I9 E, v" G( c0 i; `& A
PLM之家表达式专题视频-6 部件间表达式
  _5 j3 F4 X: |3 M/ O# Q8 l( D& U

9 c4 a* B: \; X3 W4 K
NX冲压分析可成形一步式视频
' v5 c' [8 R) |
! s4 m. Y/ i: o# C
NX产品模板工作室PTS视频
1 产品模版工作室概述
/ z( S5 m; \: v' [' T
2 产品模版工作室界面
% W& M' u0 ^8 }) P4 b
3 创建一个基本的模版1 r0 C4 O! [' l8 e, [8 T4 W
4 PTS高级模版技巧
: c# _5 P. l/ V/ A( O
5 PTS添加需求HD3D  w, _8 Y) V9 p
6 添加装配模版
5 D  A) A5 d! _" \
NX高精可视化HD3D视频

: @4 M4 L6 w% A
4. PLM之家NX全息3D培训-创建HD3D
, `# o  p+ J1 \1 R- ~* _, y7 ]

: L' n8 |1 r( A
NX模型检查一致性check-mate视频
- b$ r2 e* p' o' {) }- O

: b. W  Y- y9 @
NX入门视频实例教程(8 小时)

/ G9 N* m+ L' r  X9 x
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
3 \5 L' S% I4 l/ D" E
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
8 q' G9 z8 ^! d1 ^% J
其他重点咨询

0 q) \& Y& ]* C5 Z8 }1 p* s
工业互联网咨询:
工业互联网创新发展行动计划(2021-2023年)
- r7 ]/ Z; d- s: V$ `( x1 _+ G( ]9 O
工业软件APP:
数字化转型:
工业互联网技术栈:
, l9 k# Q( Q) S9 y4 `, l8 g
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

:
管理员
:
xduniverse@qq.com
:
点击这里给我发消息
:
http://www.plmhome.com
:
原西门子NX高级教务员,10多年NX培训,开发咨询,Teamcenter培训实施等

主题2418

帖子3682

积分73798

图文推荐

  • Tecnomatix 二次开发入门教程 3 第一个hell

    Tecnomatix 二次开发入门教程 3 第一个hello plm

  • 官方文档,NX12 使用 Python进行二次开发相

    官方文档,NX12 使用 Python进行二次开发相关配

  • PLM之家NX插件V8.0.0.0发布,支持NX1847版

    PLM之家NX插件 ============================

  • Teamcenter12.0 汽车解决方案TcAE 入门教程

    Teamcenter12.0 汽车解决方案TcAE 入门教程 *

  • 获取孔的坐标

    想请问一下怎么操作能获得孔的坐标(孔在加工面上

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    PLM之家(plmhome.com)提供专业的实施-开发-培训

    扫码关注,海量教程免费学习,不断更新!

    关注plm之家plmhome公众号

    哥已知晓