[c++] 带选择功能的ui styler dialog

[复制链接]
梅雷工具箱发表于 2015-6-25 14:47:22 | 显示全部楼层 |阅读模式


带选择功能的ui styler dialog

在ug中,自己制作的ui styler dialog有时候需要与ug 图形窗口交互来选择对象,
这是时候需要我们在制作dialog的时候,选择->类型单个->【√选择】  【√取消】 【√单个位置】


//头文件与参数定义
#include <uf_obj.h>
#include <uf_modl.h>
UF_STYLER_item_value_type_t sel_data;


一、 回调函数:

// Filter proc
static int filter_face_cb( tag_t object, int type[3], void *user_data, UF_UI_selection_p_t select)
{
return (UF_UI_SEL_ACCEPT);
}
//初始化
static int init_proc(UF_UI_selection_p_t select,void *user_data)
{
if((UF_UI_set_sel_procs(select, filter_face_cb,NULL,user_data)) == 0)
    {
        return (UF_UI_SEL_SUCCESS);
    }
    else
    {
        return (UF_UI_SEL_FAILURE);
    }
}

//selection 回调函数
static int sel_face_cb(int num_selected,   tag_p_t selected_objects,
        int  num_deselected, tag_p_t deselected_objects,
        void *user_data,     UF_UI_selection_p_t selection)
{
return (UF_UI_CB_CONTINUE_DIALOG);
}

二、在对话框【构造函数】中初始化,使得本对话框在ug中显示后能够在图形窗口交互选择对象

//获得对话框的selection对象
UF_UI_mask_t face_mask[1] = {UF_face_type, 0, 0};
sel_data.item_id = UF_STYLER_DIALOG_INDEX;
sel_data.item_attr = UF_STYLER_SELECTION;
UF_CALL(UF_STYLER_ask_value(dialog_id, &sel_data));
//设置selection 对象,选择类型,选择MASK类型,
UF_UI_set_sel_type(sel_data.value.selection, UF_UI_SEL_TYPE_SINGLE_SELECTION | UF_UI_SEL_TYPE_SINGLE_DESELECTION);
UF_CALL(UF_UI_set_sel_mask(sel_data.value.selection,//selection
                          UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,//all type in mask are allowed
                          1, //number of mask
                          face_mask));//mask types
UF_UI_set_sel_procs(sel_data.value.selection, filter_face_cb,  //Filter proc
                  sel_face_cb,  //selection proc
                  NULL); //user data


三、选择好后,获得所选择对象 【ok函数】
//得到所选对象的objs //得到选择对象的数量count
tag_p_t objs = NULL;
int count = 0;
UF_UI_ask_sel_object_list(sel_data.value.selection,&count,&objs);


char msg[64];
sprintf(msg, "%d",count); //数字转字符串
uc1601(msg,1);        //弹出框 显示 选择的对象数量

// 其它操作 ——————————————————————

// 分析面
int type=0;
int norm_dir=0;
double point[3];
double dir[3];
double box[6];
double radius[1];
double rad_data[1];
UF_MODL_ask_face_data (
objs[0], //输入面
&type,      //判断面类型
point,      //轴中心 点
dir,        //轴方向
box,        //极点坐标
radius,     //半径 圆锥=最小半径 + 最大半径 /2
rad_data,   //
&norm_dir); //面法向
//判断面类型 type值
//16 =圆柱
//17 =圆锥
//18 =球
//19 =旋转(环形)
//20 =挤压
//22 =有界平面
//23 =角(物)
//43 = b级表面
//65 =偏移曲面
//66 =外表面

sprintf(msg, "%d",type); //数字转字符串
uc1601(msg,1);            //弹出框 显示 选择的对象数量


UF_free(objs);

_____________________________________________________________________________ _

中磊UG二次开发教程 梅雷著 qq1821117007
学UG就上UG网 http://www.9sug.com/
就上UG网淘宝直营店
您需要登录后才可以回帖 登录 | 注册UG网 用百度帐号登录

本版积分规则