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 2211 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]
- ?( O6 T+ }% P, l, L3 \// tag --> Object/ Z% h# V% d7 r, N
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
2 Y9 ?9 I* ]+ W: P) p; K6 _TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))7 }( c" k7 j# X0 y; G4 s0 x% J; S! q
// Object --> Tag
1 W9 \- _6 s) t0 V) |//直接通过对象的Tag()方法获取; M! d/ @% U. Z0 C8 U
tag_t getObjectTag = getObject ->Tag();
) N" S) r) X8 \//tag-->handle
1 G! \; E2 K9 c6 d$ Gchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
& v6 e  K( e2 s% L% Q/ n// handle --> tag $ g; s$ k4 J0 r6 v4 `" {$ s
// ... 往后看....: }8 R" q7 F3 j/ B5 L/ _4 A+ z
[/mw_shl_code]. x2 \6 G  y" ^" _8 u1 I
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
8 Z/ D3 `0 P  `: E+ }; g
这个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]
" D8 @. l: [. t2 T3 m
7 f" x/ q8 v3 w6 O6 S5 {) I1 j& _std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
- D! b8 t3 z, V8 o{
2 v" w" Z; ?$ i( S  stringstream ss;5 ~6 Z7 ?& Q% Z% Z$ g
  ss.clear();
) s3 z. S* K' u* [% i  r  unsigned int, m  P/ U2 a) i7 q( |% S
    ID,
& A" D  f0 N; L3 t3 r2 n    version;
. o& k9 L! y* `3 I  char) d& K1 I" ?* Y& _3 g4 e& k
    * file_data,
$ p8 @3 T, ^3 ~9 r  t    * handle,8 b. [% W  r* N5 f! t0 }
    msg[30];& e) `* Z. g8 q- _" ?* m
  if (objectTag)
0 y/ Y6 ^' q) x7 f9 K  {
  M0 `" m# f. _5 k% E- \: ^; i    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
; ?% K( N# Q9 K) t    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
' Q/ C& ^1 B+ V    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
# _* j) g- R0 a/ q" A& |1 d" ^$ |    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
9 M8 A+ Z( L& L4 ]( N    ss << file_data << "_"<< ID <<"_" << version;# f) `* G3 V7 u4 P! I- ?
    UF_free(handle);  n! t4 o% F7 g* t% ?( x: f
    UF_free(file_data);
: f/ D' ^) v8 X8 L! T: a4 @  }
+ v5 j! z' {; M
$ O* c: B* X  N  return ss.str();7 H# t9 i& ^; _+ w& H
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

9 O* O( z' f( f( N: u  N
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
3 d1 R+ N- [0 A2 O/ b2 W, e% \7 w{
, ]9 W. o, `# P- A5 P  vector<TaggedObject*> getObjects;6 F. s% Y  Y; ?0 M9 f9 x' b  x6 E( T2 T
  getObjects.clear();
/ @2 R$ z& V" o: e6 K
9 a4 j* Z2 z9 F+ x& ^  string attributeName("");+ U$ X- x5 P4 }, g
  string attributeValue("");
% }! k1 @! O$ f- K  vector<string> stringArray;
. v& B2 a  l/ ?/ r3 E  stringArray.clear();7 a( e$ Q& c5 f; ~5 c* E
  //get the attribute value ) o  Q1 `- y' |% U: S0 z* x* P
  // get the attribute name
+ F$ x7 |* z* K- |
% S( q( m- k& O  W3 c5 K- ^  attributeName = GetAttributeName_FromType(typeT);4 f) z+ M& B" V+ N& S
  if (isStringEmpty(attributeName))  c& t5 g! k7 _
  {
* s- N# T8 W* K2 c5 u/ G. t* [0 s    return getObjects;
0 I  ^! f: p8 ~3 F. h  }  n, Q! e- z2 b( h8 X% i1 d" m' W
  //get the attribute value
( o# ]! X8 R* ^+ ^& n) M% ]  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);5 C) m0 x6 D0 ~5 u: O4 l" i
  if (!hasAtt)7 h- C3 x/ h- `5 W- G) s( f! F8 N
  {2 G$ X0 b% @3 A+ ?# h1 @+ y) E2 h
    return getObjects;
9 u/ s0 [( J: U* f- V9 b  }
$ G& g3 s- H( |2 W8 [* ?
7 ?3 w( R, G( v: S+ p5 i2 M  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();& W% v) t3 _$ H- ~! }, b7 K
  
8 j6 f* }4 {8 S1 J( I: ]  if (isStringEmpty(attributeValue))
# q/ S: n, z4 q  {- U5 r3 V+ H, T& `
    return getObjects;! i; r( L9 ~# u! F1 l" @
  }; `; d0 Q' v: x* X$ G# G
! l" k" ~: [/ v7 A/ s

: Z8 P+ N4 r7 K% ~/ ]  //get the key based on the split value . F- E) m, I$ \
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
! _; {% N- i! E3 S" ?  for (string item : stringArray)
, a- @. h1 ~, R  {5 i( K( Z$ x% c( d2 d2 B
    //read the string to get the object . N& W/ l, U& }+ ?$ L/ c( v
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));/ T3 f$ S5 t0 i! j$ m$ g
     1 u' O0 b( O' @& g; h8 @
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
# O; p) H' A9 ?5 H  }. F4 a/ `     {. g1 V4 C% I" M+ d1 @" u3 c$ s
       getObjects.push_back(tempObject);
% T  d1 H% ?8 R- a" ]) h     }5 v8 S$ t# |# a
  }
  q, n8 G, k; L2 U7 S9 A* f
* @# w% Q8 l" z  O3 x1 _  return getObjects;
5 l& Q$ C3 |8 [- M) P}[/mw_shl_code]) q* b. h) b# E2 Z

. {9 q* x) z$ L, q4 {
6 V. R3 n7 G9 K$ A2 J1 G9 m3 c
- R+ _/ e  ]; M/ i# ]+ q0 j8 C: C  e5 N
更多实例视频和专辑课程陆续分享!
2 \# Q' [6 y  ]: a+ S; U4 i
- X' D# z' |6 x3 b! s
欢迎转载学习!
; I  @$ g7 ^2 V# \+ a3 q1 d
更多精彩内容请关注PLM之家
http://www.plmhome.com
8 F; Y0 j0 P! i3 F% _# L


  {6 d- Z" |- j
- l& u5 x  t' H' W* o6 G8 }: m- l$ z. [& B" J) z1 l
END
PLM之家plmhome

! k( e+ c3 q  _" x7 c+ u                               
登录/注册后可看大图

' @3 o- b* ^  g, m! P/ O▲长按二维码“识别”关注
  z( f  i( Y" J6 E( |9 R5 F/ b$ {
+ J' u6 z- c6 F# c! V8 @$ |6 w
~~~~往期经典文章链接~~~~

" |8 ?; U6 Z" x  L
NX表达式视频

$ i, b) C8 f: `
PLM之家表达式专题视频-1 表达式概述: x  e' Q# I5 M/ Y3 S8 |3 J0 C

. G( j$ C/ {3 b' Y( g0 R7 ~
NX冲压分析可成形一步式视频

8 U7 ~, F; [9 D, q4 Y) W: m. X
# j6 j8 d& v$ a. G4 Y  @% X
NX产品模板工作室PTS视频
1 产品模版工作室概述* f) V+ {+ }+ A9 w3 l$ u
2 产品模版工作室界面* z  s+ z2 {/ T: V
3 创建一个基本的模版
! J9 h0 j7 }' [1 Q7 V, m- Q
4 PTS高级模版技巧
1 f& s' v% @8 i. A2 l0 n) z
5 PTS添加需求HD3D  s8 w2 q2 B. R7 D( \" Y
6 添加装配模版' p# i# O$ E  p% N: a
NX高精可视化HD3D视频
8 R7 d) A' x! s% Q/ n  e$ |
1. PLM之家NX全息3D培训-HD3D概述8 |8 M9 Z  L/ z/ @6 C# L; ?

+ |* c/ i( Y, ?
NX模型检查一致性check-mate视频

' u1 K; i4 s0 p! e8 h; ^; u' _* V+ P+ X& I- B/ Q# n' O
NX入门视频实例教程(8 小时)
. M; e( }3 l: |& m) F
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

" {1 W8 c( e# h( _) [/ d6 p6 b6 F
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

0 r! b1 w8 e4 w( a/ L% k( ?; w9 s其他重点咨询

) i, X+ U9 S- H" ]$ J0 j
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
' ]; {& l) n3 S- O2 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二次开发专题模块培训报名开始啦

    我知道了