ScriptToolModel.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.ComponentModel;
  3. namespace Plugins.Script.Models
  4. {
  5. /// <summary>
  6. /// 脚本工具节点模型:承载用户的完整 C# 代码,序列化进 .aas 流程文件。
  7. /// 用户代码是一个完整的插件类(约定:继承 BasePlugin&lt;ScriptToolModel&gt; 的类为入口,含 PluginRun/DeclareOutputs),
  8. /// 由宿主 ScriptToolPlugin 编译后注入 Model/Context/Registry 并委托执行——脚本因此拥有普通插件的全部能力。
  9. /// </summary>
  10. [Serializable]
  11. public class ScriptToolModel : TeamAAS.FlowEditor.Plugins.BasePluginModel
  12. {
  13. /// <summary>用户的完整 C# 代码(自由编写命名空间/多个类/方法;至少含一个继承 BasePlugin&lt;ScriptToolModel&gt; 的入口类)。</summary>
  14. [Browsable(false)]
  15. public string Code { get; set; }
  16. public ScriptToolModel()
  17. {
  18. Code = DefaultCode;
  19. }
  20. /// <summary>首次新建节点时的脚手架代码(照 VisionMaster C#脚本 的做法:完整插件类 + 预写好方法,用户想咋改咋改)。</summary>
  21. public const string DefaultCode = @"using System;
  22. using System.Collections.Generic;
  23. using System.Linq;
  24. using System.Threading;
  25. using TeamAAS; // LogLevel
  26. using TeamAAS.Core; // CoreManager
  27. using TeamAAS.Camera; // CameraManager
  28. using TeamAAS.Camera.Images; // GenImage
  29. using TeamAAS.FlowEditor.Plugins; // BasePlugin
  30. using TeamAAS.FlowEditor.Models; // OutputField / NodeRunStatus
  31. using TeamAAS.FlowEngine.FormulaData; // FormulaBound
  32. using Plugins.Script.Models; // ScriptToolModel
  33. // ══════════════════════════════════════════════════════════════════════
  34. // 脚本入口类:继承 BasePlugin<ScriptToolModel> —— 就是一个完整的插件类,
  35. // 拥有和普通插件一模一样的能力:
  36. // 读上游变量: GetValue<T>(FormulaBound) 或 RegistryOrDebug.ResolveFormula(Model.FlowId, ""&{节点.字段}"")
  37. // 取平台服务: Service<CameraManager>() / Context / CoreManager.Camera
  38. // 写插件日志: Log(2, ""..."")
  39. // 节点模型: Model
  40. // 运行时自动查找「继承 BasePlugin<ScriptToolModel> 的类」,注入 Model/Context/Registry 后调用 PluginRun。
  41. // 下面两个方法已写好,随便改;也可以自由增删 using、添加任意多个类/方法。
  42. // ══════════════════════════════════════════════════════════════════════
  43. public class MyScript : BasePlugin<ScriptToolModel>
  44. {
  45. // 声明本节点输出字段(下游节点可按 ""&{本节点.字段名}"" 引用)
  46. public override List<OutputField> DeclareOutputs()
  47. {
  48. return new List<OutputField>
  49. {
  50. new OutputField(""结果"", typeof(object)),
  51. };
  52. }
  53. // 节点执行入口 —— 想咋写咋写
  54. public override NodeRunStatus PluginRun(CancellationToken token, out Dictionary<string, object> results)
  55. {
  56. results = new Dictionary<string, object>();
  57. try
  58. {
  59. // 读上游示例: var img = RegistryOrDebug.ResolveFormula(Model.FlowId, ""&{图像采集.图像}"") as GenImage;
  60. // 取服务示例: var cam = Service<CameraManager>();
  61. Log(2, ""脚本开始执行"");
  62. object result = 1 + 1;
  63. results[""结果""] = result;
  64. return NodeRunStatus.Success;
  65. }
  66. catch (Exception ex)
  67. {
  68. results[""Error""] = ex.Message;
  69. Log(1, ""脚本异常: "" + ex.Message, LogLevel.Error);
  70. return NodeRunStatus.Failed;
  71. }
  72. }
  73. }
  74. ";
  75. }
  76. }