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 2431 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]
% K( {  J: W& `8 H' B// tag --> Object
! A2 [3 {- c5 P  j//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法0 T& u- {- o0 B$ w, {( P
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))1 _6 A3 x" k% j6 A+ n% B1 J! [
// Object --> Tag
# M7 ~* `% P4 X& _0 a$ @1 E//直接通过对象的Tag()方法获取
3 P6 m5 o# \, ]5 Y5 U9 g$ vtag_t getObjectTag = getObject ->Tag();
8 I3 D; f/ [1 R( M& g//tag-->handle& s7 E, b6 v" e0 J
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());+ M; X/ x4 h: p$ b# l: Y" l
// handle --> tag 8 O; J0 R" F9 J) M6 Z
// ... 往后看....5 E; f+ |+ r  H7 P* H
[/mw_shl_code]1 s- n& u" f4 G; n
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
" a: r4 K, Y1 x- R% v; i- [, \; e
这个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]) j5 k5 j5 S' B

9 K4 N  r1 a$ ^1 n* ?std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag): m3 `1 e) h* u! f% \2 I
{; G1 |0 f0 S/ [
  stringstream ss;
& K/ I  c7 J& _( t% K; \  ss.clear();/ @5 X" P, L4 Z: G2 y
  unsigned int
& j8 H: u9 g$ v    ID,
' C$ e6 S" {* ]1 I9 Q( P    version;! n4 K1 ~, F6 z& v- u# O$ R
  char
1 L5 Q3 B5 l) R    * file_data,
5 x) R& F4 G+ S/ ~' {    * handle,2 W  A% q# T3 m  `
    msg[30];
; _) P* _' o6 q4 v: |  if (objectTag)- }% s) O* l* s
  {
# U* l: \5 @0 o( L' n    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());0 ~. c, p3 p+ |) ]4 R; b
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());! Z, w3 y# ~2 {1 u& t
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
" x4 Y3 Z& W3 F- _% x& {    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
; p* G( d/ h3 g3 t    ss << file_data << "_"<< ID <<"_" << version;
6 n( _+ Z/ ^/ }' b. P% |6 y$ n    UF_free(handle);
1 H) \( I+ _! b- n* C    UF_free(file_data);, f  Q! B. c# E( c3 ?% g
  }
7 U. a/ T( _, e
; p; ]8 a  U0 ~7 X# D/ r! X% e# V! f  return ss.str();5 U! j& B2 p: Y/ d% X/ ?
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

) u/ B5 N& U( i, z3 R/ I
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)4 O' Q5 x3 h9 G+ f- m
{
+ `( {3 B& q9 z& Q1 W6 `4 Z  vector<TaggedObject*> getObjects;
. k" B+ X/ M# {# ~( f' a. y' ~  getObjects.clear();
6 N2 S5 e% ~0 z9 m& z5 @% Z2 ^% v: k. Q, Y3 U) ~& A, v5 h& o
  string attributeName("");
4 \' j3 |  ~1 p9 @  @  string attributeValue("");1 w. Y0 A, ~, x
  vector<string> stringArray;
7 q& A; i8 a7 j) B! g" |8 |! O5 ^  stringArray.clear();
" l# s! r& f+ f1 p0 b  //get the attribute value
0 R+ O& e4 B; ~; @# z$ U: n  // get the attribute name
1 _) c5 f( Z; v+ m6 k. e& M- S! ]* L0 w& k% P& ]% r1 A) ~9 ^0 c
  attributeName = GetAttributeName_FromType(typeT);
  p9 h6 I, a0 I1 _, ]  if (isStringEmpty(attributeName))( l3 _/ K; w# y; G1 q; f/ S
  {, }5 d) b8 @$ N
    return getObjects;
3 J# M8 Z6 g4 \: x2 [) Q  }
) s1 c2 F% u6 ^3 l: [+ E  L2 d/ D  //get the attribute value ! E- t- S6 R& M, W4 B( t
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
/ m% e, ?$ B( g5 @" R  if (!hasAtt)
0 l6 \% ]% f& v0 u" Y  {6 J7 I) U% r2 b
    return getObjects;
$ i1 e0 M! O& q8 g8 q; {  }
5 p# @" h* v. m0 {9 }4 w" C. g2 e2 C6 Q0 F% V# J! x% ]
  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();) y- `* U, B/ O" D3 Q
  
& r( v* ?1 N# _: |" M  if (isStringEmpty(attributeValue))
& w( O# c( Y4 L' f4 c  {6 Z  |5 |7 ?4 _9 I4 c/ `
    return getObjects;" Z& `8 ~: W6 I# @0 H
  }
' N1 }! |0 A9 l+ t: b5 P8 n1 E. J" G# j

3 T1 R# _/ I, C- R9 U  //get the key based on the split value 5 h0 P; `/ S8 r& T8 a
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
( J' R, \! \+ M- E# ]  for (string item : stringArray)2 Y6 Q# @# U: e( e
  {
4 k0 g$ q7 X& [  U! c( k    //read the string to get the object
3 a0 o( G* W: p. I; U/ B     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));9 x: v" e/ [4 x: b( y, R6 D+ h8 n
     . a5 t( R& W2 {) J
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)4 [6 i6 A9 G/ k5 ~
     {
$ b* }- E1 ^/ r" T) Y, {       getObjects.push_back(tempObject);
* W, v9 q3 U7 n( A  H0 ]     }
) ]9 R% t! t% ~& ?1 ?& c$ S  }  J! p8 ^% X. z1 m3 N4 K$ a5 ]# G
6 g2 G9 Q  d% s% }! n
  return getObjects;1 V0 a# o4 W! y2 S4 d  U
}[/mw_shl_code]
4 x! M  ?0 b& B. x( h8 B3 q( d( H) b
. J) }7 ^4 G. D$ V
8 |1 j" P! h6 @/ I' \+ o) F. A
更多实例视频和专辑课程陆续分享!6 s/ I0 u7 w) D7 ^, P
3 Y$ v5 Q8 O) B+ M: R' _( g
欢迎转载学习!
; x: i! ~! B! d$ V- c) B7 _
更多精彩内容请关注PLM之家
http://www.plmhome.com
: O0 l' i7 B4 t


. U  H1 p( k' z8 M0 T$ b  Y( d/ v/ b2 J; n' h) g0 Q6 v  {
4 ~& q6 d7 }2 Q
END
PLM之家plmhome

/ W* ~/ M+ k# H                               
登录/注册后可看大图

6 D% c# X7 m$ u6 n▲长按二维码“识别”关注

9 R) o6 u7 x4 V/ m" w* m4 }/ q$ |7 W$ Q  N' t; |/ K& F
~~~~往期经典文章链接~~~~
# E4 W0 W3 j; v/ {* k
NX表达式视频
# I; w3 D3 E% j5 U

  k5 p* V5 k9 A+ C* a) M; \
NX冲压分析可成形一步式视频
# f$ U6 r/ u8 ~6 T3 U# o* ]1 `
冲压模具分析工具 3 全部展开实例
) [& ^- U# r6 I+ c) h! v( J2 {

5 \' h/ Z. Z7 v$ Q4 ?/ g! t
NX产品模板工作室PTS视频
2 产品模版工作室界面- P& x* G! Y" g! H# N  X5 s" k
3 创建一个基本的模版8 Z0 D$ Z$ L& O! s5 k( }
4 PTS高级模版技巧
8 C1 M7 Z5 k! s2 B" ]
5 PTS添加需求HD3D
3 J" T. Y* P! h; L7 x
6 添加装配模版# _3 I5 k( x2 t' H* m4 u* n) v
NX高精可视化HD3D视频
* r% f; \  M: t& Z0 {
1. PLM之家NX全息3D培训-HD3D概述
; [) Q0 g3 \  q& a! F: h" h& Q

, W. t# A$ \0 t. {5 t% B
NX模型检查一致性check-mate视频
( O- x6 P. W6 u5 }3 C# B

. X! p5 k7 p7 r- @! ^0 T% W
NX入门视频实例教程(8 小时)

/ b2 m- {9 s6 B, i6 U
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

; U( B+ m) u$ i4 t: D* z" \
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

6 `/ p# y2 d. A9 v3 h其他重点咨询
. x+ v, H7 [  ]0 [6 U2 E9 C
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

5 {% c6 ]) C4 e+ e2 l
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了