|
ui界面 带选择功能源代码
, v. S6 O: K; j3 p
5 X( W( n& u2 e; @梅雷制作QQ1821117007+ Y) [+ R) N' {5 O& d# s# n
: N# ^2 [6 [3 q
ug二次开发论坛( x3 ^: _: m! D* u& ]
http://www.gripshy.com/2 J s& D3 O+ X# ^0 K
# ] }% f; W! F2 x
带选择功能的ui styler dialog% N8 R8 H; M3 K3 V* ]& a
+ F. v* ^: c9 U% l9 a# U- R: b' Y
在UG中,自己制作的ui styler dialog有时候需要与ug 图形窗口交互来选择对象,3 M/ [5 n i* m4 k' C m0 |
这是时候需要我们在制作dialog的时候,选择->类型单个->【√选择】 【√取消】 【√单个位置】5 `1 T; X7 L" k7 H2 ~3 l; T$ t
! J3 |: r$ Z7 i1 a! G3 _9 G) J" ~, N! J0 Z- M
//头文件与参数定义) E- M+ K5 C3 J5 ?4 h: L
#include <uf_obj.h> ; R8 b! K- ~" {7 ~5 q
#include <uf_modl.h>
! |$ v1 P( ^ b" x. N9 C# qUF_STYLER_item_value_type_t sel_data;1 [7 P* k, }. B$ R7 W
) k( S- u% {- V! P$ f3 F/ |% ~
0 D# B1 v4 s1 {5 A" l* p+ i! F7 {一、 回调函数:
) o% I7 K9 p3 m F( O9 [( E- ]& _; {0 {3 p
// Filter proc6 T- S+ p+ K6 ^" }7 \& H6 w0 v/ r; C9 w
static int filter_face_cb( tag_t object, int type[3], void *user_data, UF_UI_selection_p_t select)
( h; E' \$ o g{& y7 A* J0 h/ Y8 l6 L
return (UF_UI_SEL_ACCEPT);+ K# U- l( u% c7 l) ?0 @5 o
}+ D& V1 @$ g4 Q6 H |+ b
//初始化% ?. }$ {) @6 g+ E+ y
static int init_proc(UF_UI_selection_p_t select,void *user_data): ?7 b2 v( z) S5 T' L' C
{
- A% o; ^; ^' ?& i* r if((UF_UI_set_sel_procs(select, filter_face_cb,NULL,user_data)) == 0)# g6 `) i, p5 j1 r( I" I9 o7 ~
{7 F, i0 t4 m- S" _ |- {
return (UF_UI_SEL_SUCCESS);
$ V% [2 r' E% X: | }5 y( p" n9 z% k. N5 G( g0 S9 r+ r
else+ ]' B! A% k/ x
{
; o5 s D9 w& c2 w5 ~0 N# J3 ` return (UF_UI_SEL_FAILURE);
" k: Y2 M5 E* N1 m }- A2 ]% A, X1 b& H! @
}! ^7 @* s9 o3 s) a# i9 x1 B8 ^7 L
1 ~# }9 ?) S% k% ^1 ^
//selection 回调函数) b. F, m3 i/ Z; u1 W3 Z
static int sel_face_cb(int num_selected, tag_p_t selected_objects,$ p- ^. u# I. P: H! o
int num_deselected, tag_p_t deselected_objects,) p u. Q; Z1 i3 c" u1 t
void *user_data, UF_UI_selection_p_t selection)1 |9 f) M, N$ {8 [( S- O' N
{
9 [6 B/ C; g2 V& S4 K) H4 t, {4 F return (UF_UI_CB_CONTINUE_DIALOG);
1 E7 t% _* M$ C3 T, m- ]8 z7 ?. b}: D6 z' h! w; Z7 ~$ B6 ^
5 E; H( w. f' d. K$ `) i- u. f; H
二、在对话框【构造函数】中初始化,使得本对话框在ug中显示后能够在图形窗口交互选择对象
) v: @" h& l* r0 [% K+ X6 J
7 z9 k6 S' p( ~4 V% Z$ J4 u4 C* j//获得对话框的selection对象
' N2 {5 {5 A- ~* `0 A! {: M1 wUF_UI_mask_t face_mask[1] = {UF_face_type, 0, 0};. S. f+ Q6 ^! y+ S( `9 V! _7 S; @- \
sel_data.item_id = UF_STYLER_DIALOG_INDEX;! P+ i/ Q% v3 _8 B. f7 D: W. U
sel_data.item_attr = UF_STYLER_SELECTION;
9 ` O" e8 s5 x6 x ?, XUF_CALL(UF_STYLER_ask_value(dialog_id, &sel_data));
8 W; g1 n0 B; c9 J//设置selection 对象,选择类型,选择MASK类型,
# `1 Z$ ^% |/ E5 ?$ EUF_UI_set_sel_type(sel_data.value.selection, UF_UI_SEL_TYPE_SINGLE_SELECTION | UF_UI_SEL_TYPE_SINGLE_DESELECTION);
$ g+ @/ l% O! E/ |7 s$ IUF_CALL(UF_UI_set_sel_mask(sel_data.value.selection,//selection
, B# [0 s& x, o$ F( o UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,//all type in mask are allowed
* [' u4 a" [" K5 c% z, O 1, //number of mask9 S; v5 w! A1 B) W( g: [
face_mask));//mask types
% S+ c) X) w& q+ VUF_UI_set_sel_procs(sel_data.value.selection, filter_face_cb, //Filter proc
1 D2 Q* O/ ~( L5 {" n sel_face_cb, //selection proc0 R2 x. j( _: ?! e* u' Y1 v
NULL); //user data
4 i4 ]3 f8 @. _4 g
( y1 A, O( M2 Z0 |5 L
: r9 }9 Q' b% o0 ^9 P三、选择好后,获得所选择对象 【ok函数】
6 c8 N! T6 c9 c, W //得到所选对象的objs //得到选择对象的数量count
; p! A6 s. {$ Y: n0 P) W! X tag_p_t objs = NULL;
* \; n5 p% L2 t5 R6 Q5 Z/ v. ] int count = 0;
) A! k" T/ Y0 Y+ o, v" ^ UF_UI_ask_sel_object_list(sel_data.value.selection,&count,&objs);
7 B: r) Z' Z% c- H1 X& v, ^0 ~3 i2 X5 F, V' q. ~" y: L, _
: x' e: E" f% kchar msg[64];
( Z5 U- P: W' \" ?9 d0 Fsprintf(msg, "%d",count); //数字转字符串 7 p3 C3 m# T3 B
uc1601(msg,1); //弹出框 显示 选择的对象数量
& }% U: c* h8 U! p! A/ t# \& W8 q/ i p, k7 X1 ]4 h
// 其它操作 ——————————————————————
5 }2 G. k9 z! G/ [9 A
* B7 v- y |' e// 分析面% ?* T. P( g8 w. O5 N1 m
int type=0;) B8 O/ N- |8 J* o
int norm_dir=0;0 F) ~$ ^4 M7 x1 f
double point[3];
# e. ~* F* y* C4 Zdouble dir[3];
+ r% y, ^- l5 Y( L7 w8 odouble box[6];- v* h, @9 L* F! a
double radius[1];/ t0 M; ?; ~, \7 e( V
double rad_data[1];
# a0 k2 S7 |8 F* FUF_MODL_ask_face_data (" K1 i& p$ l$ H1 ?
objs[0], //输入面
+ i) _: k, t" r/ o0 ~3 _&type, //判断面类型$ T$ k, u2 N2 l7 W
point, //轴中心 点5 Q0 G; q1 H+ B3 ?% ]% Z: B
dir, //轴方向1 A9 G0 d* L$ p* j% P3 z
box, //极点坐标- g1 U( u% M! ?( P' [
radius, //半径 圆锥=最小半径 + 最大半径 /22 V* H4 W; N9 J) ?
rad_data, //7 _8 n; d# ^- B0 p( W3 F% U
&norm_dir); //面法向- v) ` F2 Z+ w% `$ l2 V
//判断面类型 type值
* E* Q% U8 q ]: W1 g//16 =圆柱
/ V y) }! o- i# T//17 =圆锥7 u' {8 }/ D3 h2 R6 _" `
//18 =球
/ _3 L/ k! t6 d//19 =旋转(环形)
/ C* Q; W) w$ X2 V, @9 C; G//20 =挤压
5 f8 R3 |! J+ r//22 =有界平面; B. G1 r- T! x% G6 A: r
//23 =角(物)
9 D, w1 u. \) _2 Z# r3 F//43 = b级表面9 k4 Q# k% d) F
//65 =偏移曲面
& Q! R2 h- m# n//66 =外表面
1 T# P. V: g4 J, m+ [5 ~6 n
7 U* ~* d, ^- @* Q# [ sprintf(msg, "%d",type); //数字转字符串 ' s3 k! {" O5 ]4 b/ y6 k5 c- a
uc1601(msg,1); //弹出框 显示 选择的对象数量 {. X) m) y& E- ~. c! L
. _9 q2 G5 q. o# f% t( C K) k% q f1 [, U2 l5 U( [. X
UF_free(objs);% V) U0 [( `8 b6 U- Y( Y
3 \! f& R9 _0 i( Y& B5 C y9 I F# m' ^0 X" D! P
|
|