PLM之家PLMHome-国产软件践行者

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

[复制链接]

2022-6-1 14:33:25 2480 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 e/ _8 R1 A) C! P6 B9 x! n// tag --> Object; y4 x! r1 X- Q; @! i4 f
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法; k1 N: E5 o5 Y& S  H* s6 x( |
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))3 ?% h9 u: B4 G7 j% Y9 q" X3 t& z
// Object --> Tag, k! X8 f: p4 Z( j! S2 P9 ?  v
//直接通过对象的Tag()方法获取
" J. u+ K  s) otag_t getObjectTag = getObject ->Tag();
- P; W% }6 ]5 s+ S" q//tag-->handle2 l. @, y) l5 \
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
( G. H! q, `+ w& X, Y( R' c// handle --> tag
# H- x7 ~: P* Q# C& U: j// ... 往后看....: n. I; D2 j- o" ?# X  C
[/mw_shl_code]
4 q$ ]- ~' }4 P0 Z7 H
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
2 k4 y  v$ B. D; Q* 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]' `( A6 t9 e/ g: f! {
2 {8 `( y1 K" h0 g
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
0 }* W& H4 w$ \5 x( c" p- J* `{' r: w# w  i7 x" k8 J
  stringstream ss;
8 D: M9 l# k: \; E# k, U5 S  ss.clear();. c( a" o7 _$ G; n" {' a5 K
  unsigned int7 x8 X, G* {) ?- [1 Z
    ID,9 o& l2 C* r0 Y. i6 U  R
    version;5 u9 l- I% D# J+ g
  char0 P' z$ t# x2 g! K
    * file_data,
0 @/ N, G) g' O. ~1 T    * handle,
5 |0 d8 T9 I) A% W- E2 C3 T    msg[30];6 s) d% M7 p  d1 H4 l
  if (objectTag)/ Y8 i5 ^% U+ K' g- g( j4 i
  {# z( L9 T6 E" ]$ y. Q6 _9 n
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());: s' P: ~: ^( {; d7 _; B
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());  F7 M$ f% M, e1 l( H* M  u& {1 E4 I) `
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);6 `( e) `. `, {. c$ d2 ^
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
0 T8 W' G' B$ l# i* q- Z    ss << file_data << "_"<< ID <<"_" << version;
8 k/ ^/ N5 M3 e; n8 z! J    UF_free(handle);
1 }4 V: Z1 K, K2 |5 i3 K0 E( {    UF_free(file_data);1 u& y  s; }: J3 H
  }
, h0 F' _- @$ T. C+ z
% k- {, q$ R& A" `  return ss.str();% j% W0 W7 p7 c3 e1 I4 `$ T
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
  {: m3 h5 ~, q% i6 l2 m) Y) ^) R( p
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
0 N5 S% J2 ^) H  ~{
4 p  g. x8 M# ^* x  vector<TaggedObject*> getObjects;# U& r8 Q  c  m  O) d1 q& v
  getObjects.clear();* k" T5 ~8 y2 r  s9 ~
* H  Q8 O0 y/ q4 _0 C) t
  string attributeName("");
0 c4 p- _: N- z$ k- S# n7 \  string attributeValue("");
, _# ]& }% ], _, |5 i( P  vector<string> stringArray;
% D7 ]8 j: e5 ]/ O! {& q' u  stringArray.clear();- z4 ~: K6 _4 M1 a* l/ [2 n
  //get the attribute value ! C5 d' ^6 ~4 L4 j' \; K- c
  // get the attribute name
; J; j) N6 H4 W8 D
# P  y; H  x0 g; C4 F' g: x  attributeName = GetAttributeName_FromType(typeT);
  j1 C- V3 u# o  if (isStringEmpty(attributeName))$ ^/ }' P' P% C3 a; X# O  m% f& r- e
  {
8 l* Z  X( c, U5 m' C. f: B  e1 h    return getObjects;
% J# k  t9 Y7 j5 ?1 x: `1 X  }
5 l; X* m5 @- J3 l& S$ C( i2 u; N  //get the attribute value
7 [: O: q9 K6 S. c. e5 p! O  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
0 D- [/ w6 S: R; `8 }; x8 k3 p* X# u  if (!hasAtt)
6 M4 ?5 I4 J" |; Q& w$ \  {
' J- _6 @% I* P5 ?6 g# @8 G/ d    return getObjects;
4 Q/ o! O* a6 P  }% m3 q! j: f8 C

& s( k% {; @) |  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
9 i) [7 L2 D( @6 h. P  ( b9 G0 I; m) w7 f- j
  if (isStringEmpty(attributeValue))$ q+ `4 {) x4 z4 U  Q, x  k
  {4 O$ M* W% D$ I5 o  O7 P/ J3 C0 G
    return getObjects;
! B( x5 A" R9 C! n& t- R  f: F  }
$ p' h1 ?5 q: D3 B& @3 o5 J9 n0 M1 N$ h. s" X5 t

9 R7 ^% h' h7 k- H9 q* i# t  //get the key based on the split value
4 A, Q1 c. J9 o9 ~% \* }1 D  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
$ R/ V8 |6 a0 Z4 J3 D( r& ~, z  for (string item : stringArray)) d* s9 {  W# L6 b$ X
  {
+ ?( h' m! |( x    //read the string to get the object " o* o  m6 C. z6 i- R
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
, Y! [2 `+ w0 k5 E2 J: \: C* S     3 e2 u9 y8 U$ C
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
6 `, }% Q% w$ a5 a- c, K% k     {5 K  ~# I6 K6 n* J
       getObjects.push_back(tempObject);1 u' f% F& R3 J6 e! {
     }0 ?( y& q9 H# y
  }
, ?  \: n. n0 K( {. {: [
( \' `/ C) u; I1 a  return getObjects;4 c, N. b, [4 n0 n
}[/mw_shl_code]
# P, O# g* V" i/ ~" B/ v# f% h+ V/ d# U1 f: |

: W# N; c! H6 y: P5 K- G3 \  Y7 {8 Z  ?% k1 W- v- |9 }
更多实例视频和专辑课程陆续分享!$ I7 M1 P' `7 S7 E

* M& R7 O2 y5 Q: I
欢迎转载学习!
: U; M' ^( M5 E  d( U" u9 V7 E6 V8 O2 M, V
更多精彩内容请关注PLM之家
http://www.plmhome.com

9 T; E9 Q' r$ d2 d
& M, e4 F4 N8 D5 h- |' u

9 y, ~+ g, g( |2 E4 r) f( f1 W8 a9 w. R  R
END
PLM之家plmhome

7 h! Y) N8 i0 I) ^# m; S/ H( k                               
登录/注册后可看大图
4 K, J  L0 D. T5 T! h& c
▲长按二维码“识别”关注

% n# d% |: Z8 V, e$ t* X/ k  m) C& M2 {* S3 A# S2 X8 z; k0 h
~~~~往期经典文章链接~~~~

. Y7 `. n5 g' ]0 X$ G$ \" @
NX表达式视频

( \5 V% L* {  j: z
PLM之家表达式专题视频-1 表达式概述
- a4 }, d: Y& ?# H5 J* z+ X8 q2 A1 K4 F
PLM之家表达式专题视频-5 条件表达式
3 l! A9 ]& M4 p) n; {2 E# v1 w% D9 ]% v
PLM之家表达式专题视频-6 部件间表达式% j1 _& m. w4 w2 E% @+ }! `# X  m/ w
/ \) ?; ?  S# I5 X
NX冲压分析可成形一步式视频

4 ^; K' s* O6 f1 [
冲压模具分析工具 3 全部展开实例
) i4 d5 ^  }9 S. x7 v/ p! K2 m: [& d
& M0 |5 h. _. D+ H: S. E+ U
NX产品模板工作室PTS视频
1 产品模版工作室概述7 t" p  b2 a1 ^6 e/ X9 C) B3 P
2 产品模版工作室界面
  J+ m7 U, N, C( x
4 PTS高级模版技巧- `" w% V- h2 F+ ^$ u5 e0 N
5 PTS添加需求HD3D1 G7 X2 V. d8 K" g1 |
6 添加装配模版
" v4 _6 M. N- s9 q) w' G& N" h
NX高精可视化HD3D视频

, Q9 x! D* o+ s5 q1 v7 j
3. PLM之家NX全息3D培训-HD3D客户化展示0 {  a0 c# ^0 `2 c3 H0 \1 S: B

4 D4 p0 Q: k! t+ \# B
NX模型检查一致性check-mate视频
7 Y) |4 [! W; B2 O7 T4 h( q: g

% j* H' N: q- k1 d, N# R, }
NX入门视频实例教程(8 小时)
$ c1 o7 W( t# A' M& Y8 O
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
/ e3 P. J# B' j  w
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
: X9 A* u& H7 g: s3 e% b
其他重点咨询

' I3 O- v4 O. I- ~3 @$ A
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

$ \6 Z/ R, ]- r& z! @1 U$ D
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了