Block UI——tree(2)编辑树列表

目录

 一、概述

二、学习资料

三、学习案例——编辑树列表

3.1 UI界面分析

3.2编辑树列表方法一

3.3编辑树列表方法二

3.4编辑树列表方法二(解决以上问题)

三、总结


首先要感谢NX二次开发者无私奉献以及默默无闻的帮助和支持,在这里我推荐一个NX二次开发爱好者的qq群聊753801561,群内大佬如云,热衷于钻研技术。

 一、概述

       在NX二次开发过程中,开发人员经常会使用树列表(Tree)来存储不同的信息,而且还可能对这些信息数据进行编辑操作。本文将以NX12.0为例,介绍两种编辑树列表的方法。

二、学习资料

1、各类NX二次开发教学视频;

2、官方参考案例:$UGII_BASE_DIR/ugopen/SampleNXOpenApplications/C++/BlockStyler/TreeListDemo;

3、帮助文档:BlockStyler中Node(节点)、Tree(树列表)、TreeListMenu(右键调用函数)。

三、学习案例——编辑树列表

3.1 UI界面分析

3.2编辑树列表方法一

        SetAskEditControlHandler”。该方法用于设置编辑时采取什么样的控件。而其三种控件分别是ListBox(列表框)、ComboBox(复合框)和None(不可编辑)。前两个控件的下拉菜单通过“SetEditOptions”方法进行设置。最终是否接受编辑需要采用“SetOnEditOptionSelectedHandler”方法来确定。

NXOpen::BlockStyler::Tree::EditControlOption NXOpen_EditTree::OnEditOptionSelectedCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID, int selectedOptionID, NXString selectedOptionText, NXOpen::BlockStyler::Tree::ControlType type)
{NXOpen::BlockStyler::Tree::EditControlOption OnEditOptionSelected = BlockStyler::Tree::EditControlOptionReject;//接受或者禁止编辑选项,EditControlOptionAccept接受,EditControlOptionReject禁止try{//---- Enter your callback code here -----if (BlockStyler::Tree::ControlTypeComboBox == type)//ComboBox(复合列表框){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionAccept;}else if (BlockStyler::Tree::ControlTypeListBox == type)//ListBox(列表框){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionAccept;}else if (BlockStyler::Tree::ControlTypeNone == type)//None(不可编辑){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionReject;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEditOptionSelected;
}NXOpen::BlockStyler::Tree::ControlType NXOpen_EditTree::AskEditControlCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::ControlType AskEditControl = BlockStyler::Tree::ControlTypeNone;try{//---- Enter your callback code here -----if (columnID == 1){AskEditControl = BlockStyler::Tree::ControlTypeComboBox;//查询控件编辑类型,第二列复合框,第三列列表框,其余不可编辑std::vector<NXOpen::NXString> options;options.push_back(NXOpen::NXString("ControlTypeComboBox1"));options.push_back(NXOpen::NXString("ControlTypeComboBox2"));tree->SetEditOptions(options, 1);//在设置编辑期间默认的选择0为第一个,1为第二个。}else if (columnID == 2){AskEditControl = BlockStyler::Tree::ControlTypeListBox;std::vector<NXOpen::NXString> options;options.push_back(NXOpen::NXString("ControlTypeListBox1"));options.push_back(NXOpen::NXString("ControlTypeListBox2"));options.push_back(NXOpen::NXString("ControlTypeListBox3"));tree->SetEditOptions(options, 0);}else if (columnID == 3){			AskEditControl = BlockStyler::Tree::ControlTypeComboBox;std::vector<NXOpen::NXString> options;strValue = node->GetColumnDisplayText(columnID);options.push_back(strValue);tree->SetEditOptions(options, 0);}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return AskEditControl;
}

图1 ComboBox(复合框)选择

图2 ListBox(列表框)选择

图3 ComboBox(复合框)直接编辑

3.3编辑树列表方法二

        “SetOnBeginLabelEditHandler”。该方法用于设置开始编辑标签所执行内容,以及确定哪一列可编辑。最终是否接受编辑需要采用“SetOnEndLabelEditHandler”方法来确定。手动触发编辑标签的方法是按下键盘键“F2”,为了人性化操作,我们采用树列表的双击回调“SetOnDefaultActionHandler”来模拟手动触发。

void NXOpen_EditTree::OnDefaultAction(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{try{if (columnID == 4){std::vector<BlockStyler::Node *> selectedNode = tree_control0->GetSelectedNodes();selectedNode[0]->SetColumnDisplayText(4, "Default Action");NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeInformation, "Default Action: Four column text is changed");selectedNode.clear();}else if (columnID == 5){keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}
}NXOpen::BlockStyler::Tree::BeginLabelEditState NXOpen_EditTree::OnBeginLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::BeginLabelEditState OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;//第四、第五列允许双击编辑try{//---- Enter your callback code here -----if(columnID ==4){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//BeginLabelEditStateAllow允许双击编辑,BeginLabelEditStateDisallow不允许双击编辑}else if (columnID == 5){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnBeginLabelEdit;
}NXOpen::BlockStyler::Tree::EndLabelEditState NXOpen_EditTree::OnEndLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int, NXString editedText)
{NXOpen::BlockStyler::Tree::EndLabelEditState OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateRejectText;//EndLabelEditStateRejectText,拒绝编辑;EndLabelEditStateAcceptText接受编辑try{//---- Enter your callback code here -----OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateAcceptText;}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEndLabelEdit;
}

图4 双击节点直接替换内容

图5 双击第六列模仿按键盘F2

        不知为何总是出现在设置双击后的第一个支持双击的列表,如果一列可以用,多列有问题,但是设置为支持双击后单击列,会停顿几面,支持在修改相应的列,如图6所示

图6 设置支持双击后的相应列,然后单击停顿几秒即可编辑

3.4编辑树列表方法二(解决以上问题)

       在调试的过程中,我发现设置允许双击单独的一列可以正常运行,但是两列、三列同时支持双击操作时,无论点击第几列总是第一列编辑,同时结合群内大佬提示“回调是多次的,你在需要的列中再返回允许,其余时返回不允许”的提示,让我想到可以对允许双击的列进行全局变量的设置,每次双击,即在相应的列允许编辑,其他列不允许编辑,这样就实现了双击编辑这一功能。关键代码如下:

int TreeColumn;//定义一个全局边量记录点击的那一列void NXOpen_EditTree::OnDefaultAction(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{try{if (columnID == 4){/*std::vector<BlockStyler::Node *> selectedNode = tree_control0->GetSelectedNodes();selectedNode[0]->SetColumnDisplayText(4, "Default Action");NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeInformation, "Default Action: Four column text is changed");selectedNode.clear();*//*uc1601("第五列", 1);*/keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2keybd_event(113, 0, KEYEVENTF_KEYUP, 0); //按F2抬起}else if (columnID == 5){/*uc1601("第六列", 1);*/keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2keybd_event(113, 0, KEYEVENTF_KEYUP, 0); //按F2抬起}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}
}NXOpen::BlockStyler::Tree::BeginLabelEditState NXOpen_EditTree::OnBeginLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::BeginLabelEditState OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;//第四、第五列允许双击编辑try{//---- Enter your callback code here -----if(columnID == TreeColumn){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//BeginLabelEditStateAllow允许双击编辑,BeginLabelEditStateDisallow不允许双击编辑}//else if (columnID == 5)//{//	OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//}else if (columnID == TreeColumn){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnBeginLabelEdit;
}NXOpen::BlockStyler::Tree::EndLabelEditState NXOpen_EditTree::OnEndLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int, NXString editedText)
{NXOpen::BlockStyler::Tree::EndLabelEditState OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateRejectText;//EndLabelEditStateRejectText,拒绝编辑;EndLabelEditStateAcceptText接受编辑try{//---- Enter your callback code here -----OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateAcceptText;}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEndLabelEdit;
}

三、总结

        综上所述,操作方式多种多样,在NX支持的情况下,可根据具体的情况进行选择编辑方式,除了上述的编辑方式,还其他的非树列表自带编辑方式。例如选择行数据后显示新控件进行编辑、或是双击行数据后,弹出新界面编辑等方式。只要是能满足需求,且功能人性化,采用哪种方式均可。

源码链接

https://download.csdn.net/download/weixin_47753171/88881192?spm=1001.2014.3001.5503

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

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

相关文章

解决show-overflow-tooltip跨行生效的问题

当内容出现特殊字符&#xff08;空格换行&#xff09;会占据几行的空间后再显示... 解决&#xff1a; 1、自定义组件tooltip.vue <template><div><el-tooltip :disabled"isShowTooltip" class"tooltip" placement"top"><…

Vmware宿主机与虚拟机网络联通配置

Vmware宿主机与虚拟机网络联通配置 1. 查看宿主机配置 2. 网卡是否启动 更改适配器选项&#xff1a; 网卡全部启用 3. 查看虚拟机IP 虚拟机IP需要与宿主机VMnet8保持网段一致&#xff0c;不一致则进行修改

QQ防红跳转短网址生成网站完整源码

使用此源码可以生成QQ自动跳转到浏览器的短链接&#xff0c;无视QQ报毒&#xff0c;任意网址均可生成。 全新界面&#xff0c;网站背景图采用Bing随机壁纸 支持生成多种短链接 兼容电脑和手机页面 生成网址记录功能&#xff0c;域名黑名单功能 网站后台可管理数据 安装说明&am…

Linux 不同架构、不同系统的问题

文章目录 一、麒麟V10&#xff08;kylin&#xff09;操作系统中&#xff0c;sudo执行程序后&#xff0c;其环境变量依然为用户家目录。&#xff08;1&#xff09;背景&#xff08;2&#xff09;原因&#xff08;3&#xff09;解决办法 二、统信&#xff08;UOS&#xff09;操作…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

Unity Shader - sahder变体剔除

文章目录 吐槽优化方案 - 目前最靠谱的方式shadercsharp 吐槽 我之所以单独写这边文章&#xff0c;是因为之前写的一篇&#xff1a; Unity Shader - Built-in管线下优化变体&#xff0c;编辑后&#xff0c;无法保存&#xff0c;一直提示&#xff1a;操作超时。 等了差不多 3…

BUUCTF crypto做题记录(10)新手向

一、[MRCTF2020]古典密码知多少 这题一看首先能想到猪圈密码&#xff0c;每种颜色都代表一种古典密码。鉴于都是用图形表示&#xff0c;其余两种与猪圈密码类似。BUUCTF-Crypto-猪圈密码及其变种银河密码跳舞的小人_猪圈密码对照表-CSDN博客 在这篇文章中介绍一些与猪圈密码类…

3D生成式AI模型与工具

当谈到技术炒作时&#xff0c;人工智能正在超越虚拟世界&#xff0c;吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界&#xff0c;至少在某种意义上&#xff1a;资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 AI 3D生成使用人工智能生成3D模…

vscode连接服务器与FileZilla上传到服务器

https://www.cnblogs.com/qiuhlee/p/17729647.html&#xff08;这个是vscode连接服务器&#xff09; 主机&#xff1a;就是服务器的主机号 使用者名称&#xff1a;比如ALmax的用户名 密码&#xff1a;比如ALmax的密码

hcia datacom课程学习(1):通信基础

1.总体框架 上图为发送方通过互联网传递信息给接收方的过程。 家用路由器会直接集成上图中的四层&#xff08;vlan&#xff0c;DHCP&#xff0c;静态路由&#xff0c;NAT&#xff0c;PPPoE&#xff09;。 2.网络性能指标 &#xff08;1&#xff09;带宽 单位时间内传输的数…

计算机操作系统(慕课版)第二章学习笔记

第二章学习笔记 1.1 前趋图描述程序执行 前趋图&#xff1a;用于描述程序执行先后顺序 定义&#xff1a;一个有向无循环图&#xff0c;是一个二元组&#xff0c;由结点的集合和有向边组成。其中&#xff1a; 结点&#xff1a;表示一条语句、一个程序段或一个进程 有向边&#x…

Ps:索引颜色模式

Ps菜单&#xff1a;图像/模式/索引颜色 Image/Mode/Indexed Color 索引颜色 Indexed Color模式可生成最多 256 种颜色的 8 位图像文件。 这种颜色的限制使得索引颜色模式的图像文件相比于全彩图像&#xff08;如 RGB 颜色模式下的图像&#xff09;具有更小的文件大小&#xff0…

ConvNext学习

参考&#xff1a; [1] LIU Z, MAO H, WU C Y, et al. A ConvNet for the 2020s[C/OL]//2022 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), New Orleans, LA, USA. 2022. http://dx.doi.org/10.1109/cvpr52688.2022.01167. DOI:10.1109/cvpr52688.2…

更换个人开发环境后,pycharm连接服务器报错Authentication failed

原因&#xff1a;服务器中更换个人开发环境后&#xff0c;密码变了。 解决&#xff1a;在pycharm中修改服务器开发环境密码即可。 1 找到Tools-Depolyment-Configuration 2 点击SSH Configuration后的省略号 3 修改这里面的Password即可

Spring Web 参数验证常见错误

参数检验是我们在 Web 编程时经常使用的技术之一&#xff0c;它帮助我们完成请求的合法性校验&#xff0c;可以有效拦截无效请求&#xff0c;从而达到节省系统资源、保护系统的目的。 相比较其他 Spring 技术&#xff0c;Spring 提供的参数检验功能具有独立性强、使用难度不高…

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

如何避免在绩效考核评分时“脸盲”

对于大型企业来说&#xff0c;如何保证在绩效考核评分时准确快速地回忆起员工的日常表现&#xff0c;已经成为困扰管理者的难题。由于大型企业员工数量众多且业务模块繁杂&#xff0c;公司领导很难对每个员工的工作情况都了如指掌。这导致在绩效考核评分时&#xff0c;公司领导…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived&#xff08;高可用性服务&#xff09;1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

网安入门18-XSS(靶场实战)

HTML实体化编码 为了避免 XSS 攻击&#xff0c;会将<>编码为<与>&#xff0c;这些就是 HTML 实体编码。 编码前编码后不可分的空格 < (小于符号)< > (大于符号)> & (与符号)&amp;″ (双引号)&quot;’ (单引号)&apos;© (版权符…