UG NX 二次开发 插入UDF
注: 此例子源于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
浙公网安备 33010602011771号