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

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

[复制链接]

2022-6-1 14:33:25 2737 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 h: ~; G# O8 E% b3 u2 ^
// tag --> Object4 g& B/ w# b1 d
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法( `9 z5 F* N+ e; P4 t- U6 a
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
. a, a4 H) B7 B6 Y! k. p' V// Object --> Tag
0 ]* H, z! ^6 Z* w! ?2 n& i) l//直接通过对象的Tag()方法获取
6 a) ?* J" Y$ K& Z3 l# g7 ctag_t getObjectTag = getObject ->Tag();5 H5 T; x) b2 ^( w& d
//tag-->handle2 x. c5 f2 c, j: L' ]% ]! P
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
5 Q' Y( {- o$ o/ z// handle --> tag 5 t, W1 o7 S* T2 Q5 E
// ... 往后看....
, X+ L2 p9 c& @- [$ N0 f6 m[/mw_shl_code]
  m- Y+ [* ^: P, z. B, |( p
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

7 J% X) [1 o1 Q+ J2 n
这个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]
# Y$ U/ p1 n4 M2 u' D7 f+ ~% K* n  Y
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
& @3 U% a0 k, P/ i8 v{
$ q" M. @$ l4 `  stringstream ss;5 \* f2 s3 h8 |( |1 ^
  ss.clear();
/ `8 U1 O& W" p: W- v, e2 D5 W  unsigned int
4 G5 q4 H2 Q- E$ ?8 I) ~3 _$ T    ID,& J1 s3 R2 d+ @6 D, E: W! t
    version;# z" _8 y/ V1 E! l! ^
  char! t4 Z8 q  }, Q7 j
    * file_data,
9 |9 A( H: f; |' L3 i! U    * handle,  T' {& f4 D+ Q) B, K+ l7 d3 N
    msg[30];- r6 }2 @6 U* G
  if (objectTag)
6 L4 K! e' ^+ F; X  {
7 {6 `% e6 {8 P8 m+ z    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());' m: N: b$ Q' `; y% C5 W4 h  F
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
/ S' e) v' G6 m6 U+ i    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
; n7 p. U  a9 r0 I    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);. j' s5 f! A, r4 C& e( d- ~
    ss << file_data << "_"<< ID <<"_" << version;5 i9 c# U" {" L* T- ~* y, k
    UF_free(handle);
2 F. H1 w5 u2 V1 ~7 h; O& b9 \    UF_free(file_data);
% C: S$ y3 |4 F- t6 H% B4 j  }$ z7 s% s) Q5 `: J. d
. S7 g7 {; n8 g. u9 v
  return ss.str();
0 r8 _* [$ g" R/ \8 z, G6 r1 c}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

3 c# ]) W8 G% X  Y6 F; S
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
4 o! k/ S) P& x/ V{7 p7 s3 v8 Q! D+ M7 w0 H' I: R" t
  vector<TaggedObject*> getObjects;
2 i- E+ V$ t! _( d9 e" [  getObjects.clear();
# z3 J9 f- ]* K2 G$ G  O% u/ I
! H7 w) Q! u0 j" ^% \  string attributeName("");( ~2 @9 e$ Q& V. I2 h
  string attributeValue("");
; e6 ~1 B% `4 u/ t. L# z  vector<string> stringArray;
1 Q6 U2 G4 d1 l  stringArray.clear();
# Q! U! H5 {- E8 n" f' c" g5 P$ d  //get the attribute value + n3 T) h0 m: E, s
  // get the attribute name
* {; i" N1 n5 S2 K$ ^9 |; v+ x9 A9 B( u. f# W8 a
  attributeName = GetAttributeName_FromType(typeT);
+ M7 P/ n+ o7 V4 \  }$ U7 \. X  if (isStringEmpty(attributeName))
0 p  c- u- f3 s6 s: [  {
6 c7 F; N# q0 Q9 X$ S    return getObjects;) W; k- }) n2 E) m5 t# s
  }6 t+ e& d. Q/ v9 J
  //get the attribute value & }$ w& S. L* Y. O. P
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
1 E4 ^4 I1 `4 }0 k: {  if (!hasAtt). u% A( G. j1 d- X) O
  {6 |- U7 C, ?; o" a* ~4 I0 E
    return getObjects;; m& ~* k. h1 x% H. x; D6 ^
  }
1 H% [( l' o$ e  ?, p! d. v# l9 m& K+ g
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();' H' ^+ y/ o1 h+ t+ ~5 F
    ^& p; g/ e$ X2 x
  if (isStringEmpty(attributeValue))9 P4 q* z) ?7 A+ p+ f: t0 w& u& i
  {
* y" Y' G/ ]4 Q& G* S" V- v6 h    return getObjects;
1 {" g2 n+ D( b! z: V7 P0 {! N  }2 f- C& {! T' D% e
- F# O; @& B+ U, d: D' _1 y5 g  c1 \

1 f5 r: M0 g) k1 g, S0 L8 {  //get the key based on the split value ( w9 I/ l: M; k3 [8 G% ?" e8 d
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);# A( s, x: \( U) t( G: L% H  U* _
  for (string item : stringArray): v. f" m6 v2 U& V8 W/ U) U9 n: o
  {# \7 B; N" I7 y5 x+ I, e
    //read the string to get the object
. ~/ I, X" O; W6 l' Z" s     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
; H- z+ |0 J: N4 E+ i+ p     
8 `' u, D+ h/ ?+ ~6 H6 i0 D     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
! q- j3 i  f; `/ F$ g2 t) |     {/ b& o! y9 e4 C) v& b
       getObjects.push_back(tempObject);0 f, W: x9 _! O
     }8 p6 U* i; K  d
  }
& Q) w7 D  G# L
, u; |6 b& n3 m6 C! d8 Q9 }, t: m  return getObjects;! |4 \( r* t+ h6 Q% Z# e
}[/mw_shl_code]
, R, e) w; B& y. T6 ^
  |+ a; b& j5 Q+ t$ b- M
0 v0 x) V, l4 A; S* F' t! h, S  H! V: U) I9 U
更多实例视频和专辑课程陆续分享!$ X+ r$ x  {  k4 w

! P6 j+ F0 R  z$ k  o  m
欢迎转载学习!

/ @3 c0 L# \: U: y6 w: g
更多精彩内容请关注PLM之家
http://www.plmhome.com

3 `+ K) a$ t3 `& |& A
& c0 X, Z& V0 V# u$ M  f
  w/ @3 N9 `  L" C1 n5 _- T

+ [: D5 h) e! c9 P: {
END
PLM之家plmhome
/ x; U6 {; `. l1 t( E( }3 U- M( X0 @
                               
登录/注册后可看大图

0 f* O: M, ^# u▲长按二维码“识别”关注

0 t2 ^6 E! p) F" T' \- W: U% O7 m, f1 Z1 ?0 V
~~~~往期经典文章链接~~~~

# R7 x' f% ~; F1 A
NX表达式视频

4 n0 d$ ^& a$ ?0 L& Y# x! R  ]) E% A! A- s8 m% J
NX冲压分析可成形一步式视频

/ t- o. R6 `& Q; l
冲压模具分析工具 3 全部展开实例  s0 G/ F$ D# A  L" u4 Y" E1 |9 U1 T
6 S0 N4 ~9 u- S' G3 U
NX产品模板工作室PTS视频
1 产品模版工作室概述
) u* w' {3 [* A$ n1 B# p8 ]; }  B
2 产品模版工作室界面
( O0 l9 B' {- i, e" G* c1 D+ c
3 创建一个基本的模版3 ~' w  r9 v  u% b$ Y
4 PTS高级模版技巧
& Y6 s: E  E0 e$ }) _0 M% g
5 PTS添加需求HD3D
! R+ I6 }, f+ a" ~0 g3 ?. n2 [, ?
6 添加装配模版( p; J8 N( l& B0 G# O0 s
NX高精可视化HD3D视频
1 e9 }( j$ r; z; Z
4. PLM之家NX全息3D培训-创建HD3D! n) H$ N% E2 D1 \8 Z4 s' G

' l. c. K5 R0 c+ n+ r8 l
NX模型检查一致性check-mate视频

5 t) O- A0 X+ R; s
& a6 R; o1 y' \' z) m- l$ d) P0 z+ X
NX入门视频实例教程(8 小时)

8 b6 g  a( ]! N: H( F) E, G
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

. j7 Z# u, }- _2 r9 S
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

: K3 ~& S3 g$ v5 C# N& H" W/ z其他重点咨询

( `1 _0 u  D) _$ F7 _5 A
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
$ p2 ^! ^2 i* c0 _9 X
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了