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

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

[复制链接]

2022-6-1 14:33:25 2818 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]
1 N) |$ b* z& j7 y( b3 v2 n& r0 y0 S// tag --> Object$ G+ B/ V) z' n
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
6 {* e- ~2 L) Y" TTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
5 e) A: F% _& [  T1 o  d// Object --> Tag9 d3 ]- ~. |( m$ _/ i- y# B6 W
//直接通过对象的Tag()方法获取" e8 [' t9 E1 |& D, R- H' Y
tag_t getObjectTag = getObject ->Tag();) o8 o! l+ c) j6 h6 w. `, c5 L
//tag-->handle) d6 g8 R, G5 R) ~
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
8 j( x. F) W% D2 Q! X$ j// handle --> tag 9 ^( y$ A: X4 z/ F/ v9 D% D( Z
// ... 往后看....( y+ _: v% k( z+ Q, ?8 R1 n+ d: I
[/mw_shl_code]" W# c  v8 ?+ {; U5 P6 G+ M6 A% U
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

$ }9 J1 V6 _4 r! ~) v- H4 F1 ^: j; 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]' y6 n. x3 y2 D1 I; b% M0 [$ U2 `

( w9 R7 A% O) g* K$ d. |9 Pstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)* f3 z# f* I1 k% P# `% D. ^
{
1 e7 u, Y( K. G; V  stringstream ss;
, F4 M' f% [- D& @. a  ss.clear();
7 G, a0 z. P% e, I# V2 V  unsigned int+ C% c; W! y* |  |7 c
    ID,. a9 F" @! Z0 O  q1 [
    version;* x, E6 g6 U) Y; h! V8 g0 `6 P
  char
4 k6 u" l( a& m1 X: O7 j    * file_data,+ J! h2 x/ v1 m7 A) y3 S" z
    * handle,3 [0 O+ V! b/ ]/ Y0 _2 K  {8 }
    msg[30];9 i) ~# W3 Q2 v7 k
  if (objectTag)
9 }, c8 `' u6 _4 |  {5 X9 y' c$ }) ?1 y) ~* c
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());4 \- g: p3 l* b9 G9 S
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());3 ^# N3 g+ i! J$ r4 F* B; R
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
7 \8 M9 N) o# M: Y" i    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);0 q5 A& P  u- ]7 Y" e  D4 H8 _" P
    ss << file_data << "_"<< ID <<"_" << version;6 [9 P$ |4 G2 u; Z; \
    UF_free(handle);' f0 a  q7 z8 L+ i
    UF_free(file_data);9 b' v! w9 N7 H. ~
  }
5 X# V3 `) q3 P- G6 D7 h3 H/ J' d
  return ss.str();% C3 y+ m1 t, `! i% Q
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

. f$ E9 J4 z3 `3 A0 X+ @
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)4 `# L% z6 @+ |% @* [7 _
{
5 n8 m4 m* f  v$ H  vector<TaggedObject*> getObjects;
- S0 x+ v& G2 A7 V! M  getObjects.clear();
1 ~( w# ^  f/ b* l8 Z8 |
5 ]7 D4 U1 z4 p& w4 O6 b0 @  string attributeName("");
! P* U0 v3 W7 ]( ~& b- N  string attributeValue("");  [) `. Z+ \6 E9 h
  vector<string> stringArray;
4 q3 N& E. a- d  stringArray.clear();
; z) B  K4 I! k( p. b  //get the attribute value
8 _, Y- O0 q# J" N0 `, Z9 r4 u( y  // get the attribute name 8 ]5 t: I5 x+ q- I- V" n
6 m, f- l3 |# x* S/ K
  attributeName = GetAttributeName_FromType(typeT);2 k8 m5 n/ g4 b5 f( k- r
  if (isStringEmpty(attributeName))
# z2 Y# j- Y; W. d  {1 o4 [2 |* ^3 c
    return getObjects;
" [" h7 U" r+ h# C  }
$ ?. j9 _. ]! D2 l5 X  //get the attribute value ( i- A8 u6 l) U  A' q/ b" I- f
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
. o, q( q" k+ J, c" Y- G  if (!hasAtt)
# S. z- P  g5 I  {! o+ f: V8 w2 [2 M& T* n' p; v. q
    return getObjects;5 p) N! }7 f, Q( r. l+ p6 ]; V
  }
: p% Y. ]3 @; n. x
9 J3 I" c9 \. u- C# k  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();2 F+ u# n9 `- L& v; R
  
- T- ^$ o+ d$ m5 p  e3 v1 [  if (isStringEmpty(attributeValue))7 a' ]" ]5 i" d2 h
  {& D8 c$ n1 F0 n# `$ B2 V5 k
    return getObjects;" ~9 A! y9 X5 g4 d) f0 Y1 V
  }
! g: A0 o- Z/ i! a1 B: {1 p
9 r6 U! z+ Y* H# M' i* W) W; I- w, J# y$ \' l( I
  //get the key based on the split value
8 u+ W, ~8 Z1 }( \  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);9 N: a5 h) V1 f
  for (string item : stringArray)
# I4 S; K3 d. x' [1 c% s# R  {
8 v. H4 x) S4 F( P5 L    //read the string to get the object
7 U8 l' H* z( j# }9 t' r8 ?     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
' q' A$ ~  N4 d* M) W9 a6 {     ' `$ Z9 N8 J' p- V
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
1 [, q$ S3 d5 ~; @; B0 p% ^) X     {7 Y0 `/ p' t2 ~2 h
       getObjects.push_back(tempObject);/ v. ]% |* d9 D
     }" o3 Z! j$ M4 t9 P
  }8 w- p0 d, H% S3 B

. b2 g. q0 i2 u3 ?& W  return getObjects;
# b1 ~* V7 w- u2 k! |}[/mw_shl_code]
/ w' M1 Y+ b' s" B# n
- d' w& y" h$ i4 ~7 f7 `+ E. o" A- ^  B& h# J9 x0 v
8 b9 y2 P  ]1 F1 H; u) U4 p% d9 \& r
更多实例视频和专辑课程陆续分享!1 c. y  @% F  {0 e# P+ _# u' P
/ t% D& u) a6 X' f& ]0 {
欢迎转载学习!

4 \+ }1 F/ {' _2 d
更多精彩内容请关注PLM之家
http://www.plmhome.com

9 i& \* @: @" E9 Q% ?+ m
5 {# {. y( t0 T! |6 U
+ H& L: T. \1 T5 O* h, i

2 ~. a4 x" Y2 z% p3 G, _% ~, [
END
PLM之家plmhome
1 d/ E+ k5 P5 Y. j
                               
登录/注册后可看大图
* v' e, E3 \6 \$ }( ?* `
▲长按二维码“识别”关注
$ ]4 N; S  b4 W4 V- h8 [
# r& z  k: J4 ]. h4 |+ x: H, f
~~~~往期经典文章链接~~~~
5 g" D8 `( X8 R' b: l
NX表达式视频
) }! n" Z8 l' b! K7 C
  U& l. G, L3 ?1 u$ g
NX冲压分析可成形一步式视频
" T  h; U2 ]! u) o$ z+ j% R
冲压模具分析工具 4 中间展开实例)
3 T6 K, ^- q$ }7 q4 w5 P, T6 {1 q
- ~% j& ?. \$ z! L
NX产品模板工作室PTS视频
1 产品模版工作室概述1 R- n: Y8 k, z. j' C  n
2 产品模版工作室界面1 h4 \1 h- [/ W& a& A, L, M3 e
3 创建一个基本的模版/ T) D+ v% b" {* q# `# u; n) l( }
4 PTS高级模版技巧5 R* j! \2 m9 i) }
5 PTS添加需求HD3D
+ i, [+ d( M/ z# S6 ~
6 添加装配模版/ {3 ?9 t* H  {* g8 k
NX高精可视化HD3D视频
5 G  d$ a0 H- E/ r: @3 l- V
1. PLM之家NX全息3D培训-HD3D概述
) y0 o, i% F) o" A. Q* |. x
2. PLM之家NX全息3D培训-HD3D基本使用3 P4 W. [" g' V% i1 C3 q4 g2 E

: v- \0 R2 }6 X7 U
NX模型检查一致性check-mate视频

! O, {1 }  X( R. F. D: a+ ?- v5 D- M% @: S) L/ J
NX入门视频实例教程(8 小时)

1 b* N% T" [& ^
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
3 s$ ~6 h9 L* b. c
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

6 @+ I' q$ C+ c% ~' M2 y% @& f3 d其他重点咨询
4 ^4 i- P; L/ U- b+ N1 k
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

( H8 Q! W- ], J, z* P5 w; p
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了