using System; using System.ComponentModel; namespace Plugins.Script.Models { /// /// 脚本工具节点模型:承载用户的完整 C# 代码,序列化进 .aas 流程文件。 /// 用户代码是一个完整的插件类(约定:继承 BasePlugin<ScriptToolModel> 的类为入口,含 PluginRun/DeclareOutputs), /// 由宿主 ScriptToolPlugin 编译后注入 Model/Context/Registry 并委托执行——脚本因此拥有普通插件的全部能力。 /// [Serializable] public class ScriptToolModel : TeamAAS.FlowEditor.Plugins.BasePluginModel { /// 用户的完整 C# 代码(自由编写命名空间/多个类/方法;至少含一个继承 BasePlugin<ScriptToolModel> 的入口类)。 [Browsable(false)] public string Code { get; set; } public ScriptToolModel() { Code = DefaultCode; } /// 首次新建节点时的脚手架代码(照 VisionMaster C#脚本 的做法:完整插件类 + 预写好方法,用户想咋改咋改)。 public const string DefaultCode = @"using System; using System.Collections.Generic; using System.Linq; using System.Threading; using TeamAAS; // LogLevel using TeamAAS.Core; // CoreManager using TeamAAS.Camera; // CameraManager using TeamAAS.Camera.Images; // GenImage using TeamAAS.FlowEditor.Plugins; // BasePlugin using TeamAAS.FlowEditor.Models; // OutputField / NodeRunStatus using TeamAAS.FlowEngine.FormulaData; // FormulaBound using Plugins.Script.Models; // ScriptToolModel // ══════════════════════════════════════════════════════════════════════ // 脚本入口类:继承 BasePlugin —— 就是一个完整的插件类, // 拥有和普通插件一模一样的能力: // 读上游变量: GetValue(FormulaBound) 或 RegistryOrDebug.ResolveFormula(Model.FlowId, ""&{节点.字段}"") // 取平台服务: Service() / Context / CoreManager.Camera // 写插件日志: Log(2, ""..."") // 节点模型: Model // 运行时自动查找「继承 BasePlugin 的类」,注入 Model/Context/Registry 后调用 PluginRun。 // 下面两个方法已写好,随便改;也可以自由增删 using、添加任意多个类/方法。 // ══════════════════════════════════════════════════════════════════════ public class MyScript : BasePlugin { // 声明本节点输出字段(下游节点可按 ""&{本节点.字段名}"" 引用) public override List DeclareOutputs() { return new List { new OutputField(""结果"", typeof(object)), }; } // 节点执行入口 —— 想咋写咋写 public override NodeRunStatus PluginRun(CancellationToken token, out Dictionary results) { results = new Dictionary(); try { // 读上游示例: var img = RegistryOrDebug.ResolveFormula(Model.FlowId, ""&{图像采集.图像}"") as GenImage; // 取服务示例: var cam = Service(); Log(2, ""脚本开始执行""); object result = 1 + 1; results[""结果""] = result; return NodeRunStatus.Success; } catch (Exception ex) { results[""Error""] = ex.Message; Log(1, ""脚本异常: "" + ex.Message, LogLevel.Error); return NodeRunStatus.Failed; } } } "; } }