第二届启智杯——节点数据订阅设计
在可视化流程编辑器中,节点之间的数据订阅是必不可少的功能之一。本文章以第二届“启智杯”VM应用开发赛道参赛作品为例讲解一下设计思路。编程语言:C#,应用框架:Winform,.NET8.0。比赛团队:计量组态软件1队。

一、设计思路

  1. 下游节点能够订阅上游节点的数据,首先需要将节点的运行数据存放在一个结果类中,这里我们自定义了一个RunResult的运行结果基类,把VM算子里的运行结果转存到RunResult类中。
  2. 当用户需要订阅的数据时,动态地生成数据菜单项供用户选择。
  3. 在流程运行遇到需要订阅的数据时,根据文字描述的地址找到对应的数据。

二、代码实现

1. RunResult运行结果类设计

public abstract class RunResult { /// <summary> /// 节点的状态,0为正常或运行成功,1为异常或运行失败 /// </summary> [Description("运行状态")] public int NodeStatus { get; set; } /// <summary> /// 显示的信息 /// </summary> public string Msg { get; set; } /// <summary> /// 节点运行时间 /// </summary> public double RunningTime { get; set; } public RunResult() { Msg = string.Empty; } }

其他模块算子运行结果类继承RunResult,以Blob算子为例。

public class BlobRunResult : RunResult { /// <summary> /// Blob个数 /// </summary> [Description("Blob个数")] public int NumBlobs { get; set; } /// <summary> /// Blob信息集 /// </summary> [Description("Blob信息集")] public List<BlobInfo> BlobInfos { get; set; } public BlobRunResult() { NumBlobs = 0; BlobInfos = new(); } }

Description特性的作用:

1、为菜单项提供文本,以便显示属性的描述而不是属性名称

2、作为地址的一部分

举个例子,如下图流程所示,【4条件分支】节点在数据订阅,动态生成的二级菜单项的文本内容就是来自Description特性,一级菜单的文本内容就是节点的名字,如1图像源、2灰度化等。

字符串“3BL查找.Blob个数”作为一个地址,在运行到【4条件分支】节点时,程序根据地址找到对应的节点,即【3BL查找】节点,然后根据“Blob个数”找到与之相对应的Description特性,进而得到想要的数据。

image20240506135537680.png

image20240506135708770.png

2. 动态生成菜单项

思路:每个算法模块都应该根据自己的运行结果生成菜单,最后汇总显示。

单个算法模块的菜单生成

/// <summary> /// 返回由指定类型所组成的菜单 /// </summary> /// <param name="desiredType">期望的类型</param> /// <returns>菜单</returns> public override ToolStripMenuItem GetMenuItem(Type desiredType) { // 一级菜单 ToolStripMenuItem topMenu = new(); topMenu.Text = Text; // 获取BlobRunResult的属性信息 var properties = typeof(BlobRunResult).GetProperties(); // 生成ToolStripMenuItem foreach (var property in properties) { Type propertyType = property.PropertyType; if (propertyType != desiredType) continue; var attributes = property.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes.Length > 0) { // 获取DescriptionAttribute的value作为文本 var text = ((DescriptionAttribute)attributes[0]).Description; // 创建ToolStripMenuItem var menuItem = new ToolStripMenuItem(); menuItem.Text = text; // 添加菜单项 topMenu.DropDownItems.Add(menuItem); } } return topMenu; }

整体菜单的生成

private void tbCondition_Click(object sender, EventArgs e) { ContextMenuStrip contextMenu = new(); // 得到_node节点上游的所有节点 HashSet<Node> nodes = NodeHelper.GetUpstreamNodes(_node); // 指定供用户选择的类型 Type type = typeof(System.Int32); if (cbParamType.SelectedIndex == 0) { type = typeof(System.Int32); } else if (cbParamType.SelectedIndex == 1) { type = typeof(System.Double); } // 遍历上游所有节点,得到它们各自的菜单,然后组成一个大菜单 foreach (Node node in nodes) { ToolStripMenuItem menuItem = node.GetMenuItem(type); menuItem.Width = tbCondition.Width; // 为每个菜单项递归添加点击事件,一级菜单不添加事件 WireUpClickEvent(tbCondition, menuItem); contextMenu.Items.Add(menuItem); } // 显示在tbCondition1的下方,做出类似下拉菜单的效果 contextMenu.Show(tbCondition, new Point(0, tbCondition.Height)); }

3. 利用反射+特性获取运行时数据

public override object? GetRunResultByName(string name) { // name形如“3BL查找.Blob个数” // 点号前面的是节点名,后面的是该节点运行结果类中某个属性的Description特性 string propName = name.Split(".")[1]; // 获取BlobRunResult的属性信息 var properties = typeof(BlobRunResult).GetProperties(); foreach (var property in properties) { var attributes = property.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes.Length > 0) { // 获取DescriptionAttribute的value作为文本 var text = (attributes[0] as DescriptionAttribute).Description; if (text == propName) { return property.GetValue(RunResult); } } } return null; }

三、优点与不足

优点:对于想提供给用户订阅的数据,只需在某个属性上加Description特性即可,简单方便。生成菜单与获取数据都是动态完成,无需额外编码。

不足:目前只支持到二级菜单,对于复杂类型的变量需要额外处理。

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

第二届启智杯-小样本计数算法

下一篇

第二届启智杯--能实现标准件检测的双目视觉系统设计

评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
1
创作
0
获赞
所属专题
  • 探寻机器视觉新星|第二届“启智杯”机器视觉设计大赛获奖名单公布
  • 第二届启智杯-666队
  • 第二届启智杯——光伏电池片质检方案设计
  • 第二届启智杯应用类-光伏电池片质检视觉方案设计
  • 第二届启智杯—光伏电池片质检视觉方案设计-我恨月亮队
  • 第二届启智杯-光伏电池片质检视觉方案设计
  • 第二届启智杯—光伏电池片质检视觉方案设计
  • 第二届启智杯——锂电外壳表面缺陷检测的3D视觉方案
  • 第二届启智杯--能实现标准件检测的双目视觉系统设计
  • 第二届启智杯--能实现标准件检测的双目视觉系统设计
  • 第2届“启智杯”设计大赛——一种锂电外壳外观检测3D视觉方案
  • 第二届启智杯-锂电外壳外观检测3D视觉方案设计
  • 第二届启智杯-锂电外壳外观检测3D视觉方案设计
  • 第二届启智杯—锂电外壳外观检测3D视觉方案设计
  • 第二届启智杯-无监督异常检测算法
  • 第二届“启智杯”设计大赛-能实现标准件检测的双目系统设计
  • 第二届启智杯-创意赛道-众智队-能实现标准件检测的双目视觉系统设计
  • 第二届启智杯--能实现标准件检测的双目视觉系统设计
  • 第二届“启智杯”设计大赛-能实现标准件检测的双目系统设计
  • 第二届启智杯--能实现标准件检测的双目视觉系统设计
  • 第二届“启智杯”可视化流程编辑器-基于坐标变换实现整体框架
  • 第二届启智杯-一个可视化流程编辑器
  • 第二届启智杯-一种可视化流程编辑器
  • 第二届启智杯——节点数据订阅设计
  • 第二届启智杯-无监督异常检测算法
  • 《第二届启智杯-试一试队-算法赛道-无监督异常检测算法》
  • 第二届启智杯-小样本计数算法
  • 第二届启智杯-小样本计数-新疆核桃小队
  • 第二届启智杯-小样本计数-海康正式员工队
相关阅读
  • VM4.4更新亮点
    2024-04-12 浏览 0
  • 第二届启智杯—光伏电池片质检视觉方案设计
    2024-04-15 浏览 0
  • 第二届启智杯-锂电外壳外观检测3D视觉方案设计
    2024-04-15 浏览 0
  • 第二届启智杯-无监督异常检测算法
    2024-04-16 浏览 0
  • 双车联动调试案例-华工中试基地
    2024-04-28 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器