二次开发 SDK(C#)
ToolBank 对外提供一套 C# 二次开发 API,封装在单 DLL MainUI.ToolBank.ClientSdk(命名空间 ToolBank.Sdk)中:你可以让自己的程序驱动 ToolBank 运行 Job、读写变量、查询程序结构,把 ToolBank 当作一个“视觉处理引擎”嵌入到自己的系统里。
三条 API 线
入口是单例 ToolBankSdk.Instance,按能力分三条线,各管各的职责:
| 线 | 定位 | 典型能力 |
|---|---|---|
| A 线 · 程序执行 | 驱动运行 | 运行全部 / 单 Job / 算子区间 / 单步;重复运行 N 次并在每轮前换参;读各算子执行状态 |
| B 线 · 变量读写 | 数据进出 | 按变量名读写整数 / 浮点 / 字符串 / 点 / 线 / 矩形 / 圆 / 椭圆 / 多边形 / 图像 / 区域掩码 |
| Q 线 · 只读查询 | 摸清结构 | 当前程序路径、Job 结构、变量清单 |
运行约束(重要)
SDK 必须与 ToolBank 运行期同进程、同 AppDomain:它通过在 WPF 可视树中定位宿主控件获取上下文,因此典型形态是:
- 插件内使用:在控件插件 / 宿主扩展里调用(推荐方式,见 控件插件);
- 独立交付:不能用外部分发的方式直接 new 一个宿主——需要自包含运行期的场景请使用 二次开发 → 导出CS程序 生成的工程(见 导出 CS 程序),导出工程内部已把 SDK 与运行期打包好。
A 线:程序执行
| 方法 | 说明 |
|---|---|
JobRunResult RunAll() | 运行当前程序全部 Job;任一 Job 失败抛 ToolBankSdkException |
JobRunResult RunJob(string jobName) | 按名称运行单个 Job |
JobRunResult RunJob(string jobName, int startIdx, int endIdx) | 运行算子区间(endIdx=-1 到末尾) |
ToolRunResult RunOperator(string jobName, int toolIdx) | 运行单个算子 |
ToolStepResult StepOperator(string jobName, int toolIdx, out int nextToolIndex) | 单步执行,返回下一步索引 |
int[] GetLastJobStates(string jobName) | 各算子上次执行状态(0 未执行 / 1 成功 / 2 跳过 / 3 失败 / 4 禁用) |
string GetLastError() | 底层最近一次报错 |
void SetIterationCounter(int value) | 设置迭代计数器(“循环跑 N 次”的循环变量) |
RepeatRunIteration[] RepeatRun(string jobName, int times, Action<int> onBefore) | 同一 Job 反复执行;onBefore 每轮前换参 |
LoadFileResult LoadFile(string filePath, ...) | 复用加载类算子把本地文件读入变量池 |
B 线:变量读写
统一签名 Set*(jobName, variableName, data) / Get*(jobName, variableName);变量是全局共享时 jobName 可传任意值(按名定位,找不到回退首个 Job)。
| 类型 | Set / Get | SDK 包装类型 |
|---|---|---|
| 整数数组 | SetIntList / GetIntList | int[] |
| 浮点数组 | SetDoubleList / GetDoubleList | double[] |
| 字符串数组 | SetStringList / GetStringList | string[] |
| 二维点 | SetPoint2DList / GetPoint2DList | Point2D[] |
| 三维点 | SetPoint3DList / GetPoint3DList | Point3D[] |
| 线段 | SetLine2DList / GetLine2DList | Line2D[] |
| 矩形 | SetRectangle / GetRectangle | RectShape? |
| 圆 | SetCircle / GetCircle | CircleShape? |
| 椭圆 | SetEllipse / GetEllipse | EllipseShape? |
| 多边形 | SetPolygon / GetPolygon | PolygonShape |
| 图像 | GetImageInfo / GetImageAt / GetImageFrameCount | ImageVariableInfo / DImage |
| 区域掩码 | SetRegionMask / GetRegionCount / GetRegionMask | byte[][](0/255 像素) |
| 任意类型转字符串 | GetAsString | string |
变量管理:DeleteVariable(name)、RenameVariable(old, new)、VariableExists(name)。
几何类型用结构体承载,底层以扁平
double[]传输(与内核格式一致,跨语言无需中间转换)。Region收敛为 0/255 像素掩码后,SetRegion/GetRegion已废弃,改用矩形 / 圆 / 多边形或SetRegionMask。
Q 线:只读查询
| 成员 | 说明 |
|---|---|
bool HasCurrentProgram | 当前是否有可运行的程序 |
string CurrentProgramFilePath | 当前程序文件绝对路径 |
IReadOnlyList<JobInfo> Jobs | 全部 Job 摘要(名称 / 描述 / 算子名 / 上次状态) |
JobInfo GetJobInfo(string jobName) | 单个 Job 摘要 |
IReadOnlyList<VariableInfo> Variables | 全部变量元信息(名称 / 类型) |
数据类型与异常
- 几何:
Point2D/Point3D/Line2D/RectShape/CircleShape/EllipseShape/PolygonShape; - 结果:
JobRunResult(Success/FailedToolIndex/ToolConsumedTimes/ExecutionStates/ErrorMessage/TotalMilliseconds)、ToolRunResult、ToolStepResult、RepeatRunIteration(Tag可回写自定义上下文); - 查询:
JobInfo/VariableInfo(含VariableType枚举)/ImageVariableInfo; - 异常:
ToolBankSdkException(Message为底层 LastMsg,JobName/ToolIndex/RawLastMessage供定位)。
调用示例
using ToolBank.Sdk;
var sdk = ToolBankSdk.Instance;
// 1. 跑整个程序
var r = sdk.RunAll();
Console.WriteLine($"运行完成,耗时 {r.TotalMilliseconds:0}ms");
// 2. 指定 Job 循环跑 3 次,每轮前换输入
var iterations = sdk.RepeatRun("Main", 3, i =>
sdk.SetIntList("Main", "SrcImagePath", new[] { i + 1 }));
// 3. 读结果
double[] scores = sdk.GetDoubleList("Main", "Score");
string text = sdk.GetAsString("Main", "Result");
var info = sdk.GetImageInfo("Main", "OutImage");
Console.WriteLine($"图像 {info.Width}x{info.Height}x{info.Channels}");
// 4. 查状态
var states = sdk.GetLastJobStates("Main"); // 0 未执行 / 1 成功 / 2 跳过 / 3 失败 / 4 禁用
常见问题
为什么在外部程序里调用 SDK 报“找不到宿主”类错误?
SDK 依赖与 ToolBank 同进程运行。外部独立进程应改用「导出 CS 程序」生成的自包含工程(自带运行期),而不是直接引用 SDK 驱动主程序。
读写变量的 jobName 怎么传?
变量池全局按名寻址。变量名唯一时 jobName 传任意值即可;若不同 Job 存在同名变量,SDK 会先按给定 jobName 找,找不到回退首个 Job。推荐始终传真实 Job 名。
RunAll 中途一个算子失败了会怎样?
抛出 ToolBankSdkException,其 JobName / ToolIndex 指明失败位置,Message / RawLastMessage 为底层错误详情。用 try/catch 接住即可做失败处理。