PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

[复制链接]

2022-6-1 14:33:25 2438 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]- w. @$ e7 Q7 p6 r
// tag --> Object
- q# u. ]4 `! c# f  z# w//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法3 a; @  U/ J; d
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))0 C. H& ]  s, a4 T8 `9 f; ^8 F" G
// Object --> Tag
( z2 @+ S, U2 U) Y" I0 i//直接通过对象的Tag()方法获取- l) X( f2 l$ w& _
tag_t getObjectTag = getObject ->Tag();
" x- G, O0 Z- T( n8 z! y//tag-->handle- f" `: T6 [7 }5 r9 n/ C7 ]
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());4 I( B) p: U9 K8 x: l
// handle --> tag 0 ?. ~# V! v( U0 k: e
// ... 往后看....: X! V9 b5 d, G5 D" k
[/mw_shl_code]
/ c" d6 n9 e6 k# ]  Z
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583

8 n8 @( U$ u6 \" B% |+ c  Y4 f
这个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]8 h- _: \( B! @) h  ?

7 W. a4 }. C! E2 x+ h1 o3 mstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)2 C; o' P" b) Z% s" }
{
" f  Q/ r5 \) [5 q, o  L  stringstream ss;
6 t: g( R1 f7 [. B  v" o: R( e  ss.clear();+ E7 N0 w/ s' x0 ]. |) @& g. M
  unsigned int  r+ W$ f  q3 R5 f+ m
    ID,; y9 O5 @& i1 q) ?7 u4 W
    version;
7 z8 l, ~7 K' |; C( r0 s  char
- x, {1 Q2 m3 p# d# a    * file_data,$ B* [0 O; Q" z5 K* j
    * handle,
& o: M0 K! ^. h3 y1 S    msg[30];
4 e( N! l' C6 T2 o  if (objectTag)
* ~3 g$ Z4 \! A* {7 u  {
  T0 O7 D9 H1 U7 i, l! d6 N    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
6 \  E8 F5 y; w- d) b0 T    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
% F' l9 N" P9 H2 r    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);1 `" b" G* A- V9 y5 ^: l( N  U2 d
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
# o! ~9 _: E- c+ T% P, K+ b! a7 I    ss << file_data << "_"<< ID <<"_" << version;
4 M/ _  @8 L" b. C' z% l    UF_free(handle);
% Q4 ~8 d  l$ Y  Q    UF_free(file_data);
" E9 ^( E/ K6 x6 [, h  }, d- \3 ^8 ]6 P  ~- [8 G  i$ e

1 V* n$ ]# T) ]/ ~3 L, r6 }  return ss.str();: [% q# o; F% b- L& w7 V
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

$ o) a7 N" M1 ]
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)
4 }6 ~# Y# ?3 T4 i+ [1 k* t! _6 Y% n{; |$ F. i9 K( w+ ^
  vector<TaggedObject*> getObjects;
1 b$ h& E5 v; b& k/ I. Q  getObjects.clear();
6 y8 k$ }; ]9 m1 A4 B- B6 z' y2 o+ _9 O, `0 K5 C5 O
  string attributeName("");
- ?' o' W5 ^" E- e$ |. o( i  string attributeValue("");
% \+ _4 N6 `8 O3 ^  vector<string> stringArray;- t0 k( E! N) w
  stringArray.clear();
/ h7 ?: p. f, S. `" C( G, I  //get the attribute value
" F+ A) N+ Z6 G0 R. t  // get the attribute name , h, y: R7 w3 X/ d# F2 ]! ?

  i) R; `( t+ v/ _" T  attributeName = GetAttributeName_FromType(typeT);
" a" \9 I8 W( ?. k, R" [- B  if (isStringEmpty(attributeName))+ u/ S" Z1 H4 I* @
  {
, s# h' J; ]' M) Q; F    return getObjects;* V) s& u; T# V1 F
  }
0 D- Z  \' Z/ u4 T% ]2 |' G  //get the attribute value
7 d" H$ ?5 `9 A2 t6 @" d  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
. P% w% Z) V: ^' r  s! B+ U  if (!hasAtt). ~: v+ }* W5 N8 F8 F  {# E3 I
  {
8 H' G2 A6 Z: s8 n$ d$ S    return getObjects;! s: F; q  X# _" s# u
  }0 d# Y; V: Q+ \, w. E8 S& X3 S! |# e
3 R5 q) d7 ]+ r( ?$ q6 n
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();+ `4 R$ O& E2 l; L. J* I
  9 \7 p5 u2 q. E+ }5 C
  if (isStringEmpty(attributeValue))
$ b/ \/ }; G/ h  {
& U2 e) {  S* O" x  ]    return getObjects;
* P4 g4 C3 `$ Q6 I* W, I  }" W9 S# |3 y5 _! _) x4 U8 b8 [' [
: o+ A( l! r/ A2 f5 E& j
. {4 Y: f: D9 S- {8 N
  //get the key based on the split value
# A3 d8 W0 A$ A  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);& q2 D, r4 a1 }' ?- u- d* X1 N7 Q
  for (string item : stringArray)! f2 D' Y5 g  ^, k: N' s) }
  {' m& D9 F7 ~5 E1 s/ g* a
    //read the string to get the object + z+ N, Y$ p+ j9 j
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));
+ s9 X& ?  u/ c! o     
! U1 f, N+ u$ W$ O( s- m, p     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)8 |5 I* d# r4 H7 V
     {
0 `3 q. u6 Y" [' n8 n       getObjects.push_back(tempObject);
" K) S, M0 f3 p2 z% o5 ?     }
  T' ~0 A; B# U* D, ]9 ~  }( j! |- p6 r& _' Q
2 ?6 J5 p1 e6 y! X8 ^
  return getObjects;
/ I) ?8 P3 ?$ ~1 H" X6 c6 N7 a, Y% n}[/mw_shl_code], Y9 s3 o4 K. M, a! A% ^" f8 {, [
  j/ b& v' G" Q5 `$ Q- R4 m6 T( f

- H) |: U! m% s- B# ?: e3 y* A: j+ `& M6 i3 g8 F# Q* h
更多实例视频和专辑课程陆续分享!2 |3 ~2 y+ Z! R5 h6 {
% F, l4 T8 H7 }8 m- n; C5 {
欢迎转载学习!

! J- j# d4 q) B& n: Q
更多精彩内容请关注PLM之家
http://www.plmhome.com
( e/ I& U1 o- X( c" R" X; f) L


: B$ t" p* d( ~+ \: R8 n8 y) p4 q3 i  P1 N; u" i" z, d
/ q1 P9 F' a: z; c/ a! r
END
PLM之家plmhome
2 K1 V/ @; f& X( M$ c
                               
登录/注册后可看大图
# Y- Z6 g; q! D9 r, ^  V% p
▲长按二维码“识别”关注

; j0 v9 @% [( o* F" B
8 k0 q8 h4 Z9 g& P6 a
~~~~往期经典文章链接~~~~
8 d- i0 q' N7 Y) X
NX表达式视频

0 H; ^6 M/ t! L$ w" S( C1 a
PLM之家表达式专题视频-5 条件表达式4 i5 F! Z5 m) ^/ ]* p3 C3 A. V$ L

3 s* v8 q1 m( @( ^
NX冲压分析可成形一步式视频

; \' T5 V& @/ g2 Y/ W9 A) ?( F% P' @! }- u  [
NX产品模板工作室PTS视频
1 产品模版工作室概述
; X# a! s$ v0 C& w0 f
2 产品模版工作室界面! ~  |1 d- A, v  s  D
3 创建一个基本的模版- V( a9 I, E0 o0 w4 ~- i
4 PTS高级模版技巧
7 A- j) T2 E: B: q- R, p5 s
5 PTS添加需求HD3D! L- {9 C( ]9 G! M/ ]! i
6 添加装配模版
0 z, g- K  j9 R* G( E+ m& p  @
NX高精可视化HD3D视频
  D9 j- X5 L1 f  o% m; O/ T
2. PLM之家NX全息3D培训-HD3D基本使用8 X7 t! R  F, Q, Q" u9 ^& ?9 d9 n

# h2 N% H  l% q/ l
NX模型检查一致性check-mate视频
  r' G, B: }4 s
2 \- ]* i' ~. k' M4 d
NX入门视频实例教程(8 小时)

! \) y2 D3 X" k* ^! L+ E3 f
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
* q% v' o  D3 c) F
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
8 G/ t) K4 @/ E( {9 _2 ^
其他重点咨询
# g7 S2 O+ Q' u& b1 }
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

) w! J+ k2 g. W' G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了