【转】【NX二次开发】UFUN进度中断,单击停止可中断此操作

队长的博客: https://www.cnblogs.com/nxopen2018/p/13174207.html

显示此对话框,点击可中断操作:

用到的ufun函数:

UF_ABORT_ask_flag_status 检查用户是否通过按CTRL+SHIFT+L键或在工作进程对话框中选择停止来发出中止请求
UF_ABORT_clear_abort     清除任何挂起的中止请求。如果处理了中止请求,则应该调用它。 
UF_ABORT_disable_abort   禁用中止处理程序
UF_ABORT_enable_abort    启用中止处理程序

源码:

#include <uf.h>
#include <uf_ui.h>
#include <uf_abort.h>
#include <uf_modl.h>
extern DllExport void ufusr(char *param, int *returnCode, int rlen)
{
    UF_initialize();
    UF_ABORT_clear_abort();//清除标记位
    UF_ABORT_enable_abort();//打开中断检测(对话框)
    bool isUserClickWidget = false;
    for (int i = 0; i < 200; i++)
    {
        //创建块
        UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
        double Corner_pt[3] = { i * 120, 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);
        logical logi;
        UF_ABORT_ask_flag_status(&logi);//访问中断标记
        if (logi)
        {
            //用户中断标记
            UF_ABORT_clear_abort();//清除标记位
            isUserClickWidget = true;
            break;
        }
    }
    if (isUserClickWidget)
    {
        uc1601("用户退出", 1);
    }    
    else
    {
        uc1601("自然结束", 1);
    }    
    UF_ABORT_disable_abort();//关闭中断检测(对话框)
    UF_terminate();

}

extern int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}

结果(自然结束):

  结果(用户终止):

   存在BUG:用户点击停止时,程序没有停止。最后自然结束。我们发现少创建了一个块:(后面分析原因)

  编写测试程序,仅循环创建块:

#include <uf.h>
#include <uf_ui.h>
#include <uf_abort.h>
#include <uf_modl.h>
extern DllExport void ufusr(char *param, int *returnCode, int rlen)
{
    UF_initialize();

    for (int i = 0; i < 200; i++)
    {
        //创建块
        UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
        double Corner_pt[3] = { i * 120, 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);
    }
    UF_terminate();
}

extern int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}

结果:

 可以看到即使我们不使用UF_ABORT_enable_abort();NX也会在UF_MODL_create_block1()时,自己弹出询问中断的对话框。并且我试过如果用户中断UF_MODL_create_block1()这个函数会返回一个值:66,代表:User abort(用户终止)

完善后的代码:

#include <uf.h>
#include <uf_ui.h>
#include <uf_abort.h>
#include <uf_modl.h>
extern DllExport void ufusr(char *param, int *returnCode, int rlen)
{
    UF_initialize();
    UF_ABORT_clear_abort();//清除标记位
    UF(UF_ABORT_enable_abort());//打开中断检测(对话框)
    bool isUserClickWidget = false;
    int failcode = 0;
    for (int i = 0; i < 200; i++)
    {
        //创建块
        UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
        double Corner_pt[3] = { i * 120, 0.0, 0.0 };//设置原点
        char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
        tag_t BlkTag = NULL_TAG;
        failcode=UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag);
        //错误代码:66,错误原因:User abort
        logical logi;
        UF_ABORT_ask_flag_status(&logi);//访问中断标记
        if ((logi)||(failcode))
        {
            //用户中断标记
            UF_ABORT_clear_abort();//清除标记位
            isUserClickWidget = true;
            break;
        }
    }
    if (isUserClickWidget)
    {
        uc1601("用户退出", 1);
        if (failcode)
        {
            uc1601("创建块终止", 1);
        }
    }
    else
    {
        uc1601("自然结束", 1);
    }
    UF_ABORT_disable_abort();//关闭中断检测(对话框)
    UF_terminate();

}

extern int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}

结果:

原文地址:https://www.cnblogs.com/KMould/p/14062238.html