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 2392 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]( y6 T% |2 S$ G6 H4 X
// tag --> Object" ~: i% z0 F- O. [/ O& `
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法# b9 z+ \6 p' m1 Q3 `# d& j
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))$ D( A% |* m. l
// Object --> Tag- g7 K4 }1 c  N; E& X
//直接通过对象的Tag()方法获取4 _4 b: ?8 n6 ]  o# R( S. f7 `8 I
tag_t getObjectTag = getObject ->Tag();
# G3 r; z! k4 r0 v//tag-->handle2 z. X7 U* D5 F- d7 [; S# v
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
( y8 `5 q; B8 V& q4 H0 d// handle --> tag
4 ]1 y9 |+ _, T$ ]$ t// ... 往后看....
6 g3 B% R6 h) v[/mw_shl_code]$ r. V( I. D" ?4 N0 Y
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

! t2 M/ s6 B4 q5 o
这个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]( Y" B9 \! \. i: o

5 [8 K1 N' w! h  O; Astd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
' u. e, M  z. L8 K' t{7 |- ^9 L$ J' l9 B
  stringstream ss;% P3 t; n6 d& i3 L# i
  ss.clear();, V/ i, r/ |+ t0 I
  unsigned int& A  t  G, C( o6 J7 b
    ID,, ~- V+ [* q0 |/ G
    version;
+ [* o5 T7 U7 b' T: K  char* R3 p$ ?+ L( z2 c. y
    * file_data,
# Y1 l' C( d  ~  M& ~% ^    * handle,
% v7 q6 s) k4 p* \    msg[30];& r5 _; p, q8 K, Y# k
  if (objectTag)
( [0 F9 U3 }3 ^1 W  {. S. [/ ^6 _' `9 I1 \# N
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
( E  R9 V$ e  C  v* Z) {0 Q' C    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());  C9 {  U# r/ c+ n6 ?! Q8 v
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
1 h; T! b, H# B, _    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);3 f6 S. T; S1 t, h; ^
    ss << file_data << "_"<< ID <<"_" << version;
9 J* H# T8 N' S3 w% |    UF_free(handle);
/ V$ N- }& B1 c( S% x    UF_free(file_data);$ d2 K( v# j+ b# c0 {2 L
  }
& v* z7 C: P1 u: f' d% l8 w
9 r2 v  J( h  k* B  return ss.str();
# C5 {8 u6 u$ y/ y# s' B; X7 D! q}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

+ Q: P6 k3 F; ]3 R# V) e
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
1 w3 Y7 T4 v) ~% r7 K/ R{
  q1 L# u. \  j4 i1 N# Q  vector<TaggedObject*> getObjects;
* m& k, M4 e, P# l! a# S  getObjects.clear();+ W9 k6 z/ Z0 o0 p% Q- l

' @9 H* `  k6 v. [6 x2 n  p  string attributeName("");/ `/ [+ b8 @9 b/ A. M' T
  string attributeValue("");& K4 x# z0 v4 v0 [! U: u4 S! b7 b
  vector<string> stringArray;# s" V% a0 S5 j* A& y# q+ F
  stringArray.clear();2 j" p, J; l3 T. I+ j  ]
  //get the attribute value ) S9 l% M7 k( c, W9 I) F
  // get the attribute name
1 f/ h4 @1 z3 H2 U& w8 @0 {& Y9 f+ c+ [. S" ~6 t* |# y$ t7 v
  attributeName = GetAttributeName_FromType(typeT);
, h' s  S; }/ W  N+ f: U: H2 ?5 y  if (isStringEmpty(attributeName))
9 P/ w0 z& i' v, f+ K( [. b3 u4 R, p  {6 b# x( p8 L: _/ `
    return getObjects;7 @% ^3 E# e2 e3 u
  }, z8 \2 ^; Q0 O( V
  //get the attribute value * x' f) }( Z5 s* {* |4 }- ^
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
1 t( d& j: K! K# {  if (!hasAtt)
+ Z* q" @- f2 [  {
: C. t4 }  n* g    return getObjects;
5 i/ R7 k- @8 Y( u* |& N  }
$ |( u9 r& o# F& P) B9 V5 b  R2 h8 [; L* G, a7 ^( k
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();' Y* c8 c8 p  I
  % p; }2 L( _- z. t, j6 k" T- a7 @. o5 G
  if (isStringEmpty(attributeValue))* R/ p* j* _" t! G- u+ `; D
  {- [/ l" u5 g0 V! P% m$ K/ Z& m
    return getObjects;
. ^! E- g+ a9 d# l5 M0 D9 a5 w  }
. h7 R$ a" \- y% g
) j/ O8 u2 _+ K; R2 M
/ R7 w1 L  R! z1 D. I  //get the key based on the split value
" y9 h0 x/ m8 @7 b  k- D0 T  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
: X$ d% Q6 C2 s- Z1 a) l  for (string item : stringArray)3 a1 x9 {5 V9 ?/ S3 Y
  {
! O" @/ o0 t" g- u    //read the string to get the object 8 s  k4 p/ F; E2 }! d. W* ^
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
" P4 K4 |* }# a- x+ y  `     $ c* H1 D1 d/ g9 R2 Q  J
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
8 l  Q% s) o1 y5 @9 _% T; j     {1 ~1 e5 P5 V& b, @0 C3 M& Q, d
       getObjects.push_back(tempObject);* M* _  B8 Y, f# r. J! [
     }8 p" q6 z* l- \4 w0 o( ?
  }, c* Y# |8 a# C! l0 I6 ^: D

2 G7 U# N1 Q6 N# v- U  return getObjects;
# D7 A3 ?% w' }! r. S7 j}[/mw_shl_code]
& `6 l# o" h2 @  L; B
+ X7 W$ |0 ?7 @7 _) u' Y' b/ S1 u4 x4 V$ ~4 _; A
! b" T/ e) K0 u' o: B9 ]1 r
更多实例视频和专辑课程陆续分享!
, B2 f3 X6 D9 i$ {0 y4 p: O* p1 ^
; R& h; y5 g6 _% f) Y. Q
欢迎转载学习!

0 U* x* a+ M- X$ @/ K! m* S1 a
更多精彩内容请关注PLM之家
http://www.plmhome.com
4 t. k% n- i+ ^; H


7 C" E3 h1 w' Y$ R9 y
9 R6 \  C: [8 J9 }6 H/ W5 @: l  q- `
END
PLM之家plmhome

. o; F, o' R- U, {$ Z  V                               
登录/注册后可看大图
$ g+ h; G6 Z4 R7 a8 ~
▲长按二维码“识别”关注

7 Z/ a+ w: }! s! B" j: y+ x: b8 v" ^: n/ U1 V+ w2 u1 ^& z
~~~~往期经典文章链接~~~~

; t8 Q5 J$ t8 [5 D, g
NX表达式视频

; X& A% w: j5 W3 f
' Y8 u% I% g2 Q7 o
NX冲压分析可成形一步式视频

; b" h  H4 u# |3 L& d
& I8 n7 \5 h  e: b, [
NX产品模板工作室PTS视频
2 产品模版工作室界面
4 `2 b/ K# @  i# Z3 g) ^
4 PTS高级模版技巧& F6 S# P6 e$ ?
5 PTS添加需求HD3D+ n8 Q; {' ]  M7 ^* n- Q6 o% \* B
6 添加装配模版
2 b$ V3 ~4 J0 [' u7 a: e+ ?1 b( |
NX高精可视化HD3D视频
2 @, a. v% H* m) p$ t4 h2 z% |
1. PLM之家NX全息3D培训-HD3D概述; O: f/ x5 K; M- Q7 u+ }  ?/ k
) p5 |5 v% R, y9 P1 T9 ^- n
NX模型检查一致性check-mate视频
5 |+ `* T6 H" \6 l/ S

, b8 @/ S7 G+ U& n! m6 @
NX入门视频实例教程(8 小时)
, h; Y( h1 h" t, j7 U! F& G
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
  G, e& u$ [- @9 N8 ~+ _
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

3 c& O- h) m! o% ~: g其他重点咨询

% \$ N( u( r+ y) G7 |( m
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
: I. M. R0 ]) }6 K0 u
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了