|
做过ug二次开发的人都知道tag在其中的重要性,tag是所有对象的标识,也是其中信息的桥梁。/ X Q: b* {5 Q( V8 X4 j
可惜tag是流水号,在prt保存再打开后,tag就会变。. c \" i+ e+ u
5 V- R: I' G0 r9 R$ i1 y# [$ x如果是external模式,用tag作为信息标示保存也没什么,毕竟没有保存和打开的过程。
' i2 H2 }- U1 M3 x" w但是对于有些问题,比如重新打开prt,然后高亮上次选定的面,tag就不能作为信息保存。
" [4 e* u7 F( U& P7 l因为上次保存的tag在打开prt后会变,也就不能重新找到面face了。, E% z; S, i; C0 @# e" v& W$ p
( ^6 h2 E- l1 b* r( [, e% z还好我找啊找的,终于找到UG里面有个东西是不便的——Handle(可以查uf.h文件),是个编码字符串。
% S6 t5 D) b4 ?: z& Q% v经过解析后,一个Handle可以分解成文件信息、ID信息和版本信息。使用函数:* s' l! J% C0 {( ^
char * file_data ;
. R! i! C+ q$ S7 y' Z7 d/ X' ] unsigned int id ;
) Y6 R& L. ?- m) Y2 {3 @( V; K unsigned int version ;
/ R# M6 J+ X8 j3 {( b9 f2 Y0 `UF_TAG_decompose_handle(handle,&file_data,&id,&version);. p: @" w$ j& _* ^0 z
UF_free(handle);$ R" G9 u C* g0 W, L
UF_free(file_data);
9 X- V* r. Q$ B* j6 d其中sub_file_id 就是我们需要的Face、Edge等的ID,相当与tag,不过在一个文件里是不变的。
. p- w4 j' j. u0 g! ~" B$ T
, c+ l) h; ^; j4 ]* j& M& G$ r: }当然,先要获取Handle,通过这个函数
" v9 V3 P9 z* zconst NXObject* object=???;
, F/ k1 S& n2 {6 X7 B) { char* handle = UF_TAG_ask_handle_of_tag(object->Tag());; R# ?# ? D$ }0 _" x( k' c
& c* V2 a7 V& v: {* z9 z9 K
上面就是获取对象ID的方式。handle太长,又是字符串,使用不方便,所以经常使用的是这个ID。
( ^+ J, {1 W* `- ~. p7 z其实这个ID可以在对象的Information信息窗口的最下面看到。0 X' d9 `. C5 H) V, b: J
: T: E. B6 ~0 n$ B7 v2 [4 {各位可能要问了,保存了这个ID,下次获取了这个ID,怎么找到Tag或者对应的Face、Edge呢?
4 b& n7 D% O% y: O, W如果你要是使用UG Open,我觉得还是保存Handle比较好,或者使用UF_TAG_compose_handle,通过ID等信息重新组合Handle" ]6 N N* I5 N" Z* r4 q' u8 D
然后通过UF_TAG_ask_tag_of_handle()获取tag。( D6 b0 i" @, C$ t, F* b
2 t- W1 [$ j0 L4 h& [如果你使用UG NXOpen,可以直接得到对应信息的指针,使用FindObject获取指针。
7 p S! ], _( G2 {9 [6 B, z char str[133];
9 V! Z$ {! g( l( l sprintf(str,"HANDLE R-%d",ID);+ x( F, Y# c/ Q: e0 u
Edge* dege = dynamic_cast<Edge *>(NXOpen::Session::GetSession()->Parts()->Work()->FindObject(str));" l$ ~! y# {, u$ n% i2 T5 L
当然实现最好能知道是什么对象。 |
|