11个像素代表几微米 值越小放大倍率越大即imgResolution (μm/pixel) ↓ → 同物理尺寸对应更多像素 → 放大倍率 ↑ → 细节更精细。2Zoffset元件级 zoffset → BaseZcom_zoffset是每个元件所在 FOV 的真实 Z 高度跟全局填的ZOffset做差差值(mm) ÷ 分辨率(mm/层) 层偏移量然后用这个偏移修正算法BaseZ——从基准层往上或往下挪几个像素层保证搜索起点对准实际位置。就这么简单。对因为板子有翘曲不同位置的元件实际 Z 高度不一样。全局 ZOffset 1.5 ← 用户填的假设整板是平的 实际 左边翘起来了 → 左边元件实际 Z 1.8 → component_zoffset 1.8 右边塌下去了 → 右边元件实际 Z 1.2 → component_zoffset 1.2如果全用全局 1.5 算 BaseZ左边元件搜偏低了找不着基准层右边元件搜偏高了也找不着。所以路径规划给每个元件算自己的 zoffset一键配置时逐个换算成各自的 BaseZ消除翘曲影响。31. Shape形状PCB 上一切可检测的图形元素是系统的最小操作单元。Shape 图形能画出来 检测数据能算出来Board基板PCB 的物理边界PadCircle检测窗划定一个圆形/椭圆形检测区域–2. 坐标同一位置有两套坐标表达坐标类型含义类比物理坐标(StartX, EndX, mm)PCB 上的真实位置现实世界的位置像素坐标(PixelStartX, PixelEndX, px)图像上的位置照片上的位置通过Matrix变换矩阵互相转换。3. Status状态每个 Shape 在检测过程中会经历一系列阶段用位标志叠加表示待检测 → 扫描中 → 扫描完 → 重建中 → 重建完 → 检测中 → 结果(OK/NG)状态含义ReadyToExecute准备好了等待执行Scaning正在拍照扫描Reconstructing正在 CT 算法重建 3D 图像Detecting正在分析检测ResultOK检测通过 ✅ResultNG检测不通过 ❌UI 根据 Status自动变色4. CT计算机断层扫描用 X 光从不同角度拍摄重建出物体内部的 3D 图像。三个关键参数参数含义单位imgResolution分辨率每个像素代表多大mm/pixelzoffsetZ 轴偏移焦平面上下移动mm层数重建多少层切片层imgResolution 越小 → 放大倍率越高 → 看得越精细 zoffset 正 → 焦平面上移负 → 焦平面下移6. Drill钻孔PCB 上需要检测的孔位分两种类型说明通孔(Through Hole)从上面钻穿到下面背钻(Backdrill)钻到某一层就停不钻穿背钻根据方向再分上钻从上面钻、下钻从下面钻、上下都钻。DrillStandard 同一个钻孔规格{ 深度, 半径 }同类钻孔归为一组共用检测算法。概念关系总图Board基板PCB 物理边界 │ ├─ Component元件 │ └─ 一组相关的检测窗 │ ├─ PadCircle检测窗 │ ├── 坐标物理 ↔ 像素 │ ├── CT 参数分辨率 Z偏移 │ ├── Status检测生命周期状态 → 驱动颜色 │ ├── AlgorithmViewShapes子形状 │ └── 检测结果 │ ├─ DrillData钻孔数据 │ └── 孔类型通孔/背钻 钻深 层厚 │ └─ Template检测模板 └── 复用配置到同类 Shape一句话总结Shape是基本单元通过CT 重建分辨率 Z 偏移获取内部图像经历Status 生命周期扫描→重建→检测→结果UI 随状态。3三个全局SemaphoreSlim全部并发数 1_reconstructLock (1) → 重建engine.setupResolver → 提交投影 → pollReconDone _extractGlobalLock (1) → 提取CT 体数据从 C 引擎拉到内存 _detectGlobalLock (1) → 检测ExecuteAlgoProcess 调 C 算法为什么都设成 1C 重建/提取/算法引擎底层不是线程安全的多个 Job 同时调会崩。所以每个阶段同一时刻只允许一个 Job 在跑。实际跑法扫图完了之后10 个 Job 并行跑但每到重建/提取/检测这仨环节谁先抢到锁谁先进剩下的await排队Job1 重建 ──┐ Job2 重建 ──┤ → _reconstructLock.WaitAsync() → 抢到的先跑其他排队 Job3 重建 ──┘ ↓ Job1 提取 → Job2 提取 → Job3 提取 _extractGlobalLock 排队 ↓ (保存体数据 和 检测 并行) Job1 检测 → Job2 检测 → Job3 检测 _detectGlobalLock 排队保存体数据不依赖 C 引擎所以不和检测抢锁直接并行跑。跟同事一句话C 引擎不线程安全三个全局锁各管一个阶段保证同一时刻只有一个 Job 在调引擎。