HalconModels.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using PropertyGridLib.Attributes;
  2. using PropertyGridLib.Controls;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using TeamAAS.FlowEditor.Models;
  7. using TeamAAS.FlowEditor.Plugins;
  8. using TeamAAS.FlowEngine.FormulaData;
  9. namespace Plugins.Halcon.Models
  10. {
  11. // ─────────────────────────────────────────────────────────────────────
  12. // 容器节点模型(Halcon 流程)—— 留在主程序集。
  13. // 各分类算子的模型已随算子迁移到 Halcon\ 下对应分类工程
  14. // (类型全名不变,旧流程经 FlowSerializationBinder 兜底解析)。
  15. // ─────────────────────────────────────────────────────────────────────
  16. /// <summary>
  17. /// Halcon 流程容器节点模型。镜像 GroupPluginModel:持有一张子流程图 <see cref="SubGraph"/>,
  18. /// 支持把主流程前序节点的输出(尤其是图像)映射进来,并把子流程结果映射回主流程。
  19. /// 子流程内部的节点是 HALCON 专用节点(按 VisionPlugin 分类),不含主流程节点。
  20. /// </summary>
  21. [Serializable]
  22. public class HalconFlowModel : BasePluginModel
  23. {
  24. [Category("I.参数")]
  25. [DisplayName("1.输入参数")]
  26. [Description("把主流程前序节点的输出映射进来(图像通常映射为「图像」);子流程内部节点用 &{输入.变量名} 引用")]
  27. [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
  28. public List<HalconInput> ModuleInputs { get; set; } = new List<HalconInput>();
  29. [Category("I.参数")]
  30. [DisplayName("2.输出参数")]
  31. [Description("把子流程内部节点的结果映射回主流程(如测量值、OK/NG、处理后的图像)")]
  32. [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
  33. public List<HalconOutput> ModuleOutputs { get; set; } = new List<HalconOutput>();
  34. private int _loopCount = 1;
  35. [Category("II.循环设置")]
  36. [DisplayName("1.循环次数")]
  37. [Description("循环次数。-1=无限循环, 0=跳过不执行, 其他=按次数执行")]
  38. public int LoopCount
  39. {
  40. get => _loopCount;
  41. set => _loopCount = value;
  42. }
  43. [Browsable(false)]
  44. public FlowGraph SubGraph { get; set; }
  45. [Browsable(false)]
  46. public bool IsBreakRequested { get; set; } = false;
  47. public void EnsureSubGraph()
  48. {
  49. if (SubGraph == null)
  50. SubGraph = new FlowGraph { GraphName = ToolName ?? "Halcon流程", GraphId = NodeId };
  51. }
  52. }
  53. /// <summary>容器输入映射项:主流程来源值 → 子流程内 &amp;{输入.InputName}。</summary>
  54. [Serializable]
  55. public class HalconInput
  56. {
  57. public HalconInput()
  58. {
  59. SourceValue = new FormulaBound<object>();
  60. }
  61. [Category("输入参数")]
  62. [DisplayName("变量名")]
  63. [Description("自定义变量名,内部节点通过 &{输入.变量名} 引用(图像一般命名为「图像」)")]
  64. public string InputName { get; set; } = "图像";
  65. [Category("输入参数")]
  66. [DisplayName("来源值")]
  67. [Description("从主流程前序节点的输出结果中选择(运行时自动读取最新值)")]
  68. [FormulaEditor(typeof(InputSourceDataProvider))]
  69. public FormulaBound<object> SourceValue { get; set; }
  70. public override string ToString() => InputName;
  71. }
  72. /// <summary>容器输出映射项:子流程内 &amp;{节点名.属性名} → 主流程 OutName。</summary>
  73. [Serializable]
  74. public class HalconOutput
  75. {
  76. public HalconOutput()
  77. {
  78. OutValue = new FormulaBound<object>();
  79. }
  80. private string _outName = string.Empty;
  81. [Category("输出参数")]
  82. [DisplayName("参数名")]
  83. [Description("输出到主流程的参数名(下游节点据此绑定)")]
  84. public string OutName
  85. {
  86. get => _outName;
  87. set => _outName = value;
  88. }
  89. [Category("输出参数")]
  90. [DisplayName("参数值")]
  91. [Description("从子流程内部节点的输出中选择(如 &{阈值分割1.区域}、&{区域特征1.面积})")]
  92. [FormulaEditor(typeof(PluginDataProvider))]
  93. public FormulaBound<object> OutValue { get; set; }
  94. public override string ToString() => OutName;
  95. }
  96. }