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

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

[复制链接]

2022-6-1 14:33:25 2638 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]7 Z+ c( o% r( F" v: T6 D) F
// tag --> Object
7 M; J2 S# e, ?; w& j( m1 S//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法- a3 C7 E1 N3 A
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag)), Q- [  r; e5 g3 m. K3 U: s
// Object --> Tag
7 v& m' A  u% g//直接通过对象的Tag()方法获取1 v' z6 l+ r, [3 q0 W# e5 A
tag_t getObjectTag = getObject ->Tag();; S' f6 e0 Q! i0 p. Y
//tag-->handle- R9 O5 A2 Q! t+ T1 n% U
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());2 z8 R( s1 I9 K/ m4 u- U
// handle --> tag % ?# p2 J4 v, I: |) ^* K
// ... 往后看....
( y/ L8 Q# ]3 U[/mw_shl_code], E6 N8 q( }8 E2 L/ f
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

9 P5 l! S3 n. T% u7 I, F, V
这个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]
: L8 b9 |7 f' y- F) {! N- S, y2 q- {2 G! C& G- A) Q
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
8 G3 I- ^8 y, e! {5 c{
# U8 `0 f/ [: O" c0 r! [( b) i" K  stringstream ss;/ X' `; {  A% p" ^- }8 c
  ss.clear();2 e: c6 g) }* x
  unsigned int) M# b# H8 n" f2 X' c
    ID,7 u) T* |( Y; d5 ]
    version;' ~* c! [8 D+ u1 h+ Q
  char; M9 D4 q( Y3 R
    * file_data,4 N: f7 s# K. v( n" j; u8 F
    * handle,
$ x1 D# u' c% m+ O2 \# a. G    msg[30];  K+ \& I; o9 L7 o9 k; }
  if (objectTag)# i6 g6 Y, |1 T7 V
  {: x+ M' V; D# U& y/ e
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
3 [0 s2 ~' g# `8 m    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());: U4 P: I; b) Z1 N0 Q9 l: C
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);. X' J: f& w% Y3 x6 [9 Y
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);* [% J3 a' H" i8 z. R
    ss << file_data << "_"<< ID <<"_" << version;" G, q  l& H6 u0 p. z
    UF_free(handle);0 B' W" S7 V* c# J* I# \9 v& j: F
    UF_free(file_data);
* A) f: u% B+ b/ t% x0 n. }  }
/ D' `4 I$ J/ d% J4 G3 B$ c
6 H7 p  P1 M( a- Z/ B  return ss.str();. w$ v( z- p9 ]% s6 n+ n
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
# x  N4 P/ ?/ B8 W9 d9 r. o2 f3 z9 v
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
6 W1 w: X: i% Q0 I5 Y& |. W; \{
1 K+ k7 `2 Q$ O" Y  vector<TaggedObject*> getObjects;/ c# Z1 W, Z- f( k1 k0 u. c
  getObjects.clear();: i% b& e3 ?" E4 ^

$ F2 W  W0 n) V- X! t% K2 B  string attributeName("");
* Q" ~% k# J; }; e/ L  string attributeValue("");  X: K/ T4 I+ ~. {0 l# Q' d
  vector<string> stringArray;9 b( P+ h9 Q8 h$ h% m, z! v' r9 x
  stringArray.clear();
1 F+ G5 m: U/ P  //get the attribute value
  s$ Y0 m, c1 }# @# y  // get the attribute name
; m0 i$ D/ W% s& l) H% E  F0 p/ i. i" Q- g
  attributeName = GetAttributeName_FromType(typeT);
0 q1 @6 j. l: ~3 y7 e. F/ {" I  if (isStringEmpty(attributeName)), ]% K- `) o; B7 @2 i/ ?
  {8 |5 p$ U- O6 [8 M& w
    return getObjects;/ H* l; ^; }( ~: x
  }
  w, p7 Z) O( S6 I* ~0 T: ^5 I" @+ c0 b  //get the attribute value
& ?% W; l; k+ q' A  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);, M9 w( l/ P1 F" F& n  }
  if (!hasAtt)" b& z# c4 D) o, z, k
  {
. |1 ~3 E% {7 X1 C5 \8 Z& h$ s) I3 F    return getObjects;5 L1 o7 S1 L7 a: O+ O% ]/ N1 ]
  }
* L% U' s$ a0 V4 a; R) [# |" ^) K8 f( C% P1 O. i
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();3 v; a3 Y, B$ ]# Z. @6 \* H
  
. y; N, ^( [- ~5 x5 i  if (isStringEmpty(attributeValue)); j5 B1 Q# l) T2 l4 t& d
  {
) @5 F7 O7 a& z2 R  C* v1 M    return getObjects;
% `' E7 Q% j& O0 Y% ?  }
- E! L! F; j5 y  I3 Z+ O( J7 P$ c2 z1 O9 a( S  C, ^
* J) x- K" U& M0 A1 k4 Y" K
  //get the key based on the split value , X1 X4 X, `4 h9 C9 w) K7 e( L! ^
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);. c  H/ g: c" n* F0 @! E- [  G4 K. \% d
  for (string item : stringArray)9 _& E$ n2 ~( B
  {# L& w' t2 q0 A0 a7 p% ]  p4 n
    //read the string to get the object
7 G1 F& J: r* @/ V& q$ Y& a     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));* f6 x9 l+ C3 f
     & y) Q1 Y  i8 l
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
% X/ f$ _! k8 ]9 u+ m% v5 w4 m6 @     {5 s9 ~0 o7 i; @, F+ ^, [: k
       getObjects.push_back(tempObject);* s; J! C! m; ~
     }
  ]1 ~. y2 L  y7 O0 ~  }7 O8 I3 l2 ?. |2 H8 |/ h, [5 S* N
" D9 d6 P  A8 o; R: E/ W, B
  return getObjects;
: `7 K9 G% d( g5 M) E7 c}[/mw_shl_code]
3 W" [/ v9 b0 c" p. V
# ^( a  i0 w/ J' u6 t' o) s* U  K3 a) U

7 Z( T- g1 \. u8 P# j
更多实例视频和专辑课程陆续分享!
2 D; b) S0 i$ a
* Z( |# N5 X! k( U) [( G
欢迎转载学习!
. q6 C; M; X. C0 P/ ~; w( E% _- S
更多精彩内容请关注PLM之家
http://www.plmhome.com

& i( Z/ `: s2 Q. ?
) z2 O" D8 P8 k5 e; m: c3 {: L
: Z& d5 V+ x5 \6 A9 u

/ P- b# N$ D: V, M
END
PLM之家plmhome

% f- L. ?  i, [  Q' e, ~& f3 a                               
登录/注册后可看大图
1 ~  U/ O, s0 T# @* A+ Q
▲长按二维码“识别”关注

" |' y" x, D, u) G! g( Q! F1 v4 p  o: Q  i+ L. f6 S# h9 x
~~~~往期经典文章链接~~~~

5 W% I: s$ ?, E+ `6 h0 D
NX表达式视频

& Q8 z2 F/ z0 \
PLM之家表达式专题视频-1 表达式概述% h7 f, c3 E: w# Y! e2 ^. F0 z- Z

  T! `0 }3 C5 I5 J* n+ f; \
NX冲压分析可成形一步式视频
4 S6 G, c2 o* D) @: |* A( R( x$ \

$ E% A; }0 F4 f4 x
NX产品模板工作室PTS视频
1 产品模版工作室概述
; r9 Z; D* s/ }8 _. \
3 创建一个基本的模版4 X/ ?1 t! t6 h1 C8 _8 Y* n
4 PTS高级模版技巧" s. }4 V) m+ @/ K  ^  y
5 PTS添加需求HD3D
! U/ r8 x5 q. t7 m1 o5 _- p# g' P
6 添加装配模版
) t6 {0 S/ V6 U
NX高精可视化HD3D视频
% v( Z# @' @1 g: P* s' {
9 E+ P3 r  D7 H& B2 a8 v* x
NX模型检查一致性check-mate视频

; }, l' I. u( P5 m. ^" j0 H7 r1 c. ?. ~9 Q, z2 Z# }: T
NX入门视频实例教程(8 小时)
! ~& z! ~1 m5 @6 |6 z9 e
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

1 T3 N. S6 l' s- Y$ U0 ~9 f2 r4 I
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

/ r  Q+ ]" \1 C其他重点咨询
; Y# P3 K6 g2 Q' N/ c; g# w. D1 R
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
$ U9 f4 I' m3 j. y- G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了