|
t% ?$ h- K# {' p i3 v4 W
利用 ug/OPEN API开发具体产品的应用系统时,常常遇到如何建立零件间装配约束关系的问题。如何实现零件间自动装配,是开发应用系统的难点之一。 1. 装配约束关系的简化
8 q/ w/ [. O4 j! R a9 h7 I 在实际应用中,装配约束的配合类型有贴合、对准、角度、平行、正交、对中等多种类型,用于装配约束的对象类型有面、边、基准面、基准轴、点、线、曲线、坐标系等多种形式。为了便于数据描述,可将组件间的装配关系做了适当的简化,如图1、2所示,该例中,将零件间的装配约束关系简化为两组件间三个基准面的贴合或对准的装配约束类系。其中,图2中X,Y,Z为对应部件中的基准面名。7 C5 n8 ]$ J$ ^3 ?2 e1 B
图1 简化前的装配约束关系   ? 图2 简化后的装配约束关系 简化组件装配约束关系后,将主动组件的部件名、组件名与对象名,从动组件的部件名、组件名与对象名,以及装配约束类型等信息保存在ODBC数据库中。在系统加载部件时,可根据数据库中的装配信息,实现组件的自动装配。 2.自动装配的实现
- R( _1 W5 @2 n% ~- m: H. _) f* g
9 J+ |2 Y5 ^, y2.1主动组件的加载8 e3 e' V3 C+ X4 Q
: l7 L i& K" u$ ^- Z
使用UF_ASSEM_add_part_to_assembly函数即可将部件加载到装配体。下段程序用于加载部件的,其中,parent_tag为父部件的部件标识,part_name为加载部件的部件名,inst_name为加载部件的组件名,inst_tag返回加载部件的实例标识。
; s) M- J! L' p( F' p- pvoid UG_OPEN_add_part_to_assem(tag_t parent_tag,char *part_name,?char *inst_name,tag_t *inst_tag) J& Z# _' w5 l7 H# k
{: w) k( N: i; H. C( v. Z
double origin[3] = {0,0,0};1 q. Z' T5 B* K! f
double csys_matrix[6] = {1,0,0,0,1,0};
7 P# [' l3 _* l/ Xint layer = -1;
4 \' B- J, y, N9 @7 _" j% lUF_PART_load_status_t load_status;0 K6 o0 s7 a& B7 v
UF_ASSEM_add_part_to_assembly(parent_tag, part_name, NULL,inst_name, origin, csys_matrix, layer, inst_tag, &load_status);9 a$ `, T% f6 e& r
if ( load_status.file_names != NULL )
) V( s$ m' V, R+ [6 GUF_free_string_array( load_status.n_parts, load_status.file_names );
8 v3 J% h, O* c1 | G9 \if ( load_status.statuses != NULL )
% N1 z1 ~) k" x& N. k. Z# h1 NUF_free(load_status.statuses );
0 e. X8 U$ ]2 a/ [$ E, L6 T+ F! q}
* m7 o! f' I g, R2.2 主动、从动组件事例标识的获取
+ U9 Z ^, D6 \& q: E1 V( f! O9 s 主动组件的事例标识可以通过UF_ASSEM_ask_part_occ_of_inst函数直接获取。从动组件事例标识的获取较为繁琐,其步骤为:(1) 确定从动组件的部件标识;(2)获取从动组件的所有事例标识;(3)匹配事例标识对应的组件名与从动组件组件名,确定从动组件的事例标识。需要注意的是,在同一装配中,部件名相同的其组件名不能相同,组件名相同的其部件名不能相同。
' ] U- C, }7 I, |4 y 下段程序代码用于获取从动组件事例标识,其中,part_name 为部件文件文件名,inst_name为部件文件组件名,occ_tag返回部件文件事例标识。 * P- M( s: ^! x* E; u/ \4 P* P
void UG_OPEN_ask_part_occ_by_name(char *part_name, char *inst_name,tag_t *occ_tag )
, {- L B3 L( i' }( O{ % ?- h$ ?1 o4 ^5 o# B
tag_t *part_occs;. g7 M% \+ h6 Y! A, ^
tag_t temp_tag;+ @ C0 ^. y/ D, ?- a( W4 f
int i;1 U1 x. p5 l& h2 W
char part_n[133], refset_name[31],instance_name[31];?
$ ^2 [: e* j+ E* q" T) \0 _double origin[ 3 ],csys_matrix[ 9 ],transform[ 4 ][ 4 ];?
% n0 w4 O& o$ Q1 R5 _* O' J' E; Wtemp_tag = UF_PART_ask_part_tag(part_name);
# E8 k4 W. L8 ? r, |if(temp_tag != NULL_TAG)0 m( N, C" A0 E. E: f
{
/ k! H8 N q: x& t1 SUF_ASSEM_ask_occs_of_part (NULL_TAG, temp_tag, &part_occs );. V v3 I2 M' F8 Y. M' R
i = 0;# B2 n" B v% T$ J
while(part_occs != NULL_TAG)
& l8 ~4 }" I! |( N{% r" \" C+ _- Q
UF_ASSEM_ask_component_data(part_occs, part_n, refset_name,?/ {! ]) Q& m% F% Y
instance_name, origin, csys_matrix, transform);
$ ] L4 r( J1 B& |5 ~if(strcmp(strlwr(instance_name),strlwr(inst_name)) ==0 ) break;" N6 q; t1 z# U, }& W
i++;" y e9 s- ?0 c6 o. A2 O
} `0 f! p. _1 B* N- x2 e
if(part_occs != NULL_TAG)?) U/ \6 o- f7 }* E
*occ_tag = part_occs;
( r2 O/ N! F- |6 u& v+ [# delse/ F+ y$ z/ h7 M/ S1 [% F
*occ_tag = NULL_TAG;
6 J& W4 F* z1 | WUF_free(part_occs);' W7 q: [+ B7 G6 d* g1 g
}
. N* o( v% z% U6 R. e% ~$ pelse
3 x8 D! M( W) q*occ_tag = NULL_TAG;
" c. q5 M4 ]. Q1 f& o1 z( _# m) K} % d7 k" m7 D4 B3 |
2.3 约束对象标识的获取
- K, g$ y* U; W ^
% Y ], ?& t9 V4 { T- E 获取用于建立装配约束关系的对象标识的步骤为:(1)将对象所在部件设置为工作部件;(2)利用UF_OBJ_cycle_by_name 获取对象标识。同样需要注意的是,在同一部件中,对象名应唯一。
3 M# V$ s; D% v3 g% T 下段程序代码用于获取对象标识,其中part_tag为对象所在部件的部件标识,obj_name为对象名,obj_tag返回约束对象的标识。
! N3 L8 ~ }7 O% gvoid UG_OPEN_ask_obj_tag_by_name(tag_t part_tag, char *obj_name, tag_t *obj_tag)
& [, Y9 N. d f. o! U{
' F% O5 V" H2 o3 |/ xtag_t work_part, object_tag = NULL_TAG;?
6 Y* U* |5 w& O% a! Gwork_part = UF_ASSEM_ask_work_part(); s) F, \. ~' y9 k2 ^6 M
if(part_tag != NULL_TAG)
% i" B$ x4 l1 P$ \* D4 W' \) q1 F3 ]{
" n; q! _5 m+ wUF_ASSEM_set_work_part(part_tag);
! `. o& l- x* x- FUF_OBJ_cycle_by_name (obj_name, &object_tag);?
" T7 G# O5 u/ \4 y& X$ j) [if (object_tag != NULL_TAG)6 k1 k7 U; F1 _/ g6 ^1 \
*obj_tag = object_tag;
+ L" W# c* O0 ^5 w) ?1 P( B0 [else
% p( }" ^7 n5 L4 Z0 N* E7 D*obj_tag = NULL_TAG;8 w; l" U) N$ b4 p7 R0 n
}3 s0 P$ B8 {/ X+ v8 }" s: {
else) X, y& g; L/ F, @4 Y
{0 h* a% ^' K% q: B6 Y5 p: D' ~
*obj_tag = NULL_TAG; 5 x3 h2 N* n: k' q- ?
}
]+ }) v: K1 n* C2 c& G( n7 NUF_ASSEM_set_work_part(work_part);7 p4 ^/ u# D3 l+ ]' X5 @
} 9 G2 i3 g8 r* W
2.4装配约束关系的建立
. F$ v2 u" z! t$ F6 r' k$ T 建立组件间的装配约束的步骤为:(1) 定义装配约束,即填充结构UF_ASSEM_constraint_s;(2)利用函数UF_ASSEM_solve_mc求解约束;(3) 利用函数UF_ASSEM_apply_mc_data将约束应用到装配体上;(4) 利用函数UF_MODl_update更新模型,以反映模型变化。 3 {5 ]: Y1 h, O, x6 k: c3 `
下段程序代码用于两组件间的装配约束关系的建立,其中, from_part_ins为主动组件实例标识,from_obj_tag为主动组件中的对象标识,from_part_occ为主动组件的事例标识,to_obj_tag为从动组件的对象标识,to_part_occ为从动组件的事例标识,mate_type为装配类型。 5 a! J2 t- U7 \4 ` |: a3 w
void UG_OPEN_atuo_mate_by_datum(tag_t from_part_ins,tag_t *from_obj_tag,
i4 d7 M5 g) A. T% Ntag_t from_part_occ,tag_t *to_obj_tag,& ~8 f: C8 l6 k% g
tag_t to_part_occ,char **mate_type ) k- v8 E% ?- o
{3 Y1 B$ |1 m- R9 O
UF_ASSEM_mating_condition_t? ftf;
& M, [2 F9 I+ Y* ]) M4 |UF_ASSEM_mc_status_t? status;, `* _9 |6 `/ r" k% Y8 c' O, t. @
UF_ASSEM_mc_structure_state_t struct_status;2 L: b* l. T, M" y
UF_ASSEM_dof_t? dof;
$ I- }4 W0 {" o/ L9 |0 z0 Pdouble transform[4][4];6 T, h7 [. j6 M! b* Z5 w
int ret,i;
" I' |) P7 s2 j; R9 ^UF_ASSEM_init_mc (&ftf);8 g% P+ N5 f$ i' M q; [3 \
ftf.mated_object = from_part_ins;, ]0 R# o$ T- i" x$ q- t/ z. L
ftf.name = NULL;
4 y3 x, O* e* P7 }0 k2 \8 i/ vftf.user_name = false;& i3 J- k, D4 K
for(i=0; i<3; i++): l& J( r/ H' L
{ \9 I8 U+ p& @. Q; l- m( w
ftf.constraints.from_status = UF_ASSEM_ok;
% C# k6 }& j/ L" ?6 X5 ~# {' R' q. P1 |ftf.constraints.to_status = UF_ASSEM_ok;
Z$ `, L2 p" M3 Fif(strcmp(strlwr(mate_type),"m") == 0)% t' L- y5 D, j$ V* X: H
ftf.constraints.mate_type = UF_ASSEM_v16_mate;
/ u2 X8 n" Q3 m* a1 pelse# s3 u% z% v& C6 S0 a% {2 G; r. R
ftf.constraints.mate_type = UF_ASSEM_v16_align ;+ n8 k, u' T' }
ftf.constraints.from_type = UF_ASSEM_datum_plane;& v: S+ Q- H: A
ftf.constraints.to_type = UF_ASSEM_datum_plane;
5 f- U4 V* Y- V' Xftf.constraints.from = from_obj_tag;
0 Y% t# h. y. z1 J O) [ftf.constraints.from_part_occ = from_part_occ;
5 L3 f, S: v, e! i% c. s) C, Fftf.constraints.to = to_obj_tag;- `) S( A s+ @! m* l6 L& B/ S) u
ftf.constraints.to_part_occ = to_part_occ;# P" E$ O3 |% A) T9 F
ftf.constraints.offset = NULL_TAG;' E% g8 B5 Z( ]* ^; X
ftf.constraints.name = NULL;
! W" F0 ^0 W2 V( z; }ftf.constraints.user_name = false;/ _4 d- F( @ c- l3 R7 E' X
} 0 n% c* U. K" y8 S! w J n* I
ftf.num_constraints = 3;
/ w c+ G$ m- G* O4 s# n* eftf.suppressed = false;( B& N/ U- O/ R* C7 n
ret=UF_ASSEM_solve_mc(&ftf, &status, &dof, transform);
1 ` h) F# h* ~/ o5 r6 [( ]! [if(ret == 0 || status == UF_ASSEM_mc_solved)
6 F2 E9 u4 F" B, F" r' {{
5 O. k I" \$ E- p4 U; z5 oUF_ASSEM_apply_mc_data(&ftf, &struct_status, &status);
4 a' z1 u7 ]' I9 O0 Lif(struct_status == UF_ASSEM_structure_ok && status == UF_ASSEM_mc_solved)
" X* @5 |0 _) x) w{
; d. N+ I9 k4 h6 V6 oUF_DISP_refresh();
# s2 ]8 o! J6 {# W0 u' b8 F- {UF_MODL_update();! s1 ?- E6 q$ C9 n0 E
}! P3 I% w; t5 N- R% Q' D4 J# v
}% N3 i* T* r8 F; W* K, ~
} |
|