跳到主要内容

程序编辑器

编辑器概述

程序编辑器是 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

  1. 右键点击标签栏空白处
  2. 选择 "增加 Job"
  3. 输入 Job 名称
  4. 新 Job 添加到标签末尾

Job 命名规范

<功能描述>

示例:

  • Main - 主流程
  • Init - 初始化
  • Process - 处理流程
  • Output - 输出流程
  • Job_Success - 成功分支
  • Job_Fail - 失败分支

Job 操作

操作方式说明
重命名右键 → 重命名修改 Job 名称
删除右键 → 删除 Job删除整个 Job 及其所有算子
钉住右键 → 钉住/取消钉住固定常用 Job 标签
关闭右键 → 关闭标签从视图移除(不删除)

算子操作

添加算子

方式一:工具栏

  1. 点击 "+" 按钮
  2. 在选择器中浏览或搜索算子
  3. 双击或拖拽添加

方式二:快捷键

  • Ctrl+T 打开工具选择器
  • 直接输入算子名搜索
  • Enter 快速添加

方式三:右键菜单

  1. 右键点击目标位置
  2. 选择 "添加算子"
  3. 选择算子

配置算子参数

参数面板

选中算子后,在属性面板中配置:

┌─ 参数配置: 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

复制算子

  1. 选中算子
  2. Ctrl+C 复制
  3. 在目标位置按 Ctrl+V 粘贴

算子启用/禁用

  • 选中算子后按 Space 切换
  • 禁用的算子在运行时被跳过
  • 用于临时跳过问题算子

控制流编程

IF/ELSE 条件分支

创建步骤

  1. 添加 IF 算子
  2. 设置条件表达式(如 Count > 10
  3. 在 THEN 分支添加算子
  4. (可选)添加 ELSE 分支
  5. 自动添加 END IF

LOOP 循环

使用场景

  • 批量处理图像
  • 迭代变量列表
  • 重试操作

CALL 调用子流程

适用场景

  • 模块化设计
  • 复用常用流程
  • 简化主流程

调试功能

单步执行

  1. F10 开始单步执行
  2. 每执行一个算子暂停
  3. 观察变量变化
  4. 继续执行或跳过

运行到光标

  1. 选中目标算子
  2. 右键选择 "运行到此算子"
  3. 程序执行到该算子前暂停

断点

  1. 右键算子 → "设置断点"
  2. 运行程序,遇到断点自动暂停
  3. 检查变量和参数

运行信息

每个算子执行后显示:

  • 耗时统计(毫秒)
  • 输入参数值
  • 输出变量值
  • 执行结果(成功/失败)

程序结构可视化

树形结构

程序
├── 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 并行执行