程序编辑器
编辑器概述
程序编辑器是 ToolBank 的核心工作区域,用于创建、编辑和调试视觉检测程序。
两种视图模式
表格视图
以列表形式展示算子流程,适合快速编辑和批量操作。
┌─────────────────────────────────────────────────────────┐
│ Job: Main [钉住] │
├─────────────────────────────────────────────────────────┤
│ # │ 算子名 │ 输入参数 │ 输出变量 │ 启用 │ 耗时 │
│ 0 │ LoadImage │ "test.png" │ Image │ ✓ │ 5ms │
│ 1 │ GaussianBlur │ Image, 3.0 │ BlurImage │ ✓ │ 4ms │
│ 2 │ Threshold │ BlurImage, 128 │ Binary │ ✓ │ 3ms │
│ 3 │ FindContours │ Binary │ Contours │ ✓ │ 10ms │
│ 4 │ IF (Contours.Count > 0) │ │ │ ✓ │ 1ms │
│ 5 │ ├─ Job_Success (子流程) │ │ │ ✓ │ 100ms │
│ 6 │ ├─ ELSE Job_Fail (子流程) │ │ │ ✓ │ 50ms │
│ 7 │ END IF │ │ │ ✓ │ 0ms │
│ 8 │ SaveResult │ Contours, Data │ - │ ✓ │ 2ms │
└─────────────────────────────────────────────────────────┘
图形视图
以节点图形式展示程序流程,可视化呈现算子间的数据流。
切换视图
- 右键点击 Job 标签
- 选择 "切换到图" 或 "切换到表"
Job 管理
创建 Job
- 右键点击标签栏空白处
- 选择 "增加 Job"
- 输入 Job 名称
- 新 Job 添加到标签末尾
Job 命名规范
<功能描述>
示例:
Main- 主流程Init- 初始化Process- 处理流程Output- 输出流程Job_Success- 成功分支Job_Fail- 失败分支
Job 操作
| 操作 | 方式 | 说明 |
|---|---|---|
| 重命名 | 右键 → 重命名 | 修改 Job 名称 |
| 删除 | 右键 → 删除 Job | 删除整个 Job 及其所有算子 |
| 钉住 | 右键 → 钉住/取消钉住 | 固定常用 Job 标签 |
| 关闭 | 右键 → 关闭标签 | 从视图移除(不删除) |
算子操作
添加算子
方式一:工具栏
- 点击 "+" 按钮
- 在选择器中浏览或搜索算子
- 双击或拖拽添加
方式二:快捷键
- 按
Ctrl+T打开工具选择器 - 直接输入算子名搜索
- 按
Enter快速添加
方式三:右键菜单
- 右键点击目标位置
- 选择 "添加算子"
- 选择算子
配置算子参数
参数面板
选中算子后,在属性面板中配置:
┌─ 参数配置: GaussianBlur ─────────────────────┐
│ │
│ 输入参数: │
│ ┌─────────────────────────────────────────┐ │
│ │ Image: [Image ▼] │ │
│ │ KernelSize: [3.0 ] │ │
│ │ SigmaX: [0.0 ] │ │
│ │ SigmaY: [0.0 ] │ │
│ │ BorderType: [Default ▼ ] │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 输出参数: │
│ ┌─────────────────────────────────────────┐ │
│ │ OutputImage: [BlurImage ] │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 选项: │
│ ☑ 启用此算子 │
│ ☐ 调试模式 │
└───────────────────────────────────────────────┘
输入参数类型
| 类型 | 输入方式 | 示例 |
|---|---|---|
| 常量 | 直接输入值 | 123, 3.14, "text" |
| 变量 | 下拉选择变量 | 选择已有变量名 |
| 列表 | 逗号分隔值 | 1,2,3,4,5 |
| 选项 | 下拉选择选项 | Nearest, Bilinear |
输出变量命名
输出变量会自动作为新变量加入变量池,命名规则:
- 支持中文和英文
- 建议使用有意义的名称
- 避免特殊字符
算子顺序
调整顺序
- 拖拽算子:直接拖动调整位置
- 右键菜单:上移/下移
- 快捷键:
Ctrl+Up/Ctrl+Down
复制算子
- 选中算子
- 按
Ctrl+C复制 - 在目标位置按
Ctrl+V粘贴
算子启用/禁用
- 选中算子后按
Space切换 - 禁用的算子在运行时被跳过
- 用于临时跳过问题算子
控制流编程
IF/ELSE 条件分支
创建步骤
- 添加 IF 算子
- 设置条件表达式(如
Count > 10) - 在 THEN 分支添加算子
- (可选)添加 ELSE 分支
- 自动添加 END IF
LOOP 循环
使用场景
- 批量处理图像
- 迭代变量列表
- 重试操作
CALL 调用子流程
适用场景
- 模块化设计
- 复用常用流程
- 简化主流程
调试功能
单步执行
- 按
F10开始单步执行 - 每执行一个算子暂停
- 观察变量变化
- 继续执行或跳过
运行到光标
- 选中目标算子
- 右键选择 "运行到此算子"
- 程序执行到该算子前暂停
断点
- 右键算子 → "设置断点"
- 运行程序,遇到断点自动暂停
- 检查变量和参数
运行信息
每个算子执行后显示:
- 耗时统计(毫秒)
- 输入参数值
- 输出变量值
- 执行结果(成功/失败)
程序结构可视化
树形结构
程序
├── Job: Main
│ ├── 0: LoadImage
│ ├── 1: GaussianBlur
│ ├── 2: Threshold
│ ├── 3: FindContours
│ ├── 4: IF (count > 0)
│ │ ├── THEN
│ │ │ ├── Job_Success (子流程)
│ │ │ └── ...
│ │ └── ELSE
│ │ ├── Job_Fail (子流程)
│ │ └── ...
│ └── 5: SaveResult
├── Job: Init
│ └── ...
└── Job: Cleanup
└── ...
嵌套结构
- 控制流支持嵌套
- IF/LOOP 可嵌套任意层数
- 子流程(CALL)可跨 Job 调用
最佳实践
程序组织
- 单一职责:每个 Job 只做一件事
- 清晰命名:Job 和算子使用有意义的名称
- 适当拆分:复杂流程拆分为多个子 Job
参数配置
- 默认值:合理设置默认参数
- 类型匹配:确保输入变量类型正确
- 边界检查:在程序中添加必要的判断
调试技巧
- 分步调试:先用单步验证每个算子
- 日志输出:在关键节点添加日志
- 异常处理:对可能失败的操作添加容错
性能优化
- 避免冗余:删除不必要的算子
- 合理缓存:复用中间结果
- 并行处理:使用多 Job 并行执行