在NX(原Unigraphics)二次开发过程中,对象高亮显示是最基础的交互功能之一。当用户通过UFUN函数选中对象时,系统会自动为其添加高亮效果,这种视觉反馈对操作确认至关重要。但开发过程中常会遇到高亮残留问题——对象在逻辑上已被释放,但高亮效果依然存在,这不仅影响界面整洁,更可能干扰后续操作。
UF_PART_cleanup函数是NX Open API中专门用于清理状态的函数,其参数UF_PART_cleanup_highlight正是针对高亮状态的清理指令。这个函数调用实际上是在告诉NX内核:"请将当前会话中所有通过编程方式添加的高亮效果全部重置"。其底层原理是通过清除图形子系统中的高亮标记位(flag),使对象回归默认显示状态。
注意:该函数仅清除通过API添加的高亮,对用户手动选择产生的高亮无效。若需清除手动选择高亮,需配合UF_UI_deselect_all函数使用。
在NXOpen C++头文件中,该函数的完整定义为:
cpp复制extern UFUNEXPORT int UF_PART_cleanup(
UF_PART_cleanup_type_t cleanup_type
);
其中UF_PART_cleanup_type_t是枚举类型,包含多种清理选项:
UF_PART_cleanup_highlight:清除高亮(值为1)UF_PART_cleanup_all:清除所有临时状态(值为0)建议在以下三种情况下强制调用高亮清除:
cpp复制// 选择面后清除高亮
tag_t face_tag;
UF_UI_select_single("Select a face", NULL, &face_tag);
UF_PART_cleanup(UF_PART_cleanup_highlight); // 立即清理
cpp复制for(int i=0; i<obj_count; i++){
UF_DISP_set_highlight(obj_tags[i], 1); // 高亮对象
// 处理逻辑...
}
UF_PART_cleanup(UF_PART_cleanup_highlight); // 循环结束后统一清理
cpp复制try {
// 可能失败的操作
} catch(...) {
UF_PART_cleanup(UF_PART_cleanup_highlight); // 异常时确保清理
UF_UI_set_status("Operation failed");
}
NX的高亮状态实际是存储在图形上下文中的轻量级引用。长期不清理会导致:
建议采用RAII模式封装高亮操作:
cpp复制class Highlighter {
tag_t m_obj;
public:
Highlighter(tag_t obj) : m_obj(obj) {
UF_DISP_set_highlight(m_obj, 1);
}
~Highlighter() {
UF_DISP_set_highlight(m_obj, 0);
}
};
// 使用示例
{
Highlighter hl(selected_obj); // 自动高亮
// 操作代码...
} // 作用域结束自动取消高亮
当NX工作在多视图布局时(如四视图模式),高亮清除需要特别注意:
cpp复制// 获取所有工作视图
int view_count = 0;
UF_VIEW_t *views = NULL;
UF_UI_get_work_views(&view_count, &views);
// 在每个视图中执行清理
for(int i=0; i<view_count; i++) {
UF_VIEW_set_current(views[i]);
UF_PART_cleanup(UF_PART_cleanup_highlight);
}
UF_free(views); // 必须释放内存
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 部分高亮残留 | 对象被锁定 | 检查UF_OBJ_set_status(obj, UF_OBJ_NOT_LOCKED) |
| 全部高亮无效 | 函数调用过早 | 确保在UF_terminate()之前调用 |
| 随机性失效 | 多线程冲突 | 用UF_CALL(UF_PART_cleanup)包装调用 |
高亮常与选择集(Selection Set)协同工作:
cpp复制// 创建选择集
UF_UI_add_to_selection("MY_SET", object_tags, count);
// 高亮显示选择集
UF_UI_highlight_selection_set("MY_SET", 1);
// 操作完成后...
UF_UI_remove_selection_set("MY_SET");
UF_PART_cleanup(UF_PART_cleanup_highlight);
通过UF_DISP_set_color可实现彩色高亮:
cpp复制// 设置红色高亮
UF_DISP_set_highlight(obj, 1);
UF_DISP_set_color(obj, UF_DISP_RED);
// 清理时需要重置颜色
UF_DISP_set_color(obj, UF_DISP_DEFAULT_COLOR);
UF_PART_cleanup(UF_PART_cleanup_highlight);
在实际项目中,我习惯将高亮管理封装成独立模块。例如开发冲压模具系统时,对不同类型零件(凸模/凹模/压边圈)使用不同颜色高亮,并通过状态机管理高亮生命周期,这样即使面对数千个零件的复杂装配体,也能保持清晰的可视化交互。