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

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

[复制链接]

2022-6-1 14:33:25 2828 0

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

积分
82170
QQ
发表于 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]
  v* n5 @, r1 j# F3 ?" F// tag --> Object
7 ^* h2 H: m2 {8 @# f//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
2 R% o& C3 N9 W$ _TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
1 i$ d2 J7 C' d0 }// Object --> Tag
  H7 Y+ V- x* L! ?: [. \8 D9 u//直接通过对象的Tag()方法获取8 ~* H3 m& W- V7 v
tag_t getObjectTag = getObject ->Tag();6 F( u9 T* u, H! r* j3 p0 C6 j: }5 q
//tag-->handle$ A' j% j. k; b2 v$ Z) R, l
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());0 F! X" @( w7 z* v/ e& d5 C
// handle --> tag 3 c$ t5 }% r  F% N9 Z8 h! [
// ... 往后看....: H2 Z& W8 N/ @6 s
[/mw_shl_code]
- t) H: V5 v- l4 i/ {0 }7 Q! c  j1 t
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
5 s% [% M/ j% G9 H$ x) H4 D; e7 P# b
这个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]
' b" b: N. O" F
+ C4 `3 I! @4 ]+ y7 H6 nstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)( U% y( \( y5 u' I* z& E
{
$ m7 U: F% _) P4 B; Y: W  stringstream ss;
4 D0 j+ Z5 }7 D, u$ e3 c. P4 K: _  ss.clear();% u- m* R4 k+ B& i9 I
  unsigned int
9 J$ i1 b+ E# v! g, U# n" d    ID,
# A# v1 O6 O; U2 _    version;
# }/ H+ }" Y4 ~) A" q  char
  S9 t) m5 u6 c8 z0 h* |, U    * file_data,
, s' r) ]# [) q+ ]8 n" u" M    * handle,
6 P: g# f: K7 ^6 z    msg[30];
* S+ w: r7 V- Z0 W# w& R; X' U2 [  if (objectTag)' c) |+ D4 H& E5 h: K
  {
4 d% p6 k+ o4 p; s% T  ]    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());. C% k1 X  \" Z+ \6 N5 E/ @$ e  |
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
" P2 Q' S3 n. y5 B3 D    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
2 \% |$ `/ P1 c    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);' d  A$ z! D- n" S  l: w
    ss << file_data << "_"<< ID <<"_" << version;. }: }3 ~, _* S* `' J
    UF_free(handle);" T" o) z' X+ X  H
    UF_free(file_data);' b4 {4 y( v/ J" h3 L0 r
  }
$ \5 l' T. k' @/ o& N' I/ [  x3 H( C" a8 k1 o3 g+ \: K
  return ss.str();5 ~6 f7 `" U. _2 r! g  E( P( |# t4 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

+ }; S& Q) T0 I/ r
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)0 b6 u6 k4 c* C* i$ Q
{
, T' c! V/ |' y  vector<TaggedObject*> getObjects;6 x% i( q' a1 Z1 e
  getObjects.clear();2 T9 D: L) f; L" K0 ^# p& o6 p

8 {' K/ A" }  R, b( @  string attributeName("");
) |3 V% E- J! N  string attributeValue("");: F7 `- ^" W% G+ L; L5 f
  vector<string> stringArray;
5 T+ O- A# c+ w$ l( F  stringArray.clear();
* d6 i. x* v0 ~0 O. u  //get the attribute value
; H& s+ @& @- R3 ?1 U# P# i3 Q  // get the attribute name
6 e$ w; x- N' |* M1 m4 {; ^3 B4 ?/ e4 v  a  ~0 g
  attributeName = GetAttributeName_FromType(typeT);. l  j" o+ S" y7 e
  if (isStringEmpty(attributeName))+ ^, U1 T6 ~& p/ }. n! i
  {
% r: G; n4 Y2 O6 J2 O    return getObjects;
2 w: a$ z1 E% a, I  }
- {9 w* M) m6 \) N+ s; L3 a  //get the attribute value 3 |& T, I9 M7 `  L$ P
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
* ^5 F( K+ C' a' ^( v  if (!hasAtt)
5 Q3 e  O; S# @, L  {
. x9 u8 T6 W/ R# n    return getObjects;
1 z8 w" }9 R, L8 N  i  }
) Q- P9 }+ ]2 N0 ]1 w
- [/ @5 K3 m2 h' P' w3 p/ _  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();- e9 T' e5 B- k6 M& P* Q% X0 U
  4 N3 f  Q% W2 Q8 f- S2 h! u5 M; u
  if (isStringEmpty(attributeValue))" l$ S* t, a& D: E! T
  {
4 @- A' o7 }6 Q" b4 y* \    return getObjects;7 W( V$ j$ Z6 M' `- ~; K1 N, J
  }
. ^+ M7 d7 z  u0 ^( j2 X9 Q) a8 i, R$ j: h1 J! ]

" ~/ d. D4 a- U  l  //get the key based on the split value
: ~7 R7 |5 M( J4 J  q  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
& ]5 ?# f8 S4 g/ J  for (string item : stringArray)8 L# k; @, W: p! x4 H
  {
$ |* ?+ o6 U, s! d/ ?    //read the string to get the object # t) h; f. }, y, I& l: D6 ~
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));* m% a5 \8 V; D0 U& w2 \
     * J% H- z2 Y; l% K  ^6 n9 V
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)- l2 j2 u  k# m8 w  U
     {: `9 ?& R; H& m9 H
       getObjects.push_back(tempObject);
, o- _# i2 N, O% V7 m7 L  T     }' x, K5 G. j7 L( Q
  }8 v6 M# z& y8 o* _. I% Q8 e* W

( n3 F% j$ s8 Q$ ^& |  return getObjects;9 p1 L: |/ M( |7 s
}[/mw_shl_code]
1 H$ i- T6 I, z; @  q0 c" @, A2 D* m( L4 |3 q2 M
4 w1 W' _+ a- ~6 ~2 C6 C

5 Y1 U% ?9 c* A$ ]& ], b
更多实例视频和专辑课程陆续分享!2 G2 b' }( }( o. A+ [0 Q
0 K& u& l  X+ [
欢迎转载学习!

! @# F' e  v7 R6 V  R" T
更多精彩内容请关注PLM之家
http://www.plmhome.com
& J$ s: b- _0 k; g1 U$ ]5 W


  ~; @2 w6 M) v$ f- m
5 i% `* _) M- H( P6 X) S# N) ~: N2 {6 P
END
PLM之家plmhome
1 c3 {" A$ M* m" X8 v! f2 x& [
                               
登录/注册后可看大图

3 ]2 W' ]  T4 j▲长按二维码“识别”关注

6 I7 v5 T$ |- \% Y. ?! ]3 c* R; {! {  o+ Y# Y  u* \  f
~~~~往期经典文章链接~~~~
+ b# z! i5 X4 p0 n& u3 g
NX表达式视频
8 d2 `2 ]/ U# o6 ^; v  N- @
PLM之家表达式专题视频-5 条件表达式9 |5 W8 g0 f$ h- Y  O; }4 w! K

* O4 Y/ ^. \& a: ~3 k( K4 l# S
NX冲压分析可成形一步式视频
6 T0 K9 S6 \  Z; C/ ^9 f& F
* e$ w* P" k# x5 ]8 Q" A, X+ ^
NX产品模板工作室PTS视频
1 产品模版工作室概述& ^& D' `8 ~7 l) c2 D; m
2 产品模版工作室界面* Q2 B+ @/ n7 y9 w4 k
3 创建一个基本的模版8 j' A  A. ^0 W# W+ N! p9 Q6 I8 \
4 PTS高级模版技巧
) p5 `$ b7 f. X. {0 R% \
5 PTS添加需求HD3D( I9 X( J8 c! Q8 n7 w( U, q# U
6 添加装配模版
: \( `* l" L! T/ G5 ]
NX高精可视化HD3D视频
' O4 J; T& B/ C( @
1. PLM之家NX全息3D培训-HD3D概述3 t7 x! p* s. a7 r- G) L  l7 ]
2. PLM之家NX全息3D培训-HD3D基本使用2 y) N9 ]5 P1 V7 }2 b) i- _* z
- _& D9 _2 P& C0 ^1 w
NX模型检查一致性check-mate视频

8 v3 r9 e; d- e' {0 l, q3 [* F" G4 d' H
NX入门视频实例教程(8 小时)

4 ^1 o( l8 G% }  x8 B4 m6 S
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

, P, a+ s& C7 }
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
7 k; q  B6 A% W3 d0 K1 V
其他重点咨询

; H" G" Z1 \' P( T$ \) z
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
8 u2 Z$ I2 b/ y& _( g
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了