Files
AohDrllTools/.trellis/tasks/06-27-stack-count-calculator/prd.md
Mr.Xia 8d6efa9e86 fix: 修复EA刀叠板查表直径区间匹配,叠板区改为折叠输入即算
EA刀/短槽刀列按参数表下限区间 [0.60,0.65)/[0.65,0.70)/[0.70,0.75)/>=0.75 匹配,修复 0.706mm 等刀径查表失败;叠板计算改为 Expander 默认收折、移除计算按钮、输入变化自动计算。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 22:01:15 +08:00

197 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 基础信息叠板计算功能
## Goal
在启动功能菜单的“基础信息”区域添加叠板计算能力,让用户输入板厚和单张板总铜厚后,系统根据当前钻孔文件解析出的最小钻咀、最小槽刀、最小 EA 刀,按《钻孔叠板参数表》计算建议叠板块数,帮助用户在打开钻带时快速判断生产叠板数量。
## What I already know
* 用户提供的规则来源是 `1009B-2013钻机参数表(D2-f)A1A2厂 (1).doc`,文档主体是《钻孔叠板参数表》。
* 规则表按板材厚度和刀具直径给出叠板片数,分为短槽刀、槽刀、钻针三类。
* 备注规则包含:双面、多层板叠板后的总铜厚大于 `16oz` 时,叠板数需逐张递减,直到总铜厚不超过 `16oz` 或叠板数降到 `1`
* 当前工具场景基本只有双面或多层 PCB不需要在界面增加板类型选择。
* 如果钻咀、槽刀、短槽刀叠板数冲突,以最小叠板数为准。
* `D` 表示刀具直径;`/` 表示加工能力无法达到;如果板厚没有对应叠板数,由工程部提出、工艺部验证。
* 当前启动流程已在 `App.xaml.cs` 中读取并解析钻带一次,再把最小钻咀、最小槽刀、最小 EA 刀传给 `StartupSelectionWindow`
* `StartupSelectionWindow.xaml` 的“基础信息”已经显示文件名、最小钻咀、最小槽刀、最小 EA 刀、PP 间距和 3.175 外围孔间距。
* `MainWindowViewModel.UpdateMinDiameterInfo()` 已负责计算三类最小直径EA 刀对应尾号 `2``6`,槽刀排除 EA 类型。
* 现有 `StartupSelectionWindow` 使用匿名对象作为 `DataContext`,无法承载双向输入、动态结果和属性变更通知。
* 现有最小直径显示口径会排除 `0.749mm`;该排除只适合显示用途,叠板计算应按实际刀具参与计算,否则可能得到偏大的叠板数。
* 项目文档已明确粉尘刀、去毛刺刀的大类都是槽刀。
## Assumptions
* 叠板计算只在启动选择窗口中做即时辅助显示,不写回钻带文件。
* EA 刀按规则表中的”短槽刀”规则计算。
## Open Questions
无(全部已确认)。
## Requirements (finalized)
* 在启动功能菜单的”基础信息”区域增加叠板计算输入和结果显示。
* 本次 MVP 只做启动菜单即时计算,不做输入记忆,不在主窗口增加入口。
* 叠板计算区域使用 `Expander` 折叠控件,默认收折,仅显示”▸ 叠板计算”标题行;展开后显示输入框、结果和明细,不占用启动菜单的默认视觉面积。
* 输入即计算:板厚和铜厚输入框使用 `UpdateSourceTrigger=PropertyChanged`,任一输入变化时自动计算;不设”计算叠板”按钮;输入不完整时静默清空结果,不报错。
* 铜厚输入为单张板总铜厚,最终叠板后的总铜厚按 `单张板总铜厚 × 候选叠板数` 计算。
* 用户输入板厚和铜厚后,系统使用当前钻带中实际参与加工的最小钻咀、最小槽刀、最小 EA 刀分别查表。
* 叠板计算的最小刀径口径独立于现有“最小钻咀/槽刀/EA刀”显示口径`0.749mm` 不得因显示排除规则而被排除。
* 槽刀分类映射:`Slot``DustSlot``DeburrSlot` 均按规则表“槽刀”计算;`EASlot``EASlot2` 按规则表“短槽刀”计算;`Drill` 按规则表“钻针”计算。
* 当前钻带缺少某类刀具时,该类别不参与最终叠板数计算,结果明细显示该类别为“无”。
* 如果某类刀具在当前钻带中存在但无法匹配规则、规则格为 `/``-`、或刀具直径落在规则能力外,则整体显示无法计算,并在明细中标出失败类别和原因;不得跳过已存在但失败的类别。
* 如果三类刀具都不存在,则显示无法计算。
* 规则匹配严格照表执行:板厚不在表格区间、规则格为 `/``-`、刀具直径没有对应列时,显示无法计算原因,不自动取邻近规则。
* 多个刀具类别得到不同叠板数时,最终结果取最小叠板数。
* 不增加板类型输入,默认当前输入都是双面或多层 PCB始终按 `16oz` 总铜厚限制递减叠板数,最小保留 `1` 张。
* 计算过程需要能说明最终结果来自哪个限制钻咀、槽刀、EA 刀或铜厚递减。
* 输入校验先于查表执行:板厚和单张总铜厚不能为空,必须为大于 `0` 的数字;板厚必须落在规则表总范围 `0.4mm``3.4mm` 内。
## Acceptance Criteria (finalized)
* [x] 启动选择窗口的”基础信息”中能输入板厚和铜厚。
* [x] 叠板计算区域默认折叠,展开后输入板厚和铜厚自动计算,无需点击按钮。
* [x] 输入有效且当前钻带存在可参与计算的最小刀具时,显示建议叠板块数。
* [x] 叠板计算使用包含 `0.749mm` 的实际最小刀径口径,不受现有显示排除规则影响。
* [x] 铜厚限制使用单张板总铜厚乘以候选叠板数计算。
* [x] 钻咀、槽刀、EA 刀结果冲突时,显示取最小值后的最终结果。
* [x] 铜厚限制始终生效;触发时结果按每次减 `1` 张直到不超过 `16oz` 或保留 `1` 张。
* [x] 当前钻带缺少某类刀具时,该类不影响最终结果,结果明细显示为”无”。
* [x] 当前钻带存在某类刀具但该类无法匹配规则时,整体显示无法计算,不使用剩余类别继续给建议张数。
* [x] 三类刀具都不存在时,显示无法计算。
* [x] 板厚或刀具直径超出规则表、或规则为 `/` / `-` 时,界面显示无法计算原因,不默默给兜底值。
* [x] 非数字、空输入、`0` 或负数输入时,静默清空结果区域,不进入查表逻辑。
## Technical Approach
*`StartupSelectionWindow` 的匿名 `DataContext` 替换为正式 `StartupSelectionViewModel`,实现 `INotifyPropertyChanged`,承载文件信息、最小直径显示值、板厚输入、铜厚输入、计算结果和明细文本。
* 保持现有 code-behind 风格;叠板计算不再使用按钮事件,改为输入属性 setter 中调用 ViewModel 的 `TryCalculateStackCount()` 方法。
* 新增独立叠板计算类,封装规则表、输入校验、三类刀具查表、取最小值和 `16oz` 铜厚递减逻辑;不建模板类型。
* `StartupSelectionWindow` 仅负责输入、点击按钮和显示结果,不承载规则表算法。
* `App.xaml.cs` 继续沿用现有启动流程,同时把 `MainWindowViewModel.Tools` 或由其派生出的叠板计算用最小刀径传入启动窗口;叠板计算不得复用排除 `0.749mm` 后的显示最小值。
* 计算类放在项目根目录 `StackCountCalculator.cs`,命名空间使用现有主命名空间 `DrillTools`,避免引入新的分层目录和依赖。
* 规则表在代码中以明确的厚度区间、直径区间和单元格值表达;每个失败路径返回中文原因,避免空结果。
* EA 刀按规则表中的“短槽刀”规则计算;普通槽刀按“槽刀”规则计算;钻咀按“钻针”规则计算。
* 规则录入验收:实现时必须用本文档“数字化规则表”逐项核对代码常量,并补充覆盖边界区间、`-` / `/` 单元格、缺失类别和 `0.749mm` 参与计算的验证样例。
## Digital Rule Tables
### 短槽刀 / EA 刀
| 板厚范围 mm | D=0.60 | D=0.65 | D=0.70 | D>=0.75 |
|---|---:|---:|---:|---:|
| 0.40-0.65 | 5 | 5 | 5 | 5 |
| 0.66-0.85 | 4 | 4 | 5 | 5 |
| 0.86-0.95 | 3 | 4 | 5 | 5 |
| 0.96-1.05 | 3 | 3 | 4 | 4 |
| 1.06-1.15 | 3 | 3 | 4 | 4 |
| 1.16-1.35 | 2 | 3 | 4 | 4 |
| 1.36-1.65 | 2 | 2 | 3 | 3 |
| 1.66-2.05 | 1 | 2 | 2 | 2 |
| 2.06-2.55 | 1 | 1 | 1 | 1 |
| 2.56-3.40 | 1 | 1 | 1 | 1 |
短槽刀直径匹配为精确列或下限列:`0.60``0.65``0.70``>=0.75`;其它直径视为无对应列,显示无法计算。
### 槽刀
| 板厚范围 mm | D=0.50 | D=0.55 | D=0.60-0.65 | D>=0.70 |
|---|---:|---:|---:|---:|
| 0.40-0.65 | 5 | 5 | 5 | - |
| 0.66-0.85 | 5 | 5 | 5 | 5 |
| 0.86-0.95 | 5 | 5 | 5 | 5 |
| 0.96-1.05 | 4 | 5 | 5 | 5 |
| 1.06-1.15 | 3 | 4 | 4 | 5 |
| 1.16-1.35 | 3 | 4 | 4 | 5 |
| 1.36-1.65 | 2 | 3 | 3 | 4 |
| 1.66-2.05 | 2 | 2 | 2 | 3 |
| 2.06-2.55 | 1 | 2 | 2 | 2 |
| 2.56-3.40 | 1 | 1 | 1 | 2 |
槽刀直径匹配为精确列或范围列:`0.50``0.55``0.60-0.65``>=0.70`;其它直径视为无对应列,显示无法计算。
### 钻针
| 板厚范围 mm | D=0.20-0.225 | D=0.25 | D=0.275-0.30 | D=0.35-0.40 | D=0.45 | D>=0.50 |
|---|---:|---:|---:|---:|---:|---:|
| 0.40-0.65 | 5 | 5 | 5 | 5 | 5 | 5 |
| 0.66-0.85 | 4 | 5 | 5 | 5 | 5 | 5 |
| 0.86-0.95 | 3 | 5 | 5 | 5 | 5 | 5 |
| 0.96-1.05 | 3 | 5 | 5 | 5 | 5 | 5 |
| 1.06-1.15 | 2 | 4 | 4 | 4 | 5 | 5 |
| 1.16-1.35 | 2 | 3 | 3 | 4 | 4 | 5 |
| 1.36-1.65 | 2 | 3 | 3 | 3 | 3 | 4 |
| 1.66-2.05 | 1 | 2 | 2 | 2 | 2 | 3 |
| 2.06-2.55 | 1 | 2 | 2 | 2 | 2 | 2 |
| 2.56-3.40 | 1 | 1 | 1 | 1 | 1 | 2 |
钻针直径匹配为范围列:`0.20-0.225``0.25``0.275-0.30``0.35-0.40``0.45``>=0.50`;其它直径视为无对应列,显示无法计算。
## Decision (ADR-lite)
**Context**: 叠板规则来自受控作业文件,且备注要求无对应板厚时由工程/工艺验证,不能由程序自行推断邻近值。
**Decision**: 只在启动菜单”基础信息”做叠板计算;规则严格照表;缺失刀具类别跳过;当前存在但规则失败的类别使整体无法计算;最终叠板数取当前存在且全部成功类别的最小规则值后,再套用 `16oz` 总铜厚递减限制。由于当前业务基本只有双面或多层 PCB界面不增加板类型选择铜厚限制始终生效。叠板计算区域改为 `Expander` 折叠式,默认收折,输入即计算,不设按钮,避免干扰启动菜单的快速择路动线。
**Consequences**: 功能改动面较小,计算口径可追溯;后续若规则频繁变化,可以再把规则表外置为配置。
## Definition of Done (team quality bar)
* Tests added/updated where appropriate本项目未配置测试框架时至少补充可手工验证的样例。
* `dotnet build` 通过。
* UI 文案为简体中文。
* 不引入第三方依赖,不改变既有启动流程入口。
* 文档或说明同步更新,如果行为对用户可见。
## Out of Scope (explicit)
* 不自动修改钻带文件或导出生产工单。
* 不新增规则配置编辑器。
* 不记忆上次输入的板厚和铜厚。
* 不在主窗口“基础信息”区域增加同步入口。
* 不增加单面/双面/多层板类型选择。
* 不按邻近板厚或邻近刀具直径自动推断规则。
* 不改变最小钻咀、最小槽刀、最小 EA 刀的现有解析口径,除非实现时发现现有计算与规则冲突并另行确认。
## Technical Notes
* 可能影响文件:
* `StartupSelectionWindow.xaml`
* `StartupSelectionWindow.xaml.cs`
* `App.xaml.cs`
* `StartupSelectionViewModel.cs`
* `StackCountCalculator.cs`
* 规则来源文件:`C:\Users\14244\source\repos\Aoh\DrillTools\1009B-2013钻机参数表(D2-f)A1A2厂 (1).doc`
* 项目是 `.NET 6 WPF`,目标平台 `net6.0-windows``x86`
* 项目没有测试框架;现有质量验证以 `dotnet build` 和真实钻带样例为主。
* 相关规范索引:
* `.trellis/spec/backend/index.md`
* `.trellis/spec/frontend/index.md`
## UI Sketch
默认收折状态:
```text
基础信息
┌────────────────────────────────────────────────────────────────────┐
│ 文件名xxx │
│ 最小钻咀0.250 最小槽刀0.600 最小EA刀0.650 │
│ ▸ 叠板计算 │
└────────────────────────────────────────────────────────────────────┘
```
展开后(输入即计算,无需按钮):
```text
基础信息
┌────────────────────────────────────────────────────────────────────┐
│ 文件名xxx │
│ 最小钻咀0.250 最小槽刀0.600 最小EA刀0.650 │
│ ▾ 叠板计算 │
│ 板厚(mm)[ 0.80 ] 铜厚(oz)[ 2 ] │
│ 建议叠板4 张 │
│ 钻针 4 / 槽刀 5 / EA 5 / 铜厚通过,最终取 4 张 │
└────────────────────────────────────────────────────────────────────┘
```
叠板区域使用 `Expander` 控件,`IsExpanded="False"`;当两个输入框均有有效正数时自动计算并显示结果,输入不完整时静默清空。计算按钮已移除。