查看: 3130|回复: 0

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

积分
60
发表于 2022-6-1 14:33:25 | 显示全部楼层 |阅读模式

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

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

×
Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:
这里假定变量:
TaggedObject * getObject 为 对象指针;
getObjectTag为Tag类型,
handle为handle类型,
直接通过代码看:这里选择了一个体,打印下结果如下:
640.png
[mw_shl_code=cpp,true]
6 D) S% k' x- t2 ^% a// tag --> Object, V9 U7 ]9 F/ G/ V5 a) K3 _
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
/ @# Y( r7 Z% d9 CTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))& K  B6 C% B( d4 R* f- A
// Object --> Tag6 R; S1 m+ X4 f& L2 \- n
//直接通过对象的Tag()方法获取
. I/ Q6 S8 Y% v! F# Ztag_t getObjectTag = getObject ->Tag();  _/ i, y4 v% {5 q# U
//tag-->handle
" ~4 \* F. J" G) k3 kchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());# E1 e$ K/ U0 k% T
// handle --> tag
$ E' v2 b; }5 w) ?1 W// ... 往后看....
! @! i+ R) r& D[/mw_shl_code]
3 h  W2 M! {2 L, a2 _5 h
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
9 I. f7 m- C8 ~8 F% i1 V% E/ C. _" r6 I7 |
这个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]
6 ?& @: v  S% _" }; S/ T& w( r) A/ o# ?. g  Q! B* T, Y
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)7 R3 f" c$ s- m$ o( l  V
{4 B1 R0 j% G/ g8 N
  stringstream ss;
/ `: ^% }8 \8 C  ss.clear();+ z% _$ _+ F4 M" C: W/ x
  unsigned int
) P0 B1 {. }. g7 I" t: m    ID,
, z4 r5 G5 C  E  z6 T8 U    version;
9 N0 h& L8 ?" D3 G  char
3 O4 h' w+ W% C, }1 w3 y1 o" T    * file_data,+ S( d1 a1 _: S* J- b( w9 ]. d; l
    * handle,$ e2 y  o( a0 b7 |: R
    msg[30];4 ~& D2 c9 t9 M; I  ~
  if (objectTag)4 w( v2 p, G- v: E/ z
  {- _# T2 x$ a% t$ _0 g: \, O; [# t
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());; X2 d. J/ q! y0 D
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());/ e/ U9 c* p/ K
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
5 Z* I# Z3 s0 u- _    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);1 i$ |7 E/ q1 i, z3 ?7 K4 G4 B
    ss << file_data << "_"<< ID <<"_" << version;
7 a/ q4 B# [" g2 E% J, _    UF_free(handle);' t1 G- z) k1 q1 [$ m
    UF_free(file_data);
5 d3 H6 s+ N. T# M  }
" L8 l; A; }5 h  ?  v# U& g0 c) v9 Y- L& [9 ^; L' s
  return ss.str();
, K7 Z, m% I) s$ |" _% X: g/ A. }}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
7 p8 W, n4 }- w' `" }
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
% j2 y- t( X% D: M' Q- U3 v{
# o: S/ l. r8 t9 Y$ k  vector<TaggedObject*> getObjects;
+ R4 N* w$ A% b  f! g4 [8 A% c( e  getObjects.clear();) W# g' G% j; }( F

% W, l8 }; w4 j; g  string attributeName("");
# E) I- f8 q% y  string attributeValue("");; M8 ?2 ?4 v% o
  vector<string> stringArray;
& Q: `6 O* U, _/ M2 L, P0 a  stringArray.clear();
: n" V7 D, \0 r9 K8 X$ O8 J; f  //get the attribute value
8 E) u$ V: y# c' }  // get the attribute name
" u) |" T" I: n0 I( ~' u3 \$ {4 K1 Q
  attributeName = GetAttributeName_FromType(typeT);
2 E" I) ], k6 a  q! O: c/ `  if (isStringEmpty(attributeName))
( }+ t! Z4 M4 `  S; i8 B. D  {* ~; G/ F2 z# \8 Y! F
    return getObjects;
1 R% @: D6 b' H  }
% Y/ \% M9 p: I+ h( Y; W0 O$ p  //get the attribute value ; p  k8 z) p( H7 ]3 r; B
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);2 W8 A1 E; G; p8 F' R5 `
  if (!hasAtt)7 J9 n, u, Y) ~. p: }6 b
  {; V# t/ R& v+ f5 @
    return getObjects;* t: D7 y, Z7 c# X
  }
0 ^7 g3 |) \3 g/ b# b4 X: A
2 \: G3 R. j$ O' c" T  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();4 U3 W4 D# R6 ~2 i0 E9 ]) J+ d; q- J  A
  0 G( q  `; R# h$ M4 K6 P
  if (isStringEmpty(attributeValue))
8 C* F+ ~8 \7 J  ]  {. A8 W$ @0 l3 o* z7 L
    return getObjects;
# E+ b: @. J* {  }
2 v0 u$ \* K- W4 F
! K# ?* ]8 ]7 k! a. j
& o; A5 V9 d3 U8 s% \; ^- d! F8 j  //get the key based on the split value
- I& r/ x) D6 G  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);5 ~$ P$ [" q* u4 y/ r
  for (string item : stringArray)
* u, H' m  F, l. I& e- [  {( V, K$ @9 k0 x
    //read the string to get the object 9 b  Z) d# b  N" l5 X; Q  {
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));- _( L* |: p1 C" J" O! J' m* u
     
' |: ~0 m. J+ l. ]. K" M     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)- p8 y$ V/ b) Y3 E' `: M
     {
- L: B5 K6 D# X% _  p9 l3 _  u5 r       getObjects.push_back(tempObject);+ Z3 j/ V8 r3 r9 F* R( E* E
     }
# K# _1 ^% F; r0 w4 z: R- ?  }) o8 Z3 Q7 \# w& x" f; O2 @# f7 y$ N" M
4 w0 g3 I& T- M5 g' o
  return getObjects;( {1 y2 q  S/ r
}[/mw_shl_code]  O) U+ u. b0 m: A# F) M
2 N' j9 E, b$ t* j9 F( a

% \9 J4 l+ |/ `( C$ a6 g6 ~7 k% P; x! X& ]
更多实例视频和专辑课程陆续分享!
+ U0 s% ~/ }& F$ ^: K4 W" E+ n) I6 }
欢迎转载学习!

/ t; w1 T8 i' B" v. u1 e6 j
更多精彩内容请关注PLM之家
http://www.plmhome.com

$ ~& p; h3 Z0 ]! P  W' ?3 w; ?: r

( W, V4 _9 ~: @
+ u! k2 \! n1 x' n( I" @- S, b( d) B5 a* B; G& P9 l! L
END
PLM之家plmhome
) j8 x' z; B8 _0 V( q* ~
                               
登录/注册后可看大图
4 B4 t1 c) q3 p) a" l
▲长按二维码“识别”关注

  l, j! j" o. d% F( y+ J$ y: K/ ]! ?. D
~~~~往期经典文章链接~~~~

/ H) h9 ~  k4 `, s( z) b, ?
NX表达式视频

/ x% h2 L/ S7 A
PLM之家表达式专题视频-6 部件间表达式0 H0 `' K# S: \5 L( n4 z/ }$ \3 R1 Q. C

5 t) J6 u' A5 V/ K8 W
NX冲压分析可成形一步式视频

" ]: j; ]; Z$ R: V- U' l( [  j* r
冲压模具分析工具 3 全部展开实例, o6 D$ x  P" }" c8 [  |3 b
# W+ i6 x( J! G) H4 u# z
NX产品模板工作室PTS视频
1 产品模版工作室概述, P, M2 d" t( c$ z  o3 z/ V5 h# M0 y
2 产品模版工作室界面
2 R2 W/ i# ]4 x. O7 e
4 PTS高级模版技巧5 W7 x7 U' Q; [5 b, Z
5 PTS添加需求HD3D! K* Y. H" k9 a
6 添加装配模版9 T* E3 Y# p& P$ F
NX高精可视化HD3D视频

* V( j  g% Y3 T4 W
4. PLM之家NX全息3D培训-创建HD3D; d( E% l6 Y2 b8 r- D9 M3 T
6 X; G& J* X# L! W% ?$ r5 n
NX模型检查一致性check-mate视频

7 e3 i9 d& j8 K( }1 k
- x2 ~" K! [" O6 |1 y7 [
NX入门视频实例教程(8 小时)
! ^7 a# B: ^/ O* y( X
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
, m! J: z" e+ @2 {
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

% l, `1 A7 {) L/ `: v) e其他重点咨询

6 s# t' a; Z" o3 W' z6 @
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

  O% l9 ]2 ?: V& s6 q8 \( V, w, Y
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部