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

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

[复制链接]

2022-6-1 14:33:25 2470 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]
8 f! w$ L  {9 s# u! M// tag --> Object# R9 L; Y7 {7 U' O5 c& P
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法- T! m# w' I2 H- q* u' m/ d/ O( |
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))7 k0 u, C$ g5 U3 k8 {% ?1 [
// Object --> Tag' N3 E& ?( M) R" a5 E, G, \4 ]
//直接通过对象的Tag()方法获取
' s/ m/ P( f9 r7 p, c) J$ btag_t getObjectTag = getObject ->Tag();4 F+ p0 b1 i0 s
//tag-->handle( |* Y; g1 _0 r- }/ W8 L1 N+ a4 ^
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
/ l3 S" Y' [. e. u# k5 f4 q" {- \// handle --> tag " v# Q0 x' X/ X0 v' q
// ... 往后看....3 ^1 j: A- @& ?* v' m+ y3 K: U
[/mw_shl_code]; `9 U  g$ M4 w: M6 m0 [4 S
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

/ ~7 g' e) R: d  |" [" ^
这个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]3 Q: \$ d& ]* U
5 g: `/ J/ l3 s# t$ L
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
* |! b! J8 p* E{
2 x" K" l0 l, ?' x0 ~/ e8 f8 O/ \  stringstream ss;/ f. q! l! m; ?; s2 @; x
  ss.clear();! _2 x4 ~; e+ I
  unsigned int
9 W8 k/ [3 s! D3 G    ID,: S9 P' |; u% e; i: w- T
    version;
# [: I3 Y1 n' _, _* T" M5 W2 R9 `  char
, i2 m7 {) H7 z$ A. s    * file_data,0 O! T+ j, t2 C: j# K0 R( o& v1 _3 b
    * handle,. x2 q# U6 P& V6 h. b: E" q
    msg[30];
; Z% R& K5 Z6 Y/ t& T  if (objectTag)
3 |" O; y: Y, K. b; i! x$ q  {! ^/ _7 w% ]" w0 }# y2 `3 O
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());, \$ `/ a- r/ T1 D
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
+ e* `$ u: ^' p. E7 r    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
' N" f& U+ x, `; U: B9 W2 s& o1 w    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);; Y% U4 b+ E  m; B; ]$ Y- x7 p
    ss << file_data << "_"<< ID <<"_" << version;  j7 k% X. c/ x$ R* L4 x  S
    UF_free(handle);' Y/ ?$ l8 @* ~3 e9 \! z
    UF_free(file_data);% V  j* T9 R7 z5 @3 _) f0 w+ |8 }# n
  }7 @& x3 A1 |+ d/ g  {2 _
) v% b: R' K2 J( Q8 P
  return ss.str();
) K2 C  H, d3 ?}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

1 D3 K( {% G; t  b
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)5 z" \" u! P! D. n) P5 r( [. U
{7 [) b, P/ l" ^) Z, p' W
  vector<TaggedObject*> getObjects;, N# _2 M" W. Z6 p( J
  getObjects.clear();! x8 ~: e5 ^! M& [9 O: H

* t0 Y3 @, V6 i- i  string attributeName("");
9 J, o$ V" A5 ^* L  string attributeValue("");
7 e5 K% Y7 Y) v* o* U  vector<string> stringArray;+ t7 n% Z  M  j' B7 Q/ H
  stringArray.clear();. l7 I8 `! \$ w9 ?! L& z2 s7 c
  //get the attribute value ! _6 S5 |) |- x/ @, U- p
  // get the attribute name
9 u8 }4 ]7 x/ z" g
0 R# d9 }/ ~7 r: t3 U! m; m  attributeName = GetAttributeName_FromType(typeT);
$ d2 y. G" Y# i1 }  H& E) e! U  if (isStringEmpty(attributeName))
- U, h+ U2 [) W7 S9 ?3 s  {' b; [+ I- X9 R1 q5 p- c! x$ o
    return getObjects;3 O8 f  \+ W* ^) z5 v, n" ?
  }' v3 u6 j* M% w: ?* b7 W
  //get the attribute value
6 d$ w* \& R0 `1 b& ?3 Y  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);) w! J, P1 P, I$ U) V
  if (!hasAtt)& b5 e* b; Z0 a6 n$ @) p- b( c
  {+ b6 a2 n  @. L) I
    return getObjects;7 R, D: ~$ m0 O5 `! Y
  }+ r1 j/ t4 G6 f% M1 E
) m+ W5 L! k0 C' L2 m% C0 n
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();" x& G0 s' {- p5 u* u1 L
  ) n: I, n2 b! J- g  F; c. F2 Y
  if (isStringEmpty(attributeValue))
% L) D! I4 n; R7 r  T& \% Q  {1 Y9 _5 N3 D% S
    return getObjects;
1 S. O5 k7 Q. \  }2 G, e- {. L! T) P7 o
) R0 u+ ]+ o+ r  ]+ {$ T6 W
; o1 Y, X2 Z. |9 p/ ]# j  E% V
  //get the key based on the split value
% w- p, x: Q7 ?; N, ~" W- @  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);2 ]4 T6 L- U7 n
  for (string item : stringArray)
7 g: |) ]( L  _4 S7 E  {
; K5 {* K# _" F* e* `# ?! b    //read the string to get the object
+ t2 k$ F4 I( K( x$ A     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));9 j! w' f3 B; l7 ]7 X) a
     
2 q9 o$ z# m  C; T7 O2 y     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)3 {% q/ j2 O( C5 k& q% `5 z
     {" O, L2 G1 u! c" J  E7 d
       getObjects.push_back(tempObject);$ Z: _  |. Q4 P& Q6 M1 n* |" ]$ ?
     }
( F5 U: G9 d( u& C$ U+ |  }
. H$ K2 X9 N, q4 w5 ?3 V4 N
: u0 @- Y3 V& x& g  return getObjects;
" x/ @: U: k4 \* N3 q}[/mw_shl_code]; r, _( R# F0 l' E

! D; h2 q& D2 R2 q& u. N. @) I! U* H* p6 B

& f$ B( d$ i! m; {
更多实例视频和专辑课程陆续分享!
' A# m6 r/ ]% z" y; k7 }" b
- |+ v  `9 ?0 t7 u
欢迎转载学习!

! W& j2 y1 ~8 I% s. r! H
更多精彩内容请关注PLM之家
http://www.plmhome.com
( D( R! u6 r1 A/ J


4 a# y0 k1 c$ B7 M. e& V; o/ t. K9 t6 w

4 n: _! e" O2 Z5 G5 e" S- H
END
PLM之家plmhome
' _# B# r8 a5 S% j! E. j7 g
                               
登录/注册后可看大图

- E) {5 r5 T# R& r9 C1 C▲长按二维码“识别”关注

$ h: q8 W* u  ~4 g; y. d
9 C$ S9 a4 y2 Z$ `  i: j8 C
~~~~往期经典文章链接~~~~

8 f+ j: C8 P6 h# F$ s
NX表达式视频

( g0 W6 Z( i- v$ S: Z9 E0 a$ W% h. o7 G/ G4 ]
NX冲压分析可成形一步式视频
" N. N: v+ a4 o) c+ f3 I7 Y- ]
5 L# ^: ]- N' f+ Q2 t! P9 F' f
NX产品模板工作室PTS视频
1 产品模版工作室概述
. `6 x6 t$ F/ `) E/ d$ a" m
3 创建一个基本的模版0 B6 H5 N* i" v" ]% ?
4 PTS高级模版技巧
1 V' h8 ~) W- H' K' Y, ]1 l
5 PTS添加需求HD3D6 F& V4 X& |6 r; `; ?( X7 O  A
6 添加装配模版
" ?$ p7 D& k8 |
NX高精可视化HD3D视频
5 E- y7 _( V! {; S
6 ~2 g( m* X8 N3 c' F
NX模型检查一致性check-mate视频

1 K9 j  D; k7 ]1 A1 y) m" k, X2 W* }; a% P2 D" t; f
NX入门视频实例教程(8 小时)

  q3 b0 G* g1 F4 {
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

0 X( U3 A& o2 i  w# M
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

  m" P3 r/ |3 D, W其他重点咨询
3 D3 q. E5 ?( K& L* |1 Q! w
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

  k$ ?1 y$ n+ D- |* x: v
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了