|
#include <stdio.h>
* L$ I6 U) I" m J3 D, k, _#include <uf.h>
$ H: L( W' S+ e& A. J. h6 b#include <uf_defs.h>2 a8 _: X% p. y* w1 p4 j1 n2 u
#include <uf_exit.h>
3 _7 ^9 E. ~9 U' |' w4 N6 x& x: O#include <uf_ui.h>. A5 L# k& Y( g/ g
#include <uf_styler.h>
! x$ b9 R8 ]- N: ~* n$ I: q8 H4 R#include <uf_mb.h>
! D1 `& G! m' b4 j; ]#include <C:\Documents and Settings\Administrator\My Documents\bsurface\新建文件夹\bsurface\bsurface.h>
k& `$ ~. Z" d0 F: C9 u5 d4 t' K6 ]7 Y/ i: \: k
#include <stdlib.h>//后加3 T& Y) L: L' m3 M5 t
#include <uf_part.h>0 Y! I8 V2 A6 B: k0 R. @+ V1 ^
#include <uf_defs.h>
* a2 p: ?4 ^1 V" q8 `#include <uf_modl.h>
! B3 X- i9 T: R N; {1 X+ J$ v5 L- X3 X' x
#define UF_CALL, `( }8 B3 G% G! y) s7 `0 T0 W
#define BSURFACE_CB_COUNT ( 4 + 1 ) /* Add 1 for the terminator */: ^* A, y6 H& ]
static UF_STYLER_callback_info_t BSURFACE_cbs[BSURFACE_CB_COUNT] = ' r. z7 i7 H/ f1 c
{0 \: j4 {3 J! x, M/ W3 p
{UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, BSURFACE_constructor_cb},0 k) N1 y$ H6 G
{UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB , 0, BSURFACE_destructor_cb},
& v z& c/ ~+ |. R& r5 ~, z% j {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, BSURFACE_ok_cb},
# u- r; ]* x, ~7 w {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0, BSURFACE_cancle_cb},
, W. N/ p" {# a2 K- O {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
& c1 H5 i$ {( ?) a" b};
% y* q7 d# r9 `+ M: r! W/ a( I% v! @" @" {
static UF_MB_styler_actions_t actions[] = {5 L( B8 v5 b% y, a
{ "bsurface.dlg", NULL, BSURFACE_cbs, UF_MB_STYLER_IS_NOT_TOP },4 B8 [0 ?; t/ \% Y8 [
{ NULL, NULL, NULL, 0 } /* This is a NULL terminated list */$ \" N( i+ K) h8 _7 c) o! e6 \
};
% E" ]7 ?$ k. e) W
4 w7 P }6 g+ G p+ Gstatic void do_ugopen_api(void)' i: p! Z3 j% F4 E X' P) {9 t
{
" J$ g/ O; X3 o9 J
) W( R2 J+ |: O1 U char *prtnam = "create_bsurf";
0 [0 H# _/ N2 l7 p/ P6 w& ?" `3 q: ?6 s/ e3 d& s# L, b3 T0 r
/* Points for B-surface */( `+ {* x, y8 I0 l* |
double points[16][3] = { X1, Y1, Z1,
% r$ \5 `0 z% D, _& Z1 v* K X2, Y2, Z2,
& [1 I- Z6 k$ V2 a X3, Y3, Z3,
& V( |, T0 o! m$ {, x9 h0 s- b X4, Y4, Z4,
- z1 d' }/ p! ? X5, Y5, Z5,
- B$ I: Q0 K& \0 ~ X6, Y6, Z6,
0 C3 r7 d9 N( J2 Z: w X7, Y7, Z7,8 r' C2 B) R) d# ]0 ^$ f
X8, Y8, Z8,
/ s( k/ k7 K( h& q* Q X9, Y9, Z9,
+ [. t9 M0 p; @- \/ w6 P X10, Y10, Z10,: ^/ A4 y0 j7 n% U7 j$ e
X11, Y11, Z11,9 L5 c0 I. l {4 {0 B$ ^
X12, Y12, Z12,
5 T0 }& Q0 @2 ^( ~ X13, Y13, Z13,
' P# j& S. C8 b1 l X14, Y14, Z14,3 v, O9 P6 V9 E8 }' t2 T
X15, Y15, Z15,
5 F/ P/ m5 c6 Q7 x6 |3 S6 u+ d* x X16, Y16, Z16 }; 5 \, a% P6 i: P
+ D# N+ [( |# M
int create_mode = 1;$ `& l: ]! ?8 |% y
int u_closed_status = 0;: [2 j) U4 @, h6 B
int v_closed_status = 0;
2 L E# U. r+ _# f: y; t int u_degree = 3;
! e9 s. l! v9 D3 J: _ int v_degree = 3;
' Y8 {5 u6 x3 g& e k# E6 m( U int num_rows = 4;
, O6 R+ q' O _% W& B6 D( j int pts_per_row[4] = {4, 4, 4, 4};
. A' a2 Z% y5 O( ?0 n' [
$ @3 f5 [/ `6 A4 f3 O9 @$ p int ii, jj, kk, indx;
9 Y( C7 Y7 `$ C( G& G ; | N( c2 a* q. k& e+ i' N! u+ S
tag_t part_tag;
0 K7 s3 C' g O- [! @8 n tag_t bsurf_obj_id = NULL_TAG;
( m5 q; _8 Q2 Y6 |$ v( h0 S" ^/ R: @
) I3 B: b5 C; o8 y2 i. r8 O3 S UF_MODL_bsurf_row_info_t *pts_info_per_row; /* pts info for each row */* Q |5 w. r. l8 l( Z1 t: }) }
UF_MODL_bsurface_t bsurf;& A/ q' k: o* z2 }& c, d! R0 d
, k' L! d! W. J. r+ h1 K) a
" D0 W7 O4 b. s6 B7 M0 k* D5 ~# |6 k8 _ /* Open a new part */
9 _ ?8 T1 F7 A- g' S( Q$ d UF_CALL( UF_PART_new(prtnam, METRIC, &part_tag) );
2 ~& V( w- w, a S D+ b$ X, U' P t! A; f" V& y; L
pts_info_per_row = ( UF_MODL_bsurf_row_info_t *)malloc( num_rows *2 i3 ?# E. A7 h( v4 ^
sizeof(UF_MODL_bsurf_row_info_t) );* M9 Y9 k. R" o( n" _4 F7 ?& q
( z5 l! n" i. }
/* allocate and load point and other information for each row of points */, H9 F; |) U8 q1 Z
indx = 0;
; o$ p8 k: t/ e7 y* J0 S9 m for (ii=0; ii<num_rows; ii++)# G7 F7 X a/ J1 W
{
% u! W. w, [# C: R# h! t pts_info_per_row[ii].num_points = pts_per_row[ii]; /* can vary */
8 A& w5 R9 L( \: S+ c+ j1 b: u3 f pts_info_per_row[ii].points = (double *)malloc( pts_per_row[ii] * 3 *
, h( A/ M7 x; P sizeof(double) );
! f; {2 {; @" W: ^/ l, S
' `; S' I9 e8 L3 {) P5 @/ U" b pts_info_per_row[ii].weight = (double *)malloc( pts_per_row[ii] * ) s% B9 Y( b, o; h
sizeof(double) );7 N$ q" [" O6 j8 o( r* u& ?
0 l) `* |, d- J& U2 X$ ?, o /* load up point and weight info */0 @) H! j7 P" j/ T9 ~: t$ x9 ~
for (jj=0, kk = 0; kk<pts_per_row[ii]; kk++, jj+=3, indx++)2 O0 s# T" y" D3 T( k
{5 ^6 W3 N1 Q" n: Z6 J$ t) F4 Z
pts_info_per_row[ii].points[jj] = points[indx][0];8 A3 X: \; s0 R. D# v0 c
pts_info_per_row[ii].points[jj+1] = points[indx][1];
2 a1 ^5 Y/ _4 o1 s9 N2 o7 Z4 B pts_info_per_row[ii].points[jj+2] = points[indx][2];( y- e0 E* N7 K. a
pts_info_per_row[ii].weight[kk] = 1.0;+ `# N, f5 c/ J: g$ Q
7 o0 T# t# A4 z }% s& U! \5 g5 m5 A' g
} n! J M: \8 t% R; }" V
+ U* w% Z; z4 j+ m8 C7 J: O /* create B-surface */
Y. r V' |- r: i, g- w- r UF_CALL(UF_MODL_create_bsurf_thru_pts( create_mode, u_closed_status, + {0 ? |" }/ A% i* L
v_closed_status, u_degree,
3 w, B% V5 P! X! n# K# o v_degree, num_rows, pts_info_per_row,
' `0 U- F! h5 c5 k# W2 c0 p &bsurf_obj_id));
) H; N! q: F1 H0 _% R' D* N" \: c
- h i- F0 p% y) u ^ if ( bsurf_obj_id == NULL_TAG )
* |% d) I% n$ E0 T, c printf("*** ERROR CREATING B-SURFACE ***\n"); [. K! j: x1 V: Y. [1 B
! A6 _) Q' a& }1 K. y
/* free allocated memory */
* U5 B2 l' V) Q# \ for (ii=0; ii<num_rows; ii++)
# U, }* A2 b. D, q6 A8 H+ `* X; [3 r, X {
1 N5 N7 Q5 h5 b) B( @2 a+ D free(pts_info_per_row[ii].points);1 Q# T: N+ D, l( W- O" H
free(pts_info_per_row[ii].weight);' G2 T* |3 B' c3 T) d8 k; b/ O
}9 o8 v D8 ?+ z; @. L V* E3 t* J
6 E/ H) x# W+ ]" l/ p1 ]% F free(pts_info_per_row);
, }. \* r+ h# p1 i; e5 F' S! w+ L + R( p, u# x% U% q5 `. G
- {4 S D4 A) M' v: J3 {/ K. Q /* ask the B-surface information */
( x( n6 N$ ]/ C B) M: { UF_CALL(UF_MODL_ask_bsurf( bsurf_obj_id, &bsurf ));/ h) ^6 ~( h* Z6 q
- b. A: s, k% v& N# ]: Y2 l7 s /* validate the surface */$ r4 w5 A) r% ^0 o
if ( (bsurf.order_u != u_degree+1) || (bsurf.order_v != v_degree+1) )
/ H2 ^7 [# P2 _# g$ p7 X printf("*** ERROR ASKING B-SURFACE ***\n");
' D# T" w4 I% I9 L' V% T' g
: S% k+ c2 R, O7 Q' ?4 M UF_CALL(UF_MODL_free_bsurf_data(&bsurf));
( n# i4 q6 I7 Q1 ]0 e R% D' b
9 s" Y& G7 Z8 m: {! A7 |* h% `: L. a) h+ n0 A# B# t$ X# G
}
5 @; l3 l6 R& U% ^extern DllExport void ufsta (char *param, int *retcode, int rlen)- h5 L6 q6 {8 r. f H/ O# D- \* a
{) E; G) r. D- V4 j3 ]- r" g
int error_code;
0 c, h6 G2 i# O 1 {+ @# d- [# i5 F8 c- K# C' X
if ( (UF_initialize()) != 0) : \* S/ y% E. r) L. k! Y6 P/ \
do_UGopen_api(); ) {' N/ R( t( a7 R9 G5 j
return;% a1 f/ \; p4 ]; u1 ?
7 B( g* n* |- b! h if ( (error_code = UF_MB_add_styler_actions ( actions ) ) != 0 )8 D- l/ v8 U9 u4 ]% W2 U+ Y3 v
{
% T/ }$ H2 _6 V3 U+ ^ P char fail_message[133];
& H9 X" ~& `; O5 D8 T5 i, L
- J3 d7 ?8 N: o0 N4 Q UF_get_fail_message(error_code, fail_message);
2 T b+ M0 p! L printf ( "%s\n", fail_message ); - v; J! F! O6 P5 U# _0 V
}$ s/ h# }2 C' U4 d+ m
" F" t6 B3 O, @, r UF_terminate(); ! b2 ~8 Z5 f8 L9 k% L4 q5 l/ O
return;
9 g# h6 r' {$ _) v4 V$ u3 x" X}
; a' u; t! ]! B. Z# ]; uextern int LaunchBsurfaceDialog ( int *response )5 k0 v9 L9 e6 ^1 [# C
{4 }) y/ J' N5 z
int error_code = 0;2 s+ Y! f! z5 |# G" Z
# e' y, s+ d f6 b9 X& `$ c if ( ( error_code = UF_initialize() ) != 0 )
) S/ }, L# a! |- `* ?- K return (0) ;
s8 L2 `( F1 `) {, O- Y
: x! x3 n1 X( S% f if ( ( error_code = UF_STYLER_create_dialog ( "bsurface.dlg",5 w2 g( l1 T! V* W
BSURFACE_cbs, /* Callbacks from dialog */
3 l; p# h k6 J' T6 z& R0 g! m BSURFACE_CB_COUNT, /* number of callbacks*/6 n% O# v% x/ [2 t2 _$ }2 _
NULL, /* This is your client data */% V$ B' D* O. N- J
response ) ) != 0 )* k8 v0 }% m: M: {" h
{ r: ~/ |5 w% F0 w
char fail_message[133];
2 Y% f. f* R* Z. ?$ |5 J0 j7 b6 Q& N. p- e" p A0 g, j
/* Get the user function fail message based on the fail code.*/
* {4 E& ^9 X# D! ] UF_get_fail_message(error_code, fail_message);
) _# C9 @- _1 q. h- x UF_UI_set_status (fail_message);
7 k9 w' \$ y9 K# D% ^6 I. T printf ( "%s\n", fail_message );
+ r7 a, m% t I! e7 G- Y }
1 I' O& u( q: ^3 q- k! ]4 f! `+ L" g# m% I6 F; {. E b
, p3 j: |- i' C5 k9 C: w6 I UF_terminate(); ! l o! P m6 w' y; M
return (error_code);
6 Y5 P) @$ H% Y% Q! p7 R! O}
2 w- O; b3 H' O8 P6 X2 U+ Z T- r1 Y& ^$ \3 v8 K- U1 [9 M' a
extern int ufusr_ask_unload (void)
: t% V- @6 x& P* _. l{$ t" _1 J. H% M7 d
/* unload immediately after application exits*/) ]& [+ n) Z- L5 m. Z2 _
return ( UF_UNLOAD_IMMEDIATELY );
/ m5 F! X; g+ l3 z, b3 `; F}; o' V! G1 c8 \+ w$ e7 g
extern void ufusr_cleanup (void)$ D7 i! r" ]9 ^9 T \* C, P
{) d# A& u! ~# m3 ^& p4 g
return;
0 Q9 V0 F' d% V1 n2 Q. P1 T( Z: G}1 Z* U; @: W+ a* K. i
#endif |
|