using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using PropertyGridLib.Attributes; using PropertyGridLib.Controls; using System; using System.Collections.Generic; using System.ComponentModel; using TeamAAS.FlowEditor.Plugins; using TeamAAS.FlowEngine.FormulaData; namespace Plugins.Vpp.Models { [Serializable] public class VppToolBlockModel : BasePluginModel { [Category("I.参数")] [DisplayName("1.输入参数映射")] [Description("将主流程前序节点的输出映射到 VPP ToolBlock 的输入终端。Key 必须与 ToolBlock 内输入名一致。")] public List InputMappings { get; set; } = new List(); [Browsable(false)] public CogToolBlock ToolBlock { get; set; } /// /// 上次运行学习到的「输出图层」数量(RunRecord.SubRecords.Count)。 /// 图层数量取决于工具块内部工具,只有运行后才知道;此处持久化快照, /// 使 在跑之前就能声明 输出图层N,被下游绑定树索引。 /// [Browsable(false)] public int LastLayerCount { get; set; } = 0; // ── 高级编辑(属性面板按钮) ── // PropertyGridLib v1.1.2 [Button]:属性面板渲染按钮,点击反射调用 OpenAdvancedEditor。 // 宿主在承载该模型时把 AdvancedEditorLauncher 指到原生 VisionPro 工具块编辑入口 // (CogToolBlockEditorV2 等);未注入时按钮点击无副作用。双击节点打开自定义视图的原路径保持不变。 [NonSerialized] public Action AdvancedEditorLauncher; [Category("II.高级编辑")] [DisplayName("1.打开 VPP 工具编辑")] [Description("打开 Cognex VisionPro 原生工具块编辑器(与双击节点等效)")] [Button("打开 VPP 工具编辑", nameof(OpenAdvancedEditor))] public object AdvancedEditButton { get; set; } public void OpenAdvancedEditor() { var launch = AdvancedEditorLauncher; if (launch != null) launch(); } public VppToolBlockModel() { ToolBlock = new CogToolBlock(); } } [Serializable] public class VppInputMapping { public VppInputMapping() { Source = new FormulaBound(); } [Category("输入映射")] [DisplayName("输入名")] [Description("必须与 VPP ToolBlock 里定义的输入终端名完全一致")] public string InputName { get; set; } = ""; [Category("输入映射")] [DisplayName("来源值")] [Description("从主流程前序节点的输出结果中选择")] [FormulaEditor(typeof(InputSourceDataProvider))] public FormulaBound Source { get; set; } public override string ToString() => $"{InputName} ← {Source?.Formula ?? ""}"; } }