VppModels.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Cognex.VisionPro;
  2. using Cognex.VisionPro.ToolBlock;
  3. using PropertyGridLib.Attributes;
  4. using PropertyGridLib.Controls;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using TeamAAS.FlowEditor.Plugins;
  9. using TeamAAS.FlowEngine.FormulaData;
  10. namespace Plugins.Vpp.Models
  11. {
  12. [Serializable]
  13. public class VppToolBlockModel : BasePluginModel
  14. {
  15. [Category("I.参数")]
  16. [DisplayName("1.输入参数映射")]
  17. [Description("将主流程前序节点的输出映射到 VPP ToolBlock 的输入终端。Key 必须与 ToolBlock 内输入名一致。")]
  18. public List<VppInputMapping> InputMappings { get; set; } = new List<VppInputMapping>();
  19. [Browsable(false)]
  20. public CogToolBlock ToolBlock { get; set; }
  21. /// <summary>
  22. /// 上次运行学习到的「输出图层」数量(RunRecord.SubRecords.Count)。
  23. /// 图层数量取决于工具块内部工具,只有运行后才知道;此处持久化快照,
  24. /// 使 <see cref="VppToolBlockPlugin.DeclareOutputs"/> 在跑之前就能声明 输出图层N,被下游绑定树索引。
  25. /// </summary>
  26. [Browsable(false)]
  27. public int LastLayerCount { get; set; } = 0;
  28. // ── 高级编辑(属性面板按钮) ──
  29. // PropertyGridLib v1.1.2 [Button]:属性面板渲染按钮,点击反射调用 OpenAdvancedEditor。
  30. // 宿主在承载该模型时把 AdvancedEditorLauncher 指到原生 VisionPro 工具块编辑入口
  31. // (CogToolBlockEditorV2 等);未注入时按钮点击无副作用。双击节点打开自定义视图的原路径保持不变。
  32. [NonSerialized]
  33. public Action AdvancedEditorLauncher;
  34. [Category("II.高级编辑")]
  35. [DisplayName("1.打开 VPP 工具编辑")]
  36. [Description("打开 Cognex VisionPro 原生工具块编辑器(与双击节点等效)")]
  37. [Button("打开 VPP 工具编辑", nameof(OpenAdvancedEditor))]
  38. public object AdvancedEditButton { get; set; }
  39. public void OpenAdvancedEditor()
  40. {
  41. var launch = AdvancedEditorLauncher;
  42. if (launch != null) launch();
  43. }
  44. public VppToolBlockModel()
  45. {
  46. ToolBlock = new CogToolBlock();
  47. }
  48. }
  49. [Serializable]
  50. public class VppInputMapping
  51. {
  52. public VppInputMapping()
  53. {
  54. Source = new FormulaBound<object>();
  55. }
  56. [Category("输入映射")]
  57. [DisplayName("输入名")]
  58. [Description("必须与 VPP ToolBlock 里定义的输入终端名完全一致")]
  59. public string InputName { get; set; } = "";
  60. [Category("输入映射")]
  61. [DisplayName("来源值")]
  62. [Description("从主流程前序节点的输出结果中选择")]
  63. [FormulaEditor(typeof(InputSourceDataProvider))]
  64. public FormulaBound<object> Source { get; set; }
  65. public override string ToString() => $"{InputName} ← {Source?.Formula ?? ""}";
  66. }
  67. }