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

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

[复制链接]

2022-6-1 14:33:25 2569 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]
0 k3 M- M# ~  ~# [// tag --> Object, r' @! W# O. I# }, T
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法4 o# J& B4 B" P
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))0 w0 f- V( H, u1 W0 ~* q
// Object --> Tag- S) K: r2 j3 K. N! v+ X, g5 V7 N7 D
//直接通过对象的Tag()方法获取
8 ^' }# Z8 r# F# q2 atag_t getObjectTag = getObject ->Tag();
* v6 e& y  |/ f2 |- E" x: T# `* K//tag-->handle6 |8 u. c- M- T4 N! W" H
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
+ |3 Y$ s5 Z8 m% ]1 S// handle --> tag ; y+ p0 R6 d( H$ z3 y) {( ?$ U
// ... 往后看....
- x1 Y0 }" n6 o[/mw_shl_code]
% ~1 ^$ ~' Q! w% c
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
- m& `% Y( O  }7 ?
这个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]
+ ?  u$ t3 u0 P
0 z  s3 R6 ^6 U3 K) K1 {std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)5 d) n$ h+ D9 b
{( i5 p6 P8 ^: u+ V
  stringstream ss;
' \9 {2 h2 J! N. t+ c2 w  ss.clear();
; v7 C1 k  [3 ?7 @  unsigned int
$ |0 s' c, v3 O    ID,9 y2 P( V* s. l7 y; X* d# B
    version;
( I6 X) Z0 p1 M! S7 [# y0 u  char
9 T, N2 B$ g0 O! W    * file_data,
1 Q0 H2 q' e8 A; {/ f* n    * handle,
" R8 y6 ?0 x* ?; a9 L, b    msg[30];
- e; {9 U* Y# f  if (objectTag)" _; v" E* n3 c5 C7 B& t
  {
- h4 j1 W9 u( L' a: a; M* T    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
% w) g+ B' E2 m! y) i3 a0 d% o    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
) o/ d' P5 v+ D! U    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);4 W* S6 t; z, X( J
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);+ i0 v, \) l6 J9 A3 j6 v; n. M* Y
    ss << file_data << "_"<< ID <<"_" << version;9 m5 H) t" |  p) h& E& \  A
    UF_free(handle);
6 E2 s$ y$ }, N1 \+ e* T    UF_free(file_data);1 I) {; v7 ?! ?8 b' Q8 X
  }! G6 h8 M; u; ?! X; r9 u
; `7 }# G2 s* V, t
  return ss.str();3 Z4 J, A2 L, Q- b! a( W! J" \; [
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

4 ^, i% Z+ o# ?
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
! A$ R2 I1 g( x- z& h& z7 e{
; ]) \* w7 c$ b, z  e. t  vector<TaggedObject*> getObjects;8 D5 [9 u' l! I7 z1 u6 i" _" i
  getObjects.clear();
5 T9 }; E) U- S. L9 [5 ~+ f1 O
4 ~+ ?% i) E5 a6 _( _  string attributeName("");
( R' R3 {/ {. G+ K  [2 c  string attributeValue("");. T. e% r! ?6 S1 c, J/ V# P
  vector<string> stringArray;
* g3 i% N# z5 {' J" u6 J  stringArray.clear();
- h) W. S- r) S# l6 ^/ t  //get the attribute value
2 A  I  m$ C" s  // get the attribute name
. n  w" h9 W7 j/ L9 L0 Y: J  Z7 J/ ^/ d
  attributeName = GetAttributeName_FromType(typeT);+ a2 h7 p: P; X( z
  if (isStringEmpty(attributeName))
- L3 W: `: `% g$ m  {& K+ Z2 r5 V9 S" B( }+ i
    return getObjects;
( [1 t! K1 X4 t; R1 |) J6 j  }
( N; s# |8 T" s: T; G7 x- e  //get the attribute value $ s: A# w6 ]& P! [' i8 A
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
& W* l0 ^- Z& Z4 }3 j0 [  if (!hasAtt)4 w+ E5 _" `- W0 F/ h
  {" s# T$ G; U; u
    return getObjects;) u& C5 j6 w) K/ m% d
  }
' T0 l1 s) o' g
4 p: C( F6 F; Z/ N1 O9 T  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();+ }1 v6 S5 O# q" V" J6 I5 \& T& J  y
  
' v8 T7 C6 i! K: b  if (isStringEmpty(attributeValue))
& c! l8 ?% `5 |' z0 T' Z! J' ]1 ?  {
" N5 D/ |- J! s- n* {. p# X    return getObjects;3 l  w# V' p  R1 Y2 b/ z3 n
  }
/ s5 q! U. l3 W) N! I/ M* F7 @/ _) m7 j4 Y

0 Q& q; b$ u, S& z7 k  //get the key based on the split value
: H6 a( W5 u, A9 U% a  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);. y/ b5 Q/ Q2 }0 X- `
  for (string item : stringArray)* ^; V' ^2 S  \4 @" i+ X5 L
  {% E) d% ?* k+ D- ^( `7 k' Q4 \) o
    //read the string to get the object
6 j& ~: p: ~2 U% W     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));4 I' \- z& _) m& V5 p5 u# z5 K
     : J# V" v3 ~9 u+ x, r+ J% Q6 p
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)( Z0 A+ T/ K3 v+ }
     {
/ ?# h7 @* }' {       getObjects.push_back(tempObject);' o  l' g' n' e6 w2 k
     }
) X& P$ L1 p. V, _0 m! F  }& f8 i! F/ K  {" P" o
1 U' F0 A) @& `5 Z2 A
  return getObjects;
& A, c' C! H/ e/ O" f& J6 b}[/mw_shl_code]
# u& C! U5 b# B* d1 ~* w8 h# _# P7 O1 t/ ]5 E, z
& d$ p: D" [8 |, i& O' H

+ C& O' L: N3 S2 ~9 H  u; z6 t4 z
更多实例视频和专辑课程陆续分享!& Q, F/ p( `4 p- v( j

5 V! j, B3 z8 ^& T& Q
欢迎转载学习!
: C% b& u) @' j# q# Z  ~
更多精彩内容请关注PLM之家
http://www.plmhome.com
! T" Z: ?* m$ C


( D2 x2 x3 G; u( O5 x* \4 ~) l* D; j- N9 ^$ \& c: z2 f8 k
8 n1 o# P6 b! P* {
END
PLM之家plmhome

9 u9 s" Y: k0 P" {2 ]  v                               
登录/注册后可看大图

' B' i" d. Q$ c/ ?▲长按二维码“识别”关注
' U( C: X& q7 t2 E3 e8 K

" U% g+ T0 l6 Z" D! F. }4 ~% h
~~~~往期经典文章链接~~~~
* f$ ?6 a1 w9 W
NX表达式视频

) C4 j3 H; e" i. m' Z
PLM之家表达式专题视频-4 表达式的导入导出6 R, y  e$ ]# p' E  M5 m! M7 U7 C0 U

. K3 Z! f1 d$ @, Q
NX冲压分析可成形一步式视频

2 Z# v* [! Y: J# ^) D* I6 Q6 H: _# M* Q  Q: y
NX产品模板工作室PTS视频
1 产品模版工作室概述+ [6 v  `" w9 r8 W- S- [
2 产品模版工作室界面: {* p4 N5 w6 P* x2 H/ @1 \: @4 U& ~
4 PTS高级模版技巧
! u1 [7 @, o: u" F" x* P, s7 r
5 PTS添加需求HD3D
# c( a, R6 A3 O8 I, a" W1 L% A3 C
6 添加装配模版/ B& A" w  e& z% C0 }& ]& ^
NX高精可视化HD3D视频

" |9 E1 Z; B  ~5 P9 I* l3 h+ X1 ^3 V; V1 V) M0 Z8 y% Z
NX模型检查一致性check-mate视频
4 `# j& P- O% y* M1 ~" O

. K+ v3 U! b! U4 v' L
NX入门视频实例教程(8 小时)

  V; y' s  E% O7 Z9 ]
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
( |9 i, y( l( ~1 r
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

$ `: z: J; L" @. P其他重点咨询
. F! |8 A. m4 V* E8 o% g. z! r, p3 ~. e
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
1 k9 X& {( O& N4 t+ b, \
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了