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