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

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

[复制链接]

2022-6-1 14:33:25 2823 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]
. I! h/ w, b( I# {1 Y% M// tag --> Object# G, l( c$ V& U, q) {
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
( a2 f/ z: e& T1 M5 mTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))8 I% p* A; i6 n  m9 h. J" S) M
// Object --> Tag2 t( C: M9 Y7 V
//直接通过对象的Tag()方法获取' u7 @# q: |) w; h
tag_t getObjectTag = getObject ->Tag();8 D7 ]2 x  Y) G% E/ A- j
//tag-->handle
. I1 N4 Z( R# ^1 nchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());9 X3 L" x5 y( v
// handle --> tag ' H5 g2 W* u$ Z3 o% a- G  i# S/ X' A+ V
// ... 往后看....1 w% s! _0 b2 I; Q% R
[/mw_shl_code]
- @$ Y& Z  t/ X5 z* Y8 w
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
5 V0 J& `; }4 s
这个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]
  V' e- Q, n( J- I3 m% h0 y- M4 w2 @4 o, c3 [9 X+ \
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
5 c8 v& U' v/ p6 f9 G. ]{
& e. U3 E! \& G2 y! ~  stringstream ss;0 p7 t' H2 p" G2 ?9 v% y! E
  ss.clear();- W# e" W( ]! Y( m: g
  unsigned int+ |; h+ Y9 L& _. r  g4 V9 d3 X
    ID,* e4 ^4 Y3 s' x; p9 ]# x, r. l8 ^, G
    version;: |$ F: V- Y( i  ?2 g2 K
  char- S; l% X8 S: b: P
    * file_data,  M  }: t- N+ \+ t- x
    * handle,2 j/ j0 D' u, f4 \1 ^- r
    msg[30];
$ O9 N+ H' y$ g/ i) J- S  if (objectTag)
. v; M1 G; [1 Z  {
; U( b5 [8 ]$ _( d    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());6 A+ }" x" P7 j! @4 _- a( v5 O
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
1 L4 Y) P) P& V; D% [5 j! t    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);$ v& Y+ o9 `; R: l) z) G7 L1 z
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
: U% ^, q0 C0 ?& ?- b" Z5 l( J    ss << file_data << "_"<< ID <<"_" << version;
1 ?/ u* H4 O& }. ~  S. e$ z5 V    UF_free(handle);
4 X4 D& i' [9 H& ~    UF_free(file_data);5 X4 L5 v; D, i, \7 L& B
  }: Z& f- d$ T: F4 o2 K2 g8 X0 m. x; `

. v; e' ~' a  v. b. `- f  return ss.str();
* {% v% x# I  G: r! f+ 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
# ~5 _: c8 ^" A# y7 g/ U
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)% \$ k; T( A' y/ H/ ~, I
{
& t5 N& C+ e) C9 V% {$ N  vector<TaggedObject*> getObjects;; z/ M' r! h  U
  getObjects.clear();
! j: F5 O! r5 T
$ M' R' R' R+ d% w' G: x2 r, t5 ]  string attributeName("");$ R9 d* e6 o, I7 k" U  y
  string attributeValue("");! [& b7 v9 e8 Y* Y" e& L
  vector<string> stringArray;5 ~: C% ?$ |" f3 Q: X
  stringArray.clear();
* j" G. ~% [6 j* n  //get the attribute value
0 C2 f0 j' ~- N  // get the attribute name ; y7 @* R1 x2 a2 W3 T
8 t, h  c* s& u  t
  attributeName = GetAttributeName_FromType(typeT);
/ L5 r* Q6 M: A3 z  if (isStringEmpty(attributeName)). v1 J; [) Y- I8 J' P( k$ P- v
  {
; T+ a- g- Y) ?" @. w    return getObjects;
3 _/ g! e. M& X8 Q$ N- g  }
" q4 ?, X7 F/ q0 a4 }: q/ J  //get the attribute value 8 ?0 a  G( l; f8 l7 d; e! y; f
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);/ O! t1 ?0 C1 @8 ~% E7 q
  if (!hasAtt)" K! v* Z- d% E4 i; T- s. P
  {
) |! r: d5 d% }7 e7 P- X( C    return getObjects;
4 O  c; |9 Q' B( R  }9 ~8 J& J: ?' P' I- Q1 |$ ]

% j4 i) l9 r% O! f* s2 I0 z) ]8 @8 ~0 e  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();! m& @( N, S, \1 O# Q; m
  ) P2 R) g* V: F  r. n* x' F  e
  if (isStringEmpty(attributeValue))
# l: {) ~+ k* }/ c. t- m  {
: H0 N, z( Z9 o( X0 X    return getObjects;
% m6 U5 _0 `7 O; [8 D* ~/ d) b# t! D  M  }- N+ l2 E6 Z+ O; s% _9 u
8 ?0 G6 O0 |; R. ]  b; v2 S

$ D( o  j  O6 X& I7 H1 G  //get the key based on the split value
  c% o  t/ K! J8 o4 U. n0 G8 [  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);, L7 {% _& E; t
  for (string item : stringArray): F# W/ e- L# ^
  {
( [$ _' n# H) x, h/ R4 l    //read the string to get the object . [' K* v- b' L# u) P9 I, `* w2 U+ ~
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));* I- y- A- y: k
     , m. ?* _& J  m2 j. R' J4 ~5 j. d
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)6 B/ _( i3 c" [5 G1 ~. B
     {
8 c# q- M; `+ v, z$ ^& b       getObjects.push_back(tempObject);
) \3 `2 H0 H. T, j* x" h. [4 v     }
5 D! S: Q. D( \1 Y& g3 t1 b6 Z  }
3 K! k2 d8 N+ o& w+ I4 M& B, M
! Q) n0 W6 s" {7 y0 {0 J7 e  return getObjects;5 y0 O. F# E% J& b
}[/mw_shl_code], E: Q+ w: l8 ?" P
! M* z& a% f6 t" Q$ e
" H- |" i0 |8 }; [3 }7 H/ r

( e! Z* h2 D8 G9 W) ^- b
更多实例视频和专辑课程陆续分享!9 p8 R  Q! _* T- P# Q

3 z: m, K- b  J$ F5 g2 c' z- a4 H
欢迎转载学习!
* U. {5 g7 N6 h* f' l- J3 V6 t# Z- r9 I
更多精彩内容请关注PLM之家
http://www.plmhome.com

$ D; a, e' S8 M% q* O* [

" g( ^! e: I. R3 j$ V; `6 q4 {# j9 a+ {& ?4 D/ `3 r
1 C3 \: y# q0 s& w* k
END
PLM之家plmhome
( `  G; \' R3 D* O1 i! p: D
                               
登录/注册后可看大图

- S& X  P5 |% h$ ?) D0 ^0 ]▲长按二维码“识别”关注
* }+ a" a6 Y# j/ E
4 D" I8 @! A2 U5 Q% }, ]9 p
~~~~往期经典文章链接~~~~

" k/ M7 \7 U/ |& v% C; ]4 d$ V
NX表达式视频

. V7 r& a: y1 X4 K" Q3 t
PLM之家表达式专题视频-1 表达式概述
. M' w  a" W  m5 T' ?) B. ~
4 ^- m, _3 S9 r  J
NX冲压分析可成形一步式视频

2 I! a5 F" Q4 u$ `1 m
冲压模具分析工具 3 全部展开实例1 u9 @% \# e  B0 \; {0 y3 a
冲压模具分析工具 4 中间展开实例)+ w+ L( S% n; v5 _( {1 F' E. `- q% Y
$ ]- C2 m$ q# A& q% @
NX产品模板工作室PTS视频
1 产品模版工作室概述1 y) ?- @' M, ]+ q! J
2 产品模版工作室界面* `3 H8 ]7 R2 Z  q4 k2 n% `, P
4 PTS高级模版技巧- b# l% G! g$ _3 q3 P! u
5 PTS添加需求HD3D, X& o7 i- l* j$ x2 _
6 添加装配模版- j4 l2 s- E% n5 u& d# _
NX高精可视化HD3D视频
  s3 w# a! ^+ D7 N: k4 U6 ]
4. PLM之家NX全息3D培训-创建HD3D
' ?( i, o7 ?' P" G4 u4 L9 k

( `0 i' Y& t( \
NX模型检查一致性check-mate视频
7 O; @- Y8 Y2 y
4 y1 n3 v% M; _  D5 e, k
NX入门视频实例教程(8 小时)
8 ^' m6 h  g/ Q
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

  [7 T" N0 @5 E1 g
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
/ f7 p, }. J) x, s$ e, D* ?! q
其他重点咨询
: |; d& O  H) J7 e/ ^
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
2 s& s; H: X' z; T' u
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了