1. UG/NX二次开发实战:实体尺寸自动测量工具实现
在机械设计领域,快速获取三维模型的外形尺寸是常见需求。作为NX二次开发工程师,我经常需要编写这类实用工具。今天分享一个通过UG/Open API实现的选择实体自动测量长宽高的完整解决方案,这个功能在零件库管理、工艺规划等场景特别实用。
这个工具的核心逻辑是:用户选择实体后,程序自动计算并返回该实体的最大外围尺寸(长、宽、高)。看似简单,但实现过程中有几个技术要点需要注意:选择过滤器的设置、边界框计算原理、用户交互设计等。下面我将从实现原理到代码细节逐步解析。
2. 核心实现原理与技术选型
2.1 边界框(Bounding Box)计算原理
在三维CAD中,边界框是指能够完全包围模型的最小长方体。NX内部使用OBB(Oriented Bounding Box)算法计算实体的精确包围盒。我们通过UF_MODL_ask_bounding_box函数获取的6个参数,分别代表Xmin、Ymin、Zmin和Xmax、Ymax、Zmax。
计算长宽高的公式为:
- 长度 = Xmax - Xmin
- 宽度 = Ymax - Ymin
- 高度 = Zmax - Zmin
注意:这里获取的是模型坐标系下的尺寸,如需获取世界坐标系尺寸,需要先进行坐标变换。
2.2 选择过滤器设计要点
选择过滤器是确保用户只能选择有效实体的关键。代码中使用了UF_UI_set_sel_mask函数设置过滤规则:
c复制UF_UI_mask_t mask_triples[] = {UF_solid_type, 0, 0};
这表示只允许选择实体类型(UF_solid_type),后两个0分别代表子类型和具体特征类型,设为0表示不限制。
实际开发中,根据需求可能需要扩展过滤条件,例如:
- 只选择特定图层的实体
- 排除隐藏的实体
- 只选择特定材质的零件
3. 完整代码实现与解析
3.1 选择过滤器实现
首先定义选择过滤器,这是确保用户选择有效实体的第一道关卡:
c复制static int UF_UI_sel_init(UF_UI_selection_p_t select, void *user_data)
{
UF_UI_mask_t mask_triples[] = {
UF_solid_type, 0, 0 // 只允许选择实体
};
if (UF_CALL(UF_UI_set_sel_mask(
select,
UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,
1,
mask_triples)) == 0)
{
return (UF_UI_SEL_SUCCESS);
}
else
{
return (UF_UI_SEL_FAILURE);
}
}
3.2 主程序逻辑实现
主函数完成实体选择和尺寸计算的核心流程:
c复制static void do_api()
{
tag_t object; // 选择的实体tag
char cue[] = "请选择一个实体"; // 选择提示
int scope = UF_UI_SEL_SCOPE_WORK_PART; // 选择范围:工作部件
double boundingbox[6]; // 存储边界框坐标
int response; // 用户响应
// 弹出选择对话框
UF_UI_select_with_single_dialog(
cue,
"实体选择",
scope,
UF_UI_sel_init,
NULL,
&response,
&object,
NULL,
NULL);
if (response == UF_UI_OK && object != NULL_TAG)
{
// 获取边界框
if (UF_MODL_ask_bounding_box(object, boundingbox) == 0)
{
// 计算尺寸
double length = boundingbox[3] - boundingbox[0];
double width = boundingbox[4] - boundingbox[1];
double height = boundingbox[5] - boundingbox[2];
// 显示结果
char msg[256];
sprintf(msg, "尺寸结果:\n长:%.2f\n宽:%.2f\n高:%.2f",
length, width, height);
UF_UI_message_box("尺寸测量", msg, UF_UI_MESSAGE_INFO);
}
}
}
4. 关键API函数详解
4.1 UF_UI_select_with_single_dialog
这是NX二次开发中最常用的选择函数,参数说明:
c复制UF_UI_select_with_single_dialog(
const char *cue, // 选择提示文字
const char *title, // 对话框标题
int scope, // 选择范围
UF_UI_selection_cb_t callback,// 选择过滤器回调
void *user_data, // 用户数据
int *response, // 用户响应(OK/Cancel)
tag_t *object, // 返回选择的对象tag
double cursor[3], // 光标位置(可NULL)
tag_t *view); // 视图tag(可NULL)
4.2 UF_MODL_ask_bounding_box
获取实体边界框的核心函数:
c复制int UF_MODL_ask_bounding_box(
tag_t object, // 实体tag
double box[6]); // 返回的边界框坐标[Xmin,Ymin,Zmin,Xmax,Ymax,Zmax]
5. 工程实践中的经验技巧
5.1 选择性能优化
当处理大型装配体时,选择操作可能变慢。可以通过以下方式优化:
- 限制选择范围:使用UF_UI_SEL_SCOPE_NO_CHANGE替代WORK_PART
- 预加载模型:在后台先加载简化表示
- 异步处理:将计算任务放到后台线程
5.2 异常处理增强
实际工程中需要增加健壮性处理:
c复制// 检查实体有效性
if (!UF_OBJ_is_valid(object)) {
UF_UI_message_box("错误", "选择的实体无效", UF_UI_MESSAGE_ERROR);
return;
}
// 检查边界框有效性
if (boundingbox[3] <= boundingbox[0] ||
boundingbox[4] <= boundingbox[1] ||
boundingbox[5] <= boundingbox[2])
{
UF_UI_message_box("警告", "无法计算有效尺寸", UF_UI_MESSAGE_WARNING);
}
5.3 单位系统处理
NX中尺寸的单位取决于当前文件的单位设置,如果需要统一输出单位,可以添加转换:
c复制// 获取当前部件单位
int unit;
UF_PART_ask_units(UF_PART_metric, &unit);
// 根据单位进行转换
if (unit == UF_PART_inches) {
length *= 25.4; // 英寸转毫米
width *= 25.4;
height *= 25.4;
}
6. 功能扩展思路
6.1 多实体批量测量
通过循环处理多个实体:
c复制// 创建对象数组
tag_t *objects;
int count;
// 使用多选对话框
UF_UI_select_objects("选择多个实体", &count, &objects);
for (int i = 0; i < count; i++) {
// 对每个实体计算尺寸
}
6.2 尺寸标注自动创建
计算尺寸后直接创建标注:
c复制// 创建长度标注
UF_DRAFT_create_linear_dim(
dim_origin, // 标注位置
start_point, // 起点
end_point, // 终点
&dim_tag); // 返回标注tag
6.3 结果导出到Excel
使用NX/Open API的Excel接口:
c复制// 创建Excel应用
UF_Excel_application_p_t excel_app;
UF_Excel_application_initialize(&excel_app);
// 写入尺寸数据
UF_Excel_cell_set_value(
excel_app,
sheet_id,
row,
col,
UF_Excel_value_type_double,
&length);
7. 常见问题排查
7.1 选择无响应问题
现象:选择对话框弹出后无法选择实体
排查步骤:
- 检查过滤器设置是否正确
- 确认选择范围(scope)是否合适
- 检查是否有其他NX交互操作冲突
7.2 尺寸计算异常
现象:返回的尺寸值明显错误
解决方案:
- 检查实体是否完整(可能有破损面)
- 验证坐标系是否正确
- 尝试使用UF_MODL_ask_mass_props_3d获取质量属性作为参考
7.3 内存泄漏问题
长期运行的插件需要注意:
c复制// 使用后释放对象
UF_free(objects);
// 关闭Excel连接
if (excel_app != NULL) {
UF_Excel_application_terminate(excel_app);
}
8. 完整项目集成建议
在实际项目中,建议将此功能封装为NX自定义命令:
- 创建菜单项注册文件(.men)
- 编写对话框资源文件(.dlg)
- 实现命令回调函数
- 打包为DLL或GRX文件
部署时注意:
- 不同NX版本可能需要重新编译
- 考虑添加许可证控制
- 提供用户手册和示例文件
这个工具虽然代码量不大,但涵盖了NX二次开发的核心技术点:用户交互、几何计算、异常处理等。我在多个实际项目中都使用过类似功能,特别是在自动化检测和报表生成场景下特别实用。
