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

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

[复制链接]

2022-6-1 14:33:25 2820 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]' F2 }4 B( s9 o) {6 z7 a
// tag --> Object
" w. N% ~& L7 y//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
$ v# O# b" T2 z' xTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
9 K- L3 H) R; x$ S// Object --> Tag9 H$ f& f  q# W* m- J$ w& o' a
//直接通过对象的Tag()方法获取
* j8 K- |4 o: }. R) p6 v' btag_t getObjectTag = getObject ->Tag();+ h; R. Z' l8 {8 W, q: r
//tag-->handle8 ~2 m' }  j) G1 [/ k. a1 H) }
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());1 N7 N. K7 C- N3 ~2 [. D/ _
// handle --> tag - p. Y+ T, q7 ]8 ?/ E" d
// ... 往后看....% _+ V* s+ y6 j. j
[/mw_shl_code]
; ~/ Z6 n7 D6 v; K3 G% z% R
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

2 M. r5 K/ |  }) N- q; P7 D
这个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]
3 M! m, @6 h" L& M* K& b2 k) b5 x) j" e
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
  F! r0 v4 u, n$ e2 W, ^{
0 Y. ?9 i, O8 o* P  stringstream ss;" @7 r( J2 Y" ~" t9 j
  ss.clear();4 V" X" a+ M! \$ s
  unsigned int. Q0 T3 U3 C; G# Z: I2 M
    ID,. j# ~0 F  ?5 k% I  X5 {
    version;
" }' W9 ^! Q, f  char
) y% v6 N% X3 i0 E7 g( C    * file_data,/ H- v6 f% `8 f+ D
    * handle,; \; `; e) K" r3 n- k
    msg[30];: e, a8 w5 q4 o! P/ @
  if (objectTag)
# K& h  Z* Q5 E# q. D  {& Q/ C6 k7 y+ h1 X
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
5 ^3 P  p, N6 g6 u( l, w& ?, \& Q1 P    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
2 P% l) w. i! {4 z- q% A- V    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);' C3 n: L9 }1 z5 O  O
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
: d( b& y2 }" s* ]. G( p    ss << file_data << "_"<< ID <<"_" << version;
8 [+ ^1 ^) C' b+ I5 G4 o- l    UF_free(handle);* v- t- \  u9 f- j  ^$ _( y1 R' ?
    UF_free(file_data);
' F$ T) Z  O$ Z1 d6 F  }+ Z9 X& Z8 u; h+ |, X# S; S5 l& J
( `5 H( k! D6 r( P: F( n
  return ss.str();' @; S% j& P7 u" w
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

+ `( ]6 P  b2 k  ~
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
' K1 M% z* d9 c% {' z{
8 i8 O8 s0 @0 m$ b; g& @  vector<TaggedObject*> getObjects;$ F+ n4 L6 M4 e) f
  getObjects.clear();' T9 E# T; g, b1 U8 T

" y* o1 e$ r7 D  X0 d. u9 [1 N9 S) i  string attributeName("");5 S$ a" \- F5 e6 X
  string attributeValue("");
( t& C9 P& ^: s% n8 J1 G  vector<string> stringArray;# R1 W( M' K" N$ o  ]5 A# S
  stringArray.clear();
0 I- Q# x1 j4 d, O7 b' H  //get the attribute value - ]" U  k- a: V& J% h/ S/ d
  // get the attribute name
4 h9 C; P3 d7 i$ t# |% e
! X, ^" `3 o& z% N, w. F  C2 ]  attributeName = GetAttributeName_FromType(typeT);0 ^; r2 {: G: P6 J
  if (isStringEmpty(attributeName))* C7 [5 `+ j2 _# X6 B4 f4 [: o2 D
  {& c1 w( L8 s6 M8 I
    return getObjects;( x! X) C; I2 }$ z6 z* t
  }( z) P; U5 r2 [( |, T
  //get the attribute value & z3 _1 v* K6 g7 t
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);4 n* p5 U; x( I' _, N1 L
  if (!hasAtt)% Y6 y! H7 M! f7 l2 E8 J& }1 K
  {8 U/ ?) c: ~2 v  [$ P
    return getObjects;* {' K; K0 E0 K" |5 {  u: K
  }
, V; r3 q2 u  M: ]: Y, v$ N
  N+ p4 B* j$ F; r! b7 Y  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
3 I; Z+ M0 s* w; `  9 e/ A: U7 q: \2 o+ O3 f4 ?
  if (isStringEmpty(attributeValue)): K$ x7 n( s, H; E+ g8 C( O
  {
: t9 h5 X, a$ a& r* D- s    return getObjects;/ r( c1 X$ |8 z( G! Y0 R
  }
) |6 Q* A9 @# \8 y& ^% e, a6 @$ c5 _! F& K
, J/ H2 T5 x# u- Y, @. v0 h+ @$ u
  //get the key based on the split value + Y- x8 H7 z3 E; n
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);2 g. R& I6 \, b6 i
  for (string item : stringArray)
* k( I5 B; a0 G4 T0 L/ U* L  {! ]- V% ]9 Z& e" J* l0 H; Q0 t
    //read the string to get the object
( B+ h1 g7 Z7 }+ t* U& K     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));! p4 H4 v) L: {: M/ p6 ?' F- |
     
- G8 O9 `8 Z! L% Q8 ~6 {     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
! ]5 x' i7 D: L8 U( B$ @0 ?     {
$ P3 R* B% j8 t5 I, T       getObjects.push_back(tempObject);" X# ]/ N% S, j! e9 M4 t
     }
9 g" x  x. T  Q" o7 L. b: R- [  }. a% R  x0 e% Y( H8 @7 ^' Z! J9 w

% ^- M9 H2 {% ]/ u( v  return getObjects;
/ I0 @+ m" R& T  {}[/mw_shl_code]
3 q+ I7 x* R4 ^2 Q4 W' o8 B6 G" R' ], _  B9 N
0 K9 f3 [% z" ?9 L8 I

/ }9 d) h! _9 b+ d! O2 c6 \
更多实例视频和专辑课程陆续分享!+ b- x$ U: c9 N, m9 ]4 R' u

4 W8 t. R' i& c% K
欢迎转载学习!
0 ]+ w; I: m/ X7 N* Z1 A
更多精彩内容请关注PLM之家
http://www.plmhome.com

; L2 [8 M; M6 C; l# T

1 g3 a. O# ?# K, J& l# p0 x! B
# z" i2 }; S) P: I* }+ ~* p  j: q- l8 J, Y7 w
END
PLM之家plmhome
# |9 J  i$ m9 ?5 |3 `
                               
登录/注册后可看大图
2 t2 L" b$ a) _
▲长按二维码“识别”关注

4 o& [2 G3 E, }  B& A$ P! \- o- k3 O0 Y. M  ?% v9 q
~~~~往期经典文章链接~~~~
! p4 K8 R- T: H" R: p! b9 `9 U
NX表达式视频
/ G9 ~5 A( s6 A; _, p
$ ^3 p- Y8 p0 f
NX冲压分析可成形一步式视频

( `2 {, e9 b6 n$ K3 T, u
冲压模具分析工具 3 全部展开实例1 l4 l; S, F$ V7 k; A( a, A! H0 K
7 O$ v- U) k2 O+ Z. D% Y6 _# C* q
NX产品模板工作室PTS视频
2 产品模版工作室界面
" r' U; q$ j) @4 ^, o( D3 m1 u: e
3 创建一个基本的模版$ w, B3 m) B: p/ o8 s6 l; K$ Y+ y, l
4 PTS高级模版技巧
4 U  Y- q! U) j3 M2 u2 x
5 PTS添加需求HD3D
* m( p" n3 ]- g
6 添加装配模版3 x) ~; }( ~7 W- k
NX高精可视化HD3D视频
/ {0 e, u- l+ L& P9 N% l& X
1. PLM之家NX全息3D培训-HD3D概述
' [$ ]/ x2 h) m, a" u" @) d
+ N: _; r3 h, \0 e1 ~
NX模型检查一致性check-mate视频
( {. B8 @5 r, R: q

8 v) f$ _% @9 c7 g/ G# H1 h3 t  O
NX入门视频实例教程(8 小时)

, |$ q" [9 S  e; {2 C4 K% ]
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

# K1 U9 Q% Z* y5 C, k% X# y
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
0 S/ }+ L4 m! ^/ s9 p7 {" n
其他重点咨询
7 ?$ W3 D. Y7 A+ U9 y. M
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
, R2 ^6 k+ ]' L5 \( L
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了