| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- using PropertyGridLib.Attributes;
- using PropertyGridLib.Controls;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using TeamAAS.FlowEditor.Models;
- using TeamAAS.FlowEditor.Plugins;
- using TeamAAS.FlowEngine.FormulaData;
- namespace Plugins.Halcon.Models
- {
- // ─────────────────────────────────────────────────────────────────────
- // 容器节点模型(Halcon 流程)—— 留在主程序集。
- // 各分类算子的模型已随算子迁移到 Halcon\ 下对应分类工程
- // (类型全名不变,旧流程经 FlowSerializationBinder 兜底解析)。
- // ─────────────────────────────────────────────────────────────────────
- /// <summary>
- /// Halcon 流程容器节点模型。镜像 GroupPluginModel:持有一张子流程图 <see cref="SubGraph"/>,
- /// 支持把主流程前序节点的输出(尤其是图像)映射进来,并把子流程结果映射回主流程。
- /// 子流程内部的节点是 HALCON 专用节点(按 VisionPlugin 分类),不含主流程节点。
- /// </summary>
- [Serializable]
- public class HalconFlowModel : BasePluginModel
- {
- [Category("I.参数")]
- [DisplayName("1.输入参数")]
- [Description("把主流程前序节点的输出映射进来(图像通常映射为「图像」);子流程内部节点用 &{输入.变量名} 引用")]
- [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
- public List<HalconInput> ModuleInputs { get; set; } = new List<HalconInput>();
- [Category("I.参数")]
- [DisplayName("2.输出参数")]
- [Description("把子流程内部节点的结果映射回主流程(如测量值、OK/NG、处理后的图像)")]
- [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
- public List<HalconOutput> ModuleOutputs { get; set; } = new List<HalconOutput>();
- private int _loopCount = 1;
- [Category("II.循环设置")]
- [DisplayName("1.循环次数")]
- [Description("循环次数。-1=无限循环, 0=跳过不执行, 其他=按次数执行")]
- public int LoopCount
- {
- get => _loopCount;
- set => _loopCount = value;
- }
- [Browsable(false)]
- public FlowGraph SubGraph { get; set; }
- [Browsable(false)]
- public bool IsBreakRequested { get; set; } = false;
- public void EnsureSubGraph()
- {
- if (SubGraph == null)
- SubGraph = new FlowGraph { GraphName = ToolName ?? "Halcon流程", GraphId = NodeId };
- }
- }
- /// <summary>容器输入映射项:主流程来源值 → 子流程内 &{输入.InputName}。</summary>
- [Serializable]
- public class HalconInput
- {
- public HalconInput()
- {
- SourceValue = new FormulaBound<object>();
- }
- [Category("输入参数")]
- [DisplayName("变量名")]
- [Description("自定义变量名,内部节点通过 &{输入.变量名} 引用(图像一般命名为「图像」)")]
- public string InputName { get; set; } = "图像";
- [Category("输入参数")]
- [DisplayName("来源值")]
- [Description("从主流程前序节点的输出结果中选择(运行时自动读取最新值)")]
- [FormulaEditor(typeof(InputSourceDataProvider))]
- public FormulaBound<object> SourceValue { get; set; }
- public override string ToString() => InputName;
- }
- /// <summary>容器输出映射项:子流程内 &{节点名.属性名} → 主流程 OutName。</summary>
- [Serializable]
- public class HalconOutput
- {
- public HalconOutput()
- {
- OutValue = new FormulaBound<object>();
- }
- private string _outName = string.Empty;
- [Category("输出参数")]
- [DisplayName("参数名")]
- [Description("输出到主流程的参数名(下游节点据此绑定)")]
- public string OutName
- {
- get => _outName;
- set => _outName = value;
- }
- [Category("输出参数")]
- [DisplayName("参数值")]
- [Description("从子流程内部节点的输出中选择(如 &{阈值分割1.区域}、&{区域特征1.面积})")]
- [FormulaEditor(typeof(PluginDataProvider))]
- public FormulaBound<object> OutValue { get; set; }
- public override string ToString() => OutName;
- }
- }
|