PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

积分
82162
QQ
发表于 2022-6-1 14:33:25 | 显示全部楼层 |阅读模式

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

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

x
Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:
这里假定变量:
TaggedObject * getObject 为 对象指针;
getObjectTag为Tag类型,
handle为handle类型,
直接通过代码看:这里选择了一个体,打印下结果如下:
640.png
[mw_shl_code=cpp,true]$ d$ d$ S5 f; J4 Y/ N
// tag --> Object
5 |$ ~- r2 j2 T. ]//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
9 ]  z8 t* G% U! `. qTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
% d5 c' i6 B6 N- Q$ y1 }5 j// Object --> Tag2 q! v5 }6 Z, }# A- M
//直接通过对象的Tag()方法获取
& Q  P( f# \+ G$ Itag_t getObjectTag = getObject ->Tag();
" O# q  d2 [2 z" |//tag-->handle
7 E; i$ ?  T7 x/ m! U8 |char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
2 i8 @" y% Q+ C$ r% w// handle --> tag
: Q0 ?0 N9 w# b  D8 ?% p. v// ... 往后看....' A+ `* m1 L( u  V8 V
[/mw_shl_code]
6 Y! g6 F9 ]4 B: ]( M
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
4 q: k! H; a& z; C$ R+ \
这个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字符串,字符串太长,没有必要。
[mw_shl_code=cpp,true]
& b4 {$ z# [& i' S; P
  j% ^0 x$ t4 L  K: ]) s* o1 ystd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)8 }) }6 B' `" ]. S. U
{
9 y0 h! d8 g) q5 F) C( k  stringstream ss;7 E/ W! ]0 q  {1 k3 \7 i
  ss.clear();
" a$ H% a3 Z' G  ^0 Y& M  unsigned int1 o% x+ A3 K8 z: g
    ID,  Q* p: ?9 U2 V: {% ]5 {
    version;# g; h9 Y% ^4 u: t6 T; D8 f
  char: d& M# c1 t2 t1 H
    * file_data,* y( n2 ]4 ^1 r- l1 c3 V
    * handle,$ J1 w% R! I: K5 d
    msg[30];
& F( P: [5 x1 [  if (objectTag)2 m6 I1 O- R' [4 b# B) m5 Q
  {
! z6 R! e+ E$ O+ u; m  B0 T    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
2 U) U, a# s0 D# b7 a+ A4 n% K    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());! C# @4 i1 T, q2 n) S+ i
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);: l* n' e9 O+ ~2 ~6 g9 e! S. E
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
8 ~& B0 e+ \* h* ?    ss << file_data << "_"<< ID <<"_" << version;
5 j* c. x3 x% U% _9 C; X, }- Y) b, I    UF_free(handle);* ]/ P! f- \+ u, a
    UF_free(file_data);
5 a+ G( Y( V( z+ T- F, M: k7 j  }
0 p9 W9 g0 o% u  j; y2 |5 f& }
7 x9 E( J/ n/ d) B) V  return ss.str();
& H: s' x6 v3 ~3 O' i$ j}[/mw_shl_code]
(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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

7 v4 ]7 }1 I- @2 s# ?
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)# E* L- `$ o4 O, Z: e
{% }* T8 S. c* ?7 n
  vector<TaggedObject*> getObjects;
$ ~" E* V! @5 ~0 q& U( H  getObjects.clear();
3 F; S- C0 T3 g6 \' ~, V) s
+ E- O' R) @; q: z! H- ~  string attributeName("");$ Y% f$ R% J6 |$ k/ @5 W
  string attributeValue("");
: U$ t. ~7 g0 {; m  vector<string> stringArray;9 C6 i( ^% h) i- b$ H  \! z( e  H
  stringArray.clear();* h! f% W& R9 A: d0 M3 _1 P
  //get the attribute value
0 ^9 i/ A3 }. I8 ^1 R# Z8 L6 t1 t+ Q  // get the attribute name . B8 h5 b6 A7 O
+ |& R6 e4 }& a0 m* `9 W; A
  attributeName = GetAttributeName_FromType(typeT);! o) \" T5 i' t0 V2 l5 ^/ Y
  if (isStringEmpty(attributeName)); `8 `* N2 N1 Y& ~  ]
  {
7 {5 {3 p+ I' u: q5 n    return getObjects;
; V4 \( k' i/ L2 [3 t# ]2 E  }0 ~; f$ u% W6 n- h7 {
  //get the attribute value % ?5 v! ^5 }% j
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
" o# f4 D8 q* `  R/ Q! o4 o  if (!hasAtt)
/ J, O1 k; D$ ?6 K5 B+ ]% J  {
+ S7 l, H% g0 A' m    return getObjects;
$ F/ D0 r9 |4 r8 A  }$ ]4 ?. v9 `2 `0 f8 f

* b" \9 F3 D1 \( [0 \% h  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
' D2 h5 L* u" U( N3 W0 s  " `2 B/ m2 O6 I6 c' J( _5 B- v5 R" L
  if (isStringEmpty(attributeValue))
; Z  h" v% g' E+ p( Y  {; Q% H& a  y; L) P/ ?7 s% c3 R
    return getObjects;5 s$ Q. k# I+ ~
  }
8 r& A5 M: r& x. A4 A* c, S+ |+ Y" j
9 Q2 Y0 h/ [6 {- l" `) n/ Y, S
  //get the key based on the split value 4 H+ \, i( I3 M
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);: Z: K. h% f& C' o
  for (string item : stringArray)
! u" E6 q' r% I1 q  {" f. ]4 W6 H7 V& A$ w2 x+ X
    //read the string to get the object
2 F) I) Y& E7 R& w1 B6 m5 A     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));* T$ P' X2 {8 s) w) B3 Z; A$ B
     
. Y" J: K4 j- t+ Y' f7 i     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)9 a2 d0 E& m  D3 D/ y. `( |
     {
% B# Z) o/ h. u/ O. d7 z/ B       getObjects.push_back(tempObject);- T& B3 Z" ~, v
     }- o$ J  y: W- x( H5 x
  }5 n, G( B- x+ k) i! R! P" a- e7 G
8 C. n; H& |4 D2 K4 K0 h4 z- c. T& M
  return getObjects;
. K+ \+ x. i% K}[/mw_shl_code]
3 X1 u6 z6 l* c/ i( Z% l- U# I1 ]! {

# d' ]2 S8 z- S# t" e
9 b; @! l7 g2 B) M" h3 T! P
更多实例视频和专辑课程陆续分享!
- P/ q# f0 b% Z* u
2 z  {9 z: }6 A8 u! p. G1 |4 ]1 w
欢迎转载学习!

' T8 G$ R/ M/ y& y
更多精彩内容请关注PLM之家
http://www.plmhome.com
9 _+ U7 r4 G0 M5 S% G/ c

4 Z# ?6 N5 J: T1 @- P% m0 j
1 U2 Y4 K7 ^1 ~, b
+ x. T' g% J: P% R& M. o$ E
END
PLM之家plmhome

* X; j" C% J; N0 {0 q. n4 [' c, b                               
登录/注册后可看大图

7 s/ H( y6 |: v+ z▲长按二维码“识别”关注

8 ^( T& r  ?0 K4 |2 N. H+ v8 w
~~~~往期经典文章链接~~~~
, j5 Y7 W/ T) ~8 E, @+ g6 h
NX表达式视频

5 h5 |1 H9 Q; U% j6 j3 l' l6 B/ Y
PLM之家表达式专题视频-2 创建、编辑表达式8 i2 v  O- J# m! [/ I0 j- ~- `$ e+ y

; X* z8 w/ K2 ?
NX冲压分析可成形一步式视频
! C. e% Z+ p7 _# o! ^

5 `! ~, Z  [9 \$ Y$ Z1 n) v# |7 N
NX产品模板工作室PTS视频
1 产品模版工作室概述
1 n) ]0 J- x! s( w: v5 t
2 产品模版工作室界面% Y0 H$ \) U6 D. L4 {7 I
3 创建一个基本的模版
" x: d1 x+ K# h; a8 p4 G
4 PTS高级模版技巧
) ~5 ^6 T" x& G/ x
5 PTS添加需求HD3D
* E& z: \# a$ ~
6 添加装配模版
! D. @1 U( C  p9 G
NX高精可视化HD3D视频

  q1 d, a3 I( ?! ?4 [7 `5 |
1. PLM之家NX全息3D培训-HD3D概述
( f) j8 w9 _0 M8 o$ x9 [3 s
4. PLM之家NX全息3D培训-创建HD3D
3 r1 _; q& n* G6 b4 W3 i9 E
6 ]" Q0 n2 @; w. K, e% {, s; v# t
NX模型检查一致性check-mate视频

3 S6 s$ z; Y9 t& B0 c5 N7 w8 X% a# \+ I5 c( |
NX入门视频实例教程(8 小时)
1 t4 q1 z- \# T5 e, E1 S
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
$ s8 m( Z7 n* ]" e# I7 n% u
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

' j3 |8 |- X# z* ~: A; I其他重点咨询
1 i7 j1 Y2 j# f" I
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

' V" n7 y6 C2 c
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了