注: 此例子源于UGOpen帮助文档
#include <stdio.h>
#include <string.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_object_types.h>
#include <uf_part.h>
#include <uf_modl.h>
#include <uf_disp.h>
#include <uf_obj.h>
#include <uf_assem.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], messg[300], *msg = messg; int response = 0; UF_get_fail_message(irc, err); sprintf(messg, "\n%s\nerror %d at line %d in %s\n%s", err, irc, line, file, call); /* Display the error Dialog if allowed */ if( UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM ) == UF_UI_LOCK_SET ) { UF_UI_message_dialog( "", UF_UI_MESSAGE_ERROR, &msg, 1, TRUE, NULL, &response ); UF_UI_unlock_ug_access(UF_UI_FROM_CUSTOM); } /* Write the error to Syslog, always. */ UF_print_syslog( messg, FALSE ); UF_print_syslog( "\n", FALSE ); } return irc; } static void report_load_status(UF_PART_load_status_t *status) { char msg[133]; int ii; for (ii=0; ii<status->n_parts; ii++) { UF_get_fail_message(status->statuses[ii], msg); printf(" %s - %s\n", status->file_names[ii], msg); } if (status->n_parts > 0) { UF_free(status->statuses); UF_free_string_array(status->n_parts, status->file_names); } } static int mask_for_planar_face(UF_UI_selection_p_t select, void *type) { UF_UI_mask_t mask = { UF_solid_type, 0, UF_UI_SEL_FEATURE_PLANAR_FACE }; 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_planar_face(char *prompt) { int resp; double cp[3]; tag_t object, view; UF_CALL(UF_UI_select_with_single_dialog(prompt, "", UF_UI_SEL_SCOPE_WORK_PART, mask_for_planar_face, 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, FALSE)); return object; } return NULL_TAG; } static void do_it(void) { int error, ii, num_parents, num_expression; tag_t *expression = NULL, feature = NULL_TAG, *new_parents = NULL, new_udf_feature, *parents = NULL, part, prev_work_part; char *exp_rhs[2] = {"2", "3"}, **expression_prompt = NULL, **parents_prompt = NULL, **new_exp_rhs; UF_PART_load_status_t error_status; UF_CALL(UF_PART_open_quiet("boss.prt", &part, &error_status)); if (error_status.failed == TRUE) report_load_status(&error_status); UF_CALL(UF_ASSEM_set_work_part_quietly(part, &prev_work_part)); UF_CALL(UF_OBJ_cycle_by_name("Boss", &feature)); UF_CALL(UF_MODL_ask_udf_definition(feature, &parents, &parents_prompt, &num_parents, &expression, &expression_prompt, &num_expression)); /* This array will be free'd by the UF_MODL_create_instantiated_udf() so it must be allocated this way - See PR 4074614 */ new_exp_rhs = (char ** )(UF_allocate_memory(sizeof(char *) * num_expression, &error)); for (ii = 0; ii < num_expression; ii++) { new_exp_rhs[ii] = (char *)(UF_allocate_memory(sizeof(char) * 10, &error)); strcpy(new_exp_rhs[ii], exp_rhs[ii]); } UF_CALL(UF_ASSEM_set_work_part_quietly(prev_work_part, &prev_work_part)); new_parents = (tag_t *)(UF_allocate_memory(sizeof(tag_t) * num_parents, &error)); for (ii = 0; ii < num_parents; ii++) new_parents[ii] = select_planar_face(parents_prompt[ii]); UF_CALL(UF_MODL_register_rpo_routine(UF_MODL_default_rpo_menu)); UF_CALL(UF_MODL_create_instantiated_udf(feature, "boss.cgm", parents, new_parents, num_parents, expression, new_exp_rhs, num_expression, &new_udf_feature)); UF_free(parents); UF_free(new_parents); UF_free_string_array(num_parents, parents_prompt) ; UF_free(expression); UF_free_string_array(num_expression, expression_prompt); } 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); }
专注MCAD开发
QQ: prodevelop@qq.com
www.mcadex.com