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

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

[复制链接]

2022-6-1 14:33:25 2821 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]6 t8 S& }7 c' _- c
// tag --> Object; u9 A* Y: C0 x# v) C8 z' i
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法' G# [1 i4 K6 N  u
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))4 _' k& H- T' i) Z7 r
// Object --> Tag- S, `/ p0 ?0 ^. y; {! ^
//直接通过对象的Tag()方法获取
1 E! }$ `- w2 Y: Htag_t getObjectTag = getObject ->Tag();
: D5 W! u/ m8 f* j4 p" ?+ Y//tag-->handle
+ ]' \! Y: c9 u4 ochar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());& o/ G' [+ }  n  c  a
// handle --> tag 4 k0 D  X) c0 o0 i5 }+ ]) c
// ... 往后看....
" e7 a7 P3 n! F' f7 k2 O5 C5 Q; W[/mw_shl_code]
6 l+ C& d2 L- `0 T3 {" J
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
% j) b, @: d9 k0 n' t4 `) b! k# q8 ]
这个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]
0 c$ }8 T3 ]4 {* E% y! `7 Y& x% f
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)2 v7 J# n$ U4 r- ?. c0 B% L7 k- Z
{( D2 H, e  r& H% o4 T" T
  stringstream ss;
0 p2 q( p* w; T& o  ss.clear();
7 |, D# D+ F& n$ p3 G" D; x0 _" ~  unsigned int9 g/ [8 f" q1 l; I" ^/ \: f$ P
    ID,1 Q" G4 F! |; B; s5 `8 e; D7 w
    version;, E9 O# ^# V4 N9 b& D) Y. t3 Y
  char; [* X& T# E! z
    * file_data,- V$ F$ Q3 D/ f' ~- c5 h) D5 B
    * handle,9 f# x) D' |# k" V
    msg[30];
+ b- H  r* \; g, ^  R+ Q9 B  if (objectTag)$ x/ A' v! V9 X5 `3 X6 U( n5 D
  {3 u3 K; o% o( V. d* I! T0 S& d
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
- t2 r: Q# O' L) C8 ]    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());5 {  s% v" e) {6 e
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);) u$ c2 E$ M' l/ ?# j
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);; |1 ^" k# [/ ]% z$ ~
    ss << file_data << "_"<< ID <<"_" << version;2 M6 Y2 U/ }# u- q% i9 t
    UF_free(handle);
$ c8 H/ {: ?- w. V1 K- ~    UF_free(file_data);0 ^; ]1 _9 O- A
  }
1 M' v, V' x$ A, N: f
6 v1 G9 h7 x# f$ b2 U  return ss.str();8 s6 A& \$ z. K& k0 x4 X& {
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
( D! u. j( @6 w% N; k* h3 y% ^5 [8 \5 l
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
5 `" @6 v8 c+ O6 G7 q$ {{7 |' ?% O! O: G3 r$ t7 p! @7 R
  vector<TaggedObject*> getObjects;
( Q0 t3 O; {- x- \! R! M2 U0 `8 Y  getObjects.clear();
2 c2 E9 F7 Y6 [9 o8 K
- h4 t/ K% o1 {0 S4 p/ ?5 s1 ~* B  string attributeName("");( H6 T$ ]7 G% }: |( ?: U8 k1 x" S' i& @
  string attributeValue("");
$ M  M4 Y( f5 l1 E/ U  vector<string> stringArray;; H: Y" e' k+ a* R& G
  stringArray.clear();
1 e* z5 R+ f0 h3 _( ^+ ^  //get the attribute value
: k! S$ d- P3 A  [) @* C) K  // get the attribute name & J6 C: i8 u$ l: K

' t% ?" e5 ~: |3 W  attributeName = GetAttributeName_FromType(typeT);
0 G8 M* R! j9 L  if (isStringEmpty(attributeName))8 z6 a4 M5 c! C* y3 j
  {
3 F' M  O$ }/ [4 v0 N5 H# h0 r    return getObjects;# P& z# z' S/ A, {
  }, p0 D& Y/ Z% _" P6 q3 O3 I
  //get the attribute value . s% v$ W2 B9 N( a, t1 i
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);2 F1 q1 S; R+ z8 J: P
  if (!hasAtt)! a* a+ c) W  C" x" S9 f2 ~1 q+ e3 \
  {
, b8 k$ Z' _5 K3 P& K* ^    return getObjects;% O  n. S+ s4 o7 J- U$ I7 O
  }  Q3 t7 y7 P/ I# t8 Q" ~
2 U$ j# Q, {/ x# d( E3 A; ?
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
6 Q5 j  T& v( Q1 C' _) L  6 u9 \+ A5 d$ K- O
  if (isStringEmpty(attributeValue))/ |  d; Z( U, a4 o) t
  {
5 H# z! p3 a. s! P    return getObjects;6 d4 m  Z  ~) L9 s# ]0 G) ~$ f; X
  }
. y; l7 k& q! S1 g" i6 `) Z4 u1 O: `7 H8 p

; ]; a1 ~, ^# M' i  p6 P2 _5 Z  //get the key based on the split value
- b- Z# c5 j% v, {, x3 B  {  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);3 e: R' Q3 m9 O9 z3 r
  for (string item : stringArray)
* n4 P, V* }" k$ x5 a4 K  {; X* B/ D0 O2 {1 Y
    //read the string to get the object # o1 ~5 ^; h9 M- B/ s2 p5 K
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
* m' V! N1 J4 `9 w+ r5 K     6 _$ Z0 A/ L1 d. T/ a
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
+ ]: A- V6 f; }3 l& ~& W     {
5 U4 s1 c# Q$ q       getObjects.push_back(tempObject);) L6 Z- j0 @+ ?4 |" u
     }
; N& a4 C, o2 X* h- p( V# M  }
1 T  g/ v& Y1 Q0 j# `. }3 R' @* H$ m7 h$ H
  return getObjects;
* o  x5 H, j) A0 t/ {- B% T. L0 V}[/mw_shl_code]' f& z; i: @# O) j

- t+ y9 c1 V1 v
0 e; S4 T" T6 g' S/ A$ c0 ]# m0 D
) z  i) c5 S4 M5 L; j9 ?
更多实例视频和专辑课程陆续分享!
. Y1 d' _4 u5 a2 b4 ]3 N# d3 @0 E; X$ U' n# @
欢迎转载学习!

7 B: s6 I% Z# B9 }. ]
更多精彩内容请关注PLM之家
http://www.plmhome.com
$ [, x1 C, U( F; ~7 k0 @1 L: u! k


. q, y& D2 M* e! W9 D/ G: e. C* j$ K. c' L
5 W0 n0 X' F4 }: I' F/ J1 Z
END
PLM之家plmhome
, M9 D& H- p7 {# `" ?# v6 a
                               
登录/注册后可看大图
% H) q& m+ n/ M" {# C, E# C; f
▲长按二维码“识别”关注
5 v, W, N. K$ S7 h1 @: a
% H0 o& B$ u$ f* g% p6 }
~~~~往期经典文章链接~~~~
! p: c# i0 V# s
NX表达式视频

: [7 w" Y5 n8 ^6 d( {% C. D
# C8 ~# ~" v7 U2 B/ O
NX冲压分析可成形一步式视频

: B% a1 U) T8 k( M0 R0 h9 ^# G- W  t2 f6 v) C6 \
NX产品模板工作室PTS视频
1 产品模版工作室概述
; a1 {' q$ h8 ?2 n; H- U+ l
4 PTS高级模版技巧0 Y( o8 n$ K: `: y9 n
5 PTS添加需求HD3D
; S0 ~4 [* s  V6 x
6 添加装配模版6 L! [" `0 N+ |% t& p5 g
NX高精可视化HD3D视频

4 v. X: |0 P8 R9 U
1. PLM之家NX全息3D培训-HD3D概述* N# x- \6 K' J2 s+ q: l. S7 \
3. PLM之家NX全息3D培训-HD3D客户化展示6 `9 Z( V' {* N6 T0 |, l) |4 S4 J! E
4. PLM之家NX全息3D培训-创建HD3D% L' b" S  z( `2 c, U& s8 v+ g

; E+ u3 a6 I/ @: m; {( I
NX模型检查一致性check-mate视频

  }& @6 W- E6 s/ _  Z' F8 t/ ?
NX入门视频实例教程(8 小时)
* ~: ?7 i' {5 m. c
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

' T1 y4 k- u+ w$ ~9 u+ d: Z
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

' L  ?5 y8 A( J9 M9 Q其他重点咨询
% z2 h' |! K- v/ o
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
西门子NX软件二次开发高效开发环境搭建技巧
6 d9 `- L; N0 w" a0 M  h$ e) X4 `3 d/ z( d
+ K+ }) }2 x& h0 }% f
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了