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

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

[复制链接]

2022-6-1 14:33:25 2630 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], o0 R  @- s$ g9 z, M
// tag --> Object6 ]2 J- \" F$ a( u" O0 W3 M7 |- P) [
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
: b# w# n6 f0 ~( U* \TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))
  ]: W$ r$ b! \. \2 K// Object --> Tag
# z& o/ F& k- x  S//直接通过对象的Tag()方法获取0 O" h1 d0 V( A1 ?
tag_t getObjectTag = getObject ->Tag();
8 Y% [/ z  f$ a//tag-->handle
* G) |# ~+ \* j  b( M4 zchar * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());
' v" ?: g, O, a8 u// handle --> tag 0 Z6 N5 K5 K! g' ^
// ... 往后看....  @) c# h3 D+ a/ z4 s; A
[/mw_shl_code]: c% k3 p0 _$ v% w: U: S1 g1 w4 e7 w
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
9 y( C0 b' S+ e4 k2 H( e! V
这个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]' B+ x9 U+ X6 }5 F% M
8 }$ J/ B! Q( b3 y- [, E. G, @1 ]
std::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)
) b9 F* K/ c1 Z3 v/ F5 h& t& Z{
; k' v3 K8 E9 E2 |  u" v  stringstream ss;
& @2 a. I. _* z7 v- R  ss.clear();
( E/ I8 ^) ?' d# y/ e, ]  unsigned int+ V' u7 g% W3 g
    ID,
; p/ j) e  c6 R& V    version;; N( u$ t! }# X+ N% E3 ~) A4 `6 p# T) f
  char- B' t( ?3 r! O+ c4 [, ~: w) u
    * file_data,
% \& a  v- n9 N- s% M" C4 K& A    * handle,
& ?' T1 s% {$ m! i, B    msg[30];/ m1 E9 z9 y3 U8 ~- b2 }6 P2 \6 z; O
  if (objectTag)% \% X/ s0 w! X8 u
  {
' Q* E, A6 C4 x+ Q) `    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
8 I+ w/ F. K; b2 \' }    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
8 G3 D3 `0 }& t2 D2 F    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);
, Y" b2 `, o$ y  Q$ W7 p& a& S- D2 H    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);0 g: \% {$ ~: y$ B% u$ X
    ss << file_data << "_"<< ID <<"_" << version;' |: Q  X( }6 {# S( @
    UF_free(handle);: r5 c& N: k, A3 {. o# M" P
    UF_free(file_data);" \# p& X- f! s! ~
  }
$ O0 Q2 j) p7 _+ |6 y) z  Z: e  E6 d7 R
  return ss.str();* X% U3 a( [# _3 H9 q  Y: L1 Y
}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

2 T2 I6 g7 N, O9 ^
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)# Z$ E+ o+ y' H+ b- O* Y2 [0 k
{/ t* t2 W/ Z* u# F$ {& h( Y* a( N
  vector<TaggedObject*> getObjects;* |; |5 ^* }- [" l8 i- r8 B& C' w( l% }
  getObjects.clear();6 W$ Z& t. ?1 J; u- z

* L, B6 |, [7 j+ `3 f  string attributeName("");
# M$ ~% M/ u) V6 K& _( A; K: |  x  string attributeValue("");" x/ l8 Q8 A( ?5 d
  vector<string> stringArray;
0 |& k7 e" [9 \" G" y  stringArray.clear();4 k" f+ G3 D% O! F5 g% _7 f. R/ ]
  //get the attribute value 6 W8 t* w) O* u' h( @0 F* n3 q* g
  // get the attribute name
' O6 l' G' ]; |  Y8 b/ S4 `0 Q4 J% u
4 |6 s5 |) |  @% L/ t  attributeName = GetAttributeName_FromType(typeT);& Z1 m+ Q8 r2 v7 E" X8 N9 k
  if (isStringEmpty(attributeName)): ?/ V* {# n5 j5 d' B5 a1 }
  {& D/ ]/ Q6 {. E8 ^) s
    return getObjects;
* q: T& z) k1 y' i1 p$ P" D7 E+ \  }
  [- X- @3 c3 {1 {: j3 _5 J$ @  //get the attribute value
- [" v5 F2 ?# e, A2 S, F  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);$ @, Q% k( e6 Z9 o0 t1 \% \
  if (!hasAtt)9 D# P2 y9 ]0 u7 G* E4 T
  {7 G8 r/ ^2 ~2 \
    return getObjects;* ?5 f  f1 x! Q2 L$ S8 Z6 z, o+ R
  }, w. s+ c! i& ]! b! |  E

$ i# L) r3 u( C- C( @9 M$ w$ h  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();8 U8 F6 e4 A, N! ?! M
  
; H1 w! a( ]- Y" V2 v& B+ t7 S  if (isStringEmpty(attributeValue))
  h9 p# D" M! L# c  {
; T" b; }5 Q/ T( z& b- e    return getObjects;1 Y! L% o/ [' G4 ?" u$ T
  }7 `3 S7 i: Z9 S
; K/ H4 @& \0 _+ q' C

4 q! }" c! P1 B- L  //get the key based on the split value 4 r( o2 q6 _! N( ^; f
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);
/ O0 K: Y( ~) u$ N  for (string item : stringArray)+ W! k+ n. T  T  K* N8 A7 i: Y) X7 o
  {- O6 T$ ]/ }3 Y0 d6 a$ F5 m5 g' ~
    //read the string to get the object
/ q% n8 n/ @8 D* O  r( q     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));+ i# f  \  e) _; i
     
  _' w+ n& s  L' G( Q) |1 J     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)
& R" o- n4 J$ N$ R) _  L     {
; o, z7 Z: z2 K' s/ `. {       getObjects.push_back(tempObject);
. }: S$ @- L& y' I0 P: h     }
) s( E$ n5 m& t  }
/ i: m" q) w" ?0 t' c) e) s) s; t% }( T
  return getObjects;7 t, d* X7 D3 e' Y
}[/mw_shl_code]
5 y9 k8 [$ i0 ]2 |) L
; F7 i+ X% y6 m% o7 {8 |" B+ D' j4 X! m. \( f6 b! U- z5 g
8 v2 L  V9 ^2 A% r' Q
更多实例视频和专辑课程陆续分享!9 v" n5 g1 W) X9 |, ?

$ m0 D6 u/ P3 B; C# j
欢迎转载学习!

8 @* w2 ]- |) S# c
更多精彩内容请关注PLM之家
http://www.plmhome.com

3 Q: P( H& I$ }, C! [3 `! b
% o2 e: }5 K) @9 y$ C
% w2 V8 R& b# _/ U

( N5 ]" q3 r& Z! Z/ D+ P. R2 T
END
PLM之家plmhome
3 O- P+ p: p/ G8 P6 |5 v9 M( A" {
                               
登录/注册后可看大图
: Z, S# H' v* Z9 D/ G
▲长按二维码“识别”关注

3 u7 }. G& Z5 t, A0 n0 V5 i& J7 k
5 |2 |1 u6 {" z
~~~~往期经典文章链接~~~~

- D* h! e  Q# z, f) k9 @! r" c! |' I, k
NX表达式视频

8 N( c  T( R3 f- Y: A7 \6 X+ K* ?6 O5 }3 A
NX冲压分析可成形一步式视频
8 w& |  Z% O4 l! t8 W' E% K
冲压模具分析工具 4 中间展开实例)
( @  A) g1 n0 V# K: F, `& A( b' z( j
- K* }& |5 Y" w" [0 F* Q) G9 q
NX产品模板工作室PTS视频
1 产品模版工作室概述
) B+ E. v- M+ O2 H6 \- H+ u
2 产品模版工作室界面; y9 D6 U: w) F  E
3 创建一个基本的模版3 {3 `4 w4 W, H; N; R
4 PTS高级模版技巧3 t" X  B; j- Q
5 PTS添加需求HD3D
1 G, r6 o5 O- i/ C7 r6 b% }
6 添加装配模版& a3 B; Y; M. M
NX高精可视化HD3D视频

2 q0 _+ I5 Y0 l* h  w
1. PLM之家NX全息3D培训-HD3D概述
. l+ A8 Z) q2 \4 W  U" o
7 l1 O; \: [$ s( \: t- d& A7 c
NX模型检查一致性check-mate视频
; n4 R+ u8 F& Y/ C
5 @& u; N! J* o2 R
NX入门视频实例教程(8 小时)

+ Q( `/ a) K% Y( i2 C5 x7 g
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

8 h$ e+ }/ F% k8 h( k
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)
- {' y) d9 |$ h8 w
其他重点咨询
  }( f8 K- n) k" b6 S
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

- n9 @* e# C0 C1 }% ]
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了