using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using Cognex.VisionPro;
using PropertyGridLib.Attributes;
using PropertyGridLib.Controls;
using TeamAAS.FlowEditor.Execution;
using TeamAAS.FlowEditor.Models;
using TeamAAS.FlowEditor.Plugins;
using TeamAAS.FlowEngine.FormulaData;
using TeamAAS.Vision;
namespace Plugins.Vpp
{
// ─────────────────────────────────────────────────────────────────────
// VPP(VisionPro)流程容器 —— 镜像 HalconFlowPlugin 的"平台子流程"模式:
// 主流程拖一个「VPP流程」容器节点,双击进入 VPP 专用子流程编辑器(工具箱只显
// Vpp模块 的算子),配置输入/输出映射后循环执行子图。
// ─────────────────────────────────────────────────────────────────────
///
/// VPP 编辑预览挂接点:容器节点运行前开启新一轮运行批次(换 RunStamp + 清图层总线,
/// 只保留当前运行的图层),Vp 算子节点运行后发布图层,VPP 流程编辑器右侧大显示窗消费。
///
public static class VppEditorPreview
{
private static long _runSeq;
/// 当前运行批次号(同批次重复发布=整体替换)。
public static string RunStamp { get; private set; } = "0";
/// 容器节点新一轮运行开始:批次号+1 并清空图层总线。
public static void BeginRunCycle()
{
_runSeq++;
RunStamp = _runSeq.ToString();
VisionLayerStore.Instance.ClearAll();
}
///
/// 发布工具的【运行记录】为图层集 —— 镜像 VisionPro 原生下拉的体验:
/// 一条记录一个图层(InputImage/Histogram/BlobImage/BlobImageUnfiltered...),
/// 图层内容就是 ICogRecord 本身,编辑器选中后交给 Cognex 原生显示控件渲染
/// (图像与图形叠加按 VisionPro 的方式原样呈现)。
/// 返回:图层名 → 记录对象(保持树序;供节点作为输出往下游传递 + 模型学习图层清单)。
///
public static Dictionary ShowRecord(BasePluginModel model, object rootRecord, string preferredLayer = null)
{
var layerContents = new Dictionary(StringComparer.OrdinalIgnoreCase);
if (model == null || rootRecord == null) return layerContents;
try
{
var args = new LayerPublishArgs
{
FlowId = model.FlowId,
NodeName = model.NodeName,
RunStamp = RunStamp,
PreferredLayer = string.IsNullOrWhiteSpace(preferredLayer) ? null : preferredLayer,
};
var seen = new HashSet