PLM之家PLMHome-国产软件践行者

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

[复制链接]

2022-6-1 14:33:25 2650 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
[mw_shl_code=cpp,true]; i- G9 r7 q+ {" i
// tag --> Object1 N. q! S1 p  Q2 m% `0 {
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
* p. q5 s4 u2 E$ ~( hTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))3 I3 R+ O* ^# f# B' M
// Object --> Tag
+ Y: n5 l+ e% f1 I3 s+ b/ I4 C" L//直接通过对象的Tag()方法获取
4 D' o2 f3 F1 J5 j- g0 htag_t getObjectTag = getObject ->Tag();: A' x7 z9 ?/ q. Q- e2 N8 P: x
//tag-->handle
# o1 Q0 F4 \: _2 bchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());$ E' w* }, ?: I& T7 R& v; }# ?3 J5 _; L
// handle --> tag * f5 ]+ `. j2 ~' a/ j1 A2 b' `
// ... 往后看....
9 v/ C/ H* n- v* i[/mw_shl_code]
% l& T# ]8 T, A" r7 T7 m" o
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
) \. u0 X9 [" Z5 e. P5 L2 y: b
这个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]$ b- [2 `. ~7 j, W5 j3 H0 I

1 s( i& N+ p5 [, wstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
  _7 B! n% I$ B3 a. O' ~: z{
& J5 ^0 x+ Y$ a( V3 i4 l  stringstream ss;
- h) R, ]( y4 p- |  ss.clear();
8 ?; ]: l5 S4 X" ~  unsigned int
: t8 H" ]7 Z) ]1 F$ ]" M; s* N    ID," R4 O6 u, R. k
    version;6 e( n$ n5 m% e" w* V
  char
% g& R3 U- x( C" B    * file_data,0 b6 ~: g2 t& L" Y! h
    * handle,
$ a) G* p$ \- q# n    msg[30];5 D$ a5 |6 y$ n& e+ z
  if (objectTag)
. m8 w5 a8 \- {/ U, F( T. N  {2 W! c- b# B* j
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
7 D: [3 w6 `" O; B- C0 [8 t, V    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
6 P$ U' c9 g) {( R    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);" I) n" |7 q8 C3 ^6 H
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
, Q# L6 \1 N) p8 i0 C) @    ss << file_data << "_"<< ID <<"_" << version;
1 [4 H9 e0 O9 l( y* N7 o    UF_free(handle);& D1 \$ H2 h. w6 \" d0 @
    UF_free(file_data);0 {) S* x" _+ [( @3 A% x
  }
) s3 r* J5 `. L+ E5 j' `* ^* O
, Y# n# y' Z  Y5 ~  D# \: n$ C% }  return ss.str();4 C- p0 c' U( o5 _
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
& u8 O- z, }5 ^& J/ P+ Q
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
8 `+ g) B/ T" [5 I* `" R{
/ c: c: Q, G! p  vector<TaggedObject*> getObjects;
4 L9 l7 S2 A& t2 Z& I0 ?5 ?  getObjects.clear();3 j  \/ z/ w, E4 q) o
5 G% I4 F2 z( t, }" V; }
  string attributeName("");
, M- {; A* C8 `6 t% q0 S  string attributeValue("");7 G$ ~9 a" |" P; ~; ?# y
  vector<string> stringArray;7 e( s8 {, g, ?7 p) C* G! r
  stringArray.clear();% w. U: q" o( L  J0 W7 L
  //get the attribute value
2 A& O8 F: ?9 o4 F. a  // get the attribute name ; a/ E3 e: F' o  e* O

4 I1 f  V4 e- p9 ?  B6 e  attributeName = GetAttributeName_FromType(typeT);
" _6 H2 p; W& x% @  if (isStringEmpty(attributeName))
# o2 S0 \( x. \9 V/ }; m  {
$ f; A" }! s! V( }  Z. J0 S    return getObjects;
9 u0 q( D& d% m$ C8 y  }
  q; A0 J  w% y. e  //get the attribute value
6 M) I, V1 z, j2 i6 q/ W$ `  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);: i0 k- a! W" x2 \, F. |4 s! I0 n4 \
  if (!hasAtt)
- z) m) i0 o/ L  c) ]2 b0 f1 D. J# i  {* a; ^' \; x( W+ X* a5 J" s
    return getObjects;$ z* q! z' [' o/ e/ r  o9 |
  }
7 |$ a' g; m. d, r8 K
: U7 [  t9 C. L1 V; U  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();/ o$ d. m! z; b2 Z% z
  
( O7 F* h4 `5 c! W  ~$ @. i  if (isStringEmpty(attributeValue)): z) y; ~* D1 a
  {
( z2 J5 b' w6 [! U+ \    return getObjects;2 A! \& R( G2 D3 a$ P4 O; d, R
  }
7 I+ e) J  C5 i6 Q1 @/ N0 w/ L* r
" M* e* j1 c5 |6 ]9 C' r1 B5 e4 t; e  _0 W( P7 O& V& N7 h
  //get the key based on the split value
, k" p8 w4 b) O6 `. u7 s2 s  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);( j+ P6 T. O2 D8 K
  for (string item : stringArray)1 K  \# c3 z4 c& y- S) q3 f; r
  {
  f( I) q9 R9 i' U7 v    //read the string to get the object . x) Y. x8 k1 w+ }9 c
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));+ C% T7 ^: r$ t4 e; i
     
5 O0 ^0 Y& c+ y% g     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)! E" N& Q: J+ F* u
     {
$ \8 O' W/ {5 ^       getObjects.push_back(tempObject);7 ?3 |# T% `: w2 F/ y9 u' v/ s0 G
     }
2 r8 P8 ]5 U" }  M, M! ]  }
2 h0 C1 Z4 a/ I) X3 m+ H5 H+ V) _7 p3 r; L& B
  return getObjects;4 _7 q, j- ?6 z/ O0 M/ P! r
}[/mw_shl_code]
9 z4 U+ B* G3 J+ H# s2 e: ~. R5 @4 y  L5 r

- \6 j" c) p2 z0 G* O0 U! @" f. t. I
更多实例视频和专辑课程陆续分享!8 C+ h5 E3 T4 K2 \: a1 b
  g# P1 e# v' y8 Q% W8 C- l( K/ q
欢迎转载学习!
6 c! _7 F. p; m1 j- X. N
更多精彩内容请关注PLM之家
http://www.plmhome.com
7 z; Z' D- u  `5 I: f& Y" j( b, ?


/ P' g: ~  |' p" K6 t1 ~; w1 @1 R2 a' f
- q4 s) f% k# D& O$ b3 ~
END
PLM之家plmhome

# K# \3 |% f, _# ~( E! C# C                               
登录/注册后可看大图
! C9 X3 M- Z$ t& J
▲长按二维码“识别”关注
4 R; a: h' K& ?- ^3 E. _. i! B% \7 x

$ {9 f0 _( m! q0 y6 N
~~~~往期经典文章链接~~~~
+ |  n  T9 ^5 k8 x" ?
NX表达式视频
5 p) I/ G+ L! k4 \7 K' p$ `/ j
- X1 h3 ^" b' w0 k4 W* E; }- I' f
NX冲压分析可成形一步式视频

$ s2 O) v$ H# E& |- ?3 Y7 S
冲压模具分析工具 4 中间展开实例)
5 M: c) v$ v7 [  S0 W0 [, c2 ^
8 d* ]; ^( z" J: [- T
NX产品模板工作室PTS视频
1 产品模版工作室概述! N3 t+ Y" \; n& w) D, b4 b3 e
3 创建一个基本的模版
% e* e  ^0 ^5 k" ?3 c
4 PTS高级模版技巧2 d; w* S+ S* l9 W
5 PTS添加需求HD3D
  D7 N. K+ {( J4 T$ g  I0 A
6 添加装配模版2 c: u3 [  H. S8 s  H
NX高精可视化HD3D视频
$ s/ u# P9 W3 m  U  `( u
3 H) N' P8 {* V" z
NX模型检查一致性check-mate视频
+ Q3 b. B. d9 a/ }- e6 N) }
& L# w$ Q' j9 b$ d( p, @
NX入门视频实例教程(8 小时)
0 ?7 C2 E3 T9 T  E3 ^& M4 k: Z9 N
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
3 M# o3 x8 I: h  I& [
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
$ i  |5 @. I) V
其他重点咨询
& k; X- `# t6 z8 d' V9 I2 p
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
( [1 @) h: f0 b
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了