using System;
using System.Collections.Generic;
namespace TeamAAS.Vision
{
/// 图层内容类型(决定显示控件如何渲染)。
public enum LayerKind
{
/// 底图(图像)。
Image = 0,
/// 区域(Region)。
Region = 1,
/// 轮廓/边界(XLD 等)。
Contour = 2,
/// 几何对象(矩形/圆/线等,由各平台自行解释)。
Geometry = 3,
/// 文字/标注。
Text = 4,
/// 其他(平台自定义)。
Other = 99,
}
///
/// 一个图层项:视觉节点运行后产出的可显示对象。
/// 为平台对象(HObject / GenImage / Vm 对象等),所有权由 标记:
/// Owned=true 表示该对象由图层库创建(图层被淘汰时负责释放);false 表示归流程注册表所有,图层只引用不释放。
///
public sealed class LayerItem
{
/// 图层显示名(ComboBox 里显示的文案,如 “H阈值分割.区域”)。
public string Name { get; set; }
/// 图层类型。
public LayerKind Kind { get; set; }
/// 平台显示对象。
public object Content { get; set; }
/// 是否为图层库自有对象(淘汰时需要释放)。
public bool Owned { get; set; }
/// 建议颜色(如 "red"/"#FF0000"),null 用显示控件默认。
public string Color { get; set; }
public LayerItem() { }
public LayerItem(string name, LayerKind kind, object content, bool owned = false, string color = null)
{
Name = name; Kind = kind; Content = content; Owned = owned; Color = color;
}
}
/// 一次发布 = 某节点一次运行的完整图层集(整体替换,不做增量叠加,避免内存堆积)。
public sealed class LayerPublishArgs
{
/// 流程 Id(子流程用子图 GraphId)。
public string FlowId { get; set; }
/// 节点名(DisplayName)。
public string NodeName { get; set; }
/// 节点显示名(与 NodeName 相同,冗余给 UI 绑定用)。
public string NodeDisplay => NodeName;
/// 运行批次号(同批次整体替换旧图层;跨批次自动淘汰)。
public string RunStamp { get; set; }
///
/// 发布方推荐的显示图层(节点属性「输出图层」里配置的那一项)。
/// 显示端在"节点级/最新运行"视图下优先显示它;null=用发布方默认(根记录/底图)。
///
public string PreferredLayer { get; set; }
/// 本批次图层(顺序 = 叠加顺序;[0] 通常是底图/根记录)。
public List Layers { get; } = new List();
}
///
/// 视觉图层发布器契约:节点运行后把自己的渲染图层发布进来;显示端(编辑器大预览窗/主页画面)订阅消费。
/// 三平台(Halcon/Vm/Vpp)共用同一契约,显示控件按 LayerKind + 平台自行解释 Content。
///
public interface ILayerPublisher
{
/// 发布一个节点的图层集(整体替换该节点当前批次的图层;后台线程调用安全)。
void Publish(LayerPublishArgs args);
/// 清除指定流程(或节点,nodeName 为 null 时全流程)的所有图层并释放 owned 对象。
void Clear(string flowId, string nodeName = null);
}
}