- 积分
- 10
- 注册时间
- 2007-10-5
- 仿真币
-
- 最后登录
- 1970-1-1
|
#include <stdio.h>
#include <string.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <uf_wave.h>
#include <uf_so.h>
#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);
/* NOTE: UF_print_syslog is new in V18 */
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);
}
/*ARGSUSED*/
static int mask_for_solid_bodies( UF_UI_selection_p_t select, void *type)
{
UF_UI_mask_t
mask = { UF_solid_type, 0, UF_UI_SEL_FEATURE_SOLID_BODY };
if (!UF_CALL(UF_UI_set_sel_mask(select,
UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, 1, &mask)))
return (UF_UI_SEL_SUCCESS);
else
return (UF_UI_SEL_FAILURE);
}
static tag_t select_a_solid(char *prompt)
{
double
cp[3];
int
resp;
tag_t
object,
view;
UF_CALL(UF_UI_select_with_single_dialog( "Select a solid", prompt,
UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY, mask_for_solid_bodies, NULL, &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 uf_list_p_t make_a_list(int count, tag_t *item_array)
{
int
ii;
uf_list_p_t
list;
UF_CALL(UF_MODL_create_list(&list));
for (ii = 0; ii < count; ii++)
UF_CALL(UF_MODL_put_list_item(list, item_array[ii]));
return (list);
}
static tag_t ask_part_occ_of_prom_occ(tag_t prom_object)
{
tag_t
owning_part,
part_occ = prom_object,
proto;
proto = UF_ASSEM_ask_prototype_of_occ(prom_object);
UF_CALL(UF_OBJ_ask_owning_part(proto, &owning_part));
while (!UF_CALL(UF_ASSEM_ask_parent_component(part_occ, &part_occ))
&& (UF_ASSEM_ask_prototype_of_occ(part_occ) != owning_part));
return part_occ;
}
static tag_t create_dumb_body_copy(tag_t body)
{
tag_t
feat,
part_occ,
proto,
xform,
dumb_body;
uf_list_p_t
list;
if (UF_ASSEM_is_occurrence(body))
proto = UF_ASSEM_ask_prototype_of_occ(body);
else
proto = body;
if (UF_OBJ_is_object_a_promotion(proto))
part_occ = ask_part_occ_of_prom_occ(body);
else
part_occ = UF_ASSEM_ask_part_occurrence(body);
if (part_occ == NULL_TAG)
UF_CALL(UF_WAVE_create_linked_body(proto,NULL_TAG,body,FALSE,&feat));
else
{
UF_CALL(UF_SO_create_xform_assy_ctxt(body, part_occ, NULL_TAG, &xform));
UF_CALL(UF_WAVE_create_linked_body(proto, xform, body, FALSE, &feat));
}
UF_CALL(UF_MODL_ask_feat_body(feat, &dumb_body));
if (dumb_body != NULL_TAG)
{
list = make_a_list(1, &dumb_body);
UF_CALL(UF_MODL_delete_object_parms(list));
UF_CALL(UF_MODL_delete_list(&list));
}
return dumb_body;
}
static void do_it(void)
{
int
flag,
n_results;
tag_t
body1,
body2,
*results;
uf_list_p_t
list;
while (((body1 = select_a_solid("Select Body 1")) != NULL_TAG) &&
((body2 = select_a_solid("Select Body 2")) != NULL_TAG))
{
UF_CALL(UF_MODL_check_interference(body1, 1, &body2, &flag));
if (flag == 1)
{
body1 = create_dumb_body_copy(body1);
body2 = create_dumb_body_copy(body2);
UF_CALL(UF_MODL_intersect_bodies(body1, body2, &n_results,
&results));
if (n_results > 0)
{
list = make_a_list(n_results, results);
UF_CALL(UF_MODL_delete_object_parms(list));
UF_CALL(UF_MODL_delete_list(&list));
UF_free(results);
}
}
}
}
/*ARGSUSED*/
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);
} |
|