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

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

[复制链接]

2022-6-1 14:33:25 2695 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]+ W) z' s8 w0 C2 ^
// tag --> Object( C' K8 I7 h$ `0 g( L) _. j
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
! V5 [" Q4 l( ^4 H  W7 |4 KTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))7 i0 `9 r* k) W: T, {
// Object --> Tag" H" U* a$ _6 a+ B* A  l
//直接通过对象的Tag()方法获取
" ^2 ~% W& d' c( Itag_t getObjectTag = getObject ->Tag();) Q  m3 O: m% f" w$ @9 g
//tag-->handle
7 m* z# T( L6 j0 h6 n$ s& ~; @char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
- z8 B4 q9 r! G" I// handle --> tag
+ o- J0 W! \) [7 r5 m// ... 往后看....2 O% q4 A) h- m# k- J, P2 M
[/mw_shl_code]
2 l- h9 U  o5 F6 Z
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
) e) [& V7 \' }
这个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]/ R* n$ Y5 J0 S% E: e/ ?3 f: a

2 J& d8 G8 Q) J0 x% q* M" E8 k1 hstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
- c6 L- @* o0 r$ e4 a{
* z; n: |* `$ f/ B  stringstream ss;# t" L4 r; ^# K3 B; g* P
  ss.clear();: q  s& [$ k) K% k
  unsigned int" ^9 n& {$ T, S5 r
    ID,4 c% K: n. ?! h' p
    version;
* y1 ~6 ~& ^% n/ P2 R  char2 n  l- ?, r2 j9 n% u
    * file_data,
: S8 u1 w8 q" _    * handle,
$ [# t# u- [  q+ \: V( o' W    msg[30];. l/ E* ?6 U- j+ O/ F" _
  if (objectTag)6 k3 K+ l8 u- v$ C
  {( q7 \& ]( w+ `+ E, s, }; u
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
- G* d0 C  t2 F% O    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
3 Q" S" \  E0 w6 F8 t4 b    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
/ f1 O" K( ?5 K' [6 s& F' d. {; r' T    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);' G( K+ M( j" u& k5 ~
    ss << file_data << "_"<< ID <<"_" << version;1 |* D; X- ~7 i9 [0 r- j/ d8 ~
    UF_free(handle);
3 Y' m# ~" p& p% N9 p9 `3 t4 @! \. i    UF_free(file_data);
- S7 ]8 m4 S+ h; F  }
2 h) I5 Z8 C. p% y  T
7 h0 Z4 Z; q9 u4 f5 B! O  return ss.str();  O$ w/ X) k2 C) R! p
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
9 }9 d/ D4 U) c" _" `7 i
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
: n  |6 h+ {* t- _{
8 m. A4 F6 B$ \5 S' g' I  vector<TaggedObject*> getObjects;
0 Y& a! P& f1 e/ D5 {- o  getObjects.clear();/ u! l: E' w$ Y2 k

* u# v. ~3 Y2 j$ t5 h5 @  string attributeName("");
: p2 Z9 H' Z) X  string attributeValue("");
, I' }0 h2 G/ z1 f! g: o  vector<string> stringArray;7 T. w3 A- q0 |8 r9 g2 ^8 K2 X
  stringArray.clear();( w4 h3 T; n0 r6 A, M9 B) g( g
  //get the attribute value
. y1 E! f: i* t9 }% p1 L3 {4 d: c  // get the attribute name ( K9 [* E' @2 R! P9 q! w2 n

! x+ r3 j; V$ |& s2 R  U& j4 Q! X  attributeName = GetAttributeName_FromType(typeT);4 }! o" P  S+ S7 T8 U& G
  if (isStringEmpty(attributeName)); y7 ~1 |6 Z/ T2 j/ n1 u5 r
  {
2 N; P+ }1 W$ @: V  t; i    return getObjects;
4 V6 [9 _! @8 z8 F* }9 z! G  }$ J9 ]4 S; F& |7 u/ T# D& N
  //get the attribute value
5 m3 T$ O7 w1 j1 Y  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
, a: l, s5 l! g  if (!hasAtt)
- \2 j  t' i' b8 c* k- ]. F  {
& v" o& K2 h$ z" D    return getObjects;
% g: Z% R+ w' |8 x; F$ b% W  }1 g- t6 C0 K) V# ?) s* s

7 w! M4 `, f" w) q  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();' M5 ?: Y. E. ?' l8 ^" Y4 H
  ; Y: D. @7 L/ @, r! `! H0 g
  if (isStringEmpty(attributeValue))
  v9 O( \3 z( N6 C0 V  {
' x4 [, o: M. f9 Q0 u$ A$ O8 B    return getObjects;
" A. F2 m5 G+ v8 K( T7 G' O+ t; c  }
) U0 m; p$ G$ E. v* w0 E. Y$ x9 ^5 W- A" q5 c' O

/ e; P) z" [. ]5 i$ h4 G$ r+ }  //get the key based on the split value
- D- O# n9 r8 U: ?" k9 g  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);0 h0 ]* J9 b$ Y5 \3 ]. X- t3 b2 Z
  for (string item : stringArray)$ W/ j! p7 v" U" I! M
  {% q5 H  O! a6 X& q2 i
    //read the string to get the object
2 Y% b; Z! d4 W* s     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));5 v: {9 l2 d, v
     ( J- K1 N: N! b( l
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
: w$ l* i3 j9 y     {
. f& S6 h) x  g; C1 w* s3 Z+ f3 X       getObjects.push_back(tempObject);. j; p+ W6 Q% \/ x; e6 b
     }
3 K! e# q1 F" r1 d7 [2 r- @7 c! J! G  }0 x- I" Q2 `5 Y; C
+ ~8 P- p1 y4 E% }# N) }
  return getObjects;
3 K- E+ q9 \3 j' @. ~}[/mw_shl_code]
( ^( @& K% K8 b% y
, w, Q% ^9 G1 L  L' W
+ \8 U  t3 J; l& r, F( Y" i
& X/ E5 K& n: y) S$ X
更多实例视频和专辑课程陆续分享!
. L- F" q9 d, l6 D/ N! t7 N/ F1 w7 T4 i. L" |4 ?
欢迎转载学习!
; {) ]! ~8 W$ V' w5 w
更多精彩内容请关注PLM之家
http://www.plmhome.com

. w3 s! @3 Q1 w; g- S5 S6 ^  E

' l- F" I  z9 D6 p3 `& i8 ]  W9 G  O# Z: c5 }1 ~6 E! h6 u6 c2 D$ V6 o: p. B
9 t% g2 u7 V& L  p& R! i/ I
END
PLM之家plmhome

5 s% g8 z2 k8 ?" U+ r9 S                               
登录/注册后可看大图

, i5 @  |& ^2 D  ~/ R9 y▲长按二维码“识别”关注

# i' r  ]6 Y7 W+ G# l2 ~
3 G# F# U" T( G% O( e" N$ K/ `
~~~~往期经典文章链接~~~~
$ {8 Y* Q8 V  E, i
NX表达式视频

$ J6 ~. K1 v- c. S$ v7 x, j( F1 ]! f' D% J5 ~) P8 Q' w, ?% @( |/ {
NX冲压分析可成形一步式视频
1 A) E+ F* B$ s) a- ^; e! @
冲压模具分析工具 3 全部展开实例8 X" R! x! {$ I& X% ^+ d( A: W% c/ R
冲压模具分析工具 4 中间展开实例)  Z: S, N6 I" e( Y  ^$ Z) ?& S! J
( @0 B+ p* J% j  b
NX产品模板工作室PTS视频
2 产品模版工作室界面/ b" a& b: K% P! V& W5 a" A/ E
3 创建一个基本的模版
9 ^7 o: B: V4 {8 i# Z$ G. S4 X5 G
4 PTS高级模版技巧' f2 J6 r6 F% y
5 PTS添加需求HD3D. C: @9 g: E: O
6 添加装配模版
4 C3 N$ b  Q+ a, s
NX高精可视化HD3D视频

9 [- D3 \, g* C7 \/ @& K! O8 S0 Z% _9 ~' @
NX模型检查一致性check-mate视频

' m( ^! U$ q: z+ `5 h
4 i: g8 d" p8 u& H
NX入门视频实例教程(8 小时)

  W# ^' f- T% f( }
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

. L2 D) q  D# N5 _4 R/ i
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

% Q5 f+ K( p$ @1 z' u4 I3 v8 U其他重点咨询

/ e3 s; c9 r4 A; ^% j- ~
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

( O# |& f, l% x, ?
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了