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 2393 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]0 A6 }$ H+ u7 R. x
// tag --> Object7 L* w, X" c' q' X
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
8 }- i9 m6 H% u. b$ u5 N+ FTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
- Y0 a9 s, _. r: l7 \// Object --> Tag9 I/ U, x$ H5 y9 i7 e, y5 k7 p
//直接通过对象的Tag()方法获取
! s" O3 P) b1 a* o  l. Y( Gtag_t getObjectTag = getObject ->Tag();/ [* M& o9 _3 u% C, k
//tag-->handle- n. d% s1 N5 c; L$ S0 M
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
! m4 |5 p% w" m// handle --> tag
4 U  T3 ?8 ]2 D' [  ], O% O// ... 往后看....
6 ^/ q8 J; R" e# E, I[/mw_shl_code]
  `5 U+ h8 ~& c
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

5 m: F9 ]5 G' q, D' O/ K
这个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 {% Q1 H& x! |+ x0 g
- _& r( n1 [* _3 H( r3 p6 r4 D' B( Fstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)8 J! B& ]7 J! `3 j
{
" r4 u2 s+ G% x# l; T4 q( L  stringstream ss;
' I5 o! [: N; h+ T7 ]9 L  ss.clear();
! b. Q+ |, b1 w2 l5 z3 A  unsigned int
1 v: R+ G- w8 m( \& s  M9 N    ID," p; T- J5 {3 r2 b# ?: \
    version;
' N7 L4 d: [$ \0 |1 k( P' G9 {  char
3 r3 H$ d, N* Z0 M' u. E  ]    * file_data,- m% l, Z# _, @: t1 q) L: x0 Q
    * handle,
. p, s# Z. n1 q7 T5 A    msg[30];
7 p( v' A9 D( [  if (objectTag)- R! e! i, F* K0 L. c( ?  ]
  {
1 D* B2 o* A1 B. J    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
4 U( ?3 L* A3 R, I5 h) L    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());9 h7 m# A9 d6 l" u! u+ H
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
+ _: H" p+ v& N% [: M7 i3 g    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);8 ]; ^, f, P! a
    ss << file_data << "_"<< ID <<"_" << version;, T# b* i% V: C8 Z
    UF_free(handle);7 d( K; Y( m: H
    UF_free(file_data);
3 h0 }- k/ a+ j1 @  }
2 b7 u4 o% r; F2 B, }/ l$ {0 J
( C1 i" X1 P! M- Z' L- r/ F  return ss.str();* u1 n5 d* @8 k2 }, w  J6 T9 i: @
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。
! H8 K1 R/ R  [8 n, f
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)8 L& ?0 b, `- t0 X2 Y, H
{# }9 Z. X: k" v3 X1 w
  vector<TaggedObject*> getObjects;
- q( V" k$ L) @4 R3 m' S  getObjects.clear();. A1 T8 }* E) `5 ?6 B
& A8 Q% }6 I5 m0 d7 k: L" G, G
  string attributeName("");+ a( b1 A, R5 e+ n; e/ u
  string attributeValue("");
: |9 l* S- ?7 U5 h% {  vector<string> stringArray;
- v- c) F' ~$ y# Z) N3 `& \  stringArray.clear();2 X, P2 A1 \7 }* e; Q8 a3 {
  //get the attribute value 9 X% d& |4 e+ u* w, |
  // get the attribute name 7 A  E6 q, B# k# S4 b
3 m5 E! M5 B3 e& O; ~# b" \+ W
  attributeName = GetAttributeName_FromType(typeT);% v: u0 h) B6 \# d
  if (isStringEmpty(attributeName))
5 F6 {  }5 z' A( v2 R  {
$ E, \! K5 Q4 e    return getObjects;  J4 b. a% g+ c. M7 o. b
  }
  w! Q8 T: n; b( M+ h) r  //get the attribute value
$ K# K! x& }" w+ h8 Y2 t  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
9 C) B9 S5 v/ k# `3 O7 {1 _  if (!hasAtt)
& c- D5 j4 e" P, P  {0 b8 f; M8 s" g
    return getObjects;
! X, O; N" O0 q3 `, _. ?' H0 ?  }
& _2 F: P, z! ?  C% t3 T: m) C
7 b# h7 S/ H1 J* o$ G5 c  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
, Y& @% Q  i; W  
( N! ]: g* K4 D$ z- Y9 J% J  if (isStringEmpty(attributeValue))( ]# N8 z6 [* [4 c1 a4 E
  {3 i$ v, L7 N# ~+ G; f( D$ s
    return getObjects;; n( ?! R8 ~( D' o& B! e
  }
4 ]) K7 I' o) w& K" f, N( L* j, r3 i' w( X& _+ ~* }
4 a" l1 u" y% R! Y0 s. P
  //get the key based on the split value
, A; T0 G' s, w% K1 Z7 Y$ q9 G# U  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);, d' j: [0 O9 l% `$ J
  for (string item : stringArray)
- A5 n& G' j4 \% x  {
5 a  ^" \8 D$ o    //read the string to get the object
& w- O' H# C3 u* B% Y; v; \     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
; z" Q( @+ c, D. O. G: e     
% a- t2 ^1 l0 @6 H" h8 N; r4 W. C     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
' s5 V4 }# E- e( q     {
# u  f0 M9 [7 I/ J; Q       getObjects.push_back(tempObject);# J% U0 E) g9 U; p8 h* i
     }
. x* ?  R1 q# x6 \( r* N  }
& X; x$ G: Q! s& i) N* @& D. {3 i4 A; q8 P! j: }- j
  return getObjects;
  x+ |: X9 b; K8 L4 }}[/mw_shl_code]
, t0 d9 }" I9 o3 l! w8 _/ }* T
" o( ~! w6 G+ P5 U5 L' x
; G4 c. t3 M+ D" d3 T) P8 I; P' E
更多实例视频和专辑课程陆续分享!9 H7 e" ~: x6 b

; g5 s  o! W4 [7 _
欢迎转载学习!

) N% S8 g+ k* @* i* g6 u
更多精彩内容请关注PLM之家
http://www.plmhome.com
8 h" i1 p$ u5 G


0 `9 v% w% k' X/ ]/ F4 e. d! ?6 |0 N5 e# I

( g* @, p$ [$ k/ }+ C) h) A' s% V2 q! i
END
PLM之家plmhome

9 K: Y; o8 [/ K) ^& F4 }                               
登录/注册后可看大图

4 l# y4 F6 {2 k" u3 O0 t& C▲长按二维码“识别”关注

+ O$ r4 v$ a7 L+ X/ V
' J5 |* N  H. Y. ^% ^- V9 v
~~~~往期经典文章链接~~~~

2 L8 H1 b4 D; K6 E3 S
NX表达式视频
) Q: K- t/ Z. Q1 H3 {

2 w  L: n, o) ]: v" |- {
NX冲压分析可成形一步式视频

+ F1 x; ]% I/ R9 B9 E+ I  S
冲压模具分析工具 3 全部展开实例7 J& e5 c  e+ q: f# x' Y7 B( ~( V( g

' w0 d1 i+ @/ R" Z) S7 X! `
NX产品模板工作室PTS视频
1 产品模版工作室概述) H8 v$ ^$ L7 S! b3 o+ M( N
3 创建一个基本的模版2 r1 |1 ~9 E4 p1 g- }  }! u
4 PTS高级模版技巧9 m- u; @. T% ~( I
5 PTS添加需求HD3D3 G* \9 [5 r- N: j$ a2 y$ R
6 添加装配模版; ?0 @! f7 z; k" w
NX高精可视化HD3D视频

4 d& v: }4 P( ^* u" J
2. PLM之家NX全息3D培训-HD3D基本使用
5 B0 r4 r: Q% m9 T) R: c& R1 i
" x  Y5 g) q+ y8 `3 F; g
NX模型检查一致性check-mate视频
" {! |! o) _/ \0 }( X

& {! y; p8 }2 L$ [5 `
NX入门视频实例教程(8 小时)

; M; S) ?/ X' h8 ?
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
( M# d. f1 ^5 ^" b# z
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

: W* J. c9 {5 x其他重点咨询
1 a$ B3 G1 c1 k, \( o: f
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
, y+ p" O- P1 g% s& X
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了