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 2212 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]7 o1 ~$ D; e- u7 K
// tag --> Object
. X$ g2 j% b! q3 A//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法- ~5 j. T5 `% K. b6 P/ ?6 i# U
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag)): R6 S' o& ~/ v$ }; X* H! j4 p" e
// Object --> Tag' a7 I# P( i- l2 h, f" b
//直接通过对象的Tag()方法获取" b) C, G; \2 J! {; I- d
tag_t getObjectTag = getObject ->Tag();
8 y. B! u0 k1 z" O5 j//tag-->handle  L( Q. W' O& ^+ R" J7 J
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());& c' [: ~7 x+ s6 a) ~4 A
// handle --> tag 9 e) ^7 T* X' Q1 v) `
// ... 往后看....
% ?3 O8 f( k3 {2 d" V( p: J) Q: M[/mw_shl_code]$ a3 J9 `6 `" n/ y
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

/ }5 c8 }# H: X
这个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 W$ I0 @/ L/ @; Z9 N( ^" R

6 V* d' H* _/ @+ N4 ]std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
2 ]. W# \) Y4 J, Z{  a3 u1 O* H) Q, g5 A
  stringstream ss;
! V" D1 x  @# O  ss.clear();
; q& L3 C9 U) u6 O/ @  unsigned int
, M6 t9 V, s" f& Y    ID,5 X. S8 V6 {6 M" L. P$ q' v# k5 C
    version;
9 f8 \* ~0 H5 j) D) e  char
9 ]1 C% F6 G, X  ~# j: s    * file_data,
, K1 `$ n4 @& w0 }1 C" ]6 g, h    * handle,
$ K/ n' {- y8 F/ `* C    msg[30];' B! o% z) V! Y/ w2 f
  if (objectTag)& @, v5 ^, H8 @# f8 k
  {$ ?: N4 }  w4 F8 O( g0 t% Y3 O
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());/ J$ a) f) g: C) A
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
: u) I. {& X# _( u    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);6 k' q6 E3 k( L$ X6 y( H  e
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);3 W3 G; s! e1 {0 {/ i! A
    ss << file_data << "_"<< ID <<"_" << version;# L$ j& {" Y- D5 b9 j* [
    UF_free(handle);$ t! |, w6 r, j& Y8 V4 x- h
    UF_free(file_data);
, x" w. ?- Z; ?0 T5 q$ o' F1 ~) P  }
, e2 ]7 [; E! v
/ ?9 h$ b  [1 ]7 w" @9 c* e6 `  return ss.str();
: S9 z- N" H* ~}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

- J$ s  _: k% a! j) {# [- J
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
! f. K: ?, }) K{
9 m: T% a& F, F7 s  vector<TaggedObject*> getObjects;
2 M* q& F8 B7 e3 K! t  V" N  getObjects.clear();5 A, _- e9 N! v0 ]& D

9 P" {3 V1 i8 t  O  string attributeName("");1 t& l+ f+ b0 E! G2 z' w
  string attributeValue("");3 Z  x  T" v1 j; T( I, N
  vector<string> stringArray;2 h- j- F9 y4 O: X( p
  stringArray.clear();' m; P# l( J( {
  //get the attribute value 2 a+ ^2 P7 \0 T  P
  // get the attribute name
* k+ V% [$ G( M4 }
! s( o# @2 \# I  e! C  @+ r! q1 F  attributeName = GetAttributeName_FromType(typeT);
4 \- [' Y5 J  v; `  if (isStringEmpty(attributeName))
; w2 A* E9 B1 w& r' v# }/ L9 x( r  {
4 s5 E) n3 F+ i; u    return getObjects;
& t; v# h% h  y4 o+ \  }, X1 B. ?( b* }3 u  ?. m8 _, N& a) {
  //get the attribute value
' H. x) p4 E. T2 V0 q! o  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
2 R* [! @: I  Z% u  if (!hasAtt)
, o3 X. X2 T3 o! S  {/ r' R3 t- s! m% w5 {
    return getObjects;& r6 `& H% u, c3 E
  }& ]( c! t& u/ \3 h
8 g3 I0 _& `  n9 q$ \3 {) r
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
( c5 z3 O& y  A  
0 F% M2 v$ ~9 z, n  i  if (isStringEmpty(attributeValue))8 Y. {4 F' ]$ Q
  {
0 O% m# ]: Y5 Y" e& T4 }$ T( c    return getObjects;
4 ]6 i# ]8 u. K7 f1 Z9 |  }  C8 `, K! a# ]  u
; y6 y. [- o5 V' t9 i

  S# D1 V5 U: n+ R. h2 y, m  //get the key based on the split value
* p6 W' w( X5 V4 J  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);' @0 r. |9 H2 l; T! Q  s& E
  for (string item : stringArray)" F5 I$ ~$ }7 F$ W! c$ N- I
  {
1 T. w( l8 B5 l! b! W    //read the string to get the object / `& o7 K3 m: }3 {6 F) s8 [. b
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
0 F" A8 R, }8 y* w     # i2 W2 D3 H7 F% X" T5 i/ p; Q4 v( @
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
! I, |3 y; B0 t( `8 {     {& ^2 W9 d( M, K8 X
       getObjects.push_back(tempObject);
4 _# G0 [4 _  ^, y     }
. `( r! G0 `! }5 [  }0 e$ g4 l! `+ E4 |

; a) `( @7 ]8 p7 f4 e  return getObjects;
$ l* w% \1 K4 H5 c5 Q" W- u. S}[/mw_shl_code]1 ]: K  k/ q% T

7 E) V0 ^- Q8 ~4 x- `( w9 h1 e/ y# K+ \* R" k- Q) t) z; |
2 r8 M) j" B+ {) }5 p  v
更多实例视频和专辑课程陆续分享!
' K9 v8 F% t& J: |) B$ N, H" ^* c4 Q
欢迎转载学习!

2 c% M. }( P0 q& j0 e
更多精彩内容请关注PLM之家
http://www.plmhome.com

: O+ B7 V9 t+ Y8 o" B" z

) z5 z' o" s- f- o
- E* a! r8 c- Z; c6 M) D
+ A# ]+ w" s# W5 u
END
PLM之家plmhome

; X* Y+ n- |5 Z! }                               
登录/注册后可看大图
2 s7 p% `; H3 i- G
▲长按二维码“识别”关注
5 a3 A/ I2 H" m

2 A8 y& d" o" ~# E1 Y) _
~~~~往期经典文章链接~~~~
1 X# q7 `6 B6 x/ f9 K  @
NX表达式视频
9 d8 N$ ]# l( B& U* }4 s& J, y
PLM之家表达式专题视频-5 条件表达式4 O. ~" ~# p. }. h% G: O0 R4 g+ t: [

9 S- ]) P0 e5 E* ~  L+ D/ Q# ^
NX冲压分析可成形一步式视频
8 V2 e: ^+ s6 L; g

; c7 ~3 c3 M: a9 ?+ U) l" |
NX产品模板工作室PTS视频
2 产品模版工作室界面. S4 ?: O5 a, k* e7 K3 t: M$ b* J
3 创建一个基本的模版
" U% x0 P7 e6 f3 _/ U- d6 e, @
4 PTS高级模版技巧
7 h7 D$ c. [9 L
5 PTS添加需求HD3D+ T# O/ ]) ]# Q: D7 U
6 添加装配模版
8 h- J: F2 y6 S# T6 x( F$ T
NX高精可视化HD3D视频
2 B% o% ]: z2 @, A% c) m" o7 ]$ J
2. PLM之家NX全息3D培训-HD3D基本使用9 H; B8 P* r5 W0 B  f* [+ c- y

+ m1 q3 @4 Q! Y; e0 p) V
NX模型检查一致性check-mate视频

7 L' ]4 Q0 p$ K2 n1 Z8 t4 T" T3 e/ [/ c5 b* H
NX入门视频实例教程(8 小时)
. ?# |1 R- S. {% q/ a. d. j
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

- D1 R* d/ p9 V1 D7 r% b' a* c7 X
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
5 Q* m1 W; r, T" V& T/ z
其他重点咨询

6 W6 k0 Z" m" V* ]
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

0 s" X  P( {4 {. N3 P5 W9 B0 Y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了