【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发,需要用到集列表,也就是SetList这个控件,然而网上相关的资料和范例实在是太少,有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG(NX)二次开发 BlockUI 集列表使用方法》,这两篇文章,对我的帮助很大,但是因为使用的编程语言不同(我使用的是c++),仍然遇到了很多困难,不过最终在我不断的摸索和尝试下,终于有个完整的使用流程,特此分享给需要的同学,避免跟我一样一下子不知道从何下手。

想快速获取结果的可以直接看代码,想看一下问题的解决过程的,且听我娓娓道来。

对于集列表,它不同于一般的控件,一般的控件直接添加即可,而集列表则需要添加种子块,那么种子块如何添加呢,下面我将详细说明这个步骤。

项目原因,我就使用nx8.0的32位版本来做说明,其他版本类似。

首先,打开任意项目,然后打开块UI样式编辑器,如下图所示:

 新建或者打开任意界面,并且添加集列表:

此时提示“错误:缺少种子块”。

我们需要新建或者使用已有的任意对话框dlx文件,并且在下方红色方框位置填入文件名(dlx在同一目录的情况下),如果种子块在不同目录,则使用种子块dlx文件的全路径。

此时,错误提示消失,并且自动加入到主界面。

 

 在集列表中可以设置是否自动展开以及列数等。

以上是界面相关,下面进入代码部分,这部分主要是我在前面两篇文章的的帮助下摸索和尝试出来的,特此分享关键代码,项目原因部分不重要的代码实现无法公开,可以自己考虑实现,或者查阅资料,调用UG自带的函数。

针对集列表,主要有两个回调函数,添加和删除按钮时的回调函数,我无法直接找到相关的c++范例,不过后来我发现,可以查看函数的声明和参数来确定回调函数的样式。

比如:对于集列表m_pListCurves,输入set可以智能提示有如下回调函数:

而我们需要的就是AddHandler和DelHandler,那么如何添加这两个回调函数呢,我们可以按F12,进去声明看一下:

然后在AddCallback的地方再按下F12,此时就可以看到如下的声明:

这代表着,这个回调函数是以int为返回值,以 NXOpen::BlockStyler::SetList *为参数类型的函数,同理,在下方可以看到Del的回调函数样式:

typedef NXOpen::Callback2<int, NXOpen::BlockStyler::SetList *, NXOpen::BlockStyler::UIBlock *> DeleteCallback;

形如:

    // 集列表回调函数
    int addCurve_cb(NXOpen::BlockStyler::SetList *);
    int deleteCurve_cb(NXOpen::BlockStyler::SetList *, NXOpen::BlockStyler::UIBlock *);

于是,得到下面的代码:

        // 这是添加按钮的
        m_pListCurves->SetAddHandler(make_callback(this, &CAMFeatureAddCurveUI::addCurve_cb));

        // 这是删除按钮的
        m_pListCurves->SetDeleteHandler(make_callback(this, &CAMFeatureAddCurveUI::deleteCurve_cb));

供参考。

为了在点击添加按钮的时候,可以自动有一些动作,比如初始化界面等(这里说一下,nx初始化界面一般是放在dialogShown_cb()中的,但是因为这个是作为list控件的种子块,dialogShown_cb()并不会执行,所以这种情况下的初始化应该放在添加按钮的回调函数中)。

代码供参考:

int CAMFeatureAddCurveUI::addCurve_cb(NXOpen::BlockStyler::SetList *pList)
{
    // 点击添加按钮的时候,会添加一个你设置的seedDlx的那个ui
    UIBlock *pBlockUI = m_pListCurves->AddNewSet(true);

    // 这个是设置显示的文本,第一列是序号,后面是的列自己设置即可
    int nNewIndex = m_pListCurves->GetItems().size();
    NXString stIndex = AUTUMOONString::to_string(nNewIndex).c_str();
    stIndex = "曲线组" + stIndex;
    std::vector<NXString> vContenInList;
    vContenInList.push_back(stIndex);

    m_pListCurves->SetItemText(pBlockUI, vContenInList);

    // 针对控件的初始化

    // 强转成NXOpen.BlockStyler.CompositeBlock,类似一个UI的集合,里面可以添加很多ui
    NXOpen::BlockStyler::CompositeBlock *compositeBlock = (NXOpen::BlockStyler::CompositeBlock *)pBlockUI;

    // 分别查找对应的控件
    NXOpen::BlockStyler::UIBlock *edge_select0 = compositeBlock->FindBlock("edge_select0");
    NXOpen::BlockStyler::UIBlock *enumCamMethod = compositeBlock->FindBlock("enumCamMethod");
    NXOpen::BlockStyler::UIBlock *enumMaterialSide = compositeBlock->FindBlock("enumMaterialSide");
    NXOpen::BlockStyler::UIBlock *doubleProcessDis = compositeBlock->FindBlock("doubleProcessDis");
    NXOpen::BlockStyler::UIBlock *doubleSelToolDia = compositeBlock->FindBlock("doubleSelToolDia");
    NXOpen::BlockStyler::UIBlock *toggleRough = compositeBlock->FindBlock("toggleRough");
    NXOpen::BlockStyler::UIBlock *toggleFinish = compositeBlock->FindBlock("toggleFinish");

    doubleSelToolDia->AUTUMOONBLock_SetDouble(63.0);
    enumCamMethod->AUTUMOONBLock_SetEnum(0);
    enumMaterialSide->AUTUMOONBLock_SetEnum(0);
    edge_select0->Focus();

    // 计算加工距离
    Vector3d vec3d = m_pVectorZ->GetProperties()->GetVector("Vector");

    AUTUMOONMathVector3d ivecUserZ(vec3d.X, vec3d.Y, vec3d.Z);

    // 计算加工距离
    double dProcessDistance =
        CAMFeaRecognition::GetProcessDistanceEx(m_cfFeature.m_pvFaces, m_cfFeature.m_eCAMMachiningType, ivecUserZ);
    doubleProcessDis->AUTUMOONBLock_SetDouble(dProcessDistance);

    return 0;
}

其中的关键是获取块指针,用FindBlock来实现。

删除功能的回调函数,基本可以通用,如果你不需要进行特别处理的话。

int CAMFeatureAddCurveUI::deleteCurve_cb(NXOpen::BlockStyler::SetList *pList, NXOpen::BlockStyler::UIBlock *pBlockUI)
{
    // GetSelected()返回选择item的UIblock的数组
    for (int i = 0; i < m_pListCurves->GetSelected().size(); i++)
    {
        // 删掉即可
        m_pListCurves->Delete(m_pListCurves->GetSelected()[i]);
    }

    return 0;
}

实际上,你会发现,如果你的子块不需要特殊的处理的话,你甚至都不需要子块对应的hpp文件和cpp文件,因为无论是设置还是读取,都是在集列表所在的主界面中实现的。

下面讲一下,如何获取集列表中的值,实际上在上面的回调函数代码中已经有了,不过这里还是专门写一下,代码供参考:

 //author:autumoon
//邮箱:9506@163.com
//日期:2023-08-17 
           //---------Enter your code here-----------
            // 用户选择的方向
            Vector3d vec3d = m_pVectorZ->GetProperties()->GetVector("Vector");

            AUTUMOONMathVector3d ivecUserZ(vec3d.X, vec3d.Y, vec3d.Z);

            if (m_cfFeature.m_pvFaces.size() == 0)
            {
                uc1601("请选择面!", 1);
                return -1;
            }

            Face *pFirstFace = m_cfFeature.m_pvFaces[0];

            AUTUMOONMathVector3d vecLaw = CAMFeaRecognition::GetFaceLawEx(pFirstFace);

            if (vecLaw.IsSameDirection(ivecUserZ))
            {
                m_cfFeature.m_eCAMMachiningType = eMachiningTypeFront;
            }
            else if (vecLaw.IsParallel(ivecUserZ))
            {
                m_cfFeature.m_eCAMMachiningType = eMachiningTypeReverse;
            }
            else
            {
                m_cfFeature.m_eCAMMachiningType = eMachiningTypeFiveAxis;
            }

            // 添加平面铣颜色
            m_cfFeature.m_nFeatureColor = pFirstFace->Color();

            // 根据平面铣的当前z方向,得到编程时的坐标系
            CAMFeaRecognition::GenerateWCSCoorByFeature(&m_cfFeature, ivecUserZ);

            // 类型
            int nSelIndex = m_pEnumMillType->AUTUMOONBLock_GetEnumValue;
            m_cfFeature.m_eCAMMachiningMode = static_cast<ProcessingType>(eProcessingTypeFlatMillingOpen + nSelIndex);

            // 从list列表获取曲线信息
            std::vector<UIBlock *> vAllBlocks = m_pListCurves->GetItems();
            for (int i = 0; i < vAllBlocks.size(); i++)
            {
                // 强转成NXOpen.BlockStyler.CompositeBlock,类似一个UI的集合,里面可以添加很多ui
                NXOpen::BlockStyler::CompositeBlock *compositeBlock =
                    (NXOpen::BlockStyler::CompositeBlock *)vAllBlocks[i];

                // 分别查找对应的控件
                NXOpen::BlockStyler::UIBlock *edge_select0 = compositeBlock->FindBlock("edge_select0");
                NXOpen::BlockStyler::UIBlock *enumCamMethod = compositeBlock->FindBlock("enumCamMethod");
                NXOpen::BlockStyler::UIBlock *enumMaterialSide = compositeBlock->FindBlock("enumMaterialSide");
                NXOpen::BlockStyler::UIBlock *doubleProcessDis = compositeBlock->FindBlock("doubleProcessDis");
                NXOpen::BlockStyler::UIBlock *doubleSelToolDia = compositeBlock->FindBlock("doubleSelToolDia");
                NXOpen::BlockStyler::UIBlock *toggleRough = compositeBlock->FindBlock("toggleRough");
                NXOpen::BlockStyler::UIBlock *toggleFinish = compositeBlock->FindBlock("toggleFinish");

                vector<TaggedObject *> selectedCurves = edge_select0->AUTUMOONBLock_GetSelectedObjects;
                if (m_cfFeature.m_vpCurveExs.size())
                {
                    m_cfFeature.m_vpCurveExs.clear();
                }
                for (auto it = selectedCurves.begin(); it != selectedCurves.end(); ++it)
                {
                    Curve *pCurveSel = static_cast<Curve *>(*it);

                    CurveEx *pCurveEx = new CurveEx(pCurveSel);
                    // 加工曲线位置
                    pCurveEx->m_nCurveCamMethod = enumCamMethod->AUTUMOONBLock_GetEnumValue;

                    // 材料侧
                    pCurveEx->m_nMaterialSide = enumMaterialSide->AUTUMOONBLock_GetEnumValue + 1;

                    // 加工距离
                    pCurveEx->m_dProcessDistance = doubleProcessDis->AUTUMOONBLock_GetDoubleValue;

                    // 刀具直径
                    pCurveEx->m_dSelToolDia = doubleSelToolDia->AUTUMOONBLock_GetDoubleValue;

                    // 粗加工
                    if (toggleRough->AUTUMOONBLock_GetLogicalValue)
                    {
                        pCurveEx->m_nMachiningMethod |= MACHINING_METHOD_ROUGH;
                    }
                    else
                    {
                        pCurveEx->m_nMachiningMethod &= ~MACHINING_METHOD_ROUGH;
                    }

                    // 半精加工和精加工
                    if (toggleFinish->AUTUMOONBLock_GetLogicalValue)
                    {
                        pCurveEx->m_nMachiningMethod |= MACHINING_METHOD_HALF_FINISH | MACHINING_METHOD_FINISH;
                    }
                    else
                    {
                        pCurveEx->m_nMachiningMethod &= ~(MACHINING_METHOD_HALF_FINISH | MACHINING_METHOD_FINISH);
                    }

                    // 加工面高度(从当前主界面获取)
                    pCurveEx->m_dDeepOffset = m_DoubleFaceHeight->AUTUMOONBLock_GetDoubleValue;

                    m_cfFeature.m_vpCurveExs.push_back(pCurveEx);
                }
            }

            int nFindIndex = -1;
            for (int i = 0; i < m_vFeatures.size(); ++i)
            {
                CAMFeature &cf = m_vFeatures[i];
                if (cf.m_pvFaces.size())
                {
                    Face *pFaceCur = cf.m_pvFaces[0];
                    if (pFaceCur == pFirstFace)
                    {
                        nFindIndex = i;

                        // 释放原来的
                        if (cf.m_vpCurveExs.size())
                        {
                            CurveEx::ReleaseCurveEx(cf.m_vpCurveExs);
                        }

                        cf = m_cfFeature;
                        break;
                    }
                }
            }

            // 添加
            if (nFindIndex == -1)
            {
                m_vFeatures.push_back(m_cfFeature);
            }

            // 复位控件
            resetAllCtrlBlock();

            // 面选择重新选择为焦点
            m_pSelFace->Focus();

获取的关键是这一段:

此代码也是我尝试出来的结果,当发现可以正常工作的时候,我还是很开心的,毕竟这个代码带着一点点猜想的成分。

至此,集列表的创建以及回调函数,以及获取集列表上任意控件的值就已经全部结束了。
欢迎交流与讨论,欢迎留言或者私信我寻求帮助,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/86718.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue Cli 脚手架安装

Vue Cli 脚手架安装 首先&#xff0c;改一下仓库地址&#xff0c;使用下面的命令cnpm淘宝镜像加速 npm install cnpm -g --registryhttps://registry.npm.taobao.org下载安装 vue 脚手架 npm install -g vue/cli查看 vue cli 脚手架是否安装成功&#xff0c;如果输入命令出现…

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了&#xff0c;这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件&#xff0c;图片&#xff0c;文本等…

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据…

测试框架pytest教程(11)-pytestAPI

常量 pytest.__version__ #输出pytest版本 pytest.version_tuple #输出版本的元组形式 功能 pytest.approx pytest.approx 是一个用于进行数值近似比较的 pytest 断言工具。 在测试中&#xff0c;有时候需要对浮点数或其他具有小数部分的数值进行比较。然而&#xff0c;由于…

Linux面试笔试题(6)

91、6块300G的硬盘做raid5&#xff0c;新的设备容量是多大&#xff08;C&#xff09; A 900G B 1800G C 1500G D 300G 6300G−300G 1500G 由于一块硬盘用于奇偶校验&#xff0c;所以设备容量将是1500G. Raid 5是一种磁盘阵列&#xff0c;将数据分散到多个硬盘上以提高性能和可…

【⑬MySQL | 数据类型(一)】简介 | 整数 | 浮点 | 定点类型

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL数据类型简介 | 整数 | 浮点 | 定点类型的分享✨ 目录 前言0.数据类型简介1 整数类型2 浮点类型3 定点类型4 日期/时间类型总结 0.数据类型简介 数据类型&#xff08;data_type&#xff09;是指系统中所允许的…

LeetCode算法递归类—二叉树中的最大路径和

目录 124. 二叉树中的最大路径和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该…

【图论】拓扑排序

一.定义 拓扑排序是一种对有向无环图&#xff08;DAG&#xff09;进行排序的算法&#xff0c;使得图中的每个顶点在排序中都位于其依赖的顶点之后。它通常用于表示一些任务之间的依赖关系&#xff0c;例如在一个项目中&#xff0c;某些任务必须在其他任务之前完成。 拓扑排序的…

SQL注入之延时注入

文章目录 延时注入是什么&#xff1f;延时注入获取数据库版本号 延时注入是什么&#xff1f; 延时注入就是利用sleep()函数通过if语句判断所写的语句真假&#xff0c;如果为真返回我们想要的东西&#xff08;例如&#xff1a;数据库的长度&#xff0c;数据库的名字等&#xff0…

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 &#xff08;1&#xff09;轮询&#xff08;默认&#xff09;每个请求按时间顺序逐一分配到不同的后端服务&…

达梦数据库读写分离集群原理

概述 本文就达梦数据库读写分离原理进行介绍。 达梦读写分离集群特点&#xff1a; 可以配置8个即时备库或8个实时备库&#xff1b;读写操作自动分离、负载均衡&#xff1b;提供数据同步&#xff1b;备库故障自动处理&#xff0c;故障恢复自动数据同步等功能&#xff0c;也支持…

无涯教程-TensorFlow - Keras

Keras易于学习的高级Python库&#xff0c;可在TensorFlow框架上运行&#xff0c;它的重点是理解深度学习技术&#xff0c;如为神经网络创建层&#xff0c;以维护形状和数学细节的概念。框架的创建可以分为以下两种类型- 顺序API功能API 无涯教程将使用Jupyter Notebook执行和…

会计如何使用ChatGPT提高工作效率

文章目录 ChatGPT改变了会计行业微软重新定义了PC交互应对ChatGPT带来的冲击给财务人员的建议总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社…

LInux之例行工作

目录 场景 单一执行例行任务 --- at&#xff08;一次性&#xff09; 安装 命令详解 语法格式 参数及作用 时间格式 案例 at命令执行过程分析 循环执行的例行性任务--crontab&#xff08;周期性&#xff09; crontd服务安装 linux 任务调度的工分类 crontab工作过程…

js案例:小球碰壁反弹

目录 一.效果预览图​编辑 解析 二.完整代码 代码讲解 html部分 js部分 一.效果预览图 解析 这个效果是为了以后&#xff08;过段时间会发的一个小游戏&#xff09;做js小游戏做准备的&#xff0c;基本结构是&#xff0c;定义两个div盒子&#xff0c;小盒子设置成圆球形状…

代码pytorch-adda-master跑通记录

前言 最近在学习迁移学习&#xff0c;ADDA算法&#xff0c;由于嫌自己写麻烦&#xff0c;准备先跑通别人的代码。 代码名称&#xff1a;pytorch-adda-master 博客&#xff1a;https://www.cnblogs.com/BlairGrowing/p/17020378.html github地址&#xff1a;https://github.com…

关于Springboot项目打包的配置问题

一、打包方式的不同致使jar包运行性能及docker部署的效率问题 1.1方式一 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source&…

Flash 空间大小的选择以及8MB和8M bit单位与转换关系

他V hezkz17进数字音频系统研究开发交流答疑群(课题组) log打印 [09:54:27.565] FLASH_SIZE0x800000 这个是 8MB 字节 芯片手册Flash是以字节为单位 注意单位与转换关系 ifeq ($(FLASH_SIZE),0x100000) # 8M bits LOG_DUMP_SECTION_SIZE ? 0x10000 endif 0x1000001MB为 …

C# 观察者模式

一、概述 观察者模式是一种常用的设计模式&#xff0c;它属于行为型模式。在C#中&#xff0c;观察者模式通过定义一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合&#xff0c;…