使用UFUN进行UG NX二次开发: 装配设计技巧及步骤
$ v( n2 i/ C9 [6 l9 M3 I' E7 ]0 f8 D' [# c
a4 g+ b5 z0 E* g$ R6 P+ e. A# n
1、装入部件! q- w: P/ g) L2 k: f' c7 L
通过函数UF_ASSEM_add_part_to_assembly()指定部件装入的位置 、姿态等信息,实现在装配体中装入一个部件功能;8 V1 ]2 F0 D3 S8 c5 ^
/ q+ \6 B8 r9 `7 m9 G) u2、创建配合关系8 P8 u$ ^9 V* E' J3 j! C
a.通过函数UF_ASSEM_init_mc()初始化约束;! v# U* {5 t; o& e! A. o4 c6 }" z1 _
b.定义约束关系,即填写结构UF_ASSEM_constraint_s中信息;
. w0 a9 l5 [/ w% l! a( f装配中各部件间的配合关系是通过装配约束关系来实现的。装配约束是指一个部件到另一个部件的约束,将部件A配合到部件B上,则部件A称为主动件(from),部件B称为被动件(to),在约束求解过程中,被动件在装配空间中的位置固定,而主动件将变换姿态到满足装配约束位置上。组成配合关系的约束之间不能存在几何关系上的矛盾,也不能形成循环定义。
0 o# H3 W' [+ pc.通过函数UF_ASSEM_solve_mc()求解约束;4 ~3 ^) s( p3 E! h$ U3 s; f# M; ]. z l
d.通过函数UF_ASSEM_apply_mc_data将约束应用到装配体上;: E& h+ v% i: h( y$ `6 R* X
e.通过函数UF_MODL_update更新模型。8 d1 i+ t+ i6 ~# _+ W$ h
# j' V7 `9 L" V1 C3 \' ^- #include <stdio.h>
2 M1 f% R+ V( _+ v4 K: k- ^
# l- c" ]! o% C, L% O" f$ ~# K- #include <uf.h>
I8 ^: k4 J8 [, Q% ]9 P c; h - #include <uf_ui.h>- V3 R) k1 A+ x8 A2 Z4 L
- #include <uf_obj.h>
* r2 {; J7 N" H) l; H - #include <uf_disp.h>
V9 W+ l: \; s% i8 y8 u - #include <uf_modl.h>
- [) K& ~1 A# j* Y1 P6 z, ` - #include <uf_part.h>% O# B( E! a2 E( N7 C
- #include <uf_assem.h>
$ `8 U+ p% q$ f1 d0 c1 T+ P
" T; f( k5 v* k* d" M- #define UF_CALL( X ) ( report( __FILE__, __LINE__, #X, ( X ) ) )
9 q( t6 S. L9 {1 Y
7 g$ U5 k7 j6 ], k. N- int report( char *file, int line, char *call, int irc );
* i s6 ]7 ~' k, ^& o! h - void DoAssembly( void );: S; a1 K* N1 x; T% Y$ G* T+ _
- , I% q9 q; C I1 c8 n
- int report( char *file, int line, char *call, int irc )8 m g2 E* V. y9 d# O
- {4 a" E' ?2 t1 G9 S) \$ n& p2 a
- if ( irc )- ^/ I' B' T* J
- {
% O( y" N% }' i' X" Y - char err_msg[ UF_UI_MAX_STRING_LEN + 1 ];9 E/ N+ W z L
- char msg[ 133 ];
+ s, ^3 L$ H Q! ?) y - char fail_message[ 133 ];2 ~6 E9 V- t+ n# c8 V2 @0 n
- int len;
9 v8 @7 J3 I( M @1 d; ^. q/ H/ y
6 K/ b7 L9 V. {9 c- UF_get_fail_message( irc, fail_message );
, K% \/ x/ |" J' o
, _( m. C" K: {- G- P, M- sprintf( err_msg, "%s, line %d: error %d: %s", file, line, irc, fail_message );' [* P% \5 Y, A3 Y4 q' c
- % r. p& E) B: E! M* s4 A
- len = strlen( err_msg );6 f- R- L4 k% D
- len = ( len < 131 ) ? len : 131;0 P1 h. Z. y! |) [
- strncpy ( msg, err_msg, len );6 V4 { E9 B' H G0 v
- msg[ len + 1 ] = '\000';
2 `7 R7 s5 H# i5 G. W
2 c* F* g3 h0 \5 V: r8 t# B) F& M+ H- _- uc1601( err_msg, TRUE );
% U7 v2 l2 o4 S$ B+ D) m - }
! D# X" h8 k& S+ o9 H& S! A! |; L' x ^: C - return( irc );5 d- j% T4 q/ O W7 N1 ]
- }+ U" x( X" e4 H; j: ]- S( \1 z! A
- 1 {/ @; b* ?- G
- extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
1 l( {; F) E# F: ?+ i w - {( m5 D9 T% Z% }8 G
- if ( UF_initialize() ) return;# b. S* ]2 R: B9 {: o! \1 x
- DoAssembly();
7 r' b# b' b0 n8 ~+ t - UF_terminate();
( z. f' Y1 g- h - }
) K8 ?" P- v+ a" c - 5 l/ l! v" r0 M/ H4 f2 D& I
- void DoAssembly( void )- P& E5 }! S% m3 [: W8 X- ` Q- \
- {
! _0 [* `/ W2 J6 {4 j) d% } - if ( NULL_TAG == UF_PART_ask_display_part() )
6 d* t) b! G$ k! ^7 c) t9 U - {
. V( a$ h; B9 f5 R) T' `6 z% @ - uc1601( "请新建一个文件再进行本操作!", 1 );6 ~( c6 h* e! h1 f5 O% c- E0 |3 t
- return;4 C% H# _8 A3 \. a; r; O
- }
. ]( e) q" O) L8 R! `; i7 d - 9 f9 d5 U- I+ S# i4 o/ S5 X4 a
- tag_t tagInsCyl = NULL_TAG;
* |/ [ x. ^* S* ?0 S - tag_t tagInsVBlk= NULL_TAG;5 Q- S) ], R) P6 X1 m% A
- tag_t tagOccCyl = NULL_TAG;6 D' K2 O5 c$ H8 E
- tag_t tagOccVBlk= NULL_TAG;' d% O$ B$ B& G9 c$ A. l
- UF_PART_load_status_t ErrorStatus;$ ]8 ?8 `6 d% b W c. {! d
* N9 t' o# P# A3 C0 f' u3 C- double dblzOrigin[ 3 ] = { 0, 0, 0 };
$ k0 q" f' q: d! Q! g - double dblzCsysMatrix[ 6 ] = { 1, 0, 0, 0, 1, 0 };5 v2 G' V% I1 ]* q) u: i4 {
5 v( Z9 `& b& I4 G; B) i- /* 装入部件GB2208_80_Vblock.prt */
8 I+ G/ B" R: X" C; k! k. H - UF_ASSEM_add_part_to_assembly( y: ?% v! C# ~' b. |% `: I$ p
- UF_PART_ask_display_part(),
?! o% A: ]; F' C4 X - "f:\\ug\\chapter4_1\\GB2208_80_Vblock.prt",, D8 O: L3 L* Y0 R, P' u' J+ j
- NULL,; ]: l+ B! M0 _" G4 o
- "VBLOCK",7 U% \ i9 Q% y4 Q" X! i! I
- dblzOrigin,7 E9 d6 f1 q! E7 e4 |
- dblzCsysMatrix,; p! Y' b m1 q
- -1,
* r/ X: l! _$ t - &tagInsVBlk,
; Q6 ?' Z- a- o5 p: s1 o- c - &ErrorStatus );3 ~0 N' i% I2 E4 ?9 ?+ H& g; y
- /* 装入部件Cylinder.prt */& Z! C& P( f: ^ M; C3 a$ C7 l( W
- dblzOrigin[ 1 ] = 50;+ n" c- r9 V7 s$ a/ F1 B8 U+ H( f
- UF_ASSEM_add_part_to_assembly(& c1 D/ r! ~ P* n
- UF_PART_ask_display_part(),! p6 m( W! d# }# X, R' X+ e! q
- "f:\\ug\\chapter4_1\\Cylinder.prt",
1 z( N0 x# ^ I* s8 \5 r1 d - NULL,5 r. Z- Y- Z1 \% S
- "CYLINDER",
3 F! |7 d' z6 p: n2 R* c, x - dblzOrigin,
Y# q7 I* `6 u( D7 L) V - dblzCsysMatrix,( T4 l6 F' `9 P, j6 @; D
- -1,& l4 N: i7 L9 p7 l
- &tagInsCyl,
: g% T( B/ h/ p1 @, Q! P - &ErrorStatus );
2 D3 E$ e( i: o: D - tagOccCyl = UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsCyl );
7 Q) O7 S2 H( W/ z/ G - tagOccVBlk= UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsVBlk );' n3 w4 [, I& h @% x8 s
- % m. i r8 K R2 Z
- /* 创建配合关系 */7 B* D) H) Z0 k) G& S% t" Z
- UF_ASSEM_mating_condition_t McData; F' K2 d- d9 L3 B6 X1 k
- tag_t tagObjectFrom = NULL_TAG;
, _# S# x2 C' g( ^+ z3 Y. X - tag_t tagObjectTo = NULL_TAG;
9 D" P5 {% [ r* g( y - tag_t tagPrototypeFrom = NULL_TAG;
* ~; i9 i( u7 O4 y1 ?" E - tag_t tagPrototypeTo = NULL_TAG;
4 ]9 X! @' a! T( c& B -
3 p1 H3 U+ A: B2 f4 G - /* 初始化约束*/( h, o( y! a% |
- UF_ASSEM_init_mc( &McData );
9 |( V: ?4 v, d
! \- u# U$ ]8 a9 c! W- /* 定义约束,构造配合关系*/
2 \, J% q I9 W( \ - McData.mated_object = tagInsCyl;3 Z8 y2 n' |" B% R. o
- , V- @9 a" B' |$ G
- McData.num_constraints = 3;' X" Q, i3 g5 { j0 \
- McData.name = NULL;
3 @' v( M3 `. M - McData.user_name = false;
( N2 u6 f. u4 N; n: ^" }5 x( \ - McData.override = false;$ n& y. {7 T# Z) o3 ?
- McData.suppressed = false;7 \7 u! z5 z5 i+ O
- McData.implicit = false;* W4 y2 u% f# L5 e$ [& ~: r7 ]
6 v3 E0 w0 Z- i1 @- tagObjectFrom = NULL_TAG; h5 ?, Z1 |- v9 o5 @
- tagObjectTo = NULL_TAG;
- V/ F2 `- _) B% g - UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );0 c! e A. A" t0 T
- UF_OBJ_cycle_by_name( "P1", &tagObjectTo );5 Q( J( o E! p1 b( x
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );" x* O) A5 q: G
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );, S) p1 @. L- Z/ i# A
- McData.constraints[ 0 ].from = tagPrototypeFrom;4 y; `- r2 U4 k8 ~: @0 b3 k* X/ @
- McData.constraints[ 0 ].from_part_occ = tagOccCyl;
% b4 @2 h+ |" S! Q - McData.constraints[ 0 ].from_status = UF_ASSEM_ok;" d7 @" v: j' E. r- q
- McData.constraints[ 0 ].from_type = UF_ASSEM_cylindrical_face;
" p1 ^6 s& E, h5 y0 j - McData.constraints[ 0 ].to = tagPrototypeTo;% P4 Y1 T! R, r# @6 v: l6 x. D; D
- McData.constraints[ 0 ].to_part_occ = tagOccVBlk;, s( ] c7 _* C. N
- McData.constraints[ 0 ].to_status = UF_ASSEM_ok;# [; g( Y6 U/ x; h6 q! h7 q
- McData.constraints[ 0 ].to_type = UF_ASSEM_planar_face;
5 ?, k3 i$ n* I5 z4 W4 s/ w - McData.constraints[ 0 ].mate_type = UF_ASSEM_tangent;8 q5 A# K6 |, a; J; V4 }0 [- z" T
- McData.constraints[ 0 ].offset = NULL_TAG;
5 w7 O8 k" ?; t% {, Z - McData.constraints[ 0 ].name = NULL;
# }( X# o* z& Z5 |* E - McData.constraints[ 0 ].user_name = false;8 j5 C1 a8 v# {( g/ ] p
- McData.constraints[ 0 ].inherited = false;! C+ r; ?6 [* m: P! v6 t
- McData.constraints[ 0 ].suppressed = false;
. E& K# a+ B' S0 H ~7 H* `( l# }; R - McData.constraints[ 0 ].has_help_point = false;
/ d p' {, k( _" ]2 A2 L - UF_DISP_set_highlight( tagObjectFrom, 1 );
# }& N# [9 M' W. V3 } - UF_DISP_set_highlight( tagObjectTo, 1 );$ r0 j8 s. w' t8 F8 z2 F& q/ M7 f
- uc1601( "这两个面进行相切操作", 1 );3 N' L5 g. Q6 q/ k8 F ?
- UF_DISP_set_highlight( tagObjectFrom, 0 );: A; L A$ S) Q" R( f
- UF_DISP_set_highlight( tagObjectTo, 0 );9 {! N) }+ y' `7 P
- : L' U) y# G; @4 ^: y
- tagObjectFrom = NULL_TAG;
! J; L; b9 V- H* k2 K0 S3 ? - tagObjectTo = NULL_TAG;+ B e& _) X9 V' ]. [
- UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );! t8 E& T+ n1 k& H6 c
- UF_OBJ_cycle_by_name( "P2", &tagObjectTo );" H. V0 I+ I5 v/ K) B& n" W0 ]
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );3 P; c( J8 o, p/ I0 V- ]
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
6 J* T1 f' c+ l6 P( [ k0 c - McData.constraints[ 1 ].from = tagPrototypeFrom;
' Q/ b' d9 h( C4 A8 |, } - McData.constraints[ 1 ].from_part_occ = tagOccCyl;4 F3 D9 ~+ a" H$ ^( v5 y+ E
- McData.constraints[ 1 ].from_status = UF_ASSEM_ok;# @. J) G+ J0 ]
- McData.constraints[ 1 ].from_type = UF_ASSEM_cylindrical_face;
4 b9 ~; Q' y3 x- G# _) R# W/ G1 R& u - McData.constraints[ 1 ].to = tagPrototypeTo;
! `1 {3 G8 j4 f - McData.constraints[ 1 ].to_part_occ = tagOccVBlk;
; b$ Q0 c$ w1 h- x5 D* ~ - McData.constraints[ 1 ].to_status = UF_ASSEM_ok;. y( n! Q/ R* `8 ^
- McData.constraints[ 1 ].to_type = UF_ASSEM_planar_face;# P9 B4 i. O5 O( t3 {& U4 X1 g5 S
- McData.constraints[ 1 ].mate_type = UF_ASSEM_tangent;8 S" R* h. G2 V) O3 B1 ~ p8 b
- McData.constraints[ 1 ].offset = NULL_TAG;0 M# ]- K" Q$ M8 }6 R% x
- McData.constraints[ 1 ].name = NULL;# @0 P% a5 B0 O" k2 i9 T4 r% q% q
- McData.constraints[ 1 ].user_name = false;
5 \! t$ B2 F4 U4 m: X1 D0 q - McData.constraints[ 1 ].inherited = false;+ p0 j; u6 d0 O5 C: T5 m
- McData.constraints[ 1 ].suppressed = false;
8 r; J, \, p2 M2 H: q) j! @" x, V - McData.constraints[ 1 ].has_help_point = false;) ]* A2 \! w( h8 B. w/ c" g
- UF_DISP_set_highlight( tagObjectFrom, 1 );
* S# ]( d- ]: Z' p0 Z& s* x - UF_DISP_set_highlight( tagObjectTo, 1 );
% U, h" I) d$ ~* s9 A1 c - uc1601( "这两个面进行相切操作", 1 );1 L0 `* @! F% Z( L* {7 Y3 B$ J
- UF_DISP_set_highlight( tagObjectFrom, 0 );
; I3 W8 t+ n2 V8 K/ f! ? - UF_DISP_set_highlight( tagObjectTo, 0 );: f8 d5 O. z& D3 t
- 7 F/ p3 }0 c- H# `9 ?$ b, D% T; u
- tagObjectFrom = NULL_TAG;5 D0 y ]9 N6 b+ M- ~: g
- tagObjectTo = NULL_TAG;1 h6 O7 \6 v/ i9 r
- UF_OBJ_cycle_by_name( "CYL_FACE_1", &tagObjectFrom );
- n% J8 n; R, }# R! f6 w. u0 M - UF_OBJ_cycle_by_name( "P3", &tagObjectTo );
' n# z! V. ?6 }$ y u) A - tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );
0 D' x Z, C; g; h. S9 K ? - tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
1 \! r. B! _2 L# { - McData.constraints[ 2 ].from = tagPrototypeFrom;
1 o& Q9 H# T* ?- g/ U3 E/ l, s6 {1 S - McData.constraints[ 2 ].from_part_occ = tagOccCyl;
$ R) D$ F: f& S# G9 X: M/ w5 \$ A - McData.constraints[ 2 ].from_status = UF_ASSEM_ok;; a: X9 N4 T' U. t" }
- McData.constraints[ 2 ].from_type = UF_ASSEM_planar_face;
, B6 Q& R% f1 N! [ - McData.constraints[ 2 ].to = tagPrototypeTo;* U/ X R7 c4 v3 o
- McData.constraints[ 2 ].to_part_occ = tagOccVBlk;# Q6 o$ |% f' {# T6 {+ x2 A
- McData.constraints[ 2 ].to_status = UF_ASSEM_ok;0 C& i3 U, \$ Z) k% W' c
- McData.constraints[ 2 ].to_type = UF_ASSEM_planar_face;
- ~! s. j6 b! H( O7 k - McData.constraints[ 2 ].mate_type = UF_ASSEM_align;1 d" v/ w1 y8 a- d
- McData.constraints[ 2 ].offset = NULL_TAG;
- J% a- y: L- V - McData.constraints[ 2 ].name = NULL;
+ B& s& p/ G1 S( X. g - McData.constraints[ 2 ].user_name = false;7 `: X# i" G- _
- McData.constraints[ 2 ].inherited = false;& I2 s4 [3 d5 F' w d( [
- McData.constraints[ 2 ].suppressed = false;0 _/ _( {6 C8 r9 z n6 [4 _( E
- McData.constraints[ 2 ].has_help_point = false;* @& d( K3 i$ D2 |
- UF_DISP_set_highlight( tagObjectFrom, 1 );
$ S# k. |8 w3 G - UF_DISP_set_highlight( tagObjectTo, 1 );) S( S! q1 D! I1 S" i7 d
- uc1601( "这两个面进行对齐操作", 1 );
; V% L4 i- T+ D - UF_DISP_set_highlight( tagObjectFrom, 0 );+ M# I/ Z( x; G) v$ P- J* e3 A
- UF_DISP_set_highlight( tagObjectTo, 0 );" M0 {" P6 e9 y8 w- Z
- : w- q( f) ?( U+ R
- double dblzTransform[ 4 ][ 4 ];
, I6 W+ Z$ {8 R4 R& a g* b - UF_ASSEM_dof_t Dof;- }2 y! I/ {' v! j
- UF_ASSEM_mc_status_t Status;
1 R6 F" E8 O8 F
% @& q) |$ A) v5 T; x/ |
. D, F1 ]& @, f/ G; v5 @- /* 求解约束*/' v+ A H. R* }/ A3 D
- UF_CALL( UF_ASSEM_solve_mc( &McData, &Status, &Dof, dblzTransform ) );( L* A& L: L N7 M& H4 h& K7 h
- if ( UF_ASSEM_mc_solved == Status )7 S. @* L: d% }: ?: l6 [9 Y. j
- {& M: `3 [8 G v: u) [7 s6 g: d
- uc1601( "求解约束成功!", 1 );: {8 t6 Z5 d7 b( Q
- UF_ASSEM_mc_structure_state_t StructStatus;" u& _. K6 d+ U$ U5 U3 E
8 `( M, t- A. e4 t. s- /* 将约束应用到装配体上*/
0 k# n& q0 L0 P) `6 w8 W - UF_CALL( UF_ASSEM_apply_mc_data( &McData, &StructStatus, &Status ) );
1 o4 J4 V8 m* u4 `5 T" d& i - if ( UF_ASSEM_structure_ok == StructStatus ) 4 `/ X: N/ ^$ R: E/ ?9 ^
- {
9 S6 p/ S" g* R - uc1601( "应用装配成功!", 1 );
" k; s% X6 k( ?9 e6 G1 Y2 w - ?' A$ j2 P1 K6 J- U
- /* 更新模型*/
. q( L7 }. j( m9 H - UF_MODL_update();1 ^6 }9 w9 b, o% u- e4 j6 H2 Z
- UF_DISP_refresh();
' e0 ?. k% p. _2 t. G - }
0 g$ X' V9 A2 R7 _3 a# B. f - else uc1601( "应用装配失败!", 1 );
9 w2 ^5 l% n9 e - }
2 M# a, l- t$ B4 \, f* O# E - else uc1601( "求解约束失败!", 1 );
8 ~8 ~( N/ L8 r) e& y/ e. { - }; i' T" o2 M* S5 F0 [
- }
% u0 j' S. H! R
复制代码 2 c& O- S8 U0 r$ E, B E
' V% O+ `$ p `$ b1 o" ?" b+ h! l% A4 _" U
7 b3 }4 s2 U' F0 X5 T# O
) r" z3 O. H+ g4 r" |: e; r1 a8 s; H; D$ k6 b
# n' Z8 M- n6 n( ~- q3 _ |