//创建混合面
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
static int report_error( char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133],
msg[133];
sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
irc, line, file);
UF_get_fail_message(irc, err);
UF_print_syslog(msg, FALSE);
UF_print_syslog(err, FALSE);
UF_print_syslog("\n", FALSE);
UF_print_syslog(call, FALSE);
UF_print_syslog(";\n", FALSE);
if (!UF_UI_open_listing_window())
{
UF_UI_write_listing_window(msg);
UF_UI_write_listing_window(err);
UF_UI_write_listing_window("\n");
UF_UI_write_listing_window(call);
UF_UI_write_listing_window(";\n");
}
}
return(irc);
}
static int filter_body_type(tag_t object, int type[3], void *data,
UF_UI_selection_p_t select)
{
int
body_type;
UF_CALL(UF_MODL_ask_body_type(object, &body_type));
if (body_type == *(int *)data)
return (UF_UI_SEL_ACCEPT);
else
return (UF_UI_SEL_REJECT);
}
static int mask_body_type( UF_UI_selection_p_t select, void *type)
{
UF_UI_mask_t
mask = { UF_solid_type, 0, UF_UI_SEL_FEATURE_BODY };
if (!UF_CALL(UF_UI_set_sel_mask(select,
UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, 1, &mask)) &&
!UF_CALL(UF_UI_set_sel_procs(select, filter_body_type, NULL, type)))
return (UF_UI_SEL_SUCCESS);
else
return (UF_UI_SEL_FAILURE);
}
static tag_t select_a_sheet(char *prompt)
{
double
cp[3];
int
sheet = UF_MODL_SHEET_BODY,
resp;
tag_t
object,
view;
UF_CALL(UF_UI_select_with_single_dialog( "Select a sheet", prompt,
UF_UI_SEL_SCOPE_WORK_PART, mask_body_type, &sheet, &resp,
&object, cp, &view));
if (resp == UF_UI_OBJECT_SELECTED || resp == UF_UI_OBJECT_SELECTED_BY_NAME)
{
UF_CALL(UF_DISP_set_highlight(object, 0));
return object;
}
else return NULL_TAG;
}
static void do_it(void)
{
int
num_bodies_created = 0,
num_blend_faces = 0,
inx = 0;
tag_t
first_set = NULL_TAG,
second_set = NULL_TAG,
feature_tag = NULL_TAG,
*bodies_created = NULL,
*blend_faces = NULL;
UF_MODL_face_blend_create_data_t
create_data;
create_data.first_set = &first_set;
create_data.first_set_size = 1;
create_data.flip_first_normal = FALSE;
create_data.second_set = &second_set;
create_data.second_set_size = 1;
create_data.flip_second_normal = TRUE;
create_data.propagate = FALSE;
create_data.cliff_edges = NULL;
create_data.n_cliff_edges = 0;
create_data.thls = NULL;
create_data.n_thls = 0;
create_data.proj_on_first_set = FALSE;
create_data.end_overflow = TRUE;
create_data.blend_tolerance = "0.0004";
create_data.trim_option = UF_TRIM_AND_ATTACH;
create_data.radius_type = UF_CONSTANT;
create_data.default_radius = "1.0";
create_data.law_parameters = NULL;
if (((first_set = select_a_sheet("Select first set sheet")) != NULL_TAG)
&& ((second_set = select_a_sheet("Select second set sheet")) != NULL_TAG))
{
UF_CALL( UF_MODL_create_face_blend( &create_data, NULL,
&feature_tag, &num_bodies_created,
&bodies_created,
&num_blend_faces, &blend_faces ));
}
}
void ufusr(char *param, int *retcode, int paramLen)
{
if (UF_CALL(UF_initialize())) return;
do_it();
UF_terminate();
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}