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 2461 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]( y. w8 c6 f$ M! I3 t9 C
// tag --> Object* E, i; v0 ~1 R7 w* x
//这里通过 getObjectTag 转换为 TaggedObject * 使用NXObjectManager::Get()这个静态方法
5 @# h  }1 P& \# N5 X# ]TaggedObject * getObject = dynamic_cast<TaggedObject*>(NXObjectManager::Get(getObjectTag))$ C/ v3 ^! p$ i$ h) e
// Object --> Tag+ m8 p$ c* t8 J# {5 r/ s. ?. M
//直接通过对象的Tag()方法获取
. Y/ E2 b, ?, |1 w0 [* u5 mtag_t getObjectTag = getObject ->Tag();
0 }$ |8 |7 z# |2 t# y6 r//tag-->handle
" A% c% F1 S% E3 N& |char * handle = UF_TAG_ask_handle_of_tag(getObject ->Tag());) z( L9 z' Q- D, U9 t9 u6 r9 j
// handle --> tag 0 A* V8 _" ]9 e3 j) z8 {0 G$ E
// ... 往后看....# m9 I2 N, F! G4 U- |( o8 G6 _
[/mw_shl_code]
8 K' h9 A6 ^! [& |( A$ s
GetHandle: RMHPressureSymbol.prt R0000068a00000028
GetTag: 52583
/ H6 b. J# ]2 t8 S
这个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]; |+ u# g9 m- e

3 P0 q% B6 H7 d3 n5 V+ }. `/ Y' bstd::string CIDS_BaseObject::GetObjectHandleStr_FromTag(TaggedObject* objectTag)$ A; E) x4 _" r" L6 \5 Q1 F6 G
{
' H( F/ c3 M' J7 t9 v9 t, t  stringstream ss;
% o6 o( `$ s4 ?  s( e  ss.clear();
) b, I, }- ]6 ?3 K3 t, s  unsigned int
1 D0 b& f6 _5 }    ID,% `. S) [4 _7 }( M
    version;9 m7 j+ m( v  K5 C" ~4 G
  char
) w9 P$ H5 V7 J9 v    * file_data,. e7 z$ J( `) N$ @9 g
    * handle,
( z2 {  _& V& Q) N, t8 S- O2 Y    msg[30];
3 r7 E" n8 ?2 B6 x4 J- _, L2 E. @  if (objectTag)
' ?( x1 x  j2 D4 [/ V- J( _# U  {
% j6 }& Q0 |( X/ d* Y" C# b    handle = UF_TAG_ask_handle_of_tag(objectTag->Tag());
. t# e! H" k% B/ y    Echo("GetHandle:%s\nGetTag: %d", handle, objectTag->Tag());
# S" I0 c. }9 i3 R: v    UF_TAG_decompose_handle(handle, &file_data, &ID, &version);6 N# q1 v4 F- J( s9 i0 ^# v" ^9 E/ e
    Echo("...decompose...\nhandle:%s\nfile_data:%s\nID:%d\nversion:%d", handle, file_data,ID,version);. F5 D% G8 [: r# T: C1 Z
    ss << file_data << "_"<< ID <<"_" << version;* M1 R' ]% G* v! I' W
    UF_free(handle);9 P3 }" S1 @0 t$ W# Y7 t
    UF_free(file_data);
" }' {; n, D+ s  }
3 l! [: i) ]* ^, @4 h4 C( U$ P/ A+ J/ _! ^% W
  return ss.str();
- K/ e5 f, _. s0 F2 m5 g}[/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(输入的组合字符串) 也可以进行查找,显然这种方法最为简单。

4 l( \: b" B  p( a9 D  I
////// 具体用法如下,通常会将这个值存储再part属性中,那么就可以直接进行调用//////
////// 在选择的相关对象对话框弹出来之前,就可以直接去读取属性设置这个结果,从而达到记忆的目的/////
[mw_shl_code=cpp,true]vector<TaggedObject*> CIDS_BaseObject::ReadObjectsdataFrom_AttributePersistentHandleID(Part *workPart,CastingSystem_ComponentsType typeT)7 H3 S9 l. |1 [+ L; O
{1 \# c) [. J' D5 A! t
  vector<TaggedObject*> getObjects;
7 a2 I+ Z; a- Q) Z- `4 N. R8 N! T+ C  getObjects.clear();4 q3 t2 N+ C3 E. X* B& c
2 I! |. W" C( R* c3 C
  string attributeName("");
3 ?2 U( X' G5 ~! d5 ?9 V  string attributeValue("");
3 J( p1 A; l' i6 \* R' [" ^. E  vector<string> stringArray;
9 v' s$ f1 v  f( P; w. V( ?/ h( M  stringArray.clear();
! A5 f- I* Z# g* r/ Z. g6 z/ w  //get the attribute value
* B% a/ n. R" u5 C. z  // get the attribute name & G( |& z4 U2 G$ ?8 `

7 o+ x) ]1 o% I. m  attributeName = GetAttributeName_FromType(typeT);6 t6 O/ }. m* N  H3 E
  if (isStringEmpty(attributeName))  U( M* k9 U6 X
  {$ |9 e% H% w/ S+ ~
    return getObjects;
, c1 G! B8 p* p, ?! q, g! h5 h9 r% Q+ N  }; q* T  `8 J: _6 k' q
  //get the attribute value
2 C$ n& ]+ }/ e' `! f' r' H, K  bool hasAtt = workPart->HasUserAttribute(attributeName.c_str(), NXObject::AttributeTypeString, -1);2 ?, b" w3 n4 B; K1 s/ k
  if (!hasAtt)
! H& U. U% H2 B  {' u, O) X* M9 m0 _
    return getObjects;
1 c7 ?/ M+ l3 V& e6 n6 \/ F+ s  }
. j+ v' p# y0 y- n" z
1 s: T3 c' X4 m$ L1 Y" B3 c  attributeValue = workPart->GetUserAttributeAsString(attributeName.c_str(), NXObject::AttributeTypeString, -1).GetText();: e4 D$ m/ d8 x7 u# F6 V' f
  
. V' u5 r9 W& r8 u  if (isStringEmpty(attributeValue))- w8 U, K6 @& q9 J1 E" c
  {$ ~7 i0 ?) B* X4 b2 c# q
    return getObjects;3 o1 z2 c  Z: h8 C. W) l0 }
  }
9 j9 j& Q4 Y9 Y9 ?6 c' T3 x( L5 _* v6 a  B( N

, `  ]( e: M: T, h  //get the key based on the split value 4 ^/ E5 ]# f* {
  String_SplitString(attributeValue, stringArray, DELIMITER_SPLISH);$ s! r; i0 Y$ m) N8 ]( Y
  for (string item : stringArray)
0 ]4 l8 v3 z/ @- N$ {# L5 W6 ^! t  {
- H7 R! t4 `1 f7 F' T    //read the string to get the object
/ E0 L1 N& B( ?0 H9 c- R1 i     TaggedObject *tempObject = GetObject_FromStoredFileID(atoi(item.c_str()));9 F8 N) R9 x( ]4 f/ r4 u' s  |) |- _
     7 p  S! @3 E& H1 q
     if (tempObject !=NULL && UF_OBJ_ask_status(tempObject->Tag()) == UF_OBJ_ALIVE)5 h, }3 W; |" i0 P; i
     {! P/ i3 b1 e* G6 {5 ?$ q
       getObjects.push_back(tempObject);; b/ q1 a0 t5 C: c$ `: L
     }. y6 ~1 n$ t& T8 q+ c! S
  }: @, l( \6 [& i% Q- f  @& B4 o
4 v. `6 J4 x8 j$ D, n
  return getObjects;0 h! F1 b3 @  j( P6 D
}[/mw_shl_code]
6 y3 p0 s4 T+ N! m6 P9 L, E( y
/ O3 _) f: q. F/ G7 v! J3 }( {7 u: e7 y( J* G3 A2 \
- k, T5 [5 W1 v4 m
更多实例视频和专辑课程陆续分享!* d2 J0 [2 Z$ Y4 e1 \; `+ H! S
$ z; X  |7 ^/ c3 Y9 w" P
欢迎转载学习!
- J( U6 K7 X, d& M
更多精彩内容请关注PLM之家
http://www.plmhome.com
  P! u0 B5 R* A' p9 U0 X

$ F4 g  `* G5 x' d5 X
1 w/ e* z5 p) e( ]; Y

& p4 f1 W$ |; F# h  z3 W+ ]
END
PLM之家plmhome

, Y2 N, V- R6 D* g                               
登录/注册后可看大图
. T4 `# l# v* p$ v4 {/ W0 q
▲长按二维码“识别”关注

# u2 s" U& h, u- A7 j  u' F' ]( p# z
~~~~往期经典文章链接~~~~
4 @3 q5 D& l& b. d! Y# c6 x2 F$ }
NX表达式视频
4 W; l- C, _* Y/ p& X# {) k* _
# f; p- ~; j. r' L0 n# h  Z
NX冲压分析可成形一步式视频

3 B2 E6 t( U+ Z4 r/ E$ ?/ u$ L, v5 n5 L+ [8 @
NX产品模板工作室PTS视频
2 产品模版工作室界面
3 t8 Y9 J! Q% ~5 R3 x) i/ O
3 创建一个基本的模版/ f$ h  n. Q6 E8 y: S
4 PTS高级模版技巧
. X, _& R" ?+ [0 a$ r3 d
5 PTS添加需求HD3D
* y5 L8 A) w: g) N0 q$ I
6 添加装配模版
9 a# E, {5 A4 ^' u3 z
NX高精可视化HD3D视频

4 z+ F2 x0 d- }
1. PLM之家NX全息3D培训-HD3D概述6 g/ i4 s/ K5 f' |. Q2 ~/ A

# l1 H; F& `. o9 \# b. K- w- g
NX模型检查一致性check-mate视频
2 o' J; W- E# A6 W* c0 j

- i# H8 D% ~1 L5 l: g
NX入门视频实例教程(8 小时)
, F8 e4 [! G" n
NX机管道布置培训课程(10小时)
1 管道模块简介
2 创建编辑路径
3 审核部件

. `7 Z: V$ D3 V( }
4 添加部件到管道系统
5 添加型材
6 HVAC管道功能
7 管理管道布置装配
8 管理管道部件选择
9 创建管道通路
10 创建管线布置逻辑图
11 创建标准库
NX二次开发入门经典教程(35小时)

7 K% N3 ?9 l6 O0 W" ~4 \0 n/ u其他重点咨询

' N6 q% W2 N$ C/ n
工业互联网咨询:
工业软件APP:
数字化转型:
工业互联网技术栈:

1 Z# a, v2 k  |0 U/ u3 A/ q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了