青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 6181|回复: 6

[分享] UG二次开发的自动装配技术

[复制链接]
发表于 2008-7-4 17:13 | 显示全部楼层 |阅读模式
0 g3 e* z3 Y8 e9 Z
        利用ug/OPEN API开发具体产品的应用系统时,常常遇到如何建立零件间装配约束关系的问题。如何实现零件间自动装配,是开发应用系统的难点之一。
1. 装配约束关系的简化 ' q( \! G8 \6 S# U
        在实际应用中,装配约束的配合类型有贴合、对准、角度、平行、正交、对中等多种类型,用于装配约束的对象类型有面、边、基准面、基准轴、点、线、曲线、坐标系等多种形式。为了便于数据描述,可将组件间的装配关系做了适当的简化,如图1、2所示,该例中,将零件间的装配约束关系简化为两组件间三个基准面的贴合或对准的装配约束类系。其中,图2中X,Y,Z为对应部件中的基准面名。  `+ G* W$ [" N1 S4 ^5 t
图1     简化前的装配约束关系
?
图2     简化后的装配约束关系
        简化组件装配约束关系后,将主动组件的部件名、组件名与对象名,从动组件的部件名、组件名与对象名,以及装配约束类型等信息保存在ODBC数据库中。在系统加载部件时,可根据数据库中的装配信息,实现组件的自动装配。
2.自动装配的实现
8 T* D8 q. e2 l  g
6 N& _- h6 G7 i2.1主动组件的加载: U; j7 q8 d: M8 s- ?) z  @
5 Y1 ]9 O6 z8 K. e
        使用UF_ASSEM_add_part_to_assembly函数即可将部件加载到装配体。下段程序用于加载部件的,其中,parent_tag为父部件的部件标识,part_name为加载部件的部件名,inst_name为加载部件的组件名,inst_tag返回加载部件的实例标识。
% q/ K# \: l; y+ l5 H0 Lvoid         UG_OPEN_add_part_to_assem(tag_t parent_tag,char *part_name,?char *inst_name,tag_t *inst_tag) 5 S/ A8 A! {& {* {9 K9 `( f6 e! |, W
{6 U( c# _/ _. M6 u
double origin[3] = {0,0,0};
" ^. {4 w- F7 H4 b5 H( p/ i# e3 xdouble csys_matrix[6] = {1,0,0,0,1,0};! ^1 s: N0 L/ N' W3 ?( T2 i
int layer = -1;9 A' P( h: _; ^; _  i; {7 S& W+ t" t
UF_PART_load_status_t load_status;
. r* {% A( P; R6 Y6 [$ H( I; PUF_ASSEM_add_part_to_assembly(parent_tag, part_name, NULL,inst_name, origin, csys_matrix, layer, inst_tag, &load_status);5 l3 }0 x8 G4 s4 j
if ( load_status.file_names != NULL )* o5 `0 Z$ Y3 N
UF_free_string_array( load_status.n_parts, load_status.file_names );+ q9 X/ a* j; ]: K/ Q
if ( load_status.statuses != NULL )! L5 J. ?' A$ S2 L6 K
UF_free(load_status.statuses );1 ?7 ]+ B$ T: K1 v
}
8 m( @9 e$ V) `- w8 s/ S2.2 主动、从动组件事例标识的获取
# g+ q. }/ l8 B; W( L, W        主动组件的事例标识可以通过UF_ASSEM_ask_part_occ_of_inst函数直接获取。从动组件事例标识的获取较为繁琐,其步骤为:(1) 确定从动组件的部件标识;(2)获取从动组件的所有事例标识;(3)匹配事例标识对应的组件名与从动组件组件名,确定从动组件的事例标识。需要注意的是,在同一装配中,部件名相同的其组件名不能相同,组件名相同的其部件名不能相同。
0 v* Y! u( \* l4 x" t4 Q        下段程序代码用于获取从动组件事例标识,其中,part_name 为部件文件文件名,inst_name为部件文件组件名,occ_tag返回部件文件事例标识。
$ e( H. {. r- T3 H; O$ m  mvoid         UG_OPEN_ask_part_occ_by_name(char *part_name, char *inst_name,tag_t *occ_tag )$ x/ W+ h+ @) c6 L& L
{
' T! n5 b; O4 \9 l8 atag_t *part_occs;4 B" r4 j; r$ j0 H: _$ M+ A, r
tag_t temp_tag;
  j- E2 V  Q) Dint i;
6 f" R( x6 I( A' g7 u: {. u  dchar part_n[133], refset_name[31],instance_name[31];?
' ?$ O5 S  C  S6 n  l. y) V& odouble origin[ 3 ],csys_matrix[ 9 ],transform[ 4 ][ 4 ];?
; s7 n" l; n. b" i$ i& _+ q; ftemp_tag = UF_PART_ask_part_tag(part_name);
( j  }7 L# A# s" L3 S2 F5 _+ eif(temp_tag != NULL_TAG)1 J2 h5 }8 K9 G5 H. g0 ^
{3 X2 I- O9 Q4 T- Y# M/ H! k- t
UF_ASSEM_ask_occs_of_part (NULL_TAG, temp_tag, &part_occs );/ x  |; m% y1 ]2 u
i = 0;4 s; o% |' g1 f& ~* @) C9 v0 S
while(part_occs != NULL_TAG)
  [8 P. d. Y/ c4 ]! Y, V- \# K, ~{
' d' T/ p: s& WUF_ASSEM_ask_component_data(part_occs, part_n, refset_name,?
  W% L' F$ g/ |0 ?: T8 jinstance_name, origin, csys_matrix, transform);
0 c' Y, X: W. d, i, k; Sif(strcmp(strlwr(instance_name),strlwr(inst_name)) ==0 ) break;
( w& B) l  s4 [- I4 J7 s+ d4 \$ Ri++;, ], T2 M' _0 J% Z3 q
}
( `  @' v/ E2 h! e4 _' Mif(part_occs != NULL_TAG)?
1 g' R; i( S$ B$ |*occ_tag = part_occs;
6 @' i/ W* \$ e% |) l& k. aelse0 H$ q4 p9 E& u# K
*occ_tag = NULL_TAG;
3 s* n2 r6 ~% [4 L6 OUF_free(part_occs);/ ?# f4 I9 ?2 V- Q" P/ }1 Z/ X; Q
}
  S# c$ D: L7 p9 kelse
6 q# z4 A, {0 }: H" d0 g*occ_tag = NULL_TAG;& m% @' n, @; o1 n; a
}
- p* e% O0 [6 ?2.3 约束对象标识的获取
# v+ ~0 F2 t4 p% U% y4 D( _: {# j$ ^1 J. g* U2 |" R% O- J7 d
        获取用于建立装配约束关系的对象标识的步骤为:(1)将对象所在部件设置为工作部件;(2)利用UF_OBJ_cycle_by_name 获取对象标识。同样需要注意的是,在同一部件中,对象名应唯一。 3 k$ X3 f" s  i& L. H
        下段程序代码用于获取对象标识,其中part_tag为对象所在部件的部件标识,obj_name为对象名,obj_tag返回约束对象的标识。
% f3 [1 V- F, q; R3 |void UG_OPEN_ask_obj_tag_by_name(tag_t part_tag, char *obj_name, tag_t *obj_tag)
  E: N$ g8 L4 D! i! p2 r{
4 Q6 Z. s, Y% E, }! O) Z$ U( Atag_t work_part, object_tag = NULL_TAG;?2 z0 T& c' X* {* b) r" t# R
work_part = UF_ASSEM_ask_work_part();
2 l0 i/ {, ~: [5 a6 qif(part_tag != NULL_TAG)
* j8 g$ W1 q1 t. R{& G/ Y6 I0 u3 w# @
UF_ASSEM_set_work_part(part_tag);6 F0 p* x- d6 D% o1 |/ x; O
UF_OBJ_cycle_by_name (obj_name, &object_tag);?# l8 `0 v. U& D8 ~( l
if (object_tag != NULL_TAG)
" }7 L; B: I" a*obj_tag = object_tag;
& j: i2 k+ f% C; }% I* _else
  a* M/ E- A' a: @9 U*obj_tag = NULL_TAG;9 u4 J' b, \2 C7 C5 G& ]# S
}
. h7 U9 l+ p5 j/ d% {4 B7 u. Celse
% k  a. n% F0 g7 D{# q& c! G, ^; K9 i
*obj_tag = NULL_TAG;
- H/ E  [) c$ A! X, g% }}
4 Y9 a! J9 S6 g4 ~; m# j# e4 V6 n5 yUF_ASSEM_set_work_part(work_part);
/ D0 K# y/ C3 ^9 ~} & M2 @4 L& x% H' k3 {- \: a+ V
2.4装配约束关系的建立# ^/ J$ f+ y1 `& O
        建立组件间的装配约束的步骤为:(1) 定义装配约束,即填充结构UF_ASSEM_constraint_s;(2)利用函数UF_ASSEM_solve_mc求解约束;(3) 利用函数UF_ASSEM_apply_mc_data将约束应用到装配体上;(4) 利用函数UF_MODl_update更新模型,以反映模型变化。 3 P0 r( R( ]+ ^0 k3 I- m& N6 u( s
        下段程序代码用于两组件间的装配约束关系的建立,其中, from_part_ins为主动组件实例标识,from_obj_tag为主动组件中的对象标识,from_part_occ为主动组件的事例标识,to_obj_tag为从动组件的对象标识,to_part_occ为从动组件的事例标识,mate_type为装配类型。
1 y. X; R- N/ ^void        UG_OPEN_atuo_mate_by_datum(tag_t from_part_ins,tag_t *from_obj_tag,, ^, z, A2 ~6 g9 f( k# d8 M3 j7 n: b2 C" ?
tag_t from_part_occ,tag_t *to_obj_tag,
7 p# y  D, v: h% `4 ytag_t to_part_occ,char **mate_type )8 g9 v7 G' |# y6 A9 V
{
/ X; A+ `! [# z6 g1 o; MUF_ASSEM_mating_condition_t? ftf;
! n" u( j* R" ]! Q( Q4 `UF_ASSEM_mc_status_t? status;) m7 c  A2 B: m! D& `. G
UF_ASSEM_mc_structure_state_t struct_status;
$ X+ L9 w0 k1 N: s7 u( ]# N3 {- E* AUF_ASSEM_dof_t? dof;
- U' V/ k# H- i$ w, f  [8 M. sdouble transform[4][4];& `3 l3 ?8 }! S$ b# ?( q
int ret,i;
* S$ y" M$ T; D$ TUF_ASSEM_init_mc (&ftf);
2 N) {# S% a- i* Kftf.mated_object = from_part_ins;8 {8 ?9 o$ {/ X: N' Z
ftf.name = NULL;- S* Z/ }4 h$ F! e3 V
ftf.user_name = false;. [% ^4 p' @9 B: R
for(i=0; i<3; i++)
, n6 L. E& n% x5 G; \' g; G* |{
/ b/ ^  ]4 _( qftf.constraints.from_status = UF_ASSEM_ok;
* P7 m) V- B. a1 |" A! W, {0 ?. Pftf.constraints.to_status = UF_ASSEM_ok;
) O8 ]! X, d% H# q' \if(strcmp(strlwr(mate_type),"m") == 0)
2 ?: D6 E7 T8 @( }3 c" Uftf.constraints.mate_type = UF_ASSEM_v16_mate;, A* c. ~- u7 `! N
else
0 d; U% X8 h% [4 }: A1 sftf.constraints.mate_type = UF_ASSEM_v16_align ;! h- u; `' P" r/ }& W
ftf.constraints.from_type = UF_ASSEM_datum_plane;. x* ]0 Y9 ]# G* \9 H  [! n# o
ftf.constraints.to_type = UF_ASSEM_datum_plane;
9 D( y0 W$ |; i6 m$ h% [4 c4 T+ ^ftf.constraints.from = from_obj_tag;
' F5 F! t! [9 r' `ftf.constraints.from_part_occ = from_part_occ;: o: ~6 X2 b& w& z4 V
ftf.constraints.to = to_obj_tag;8 b0 T: S8 C' G: g  w# a) s
ftf.constraints.to_part_occ = to_part_occ;
3 x. z3 Z, a+ n! s4 Z3 F0 b2 ]! Qftf.constraints.offset = NULL_TAG;) I2 q$ p3 z- t5 A& f
ftf.constraints.name = NULL;
2 @- o& b5 h. P. x1 @2 pftf.constraints.user_name = false;
7 X' a5 t7 m) ?( [9 H# J} 7 `( C+ V6 V5 ]; u( H
ftf.num_constraints = 3;/ G' K0 q# _- S( \- O
ftf.suppressed = false;
4 p9 I8 |8 ]6 u7 A& Bret=UF_ASSEM_solve_mc(&ftf, &status, &dof, transform);
! u% d; G1 K* n, _, \6 W: Oif(ret == 0 || status == UF_ASSEM_mc_solved)& N2 l' n3 a  r; p% [
{. p7 ^  _& D. @5 i8 ^8 \3 l& s
UF_ASSEM_apply_mc_data(&ftf, &struct_status, &status);' }( {) N/ {" o
if(struct_status == UF_ASSEM_structure_ok && status == UF_ASSEM_mc_solved)
# g& K+ i% `+ S) U# X6 m{  z* o7 k3 F5 E
UF_DISP_refresh();, x& h' R6 I, I+ s, `
UF_MODL_update();
/ }% x; n* B& z& h: P9 W4 A}* |% J8 G+ d5 M/ c
}
& z* X$ Z/ |7 i: R1 R}
发表于 2010-1-10 09:57 | 显示全部楼层
我狂顶
# g6 x. y1 X2 l9 z: g# H难道的好帖
回复 支持 反对

使用道具 举报

发表于 2010-9-20 13:55 | 显示全部楼层
顶楼主!
) c1 `# I# N3 p7 ^谢谢分享。
回复 支持 反对

使用道具 举报

发表于 2011-8-28 11:33 | 显示全部楼层
不错 啊,楼主
回复 支持 反对

使用道具 举报

发表于 2011-9-1 10:02 | 显示全部楼层
很好的帖子啊
回复 支持 反对

使用道具 举报

发表于 2013-4-22 11:59 | 显示全部楼层
thanks,good
回复 支持 反对

使用道具 举报

发表于 2013-5-9 20:09 | 显示全部楼层
大哥,你那有木有关于连杆的源代码啊,我这毕设做不完了,能不能给小弟用用啊,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|关于我们|sitemap|小黑屋|Archiver|手机版|UG网-UG技术论坛-青华数控模具培训学校 ( 粤ICP备15108561号 )

GMT+8, 2025-3-10 22:41 , Processed in 0.060108 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表