PLM之家PLMHome-国产软件践行者

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

[复制链接]

2022-6-1 14:33:25 2523 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]9 @! W" X5 Q! c, \1 Z, L3 L. z
// tag --> Object
7 Y) S$ x0 u4 v2 W1 a" m: r//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
& }/ [8 M% G% F  X  F$ yTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag)): A) ^: W/ N5 r1 f( x" O0 w
// Object --> Tag
# D' i) O+ N! M4 m( @# E4 I//直接通过对象的Tag()方法获取( d. x' p) _" t7 S  f
tag_t getObjectTag = getObject ->Tag();7 Z0 C# r& y9 u6 }5 W$ B! M* Q5 [% j
//tag-->handle
* d( I- R; i& M- Hchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
% K9 ~4 m- R5 T6 Q! s  D// handle --> tag
8 v- `5 W$ E& }1 g( C" h" V. d// ... 往后看....! ?, f0 {) Q* s8 E! ~
[/mw_shl_code]
  T1 w6 m; C8 ?" S# b
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

+ G7 D* O1 `2 Z) }) ]6 w
这个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]9 C: j/ Y6 u' ^8 Z, L1 F! h/ P& P- H
* w* k4 Y, y& |& O4 H
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
7 m/ L# }, z- c& p( x{5 |6 ^- x- W. B) Y. V; B
  stringstream ss;) G: \" m( {+ N0 x5 R
  ss.clear();
+ T: I1 Z" u$ j. O+ j" U1 |- @9 _  unsigned int
" g/ [% Q( _' Z9 X    ID,* d. p! [9 _: p1 G
    version;# d* o9 \) r# n8 A; \
  char$ D/ R! Z. d5 n: k, c
    * file_data,
$ I5 K4 ^8 }1 e- I# j& M9 v    * handle,
* ?: Z- R" Y/ V& F+ M, z% `& \+ ~    msg[30];( j, ]( x" S$ S
  if (objectTag)3 [5 z) y) h; r  x3 |2 s/ b/ K) \
  {* h. f) T0 X6 n$ H+ o% i: j" k
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
# e2 p0 d7 T) r# ^+ K/ C" |: n  A6 M    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
' k5 x9 b8 T9 `  Q( o# W    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
& u" E) c: E$ ?$ F. n/ e    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
, p6 \3 G! _3 D- Z: B    ss << file_data << "_"<< ID <<"_" << version;
1 k/ c/ O! h( W4 j: _    UF_free(handle);
* e' o* }% d5 _    UF_free(file_data);
* A) o  _0 i0 k: x  }
( A* x6 ]8 w2 d! O7 q& _) j! @' ?
+ b5 W& I' D' a+ P5 @! ^  return ss.str();# b* Y- z3 L; e6 T
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

0 w' c7 o8 @. e. ?, h1 T
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
0 J8 S2 \/ Y3 U4 @, D{) M3 k6 j4 M+ f& q7 p
  vector<TaggedObject*> getObjects;" ]/ K2 q, e' ?: B* l+ k
  getObjects.clear();
( w. ?0 i" e/ }8 [
) {, C# h6 a% b' g2 @  string attributeName("");
8 l3 M2 m3 W6 Z  string attributeValue("");# `- I  X+ k+ G+ A  C3 I, h$ X8 Y; D
  vector<string> stringArray;
) _. Y/ y) p9 H+ q' {  stringArray.clear();
1 M3 v2 @$ S* N" I  //get the attribute value
* |* @: @( R- W4 Y1 J2 p  // get the attribute name
6 D) _) f4 }* ~" L; p$ E# u& X) s3 s% ?, h
  attributeName = GetAttributeName_FromType(typeT);% ?( Z/ B0 Q0 j& Z" P2 S$ A. Z
  if (isStringEmpty(attributeName))+ H% s8 }9 i4 ^) m
  {8 z) i3 q! r0 S3 C( E' U: F
    return getObjects;7 W- a$ f$ V/ Z. j5 J" Z: R
  }
1 M8 V$ d; m2 l  //get the attribute value
; W  \1 K6 o+ u2 U/ i# s  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);, O4 i5 j( W, C; Z+ `+ W: \) b/ I
  if (!hasAtt)! G  T# V' l3 e; h- |' J
  {
; p, h1 S) p& z8 b  }! F  b7 g    return getObjects;
2 f. e. y. ^( v  r  }' O; A9 [# o; e+ b1 {+ X0 y  w+ Z( i
4 T) |" g6 q" G0 W- o
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();- K/ `# B; m0 A4 E( P# O; ?& r! r. J/ x( p
  3 m' A7 t* F  D9 E8 x2 ?) _# V
  if (isStringEmpty(attributeValue)). T0 F; c2 e( V3 d$ Q' i4 X
  {
" K- l1 T0 s- Y$ A' g$ l0 W9 J' T    return getObjects;
  e: [, P7 n0 A. `  }
+ O( `5 J, R, L& I) q8 m
: c* [/ q: g9 V) p
5 W2 ^3 e( @5 T& r$ }  //get the key based on the split value
& h* R& _* P; D; x  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
) h0 T/ l( ~: Y+ L) ~) Q% i) w+ E7 p  for (string item : stringArray)
8 [1 s, z  w+ R0 W* L  A/ d  {
! N+ Q. \- j: y4 O: P9 c( V    //read the string to get the object
- {& L* `  o& Y* p3 _     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));# c( ~2 b+ i; `" j: i; H" f
     ( \1 y8 G& O* g6 V
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
8 f+ ]0 p' v4 m     {) ?- N# h  B  a7 Z$ z; p
       getObjects.push_back(tempObject);' t0 K5 A' R% A" i) z& H
     }$ T- v& p" r. r0 U0 M
  }
: o. x+ z' d- U5 v/ L* ]
6 x8 m3 v8 Q. }7 u1 z% K  return getObjects;
+ j2 N- \1 v" o% {  V! W- Z}[/mw_shl_code]1 |- f8 g5 |* I$ q# J( P2 y1 ]7 F
7 ^$ {! a0 ]6 e) x4 c0 ^7 K' g4 C

- r6 S: t' p( ]! r/ s7 `2 A0 v8 e$ Z
更多实例视频和专辑课程陆续分享!
  c9 \. `, K5 [% ~$ M5 j+ F- D4 r$ K+ T. t8 k1 A  ?
欢迎转载学习!

. X+ @7 M3 R9 g2 [1 L" ]8 W  \  ~2 p
更多精彩内容请关注PLM之家
http://www.plmhome.com
6 d5 I6 T. J. N" {+ F8 r

! K& g. \- \$ k
6 D* r& L; C* J

! w. V: [* F3 S" V4 R5 C2 L
END
PLM之家plmhome

% F: H; i6 E+ A1 K# D                               
登录/注册后可看大图
' a4 W! o0 E  M5 ]6 M
▲长按二维码“识别”关注

6 e+ z8 B1 X/ H" e
1 ]5 G) q& i1 J6 l( S4 F4 {
~~~~往期经典文章链接~~~~

3 S. Z/ ?7 _+ f$ l+ J* _' f+ g
NX表达式视频
$ y" ~1 v( q5 f& S3 C, f
PLM之家表达式专题视频-5 条件表达式
% N, M  E3 J6 n  X- s  C; M8 J& J  k

* z& f6 s8 t7 N* E8 |3 [3 J! p. X. {
NX冲压分析可成形一步式视频

8 ^% b2 j4 ^+ r4 o0 B5 ]* f
冲压模具分析工具 4 中间展开实例)/ g6 A% K5 @; j) g4 Z0 U, U3 N# U; A

% D7 S% X& D* x( D, F2 o7 O7 A
NX产品模板工作室PTS视频
1 产品模版工作室概述
8 ~2 w- ?( Q) S3 V0 A
2 产品模版工作室界面
0 Y* h$ M# ]0 p9 f& {2 Y2 x/ P
4 PTS高级模版技巧: N3 L/ N6 L# y
5 PTS添加需求HD3D4 `0 j7 I- T6 C+ }' i
6 添加装配模版
/ I& [( Z. a: {2 p' Z4 U. R9 s7 L
NX高精可视化HD3D视频
6 _* ?; B/ B0 f) |/ J% o
1. PLM之家NX全息3D培训-HD3D概述  p) Q( E7 A8 J3 C3 q% \8 s
2. PLM之家NX全息3D培训-HD3D基本使用/ u5 I8 i( r" [* ]5 u4 P$ R& B
- r4 G& h$ z1 e5 y+ }
NX模型检查一致性check-mate视频

6 \5 Z. a3 ~* B/ [0 S1 \8 Q( x
1 A6 N1 F1 n( r( {
NX入门视频实例教程(8 小时)
5 @) {( l9 E9 I) i7 J" G( V
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

9 j+ n4 _1 e/ K( K
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
8 U+ [! O' x& u7 }! E/ t, u% O
其他重点咨询
) C+ o& a' u2 G
工业互联网咨询:
工业互联网创新发展行动计划(2021-2023年)
3 e, w9 [4 V; Q/ T$ d# H! @; k+ b# o
工业软件APP:
数字化转型:
工业互联网技术栈:

' h% W1 N" X7 l( `1 Z
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了