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

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

[复制链接]

2022-6-1 14:33:25 2471 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]/ w1 G% `- k$ X0 d' q
// tag --> Object
6 e+ E5 J4 y6 ~4 n//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法  ]) a$ V  ~% @* }" R: J0 C
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))- ?& E: F( x% K2 l0 `5 E
// Object --> Tag+ n# ~/ z5 S* K7 \1 K" f% {
//直接通过对象的Tag()方法获取2 i) X) T" q; u8 T4 ]
tag_t getObjectTag = getObject ->Tag();" `6 t9 }/ o, p. T
//tag-->handle! ^( B+ {+ x: T! }) T% R) T
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());, Y7 {" A# E. ?0 T
// handle --> tag / f, B* \' w9 ^' Q0 O; Y. ~
// ... 往后看....7 f6 v6 p1 o9 @3 ?& l. p* j2 y
[/mw_shl_code]
. g( P, Z% r; O' I, \/ {; @
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

& p7 @) A7 b* v
这个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]
7 _$ T5 N2 V0 W: ]+ H# ]5 l5 M/ B  \0 K1 u# Y
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
" Y" j6 C3 j# \{
1 b% P" b, c# a: R: N) `4 Y  stringstream ss;
9 p+ Y' w) i8 J8 y9 ]! z  ss.clear();
8 y# o3 _2 I# J% A  unsigned int( O5 K' p, C2 o% W5 Z, B8 l! @6 t
    ID,7 F' Z) e7 S$ O! ?/ N' y$ N/ R! _
    version;
2 B# d- k0 w+ y( K. F- t  char
% `( I/ Y! h* @, i5 o    * file_data,* ^6 T( L9 L/ P7 [$ V/ J
    * handle,
  v4 s4 _- I* o: _2 k* H    msg[30];* o  k$ C5 h! `% ^% P7 A  g* a7 c
  if (objectTag)
* z' G7 b; S% v  {; g! \+ N) V' H, x/ q4 s; q# A
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());8 i* A  c! r1 |
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());9 p/ D$ w- s" V" ~/ U1 l
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);0 _. Z7 ^& \4 j2 U' R/ u6 F9 D
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
4 A, I: S) y' l+ n+ o$ ~! j    ss << file_data << "_"<< ID <<"_" << version;$ [" H$ v8 `* X$ A
    UF_free(handle);. B) ~. v) G0 V- o
    UF_free(file_data);$ O5 P# n8 ?6 \) s$ }
  }
2 [  ^5 x6 ?+ n9 v( m, W; c8 v  j
: s( d4 \) J5 B  c& @% K/ ]% _  return ss.str();
/ h: c( t4 L/ D# M1 D& 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
+ j6 q/ ^2 c+ L+ V1 a
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)( F4 ]# _1 _" ^
{" ]: ]3 X* O& C  T% D% W
  vector<TaggedObject*> getObjects;
  Q& D6 {) d- t- `, k( a7 v# v  getObjects.clear();
, L) K0 H5 ], _7 U  \3 M( `. `* d: S6 |  ?% j' M
  string attributeName("");
$ B8 x" N) w2 ^2 a: S6 I8 `  string attributeValue("");
; @; [' a! k. r: T) j  vector<string> stringArray;
* S1 V. n- e6 V$ f  stringArray.clear();, z/ @$ ~( n6 f! f7 y1 T
  //get the attribute value / B1 p5 ~5 k: `" j
  // get the attribute name ( h  t, ]3 `, A: d, l

1 A9 P: U2 ]4 A$ S  attributeName = GetAttributeName_FromType(typeT);
# h" ]" w7 ~; i' K# i/ [/ j7 F  if (isStringEmpty(attributeName))
7 J/ E; q+ U' c' A) }& D1 {  {  B* H7 [4 x6 H0 X" G
    return getObjects;* L& A  m/ Q% I  r  k6 N3 }
  }
: o! Y0 J4 ]. ]  [) z  //get the attribute value
2 T+ d6 ^+ O4 V4 `' V- U  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);; K5 R5 F" J- U# P. @1 l* \
  if (!hasAtt)6 q9 f/ l: C$ ?  z. Z9 g! e% Y- J
  {! N( K& a$ p' X7 R
    return getObjects;) t) w4 j& G6 n2 {
  }
0 z. m: p1 D5 C) w+ g0 t7 h- i* k$ m% n- w1 s! J7 J# c$ J  w
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();: @1 b' u. W* I2 i4 e
  9 F' K2 `. Y7 E5 [: o9 c/ W5 V
  if (isStringEmpty(attributeValue))
1 W# b) E( B! g. y  {
/ H" B2 z- m& F0 a. D# G: k) h  M    return getObjects;, ?. J9 R& z% Z; @
  }. K) n1 Z8 ^+ v; w( C

0 @2 h1 t/ F4 i6 }* I
, p+ ^9 C0 p: r: `; n+ S  //get the key based on the split value * C; y: u1 F% P! b) k
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
  c. V( T, j  K  for (string item : stringArray)5 A6 h( ^3 @  r8 ~" f
  {
, ?% m5 N" `& B    //read the string to get the object 6 ^' Q  Y7 Z0 j( Q# g& n1 @$ {
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));7 I* ]+ [1 L6 [1 n9 l
     
& }. \! l, Y( l/ m     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)" o1 P% [5 F4 q) m$ v0 h3 s" q
     {
- t4 w( m1 \+ n& r4 f( h( I       getObjects.push_back(tempObject);
3 n3 i3 ]. z, @$ u1 i     }# U" M2 r/ ?; `, V+ P2 t
  }
$ q" `  |6 P1 u, o
3 D4 P7 F  K& D" b% L2 B4 ]  return getObjects;$ g4 ^7 E7 Q$ g2 z
}[/mw_shl_code]3 v: d8 Z. v9 K& ^0 W

; B/ X9 M" i- o0 v, ^
0 O9 C+ Z2 f$ ]
+ o3 J$ }, N6 B+ p
更多实例视频和专辑课程陆续分享!
, E2 K1 H) w3 A2 w4 k* K; r
2 m1 i" d1 y: Y2 V- H
欢迎转载学习!
( X: o! m( b2 @4 S, T  O* [- Z; H
更多精彩内容请关注PLM之家
http://www.plmhome.com
8 ]/ h6 R2 V# L4 J2 b

: s6 ]! y+ i( w' J% }' s; S
7 e, o; e2 p  |, ?$ M

* Y4 t# U" ], G. B0 v( ]* O4 p
END
PLM之家plmhome
7 J5 o6 O$ g! b* ]2 [5 N
                               
登录/注册后可看大图

* v- i9 o7 G# [▲长按二维码“识别”关注

/ j8 C0 T4 m7 `, I5 t- |3 o( C
6 O+ w4 R* o9 w
~~~~往期经典文章链接~~~~
( V' b- @  Y2 L* j$ u
NX表达式视频
* ^+ s1 O0 X, K: a# D% R2 U
PLM之家表达式专题视频-1 表达式概述. ^. D% P6 a: }2 ?  i8 e* B/ A
PLM之家表达式专题视频-5 条件表达式6 r  G+ @; g' ^3 i" q+ W) K* b
/ X5 k4 W* p- o+ a
NX冲压分析可成形一步式视频

# W" a* t7 Q+ E( q2 M3 q2 z. g1 W' r$ Y! y2 G" v
NX产品模板工作室PTS视频
1 产品模版工作室概述% ^: B: N* z! ^  W% C$ U
3 创建一个基本的模版, P, g" R2 K  H3 Y3 Q
4 PTS高级模版技巧
7 Q1 }" A$ I3 P' C0 A% }* q
5 PTS添加需求HD3D
' l$ T) B) k9 }5 }! u
6 添加装配模版" O. ?5 a& h" E& A
NX高精可视化HD3D视频

3 w4 Z0 `) I0 j4 k6 X
1. PLM之家NX全息3D培训-HD3D概述1 Y7 X" \3 \; \* q- Y& b* y
& ^- V3 S. G4 w" ^
NX模型检查一致性check-mate视频
' c. Y  U$ K$ |" o8 v

8 e( v: J% y- o. t/ |- ~
NX入门视频实例教程(8 小时)

$ h  g9 Y' J3 T$ P  D' g
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
% y4 {' B5 X) e
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
( T( K$ r; v! I* w
其他重点咨询

8 }! q& L# f* {$ C+ S
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
5 t/ \3 h9 u3 k2 s! I
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了