【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.rhkb.cn/news/97807.html

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

相关文章

Dubbo使用

<!--dubbo--><dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency>接口 public interface IUseService {public String…

设计模式之状态模式(State)的C++实现

1、状态模式的提出 在组件功能开发过程中&#xff0c;某些对象的状态经常面临变化&#xff0c;不同的状态&#xff0c;其对象的操作行为不同。比如根据状态写的if else条件情况&#xff0c;且这种条件变化是经常变化的&#xff0c;这样的代码不易维护。可以使用状态模式解决这…

安全学习DAY16_信息打点-CDN绕过

信息打点-CDN绕过 文章目录 信息打点-CDN绕过本节思维导图相关链接&工具站&项目工具前置知识&#xff1a;CDN配置&#xff1a;配置1&#xff1a;加速域名-需要启用加速的域名配置2&#xff1a;加速区域-需要启用加速的地区配置3&#xff1a;加速类型-需要启用加速的资源…

VGG分类实战:猫狗分类

关于数据集 数据集选择的是Kaggle上的Cat and Dog&#xff0c;猫狗图片数量上达到了上万张。你可以通过这里进入Kaggle下载数据集Cat and Dog | Kaggle。 在我的Github仓库当中也放了猫狗图片各666张。 VGG网络 VGG的主要特点是使用了一系列具有相同尺寸 3x3 大小的卷积核进…

vue3生命周期

原理 vue3也提供了Composition API形式的生命周期钩子&#xff0c;与vue2.x中钩子对应关系如下&#xff1a; beforeCreate setup&#xff08;&#xff09; created setup&#xff08;&#xff09; beforeMountonBeforeMount mountedonMounted beforeUpdateonBeforeUpdate updat…

【C++】做一个飞机空战小游戏(十)——子弹击落炮弹、炮弹与飞机相撞

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

Unsafe upfileupload

文章目录 client checkMIME Typegetimagesize 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按…

HTML中的字符串转义

为什么要转义&#xff1f; 转义可以防止 xss 攻击。接下来&#xff0c;我们来看一下如何转义。 HTML Sanitizer API Sanitizer 是浏览器自带的转义方法&#xff0c;在2021年初被提出&#xff0c;兼容性问题很大。 列举几个常用的 API&#xff1a; const $div document.qu…

【广州华锐视点】VR线上教学资源平台提供定制化虚拟现实学习内容

虚拟现实&#xff08;VR&#xff09;技术的出现为我们提供了一种全新的在线教学方式。由广州华锐视点开发的VR线上教学资源平台&#xff0c;作为一个综合性的学习工具&#xff0c;正在教育领域迅速发展&#xff0c;并被越来越多的教育机构和学生所接受。那么&#xff0c;VR线上…

redis实战-缓存数据解决缓存与数据库数据一致性

缓存的定义 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪&#xff0c;这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存…

ReactNative进阶(三十四):ipa Archive 阶段报错error: Multiple commands produce问题修复及思考

文章目录 一、前言二、问题描述三、问题解决四、拓展阅读五、拓展阅读 一、前言 在应用RN开发跨平台APP阶段&#xff0c;从git中拉取项目&#xff0c;应用Jenkins进行组包时&#xff0c;发现最终生成的ipa安装包版本号始终与项目中设置的版本号不一致。 二、问题描述 经过仔…

图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…

【100天精通python】Day42:python网络爬虫开发_HTTP请求库requests 常用语法与实战

目录 1 HTTP协议 2 HTTP与HTTPS 3 HTTP请求过程 3.1 HTTP请求过程 3.2 GET请求与POST请求 3.3 常用请求报头 3.4 HTTP响应 4 HTTP请求库requests 常用语法 4.1 发送GET请求 4.2 发送POST请求 4.3 请求参数和头部 4.4 编码格式 4.5 requests高级操作-文件上传 4.6 …

机器学习之数据集

目录 1、简介 2、可用数据集 3、scikit-learn数据集API 3.1、小数据集 3.2、大数据集 4、数据集使用 ⭐所属专栏&#xff1a;人工智能 文中提到的代码如有需要可以私信我发给你&#x1f60a; 1、简介 当谈论数据集时&#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…

【C语言练习】数组OJ题

目录 一.消失的数字思路1&#xff1a;思路2&#xff1a; 二.移除元素三.轮转数组四.删除有序数组中的重复项五.合并两个有序数组 一.消失的数字 题目&#xff1a; 思路1&#xff1a; 数组是从0加到N&#xff0c;所以把0到N的数加起来减去数组中的值&#xff0c;结果就是消失…

HLK-LD105/2410B/2420模块测试

HLK105/2410B/2420模块测试 &#x1f4cc;模块资料地址&#xff1a;https://h.hlktech.com/Mobile/download &#x1f33f;HLK-LD105模块&#xff1a; 10G微波雷达 &#x1f33f;HLK-LD2420-24G&#xff1a;24G毫米波雷达 &#x1f33f;HLK-LD2410B-24G&#xff1a;24…

AVL树的讲解

算法拾遗三十八AVL树 AVL树AVL树平衡性AVL树加入节点AVL删除节点AVL树代码 AVL树 AVL树具有最严苛的平衡性&#xff0c;&#xff08;增、删、改、查&#xff09;时间复杂度为O&#xff08;logN&#xff09;&#xff0c;AVL树任何一个节点&#xff0c;左树的高度和右树的高度差…

Java之线程的状态

文章目录 一、线程状态二、代码演示1. Threadstate 类2. SleepUtils 类3. 运行示例 三、参考资料 一、线程状态 Java线程在运行的生命周期中可能处于下图所示的6种不同的状态,在给定的一个时刻线程只能处于其中的一个状态。 Java线程的状态 状态名称说明NEW初始状态&#xff0…

C++继承

一、继承的定义 class Person { public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;} protected:string _name "peter"; // 姓名int _age 18; // 年龄 };class Stu…