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 2412 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 D% u  v' B7 G" l6 ]5 N// tag --> Object
7 ?' D3 C, j. V; D//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
, C8 {, T( q/ W6 k) ^: aTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))5 G  u6 n0 `/ E0 s/ P& ]! x* s
// Object --> Tag
4 ?8 G  I% ]: _0 i& q# e//直接通过对象的Tag()方法获取8 p3 d* l, F4 P3 v
tag_t getObjectTag = getObject ->Tag();
4 m' I$ E$ t" A+ g2 [" I//tag-->handle; ^; k; r2 f# w# [, x4 r4 f
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());& a# d0 o6 W7 A# O
// handle --> tag % w; p3 i4 h3 D! l) z4 v9 k
// ... 往后看....$ f4 t( U% L1 ^1 t
[/mw_shl_code]
+ D$ k$ k! v$ [9 w5 a9 t+ a
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

4 r6 v) D) c2 I% 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]# F6 J0 o# W- k' Q
7 N7 |  J. g  c1 [$ B, ^& k
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
$ ~. L$ I( G8 D( X/ c; ^- I{+ @. e% ~1 m) b6 ?# p
  stringstream ss;
$ u3 O( y7 f& f! Y$ i  ss.clear();
: O/ W2 d7 ?  U0 x  unsigned int
" Q' D9 W- u- b    ID,
+ P& F' J7 P5 U3 s$ |    version;9 m- t' S. L; h3 P" n
  char/ x. a  C& `8 a5 i" P
    * file_data,
7 e  X$ |& ^2 {9 ^    * handle,2 m' m8 c1 Q3 Z& Z/ u
    msg[30];/ L; Q( t% [) M: e
  if (objectTag)- @4 f! A3 J4 W1 D1 E
  {! L% _! e$ t& d( v
    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
( y0 D% R9 X9 k+ X! B: k    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
1 n, ?# e/ E7 q. M- e* `8 x- l    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
* m3 N: j& n! o$ \1 z5 P    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
: v  L- D- y" h+ l. I    ss << file_data << "_"<< ID <<"_" << version;
( l: y+ q  i9 R9 a    UF_free(handle);
* c( G$ x3 ?6 X+ {2 L$ R% `    UF_free(file_data);
6 t7 L4 A) }1 O. F$ z  }
/ Z; b5 u  m$ W0 S8 {
3 O' z  [8 U6 H7 q  C1 ^) o6 k  return ss.str();
* a3 l# V! o, A7 A# 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

5 k2 R$ w) W5 m5 \
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
8 i0 q2 U7 f3 u, W{2 T2 b, `/ z' z. p: X- z4 M' O
  vector<TaggedObject*> getObjects;
9 V7 r' L' {8 F3 l! K. I. k  getObjects.clear();+ H! e  @- @$ Q6 _3 K* e

0 r* C5 y# \# g( p7 @$ J* ^% a  string attributeName("");
+ J) e8 I  J' g; ~1 L  string attributeValue("");
7 H' ?* E) }. \2 Y' z  vector<string> stringArray;
! T5 s7 M- U* R. d  stringArray.clear();
! h0 o* o. w) x, L/ @  //get the attribute value 6 j! e- K3 t( V0 I1 ^$ k3 ^
  // get the attribute name " @! D0 q! \  X/ ]: V

) k' A( x8 m# Z  attributeName = GetAttributeName_FromType(typeT);3 z2 E! I% K) q9 M
  if (isStringEmpty(attributeName))
& S* {/ k+ {' l1 L' h6 E  {' O' E, D  F0 N7 h: y* E5 N
    return getObjects;1 }# _7 z$ ^4 H+ c" e
  }  d% H6 \; ?9 o2 n
  //get the attribute value 9 o" A) c7 O. F% z/ G
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
/ o8 r7 p2 Z7 D; u  if (!hasAtt)
3 F( o/ x, `5 r% w, l0 e  {9 o+ }. H/ ^) S/ o3 f! l$ N8 L. x
    return getObjects;  \; X; o/ c: n8 b' k2 R
  }0 B+ I6 d0 `/ S, D

, g- t/ I* I* E6 }) u+ ~( p" M3 X  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();0 ~5 i# p, k- R; Y
  
4 I8 L  R, L2 m% B* C' c9 e  if (isStringEmpty(attributeValue))
* ^& K' ^/ _/ Z$ t  {
% L% Q" d) e9 \; Z    return getObjects;
5 r$ H) p- a" G0 c  }
/ |& F6 @* u5 }% m9 X
" C1 T6 E% ]0 v" ]& o7 v% v; h- g& v8 |7 J! @0 y/ ~1 w5 Z8 p
  //get the key based on the split value % h6 d0 X3 O$ W
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);% ?2 P) y8 ~3 O. b/ D$ ~$ n
  for (string item : stringArray)
; c$ R) X% Y4 W& x7 r  {
3 U" m, R" c2 I+ G, Y. m    //read the string to get the object ; v/ x2 y! N5 R' ]$ w9 V* d2 f
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
) ?1 R' g, y; q- j' W0 U. w! |) ?     
/ F" N( ?) i' d  p* P     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE); t/ e! B0 s. a7 }" T0 p
     {! B0 O1 _( z5 Y# U( c' k3 S
       getObjects.push_back(tempObject);
1 }7 B# E$ s( V, {" \     }9 X2 g* j# C3 R. u1 l! q
  }
5 v- O# Q# b0 ?7 `( F9 l' L- r/ N, [7 B
  return getObjects;( {" z2 M' l8 ?; V7 {, ~1 ?  [
}[/mw_shl_code]
; f) {- j$ s6 p$ H$ G8 G* C
  g2 g! O- w& Y7 M$ C
' _) I& l: `: S  y! G2 g; N
, H4 D1 B% ?8 e: U+ |2 [
更多实例视频和专辑课程陆续分享!3 N: [5 h' j2 f5 n$ W

$ Q2 C" H: X9 h$ W) N# T$ u5 h
欢迎转载学习!
0 `! N3 Y" f! _; w; l0 Y0 H1 I9 X
更多精彩内容请关注PLM之家
http://www.plmhome.com

& ~3 z$ W% |- O, y* y; a. U

4 P. u+ H! u) B0 D1 ?. Z, |4 o% g: f
9 Z7 F& J7 m3 B+ W4 W7 f
END
PLM之家plmhome
. A) i" m- ~; b) x  n( y
                               
登录/注册后可看大图

1 J/ C% R. `- U* K1 D& f8 s* e▲长按二维码“识别”关注

% ]6 y; g) }6 \$ X, _  O$ c& c. b: ^0 {+ r: Z0 ~
~~~~往期经典文章链接~~~~
/ Q' l8 H* x9 W/ [: l& c) u2 f
NX表达式视频

1 E/ G  B+ D* w1 t$ `! h5 y6 n$ ?8 w0 x, V: G3 N0 I
NX冲压分析可成形一步式视频

( a- [3 ^6 L0 h3 C7 s/ e" I
冲压模具分析工具 3 全部展开实例
1 o9 `6 s2 i/ n" c4 w! @* X) y/ S
: K+ w' S) Z! n/ y# h  ~/ N4 h
NX产品模板工作室PTS视频
1 产品模版工作室概述
- _2 m+ C' g1 I  g
2 产品模版工作室界面$ j+ j( x2 g) x) }* d* z
3 创建一个基本的模版; a6 q* U* Q0 g  V& o/ ~
4 PTS高级模版技巧; T& j% I3 _8 z6 z
5 PTS添加需求HD3D) U+ k( l* k- x' B! }. e
6 添加装配模版
  `( a/ E. j) D' V7 Q
NX高精可视化HD3D视频

( ]! W" ]  {1 \' @  r6 C
4. PLM之家NX全息3D培训-创建HD3D
1 X- E8 V5 {: a7 |( E4 ?3 y6 }
& L% f# g$ A7 [9 o  Y: Y' B/ V9 A
NX模型检查一致性check-mate视频

5 n- }! }3 j% I# U( {% R! D5 [$ L5 h# q) G0 T
NX入门视频实例教程(8 小时)
% b: a, t; Z' ~8 j
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

/ ]& P) A# A4 _! K5 {
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
; d! m+ E$ @, J6 R. B. s2 i
其他重点咨询
0 z0 O. Q6 N& Q9 G7 [
工业互联网咨询:
工业互联网创新发展行动计划(2021-2023年)
7 p; d* |1 h6 w5 I% ?  \- r, H3 l
工业软件APP:
数字化转型:
工业互联网技术栈:

: `& H# P  \2 p% Y, A
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了