|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
使用UFUN进行UG NX二次开发: 装配设计技巧及步骤
0 K, J8 G w! Y1 c) D/ C3 s9 r+ A: J7 N) T) A2 q) j9 ]
% T. _% \0 c) a! V/ a r8 N
1、装入部件9 y, d t8 K8 a! F' j7 Q2 M: @$ y
通过函数UF_ASSEM_add_part_to_assembly()指定部件装入的位置 、姿态等信息,实现在装配体中装入一个部件功能;* y- M9 u i$ Q7 d
K7 G; D' M6 c' V
2、创建配合关系; r9 V# [* e4 J
a.通过函数UF_ASSEM_init_mc()初始化约束;
* {4 \1 ^( ] z( R+ z9 x/ p8 x; b* fb.定义约束关系,即填写结构UF_ASSEM_constraint_s中信息;! \: q- f; O" A1 p
装配中各部件间的配合关系是通过装配约束关系来实现的。装配约束是指一个部件到另一个部件的约束,将部件A配合到部件B上,则部件A称为主动件(from),部件B称为被动件(to),在约束求解过程中,被动件在装配空间中的位置固定,而主动件将变换姿态到满足装配约束位置上。组成配合关系的约束之间不能存在几何关系上的矛盾,也不能形成循环定义。- Q1 U$ b: o, d8 X
c.通过函数UF_ASSEM_solve_mc()求解约束; O( K& F( \- Q( C
d.通过函数UF_ASSEM_apply_mc_data将约束应用到装配体上;7 A, X. {" D) N4 c" W
e.通过函数UF_MODL_update更新模型。
) X4 E$ P$ L5 o" q; \! k A) }, H2 J, a% o
- #include <stdio.h>
7 F) H& A6 q* d( ~- e" y - 0 O8 |5 j7 S. z' I
- #include <uf.h>3 b" y' h- T. k' s8 H) e
- #include <uf_ui.h>
5 j5 L% q2 w) f) D2 k - #include <uf_obj.h>
% B a$ i$ \/ f1 Y - #include <uf_disp.h>
0 P8 z- J( {) ?& _5 a - #include <uf_modl.h>1 q- ^4 A% t4 X1 o6 R ]$ |3 S/ }. G
- #include <uf_part.h>
0 h+ r% M' |; V, k - #include <uf_assem.h>8 _( M. w; N/ w8 I4 O
# G+ p- C2 o8 Y0 b9 u4 \- #define UF_CALL( X ) ( report( __FILE__, __LINE__, #X, ( X ) ) ); e6 {3 z1 L4 C, ~% ]' _, {7 g
- . a5 |6 `1 P; h% e; @3 z
- int report( char *file, int line, char *call, int irc );1 g. F p/ z5 m- L, j0 ?
- void DoAssembly( void );- P' |- u2 y1 o) L1 H
- . }; g0 w, W6 y7 M6 r5 Z
- int report( char *file, int line, char *call, int irc )
3 a. b3 ^. |4 u4 D* P U3 F- _$ Z - {9 I) k, V4 f' {0 t( S* E
- if ( irc )
' {2 X R$ v( d; L. d4 K+ M" h# x - {
% i, @+ I! g% I$ M B# P0 @. t - char err_msg[ UF_UI_MAX_STRING_LEN + 1 ];& h: t7 h M0 S* M3 m1 I4 C
- char msg[ 133 ];; T4 L) a' W# ]* ?. ^
- char fail_message[ 133 ];* o! B. ?+ @+ C- G7 U% k4 J( C
- int len;- {+ v3 k! Y3 h
- 5 i9 W' |; ^* h: w J% l; y6 f
- UF_get_fail_message( irc, fail_message );
+ D' a9 M: s2 T# ?
2 ^4 }4 q" C1 D6 e) N+ d8 ]- sprintf( err_msg, "%s, line %d: error %d: %s", file, line, irc, fail_message );
- @7 x" ~" W5 @7 c - * p1 N- y1 R1 _7 \0 c/ l1 q8 K
- len = strlen( err_msg );& ]: {& Q* H3 | p9 S) d. d" n
- len = ( len < 131 ) ? len : 131;+ d+ I7 } d$ p8 h+ w8 J8 ^
- strncpy ( msg, err_msg, len );' w1 T( M) X y) }/ V
- msg[ len + 1 ] = '\000';% q+ d+ h* d# H4 G
- / y8 |+ [: i, q+ m. _6 g1 i3 e
- uc1601( err_msg, TRUE );
6 {$ f$ @" I- c+ N, x/ y - }, F9 E# c4 c- y' E7 l
- return( irc );# X2 O6 ~0 D, \* `
- }
+ [- ?) c, O; T' O8 e, R: ]
& i7 v# _2 z+ v9 {6 ?+ ~- extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
7 ]6 K) ^) |/ b I- F! x' R+ T; d- u7 d - {
. m9 q+ _+ M2 H: X' X - if ( UF_initialize() ) return;
- p4 y! Z6 h0 X4 [" l5 f3 X - DoAssembly();. v$ b: I$ ^& p! m
- UF_terminate();( w3 [. V- @8 @) o4 p
- }
. a J) Y0 |* e - ' A M/ ?' `5 F! b% p' X
- void DoAssembly( void )
5 o% B+ Q; G+ x* J1 I! F* | H - {
9 |( w8 [. r. W! ~ - if ( NULL_TAG == UF_PART_ask_display_part() )' @# u$ J$ ]0 x5 k
- {
6 u9 F: w& W6 }5 q: L - uc1601( "请新建一个文件再进行本操作!", 1 );: v4 c% b- r; r2 u
- return;
3 @# F( q& k9 W. m4 F - }% S. z! q- V' b2 ^& @' O
; J6 _, M# ?% O5 j( ~# ^2 {- tag_t tagInsCyl = NULL_TAG;! {. \! A" W$ w r% f/ V9 m: E+ |- t% y
- tag_t tagInsVBlk= NULL_TAG;
( D! o3 t4 w& _4 W - tag_t tagOccCyl = NULL_TAG;
0 l! A9 @$ S% x - tag_t tagOccVBlk= NULL_TAG;
7 A, [* j. J% _2 S* ~ - UF_PART_load_status_t ErrorStatus;* b* I7 U9 m2 f/ o% W9 ]
X/ d2 h5 s0 w) m3 m) z4 A7 x9 P- double dblzOrigin[ 3 ] = { 0, 0, 0 }; U( ?; Y! N, d5 y3 x8 I, W4 ^, @
- double dblzCsysMatrix[ 6 ] = { 1, 0, 0, 0, 1, 0 };
0 J, M' I2 H5 b% M& c
8 E/ s; Z6 r6 ?) b4 h! L9 i- F- /* 装入部件GB2208_80_Vblock.prt */
. x! y1 D4 L7 M& y5 {) Y - UF_ASSEM_add_part_to_assembly(0 C( y% x X3 E- H' b
- UF_PART_ask_display_part(),
: G0 `" H+ o1 D( V" n! A) E - "f:\\ug\\chapter4_1\\GB2208_80_Vblock.prt",
4 H4 q# V& Q! n0 F - NULL,
: u% f. g- _+ N: O( L - "VBLOCK",
; g1 {5 L; b' f1 Y8 F - dblzOrigin,( o; S y& [/ W) s
- dblzCsysMatrix,
{) ?# j' a4 M" G# o* z - -1,9 s4 @& J3 C( j% p
- &tagInsVBlk,9 b. |7 M2 x+ d1 a5 E
- &ErrorStatus );* l6 `5 p# u. D
- /* 装入部件Cylinder.prt */! `" V' b/ T: ? a! D
- dblzOrigin[ 1 ] = 50;& Q" [: S9 S( W
- UF_ASSEM_add_part_to_assembly(7 b$ J- C! q x+ g8 C7 @2 x
- UF_PART_ask_display_part(),5 {/ E# `6 S s1 g a8 ~
- "f:\\ug\\chapter4_1\\Cylinder.prt",
- p; H8 b% {& p9 k' x/ S& C - NULL,
( \/ P9 l4 V. z( W - "CYLINDER"," y9 V I8 D" ~5 H: X
- dblzOrigin, \. c3 P. ~0 u/ @9 @# t/ }- ~/ T' H; M
- dblzCsysMatrix,
' D; S( r2 a! {- R! M - -1,
& ]! ]- c& j' f0 L - &tagInsCyl,4 d; u" c2 u6 `$ r* U/ x1 O# E! W
- &ErrorStatus );
$ Z+ a9 K/ q4 g - tagOccCyl = UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsCyl );3 W7 J. t, @2 w, S/ w5 C$ q
- tagOccVBlk= UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsVBlk );
# i1 g9 A1 G: L% W4 m/ r: `3 p! U - 7 ^8 q3 ~, v' W' x
- /* 创建配合关系 */" V* A( ^* }2 A. O; K
- UF_ASSEM_mating_condition_t McData;/ Q! g2 b* L) E3 t
- tag_t tagObjectFrom = NULL_TAG;% k8 X. P; u+ I
- tag_t tagObjectTo = NULL_TAG;
! U6 D- x" q; u1 P: R! ` - tag_t tagPrototypeFrom = NULL_TAG;: V Y& b; ]1 M
- tag_t tagPrototypeTo = NULL_TAG;- I$ ?/ i$ K3 Z! {" a' c
-
9 b, n( o+ `. L1 d' C - /* 初始化约束*/
* P q! T7 P* f9 W% ]8 n - UF_ASSEM_init_mc( &McData );
! s, j1 t: M# w7 P: e0 k - $ b* O+ p4 j6 w% D
- /* 定义约束,构造配合关系*/% Y7 S' `, y; {0 ^
- McData.mated_object = tagInsCyl;
, ]; s$ T4 ~! F5 \% s5 Q - 7 A; k5 h9 b1 `* P' B7 \& a ^
- McData.num_constraints = 3;1 p1 W; R! l" n ~. f$ x
- McData.name = NULL;; K+ n) v# {! F+ I
- McData.user_name = false;
: D/ u- c& S7 U% o7 Z - McData.override = false; ]( e6 t5 M: H5 @1 J8 B4 C4 u* T
- McData.suppressed = false;
4 U0 _' m& f- [. s+ u# v - McData.implicit = false;0 X+ L% H- _, i. V9 ^7 y
% E( _+ C6 `5 N9 R: m7 ]. `& A- tagObjectFrom = NULL_TAG;
8 R0 _$ z1 }( R# @* Z7 B+ {( j - tagObjectTo = NULL_TAG;' ?4 s; Z( b3 @1 e3 ^
- UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );
' I) t# A$ m- S; R - UF_OBJ_cycle_by_name( "P1", &tagObjectTo );
. C$ C, A ?7 v) K1 S2 }5 [6 _ - tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );4 o g* I- ]# C8 _6 d
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
) M8 {$ V( A% V% w - McData.constraints[ 0 ].from = tagPrototypeFrom;
& ^- b/ w& }1 G3 _' r; n - McData.constraints[ 0 ].from_part_occ = tagOccCyl;/ i( g' d1 N9 n& J- f3 Y
- McData.constraints[ 0 ].from_status = UF_ASSEM_ok;" @7 w7 ~/ D; q5 P! V
- McData.constraints[ 0 ].from_type = UF_ASSEM_cylindrical_face;
7 p4 X5 A; {9 ~# Y - McData.constraints[ 0 ].to = tagPrototypeTo;2 |2 v6 w2 W6 e5 T% K
- McData.constraints[ 0 ].to_part_occ = tagOccVBlk;
! |3 M) y* ^( Y- f7 I6 _1 g - McData.constraints[ 0 ].to_status = UF_ASSEM_ok;
+ N& D: G v c) j* o* s# v - McData.constraints[ 0 ].to_type = UF_ASSEM_planar_face;& o2 E$ i6 h; J+ k4 T: ]
- McData.constraints[ 0 ].mate_type = UF_ASSEM_tangent;
8 k8 W/ k0 {; Z9 O4 w* C ?; Q4 L - McData.constraints[ 0 ].offset = NULL_TAG;
* s7 n7 X6 o8 j5 l; T8 T0 S" Y - McData.constraints[ 0 ].name = NULL;1 t$ P- M: \: _. W
- McData.constraints[ 0 ].user_name = false;4 r( I) l9 C; {, I$ I
- McData.constraints[ 0 ].inherited = false;; y1 @" M' g. B. B! z7 k
- McData.constraints[ 0 ].suppressed = false;
# Q: A! J+ @/ u, m - McData.constraints[ 0 ].has_help_point = false;
% a. D+ z; l4 B; w3 g- L( m - UF_DISP_set_highlight( tagObjectFrom, 1 );) ^( S( o, q) x+ P
- UF_DISP_set_highlight( tagObjectTo, 1 );
- a0 F( ~- |) P3 l6 h+ N. f - uc1601( "这两个面进行相切操作", 1 );
7 W. s& w- \4 C$ g, `; T+ N& B - UF_DISP_set_highlight( tagObjectFrom, 0 );, S* t! C+ }! p' d/ d% ]: B
- UF_DISP_set_highlight( tagObjectTo, 0 );
, l9 V/ D) N% E" S9 G - * N. V6 v9 `7 z- h$ Z
- tagObjectFrom = NULL_TAG;
8 N o6 h: H3 C# p - tagObjectTo = NULL_TAG;& [7 o* m. o N( J1 N
- UF_OBJ_cycle_by_name( "CYL_FACE_3", &tagObjectFrom );$ G6 n q+ G! r2 L. u/ q' ?- B2 i
- UF_OBJ_cycle_by_name( "P2", &tagObjectTo );
! h5 w$ X, L( R) I! T - tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );/ _( l1 L& I( F" h" ~
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );4 r0 S p E' y* s/ p+ e# K+ K
- McData.constraints[ 1 ].from = tagPrototypeFrom;
2 A8 W0 H# f$ |) K+ I1 R5 | - McData.constraints[ 1 ].from_part_occ = tagOccCyl;1 J5 b ^% b: b" F) R6 Z
- McData.constraints[ 1 ].from_status = UF_ASSEM_ok;, n" r% T$ \: J6 l6 m" E
- McData.constraints[ 1 ].from_type = UF_ASSEM_cylindrical_face;
1 P$ T9 z" \; |4 G - McData.constraints[ 1 ].to = tagPrototypeTo;* B, S" h9 t% {6 F; `. J) b: o5 H
- McData.constraints[ 1 ].to_part_occ = tagOccVBlk;, @$ Z0 F f2 B
- McData.constraints[ 1 ].to_status = UF_ASSEM_ok;
- _9 d8 z" G1 ^" W6 q - McData.constraints[ 1 ].to_type = UF_ASSEM_planar_face;+ n- W; C' ?; o; ?5 b- y
- McData.constraints[ 1 ].mate_type = UF_ASSEM_tangent;
) y& X+ z+ i! k3 _) S - McData.constraints[ 1 ].offset = NULL_TAG;
7 H7 H( v/ \& ?2 f/ Q - McData.constraints[ 1 ].name = NULL;
; Z2 ^! T0 o: Z& G8 G6 a+ x1 ]! Z9 N - McData.constraints[ 1 ].user_name = false;2 X+ Y4 j Z# b, ?+ r: ^0 H
- McData.constraints[ 1 ].inherited = false;2 Y# s* u. h) R: k3 w4 n
- McData.constraints[ 1 ].suppressed = false;% `! @& I2 V$ M' V
- McData.constraints[ 1 ].has_help_point = false;
, M0 e5 b. @6 f$ [4 n- F. y3 _4 W - UF_DISP_set_highlight( tagObjectFrom, 1 );% r n H$ y) ]- A5 P7 q. m0 o3 `
- UF_DISP_set_highlight( tagObjectTo, 1 );; N$ g" o% q1 P7 D& @0 Q
- uc1601( "这两个面进行相切操作", 1 );
! [" L! E H" D0 Y - UF_DISP_set_highlight( tagObjectFrom, 0 );
0 V/ }5 y1 V5 c- ~% C - UF_DISP_set_highlight( tagObjectTo, 0 );7 Q& R, x4 P% i' K$ j0 }; v
/ p6 W6 `8 i, L& f' U& Y- tagObjectFrom = NULL_TAG;. d7 h. y' [1 j: x! G, {
- tagObjectTo = NULL_TAG;( t; k& b8 g! N4 T
- UF_OBJ_cycle_by_name( "CYL_FACE_1", &tagObjectFrom );; g+ b0 C" p3 f! x
- UF_OBJ_cycle_by_name( "P3", &tagObjectTo );, b9 _' a4 f8 s+ y3 y
- tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );% {/ a$ A# D R; p) @2 ?; ]4 ~, ~; c M
- tagPrototypeTo = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
( Z5 f9 f2 C& f* L - McData.constraints[ 2 ].from = tagPrototypeFrom;0 e1 k, F3 u5 Z! a5 Q
- McData.constraints[ 2 ].from_part_occ = tagOccCyl;
, i8 L7 l5 F6 A8 g - McData.constraints[ 2 ].from_status = UF_ASSEM_ok;
9 ~ W+ Q. o: [# H' e: v - McData.constraints[ 2 ].from_type = UF_ASSEM_planar_face; y! Z# w4 c0 r n5 \' z
- McData.constraints[ 2 ].to = tagPrototypeTo;
/ ?, y" e0 [) u3 W9 \7 q - McData.constraints[ 2 ].to_part_occ = tagOccVBlk;
+ G1 L. x9 V6 N9 W( { e - McData.constraints[ 2 ].to_status = UF_ASSEM_ok;: g' w8 n( @ y. \* p
- McData.constraints[ 2 ].to_type = UF_ASSEM_planar_face;) G- Z; P' z9 q# `6 R( C. j3 _; K: D
- McData.constraints[ 2 ].mate_type = UF_ASSEM_align;
8 B, t6 D* O$ d# }& [ - McData.constraints[ 2 ].offset = NULL_TAG;, l( P# V2 v6 a9 ` z
- McData.constraints[ 2 ].name = NULL;" g0 G1 I6 J9 O3 w- i. N
- McData.constraints[ 2 ].user_name = false;6 m0 j- Y5 U& a8 ~
- McData.constraints[ 2 ].inherited = false;6 `' }- c2 T9 n& j" ^. w* V6 i$ _
- McData.constraints[ 2 ].suppressed = false;
8 G' N7 X) f1 b$ r0 l. X - McData.constraints[ 2 ].has_help_point = false;+ `5 \) }7 i8 E3 o$ _' I. l
- UF_DISP_set_highlight( tagObjectFrom, 1 );1 S3 z7 Q( _+ X. Q" S p
- UF_DISP_set_highlight( tagObjectTo, 1 );& w |; q" l9 ]+ E8 F
- uc1601( "这两个面进行对齐操作", 1 );7 S6 ]- m* L( e; z$ K4 A' p# k0 b
- UF_DISP_set_highlight( tagObjectFrom, 0 );
6 R0 b! [ s, s C! {0 E - UF_DISP_set_highlight( tagObjectTo, 0 );
( \0 f2 h7 Q0 a+ v* L: _
# Z0 H" I1 D6 e/ k% g+ Z# G/ X- double dblzTransform[ 4 ][ 4 ]; U1 Q" U: r5 O! y$ \6 g
- UF_ASSEM_dof_t Dof;' K1 h+ [( l- K4 K0 L: S+ r6 E
- UF_ASSEM_mc_status_t Status;
" u8 U5 Y5 K. q - 7 i) n/ V( W' J8 D( K4 I8 `9 y" f; F
, k/ o' Z7 c; M6 q- /* 求解约束*/
]2 N ]4 i( Q3 x: g5 L - UF_CALL( UF_ASSEM_solve_mc( &McData, &Status, &Dof, dblzTransform ) );
* d% e5 ]) w# D; x2 b& M2 a - if ( UF_ASSEM_mc_solved == Status )* W6 T& v3 t0 f$ K( i F
- {
( w9 H# F: V) ~" C+ U l6 u5 ? - uc1601( "求解约束成功!", 1 );
, N4 W# g: G" o0 `% P9 D - UF_ASSEM_mc_structure_state_t StructStatus;
! K& q4 }+ {6 N$ ?% |+ v" N - , y) J4 U! o* v7 ]1 v3 P
- /* 将约束应用到装配体上*/
- ]+ [$ ^; Y& J! k& [$ ]) {3 m - UF_CALL( UF_ASSEM_apply_mc_data( &McData, &StructStatus, &Status ) );
2 z' H: O0 s" D - if ( UF_ASSEM_structure_ok == StructStatus )
' m, m1 y' K& X7 W, S/ c0 V! n - {
2 M( j: M* A! A' c5 Z; ? - uc1601( "应用装配成功!", 1 );
: E; a# ?- `2 Z7 A6 a* j -
+ D$ X( n% X; N3 w - /* 更新模型*/
# E4 c( p7 b& @+ ^) l9 c& S% w - UF_MODL_update();
, W. w* K) X D+ c - UF_DISP_refresh();
3 [/ V/ d0 _2 L! H/ c1 L, [7 m) V - }$ o1 g! v' @- g" d' v% Q
- else uc1601( "应用装配失败!", 1 );
; \9 e+ ]0 C; t2 I3 p8 q6 { - }1 X' i" o v |9 z7 G- ~8 l# G+ b
- else uc1601( "求解约束失败!", 1 );* C" F1 u% ]# j, Y" x
- }8 Q' |0 H2 {( c/ u& i
- }
3 ^; _1 _* |/ u) U- ?
复制代码 / \3 c5 Y, w* [6 U5 _0 T* k
. _' a6 |2 b, B! a0 P6 E* J( [
3 K7 s2 u! {, [9 F
" T3 v z. |! g. x9 j
3 I0 { {! U# }( V
! P8 {- k# M. }
" k. A, ?- V# T, }+ j' i2 o5 z
|
|