关于NX内部进度条的使用,不少博客已经详细介绍了方法,我在这里分享一下我的封装
ProgressBar.h
//ProgressBar.h
#pragma once
#include <string>
using std::string;
//创建进度条
typedef void(*create_progress_bar)(int v1, bool v2, long *v3);
//设置进度条的当前位置
typedef void(*set_progress_pos)(long *v1, int v2);
//显示进度条
typedef void(*show_progress_bar)(long *v1);
//设置进度条的起始值和终止值
typedef void(*set_progress_range)(long *v1, int v2, int v3);
//获得提示环境句柄(输出long*指针)
typedef __int64(*ask_progress_cue_context)(void);
//删除进度条
typedef __int64(*delete_progress_bar)(long *v1);
//进度条显示文本
typedef __int64(*set_progress_text)(long *v1, char *v2, bool v3);
class ProgressBar
{
public:
static ProgressBar * GetInstance();
~ProgressBar();
create_progress_bar MT_create_progress_bar;
set_progress_pos MT_set_progress_pos;
show_progress_bar MT_show_progress_bar;
set_progress_range MT_set_progress_range;
ask_progress_cue_context MT_ask_progress_cue_context;
delete_progress_bar MT_delete_progress_bar;
set_progress_text MT_set_progress_text;
bool Init(string title = "进度条");
void SetTitle(string titile);
void SetMax(int maxVal);
void Destory();
void SetProgress(int val);
private:
static ProgressBar * m_instance;
ProgressBar();
string m_libFile = "";
__int64 m_envHandle = 0;
long m_handle = 0;
bool m_isValid = false;
int m_max = 100;
string m_infStr= "";
string m_title = "";
};
cpp 文件
//ProgressBar.cpp
#include "ProgressBar.h"
#include <uf.h>
#include <vector>
#include <string>
#include <uf_ui.h>
#include <NXOpen/NXString.hxx>
using NXOpen::NXString;
using std::vector;
ProgressBar * ProgressBar::m_instance = NULL;
ProgressBar * ProgressBar::GetInstance()
{
if (NULL == m_instance)
{
m_instance = new ProgressBar();
}
return m_instance;
}
ProgressBar::ProgressBar() :
m_envHandle(0),
m_handle(0),
m_isValid(false),
m_libFile(""),
m_max(0),
MT_create_progress_bar(NULL),
MT_set_progress_pos(NULL),
MT_show_progress_bar(NULL),
MT_set_progress_range(NULL),
MT_ask_progress_cue_context(NULL),
MT_delete_progress_bar(NULL),
MT_set_progress_text(NULL)
{
}
ProgressBar::~ProgressBar()
{
//Destory();
}
bool ProgressBar::Init(string title)
{
m_isValid = false;
char *rootDir;
UF_translate_variable("UGII_BASE_DIR", &rootDir);
m_libFile = rootDir + (string)"\\UGII\\libdisp.dll";
int isNotExist = 1;
UF_CFI_ask_file_exist(m_libFile.c_str(), &isNotExist);
if (isNotExist)
{
char* binDir;
UF_translate_variable("UGII_BASE_DIR", &binDir);
m_libFile = binDir + (string)"\\NXBIN\\libdisp.dll";
}
UF_CFI_ask_file_exist(m_libFile.c_str(), &isNotExist);
if (isNotExist)
{
return m_isValid;
}
m_max = 0;
m_envHandle = 0;
m_handle = 0;
UF_load_library((char*)m_libFile.c_str(), "?MT_create_progress_bar@@YA_NH_NPEAJ@Z", (UF_load_f_p_t *)&MT_create_progress_bar);
UF_load_library((char*)m_libFile.c_str(), "?MT_set_progress_pos@@YAXPEAJH@Z", (UF_load_f_p_t *)&MT_set_progress_pos);
UF_load_library((char*)m_libFile.c_str(), "?MT_show_progress_bar@@YAXPEAJ@Z", (UF_load_f_p_t *)&MT_show_progress_bar);
UF_load_library((char*)m_libFile.c_str(), "?MT_set_progress_range@@YAXPEAJHH@Z", (UF_load_f_p_t *)&MT_set_progress_range);
UF_load_library((char*)m_libFile.c_str(), "?MT_ask_progress_cue_context@@YAHXZ", (UF_load_f_p_t *)&MT_ask_progress_cue_context);
UF_load_library((char*)m_libFile.c_str(), "?MT_delete_progress_bar@@YAXPEAJ@Z", (UF_load_f_p_t *)&MT_delete_progress_bar);
UF_load_library((char*)m_libFile.c_str(), "?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);
m_isValid = false;
return m_isValid;
}
m_envHandle = MT_ask_progress_cue_context();
MT_create_progress_bar(m_envHandle, true, &m_handle);
MT_show_progress_bar(&m_handle);
if (NULL != m_handle)
{
SetTitle(title);
}
m_isValid = NULL != m_handle;
return m_isValid;
}
void ProgressBar::SetTitle(string titile)
{
if (!titile.empty())
{
m_title = titile;
NXString ntitle(titile);
MT_set_progress_text(&m_handle, (char*)ntitle.GetUTF8Text(), true);
}
}
void ProgressBar::SetMax(int maxVal)
{
if (maxVal > 0)
{
m_max = maxVal;
MT_set_progress_range(&m_handle, 0, maxVal);
}
}
void ProgressBar::Destory()
{
if (m_handle > 0)
{
MT_delete_progress_bar(&m_handle);
m_handle = 0;
uc1601(" ", 0);
}
}
void ProgressBar::SetProgress(int val)
{
if (val >= 0 && val <= m_max)
{
MT_set_progress_pos(&m_handle, val);
int countChar = val * 10 / m_max;
m_infStr = m_title + " ";
for (int i = 0; i< countChar; ++i)
{
m_infStr.push_back('*');
}
if (countChar < 10)
{
for (int i = countChar; i < 10; ++i)
{
m_infStr.push_back('=');
}
}
if (!m_infStr.empty())
{
uc1601(m_infStr.c_str(), 0);
}
}
}
用法
//usage
#include "ProgressBar.h"
#if 0
if(ProgressBar::GetInstance()->Init())
{
ProgressBar::GetInstance()->SetTitle("分析数据");
ProgressBar::GetInstance()->SetMax(100);
int maxNum = numMapDims.size();
int i = 0;
for (auto itm : numMapDims)
{
if (!itm.second.empty())
{
dimDatas.clear();
for (auto label : itm.second)
{
dimDatas = ParseLabel(label);
for (auto dim : dimDatas)
{
res.push_back(AddDimData(dim));
}
}
}
++i;
ProgressBar::GetInstance()->SetProgress(i * 100 / maxNum);
}
ProgressBar::GetInstance()->Destory();
}
#endif