PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

2022-6-1 14:33:25 2736 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]3 Q% E6 R) z4 d0 s  |
// tag --> Object
6 L' Q( I. h! N' O+ @" S  r//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
2 W# b" s/ L# B: e4 R( U  i* `; k. MTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))5 v! n! e- X9 @, `$ c8 s
// Object --> Tag
1 Z. i: n* V, V( T+ q5 ]//直接通过对象的Tag()方法获取# a7 f6 B9 a; ~
tag_t getObjectTag = getObject ->Tag();
  w) P  \2 _# w6 G! n6 {: `//tag-->handle( G$ o# g& i. h7 p4 e
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());4 t) a  o2 D5 p; W* L
// handle --> tag - I. K5 J. q4 R4 F0 a/ U
// ... 往后看....3 J1 r" |' K3 g
[/mw_shl_code]3 U8 f: U) s& e- g- J9 x
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
7 @2 d; n4 E* p1 M" u, g
这个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]
; ?2 \7 M: O% y: [1 B7 x! e% G
! l1 T4 g* C. J+ k+ Pstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
% d" k  L* t3 N. s( w{
8 V! R% E) j* i5 a  stringstream ss;1 v( P$ }2 C& k- i1 J9 Y/ E) G- E
  ss.clear();
& W! m/ f& g+ U( t+ P  unsigned int
- K. r- Z, G$ s) C9 [    ID,
3 l- A6 b8 }5 ?8 m# D" J: x  e    version;
6 _+ }9 P& U* W2 T/ K7 m  char! Y( ], t. k& e, t! z
    * file_data,
. Z' c4 h, b5 N. c- |, \6 s    * handle,: U% D% Y& I4 Q( F
    msg[30];
0 R6 N* J: O0 p  d" k1 R, B3 {9 J  if (objectTag)
7 ?1 s2 F/ R/ @3 M# E) @5 |) W  {# V9 n/ g/ Z5 M' H/ T3 U; o- x
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());, d1 k! H, Q5 V  U7 Y
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
  v- b0 w  e7 i    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
# y) ^7 _' P# |/ V+ O5 n  p    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);$ u  [& B2 W) u$ F# j$ |
    ss << file_data << "_"<< ID <<"_" << version;! C: ?# J3 c) C# u7 n* M1 y' M
    UF_free(handle);' h1 H4 i* K2 j& {) G
    UF_free(file_data);
: S" A& j1 o  Y5 d3 Y  }
, D/ E- |5 w4 h9 y6 V- \
: f* b! q" ]! u  return ss.str();
8 g5 @# A( |+ m/ g6 P}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
! ]7 q1 b* U4 \! D1 j$ ?2 D3 {+ `- ^
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)  ?" V5 S8 o, \( d
{. d1 ~$ y1 @( d
  vector<TaggedObject*> getObjects;4 F* h) b/ }4 \+ q1 t
  getObjects.clear();8 h) }. {0 U) A' X, v
6 p' l9 L9 |2 w, X! R1 u6 ^! l5 w
  string attributeName("");4 u9 V; s, f9 X4 P) _9 A% o
  string attributeValue("");
. b4 a3 o9 V7 W4 B$ U) z  vector<string> stringArray;
5 w6 j! y; H: G& }! J  stringArray.clear();3 }* |- O6 r% f" N$ _
  //get the attribute value ' m4 y6 t7 i$ u$ K  P; W
  // get the attribute name ; p1 w) d7 J% r1 M
) _" R" x* T/ _: Q* H' w
  attributeName = GetAttributeName_FromType(typeT);: b! ^. ^7 G( R; P
  if (isStringEmpty(attributeName)): z' {- C/ n5 j8 L: k
  {; }4 P& a+ H" B4 r1 M( A) v0 ~8 A
    return getObjects;
2 f+ i7 |9 K3 }( p( @$ N  }
* R- _8 j& C: E9 ^* w1 v  //get the attribute value
$ R( ^; v9 u6 ]2 _% r$ C+ A  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);) ~/ N  i; E0 g
  if (!hasAtt)- K8 F% ~5 V- k" d- ^$ \  t( t
  {
& @3 z* r" C) I7 N, z    return getObjects;
: t! N* [* Z. a3 R/ }" ]  }2 C& @# ]" G. |/ z9 C3 V

" K! u; o1 v; S  F, x2 V  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();, A6 V+ x# V) }) H  ]
  
  {$ _) E4 y9 t0 q5 D$ D. ~  if (isStringEmpty(attributeValue))( e0 B8 d0 x9 y1 [1 F
  {
# u8 l! W1 p$ \    return getObjects;3 a3 ?: x- W. ]# N7 R& o' o
  }- [/ B! Z6 r2 C6 Q* K$ s6 e+ Y
2 {# [; E# P8 r1 x3 J

5 L; j2 v) j4 A0 v9 F* _6 w& i; H2 m- t  //get the key based on the split value 2 ~, i& V, d( W
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);( O. P; G' C: M2 e% c% A1 {% R
  for (string item : stringArray)3 t) z9 D% a* X( p
  {
7 D/ y/ I, w2 J- V/ Z# U6 h    //read the string to get the object 0 Q4 Q) @) \$ A; k0 r
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));3 h$ D: ?. [7 f$ v, V
     
" z# H( I4 s3 r6 z. ^     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)' o" [- W2 O# e$ c9 Y
     {
/ s$ n3 d5 k/ u, M, v  V       getObjects.push_back(tempObject);7 ?+ w/ I0 \% z, b, x$ r
     }/ U: V# ~/ n6 {, o
  }
) N# C, M5 }( U, t3 \6 {: M& q: o9 L6 N4 ]/ D" i  j
  return getObjects;. q+ x' \1 c5 n4 T5 t
}[/mw_shl_code]
  X1 f: }, W2 b, ]" ^1 w3 d
8 _# Y: Q: H" p
8 I) d+ _9 h/ c0 F
6 Q+ R9 E4 a. V9 m( T3 }
更多实例视频和专辑课程陆续分享!
4 ?) r9 v  m* C
4 K4 o: x: }- f3 \; g; p9 f4 ]
欢迎转载学习!
2 I/ D9 G% }- d8 `6 h
更多精彩内容请关注PLM之家
http://www.plmhome.com
2 g! x9 m* [7 k) P  h* x

" m  V( _' V( ~) n8 g) j- Q
* r' [) a# C' [3 K+ [

4 c- k, W" L" @* d7 g
END
PLM之家plmhome
" c8 G/ x0 u4 Q. ^1 X+ C6 q2 ~9 S
                               
登录/注册后可看大图

3 y, e# s7 j' |( D( k▲长按二维码“识别”关注

' b6 \- h7 m- i/ v3 ]& g. j6 n. R# p- j6 ^. {
~~~~往期经典文章链接~~~~

( S; ]' v0 U7 u& S0 G& z. W6 H. _
NX表达式视频
& E: X( g' |! K$ A
! \8 w" x6 a& u# f5 T/ r- ]
NX冲压分析可成形一步式视频
  Y5 ?, J( H" T; H
8 N9 N$ n$ {+ ?; ]% a, S
NX产品模板工作室PTS视频
1 产品模版工作室概述! f- Y5 Y( {1 ^# f- ]9 x& j
3 创建一个基本的模版" Z! J$ U( L( n& s" A" h
4 PTS高级模版技巧
- Q, L+ F* d8 u0 t* s: F7 b" E
5 PTS添加需求HD3D
# c3 e$ J; a' M* c& X
6 添加装配模版
8 p3 n! v! n# w) D6 h2 t; X: E; h
NX高精可视化HD3D视频

0 d* I3 e  k) ~
3. PLM之家NX全息3D培训-HD3D客户化展示
5 G, z6 ]2 o; i# x" n, H% M4 C* x
4. PLM之家NX全息3D培训-创建HD3D
2 p' k1 g  S/ W: v9 Y  ~4 Q6 R) c
& m, R5 @9 A* y+ s- v: C7 f! Z
NX模型检查一致性check-mate视频
& m7 S" g9 v3 b5 o+ `. h" L3 i

0 d/ \. H; d) i4 x
NX入门视频实例教程(8 小时)
7 ^7 m" h4 a, \/ k% A
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
$ P6 q( r9 D4 T3 T0 M
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
. x1 B1 R: Z+ G$ q' F
其他重点咨询
' L: k+ I* i* a4 g
工业互联网咨询:
工业软件APP:
数字化转型:
Gartner发布2020年十大战略科技发展趋势% C; n( n+ x) A( y: [/ b5 S7 A' k
工业互联网技术栈:

5 B7 w. o1 L4 }3 a7 D! [
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了