NX 内部进度条功能封装

关于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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值