一、概述
最近学习NX二次开发,看到NX打开装配模型或者加载模型时会显示进度条的问题,个人觉得很有意思,然后参考阿飞2018中的文章进行学习。
二、代码解析
//User Defined Header File
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_view.h>
#include <atlstr.h>
//User Defined code
UF_initialize();
//加载
char *library_name = "D:\\ug\\NXBIN\\libdisp.dll";
//调内部函数 创建进度条
typedef void(*create_progress_bar)(int v1, bool v2, long *v3);//定义传参
create_progress_bar MT_create_progress_bar = NULL;
UF_load_library(library_name, "?MT_create_progress_bar@@YA_NH_NPEAJ@Z", (UF_load_f_p_t *)&MT_create_progress_bar);
//调内部函数 设置进度条的当前位置
typedef void(*set_progress_pos)(long *v1, int v2);//定义传参
set_progress_pos MT_set_progress_pos = NULL;
UF_load_library(library_name, "?MT_set_progress_pos@@YAXPEAJH@Z", (UF_load_f_p_t *)&MT_set_progress_pos);
//调内部函数 显示进度条
typedef void(*show_progress_bar)(long *v1);//定义传参
show_progress_bar MT_show_progress_bar = NULL;
UF_load_library(library_name, "?MT_show_progress_bar@@YAXPEAJ@Z", (UF_load_f_p_t *)&MT_show_progress_bar);
//调内部函数 设置进度条的起始值和终止值
typedef void(*set_progress_range)(long *v1, int v2, int v3);//定义传参
set_progress_range MT_set_progress_range = NULL;
UF_load_library(library_name, "?MT_set_progress_range@@YAXPEAJHH@Z", (UF_load_f_p_t *)&MT_set_progress_range);
//调内部函数 获得提示环境句柄(输出long*指针)
typedef __int64(*ask_progress_cue_context)(void);//定义传参
ask_progress_cue_context MT_ask_progress_cue_context = NULL;
UF_load_library(library_name, "?MT_ask_progress_cue_context@@YAHXZ", (UF_load_f_p_t *)&MT_ask_progress_cue_context);
//调内部函数 删除进度条
typedef __int64(*delete_progress_bar)(long *v1);//定义传参
delete_progress_bar MT_delete_progress_bar = NULL;
UF_load_library(library_name, "?MT_delete_progress_bar@@YAXPEAJ@Z", (UF_load_f_p_t *)&MT_delete_progress_bar);
//调内部函数 进度条显示文本
typedef __int64(*set_progress_text)(long *v1, char *v2, bool v3);//定义传参
set_progress_text MT_set_progress_text = NULL;
UF_load_library(library_name, "?MT_set_progress_text@@YAXPEAJPEAD_N@Z", (UF_load_f_p_t *)&MT_set_progress_text);
if (MT_ask_progress_cue_context == NULL || MT_create_progress_bar == NULL || MT_show_progress_bar == NULL
|| MT_set_progress_text == NULL || MT_set_progress_range == NULL || MT_set_progress_pos == NULL
|| MT_delete_progress_bar == NULL)
{
uc1601("温馨提示:请仔细检查,存在错误", 1);
return;
}
//获得提示环境句柄(输出long*指针)
__int64 cc = MT_ask_progress_cue_context();
//创建进度条
long aa = 0;
MT_create_progress_bar(cc, true, &aa);//true和false控制是否显示百分比数字
//显示进度条
MT_show_progress_bar(&aa);
//进度条显示文本
MT_set_progress_text(&aa, "Loading progress prompt", true);//此处用中文不显示
//设置进度条的起始值和终止值
int num = 100;
MT_set_progress_range(&aa, 0, num);
for (int i = 0; i < num; i++)
{
//在NX状态区显示一行文本
UF_UI_set_status("白雪公主的后妈");
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { i * 150, 0.0, 0.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag);
//设置进度条的当前位置
MT_set_progress_pos(&aa, i);
}
//删除进度条
MT_delete_progress_bar(&aa);
//获得工作视图的tag
tag_t work_view = NULL_TAG;
UF_VIEW_ask_work_view(&work_view);
//适合窗口
UF_VIEW_fit_view(work_view, 1.0);
//在NX状态区显示一行文本
UF_UI_set_status("白雪公主的后妈提示:创建完成");
//卸载
UF_unload_library(library_name);
UF_terminate();
三、效果展示