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

news2024/11/22 23:12:33

最近使用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();

获取的关键是这一段:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vite+vue3 自动按需导入element-plus

安装element npm install element-plus自动导入 安装自动导入的插件: npm install -D unplugin-vue-components unplugin-auto-import配置 vite.config.js文件&#xff1a; import { defineConfig } from vite import AutoImport from unplugin-auto-import/vite import C…

Axios使用CancelToken取消重复请求

处理重复请求&#xff1a;没有响应完成的请求&#xff0c;再去请求一个相同的请求&#xff0c;会把之前的请求取消掉 新增一个cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …

陕西科技大学改考408!附考情分析

改考信息 8月14日&#xff0c;陕西科技大学公布了2024年硕士研究生招生目录&#xff08;初稿&#xff09;&#xff0c;其中不难发现083500软件工程初试专业课由819数据结构改为408计算机学科专业基础 图片&#xff1a;陕西科技大学24专业目录-软件工程学硕 https://yjszs.sus…

Vue组件库 (一):Element常用组件

Element基于Vue2.0的桌面端组件库 组件&#xff1a;组成网页的部件。例如超链接、图片、按钮等。 一、环境配置 1、下载element 在vscode工程终端下下载。一定要注意&#xff1a;是在工程下安装&#xff01; npm install element -ui2.15.3 出现以下问题&#xff1a; 经判…

基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的机场VIP客户管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

泰迪大数据挖掘建模平台功能特色介绍

大数据挖掘建模平台面相高校、企业级别用户快速进行数据处理的建模工具。 大数据挖掘建模平台介绍 平台底层算法基于R语言、Python、Spark等引擎&#xff0c;使用JAVA语言开发&#xff0c;采用 B/S 结构&#xff0c;用户无需下载客户端&#xff0c;可直接通过浏览器进行…

水库信息化综合管理系统解决方案

一、系统概述 水库综合信息化管理系统主要对水库坝址以上流域、工程本身、下游受益区及相关区的实时气象、水情、工情、旱情、洪涝灾情&#xff0c;以及社会经济和自然环境等信息自动化实时采集&#xff0c;构建一站式的水库信息公共平台&#xff0c;通过多功能完善的系统软件和…

C# Windows登录界面进行截图,控制鼠标键盘等操作实现(一)

首先常规的账户进程是没办法获取登录界面的信息的&#xff0c;因为登录界面已经不在某个账户下了&#xff0c;登录界面显示了每一个账户的切换。所以得使用System权限的进程。 那么Windows系统究竟是怎么将登录界面与用户桌面隔离开的呢&#xff1f;首先先通过一些Windows操作系…

Linux系统编程4(进程信号详解)

你知道为什么当程序中出现除0就会引发程序崩溃退出吗&#xff1f;你知道为何在Linux中输入kill -9 pid 就能杀死进程id为pid的进程吗&#xff1f;这篇文章将详细探讨解答这些问题&#xff0c;文章内容比较长&#xff0c;大家可以收藏慢慢看 什么是信号 在进程间通信这篇文章中…

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)

一、目的 由于kettle的任务需要用到Hadoop&#xff08;HDFS&#xff09;&#xff0c;所以就要连接Hadoop服务。 之前使用的是kettle9.3&#xff0c;由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包&#xff0c;无奈换成了kettle9.2&#xff0c;kettle9.2的安装…

【Apollo学习笔记】—— Planning模块

前言 本文记录学习planning模块时的一些笔记&#xff0c;总体流程参照https://zhuanlan.zhihu.com/p/61982682中的流程图&#xff0c;如上图所示。 planning_component modules/planning/planning_component.cc PlanningComponent::Init部分首先完成规划模式的选择&#xff…

ArcGIS 利用cartogram插件制作变形地图

成果图 注&#xff1a;本图数据并不完全对&#xff0c;只做为测试用例 操作 首先需要下载一个插件cartogram 下载地址在这里 https://www.arcgis.com/home/item.html?idd348614c97264ae19b0311019a5f2276 下载完毕之后解压将Cartograms\HelpFiles下的所有文件复制到ArcGIS…

LeetCode(力扣)257. 二叉树的所有路径Python

LeetCode257. 二叉树的所有路径 题目链接代码 题目链接 https://leetcode.cn/problems/binary-tree-paths/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.…

ChatGPT成为工作工具,具体都应用在哪些地方?

Verified Market Research估计&#xff0c;到2030年&#xff0c;人工智能写作辅助软件市场将达到约65亿美元&#xff0c;复合年增长率为27%。生成式人工智能的浪潮正在席卷世界各地的营销部门。 Botco对美国1000名工作人员进行的调查发现&#xff0c;73%的人表示他们会利用生成…

IO流 详细介绍

一、IO流概述 1.IO&#xff1a;输入(Input读取数据)/输出(Output写数据) 2.流&#xff1a;是一种抽象概念&#xff0c;是对数据传输的总称,也就是说数据在设备间的传输称为流&#xff0c;流的本质是数据传输IO流就是用来处理设备间数据传输问题的。 3.常见的应用&#xff1a…

SQL两张表数据对比

表1&#xff1a; 表2&#xff1a; 1、查询两表的数据差异&#xff1a; # 查询表1中有但表2没有的数据 SELECT DATA FROM data1 WHERE ( DATA ) NOT IN ( SELECT DATA FROM data2 );# 查询表2中有但表…

MySQL系统变量 会话变量,用户变量

系统变量 分类 全局系统变量需要添加 global 关键字&#xff0c;有时把全局系统变量简称 全局变量 会话系统变量需要添加 session 关键字&#xff0c;有时也把会话系统变量称为 local 变量 局部变量 如果不写&#xff08;global、session&#xff09;默认会话级别。 静态变量在…

LeetCode[56]合并区间

难度&#xff1a;Medium 题目&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&…

Practices11|41. 缺失的第一个正数(数组)、73. 矩阵置零(矩阵)

41. 缺失的第一个正数(数组) 1.题目&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xf…

用于智能图像处理的计算机视觉和 NLP

莫斯科&#xff0c;神秘之城...&#xff08;这张照片由伊戈尔沙巴林提供&#xff09; 一、说明 如今&#xff0c;每个拥有智能手机的人都可能成为摄影师。因此&#xff0c;每天都有大量新照片出现在社交媒体、网站、博客和个人照片库中。尽管拍照的过程可能非常令人兴奋&#x…