LayerComboHelper.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace TeamAAS.Vision
  5. {
  6. /// <summary>图层筛选下拉条目:NodeName=null 表示「最新运行」;LayerName=null 表示该节点全部图层。</summary>
  7. public sealed class LayerComboEntry
  8. {
  9. /// <summary>节点名;null=「最新运行」条目。</summary>
  10. public string NodeName { get; set; }
  11. /// <summary>图层名;null=节点级条目(底图+全部叠加)。</summary>
  12. public string LayerName { get; set; }
  13. /// <summary>下拉显示文本。</summary>
  14. public string Display { get; set; }
  15. public override string ToString() => Display;
  16. }
  17. /// <summary>
  18. /// 图层筛选条目构建与显示解析(Halcon/Vpp/Vm 三平台编辑器共用)。
  19. /// 显示语义:
  20. /// - 「最新运行」= 最后一次发布的完整图层集(底图+全部叠加);
  21. /// - 节点级条目 = 该节点底图 + 全部叠加;
  22. /// - 图层级条目 = 图像层单独显示;区域/轮廓等叠加层 **自动附带该节点底图**(原图信息),
  23. /// 用户看到的不是一块孤立的区域,而是"原图上的高亮区域",直观可理解。
  24. /// </summary>
  25. public static class LayerComboHelper
  26. {
  27. /// <summary>按图层发布记录构建下拉条目:[最新运行] + 每节点(全部图层)+ 每图层。
  28. /// source 为空时按 flowId 从图层库取;显式传入可做跨流程兜底展示。</summary>
  29. public static List<LayerComboEntry> BuildEntries(string flowId, List<LayerPublishArgs> source = null)
  30. {
  31. var entries = new List<LayerComboEntry>
  32. {
  33. new LayerComboEntry { Display = "最新运行" }
  34. };
  35. foreach (var args in source ?? VisionLayerStore.Instance.GetFlowLayers(flowId ?? ""))
  36. {
  37. if (string.IsNullOrEmpty(args?.NodeName)) continue;
  38. entries.Add(new LayerComboEntry { NodeName = args.NodeName, Display = args.NodeName });
  39. foreach (var layer in args.Layers)
  40. {
  41. if (layer == null || string.IsNullOrEmpty(layer.Name)) continue;
  42. entries.Add(new LayerComboEntry
  43. {
  44. NodeName = args.NodeName,
  45. LayerName = layer.Name,
  46. Display = " └ " + layer.Name,
  47. });
  48. }
  49. }
  50. return entries;
  51. }
  52. /// <summary>
  53. /// 解析要显示的图层集:layerName 为空=全部;图像层=仅该图;
  54. /// 非图像层=该节点底图(首个图像层)+ 该层叠加;节点没发过底图时回退到
  55. /// 全流程最近发布的图像层(区域类节点"附带原图"显示,不再黑底孤立区域)。
  56. /// </summary>
  57. /// <param name="flowId">流程 Id(用于底图回退;传 null 关闭回退)。</param>
  58. public static List<LayerItem> ResolveLayers(LayerPublishArgs args, string layerName, string flowId = null)
  59. {
  60. var result = new List<LayerItem>();
  61. if (args?.Layers == null || args.Layers.Count == 0) return result;
  62. if (string.IsNullOrEmpty(layerName))
  63. {
  64. var all = args.Layers.Where(l => l != null).ToList();
  65. if (!all.Any(l => l.Kind == LayerKind.Image && l.Content != null) && flowId != null)
  66. {
  67. var fallback = FindLatestImageLayer(flowId, args.NodeName);
  68. if (fallback != null) all.Insert(0, fallback);
  69. }
  70. return all;
  71. }
  72. var layer = args.Layers.FirstOrDefault(l =>
  73. l != null && string.Equals(l.Name, layerName, StringComparison.OrdinalIgnoreCase));
  74. if (layer == null) return result;
  75. if (layer.Kind == LayerKind.Image)
  76. {
  77. result.Add(layer);
  78. return result;
  79. }
  80. var baseImage = args.Layers.FirstOrDefault(l =>
  81. l != null && l.Kind == LayerKind.Image && l.Content != null);
  82. if (baseImage == null && flowId != null)
  83. baseImage = FindLatestImageLayer(flowId, args.NodeName);
  84. if (baseImage != null) result.Add(baseImage);
  85. result.Add(layer);
  86. return result;
  87. }
  88. /// <summary>在全流程的发布记录里找最近一次的图像层(从后往前;排除指定节点)。</summary>
  89. public static LayerItem FindLatestImageLayer(string flowId, string excludeNode = null)
  90. {
  91. var all = VisionLayerStore.Instance.GetFlowLayers(flowId ?? "");
  92. for (int i = all.Count - 1; i >= 0; i--)
  93. {
  94. if (string.Equals(all[i]?.NodeName, excludeNode, StringComparison.OrdinalIgnoreCase)) continue;
  95. var img = all[i]?.Layers?.FirstOrDefault(l => l != null && l.Kind == LayerKind.Image && l.Content != null);
  96. if (img != null) return img;
  97. }
  98. return null;
  99. }
  100. }
  101. }