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

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

[复制链接]

2022-6-1 14:33:25 2677 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]* z+ j! [. r# V9 C2 z0 r
// tag --> Object$ V- l5 D+ L) j- ?  y) A0 F
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法, n0 C4 J  z( R. A3 p* z  U! |
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
3 k: `1 \3 a8 x: x2 ~# h7 J( H// Object --> Tag
0 O, L% F9 V1 g//直接通过对象的Tag()方法获取
) g" B* N7 S- e6 Ztag_t getObjectTag = getObject ->Tag();
7 r6 a& w' n' {! [% C. R& j//tag-->handle) M4 D, j% |# g2 b" w
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());; i. T- `6 `: D( A% a- Z' Y
// handle --> tag
- f' _7 J; W* B5 s" {% @& d// ... 往后看....' X) ~3 A9 A" o' F; `0 S! D3 p& l
[/mw_shl_code]1 O" [* }; b+ d2 @
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

0 o' L% l, 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]) t7 B% G, I% y
/ H5 ~7 }8 x8 S
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
$ s* ], \1 H; t/ v{
! @; [! V8 V# h' K# U7 D* D  stringstream ss;/ t/ R! N$ R5 Z, a9 [. a1 B% _& ~
  ss.clear();
0 S; G* K* ?* M7 f/ w  unsigned int. w! X: a: b% t+ @! o, {' F) {0 z
    ID,/ Z7 k8 G* x( |( W  v! H4 P
    version;
0 s( p0 N9 s  a  char
3 \* I! S8 D4 Y1 _) v# `    * file_data,8 G6 ]0 I4 k8 u0 X
    * handle,+ T9 h+ H; i& D9 ~/ x7 v
    msg[30];6 |% p# p& J. P$ M
  if (objectTag)6 }5 q! b5 W( B' m% r5 k$ p
  {" l4 Y2 H+ D9 e. @& j$ [! J
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
5 R; m  K0 [) _    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());" [: \' U2 W$ |; I' ]
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
) z, [7 K# }! D' P; c4 o    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
1 q, n: A1 D- }& S4 I. L    ss << file_data << "_"<< ID <<"_" << version;
1 K, F# A& r3 z, P9 i    UF_free(handle);
6 I5 I6 H1 l' [3 S    UF_free(file_data);
, h( e2 H3 K! ^' w4 \" h  }# A& H$ x4 R, q* u

; t, j7 }; [- U3 p) @$ G  return ss.str();
/ J2 a" y! P6 {0 K! g8 F}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
$ ]% i, x# n1 s& ?: j, G: p& P
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)# H& }! v2 b( N  s$ _
{( T0 a/ u% n3 m0 y
  vector<TaggedObject*> getObjects;; [& w6 d0 X  J* z
  getObjects.clear();
' [* K+ z% X5 ~
2 f. O! T' D  u2 _# T3 p  string attributeName("");3 {: C+ [. x- |8 R" _- V% d
  string attributeValue("");
6 N0 W" D: t+ f4 v) S9 F" X  vector<string> stringArray;
5 g% u  A5 B/ B! o! I9 C  stringArray.clear();
6 P$ x8 [, k1 D" Y, \4 t4 c* v  //get the attribute value 9 j; `2 I4 j3 G* N1 C+ k. q* |
  // get the attribute name 9 H0 \3 P/ ^' ]

5 O- o  C6 M( k3 O9 g  attributeName = GetAttributeName_FromType(typeT);
4 a1 u" e  h" P7 }  if (isStringEmpty(attributeName))
( g6 R2 h& a: y& y; ^  d  {9 a5 U+ k4 z/ l5 j
    return getObjects;, E1 l. E7 O8 z" @" S6 `
  }
" g4 K( [# u% s3 m& q6 S7 U$ B  //get the attribute value & I0 _& `# Z2 P7 L
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
9 C2 D1 E: C( X  k" Z  if (!hasAtt). y' V2 _% r% T) d1 Y# B3 T
  {
6 D2 ~! H. D7 f$ W- X" w    return getObjects;
3 K2 M! V9 ?2 n2 }* `/ R4 X  }  g2 m4 J) N" K" G) Q- O

/ t# f) {- Z) z6 J) O  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
5 d) N, |# ]+ C: [  0 B2 u. V4 u5 r4 T& \
  if (isStringEmpty(attributeValue))7 B! I9 L- j, W
  {# A" H. `2 L/ ^, n4 d
    return getObjects;
% Z. a( H; J, p- V/ z) @% V( ^  }/ K/ |$ [7 N* S8 x+ p

5 p2 x% K+ F" T1 W$ m" E$ E
6 V( t$ N# W4 B% d1 k! P  //get the key based on the split value
  X* v) i. U( Q- S* R8 p  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
" y# |+ k8 {: \' u- ]/ {% u5 r3 e  for (string item : stringArray)# m) S' o. m' T) s+ `; f( p
  {
* r! K, n8 v' _* j5 T, a    //read the string to get the object ( T- _  n& O2 D& O, a+ \
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
0 e+ K# m; r9 U     
3 ~7 b. [1 ]9 M- J- x6 l" f, ^     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE): P( W( P3 t8 E; o# K
     {( z# o; P) T) O! v; T; a/ t* M
       getObjects.push_back(tempObject);
$ ]4 Z; ?* d3 i8 W; }" I     }2 a/ N& W/ d  `, m
  }+ ^$ G2 B( d  [) d6 n. k& ]5 m

7 R7 R6 ^* J* b) s% a( h  return getObjects;
7 j9 ]! |+ u2 ~7 O7 `}[/mw_shl_code]- b$ O; k0 K5 c
* W- ~: ?, t( X# {

1 u  ?* c, Q% |, V+ d7 {- x4 ]# W$ e* I
更多实例视频和专辑课程陆续分享!% X( v# V2 ]/ Q

& E! q) f; Q3 f) b- s0 v
欢迎转载学习!
( e9 N* l4 H' q8 j/ L7 \
更多精彩内容请关注PLM之家
http://www.plmhome.com
6 K$ z( T+ q5 s  W; E  h) w

, c5 b: l' S6 G& }2 f
' p5 i: z% t% b; Z% |

: |' r$ f$ h$ R8 r/ Y
END
PLM之家plmhome
7 A% p# K7 ?" S
                               
登录/注册后可看大图

" z4 W/ }0 `* n' z1 u▲长按二维码“识别”关注

9 Y. U& O% h8 P3 T$ u( d
  T% L$ G( u  D& `4 h4 n
~~~~往期经典文章链接~~~~
. H2 ~" V- p9 ^. R/ [  c" c) m4 `
NX表达式视频
* b* B  z' }4 B

# w$ j' d; `( [% d
NX冲压分析可成形一步式视频
0 `! }: S, b* S6 G1 O
冲压模具分析工具 3 全部展开实例/ I) q! H+ m+ }' M' g# D0 f2 f4 D8 W7 h* t
0 A1 _$ j, t& B0 [
NX产品模板工作室PTS视频
1 产品模版工作室概述  r' x1 ^5 k5 r# B" C5 m! I* ^
3 创建一个基本的模版( h1 z0 v  Y" T0 c% L
4 PTS高级模版技巧
9 h' O/ M" k& E/ O2 m. w+ y
5 PTS添加需求HD3D' j6 ~6 L  {- F$ g
6 添加装配模版
1 z2 F) k- J3 w9 w
NX高精可视化HD3D视频

! G- X3 R" \+ e6 |8 ?; K3 ~
1. PLM之家NX全息3D培训-HD3D概述" V0 S0 [, J* H$ ?9 {  @$ t
  K% A  D$ R0 S; y$ ]2 V& M
NX模型检查一致性check-mate视频

2 i, N# v" [! J8 H; Z1 E' I+ x6 U; q% S8 e& D/ H7 Y7 r
NX入门视频实例教程(8 小时)

: A% z' t, E: o0 U; `
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

' J9 H4 o# N& h4 Z- q: r  V' u
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
' _  r1 Y& A, j4 Z, r; A9 P. k. c0 c
其他重点咨询
" L6 _  `- c8 D
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

: u1 R1 m& Z; k. n6 \
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了