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

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

[复制链接]

2022-6-1 14:33:25 790 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]
; {; }0 `9 C$ i% X4 f// tag --> Object
2 B! f. A# V! F2 b# n0 x2 Z//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
# V0 g  l% K. _+ x7 Y3 kTaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))1 Z  U( ]0 r: Z7 |. x! m& H
// Object --> Tag
1 T" M  x! U; J$ J+ y0 H//直接通过对象的Tag()方法获取5 z2 q6 e6 p. `" O; U# c
tag_t getObjectTag = getObject ->Tag();+ T8 e% I* i2 Y# R' n" ~; P6 I
//tag-->handle* ^) ~9 ?. t1 T% R
char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
' N# u7 O, Q1 Y/ u// handle --> tag , D2 [. C0 \" S0 y
// ... 往后看....+ v6 a, g' N, E/ P% C3 z" j
[/mw_shl_code]
% K4 s% Q# p9 g6 J3 `: [
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
' c& N; A( A" j3 @: X1 i7 k0 p: 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]
7 E* ]! b- _4 |5 R9 q
# n& @2 h  k2 T$ Hstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
) D8 ?7 w, z! r{- {3 P7 W$ J! ^6 {
  stringstream ss;+ V: ^6 ?+ o1 {# N6 s# u6 V
  ss.clear();  ^( W5 r2 f/ F+ D' v% U/ v; h
  unsigned int
1 z0 W- m/ t: A- H: A8 O+ K6 P    ID,
6 S) ^6 l! V5 c8 f2 N4 J    version;
) H9 {9 u0 M0 v" Q- z% p  char
8 X" m! f, E  H, l( ?    * file_data,% u5 j7 e) c/ q8 G0 U  [  [
    * handle,
8 F2 l' W8 @& O( @8 N; k+ C/ z    msg[30];. a& p7 G8 h# p! s
  if (objectTag)6 j! D! H' A" o6 J
  {
. T7 \2 ?. g/ Q4 T4 {' K  i# X5 U    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
" I6 K" P( z5 s4 R0 E    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());# d- \3 C, @: Q  H: Q: p
    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);$ F, ?) y$ i8 p( @  P
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);. x6 q) Y/ l0 w3 F8 Z
    ss << file_data << "_"<< ID <<"_" << version;" }% D. w* }7 B; R8 M
    UF_free(handle);7 h% ?; H) E' z& Y# b
    UF_free(file_data);
# j8 y6 x9 P8 q8 M) l" k& [  }# i8 e$ f3 A: J% s- g
* M: s2 ~( ?: V# G4 ?8 P2 k, \
  return ss.str();* t1 A" d! Z2 I4 W0 C
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

8 M# M! q3 P! t! G
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)) {2 ~8 m& o5 x/ F3 g+ Y: ^
{
# V+ s" S6 v6 F$ M8 l& e0 \  vector<TaggedObject*> getObjects;
0 E; }9 I" U) ?$ Q; c  getObjects.clear();- F5 }4 ~  s0 W9 Z

6 b+ ?1 s: q, w' o5 ~+ i, O; r  string attributeName("");; ~) I- {5 H" @. ^: v- N  g+ ]
  string attributeValue("");
0 z* g  x. A/ O6 \1 ~' z5 Z  vector<string> stringArray;
/ F' X# z/ a- w! r! Y' }) E  stringArray.clear();
$ o/ w( p& R0 {  ~  K  //get the attribute value
+ z) [# }1 I5 D. {1 M  // get the attribute name 2 h5 f) r- W/ _1 C5 k$ k. w7 B, ]' I

* r7 ^) z2 n! d: y  attributeName = GetAttributeName_FromType(typeT);
: h+ E+ f' C: M; I- R; m  if (isStringEmpty(attributeName))
1 r4 i8 R) Q4 e5 X  {
3 N7 J% q) f3 L: L. U1 m. C* ^    return getObjects;
) K& p* Z% N- z. n" [6 x  }+ j% ], g, V- s7 Y! q0 D# d
  //get the attribute value
6 K$ |6 L8 B4 d0 K, I, e  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);
2 r8 D: o* ]/ D$ ~8 p  if (!hasAtt)# A" R! n) r& d
  {
$ S# c5 M. Z9 v4 d' w    return getObjects;
' C. G) [( t& {1 V7 a  }
* I: S+ M$ ]( H2 s/ u5 _. l, g# L
8 f7 B1 ?" Y) M9 A( |  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();
1 \% ]* F/ _; i3 n/ b2 m  
: p6 |5 x, s' M1 |3 S  if (isStringEmpty(attributeValue))( R) Y* d  s5 Z$ ]% o& y7 U
  {, C7 u; Z# r( K. C
    return getObjects;8 t8 @6 c& J( t- J7 Z; w7 m. l
  }
/ [& y, Z! c4 n$ G+ x7 B& m' Z4 N) N! S

% f/ S# n$ D0 {1 [& @- i  //get the key based on the split value
8 Q; s# [* G1 p, ~* n2 F2 w  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
; V4 f" t5 d, H. L) w) n  for (string item : stringArray)! A5 j  U( b' x0 t7 b
  {% b/ E0 w  `2 c1 ^( F
    //read the string to get the object
8 l* P1 j: k1 Y, h: V     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));& z9 a( k# K: f. F( m0 c
     
) Q8 X( \' e, m! V( F) G     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE); n1 L0 q" d3 B2 k) n5 q
     {
( \8 {; m; a9 G" B+ [1 G       getObjects.push_back(tempObject);
4 R, [9 _+ n5 R9 r2 O: R; }     }
0 a! I3 A& Z2 O- H  }
, j; Z8 z' r0 V! S: v' M+ o6 J, {' u' m  x
  return getObjects;
# t, n" b9 J$ d/ [. x}[/mw_shl_code]& X# V  [$ }- Y! Z3 q

  \2 ^5 f8 H* y8 V4 L/ @/ {
, G1 N1 m& J3 m. T
' Z6 {# z/ {" M& h0 X' S4 m
更多实例视频和专辑课程陆续分享!
5 \7 |' a9 B2 k2 x' V+ c% m* S5 q; |
欢迎转载学习!
4 P& o# p" |+ c5 j
更多精彩内容请关注PLM之家
http://www.plmhome.com
7 B8 q7 o  |, [! ]0 F


7 y- a5 B' g3 Y$ d& b
" a# a+ O1 I$ ^* f" a
% Q5 S6 n3 b6 @3 M
END
PLM之家plmhome

( A/ K2 Q8 z# c                               
登录/注册后可看大图

) X# a% f6 `+ \. I▲长按二维码“识别”关注

4 B2 x* J6 w4 k! \, b# V& t; [1 o  c* M2 A$ u3 g
~~~~往期经典文章链接~~~~

! Y$ n, A+ f2 W3 S, ~& X$ [
NX表达式视频
" j. H) g: |9 O$ D6 _+ W
: v8 \" ]4 X. @8 w
NX冲压分析可成形一步式视频
5 S4 w7 w$ u0 j7 w6 P, E
7 ]6 F$ G( R0 Z- x6 K0 I1 @" }
NX产品模板工作室PTS视频
1 产品模版工作室概述& C5 y" \; a7 r' u+ n# _2 l
2 产品模版工作室界面- U% h' G* x. J0 y" I
3 创建一个基本的模版
; K. A* C0 [0 S: F6 G
4 PTS高级模版技巧
) F& Y# i- r, d) ]; x
5 PTS添加需求HD3D
2 V- ^8 u/ b8 a0 f" O/ k
6 添加装配模版
* e. O0 \" x# q
NX高精可视化HD3D视频
5 h  K* g; J& A; L$ ?
1. PLM之家NX全息3D培训-HD3D概述5 n- r( b7 q) U' l, F1 |( J; @6 X

7 _4 w) d7 P4 U' X/ A- G) Q
NX模型检查一致性check-mate视频
; c1 Y7 d0 B9 s& z7 Z: Z' }

2 f6 T, G8 M1 L; K* v) s4 I5 j
NX入门视频实例教程(8 小时)
5 P8 t% e5 _. V! N0 J0 ]/ L0 _
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件
, ^3 y3 k+ @) q* `5 T" `
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

5 f9 n: A2 I% e  E其他重点咨询
7 `2 I7 @3 u, g  Z
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:
" U! Y# w; c& M" k  {+ w
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了