zoukankan      html  css  js  c++  java
  • 【转】【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);
    }

    结果:

  • 相关阅读:
    解决Navicat导出Excel数字为科学计数法问题
    maven pom.xml文件中properties标签介绍
    Maven中配置maven-compiler-plugin 插件
    使用Spring Boot 优雅地发送邮件
    Intellij IDEA 设置JDK版本
    MySQL order by if()或order by in()条件排序
    Eclipse工具的简单使用
    Java中的四种权限修饰符及六种非访问修饰符(简识)
    原来你的电脑就是这样被木马远控了!!!(转载)
    记Java中有关内存的简单认识
  • 原文地址:https://www.cnblogs.com/KMould/p/14062238.html
Copyright © 2011-2022 走看看