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

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

[复制链接]

2022-6-1 14:33:25 2562 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]
; W+ ?: C6 a+ l0 w2 e0 W3 k; i// tag --> Object! V2 Y8 t' L& v2 L
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
) U' [4 j* b1 n4 j1 x$ N7 `TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
. V0 D3 j0 r' Y& E) Q// Object --> Tag$ n+ @1 w0 T% H5 s; C9 O
//直接通过对象的Tag()方法获取
  q( h) J) w; O; K8 otag_t getObjectTag = getObject ->Tag();9 }. x! V0 [1 s: ?0 C
//tag-->handle$ X$ I+ b- ~' u" m
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
- b1 l7 ?1 g; [// handle --> tag ) m# ]" `) n- H% ?$ C" U6 o$ O
// ... 往后看....1 J$ |/ k% n) X, _# `
[/mw_shl_code]
0 Q4 i4 _* J3 t- I2 a
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

, ^4 `% K* q( a+ N0 K" J
这个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]( k! d* t3 `5 \$ C1 L
( K) K& i" e  {) }, E  m( P
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
" O# r, J3 G6 ?5 J$ I% U# ~{
0 k( K3 y1 C/ [( v% K  stringstream ss;; y4 Y! P2 L; L) e
  ss.clear();
& O+ [. |0 P4 E# b+ h) r  unsigned int
3 S1 h" }; t# k+ i: R    ID,0 O; n' U  Z$ o% x
    version;
  R$ v, {  E! e  char
2 Y9 x$ B! g* z6 h& D    * file_data,7 c8 W' H  V3 c+ v0 N+ I. n2 D
    * handle,
0 @- D- ?+ m+ e* }1 O! I; s$ x    msg[30];1 Y! ?) i# P) }& G
  if (objectTag)
+ l+ w7 c. N+ s) S3 y  {/ ?5 p) ?& E3 ^4 b
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
+ [6 A0 j$ P7 b. ?( d% r  z    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
2 C) W* {) Q: d, N9 T    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);; a0 u) F- d- a
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);( G7 B& C) O) x3 N% Z
    ss << file_data << "_"<< ID <<"_" << version;
5 H/ f- w8 [* o4 y    UF_free(handle);. a3 }6 B5 @2 `2 s9 p5 ]
    UF_free(file_data);
" |2 p4 |+ D: a( _- h+ U( H  }
# m5 Y) c8 ?% Y# n& r! Z: M& f: p# i( I5 ?1 A  l$ e' y. B
  return ss.str();
  [" X$ I, w8 w5 _& ^9 a' @- \}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
" {! G; q1 o+ C% Z
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
; S5 s# W7 L, x( Z6 t* D% s. ~{2 y! k4 B" H$ k7 |
  vector<TaggedObject*> getObjects;
3 _" Q) ~: |) y9 h% N  getObjects.clear();: T1 r6 U* Y- ~8 W) c
3 Q, m# z9 }1 {$ ~  X3 ?  c
  string attributeName("");- w* H1 ]* Q2 h2 i
  string attributeValue("");
: t: g: `5 t/ G8 V) t6 w0 d  vector<string> stringArray;  y1 X4 I/ m' M- q
  stringArray.clear();
" A! m6 O4 K3 i3 `5 F+ g, v- A  //get the attribute value 3 _" i% k) U3 ^+ i! n
  // get the attribute name
# b/ N: o, L& y  S% W  e* j+ `+ @( P! l
  attributeName = GetAttributeName_FromType(typeT);, A" @8 J) I$ g( `  e4 a
  if (isStringEmpty(attributeName))
) P' J4 Z+ w" F2 D  r( V3 A/ d* C  {
$ R  O" c0 m% F5 T$ }3 d+ P1 P5 T    return getObjects;: c3 L9 C3 Z# q% a3 j
  }
. d* P5 V1 ]) {. v) J8 B- L  //get the attribute value
! C) j$ q3 Z( M2 V4 _' ~  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
/ s  N9 m$ x# l' u  if (!hasAtt)& U2 F6 n5 Y. _/ Q4 _4 q# y9 p8 S
  {) L' |$ @/ L2 C* ]) P5 f0 g/ |
    return getObjects;
9 V; ]% N' ?5 A2 Q( l  }
* Y# n# U/ ~! q/ J; b1 o5 K' k5 O2 v# `1 W8 j' ]
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();0 P$ t3 H: ^( t' u( e+ Z6 u
  
  U6 t. r/ i; ?  if (isStringEmpty(attributeValue))
5 C0 m5 M9 e' D  ~/ ?. _1 R0 A2 i8 I  {
& n/ @- R0 o* e; N: s6 N- U    return getObjects;+ z  y9 k- T6 M3 D, s& s' f
  }3 Z9 A- N! M# X  O* }) p3 v

& P8 `. B4 i( M% C( E* r
/ e9 Z4 y# \% d$ p6 {  y$ W  //get the key based on the split value
, s% R1 x' [$ Q: Z  T7 m1 F# m  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);3 u8 e& h1 |. [) Z3 l$ U2 T
  for (string item : stringArray)
; n' T/ H( o( [2 i  {2 p) w1 P; Q6 U
    //read the string to get the object 0 K/ B1 d& n7 k5 v
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));  |7 h+ n* g$ f. I2 K
     / }6 W$ D4 |) w, k3 l8 P9 U  _
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)( \* {% C6 \* ~* `
     {# @! d0 \( S+ F6 q' x, f1 V  w
       getObjects.push_back(tempObject);" l* [) ^+ b1 O
     }* z7 B( e" i+ R3 V2 T- o
  }
2 H7 O2 Y4 D1 M
5 ^+ y) ^% C9 X& c: U2 W  return getObjects;
9 f5 z' W. J) e( N! e}[/mw_shl_code]4 D# C5 b9 `4 H: c' q' f

9 e- g' K! P% z' O  U' E, ^! H0 I: ]6 b! ^
7 w5 R8 B( {8 t& S, ]; S$ {! A
更多实例视频和专辑课程陆续分享!2 [* n3 |% o, v
8 u" B$ @, D) {% K. A' }- |9 ]8 V7 [
欢迎转载学习!

/ {: C" m7 S: d9 C
更多精彩内容请关注PLM之家
http://www.plmhome.com

: j6 k; _) y1 Z% o/ C
0 {6 r, j6 g7 S

0 D# O2 s8 x, g8 Z0 R7 J, F
. R" Y4 J5 ?9 N5 w
END
PLM之家plmhome
1 Q& A' L7 t7 o) q: P
                               
登录/注册后可看大图

* ?% J3 S. w9 _▲长按二维码“识别”关注
6 v; o; E/ T6 Q% a! Y

, M: O7 H) O6 T" y1 G6 b4 ^
~~~~往期经典文章链接~~~~

0 d# Z( S3 D1 K
NX表达式视频

( m0 B* M! F, P3 N6 D$ ]! A5 p3 E2 r; m9 h1 X" d& M
NX冲压分析可成形一步式视频
  O, J& `8 O' Q9 Q

9 }7 P0 a( `! I7 T2 {
NX产品模板工作室PTS视频
3 创建一个基本的模版& h1 I% M+ f- P$ y' J0 D5 v& ]) b
4 PTS高级模版技巧
1 A& C' g6 n% G2 D
5 PTS添加需求HD3D
" _: j& N0 w& |( e) F
6 添加装配模版/ y  {9 q8 n7 z2 @+ K5 @+ Y
NX高精可视化HD3D视频

" O' L- a  q1 w7 Y
2. PLM之家NX全息3D培训-HD3D基本使用
3 }) d# v8 g1 l6 }! i7 @: }! i
3. PLM之家NX全息3D培训-HD3D客户化展示
, n8 W1 N' z& M8 v; a5 u5 m! M8 n
4. PLM之家NX全息3D培训-创建HD3D# p, B" V; Q5 I& Z6 b9 X7 w) h
! w! H, p6 T: C" m2 D7 |2 Y, {
NX模型检查一致性check-mate视频

0 d6 T% z& q* x& \3 w7 ^* K1 Z; C$ F& G# a* M2 b  Z
NX入门视频实例教程(8 小时)

/ k, ?/ t1 [% \, b' U2 r3 S8 M
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

. O+ _3 w5 h( y9 }9 K4 t
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

3 U/ E" \& \, v7 \其他重点咨询

2 t2 h5 f' d, s: c
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
) \) L) ]$ d, K% R, ~7 ?/ h, M7 T; 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二次开发专题模块培训报名开始啦

    我知道了