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

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

[复制链接]

2022-6-1 14:33:25 2827 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]
& T' n5 ]1 D  h8 s// tag --> Object
' k. \# P! ?! b6 ~//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
5 ^6 G: s' n$ I, _/ N5 u4 {' [" CTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
* H. P: k2 w$ `/ D// Object --> Tag
* A  Q1 G/ `% C. I//直接通过对象的Tag()方法获取$ j/ q- m9 [  m) T! l
tag_t getObjectTag = getObject ->Tag();0 r: ^$ H. ~& d* z! k6 V
//tag-->handle; F* E: o/ V6 C+ W9 J- X
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());( r- e( n7 }, g5 W" [
// handle --> tag
( f1 b, v9 h, j8 M8 R5 ]4 x/ |// ... 往后看....
2 R2 O5 X: _" n- V# h. x" }[/mw_shl_code]. A0 F/ ]" |8 r9 U% V
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
5 K# H" |2 N, R5 a
这个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]
) `3 L* c6 A% {8 R& x1 c2 W+ S/ f% ^, X
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
6 d. U5 ]/ m+ }9 @{
7 f: p$ P% V! U  stringstream ss;
. T' M8 L" w& v  ss.clear();
: f/ m" F& V& I8 M. f  unsigned int$ K2 r) F3 j" i+ ]
    ID,+ A) j6 z" k& w/ o' q
    version;
, ]  u  d! Q2 G" [$ d7 Q  char* A3 F( Q9 Z2 \. t& L+ R9 ?0 H
    * file_data,6 p: A; A. T9 n2 s# D, A
    * handle,; r& F( c/ }8 [& D+ `2 N& T. m
    msg[30];2 `6 y' Q  G# k8 s& S* Y2 P3 Z
  if (objectTag)
0 q6 j/ u& x4 `  {
: d# i8 Y6 ~0 ~9 _6 }: Z    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
9 U( y0 P& [7 n* D: q# V. g- F( F    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
$ ]0 y- R8 y0 q% o# ?    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
; p0 o" V' [6 i+ e. O) d    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);% Y6 v9 o; H( W' Y$ h' N4 `
    ss << file_data << "_"<< ID <<"_" << version;
2 ]$ w2 ?2 j: |, J* P; U8 ?    UF_free(handle);; p. l7 Y+ P/ R/ O
    UF_free(file_data);; b8 X3 L0 E9 s6 X8 Q( I& U0 I
  }
# h( N7 k2 |# P: t2 s- ]$ }/ l# P$ z" j! m9 M& n/ q" ~
  return ss.str();5 M3 E" ^1 z1 A4 Z4 s0 `& \
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

& S0 s' Z2 L" H. a9 h0 f
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT); B! y4 c+ U% h- v, R; P
{
. S* m) n; f* [( S+ ^8 A+ t+ \  vector<TaggedObject*> getObjects;  n3 R, j5 U+ m
  getObjects.clear();  E  P4 b' u6 Z) |9 [
& \* p7 b8 P% Y4 j
  string attributeName("");
  L* u2 W! X/ [2 R: n6 r2 [. `  string attributeValue("");! K  s' g7 |' n1 d4 n
  vector<string> stringArray;1 [( B; T) W/ |$ v! T, t
  stringArray.clear();( _) o3 J/ F. g& W# R
  //get the attribute value / c; `2 ?/ A( U2 j
  // get the attribute name
! M7 r+ x- {+ \: K# z* r! u( f7 ^, ?0 V4 C. G' R
  attributeName = GetAttributeName_FromType(typeT);
  S; `% k3 F4 R: X2 N) P  if (isStringEmpty(attributeName))
4 Q; {! P$ Y- J( d  {$ G* e$ e/ k+ G8 v1 C
    return getObjects;
- _  c& V$ r( {. }* j  }' s5 v6 B  Q6 ]! O' ]! F
  //get the attribute value
  N2 K4 m) b, I9 w' r  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);+ ~, J1 U' U7 u! }
  if (!hasAtt)
( m3 K  B' N* W  {' Y! J" F3 N4 Z& e3 J; D- c
    return getObjects;
" k+ ^2 l, Y1 f7 ]: E# f' ]6 d  }0 Y$ f  ]% U5 j4 F1 _

/ I  Y0 k  ?8 t* @" s1 J  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();6 _3 C8 {' ]; f1 k# d  \
  - E% l3 O. L6 E  c! C) u- }
  if (isStringEmpty(attributeValue))# O: [' g) S1 M; m
  {* J# |" ]. w' c/ Z- w# y- u: Q! H
    return getObjects;
* y8 T; ]9 J' T; Q6 N, T  }3 x, j& f3 h+ [2 D
, B$ `: f4 j& w1 R$ F

# z+ a$ Y$ o& z" p9 v8 p  //get the key based on the split value 9 C1 M! W$ z& i0 C5 Z
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);3 W* l# x" g( C9 u+ a& _
  for (string item : stringArray)  r# C4 I4 Z% n, d' F% a% ^
  {
( f  _: q( I; ?7 b& z/ }7 G, Y    //read the string to get the object
& y/ ?1 o; c) ^+ U. }     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));" L1 T5 V3 X, R
     & _9 B, v( V6 \; w+ A) J2 [! F" J
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
4 e" P+ l7 p, O* C2 L. V9 }0 J+ j     {
3 v4 o7 H4 o% r5 f       getObjects.push_back(tempObject);
1 t1 A) L0 g4 t  M0 G+ K5 z% l     }$ A/ o( |$ M* \- ]$ I1 M
  }4 E; @0 l! J$ N& x6 V
. T9 j: ~. I! W. S7 U& D
  return getObjects;# C) G; q6 i& I, M* ~) A
}[/mw_shl_code]6 N+ I9 K% P" \

7 O- M$ `! R7 i
% v5 V, u  I8 O. U: K( v  ^8 H; q1 R9 @; o
更多实例视频和专辑课程陆续分享!
2 P/ S) C9 `8 w
9 g) V" y( t7 q
欢迎转载学习!
3 J9 ~2 Z& O& O9 J5 I! V
更多精彩内容请关注PLM之家
http://www.plmhome.com

, I( E4 E  f! _0 J
, f# P( V/ q2 V9 j& j- W2 _! w

9 j. h; M( E  M4 y) `6 B7 T- y6 O: Q; H% p8 L3 A
END
PLM之家plmhome

, \3 e9 T% v: s1 t; |) G& M6 S                               
登录/注册后可看大图

& U. O8 ]' z1 m, T/ {+ \3 O( {▲长按二维码“识别”关注
& c" m/ ~  [. g9 w

; n' [5 K% `2 B5 L3 {
~~~~往期经典文章链接~~~~

/ y; H$ c3 v0 \: F
NX表达式视频
% B$ Q! Z0 V: {4 i
+ b" S8 a- j2 w' Y" W% c
NX冲压分析可成形一步式视频

3 }+ ?# G4 z' G6 s% a
2 _5 h+ D1 [0 G: a
NX产品模板工作室PTS视频
1 产品模版工作室概述
4 y% w5 r% X  L3 `/ ~: D6 n- c
2 产品模版工作室界面& j- O- n. q# l! h. W* `
4 PTS高级模版技巧2 S; `+ X6 Q9 X+ J
5 PTS添加需求HD3D1 h1 m: V6 M1 B
6 添加装配模版
6 t9 _# X+ W* n" m1 ?
NX高精可视化HD3D视频

2 C; e1 f' g. O* {) o8 c
2. PLM之家NX全息3D培训-HD3D基本使用
! j  v& s) [5 k) n8 m7 u; o

3 J( _6 a* t: e) S( q8 L/ F
NX模型检查一致性check-mate视频

4 C. h$ O" b: \' \9 A
2 F' J1 p4 B$ }7 r; y5 K, a
NX入门视频实例教程(8 小时)
+ c2 S7 Z8 G5 {* x. x4 `
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

) s* Q$ N5 Y5 {6 N+ p& z
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

' X1 C" E/ S, v# ~/ \7 O3 M; {其他重点咨询

9 {# Y, @) r; R  J, n. z
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
" r) l  }5 M# w% i5 W! h$ X
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了