|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
使用UFUN进行UG NX二次开发: 装配设计技巧及步骤
( S3 f( o1 k- C3 h2 @. \
' A9 M! P$ u+ H2 h E0 [; L! W" B5 e" R) c& U
1、装入部件
& Q" n( g& J) V6 w通过函数UF_ASSEM_add_part_to_assembly()指定部件装入的位置 、姿态等信息,实现在装配体中装入一个部件功能;
- c5 ]4 D. o9 ~- X! s3 k' a2 ~- a8 |+ ]1 w, { s3 ?
2、创建配合关系
; u- z- z; @$ i* }6 T2 i0 P; Ta.通过函数UF_ASSEM_init_mc()初始化约束;" X4 O3 T& @+ {$ U# E! p
b.定义约束关系,即填写结构UF_ASSEM_constraint_s中信息;
( ~; L( |5 k+ @1 g% U! K0 O装配中各部件间的配合关系是通过装配约束关系来实现的。装配约束是指一个部件到另一个部件的约束,将部件A配合到部件B上,则部件A称为主动件(from),部件B称为被动件(to),在约束求解过程中,被动件在装配空间中的位置固定,而主动件将变换姿态到满足装配约束位置上。组成配合关系的约束之间不能存在几何关系上的矛盾,也不能形成循环定义。/ c6 C' Y; L% U1 { v4 f w; L
c.通过函数UF_ASSEM_solve_mc()求解约束;8 O G# G1 r" ^6 l! S
d.通过函数UF_ASSEM_apply_mc_data将约束应用到装配体上;# y4 a/ {& x4 D" b! J d" K
e.通过函数UF_MODL_update更新模型。
; }, g* |/ y1 ~8 H* g
5 c; B5 g, D2 x" `4 D4 C9 R- #include <stdio.h>' z& _8 b' T, G r( x C! J
- # c) Y" p T" |, x- F
- #include <uf.h>! e$ f w: y! O$ k4 v3 q6 R, m
- #include <uf_ui.h>
5 N% W8 n; H6 m4 A( d - #include <uf_obj.h>4 O- _& f" l5 m8 K4 l
- #include <uf_disp.h># G2 }4 c3 l) I2 Q% y2 e5 L
- #include <uf_modl.h>$ N4 h9 M7 X' y: c* p1 Q# ?
- #include <uf_part.h>
; o( f/ g. l5 |0 `/ U0 \ - #include <uf_assem.h>
% _' u2 C d5 B - 0 j" P8 V. D4 M9 |6 w* q5 f+ u
- #define UF_CALL( X ) ( report( __FILE__, __LINE__, #X, ( X ) ) )
) s ]7 [% V" u3 b - ! V) l- I# O2 P2 j2 _ ^
- int report( char *file, int line, char *call, int irc );
& Y, s5 q* f+ {9 x C1 b - void DoAssembly( void );
5 _: ]7 B; V1 `2 K8 ]# S - 2 o' j& m9 q& K# M
- int report( char *file, int line, char *call, int irc )
+ f; k* a$ w: x2 D - {! q* F$ u8 h1 R# j: q
- if ( irc )% p& M7 V* u: |$ Z. q, u( ^9 o
- {
f' p- _$ }) v9 J' a - char err_msg[ UF_UI_MAX_STRING_LEN + 1 ];
: c$ H8 _( q9 S+ w - char msg[ 133 ];) r- ~2 i9 k* e. b
- char fail_message[ 133 ];
2 j) d' P% o5 |- ~. l, d - int len;; K/ g+ v% R2 c: R# ]- K( ?9 @; L. s9 e
% Q7 |" ^5 u i9 s7 A; E2 T0 A- UF_get_fail_message( irc, fail_message );
+ b3 G. e# r2 P# H4 d0 S - 8 ]9 ]: K* F" A9 H- a! Q
- sprintf( err_msg, "%s, line %d: error %d: %s", file, line, irc, fail_message );
% w5 a. X9 ~5 s/ s# N - 4 x: z- R( Q e
- len = strlen( err_msg );
& U: v9 l1 D, P7 g - len = ( len < 131 ) ? len : 131;
) s2 b6 O9 q! M8 W R: k - strncpy ( msg, err_msg, len );/ Y- D1 U* p3 _
- msg[ len + 1 ] = '\000';9 F, O5 j: g4 I& M$ F
- & [6 E V) H( U( g9 J
- uc1601( err_msg, TRUE );
. a3 V, j9 ]2 t2 F! I# Q! [: e- l$ A - }
6 ]8 h. x; _! l! r& c- ^& m - return( irc );. r" A) N q2 i& {9 ~
- }5 b) S4 J% X8 ], b$ V8 o
- 2 b2 F' p3 y5 T
- extern DllExport void ufusr( char *parm, int *returnCode, int rlen )' C7 B _, O; E% U0 i/ P
- {! z; w! ^& ]1 _' B: }1 k% G7 V8 q
- if ( UF_initialize() ) return;
! d& M, i' b6 X. S/ T; J# R0 m - DoAssembly();
5 t! _5 M8 U9 m. {! s2 T& z g - UF_terminate();
' E) z" }3 L+ c8 W4 K - }) l, ]/ o2 F6 O5 {, {; `
- # X p5 p8 R/ g/ T
- void DoAssembly( void )
' Z# B0 T6 v) Y- Q5 P1 K - {) c+ h1 a3 C+ N! ]; W" D; U+ I8 H
- if ( NULL_TAG == UF_PART_ask_display_part() )7 ~) X; ~) N8 o; O
- {: e3 c% D5 F/ ?1 I% f
- uc1601( "请新建一个文件再进行本操作!", 1 );- ~. _. e/ K& Q+ `+ r
- return;
% q. J- D' d; ]; ~0 R - }/ G2 s8 | d: ]+ l& b" Y
- 4 O' d. m% B# G# {, r! x# w6 Z {
- tag_t tagInsCyl = NULL_TAG;
$ |( \) f/ F5 w- K3 n - tag_t tagInsVBlk= NULL_TAG;
4 |, J p9 m: f2 K' u1 i - tag_t tagOccCyl = NULL_TAG;
8 q d$ {! r! U% z - tag_t tagOccVBlk= NULL_TAG;) Y* r4 n% n9 Y4 U
- UF_PART_load_status_t ErrorStatus;# {# ]) p& ], S9 a! f, }- M9 c2 C
8 Z5 d2 Q$ F6 z, {- double dblzOrigin[ 3 ] = { 0, 0, 0 };
4 C! M# t/ J+ Z; P - double dblzCsysMatrix[ 6 ] = { 1, 0, 0, 0, 1, 0 };
! f- k6 m' D- T4 |1 |3 l4 e* n. Z - % S( d- `# D% E1 T, R
- /* 装入部件GB2208_80_Vblock.prt */4 R$ L& |1 T' K7 J5 e; D
- UF_ASSEM_add_part_to_assembly(
$ ?) L j5 C3 S* J - UF_PART_ask_display_part(),) J2 o, I# u" c
- "f:\\ug\\chapter4_1\\GB2208_80_Vblock.prt",
1 g3 q+ m$ X6 a+ |0 Y; g. W - NULL," @6 c* g. O% v% k
- "VBLOCK",% M' O. _& `5 ?* i
- dblzOrigin,- C9 D$ H: g+ m2 s+ H
- dblzCsysMatrix,; d' X+ K6 C: ~8 L; ?9 c2 q3 Q
- -1,& H% e0 A8 ^0 }6 B5 m' Z ^
- &tagInsVBlk,
( ?1 R$ c0 t0 }2 O- F) m' p$ B - &ErrorStatus );
- h R$ O* k. r3 v& n# u8 O2 S - /* 装入部件Cylinder.prt */+ c+ ], c `6 r" I7 t
- dblzOrigin[ 1 ] = 50;3 T3 j, I, c6 K9 q4 T! p
- UF_ASSEM_add_part_to_assembly(
]# [; X( M( C; ?2 P8 { - UF_PART_ask_display_part(),
0 L9 t- H8 C' R2 r) ^ - "f:\\ug\\chapter4_1\\Cylinder.prt",
; w3 Y& y6 S+ J% a$ D0 k - NULL,
' P% v* \3 u% L. t7 A+ \* E+ R - "CYLINDER", ^1 }) a' J F( s/ h
- dblzOrigin,: I$ |% [ _4 b- c1 \
- dblzCsysMatrix,
8 E" N" e( f! \$ r3 l - -1,
2 E( ^7 w; @. X# L ] - &tagInsCyl,
3 ~- u' {3 Z) g' x$ r; ]4 ^ - &ErrorStatus );
+ [" O# |( n# ~) v- Q: [: V - tagOccCyl = UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsCyl );
& g7 u7 j a8 w5 K9 c r - tagOccVBlk= UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsVBlk );
1 c3 \+ {" r( @ P% O# F# g( n' b# g - h4 o6 S0 f. n: }: P) R
- /* 创建配合关系 */
/ b, n4 {3 |$ G- {4 l% C$ z3 ` - UF_ASSEM_mating_condition_t McData;" @. D- W& \9 d4 K. _5 X7 I9 d
- tag_t tagObjectFrom = NULL_TAG;' r8 S' |/ U9 `# p) K6 T" i
- tag_t tagObjectTo = NULL_TAG;/ w" ^* x( g) ?0 q9 H% `) t" d# R
- tag_t tagPrototypeFrom = NULL_TAG;
* t1 `* Q$ V3 t) U4 u3 q' Z - tag_t tagPrototypeTo = NULL_TAG;* b* q9 I% z$ A3 z
- ) `7 G$ E5 L9 z6 r1 y
- /* 初始化约束*/
2 m% n4 ^; |; d- d' n$ A) @3 ^6 ~5 L - UF_ASSEM_init_mc( &McData );
. ~! f9 x# F- k% `! G% L3 O
3 q2 w' E. @, \- H( [5 j' i- /* 定义约束,构造配合关系*/
7 e$ ? Z+ [# m6 A; J/ y - McData.mated_object = tagInsCyl;
. d: `" r! j( G! J - ! u4 \" [6 T4 H
- McData.num_constraints = 3;5 ^ b3 i, }! Q2 P+ k1 K: Q$ y
- McData.name = NULL;, n s' h5 r2 h8 u# z& j
- McData.user_name = false;
* {" ~* k" ~: Q1 C/ D) I% | - McData.override = false;- h7 D$ k* ~2 i" b
- McData.suppressed = false;! f3 s; Z$ k6 m0 {1 [1 [8 P
- McData.implicit = false;; Z- ^! W+ x- v3 V: Z
- : S, F( N, v- q$ Z5 _
- tagObjectFrom = NULL_TAG;2 t3 J; ^4 w$ _7 J, X) H5 e
- tagObjectTo = NULL_TAG;: {% T% F& n' |+ b$ a
- UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );# B% G# k" t& z4 [" t% m. m# Z$ w
- UF_OBJ_cycle_by_name( "P1", &tagObjectTo );/ H# G9 C& N0 u
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );4 h7 O! ?) T1 V- c. u; k5 A
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );# Y! a- L( V. Z$ D/ j. n+ a
- McData.constraints[ 0 ].from = tagPrototypeFrom;
' C f5 z5 w% _( Y - McData.constraints[ 0 ].from_part_occ = tagOccCyl;) w$ K/ U# T" R2 _" ~( ]* |
- McData.constraints[ 0 ].from_status = UF_ASSEM_ok;. \1 g L3 z+ P
- McData.constraints[ 0 ].from_type = UF_ASSEM_cylindrical_face;+ s) C& r& C# r% U- t8 m2 u
- McData.constraints[ 0 ].to = tagPrototypeTo;8 C& H! W6 y+ D% P
- McData.constraints[ 0 ].to_part_occ = tagOccVBlk;1 K, U; e2 `8 @* _- J. j
- McData.constraints[ 0 ].to_status = UF_ASSEM_ok;
5 w, L" m$ {- |2 A% ~) k5 R/ V - McData.constraints[ 0 ].to_type = UF_ASSEM_planar_face;
2 s5 P( \: e) {, ~3 m( f - McData.constraints[ 0 ].mate_type = UF_ASSEM_tangent;: S( o6 r. ]/ y& U! e
- McData.constraints[ 0 ].offset = NULL_TAG;8 F' v. k. `1 a) p" o) Y; N
- McData.constraints[ 0 ].name = NULL;
! d7 h1 G5 p( A. n; [ - McData.constraints[ 0 ].user_name = false;+ _! N# A- @7 @) r9 K1 b2 |
- McData.constraints[ 0 ].inherited = false;! k8 J. `) ]* [3 X" M3 ]( W! P
- McData.constraints[ 0 ].suppressed = false;
: @1 J! O1 f5 m4 s - McData.constraints[ 0 ].has_help_point = false;
Y% ?3 y0 K# Q# p - UF_DISP_set_highlight( tagObjectFrom, 1 );6 ^- c+ d* G3 i+ q4 u9 J0 l
- UF_DISP_set_highlight( tagObjectTo, 1 );1 K- ^/ J" h. \: `5 f q. ?
- uc1601( "这两个面进行相切操作", 1 );
% [# V( z" x2 q1 H; M+ l1 z9 m7 N" x - UF_DISP_set_highlight( tagObjectFrom, 0 );
7 O- L K$ y4 V0 l8 b1 O( |7 F1 M - UF_DISP_set_highlight( tagObjectTo, 0 );
9 d1 L. J% S- E$ M$ l5 }! M0 ~% B
+ k! f6 O. }" k5 W* _6 |7 ^- tagObjectFrom = NULL_TAG;7 t" I: q5 b+ r; d- T) V* f
- tagObjectTo = NULL_TAG;
/ B2 W* f5 K9 f8 F3 F - UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );3 ?! }% r, Q( b5 g
- UF_OBJ_cycle_by_name( "P2", &tagObjectTo );6 t- ]- w; c% Y4 I
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );
: l4 ~1 S/ J- r" K- j& m - tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
& y w* O; o. R - McData.constraints[ 1 ].from = tagPrototypeFrom;. {6 H& s+ O* c$ n% g( u$ v6 k& V
- McData.constraints[ 1 ].from_part_occ = tagOccCyl;
2 b6 v; B1 n, y! W - McData.constraints[ 1 ].from_status = UF_ASSEM_ok;
; s/ L; @, W3 P5 R5 Q - McData.constraints[ 1 ].from_type = UF_ASSEM_cylindrical_face;7 n; o4 V1 q- g( c; t
- McData.constraints[ 1 ].to = tagPrototypeTo;
$ C! k2 y( l1 E) | - McData.constraints[ 1 ].to_part_occ = tagOccVBlk;
+ ]: F9 c- {& A$ [+ K - McData.constraints[ 1 ].to_status = UF_ASSEM_ok;* v r: P* |$ v# ?. s/ u. h
- McData.constraints[ 1 ].to_type = UF_ASSEM_planar_face;( }4 N \. i1 m$ v8 O9 J4 @
- McData.constraints[ 1 ].mate_type = UF_ASSEM_tangent;2 H; C+ P. W) `- X
- McData.constraints[ 1 ].offset = NULL_TAG;
- J4 n4 n/ R$ y1 h - McData.constraints[ 1 ].name = NULL;* _: X9 s3 l' J7 x! ^7 P$ ~
- McData.constraints[ 1 ].user_name = false;
" `: k4 B. d# Z v0 M1 w - McData.constraints[ 1 ].inherited = false;
+ n; D, U9 p# m* [$ l# f1 H" X; ~ - McData.constraints[ 1 ].suppressed = false;
[9 d+ N( u7 p" g( z+ @( n/ X - McData.constraints[ 1 ].has_help_point = false; @/ b; r4 }; T( X+ e# J
- UF_DISP_set_highlight( tagObjectFrom, 1 );
4 C6 p% `# g" Y' M7 A+ M. G: N+ J - UF_DISP_set_highlight( tagObjectTo, 1 );
& \( v+ p( ~! t2 F: n) P0 S# f - uc1601( "这两个面进行相切操作", 1 );
+ D/ q9 I4 y1 \4 B0 C! P; @ - UF_DISP_set_highlight( tagObjectFrom, 0 );8 h B& Q6 }! T4 J. [
- UF_DISP_set_highlight( tagObjectTo, 0 );
- C" C4 K" ]& \2 U: }$ P2 J' Y( ] - & j$ h" L; J% l! L, v( X- F, d9 c
- tagObjectFrom = NULL_TAG;
+ ~- f+ D6 j" J7 @9 I" W1 U - tagObjectTo = NULL_TAG;
4 N) ]8 W; L& L7 K - UF_OBJ_cycle_by_name( "CYL_FACE_1", &tagObjectFrom );2 I2 d( R! P6 Z4 Z
- UF_OBJ_cycle_by_name( "P3", &tagObjectTo );+ h/ \0 K! ], R5 ^8 V
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom ); ~. ]& ]- ]# ~
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
7 [: s" E) [ u; d* R" q - McData.constraints[ 2 ].from = tagPrototypeFrom;
% m$ j/ j Y! D/ W9 V4 z - McData.constraints[ 2 ].from_part_occ = tagOccCyl;9 y4 j( x' d9 p/ e1 ]( U, Y3 W* T
- McData.constraints[ 2 ].from_status = UF_ASSEM_ok;' h4 D$ C& Q; M2 `" H7 [) o
- McData.constraints[ 2 ].from_type = UF_ASSEM_planar_face;, A- ]- H2 r; \5 Y
- McData.constraints[ 2 ].to = tagPrototypeTo;% f! f v: }, E6 V N& ?- m1 m
- McData.constraints[ 2 ].to_part_occ = tagOccVBlk;
! u! v7 E, ^- k7 t: Z - McData.constraints[ 2 ].to_status = UF_ASSEM_ok;+ e! n% W, z% Q( X7 Q
- McData.constraints[ 2 ].to_type = UF_ASSEM_planar_face;6 x% W8 f+ [; m
- McData.constraints[ 2 ].mate_type = UF_ASSEM_align;
$ g! o \/ L- X4 p/ x2 V - McData.constraints[ 2 ].offset = NULL_TAG;- s7 I( e( s1 y% I8 S x m
- McData.constraints[ 2 ].name = NULL;& s) N! y9 m t. \
- McData.constraints[ 2 ].user_name = false;0 o$ z2 [4 Z" Z" }. g$ x
- McData.constraints[ 2 ].inherited = false;
1 j, e n( w) G5 Z- {4 d - McData.constraints[ 2 ].suppressed = false;/ ^ r: n: G3 S9 B' M
- McData.constraints[ 2 ].has_help_point = false;
3 ~' |( [- z0 Q0 S7 M; a - UF_DISP_set_highlight( tagObjectFrom, 1 );+ Z6 F$ N9 q4 g4 Z ?
- UF_DISP_set_highlight( tagObjectTo, 1 );
1 }$ P1 ?4 U, f* ?" j3 A - uc1601( "这两个面进行对齐操作", 1 );4 ~. ?7 {" g3 ?: c7 X" V2 _. p
- UF_DISP_set_highlight( tagObjectFrom, 0 );* k: G# b6 z" y/ K; |3 S% t
- UF_DISP_set_highlight( tagObjectTo, 0 );
, M: |. o! v! P6 E( V( b6 S - ) l3 |9 R o d$ }' A2 P v' s3 x
- double dblzTransform[ 4 ][ 4 ];* S' k# E) l, t6 X
- UF_ASSEM_dof_t Dof;
) ^7 L0 I3 |- e2 R - UF_ASSEM_mc_status_t Status;
( i) T8 q- |: \3 B5 ]3 j. D: \2 Z
9 {7 L4 n7 g# [; R8 |- 1 u& |' U3 B4 u! n4 f1 Y) C; ~
- /* 求解约束*/) y I( n( O5 D" _; }4 J
- UF_CALL( UF_ASSEM_solve_mc( &McData, &Status, &Dof, dblzTransform ) );
I+ @, W6 ~, h4 N# |. P - if ( UF_ASSEM_mc_solved == Status )0 y4 g4 p( {, O3 x/ N0 a8 K% S# |
- {4 d& }6 v, t( j/ p5 p
- uc1601( "求解约束成功!", 1 );' ]9 G! a( t( S6 Z
- UF_ASSEM_mc_structure_state_t StructStatus;, V& T, P* w; S7 ]9 k1 P- h' q
4 Q* h; u9 m1 }. T! ^5 x- a- /* 将约束应用到装配体上*/% P8 Q7 D4 Q8 M. R2 E
- UF_CALL( UF_ASSEM_apply_mc_data( &McData, &StructStatus, &Status ) );
$ ? L' ]# J2 ?3 P$ _! I' ?3 b' ?5 A - if ( UF_ASSEM_structure_ok == StructStatus ) + z0 t+ @- Z" F9 f
- {
1 h. a. ~0 z" k& K) T# I/ c - uc1601( "应用装配成功!", 1 );9 p3 j2 Y" ^0 Y* o' J) s& ^
-
) ?( E; W6 q# R% G9 T, u8 x% B8 f - /* 更新模型*/
2 s/ q) H) W: H ?3 t* m - UF_MODL_update();
9 P ?0 b/ V4 B0 V1 U" a - UF_DISP_refresh();- O1 m( L' a; k3 }8 N3 @! q
- }5 Y$ o7 z {8 ^8 `
- else uc1601( "应用装配失败!", 1 );
5 Y D. S- {8 A V: u, }2 p* i, { - }1 v% @ ]0 q! D% a/ y/ n. S
- else uc1601( "求解约束失败!", 1 );6 T/ d+ H8 R# D* \3 Y" K
- }, d6 ?0 h2 {" ?$ ^5 b" N6 o
- }
1 w- I' o5 J3 T% J8 ~9 w
复制代码 5 j) F) A, l2 R& `7 D; c5 ~4 Y" F
, o. }) u( E& m2 W$ B. m2 D9 X3 V$ T6 i6 b
! l$ @5 Q8 b" u5 v# R2 E
* ^: j: i- |. W/ l: h
2 v# c( `+ C% j/ ?( S& z: O' b( D
8 n, o' r% t% g% H+ p- I7 a+ ?& p- [
|
|