PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

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

[复制链接]

2022-6-1 14:33:25 2397 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 H0 m# q2 _; r$ |8 @+ ^, c// tag --> Object- D: |, c8 s) N7 U( i$ k8 z3 G
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法) Q( k; c6 Y! h/ ^
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
# z. r& x/ H7 s; b9 ~// Object --> Tag
4 u8 I, K$ e' z/ [& J//直接通过对象的Tag()方法获取
5 G; W  x3 }: g, Utag_t getObjectTag = getObject ->Tag();" M4 L0 v4 B4 e) g
//tag-->handle: n3 Q, h. K  ?
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());' ]/ X0 {; {/ j2 a6 c# D
// handle --> tag
/ Z/ z/ }5 {# |// ... 往后看....
7 y# i3 E+ K5 i[/mw_shl_code]
- Y( E% F! i9 n3 \" _6 \
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
$ |) R/ j- m7 V0 l; k
这个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]
* M4 Y% Z4 e8 e: _- q6 {6 U5 b) P+ J7 Q! h; B9 k3 H
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
- S. C$ W1 c* J) d! \) ^1 L{) k" H; H# i) s
  stringstream ss;; a2 c4 B# a$ m# x  {, L4 ~
  ss.clear();
) r5 c( z! r3 [3 }3 u1 r/ q  unsigned int. p. Q6 K& t9 |: o4 U  J* D
    ID,. a6 H6 H3 U! q
    version;( |+ k# F6 n& F- e0 _. b: O* ?+ ?
  char
' {8 Z6 D) E# }3 g3 c    * file_data,! R2 P4 o  ^7 z2 n
    * handle,9 I7 K. y0 N0 Q9 k1 D) X
    msg[30];
  v- ]0 m- H! b+ `7 s- O) I1 K/ ?  if (objectTag)4 u# |2 o" b  c# [( d. z
  {
" i& B* a  n6 c0 _; }% l$ {( m    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());  X( ]& Z. t+ T5 ?
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());; H7 q3 x  E3 }. |! j3 W, i
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
# U, ?1 R6 C# ~3 J    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);: }0 R* j7 K# R: A# V% H6 m
    ss << file_data << "_"<< ID <<"_" << version;
6 w( n+ P3 Z2 P2 ]: h" O    UF_free(handle);2 }$ p" Q0 P. V" p* o5 E4 t
    UF_free(file_data);7 o  g- }, j/ O4 c% a( k7 G
  }
# u2 [# `- u  v/ z5 L
& Y& L9 S# t5 T: v  return ss.str();0 u% I! g4 K' t) I* m' 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
  P1 G' i& Q' j9 j# V
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)" P1 K4 N# c8 v" J; `
{
2 u" O# u& R% u) C$ ~. u: E) p4 W9 X  vector<TaggedObject*> getObjects;
- V; V+ A) d6 X4 c  getObjects.clear();
- r3 P* i) g4 n) q) F) K& c* i& C$ E6 @) [1 X4 J
  string attributeName("");
$ t& T9 Z8 u* F3 W& e  string attributeValue("");! v# c: n9 S7 x7 R; K( L
  vector<string> stringArray;. o& G. B4 M- f+ U6 B
  stringArray.clear();
+ q. n2 k" k# s+ n  //get the attribute value
$ _" S* D. o7 O& o  // get the attribute name ! u1 h* M$ j) X% c4 ^

" z0 \8 v; ~, W' E8 k+ A( L  attributeName = GetAttributeName_FromType(typeT);& {  e* e* E& R0 M$ Z
  if (isStringEmpty(attributeName))4 g/ _' X- C' b6 a) l
  {; ]4 q9 l# W7 r2 O* U8 q: J8 J. y
    return getObjects;+ ]. V9 }3 v6 q$ k- S, q
  }
5 D* Z, o( {; o; [2 _3 k( j7 K  //get the attribute value
( t. h1 Q+ E# X" h9 v" {  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);7 X# ~% Q9 C( a3 b; ^7 _
  if (!hasAtt)
4 d3 X- B. ~" ?, |) R9 r  {; d+ B& r4 x" h: b
    return getObjects;: l. `: ?1 q1 d! q3 f
  }% q+ g' ^3 ^8 s* t7 l) [

8 q5 G. u  p; l) V8 v- N  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();  f. E% P2 C- [% {1 |
  0 U7 E8 k8 v: J: c
  if (isStringEmpty(attributeValue))
2 \9 t& \9 Z  ?& R: I  {: X$ O( N( I9 u! `* ^7 i9 |) {# R
    return getObjects;
5 P: @" X7 G% o1 O$ m4 ]; S  }  }
' f. n6 q* |/ {9 x/ R$ E# c1 {2 v- m: h8 l2 C
6 G) P; Y5 i4 d4 u4 A
  //get the key based on the split value . h; G" Q/ q1 L# t# {, g
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
& C' F% Q  q' e  for (string item : stringArray), i: `& ?& W' U3 m0 v: C+ g' ]
  {
6 y% @' I6 f& C  M+ S4 V    //read the string to get the object
% Y! B; t: O) v( K     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));0 u! `. b0 v6 ~. |% ^0 a
     
; N) \) W9 R# J) ?* y5 T     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)  C1 M! b$ t  E) n
     {# ~2 ?* G  y) t2 p& M9 ~' `$ j$ u
       getObjects.push_back(tempObject);! G. _  L6 O3 ?/ B1 r6 |% U& \9 b
     }$ s, k) _1 n9 b) f0 m
  }
! l" o: q) ~: `  E$ ], }7 r& S$ e$ ~* D% ?, s% r, J8 D* _* d) l! G
  return getObjects;# [9 K& Q- a8 t7 ]- T" k4 ?
}[/mw_shl_code]
; H2 i2 X2 j3 K% q6 V' g9 ^$ _; K! ]' M) c  {" h

0 }; d! v7 I7 R
" H, r/ O8 C' I0 ?! _6 a; p+ ]
更多实例视频和专辑课程陆续分享!4 z- Y1 p5 j5 x
% I2 A& m& z6 @9 O, m2 Y- P
欢迎转载学习!

$ d+ a' w* ]- T0 E- u9 M
更多精彩内容请关注PLM之家
http://www.plmhome.com

! K7 N. m5 G; |3 v& k: ?6 m4 M  j; h

- ~* J+ ~4 }$ I3 T2 L0 q$ ^% c7 X7 N6 U4 g

: C$ [* b& v# b* S8 ]8 W
END
PLM之家plmhome
+ c+ d# q$ w" Q. r6 c
                               
登录/注册后可看大图

0 w% ^( v5 }& K▲长按二维码“识别”关注
$ [  U: |7 q1 E2 I

4 C  Y$ b& ?/ l9 R7 _
~~~~往期经典文章链接~~~~
! f% [' O& t+ G/ b6 I0 W1 U/ ^$ M
NX表达式视频
, S) R: x7 k% ~) C
PLM之家表达式专题视频-1 表达式概述
0 T% ?8 ~# D# x* `* s$ d0 m9 O+ p

0 }0 Q0 g- W* a5 z
NX冲压分析可成形一步式视频
. y9 y* Q/ F0 U( c& z# l( y8 G8 ]

) g9 j/ @4 o( X/ g7 j! n# R8 p
NX产品模板工作室PTS视频
1 产品模版工作室概述' s+ G- ~, V* V1 U% U1 l
2 产品模版工作室界面3 O: L/ F; l/ ]+ y- {' h" h
3 创建一个基本的模版. I1 A- a% K1 M9 x1 q: s
4 PTS高级模版技巧
! H# K! `% T0 w5 J! q7 F
5 PTS添加需求HD3D
* p/ s* w0 s$ Q# o& X& \9 u  ?
6 添加装配模版9 y- z$ {5 t- |. @% m& V
NX高精可视化HD3D视频
! i. ?( z/ d" x  r
1. PLM之家NX全息3D培训-HD3D概述. N$ d& k$ t% L' j5 T, V  `
2. PLM之家NX全息3D培训-HD3D基本使用
- e2 `; o" A/ i8 V9 t0 W, s: g
7 X( u( h$ h! |2 U/ c
NX模型检查一致性check-mate视频

5 t/ t' I9 U' P+ `" a0 F8 G4 `9 I3 i: T( I
NX入门视频实例教程(8 小时)
# {" C1 Z8 L% W+ i7 i
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
: K1 X7 K5 f) [& v; F- L* V2 i/ J
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

% s' t* n# i9 `1 m8 T8 q$ G其他重点咨询
/ M. ^9 e5 _+ H; F  A2 a
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
, _: {+ k4 \- x: e/ A5 ~
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了