PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

2022-6-1 14:33:25 2819 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]
; E3 A4 s2 m: [; \// tag --> Object
  k. A0 B% o3 S4 H: b//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
- @7 M/ Q5 V" Y3 m/ l0 \TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag)): j4 p# R3 p2 h5 p7 f0 ?8 I
// Object --> Tag  f; R  u8 f1 ^
//直接通过对象的Tag()方法获取3 R' s1 e8 b  ^' b/ H' M
tag_t getObjectTag = getObject ->Tag();
5 o4 ]& y+ [: R0 T- B//tag-->handle
# p$ r% E1 E: B! V# b0 `! Bchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());# x( t3 Y9 @+ k' h1 R5 _
// handle --> tag
  s$ Y9 C1 @# X6 {% P, D// ... 往后看....
' P9 x! X9 |! D1 e  D7 ?& _[/mw_shl_code]( P6 i1 T5 `2 S8 p% H
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

" q4 S/ r& q5 x/ p3 l" N
这个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]
( p! V' Z( p5 T' ]$ V" |! q" h" ~% t: }7 a9 s) w, g7 W
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)  n+ x6 y% V1 T# G
{
! ~* I1 G! n8 M4 h  stringstream ss;: W6 i9 E" f; S2 n5 M2 t# T8 _
  ss.clear();
3 t- O/ G, m( s: D  unsigned int/ B8 Q7 h; I* Q* c
    ID,, E2 [, D0 ~7 q# E& ~
    version;
0 q/ g2 `; E0 Z; g/ l- m  char
( v  u" {' X  Y# p" C! K9 K1 G    * file_data,
" c; D1 t5 E, X8 A  S    * handle,, o/ l/ t9 T+ o" l/ }. Z
    msg[30];/ p, ]( }5 G( }3 G% U
  if (objectTag)
7 T/ F  Y' E( O8 W8 Z" D  {/ y' |1 Q( E: J1 M; S
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
8 i" l7 u0 W: X( S, [8 S: s& D    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
$ A1 `" U( N1 Z7 X0 d    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);7 w, T; U" d7 h/ l  t- f) P. G6 K
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
8 `9 y  P' M' w# y: @, q, s    ss << file_data << "_"<< ID <<"_" << version;6 I! M  s9 v* r: [& v: f2 l
    UF_free(handle);
$ N# R4 }9 U1 G$ B' M    UF_free(file_data);
. {# d& n5 h! B. c6 i# T! u7 \  }
! t1 P5 P1 C1 T- a3 K( U# f
7 l8 U3 z8 u- n5 P9 R3 Z  return ss.str();7 w7 i" [5 T: J3 c4 N4 Z
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
: o" |& |. s3 k% l* P. n( r
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)$ s7 Z! P3 E% b9 w/ B
{
; ]$ b, X( P( ^' B( d% ~  vector<TaggedObject*> getObjects;* i" C$ N" v: U7 U( Q
  getObjects.clear();
6 p! j; D- @* V: E0 ^. c. _9 s: a: G3 |$ n7 {
  string attributeName("");
0 Z2 f: H8 P- |+ q% f5 n  string attributeValue("");4 ~( Q/ Y: s% [5 ]4 d
  vector<string> stringArray;% v- k, A0 x  {# L: [
  stringArray.clear();9 i, a0 Y2 O- u5 G* e1 \- ]- j
  //get the attribute value
3 R$ u6 E, W* |6 e  // get the attribute name   k5 A( Q! ^3 l8 e" ^/ @* ^
' _: m6 |4 L( T
  attributeName = GetAttributeName_FromType(typeT);5 w: M7 h* D: K- Y
  if (isStringEmpty(attributeName)). r3 o. P" g4 Z  ~3 C; R
  {
1 F- j, V) l: W. t0 ^" V6 h    return getObjects;
$ I' c; U) p4 b6 [  }/ b5 f9 c( ?- {5 p8 ~
  //get the attribute value
) s' ~- ?- r, z2 b1 n' d  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
; `: @- a, L' @3 I4 _2 q, P  if (!hasAtt)
* l. I4 S6 L5 ?% C4 y3 J  {4 b6 F( Q; \2 y+ k
    return getObjects;
5 F# v# L8 \( A5 |+ G  }7 G) [& L6 c1 x! K1 ~1 C5 U: V

, z1 {$ H9 e. c1 o) E  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
# x8 D& `/ m0 l2 T* v( {/ p8 }  8 k7 Q0 g, |* ?
  if (isStringEmpty(attributeValue))
# ^2 `) O& }8 J- V- S; A  {
0 j+ e  R$ h! O: M- C. {; R1 G/ X    return getObjects;& V* E9 P4 r* E) f* ]: @# L+ h" p
  }' x2 n+ U1 \+ e  ^1 o$ j) a

9 |! w! d6 W' r
, I# l) I( A9 m+ x2 p& A  //get the key based on the split value ( x- z4 A6 T3 L9 q+ }! f
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
# v: `: C7 m/ E$ C6 O5 |  for (string item : stringArray): x: }5 X8 |9 ^) P
  {) W7 x. Z) w$ G/ A  Z* B* L' }
    //read the string to get the object ! n; ~( o' d- S) G3 O. x0 v
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));9 O6 I% f! F! G
     8 k+ g5 T) ^4 {2 v+ w
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)2 x# V7 V, J/ l7 u
     {  M0 d- d7 z/ V% E7 Q4 k, H+ v
       getObjects.push_back(tempObject);8 }% B6 C* Q# t
     }# N( j2 |, ~* Z( V
  }
% r: H+ d8 f7 O# F2 ]7 Y7 Y9 c2 i" O8 m3 X  j2 |
  return getObjects;
9 ^5 k  L" F: l; J3 w: J4 ?}[/mw_shl_code]
% B! |) L$ j9 i- {, o( c" a/ k0 S0 a: Y. ^" J

3 @8 s$ b3 c) m- K
- Y0 m7 z7 S) B7 C' E& X% \) ?/ u/ s
更多实例视频和专辑课程陆续分享!8 b3 b0 B; t) `6 \2 L
0 Z! E, J  ~2 s% t$ I$ u- m
欢迎转载学习!
8 F, d- v$ I8 I0 H; y# o! F& m5 l
更多精彩内容请关注PLM之家
http://www.plmhome.com
+ T: t  Y- g  `, `# \/ C

  _$ f% i& F8 S* B

  ]& d, j% S5 o( M/ y' P; B# h9 x, D! T; C: K; E
END
PLM之家plmhome

$ X0 L- b3 j; d0 |4 {8 k9 s6 A                               
登录/注册后可看大图
* Q9 D. Q/ S6 k% c5 K" r, S( M
▲长按二维码“识别”关注

! H+ k. N/ t5 }4 N6 v0 B, }: t% J# v+ n4 k2 I
~~~~往期经典文章链接~~~~

4 T, r- v0 ^$ G; C1 W0 F
NX表达式视频

, P6 E( v9 Y$ ~1 c2 s& S
PLM之家表达式专题视频-5 条件表达式( U% p! v& F" k7 X4 m$ G7 M: k2 {
. @  B9 t  ~  _9 f
NX冲压分析可成形一步式视频
% C" f, q* [1 Y' K) N

2 z1 j2 N! q1 U1 X: K* m% U
NX产品模板工作室PTS视频
1 产品模版工作室概述7 j  l, [' @- B. k6 a4 `
2 产品模版工作室界面' o9 l- ^/ n& O/ m7 G6 S0 Y( Z
4 PTS高级模版技巧* t, `4 m9 ?: C: k9 e: d6 t
5 PTS添加需求HD3D
% @$ t3 d" |: S  k4 I
6 添加装配模版
: d& c! _" E6 V  d# d7 P6 h7 M- x
NX高精可视化HD3D视频

- w% Q% K* e7 _7 X3 t1 H
2. PLM之家NX全息3D培训-HD3D基本使用
# y% j  X$ q1 c$ F$ J) a6 |+ \5 ]
& `4 p$ P3 x% f7 `7 r  |& y
NX模型检查一致性check-mate视频
  U: q7 F: x5 ?

' U. J. Y7 A6 X9 r
NX入门视频实例教程(8 小时)

% q- f6 r( a  ]7 K; {+ m  p7 u
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

! N- C5 G$ j+ k2 e/ \
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
+ j# K5 u0 A8 K
其他重点咨询

( O* g9 N& ^' f9 K
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

' d1 H9 a" E( R: 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二次开发专题模块培训报名开始啦

    我知道了