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

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

[复制链接]

2022-6-1 14:33:25 2637 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]5 _+ d. H) w- F( w
// tag --> Object
6 b+ P0 p' V% |7 C//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
9 @# |7 l" ^4 jTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))8 d4 O# R6 Z/ y2 g1 |( \: a) E
// Object --> Tag
% l' e: [4 H' P6 {3 t; E//直接通过对象的Tag()方法获取
& x% |8 ]" M1 x7 O9 U7 wtag_t getObjectTag = getObject ->Tag();
  s" o2 e7 G$ W' o* x$ @//tag-->handle
2 P* i- Q0 f+ `, K( v4 x" Fchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());/ R( v1 r7 T- |8 b8 X+ z
// handle --> tag
! w9 Z  \5 D2 f9 `// ... 往后看....
- n) z' G/ s% `" T2 q) k[/mw_shl_code]6 |% b1 {2 P/ t4 z! S! i
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
* f/ S0 T: w6 P6 d: ^# C
这个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]
( {9 w- }$ T% ]  X' X7 M
' _- }2 I) _  D- |5 p" ]1 Mstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
$ F; N) z. J. e! k' O{. B4 N2 d- K# T3 x  A
  stringstream ss;" ^, y% x& Q; b( |! E* N
  ss.clear();6 ^( @3 H9 W5 i" A
  unsigned int( r6 F$ A& G) S# V& [. M
    ID,' k, d# a/ M4 v) I6 r
    version;1 l1 ~8 h2 {/ T
  char
$ ~! E3 c) H$ b0 `, a    * file_data,
- d2 B% I  F& \# k* p    * handle,
' c  V+ ^2 d& [8 V    msg[30];
, H$ e5 i$ Q( l/ L) B  if (objectTag)
  A' w4 X8 n# \  {& o, Y; J# d* _1 `' C0 p
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());' L$ `- a* r3 n' A* R$ ~9 H3 M
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());) i  n( [, ?9 x/ {* ]" @7 i
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
$ R& P" ?$ {3 a! q/ y2 h    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
$ R1 H" B' O0 g0 @% V0 U( C  S    ss << file_data << "_"<< ID <<"_" << version;
* g  H9 O8 `6 f6 }    UF_free(handle);  z3 b2 @; t; X$ q; S! F0 k3 O& A: e
    UF_free(file_data);, B1 {/ X) m: Y" b4 D6 t* q; {
  }3 v+ A4 z* g( B- r
$ a7 a7 |7 \' Q8 R  \  Y9 D1 ?. z
  return ss.str();
( K1 W' p7 i/ @- ]5 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
8 L1 h7 v6 Z; M9 _8 G
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
$ Y4 S( D: F- Y& B5 y{. `4 C1 {3 d1 l- L* G( O% V; }
  vector<TaggedObject*> getObjects;: V/ y- Z$ D. o5 r
  getObjects.clear();( @' k- p+ b- y

- z/ a. V; K/ i- c8 N% D) k0 b  string attributeName("");, c6 ^# C7 I/ \2 Z9 U( F4 i
  string attributeValue("");
; O% b( x* U* i2 q5 k9 S. A  vector<string> stringArray;7 [# E* N5 ?; {5 z
  stringArray.clear();
& e; {/ U  g; p: U2 e  //get the attribute value 6 O, s8 z9 u! m
  // get the attribute name 0 w2 ]! F# ~) g! r2 x

( u$ d5 H, K% k  attributeName = GetAttributeName_FromType(typeT);8 X- t8 F9 e$ X8 N9 F
  if (isStringEmpty(attributeName))- `7 V2 A; o$ [" ?
  {
. n; K+ B, `. g3 [# g    return getObjects;7 T  a3 u- W8 w7 e$ K! f4 v8 t
  }
& a, g' D& L* T1 ?# Y  //get the attribute value ; b7 c) R0 N* r" W0 P; w
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
0 n' u4 z4 D4 K8 I6 Q( z  if (!hasAtt)- r2 u- ^* ^( {+ {+ U* W5 @' P. z
  {6 `: X& b+ E) \- Q1 h
    return getObjects;1 r, P" Y3 w4 R+ l# D
  }6 ~4 `/ ]# V; P" F" [. t' L( ]9 A- H

( F) O7 @6 H' H$ o  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
% l6 |6 X2 {! ^- ]( d' U8 I  8 E2 i5 E6 h0 _) k) c3 e* C
  if (isStringEmpty(attributeValue))
0 e5 Q; X1 e3 q( x% _+ R  {& {! g% \( D. P  Q$ \' H" H5 O
    return getObjects;/ J2 E' ?& r  @
  }9 E: ?* {. L, S: }* y
" f9 T; s# z( V0 q1 d4 E: M  i
! n5 ^( a. l4 i- `
  //get the key based on the split value
- Z4 l: O5 O" k' X  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
+ f2 Q& @9 B- l7 C* n; j! c% ?& a  for (string item : stringArray)
5 V: X" I' ^) z& i# j2 p4 G  {
( G' a3 r! N5 s    //read the string to get the object 7 w& y( X" n! U4 `& c
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));" ?, w" N# c8 [6 t  J
     / }. ?  j/ ?4 f$ B
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)- Y: A2 T/ O% I
     {
; b: j, z6 ]. O/ F* w& T( \) P1 t       getObjects.push_back(tempObject);
  [& R, q8 s. u. F6 V5 ], [     }
2 ?0 `) ^6 G7 Z7 K* s9 N! M" l/ q* W  }
  T+ }: {1 g& c; ]- Q- B
3 D( F6 ^" a8 o/ b  return getObjects;
4 u1 \$ l) d# u( Q$ x9 ~}[/mw_shl_code]
# o- {  \/ O$ D) x5 X
0 c4 s9 F( |, h- h: R. D( b5 ^9 C  s/ w- p+ m& ~8 N
5 E6 a; N* u/ [8 X5 W* m
更多实例视频和专辑课程陆续分享!5 N  d; e2 {, k' j$ w7 {

( |4 y+ y9 o+ \) C
欢迎转载学习!
2 z, x! `) C- p/ ~9 \; I% m
更多精彩内容请关注PLM之家
http://www.plmhome.com

: m8 x7 ]  i7 O( f: ]3 T) ^2 E4 W
0 v( D8 q% u8 J2 U9 M8 O
8 T) d8 C! [3 f4 a

8 D! f# i" ]/ F0 B4 T, |5 b/ Q
END
PLM之家plmhome
' b0 A5 Z& l, q+ c& q
                               
登录/注册后可看大图

# M3 [% g# F2 _# D/ @; j' x$ ?6 @▲长按二维码“识别”关注

! K8 V  F. q% O6 v7 W) l) O8 k/ w* N6 w1 U+ D+ P7 b  q
~~~~往期经典文章链接~~~~
9 h4 Y7 n/ G* T) W9 c# |4 q/ l
NX表达式视频
; }* c( s) q6 v. I6 G5 ~- T4 u

, u' Y: A8 I# W1 i' o( ?
NX冲压分析可成形一步式视频

  c2 N2 o2 h( J8 [& Y0 H! J3 n
) ^' {; h0 k; n
NX产品模板工作室PTS视频
1 产品模版工作室概述
3 Z/ X5 [, d( m& [3 T* k  K) M
2 产品模版工作室界面
: m' r$ k3 b7 J+ V5 R* B
4 PTS高级模版技巧
4 U/ ~: N4 c/ }9 H
5 PTS添加需求HD3D
$ P$ a6 X4 H5 B; D) j
6 添加装配模版7 t# f* W$ j7 l+ @1 ?2 ~3 s3 [
NX高精可视化HD3D视频

! i; `* i/ q$ w" z5 }, n" F2 S
% E0 h" g! _$ O' H; Z6 Z/ c
NX模型检查一致性check-mate视频

8 M7 o/ [1 g' W+ l5 V. U5 W; D' {8 G. i$ H* {' ?% t0 K3 X
NX入门视频实例教程(8 小时)

9 \& z* Q) z9 n& {: K: ]+ Q
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

9 R5 w5 P  H4 U' x8 t  ~* \2 }
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

6 R- E1 F0 X( U4 {, X其他重点咨询
- p' u8 P' P  K; Y
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
& v' M9 x# B: y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了