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

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

[复制链接]

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

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

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

x
Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:
这里假定变量:
TaggedObject * getObject 为 对象指针;
getObjectTag为Tag类型,
handle为handle类型,
直接通过代码看:这里选择了一个体,打印下结果如下:
640.png
[mw_shl_code=cpp,true]
3 k% i5 n- \8 N# h  _// tag --> Object
; V) |" U4 P# c( B+ _1 o9 l+ C6 U//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法5 u" h/ B0 X/ r. x3 a  J
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))* S* _6 l' A9 r# E- J
// Object --> Tag
3 B  ^9 q. z6 ~, U5 L3 a( R//直接通过对象的Tag()方法获取8 O. Y6 M$ {2 j( e  \9 D
tag_t getObjectTag = getObject ->Tag();
7 A. z/ V& U9 x! F//tag-->handle
4 E# n' f: \8 }: Achar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());! c" B% ?2 [% e- G; ~
// handle --> tag 1 N! v+ s. k. R7 }) K
// ... 往后看....
* k) Y9 J! o! l. P8 v( C5 t3 F[/mw_shl_code]
) ]3 ?# }* u% Z4 V! v! X- ?( \
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
& _9 ^: Z5 |* ?
这个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]) K& H! L- L5 }

: t% t) G  d. N  Q; M! `- V, y$ o, Jstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
" X# b8 j8 ~- l0 ]* A9 `5 \{0 [- s& F( U  q% t% k
  stringstream ss;6 I" F% T3 }1 |4 n
  ss.clear();$ G3 j* I& m# }. B2 |7 e
  unsigned int6 z, X, ^% C* ?: \  B/ H2 e0 S
    ID,
* m7 F' x0 g! V! k2 p) Y4 r4 l    version;
) A# y, e) \% J. d, A# |% B+ [& A  char7 e/ j6 A1 W3 P9 R& |
    * file_data,/ n" B) b* Y1 |6 f' U
    * handle,
: {* m/ e( @' s0 K    msg[30];
; {" b7 `( |+ X  if (objectTag)5 S( a  u1 u4 x7 Z# G* V- Z5 k
  {$ z, d4 r" b+ X9 \: k3 r
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
* ?. H7 ~: ]2 T4 s0 m    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());2 y% A& o! M3 f0 {- [! K# d
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);1 `/ O" H) b& B8 ]# K9 f9 g' U
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
3 P% c* _/ u4 \# L- ~/ h    ss << file_data << "_"<< ID <<"_" << version;" K1 j) a6 w6 `2 Q7 v
    UF_free(handle);9 m9 E) r7 y/ P0 J; ~
    UF_free(file_data);: p0 t9 s9 b" S
  }  X( s5 w5 |5 o3 j9 y8 {0 A

' G  a( u: E% Y2 |% }  return ss.str();" V, v. M# {) |" F6 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

1 v6 i( h5 I+ I1 }" \  L4 a) y$ Z
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
1 a. B+ u6 U7 r( j{
  e8 K, [: [: A! t  vector<TaggedObject*> getObjects;) m$ a; o5 ^% I+ L
  getObjects.clear();% y. q8 p1 k! q& }3 W! P& t" c

5 q3 e6 u: f! U  string attributeName("");
. w" J$ Y) w/ U: o% e  P9 I  string attributeValue("");
4 {4 v7 o" A" h  vector<string> stringArray;* m- O1 j0 a7 S4 A
  stringArray.clear();3 k; W4 _' k3 }  O
  //get the attribute value 1 P  L  v; D% w' c( k3 ^; K3 `' O
  // get the attribute name
, v# S+ }) b) S7 a! q) T4 ~) o+ f- i; E1 r' d+ a3 O8 c
  attributeName = GetAttributeName_FromType(typeT);
% r, Z: W6 y. ]  if (isStringEmpty(attributeName))
1 A: L1 w2 j* k$ F" A' I; ^7 {  {
/ a) @6 w6 z4 `" w' F& f4 {. o, j8 K    return getObjects;
& L6 o& O' a! L3 i) R9 H  }& U& s  J" t" V8 t, l
  //get the attribute value - ], N2 i* h3 ]# _# j
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
, V; Z4 I3 l9 {. O3 ^  if (!hasAtt)
$ a3 w1 g6 W0 l* v% `2 L$ L' L  {6 s( Y* ^8 w3 t1 ]
    return getObjects;1 p; u, V) S* D
  }
: y! Q, F# `# K5 Z( h* `) E. z) E% ?' D
2 {" C% d% h- R  c  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
8 H( O& r9 x4 V6 `/ G; s5 F1 I  
( k% S* l# o' z$ _+ f; h  if (isStringEmpty(attributeValue))/ J) v0 b: n2 q* N. r- J
  {
4 J# B- [. }9 k2 J1 t! [    return getObjects;. v. j( x5 p# B! P7 {
  }
* N" W+ F6 V$ p5 a0 y. ~* f
) p; n, w5 Q* D* C6 A9 T' C. V1 F$ w/ J& x
  //get the key based on the split value
' h# h/ f2 P* O# q5 W/ X( C  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);$ C) s, Y* v. F
  for (string item : stringArray)5 d7 A: D% M* V# j! a: r( c4 A0 z
  {
8 a, ?1 ~3 _8 w, j& P9 k" z    //read the string to get the object , ^0 I. b$ a) V7 i2 P( i
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));. J- h- O9 B( ~7 P. x
     
6 e0 V* ~( T2 J& v# P     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
1 d7 @, Z$ t6 I$ R) r     {
& L4 Y5 w8 o; ~- N$ |. R7 f9 d       getObjects.push_back(tempObject);
  Q# Y4 R& u2 I     }/ o: b% v: U) p+ c- h) C- \5 q4 K
  }
. g: s1 |! |$ x! \% y
1 ~; q( h! R/ G7 Z  x$ i! J  return getObjects;
: h9 k' @5 I. `# G}[/mw_shl_code]
: z" t- q; C3 z5 S2 h, i
7 [$ B. ?6 ^3 [$ |
1 Y6 t' h$ g: a: q# H7 y: X$ r5 \2 X. K6 f+ p5 w  }+ m0 y
更多实例视频和专辑课程陆续分享!( b6 l6 M1 M4 t/ H6 r6 p
4 j  V- e3 ^3 W8 a
欢迎转载学习!

) d$ E# N  e* a% n) v8 R. X! Y' m
更多精彩内容请关注PLM之家
http://www.plmhome.com
1 X% K: q+ T1 D2 w; B

& F% w6 D. g0 k- L" r, U- `
  s9 m4 n$ {1 ?. F6 U( e

: y$ x, l) L7 f9 Q! N: E
END
PLM之家plmhome

/ W0 P6 i7 c2 }1 i/ e: b                               
登录/注册后可看大图

& Z0 p. g: u4 T/ j' e2 {1 l8 y▲长按二维码“识别”关注
6 {: t9 S1 w1 ~* `

+ `0 V  T+ i2 a1 B, H2 X7 D
~~~~往期经典文章链接~~~~

3 V. E# v# G% ~# T  G/ l/ d0 p
NX表达式视频

* H6 N; [! E/ t+ M3 U! Y; n
; j7 r/ S3 a' Y% |, a" O
NX冲压分析可成形一步式视频

/ R) \4 k+ ?. t0 [: k* f9 V- d' f9 b
冲压模具分析工具 3 全部展开实例" q& C. G) ~9 ?8 K* w6 W9 u1 W
9 {4 B- p* k; Q. I, N& W
NX产品模板工作室PTS视频
2 产品模版工作室界面
' [) A4 ^! O5 Y: y; _% i
4 PTS高级模版技巧' E$ D& J0 C. M' H- S5 I. z
5 PTS添加需求HD3D
% q5 \% T, O: s: v& m
6 添加装配模版. h- v( \* `3 v3 y0 W0 U) v; f
NX高精可视化HD3D视频
: J3 |3 j$ _+ T% n3 {6 o% u$ N* v& A
4. PLM之家NX全息3D培训-创建HD3D
* x/ n$ ?1 ~4 h$ k/ u2 X7 I: m8 O

( d& \/ _# ^7 H
NX模型检查一致性check-mate视频

* c: X; \0 |# k; C! t% ?
- C0 D# l- V& @9 }/ U+ I6 F" z
NX入门视频实例教程(8 小时)

; G4 G- K, L+ V# \
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
) W! g6 \: q5 h5 M
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
# J9 F+ y% T+ @4 }/ s
其他重点咨询

- D/ S6 S3 k6 H; L& v" u
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

) |/ i+ c6 G$ x+ L/ x7 o
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了