|
#include <stdio.h> 5 d+ E- z2 ^( v
#include <uf.h>' m1 }1 _: k: F5 c. v" S- T) y
#include <uf_defs.h>* {2 q# q5 y( R5 x5 ?- { l X
#include <uf_exit.h>
0 t9 J! g( y" P% d. t& u) X#include <uf_ui.h>) Y4 h. G! }( i* |3 E: Z
#include <uf_styler.h>
$ O! F" a7 y$ f2 ?" h#include <uf_mb.h> : _% P. z: Z& c" y _ V
#include <C:\Documents and Settings\Administrator\My Documents\bsurface\新建文件夹\bsurface\bsurface.h>
5 W% ?" a' e9 G: ~& W) j; `
7 l. N1 A; O \. T#include <stdlib.h>//后加
& l2 H, o2 ?; k# v U8 N* S: w8 ` H9 m#include <uf_part.h>
. |$ T" d3 a+ L- ]1 J# H. H( o#include <uf_defs.h>+ u; e2 { e8 U% L- @8 S
#include <uf_modl.h>
/ H" _1 P' H3 h: a6 k: c- {& R2 X# w7 J3 o7 _
#define UF_CALL u" e0 I$ B4 m2 R. R
#define BSURFACE_CB_COUNT ( 4 + 1 ) /* Add 1 for the terminator */' L5 u, f& o7 o$ q. |
static UF_STYLER_callback_info_t BSURFACE_cbs[BSURFACE_CB_COUNT] =
! P: \7 a& S% t; [1 d) }# Q% g{
! S) B- B$ ?- v. |5 N8 L7 ^ {UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, BSURFACE_constructor_cb},5 v) {0 d7 h7 g L
{UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB , 0, BSURFACE_destructor_cb},
+ a. B" N2 u8 B9 n- b* N {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, BSURFACE_ok_cb},& ^( a) s+ v* S' f8 W
{UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0, BSURFACE_cancle_cb},
5 D& h! y' H7 ^2 f1 e* C4 M4 J {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
: c. H, H# d: _4 `};: @$ \& X! a8 {1 M9 }
+ s b4 [ h- d
static UF_MB_styler_actions_t actions[] = { H& M- t. ~, Q! u
{ "bsurface.dlg", NULL, BSURFACE_cbs, UF_MB_STYLER_IS_NOT_TOP },
/ a! ?' ?" [8 P3 B" ~ { NULL, NULL, NULL, 0 } /* This is a NULL terminated list */( u, P! q$ V- N! n1 n! H
};
7 J5 R/ s2 K K9 f$ @3 d
: W2 W; {) o& s4 K' |; d" Kstatic void do_ugopen_api(void)
7 e1 ?/ o9 z* g. V4 W( d{! X1 I" ` m$ R# b1 O c6 \
% g/ {5 w3 j: W$ s4 x6 k7 P
char *prtnam = "create_bsurf"; ; R/ I& _0 b; h+ @% t J
2 M2 a' e+ d, k9 U /* Points for B-surface */+ `- ~ S/ g6 i
double points[16][3] = { X1, Y1, Z1,4 ~" N! ^5 x. d. g
X2, Y2, Z2,
+ w/ N9 N; m( o* H" i! T X3, Y3, Z3,7 e& E; w' o J( V$ j0 p5 ^
X4, Y4, Z4,
% Y. f' ?1 x: N& C/ b; S8 Y X5, Y5, Z5,
* z: p5 [% B7 s+ \% M* C$ Z X6, Y6, Z6,
/ b* O+ n" E- k9 i X7, Y7, Z7,8 Q2 f- C+ B, Y! E& [! |" H4 i
X8, Y8, Z8,7 d; r) w4 \8 x, E1 J; |
X9, Y9, Z9,
- M, ` V1 b7 D1 | X10, Y10, Z10,9 \) c& i9 H; j( s) f
X11, Y11, Z11,1 q n) T C8 E) b& @2 ]7 w' o9 i% r1 T
X12, Y12, Z12,
+ T* M2 p. w1 _ X13, Y13, Z13,
& F3 E. K: R& H. h' [. R3 ^, ^5 p X14, Y14, Z14,% j6 r/ X2 i) |1 }4 Z! g
X15, Y15, Z15,9 U1 S4 [/ W* ~+ z D: H
X16, Y16, Z16 }; X8 T( Z% Q+ ?; R6 w7 ]8 @/ K
2 }0 Z) }" N; o2 \4 q$ R' w: g int create_mode = 1;, }- I; b; L d% h/ R8 u
int u_closed_status = 0;3 O! S. L i9 h7 [3 x
int v_closed_status = 0;
6 z! ]2 [4 Q1 t) W int u_degree = 3;
( r& |) j- ?+ r7 c/ s: g int v_degree = 3;. [9 N% U. K R3 S8 D6 U8 P. C
int num_rows = 4;
( O+ f$ V, V' v. X/ a4 t5 t int pts_per_row[4] = {4, 4, 4, 4};
5 n- Y" U5 F& w+ o8 q$ [8 r9 O. a' G" o' v 7 K$ {# H2 `& m( n
int ii, jj, kk, indx;
. e' e, R- d. u5 p ; l! J* `2 K' A B- `
tag_t part_tag;6 j" r; U. ^+ b# a
tag_t bsurf_obj_id = NULL_TAG;
* L8 ^9 Y# L* k% ]9 F# Q2 X% n2 X
[+ W: M" [% i: [, P UF_MODL_bsurf_row_info_t *pts_info_per_row; /* pts info for each row */
" q: \$ \/ l; W' R/ b UF_MODL_bsurface_t bsurf;
/ ^3 K! b/ ~1 ]: X) `% u) [
' [) ~! V9 B: l- r4 s
# R% n, ]; h" v8 K3 r /* Open a new part */& w% J V, u+ @. q
UF_CALL( UF_PART_new(prtnam, METRIC, &part_tag) );4 ?$ G! W$ s' ]& ^
/ V# q6 ^8 ]+ S( r# k# X4 Y
pts_info_per_row = ( UF_MODL_bsurf_row_info_t *)malloc( num_rows *+ I% B0 |. b& x
sizeof(UF_MODL_bsurf_row_info_t) );( m- _0 Z, {; [6 U
; n1 s. M* Q# q4 K. U, A0 }) e; a# Z
/* allocate and load point and other information for each row of points */: o$ w' o) K# J, s% c! W' R
indx = 0;4 m6 u5 Y' L/ R
for (ii=0; ii<num_rows; ii++)) s4 f. d$ q7 k7 Q4 M
{
& r5 \7 g6 d1 P0 e/ X' S( } pts_info_per_row[ii].num_points = pts_per_row[ii]; /* can vary */
' Q# E% T/ d' F: _% I pts_info_per_row[ii].points = (double *)malloc( pts_per_row[ii] * 3 *
% u0 W8 X2 \. m" ~3 P# B4 E2 d sizeof(double) );
& @! s3 w/ g! t. t. }/ @' C1 W6 V& e. U
$ r1 q- ^9 D5 u3 B' q! h pts_info_per_row[ii].weight = (double *)malloc( pts_per_row[ii] *
8 u) |. C6 x" p2 m! |5 p sizeof(double) );
" m7 [$ G& ^$ P' _; I) z# J; k
/ Q( n9 Y9 k) f0 s% N$ Q9 B( Y /* load up point and weight info */( ?0 z1 d( s/ \
for (jj=0, kk = 0; kk<pts_per_row[ii]; kk++, jj+=3, indx++) ~. B, M2 ?' f w2 C, F" x: J, f
{
+ ?* l$ V, Y, c' g9 W. Q& k pts_info_per_row[ii].points[jj] = points[indx][0];6 _3 G5 ?8 k8 F; N
pts_info_per_row[ii].points[jj+1] = points[indx][1];$ D& }; p2 _ N$ f) Y* B
pts_info_per_row[ii].points[jj+2] = points[indx][2];8 c; L+ X6 U8 O' i# w$ f. T
pts_info_per_row[ii].weight[kk] = 1.0;
3 P* C5 G6 i2 [7 G, h% ~5 w4 I . }! J% u3 o3 _ @9 u& f% \! z
}- ]0 U* q5 X0 M: q w
}
, P7 j2 o& G2 D5 X9 b0 c! b 2 x! S: R% \& k) v
/* create B-surface */( L, [0 B: e7 d2 I: X! o! ^" _
UF_CALL(UF_MODL_create_bsurf_thru_pts( create_mode, u_closed_status, $ f7 `# h4 _6 g* N2 @& p r
v_closed_status, u_degree,
% p) h0 s- K$ m' I) _ v_degree, num_rows, pts_info_per_row,5 ~- X! r5 Z" X/ b& H! J' y C1 c! g
&bsurf_obj_id));% ]' w5 j+ H) z% p# g+ H2 s
. N3 f0 D5 n0 g: Q. C. [
if ( bsurf_obj_id == NULL_TAG ), A* l6 w* n* `* L
printf("*** ERROR CREATING B-SURFACE ***\n");
$ J) E1 [) o8 U9 S1 J P- m: v# m6 P( F7 k
/* free allocated memory */
) e+ d' s$ B2 Q# ? for (ii=0; ii<num_rows; ii++)
3 B7 A8 _9 O2 \7 ~# a3 N' d4 ? {% Q6 B9 u/ g9 w6 w6 T- [ C( d
free(pts_info_per_row[ii].points);% d1 |8 b) B8 Z) J* s
free(pts_info_per_row[ii].weight);
, M% [# P2 D7 A& n# N' d1 ?; c }# c. p$ h+ b- P( |7 D2 I, t
" c+ V( D z' w/ S$ B4 o; r1 W free(pts_info_per_row);
, W9 i; ?4 E/ e ( x5 E- c/ q( q7 n. ~ U
- M0 K' R5 f$ c0 L5 v+ D* E
/* ask the B-surface information */7 q3 ]) t: H" p, i t' i0 h
UF_CALL(UF_MODL_ask_bsurf( bsurf_obj_id, &bsurf ));, F; ^/ @: Y9 I7 n3 P. U6 Y
; ^- ]* g1 M# ^% \4 H /* validate the surface *// a' O6 ?2 A, n& |
if ( (bsurf.order_u != u_degree+1) || (bsurf.order_v != v_degree+1) )& Y! k- V8 X& k$ a( m! v* f
printf("*** ERROR ASKING B-SURFACE ***\n");
' d' Q4 K& ?- I/ r
3 ~ d T* v. }! ]- m UF_CALL(UF_MODL_free_bsurf_data(&bsurf));; [2 S+ A$ E& q, p8 ] ?
& ~0 S, W! R) L( a" S9 h
, {% R& m, ^ [2 y7 P* M# H6 |& Q# h}
- r/ [' M* \$ j, s$ M! Fextern DllExport void ufsta (char *param, int *retcode, int rlen)5 Q% t0 O+ B! R2 {, h, {
{
* t! @. j2 p# q. i, k* s int error_code;& c2 q0 v$ Q' n& J5 I
8 H/ ~/ X/ n3 k2 ?% \' W4 p
if ( (UF_initialize()) != 0)
: [, D; S' P8 x$ R% t! `, u do_UGopen_api();
! O$ E; |. w! U7 W0 m return;) F/ k _# G P b2 C: e5 r
6 r* b) M4 j8 G4 H6 V7 ] if ( (error_code = UF_MB_add_styler_actions ( actions ) ) != 0 )
. K! G' q; ~4 E" A7 P; o7 N {5 ~- m$ u5 a- z% e( l# u4 {
char fail_message[133];# }6 T; t$ P! E0 A, I$ ~/ L
j) e# V' P5 k- k
UF_get_fail_message(error_code, fail_message);
$ w3 ?, G9 @6 ?# y0 T printf ( "%s\n", fail_message ); 0 w S$ j. |4 ~0 g. k% Z: ~5 D
}
, q1 L: s* ]3 L / Y& T" b! Q7 _+ P( R
UF_terminate(); ( Q9 l v" J! S; N- W0 ]
return;
- K- K# _+ z, j/ C}0 ~: o% U" v, y3 F
extern int LaunchBsurfaceDialog ( int *response )- |5 D9 x7 t4 K' j' @! V( c3 `5 {( a
{8 k4 x) z* O) p2 _6 a+ Y
int error_code = 0;
' x( r9 a y6 q
, Q. k1 f1 B$ m9 {8 E if ( ( error_code = UF_initialize() ) != 0 ) 4 E! K. ~3 u9 C0 l
return (0) ;
; r" R: h, C, E. N7 Y4 L- H1 a6 O! F$ F) u; [
if ( ( error_code = UF_STYLER_create_dialog ( "bsurface.dlg",% ^' } o+ n# p, k
BSURFACE_cbs, /* Callbacks from dialog */
7 s0 N O* e7 y+ \7 L BSURFACE_CB_COUNT, /* number of callbacks*/
/ r @$ _+ ] [ J8 z2 L4 K& t. Z8 V1 d. _ NULL, /* This is your client data */
( \' ^, r! Z" L R1 [( `# h response ) ) != 0 )
- [! t0 [$ ^$ E& N U/ v+ q {
& m- g) e3 Y% ~! ^0 R char fail_message[133];
6 Z: {) s1 \2 `! W& \
% Q; J; k, K4 ~2 L. E: | /* Get the user function fail message based on the fail code.*/; w: O: N/ l- y* j& t
UF_get_fail_message(error_code, fail_message);
: {! T7 K# G' t) t UF_UI_set_status (fail_message);
+ e( }: a* w2 U! _4 @. [ printf ( "%s\n", fail_message ); 1 H ?( k: V# G* g ?9 ^* o
}: z5 x2 y# V) D4 t
1 g$ s) \& D# M8 x) Z) O
2 m& o. \- N; p8 w( a4 |& u UF_terminate();
8 B9 P! M ~: m6 ~ return (error_code);2 O" G- M+ F) |2 T$ f5 u6 o
}
. E, U" e8 ~3 ~5 I7 I7 F/ l; o S7 V- m. V# b
extern int ufusr_ask_unload (void): J8 m! F6 E5 t2 K1 Y0 Y( S9 _
{( e q$ L! C( n- e# q
/* unload immediately after application exits*/
3 z7 Z' M9 P, a3 ^/ | b6 d. w return ( UF_UNLOAD_IMMEDIATELY );$ E/ _2 ^( i' H$ d
}( _: U% \- V: U) j6 `9 C
extern void ufusr_cleanup (void)( o+ t' C5 J u) O4 C$ u* b& c
{
* ` U; T- d0 b ?2 |5 u4 v2 ~. O return;! S" o9 u! e. F7 H
}
# L0 X5 r. `6 b#endif |
|