|
做过ug二次开发的人都知道tag在其中的重要性,tag是所有对象的标识,也是其中信息的桥梁。
% N a5 i7 F' t1 T' n7 B4 a可惜tag是流水号,在prt保存再打开后,tag就会变。3 g/ w. X# p4 _$ c$ b) t* E- _8 v
- r2 \# k% V1 j0 K/ a1 a9 P如果是external模式,用tag作为信息标示保存也没什么,毕竟没有保存和打开的过程。/ I) y" z2 e8 W' a' L
但是对于有些问题,比如重新打开prt,然后高亮上次选定的面,tag就不能作为信息保存。5 G2 m8 ]3 R: q9 ?( h8 b% ]
因为上次保存的tag在打开prt后会变,也就不能重新找到面face了。3 p+ S: I+ m3 X- V/ U
8 A" ]/ x1 c1 b, v" R+ c3 X还好我找啊找的,终于找到UG里面有个东西是不便的——Handle(可以查uf.h文件),是个编码字符串。
, \# v- ]) ]) W3 ^: Y经过解析后,一个Handle可以分解成文件信息、ID信息和版本信息。使用函数:
6 j$ l# w# A6 ~2 A" W char * file_data ;
% V" J) n9 e. }/ t- D' E unsigned int id ;
! c7 M! l0 _- n+ a( c, u# r unsigned int version ;
. }1 D6 t$ g9 p/ }UF_TAG_decompose_handle(handle,&file_data,&id,&version);
, L; @- B) K6 J6 Y& ~ UF_free(handle);
. T# I7 m! G( @( c UF_free(file_data);
! r: u3 }' C' V+ s" _( k5 E8 d其中sub_file_id 就是我们需要的Face、Edge等的ID,相当与tag,不过在一个文件里是不变的。# Q& [# q$ b6 P
2 t- Z+ I/ J/ S ]3 s$ ?; X当然,先要获取Handle,通过这个函数
1 o) r- W u6 ^! u& J& w. B3 jconst NXObject* object=???;/ n$ f) w6 D3 B& s/ k6 ~
char* handle = UF_TAG_ask_handle_of_tag(object->Tag());
# M9 `, I; _3 T% z9 F6 |, W* q, M# w) W( r
上面就是获取对象ID的方式。handle太长,又是字符串,使用不方便,所以经常使用的是这个ID。. b _- x9 P$ r/ K1 Z" v
其实这个ID可以在对象的Information信息窗口的最下面看到。
, l+ a5 d1 W$ N( i x% p+ D1 @( ]4 \
各位可能要问了,保存了这个ID,下次获取了这个ID,怎么找到Tag或者对应的Face、Edge呢?) l' E( z7 Z9 G3 Q& ~" m3 D
如果你要是使用UG Open,我觉得还是保存Handle比较好,或者使用UF_TAG_compose_handle,通过ID等信息重新组合Handle* B- i5 _" U& K7 k* F
然后通过UF_TAG_ask_tag_of_handle()获取tag。0 R N0 P8 p- O z1 a! H. |; ]
+ V. M) P, o7 o; S5 Z6 O如果你使用UG NXOpen,可以直接得到对应信息的指针,使用FindObject获取指针。, K( o, L0 t* ]- n) w! w" r
char str[133];
% A( m+ v7 Z) _6 N5 [+ \ sprintf(str,"HANDLE R-%d",ID);
8 n5 a- J$ w; Z+ p7 |& p" REdge* dege = dynamic_cast<Edge *>(NXOpen::Session::GetSession()->Parts()->Work()->FindObject(str));
; s2 t' p0 I# [+ L$ I当然实现最好能知道是什么对象。 |
|