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

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

[复制链接]

2022-6-1 14:33:25 2745 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]
; ~3 Q& {# L$ m. H! ]# S( P* y// tag --> Object
$ J0 c* h/ M0 e) A0 s$ `& y5 E//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法" r* s3 F& }" M5 w* K
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag)). X! J% {8 y1 C$ C; x  J  c4 O6 p
// Object --> Tag
8 x+ d# S! T. c- ~. ^//直接通过对象的Tag()方法获取
( N& G4 J' d4 Y6 v1 Gtag_t getObjectTag = getObject ->Tag();1 _6 O" W' g: X2 w7 Q( u8 C! {
//tag-->handle* g. @* |* f0 w! r. U2 @' T5 v
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());2 O# U% L! ?* q5 d. Z- Q- R. \, B& |
// handle --> tag " Q' ~" u. @! r
// ... 往后看....
' _$ {6 e- B& l[/mw_shl_code]/ C% y. w. v9 f% Z7 G* |
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
/ T' p* k1 H% T( V5 G  \
这个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]0 `" W5 w& ?9 `
! d. K9 r7 |5 _5 r* n$ p5 z
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag), {# `7 {5 A) z, Q, ~- |" V
{7 H& e& i8 e. a$ y4 R2 i, z  @
  stringstream ss;6 v$ ^" ^) a) [6 L6 G
  ss.clear();
) Y0 z( y- Y8 P$ r0 k% F& r7 @) {  unsigned int
0 R$ a$ v+ @. E; w5 P/ d    ID,
2 a. e  r, U; x7 q    version;
" Q5 {; j! s  c, J1 C: ], \9 D  char
8 @+ h0 }2 K# U9 @2 V  N    * file_data,
/ T& d3 t7 i# |    * handle,
4 i+ i6 K5 j3 y/ t' z    msg[30];
& V) X2 y* T- v5 g0 k5 Z  if (objectTag)
  a4 K4 B8 `& N; q  {" Z7 l# `" }# y) a# D/ k; x/ c
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());4 T/ v( ~) F7 `4 z" _
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());) R- J, N7 U) ~7 ]' P# f+ C
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
6 H$ z/ b4 p  k0 J; }% t    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);* O- P6 }; ^% C1 ^
    ss << file_data << "_"<< ID <<"_" << version;
" \1 i# p# X7 v4 J% `/ ?  B& u    UF_free(handle);
; W* X* n' m; n" q    UF_free(file_data);
% c- {, I& M6 f4 j* r  }/ z( m+ {& Z/ m% C" ?( R% _, @0 u
/ k) S; }+ |. R/ X! V5 A8 W
  return ss.str();
) r% _  z$ w0 G1 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

/ S) P- L4 C" Y
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)7 j6 r" z0 K8 I0 d' X' h1 N
{
9 O3 o% J( K" x+ A) c, T  vector<TaggedObject*> getObjects;
/ n; L+ |* P+ H  getObjects.clear();
/ K6 H3 z' Y3 H$ W
! I) n8 Q# J4 S% |: \; t7 j  string attributeName("");
. X" \& D( Y! L+ e1 f- ^# B  string attributeValue("");
" M9 j2 y1 _/ `+ E' A& H. i: D% A  vector<string> stringArray;
; e. [5 {; b% t: p  stringArray.clear();
$ w8 r$ M- s* u3 f; ?  //get the attribute value * m; l8 f/ W3 d7 u' }/ n3 M* p
  // get the attribute name 7 `6 K" u6 d* X9 k) z- a
, \7 T" w& u7 N% f
  attributeName = GetAttributeName_FromType(typeT);6 ^& L% }1 ?! |5 P' L: R/ X, G! \
  if (isStringEmpty(attributeName))4 R  z% N' ^2 d+ Y/ Q
  {
7 x' r. c; ?( F    return getObjects;
9 t7 ^* ]0 P6 v' _  }
. P9 C5 s7 S" ^  //get the attribute value
/ Q6 G% p7 _+ O3 ^' e  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
2 l4 d  l7 g: R* Z1 v2 u  if (!hasAtt)
+ O; s( ^9 s( {( p% ]  {
5 F. C  l+ v8 p/ r6 x1 V& p+ e    return getObjects;4 |0 |1 w- B2 y$ ?
  }
. O" r9 Y9 \! w. ~( A- s
$ M- z$ W. h$ M/ w( x; E  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();; i# h4 h  \6 u- Q
  1 n. y  b8 i  O8 w$ Z3 Z
  if (isStringEmpty(attributeValue))
4 q5 o* e3 c2 y  {  a% Q2 ~$ K2 ~3 F7 H( ?# _$ F
    return getObjects;- Y7 T- C& m  r! F0 w; a: p
  }
; R1 W7 a- M5 P! h, k+ O: K
8 C9 v  b2 J, P: P$ D0 ]$ p' n# S2 \" ]9 Q
  //get the key based on the split value 8 F: `/ t( Y$ e( y! j
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);6 \; \6 M. n1 ?" R+ F
  for (string item : stringArray)
2 J; y5 B% T1 z. h, H7 i  {1 K) b" ]# ?' ]% p$ r
    //read the string to get the object   }$ e% ^( A, s  d5 C. Q/ z
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
* p- t2 M& z, Q     
: p( U; C9 `+ s/ O8 L( g     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
: V# Z$ f& v) v2 p9 A     {
  W/ s, _; ?7 S6 w0 I3 u       getObjects.push_back(tempObject);% ?  b% \& u% {1 Q8 _
     }0 g# U" @0 e8 i
  }2 k. }; J  S1 t# F

1 K. I: v# m: x1 b  return getObjects;
, |7 [: m$ S" u7 _7 V6 b0 l& O9 g}[/mw_shl_code]
( S$ _7 |  v9 b$ D& O4 \3 L. @
9 \8 L* e, w* e, y
2 l) q# Q# c' z" A6 ^* I
4 p$ X2 V$ P* {( R, T9 b) A
更多实例视频和专辑课程陆续分享!. a* X- E. i( U4 U! ^9 I2 |6 p

9 o3 `! U, v$ o1 H* h' A. |9 p& X
欢迎转载学习!

# p7 c+ d$ y8 i# s. Z! n
更多精彩内容请关注PLM之家
http://www.plmhome.com
: m; {% L) S. ^) L4 L


% b2 J' F# v- ^+ G
- I: x3 b' z% C3 W) {/ @# U* x( J: Q- D4 i0 Q& h7 O" \+ K+ g
END
PLM之家plmhome
3 _; W  x9 @/ Y/ c5 [0 u
                               
登录/注册后可看大图
+ t6 R) I' K- ?, H4 f
▲长按二维码“识别”关注

$ Q! p" H1 y; Z
4 |* N+ V) K" d$ l/ J2 ^
~~~~往期经典文章链接~~~~

* \+ O2 L/ V: ?, I* k% z: N$ f& v
NX表达式视频

" a$ a5 t; L4 G$ U1 [' g
% F+ ?: R( c! `" x
NX冲压分析可成形一步式视频

+ P/ T/ p3 z* k( V  H0 e% O8 S% M1 ?# Z5 k
NX产品模板工作室PTS视频
1 产品模版工作室概述% p9 `+ y' T) p& i2 e2 j
2 产品模版工作室界面
' N$ T6 n5 D, W, a4 N1 W, b0 a. }
4 PTS高级模版技巧
+ o% F: P; G. e' }7 _0 x4 v
5 PTS添加需求HD3D
: L& t  E. \  h4 c7 \' `$ F6 s  Y$ ~
6 添加装配模版% W! N8 w) N- S2 \4 @5 @0 c8 N2 L8 v% g
NX高精可视化HD3D视频
0 ]. t! b7 {  a9 m) z
1. PLM之家NX全息3D培训-HD3D概述
1 n! @3 Q. P. m9 e, k  a6 ^
3. PLM之家NX全息3D培训-HD3D客户化展示& Q" z  D( t% V% G$ R8 e% w7 j
+ u; }2 ^3 \2 A5 a2 b1 f+ I
NX模型检查一致性check-mate视频

. K4 M& O* }# f7 A) L8 L) q
4 f* G6 U- u' I5 w3 Q/ b- k  I* Z
NX入门视频实例教程(8 小时)

9 P* u3 g# w7 V2 a2 r
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

+ B& }  F% z: A. G
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
5 x. B% S4 g2 [4 Y" v5 {4 A3 s) X
其他重点咨询

& |3 J' t/ G; y) @
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

& m* Y8 R9 Z8 G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了