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 兜底解析)。 // ───────────────────────────────────────────────────────────────────── /// /// Halcon 流程容器节点模型。镜像 GroupPluginModel:持有一张子流程图 , /// 支持把主流程前序节点的输出(尤其是图像)映射进来,并把子流程结果映射回主流程。 /// 子流程内部的节点是 HALCON 专用节点(按 VisionPlugin 分类),不含主流程节点。 /// [Serializable] public class HalconFlowModel : BasePluginModel { [Category("I.参数")] [DisplayName("1.输入参数")] [Description("把主流程前序节点的输出映射进来(图像通常映射为「图像」);子流程内部节点用 &{输入.变量名} 引用")] [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)] public List ModuleInputs { get; set; } = new List(); [Category("I.参数")] [DisplayName("2.输出参数")] [Description("把子流程内部节点的结果映射回主流程(如测量值、OK/NG、处理后的图像)")] [CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)] public List ModuleOutputs { get; set; } = new List(); 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 }; } } /// 容器输入映射项:主流程来源值 → 子流程内 &{输入.InputName}。 [Serializable] public class HalconInput { public HalconInput() { SourceValue = new FormulaBound(); } [Category("输入参数")] [DisplayName("变量名")] [Description("自定义变量名,内部节点通过 &{输入.变量名} 引用(图像一般命名为「图像」)")] public string InputName { get; set; } = "图像"; [Category("输入参数")] [DisplayName("来源值")] [Description("从主流程前序节点的输出结果中选择(运行时自动读取最新值)")] [FormulaEditor(typeof(InputSourceDataProvider))] public FormulaBound SourceValue { get; set; } public override string ToString() => InputName; } /// 容器输出映射项:子流程内 &{节点名.属性名} → 主流程 OutName。 [Serializable] public class HalconOutput { public HalconOutput() { OutValue = new FormulaBound(); } 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 OutValue { get; set; } public override string ToString() => OutName; } }