PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

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

[复制链接]

2022-6-1 14:33:25 1715 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 s) w* B% Z' ]: x9 N3 I8 t// tag --> Object! q0 A2 q3 Y3 H0 J+ ^/ C
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法6 ]# e$ ?! v& _1 _
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))8 T1 ]* Y. u6 l: K8 C" h
// Object --> Tag$ b% L* G2 v- A# B! R. `  P
//直接通过对象的Tag()方法获取
( b& h4 P/ b# |  T' K, ]) I, ]0 d* t8 ^tag_t getObjectTag = getObject ->Tag();
$ k8 C% @# ]$ T" Z# h& A//tag-->handle
) n  s( d2 q! ~8 `& y1 r$ W) tchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());; O% p$ `2 t4 K4 W" g, z) e& Q
// handle --> tag 6 ?( k  z# j, H$ h( Z6 h" S2 p' I9 @
// ... 往后看....
; p0 f0 F9 X- X* E: V[/mw_shl_code]
: X, t3 v3 S# b: W, _; f* G
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

3 b$ `1 j4 N# ^
这个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 t: o+ r, j$ n4 z. p

7 X8 U0 k0 |, u2 N4 x2 A2 D0 Gstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
& J9 t% [$ L5 f{$ m& U3 [. u; T
  stringstream ss;
1 m, l. }( Q' Q1 A' m% U2 G) H# Q0 j  ss.clear();- y8 Q8 k4 ~# v( x1 U9 ]
  unsigned int/ E9 S: c- H4 ^/ d
    ID,
0 P/ x3 V$ {- R3 Q2 f, [+ g    version;
# `4 `" r% F; C5 M8 t5 _  char9 g2 _  d/ h, [4 A4 N- j+ F" t% ~0 Z1 r4 E
    * file_data,8 W* j3 r$ G+ h; \+ \$ _
    * handle,
: X2 i$ _" ~- ^    msg[30];
# s3 h. T' W' Q! }4 A# ~  if (objectTag)) d$ ]1 R/ Q# `3 w9 o
  {
( ?6 ^/ ~0 k+ H    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
, V$ i& x" ^' q- p* Y    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());: F) t8 t& q4 f) ~  m9 c
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);5 G  J& |$ Z" Q2 m& n: {
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
+ V# z+ _. d( |    ss << file_data << "_"<< ID <<"_" << version;/ ~, ?2 R7 [- y3 l( m
    UF_free(handle);' A& O0 S7 }4 ~: Q* N3 J
    UF_free(file_data);& Y( L. q5 O: N, ^! e
  }) b! K% ]- _: }, g- k( ?
$ e+ z5 f  m9 t9 b  Q9 }# H
  return ss.str();; [) `1 p  M( }& }7 a0 U
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

) W9 Q6 |4 m* T7 o7 S
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)0 I& N+ h6 K( l+ m4 S( M4 D
{- x' [  M7 `, Z8 M* l
  vector<TaggedObject*> getObjects;
' t3 D& y# U+ p  p8 w* m4 u  getObjects.clear();* c$ u, g6 y/ Q: M
8 K+ O5 o! Q* }2 D
  string attributeName("");
( a" o& [, ~, w% C7 a  string attributeValue("");
+ W0 U' F; _) j! `! j" C+ Z6 p/ b  vector<string> stringArray;
' x1 x1 t+ x% ~2 Q+ v4 J  stringArray.clear();8 O* a" L1 Y# w7 H, Y$ d
  //get the attribute value
. e9 K  g8 u" y" ?5 D  // get the attribute name 2 Y" L* H5 j7 x" B5 w! `

: W; d5 ^% N, Z! Q! s1 U% ?' p3 v: c  attributeName = GetAttributeName_FromType(typeT);
! e  W- b% V7 g! c+ P. x  if (isStringEmpty(attributeName))
: _$ R  f0 a& _/ b9 D- X6 ]  {
5 L3 L) B8 H4 p, ]  {    return getObjects;
9 Y5 c% S  N: k" a3 _+ g" A* B  }
3 T* Y9 X8 }7 G8 e+ O3 u  //get the attribute value
: R( V) L8 V8 o- s& M  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
7 m  T$ x9 u% t! Z) J  if (!hasAtt)
4 F  P/ C! I" O0 r0 \; Q5 M  {/ K4 d/ P* k- o) E4 r# M( j
    return getObjects;7 @2 e1 V. T* {: J( E5 @
  }
- Z: o4 l0 E1 o( ?5 S) M& H7 d% D/ Q# V- K1 @
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();' h/ F5 n1 I+ y! D
  
3 k& G+ e+ \" e% z  O  if (isStringEmpty(attributeValue))- K/ n, N/ e# j5 D" R$ c# j+ j
  {! A: E' f# g4 u2 i( G
    return getObjects;
  n! E8 r& b9 v* K6 J- L7 I7 J" r  }
" G# w8 ^- B( X& U0 f$ Y' T8 H
* Q" Q% j8 n# e, `6 E* ^: q! G/ }; ]  T% n2 B$ ~
  //get the key based on the split value 7 c! t3 [+ Z* m. F2 r; t
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);2 T  |1 |7 U. C7 |
  for (string item : stringArray)
# }3 t8 h1 H# M0 j/ ^9 f  {
4 w; \6 g9 b% ~! s1 R    //read the string to get the object
2 h! @+ c4 A0 T2 W6 E7 F1 e     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));* D6 d( j+ j( m8 ]
     / X  {; g! o! r: H" ]/ R" b" r1 e
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)9 v; |2 y0 C" x3 a# E3 q0 j2 i9 o
     {) i$ l1 v' [5 K8 k
       getObjects.push_back(tempObject);
: E$ J2 E" F- V" r& [     }
8 e4 i+ P6 b2 V2 `  }
' w  _4 a7 ?7 ]7 T
1 d5 N% B9 [; X8 P' N1 i  return getObjects;: E/ W6 @$ _% L8 \/ W
}[/mw_shl_code]* G+ `+ G) J9 V1 E. b. y

9 n7 _# A4 B$ ?$ c6 h
/ _* h5 L! e9 ~! q/ `5 g- k/ c& k! k7 Z
更多实例视频和专辑课程陆续分享!
) d, `" d5 E/ S+ z0 G( @2 v& |. {* e6 Q/ M/ V
欢迎转载学习!

7 Z1 U$ c* x9 @2 u. g* q" G! e  @  |
更多精彩内容请关注PLM之家
http://www.plmhome.com

# D! q+ X  ~  q- d& d: |
3 ?+ h7 s- [4 O: M% r

4 ~' R) P% E( k8 {/ i. {& J
. Q  }* @! e1 Q
END
PLM之家plmhome
" M9 E9 u6 X" V& u
                               
登录/注册后可看大图
0 l( O% {- n5 a8 L! I7 p8 w
▲长按二维码“识别”关注
1 B( X& s0 I- s

- C8 @' {. w7 {! N+ d( U
~~~~往期经典文章链接~~~~
' P: ~; Q& ]2 {
NX表达式视频

4 W* ]& h" Q0 m
PLM之家表达式专题视频-6 部件间表达式" X/ j. Z- M. a* j0 u0 [# G6 Q( W

( K  ~: A5 _, p6 l5 _) ~
NX冲压分析可成形一步式视频
" U4 Q/ V. ?1 `+ H3 n: f! D# Q. W- A

  r- O# x0 B4 Z
NX产品模板工作室PTS视频
1 产品模版工作室概述
9 o; c. R2 _. M5 o* H" V
3 创建一个基本的模版
2 u# U- f. O5 D7 @; h1 L
4 PTS高级模版技巧
2 U, r% B. Z* x% [7 L" m
5 PTS添加需求HD3D( N- w9 r: \5 T8 F5 K$ S* k6 I
6 添加装配模版% U0 o+ R, e9 p, _0 d* [
NX高精可视化HD3D视频
% s' D( d  K. S0 ~5 b# x2 q) X
1. PLM之家NX全息3D培训-HD3D概述1 w* w) g; G  Q" V) f/ W* i8 X

7 N. v# I; N( j/ o) D0 R
NX模型检查一致性check-mate视频
& r( `3 I3 s% U
$ q0 M3 |% a! A& y/ e0 y) F) r& T
NX入门视频实例教程(8 小时)
$ [" k  N7 z0 n2 R  ^2 W
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
, ?+ Y' T; ~3 ?9 t7 `7 d
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
9 S. g! U$ r- {1 M+ T' ^1 ~
其他重点咨询
3 B! A, f( M) L  I8 i& q! X
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

, c) t, F! Z; _
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了