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;
}
}
}
";
}
}