【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的那个uiUIBlock *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的集合,里面可以添加很多uiNXOpen::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的集合,里面可以添加很多uiNXOpen::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.mzph.cn/news/45288.shtml

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

相关文章

K8S deployment挂载

Deployment部署文件 apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: "1"kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"apps/v1","kind":"Deployment&qu…

Redis从基础到进阶篇(一)

目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…

JDK8知识点梳理

JDK8知识点梳理 一、lambda表达式1.标准格式2.实现原理3.省略模式4.前提条件 二、函数式接口1.函数式接口&#xff1a;FunctionalInterface2.接口默认方法3.接口静态方法4.供给型接口&#xff1a;Supplier5.消费型接口&#xff1a;Consumer6.消费供给型接口&#xff1a;Functio…

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析 文章目录 孤注一掷——基于文心Ernie-3.0大模型的影评情感分析写在前面一、数据直观可视化1.1 各评价所占人数1.2 词云可视化 二、数据处理2.1 清洗数据2.2 划分数据集2.3 加载数据2.4 展示数据 三、RNIE 3.0文心大模型3.1 …

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明&#xff1a;这个buzzer的额定电压需要改为3V&#xff0c;否则不会叫&#xff0c;源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…

excel逻辑函数篇1

1、AND(logical1,[logical2],…)&#xff1a;用于测试所有条件是否均为TRUE 检查所有参数均为true&#xff0c;如果是则返回true 2、OR(logical1,[logical2],…)&#xff1a;用于测试是否有为TRUE的条件 如果任意参数值为true&#xff0c;即返回true&#xff1b;只有当所有参数…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版&#xff0c;是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless&#xff0c;使用…

【idea】社区版idea运行Tomcat

使用 Smart Tomcat插件 配置运行&#xff1a;

通过LD_PRELOAD绕过disable_functions

LD_PRELOAD LD_PRELOAD是Linux/Unix系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff0c;它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量&#xff0c;可以在主程序和其动态链接库的中间加载别的动态链接库&#xff0c;甚至覆盖系统的函数…

【NOIP】标题统计

author&#xff1a;&Carlton tags&#xff1a;模拟&#xff0c;字符串 topic&#xff1a;【NOIP】标题统计 language&#xff1a;C website&#xff1a;P5015 [NOIP2018 普及组] 标题统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) date&#xff1a;2023年8月20日…

Rust语法:所有权引用生命周期

文章目录 所有权垃圾回收管理内存手动管理内存Rust的所有权所有权转移函数所有权传递 引用与借用可变与不可变引用 生命周期悬垂引用函数生命周期声明结构体的生命周期声明Rust生命周期的自行推断生命周期约束静态生命周期 所有权 垃圾回收管理内存 Python&#xff0c;Java这…

Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时&#xff0c;默认只支持wgs84的4326坐标系&#xff0c;不支持CGCS2000的4490坐标系。 如果是ArcGIS发布的4490坐标系的切片服务&#xff0c;如果原点在orgin X: -180.0Y: 90.0的情况下&#xff0c;我们可…

【最新可用】VMware中ubuntu与主机window之间使用共享文件夹传输大文件

一、VMware设置共享文件夹 &#xff08;1&#xff09;虚拟机关机情况下&#xff0c;创建一个共享文件夹 &#xff08;2&#xff09;ubuntu中挂载共享文件夹 1、如果之前已经挂载 hgfs&#xff0c;先取消挂载 sudo umount /mnt/hgfs2、重新使用以下命令挂载 sudo /usr/bin/vmh…

CompletableFuture总结和实践

CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程&#xff0c;与主线程分隔开&#xff0c;并在上面运行一个非阻塞的任务&#xff0c;然后通知主线程进展&#xff0c;成功或者失败。 一、概述 1.CompletableFuture和Future的区别&…

Cesium之水流模型

关于Primitive。 Primitive和Entity&#xff0c;一般翻译成图元和实体&#xff0c;图元更接近底层&#xff0c;实体是封装后的高级对象&#xff0c;使用更加简便。一般来说&#xff0c;Primitive的使用相对繁琐&#xff0c;相比Entity需要使用者自己初始化更多对象&#xff0c…

day9 STM32 I2C总线通信

I2C总线简介 I2C总线介绍 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线&#xff08;也称IIC或I2C&#xff09;是由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 它是同步通…

【Android】相对布局(RelativeLayout)最全解析

【Android】相对布局&#xff08;RelativeLayout&#xff09;最全解析 一、相对布局&#xff08;RelativeLayout&#xff09;概述二、根据父容器定位三、根据兄弟控件定位 一、相对布局&#xff08;RelativeLayout&#xff09;概述 相对布局&#xff08;RelativeLayout&#x…

【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)

文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应&#xff0c;用于后序servlet从request中获取请求中的参数。 参照http请求报文&#xff1a; import java.io.BufferedReader; import java…

(详解踩坑)GIT版本回滚git stash、git reset、git reset --hard、git revert

目录 背景 一、&#xff08;git log、git reflog&#xff09;查看git提交日志及命令历史 1.1 git log&#xff08;提交日志&#xff09; 1.2 git reflog&#xff08;命令历史&#xff09; 二、git reset&#xff08;回退到指定的版本&#xff0c;并且保留更改&#xff09; …