查看: 2944|回复: 0

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

[复制链接]

4

主题

3

回帖

44

积分

管理员

积分
44
发表于 2022-6-1 14:33:25 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
Handle 返回对象标记的持久句柄,Tag只是当前文件保存的一个临时整型数值,TaggedObject对应的是对象指针。三者转换关系如下:
这里假定变量:
TaggedObject * getObject 为 对象指针;
getObjectTag为Tag类型,
handle为handle类型,
直接通过代码看:这里选择了一个体,打印下结果如下:
640.png
[mw_shl_code=cpp,true]
2 m7 G* D. P$ Y3 x& w1 |// tag --> Object
. p2 }- L- [$ w- K$ F//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
" O5 m& j) q" z2 B2 ?4 nTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
. Y0 w* ], t2 v* d, J// Object --> Tag5 `0 P, m7 c: M1 N. |
//直接通过对象的Tag()方法获取5 A( D0 j0 a: H/ a* n: `
tag_t getObjectTag = getObject ->Tag();4 Q8 \4 c" ^7 J2 t: x, Q: f6 a+ r& i
//tag-->handle$ \6 ?( \2 ^( D& `
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
- k; d- D3 h) H, M* }# W  V) R// handle --> tag ! O) j( |1 i* F" ?# M
// ... 往后看....( q7 L1 U6 x8 d0 X; `9 C* U
[/mw_shl_code]+ ?( E6 t* U& }4 @7 K6 t# t6 j) A
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

3 h2 q5 i& C! h# x! _; z% T4 k
这个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]
9 w7 B  o4 W2 f5 m# W. J5 g- R
4 \3 ]; Q9 j. }0 _2 [1 Cstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
1 p/ ?$ {  @) L" A{6 w" \9 N! P( l1 a  |
  stringstream ss;3 y. @7 D9 a: O1 X
  ss.clear();5 V+ X) x$ ?9 J% k
  unsigned int
1 a. T! I( b* @    ID,0 f* X/ G+ t5 k- r3 S
    version;
1 r+ r, b5 D1 D5 c5 F: l- R7 @  char6 b1 x( h! k) W7 _6 o5 b$ `
    * file_data,$ Y$ {& B6 c9 o* ~
    * handle,  f" N, Q( r  m+ x& z# O$ b
    msg[30];
9 k! s5 O$ `' x& x' i5 O  if (objectTag)
1 i$ i5 B7 N/ M  {
' P7 {0 D8 k0 \) }8 b8 y9 w  D    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
- G) B* d7 v) u- Y; X    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());' m$ g% D8 ^; |7 F6 k* B
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);2 z6 N6 k! p6 [  P$ i9 H# a0 i' P
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
& I2 w  O+ t' y8 g    ss << file_data << "_"<< ID <<"_" << version;
1 p& w# e2 U: n) Z% l    UF_free(handle);& r& J# _" T; Z0 ~
    UF_free(file_data);/ g( R: c: p; s7 ^
  }
' P' y$ u: E  d4 S' g/ y7 s1 J1 S/ a6 J; S7 u' C, @3 e/ P7 X
  return ss.str();( r" Z$ c5 @6 H6 a& ?4 _7 V& z4 ]
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

, H# l3 u/ ]0 ?  |& {
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT). h$ t6 |& W( ?8 A( C6 |6 }' I
{( t) m! G4 M8 r( f! F
  vector<TaggedObject*> getObjects;8 o) p! z( D* \: [, w- n$ f7 r
  getObjects.clear();7 o4 [# K# [  z- U8 j

' S. ]; Y% {4 v% B  string attributeName("");
2 Z6 v4 _3 m* L6 `# b, \, a" Q! F  string attributeValue("");; D4 F$ S# N1 p& ^9 u
  vector<string> stringArray;
% b% j" u( ^) A( w( L  stringArray.clear();* s, Z/ i% K+ H' R9 h: p
  //get the attribute value % P: r# a+ i/ H9 z6 d
  // get the attribute name ( k) r- W: G) l+ O9 [

$ l, z( x2 p6 Y2 U0 @, P+ n$ K" O1 |  attributeName = GetAttributeName_FromType(typeT);/ `* `; ^  [+ h; ^# v- L( N
  if (isStringEmpty(attributeName))6 H9 B' V$ l) W; u
  {
- m! p( W3 ^) f3 I    return getObjects;% v6 j# \" P) C, F3 ]3 l3 d* n3 f
  }7 ^' I2 i  C8 L4 L
  //get the attribute value ) u. u- o4 m' a
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);6 c0 g8 P4 j* x
  if (!hasAtt)7 b/ S4 `& ]' n, U  K0 v0 x5 f
  {. ]  N# D( V8 C4 N* [
    return getObjects;; l' j$ v* ~5 m* T: U/ N: K
  }
; a! ^1 B* {( r! ~1 l  m; h0 u1 Y5 w/ p% `# Y
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();# s+ ?# Z; D* @% u) ~$ }
  1 I& D4 @/ }+ Q4 H7 t
  if (isStringEmpty(attributeValue))
6 r7 `$ C6 d6 E7 y: S; r  {
  [  y- g# W( O, I7 W% U    return getObjects;
* w# E8 a9 m/ }$ r1 j' r  }
0 v6 p7 D  Y: N- z' v( ^0 o) K( L) j
$ ]5 S8 z3 l) i& w
  //get the key based on the split value
7 z7 X' \6 d" f2 k- t' {1 t  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);8 T# H* z! Y. X* {$ S
  for (string item : stringArray)
' R8 e: O; n9 q* c8 M( \+ O  {
. v3 m/ c% N0 O9 |    //read the string to get the object ) h9 U' r2 @; a2 k$ k0 C, ~
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));+ }% b$ D- R$ ]1 u1 t) v# }0 z
     
) `- x, f4 `9 \     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
" z$ B& w; m, T; d/ T) Q9 `     {
9 D& B4 ?+ O0 T3 J       getObjects.push_back(tempObject);4 f, W: y4 f6 d. i8 H% l; \
     }9 i( J* l7 s, E7 L* B7 r  r
  }, ]0 m& U6 W" f. ^! C
; n" g# \& ]8 g# o. N
  return getObjects;6 c9 M; B; \& b) H8 l  s
}[/mw_shl_code]
/ Y0 @2 z0 }/ _. S- C+ r3 Z. W, S0 H, J9 y
" u  z! \  y  {! N

" E' g5 f7 c2 A2 g" K* N. O4 ]
更多实例视频和专辑课程陆续分享!0 R7 ]6 _; }/ x8 L/ Z. @) |
6 T5 r1 O) _/ e7 x$ _
欢迎转载学习!
9 g+ X0 h; R1 h  }( L4 S8 Q  [: U* Y
更多精彩内容请关注PLM之家
http://www.plmhome.com

% x* Y# ?- f. }) I/ C

& N$ T9 `2 \, l6 b8 r& m% q2 o" ]4 Y  S6 X5 J2 O7 ?
) \5 D) g. c/ {! l# v, _6 t
END
PLM之家plmhome

7 C4 D/ Y# [7 i# F# w3 y6 ]8 c0 ]                               
登录/注册后可看大图

& T3 _4 ~- W! [5 q1 d▲长按二维码“识别”关注

, g0 F) J8 {! M7 {# @4 n& _- o' _3 d4 B. T0 {
~~~~往期经典文章链接~~~~

- m1 I0 H5 s- B# B( M: K5 k  b, O7 ^
NX表达式视频

( y$ b5 q, ?. R1 I& Q( i( Q% p7 J8 W8 x+ G7 k4 D: I6 v
NX冲压分析可成形一步式视频

* n( \+ v' e1 ^! G
冲压模具分析工具 3 全部展开实例
/ H1 r& [' ~# p  E7 k. {- e- l
1 L" ?  T4 Z) M- t6 P7 h
NX产品模板工作室PTS视频
1 产品模版工作室概述
  @9 }! Z; Q3 ~5 s1 h
2 产品模版工作室界面0 w  E. h  X5 |# P
3 创建一个基本的模版5 y" c2 d) e0 N3 K: P1 `2 y  G
4 PTS高级模版技巧
6 |4 x! ^7 U4 F: c
5 PTS添加需求HD3D. [- X9 T# \4 r5 y; c3 _8 p
6 添加装配模版
( k. \5 j" y, f2 A/ D8 t# ?* e
NX高精可视化HD3D视频

' @7 a3 D1 j2 b% A% m. R9 K. }. f) Z" k% j# z, Z' V) Z; U; r# B
NX模型检查一致性check-mate视频

+ q# r% T: `8 P+ [4 \. h7 Y+ x. b
2 F& S. O8 i" _7 ?( L  V
NX入门视频实例教程(8 小时)
( V* H& V- c; n1 g/ ]6 N0 x
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

/ N5 M0 ^8 m; B2 i/ W
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

8 q+ w+ _/ y9 y3 E$ p其他重点咨询

0 _! ~, [4 |, {$ M! Y5 s
工业互联网咨询:
工业软件APP:
数字化转型:
Gartner发布2020年十大战略科技发展趋势
% Z5 ]( S0 ?1 }: ^$ N& G, @, y7 S
工业互联网技术栈:
' X# t5 _6 H" k0 Y& H: c
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部