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 2430 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 k- M) r# V! P) Y: n
// tag --> Object
* N, O* x1 Q4 S( z//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法, o0 m/ r, @2 C: i) D
TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
, t" }! r) ^' B) M) [' y, C. e; ?// Object --> Tag
- C- V1 Z2 ?& G//直接通过对象的Tag()方法获取
6 q7 `, ~/ I2 ]4 p) \6 jtag_t getObjectTag = getObject ->Tag();
* b$ j9 y8 U6 l6 {' a1 u' F//tag-->handle
8 ]8 M+ [/ j2 h- }char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
. P3 G( L. n/ B2 X- ^/ B" B: m// handle --> tag
6 J+ [% }% O' x( n" b9 v// ... 往后看....
6 r, ^; R- K$ C7 a" H$ }[/mw_shl_code]
' p9 d7 h6 p5 x9 m- D: w
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
' m. {+ n( z+ K5 }$ @0 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]
! Q0 g; W' w% p: ~7 l: b7 @- x5 O8 V5 T$ c
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
* B: o! P. J+ b/ p{: ]$ w5 Q6 _4 C
  stringstream ss;7 t: ~# {7 P% u
  ss.clear();8 q" i+ r6 }8 h4 Z% ?
  unsigned int9 {; M. X1 U! d2 a( S8 @/ R/ U$ {/ c
    ID,
: t2 _9 Y( b. {, t. r* M, M# v    version;
, f  G" m  m7 h5 K; D0 g  Z  char( J1 Q/ W) M4 N0 a1 r, q
    * file_data,
8 I( z' a/ C2 S% E! A5 J9 T7 \    * handle,) ^% m, i/ i  c0 G3 M6 Z& E
    msg[30];
& M, l0 x) E! V" P6 W  if (objectTag)4 E# h* `5 |6 Y2 j
  {
& \% R/ X; ]+ l* Z/ X1 T( N8 F    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());! k& ]& \9 f2 D: \
    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
" d; [! C9 v( o2 @, s* G! g3 s    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
+ }7 C$ g" Y& h2 L, F6 Y' ^& ]    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);
; H4 G" I0 p% b9 p: |' b    ss << file_data << "_"<< ID <<"_" << version;
' K/ S5 o" A$ X: K    UF_free(handle);) {9 B! x8 F# t  L
    UF_free(file_data);& S" [& M; r6 U4 v* D* N7 S& K' o
  }% N0 W, q* q! |9 W% r
1 G5 I1 w6 ]8 t2 E
  return ss.str();
4 l7 u0 d. p8 \: N3 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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

9 d" v7 t" ~3 ?" r. G
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)& n! a# D" G9 O* l4 y) ^. f( C8 s+ s
{
  l( W& L* F2 |# l  vector<TaggedObject*> getObjects;, X# A1 \, [: d# P/ _
  getObjects.clear();
' [. D; ~( N) c$ Z1 I8 H2 r. x' T$ r" `: _
  string attributeName("");
2 p1 q1 O' |# z6 i0 [( A  string attributeValue("");
8 S) i9 h* ^, H+ g; U! y  vector<string> stringArray;: w: q* `! {8 u  U, W+ Z
  stringArray.clear();; p# U7 o$ B5 A4 e* y+ v- ~: `
  //get the attribute value
1 K$ _/ Z- [9 O' o, ?. B# Z  // get the attribute name 4 a' V+ N- r' j* O
1 k1 Z' O# N3 g  [' F- R
  attributeName = GetAttributeName_FromType(typeT);8 W8 m  @! M2 n" n3 T. K
  if (isStringEmpty(attributeName))$ C/ }! \8 |) H
  {
' m9 b  b/ t' s1 i; n% F9 Y0 y    return getObjects;. u/ a1 f5 L5 @) ^
  }
9 y& Q0 I. r3 a! V6 x- l! D  //get the attribute value * K2 S/ j% k' W: T3 w
  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
4 e, W0 }) g2 P. _  if (!hasAtt)1 Y; k$ W. C) L" n
  {
4 z2 Q) h7 J- p5 R- [: g+ J    return getObjects;* B, n0 {( M2 S& ~* V" \
  }! b' c3 a4 ?1 M* Q1 k

9 ^: F3 H* T# D  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
3 f+ H/ d5 N  o- ?' ?  * ~0 j0 y  v% m9 o, ~3 m$ H
  if (isStringEmpty(attributeValue))
* s* p8 E  r. L  {
" i4 M- V5 H6 _+ M% C- E    return getObjects;
( z0 J5 ]+ _$ }& I: D  }9 B& Y8 E9 D9 b! @' X

9 o, L( v# p" Z& @8 X2 T
9 O7 Q3 p9 }  b  //get the key based on the split value
  o, t) s% D  G# ^( Y  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);9 F* K; I" l( @0 h/ i. ~' w1 L
  for (string item : stringArray)
! r" v% K6 c/ X1 G  {$ p; @. H2 B0 [# s# j6 q
    //read the string to get the object % ^" Q: U# y8 k/ ?* N# @
     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));" _* J+ X' i* ]" S2 Q
     
! c  t) \$ |  [     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE). C' X+ [$ |: L
     {
& _% {* T% e- B: z4 j' h2 r0 M. Z8 A       getObjects.push_back(tempObject);- w8 G( r2 o: D# l) y- H! F
     }
8 K) X0 G3 ~( s' Y9 X% Q  }$ }6 b7 [0 r* U. b7 }2 H5 ~  ~' a. A
) f5 `+ r, A4 ?5 ^7 t+ ]
  return getObjects;  U, M6 u" V% x) V6 y
}[/mw_shl_code]
+ H2 R0 Y0 \2 H- I3 ~9 [4 E! n5 r$ ^) R, @# l
$ Z7 a" z9 b+ ~) I4 f) `# \, V
/ k4 |8 \) m1 n
更多实例视频和专辑课程陆续分享!
3 F: x; d3 d8 K7 N1 T/ ?+ N2 d: D3 X. E9 ^. S0 `2 ^; ]
欢迎转载学习!
: G2 W* q* o6 ^, P# s
更多精彩内容请关注PLM之家
http://www.plmhome.com

8 H2 O* C' U. e- e% Q; o* r- k9 }

. T! R2 Q$ V; X& g& v! C, T' C2 V  V# w0 v/ M$ Y/ x5 T
! I8 D) f, ?3 Y: [) |) M
END
PLM之家plmhome
, E! R& ?+ z& }
                               
登录/注册后可看大图
  w, W* a% j( C, i4 z
▲长按二维码“识别”关注
* @7 C8 E! i' d1 [1 v$ }

! D9 g) o- t0 V. r3 o
~~~~往期经典文章链接~~~~
7 B8 ~9 k9 R- H9 p: q3 `1 y3 @
NX表达式视频
9 B' f  Q: y) L7 y5 X! u
PLM之家表达式专题视频-5 条件表达式, L6 Z$ o. S0 ]. {  \5 q0 k. _

. T1 w# k1 I0 C( R+ i) Q4 c' I
NX冲压分析可成形一步式视频
  z: K7 X  A+ b4 u( N8 Q
) @( B$ }  W5 q  Y' R" d
NX产品模板工作室PTS视频
1 产品模版工作室概述3 p" f5 J: C) H6 u4 y; P9 s. p
2 产品模版工作室界面7 K  Y! m8 ]7 Y4 R1 l
3 创建一个基本的模版
6 Z* Q0 P% p( [' g4 A1 }  u
4 PTS高级模版技巧
1 y) T' a/ d) [7 j/ J+ i
5 PTS添加需求HD3D
/ u4 I, f) j4 ~* l- C& S
6 添加装配模版
7 U; u+ Y8 `3 K
NX高精可视化HD3D视频
1 J' M/ F; d2 u: W- T% T* p1 I
1. PLM之家NX全息3D培训-HD3D概述; f" V3 V% _* f, v3 V2 Y( f+ E) H
2. PLM之家NX全息3D培训-HD3D基本使用
. D+ f1 w; L  H7 m# K1 ~1 w, `
/ }* _7 ~5 @6 r% m
NX模型检查一致性check-mate视频

! G) O/ Y  o& Q% v: Y$ j, @1 R% r* n9 X
NX入门视频实例教程(8 小时)
/ t6 G: q9 M: C- S$ E6 t' I' _' l
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
7 l  Q, W  }& G: c. H
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

3 s( v9 C) H4 `7 E1 P" P) m其他重点咨询

. _, s7 a* r9 Y4 y- }
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

; Z* ^; y$ M/ [. K/ P
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了