F013: Code/src/pinmap_parser.py 增加 Top 边自动布局检测 F014/F015: 双向模板样式确认 F016/F017: 新增 5 个 QFN60 端到端测试
178 lines
8.2 KiB
Markdown
178 lines
8.2 KiB
Markdown
# Changelog
|
||
|
||
## [v1.6.0] - 2026-06-12
|
||
|
||
### 🐛 Bug 修复
|
||
|
||
#### F013 【P0】修复 PinMAP→PinList 上方引脚丢失
|
||
|
||
- **根因**:`pinmap_parser.py` 硬编码假设上边 Name 在 Number 上方(min_row),但用户真实 PinMAP 中 Number 在上、Name 在下,导致上边 15 个引脚全部丢失
|
||
- **修复**:增加 `_detect_top_layout()` 自动检测逻辑,通过扫描两行数据的数字/文本特征判断 Name 和 Number 的上下位置,兼容两种布局
|
||
- QFN60(15×15,60 引脚)端到端往返验证通过
|
||
|
||
#### F014 【P0】PinList→PinMAP 样式模板应用
|
||
- 确认 `Code/src/Template/PinMAP-Template.xlsx` 存在,样式解析成功(fonts=2, fills=2, borders=2, cell_xfs=4)
|
||
- 搜索路径:优先 `Code/src/Template/` → 项目根目录 → cwd
|
||
|
||
#### F015 【P0】PinMAP→PinList 样式模板应用
|
||
- 确认 `Code/src/Template/PinList-Template.xlsx` 存在,样式解析成功(fonts=2, fills=1, borders=2, cell_xfs=4)
|
||
|
||
### ✅ 测试
|
||
- 新增 5 个 QFN60 端到端测试(F016/F017)
|
||
- 全量 23 个测试全部通过,无回归
|
||
- 覆盖两种布局方向(Layout A/B)+ 往返一致性
|
||
|
||
### 🔧 修改文件
|
||
- `Code/src/pinmap_parser.py` — F013: 增加 `_detect_top_layout()` 和 `_count_numeric()`,上边 Name/Number 查找改为动态检测
|
||
- `Code/src/test_pinmap.py` — F016/F017: 新增 5 个 QFN60 测试函数
|
||
- `docs/modification-assessment-v1.6.md` — 新增 v1.6 架构评估文档
|
||
|
||
## [v1.5.5] - 2026-06-12
|
||
|
||
### 🐛 Bug 修复(深度修复)
|
||
|
||
#### BUG-005 【高】模板文件名/路径错误
|
||
|
||
- **根因**:v1.5.4 只改了模板文件名(`BallList-Template.xlsx` → `PinList-Template.xlsx`),但未修正搜索路径
|
||
- **修复**:模板搜索路径优先查找 `Code/src/Template/` 目录,再回退项目根目录和当前工作目录
|
||
- 模板样式现在可正确应用到输出文件
|
||
|
||
#### BUG-006 【高】PinList→PinMAP 上边 Name 与左边 Name 同行
|
||
|
||
- **根因**:v1.5.4 将上边 Name 放在 row 2(Excel 第 3 行),与左边 Name/Number 起始行相同,导致 3 条边数据混在同一行
|
||
- **修复**:将上边 Name 移至 **row 0**(Excel 第 1 行),上边 Number 保持在 row 1(第 2 行),使上边完全独立于其他边
|
||
- 不再需要角点例外逻辑,代码更简洁
|
||
- 每条边数据独立分隔,肉眼可读性大幅提升
|
||
|
||
### 🔧 修改文件
|
||
|
||
- `Code/src/main.py` — BUG-005: 模板搜索路径修正(优先 Code/src/Template/)
|
||
- `Code/src/pinmap_layout.py` — BUG-006: 上边 Name 坐标改为 `(0, c)`,移除角点例外
|
||
- `Code/src/pinmap_parser.py` — BUG-006: 上边 Name 从 row 0 读取,Number 从 row 1 读取
|
||
- `Test/fixtures/sample_4x4.xlsx` — BUG-006: 更新为 v1.5.5 新布局
|
||
- `Code/src/test_pinmap.py` — BUG-006: 测试数据适配新布局
|
||
|
||
### ✅ 测试
|
||
- 全部 37 个测试通过
|
||
|
||
## [v1.5.4] - 2026-06-09
|
||
|
||
### 🐛 Bug 修复
|
||
|
||
#### BUG-005 【高】模板文件名错误
|
||
|
||
- 模板文件重命名:`BallList-Template.xlsx` → `PinList-Template.xlsx`,`BallMAP-Template.xlsx` → `PinMAP-Template.xlsx`
|
||
- 同步更新 `main.py` 中的函数名和模板引用路径
|
||
|
||
#### BUG-006 【高】布局重设计(Number 外侧 + Name 里侧)
|
||
|
||
- 重新设计 PinMAP 布局:从网格边界往中心走,第 1 圈 = Number(数字),第 2 圈 = Name(引脚名)
|
||
- **上边**:Number row 1(最顶行),Name row 2(第二行;角点例外:最左/右上边 Name 在 (1,0)/(1,cols+1))
|
||
- **左边**:Number col 0(最左列),Name col 1(第二列)
|
||
- **下边**:Number row rows+3(最底行),Name row rows+2(倒数第二行)
|
||
- **右边**:Number col cols+1(最右列),Name col cols(右二列)
|
||
- Pin1 保持在左上角(A3=1, B3=Pin1)
|
||
- 不再需要角点 "//" 合并,每条边不共享任何单元格
|
||
- 全部 15 种网格大小验证无冲突
|
||
- 18/18 单元测试 + 37/37 集成测试全部通过
|
||
|
||
### 🔧 修改文件
|
||
|
||
- `Code/src/main.py` — BUG-005: 模板函数和引用改名;BUG-006: 传递 cols 参数
|
||
- `Code/src/pinmap_layout.py` — BUG-006: 重写坐标公式 + `get_name_cell()` 支持 cols 参数 + 角点例外
|
||
- `Code/src/pinmap_generator.py` — BUG-006: 传递 cols 参数 + 更新注释
|
||
- `Code/src/pinmap_parser.py` — BUG-006: 重写边界检测、Name 读取(角点例外检测)
|
||
- `Code/src/test_pinmap.py` — BUG-006: 更新测试数据适配新布局
|
||
- `Test/fixtures/PinList-Template.xlsx` + `PinMAP-Template.xlsx` — BUG-005: 模板文件重命名
|
||
|
||
### 📝 文档
|
||
|
||
- 更新 `CHANGELOG.md` 追加 v1.5.4 版本日志
|
||
- 更新 `README.md` 追加 v1.5.4 版本说明
|
||
- 生成 `Releases/v1.5.4/CHANGELOG.md`
|
||
|
||
## [v1.5.0] - 2026-06-06
|
||
|
||
### ✨ 功能新增
|
||
|
||
- **F009 MAP→List 使用 balllist 模板**:`run_map_to_list()` 改查 `BallList-Template.xlsx`,不再共用旧模板
|
||
- **F010 List→MAP 使用 ballmap 模板**:`run_list_to_map()` 改查 `BallMAP-Template.xlsx`,模板完全分离
|
||
- **F011 模板格式提取式应用**:从模板的 cellXfs/fonts/borders/fills 提取实际样式定义,替换硬编码边框和对齐;无模板时完全回退到默认样式
|
||
- **F012 验证+回归测试**:新增 `test_f012_pinname_position()` 验证下边 Name 在 max_row-1、上边 Name 在 min_row+1,添加 5×5 往返一致性测试
|
||
|
||
### 🗑️ 废弃
|
||
|
||
- `_find_template_path()` (PinMAP-Template.xlsx) — 不再自动查找,由 `_find_balllist_template_path()` 和 `_find_ballmap_template_path()` 替代
|
||
|
||
### 📝 文档
|
||
|
||
- 更新 `docs/tasks.md` T015 状态为已完成
|
||
- 更新 `docs/features.md` F009-F012 状态
|
||
|
||
### 🔧 修改文件
|
||
|
||
- `Code/src/main.py` — 新增两个模板查找函数,修改两个方向的模板调用
|
||
- `Code/src/xlsx_writer.py` — 重写 `_styles_xml()` 支持模板样式提取
|
||
- `Code/src/template_reader.py` — 增强 cellXfs 提取(xfId、applyAlignment、wrapText)
|
||
- `Code/src/test_pinmap.py` — 新增 F012 回归测试
|
||
|
||
## [v1.3.15] - 2026-06-01
|
||
|
||
### 🐛 Bug 修复
|
||
|
||
- **pinmap_layout.py**: 周长公式从 `2(rows+cols)−4` 改为 `(rows+cols)×2` — 修复角点共享策略,每条边独立包含其端点
|
||
- **pinmap_generator.py**: 角点单元格写入 `"6/7"` 格式 — 修复 v1.3 下角点引脚丢失问题
|
||
- **pinmap_parser.py**: 读取时包含角点,按 `"/"` 拆分解析多引脚序号 — 修复 roundtrip 丢失引脚问题
|
||
|
||
## [v1.2.0] - 2026-05-26
|
||
|
||
### 🐛 Bug 修复
|
||
|
||
- **run.bat**: `cd /d "%~dp0src"` → `cd /d "%~dp0Code\src"` — 修复 cd 路径报错
|
||
- **run.bat**: `chcp 65001` 末尾添加 `>nul` — 修复 title 中文乱码
|
||
- **run.bat**: `mode con lines=20` → `lines=50` — 修复 Log 窗口无法上滑
|
||
- **Code/src/file_selector.py**: `.strip()` 后增加 `.strip('"\'')` — 修复拖拽文件路径带引号导致不存在
|
||
|
||
## [v1.0.1] - 2026-05-25
|
||
|
||
### 📝 文档完善
|
||
|
||
- 新增 `Code/docs/README.md` — 项目完整说明文档(8.1KB)
|
||
- 新增 `Code/docs/QUICKSTART.md` — 快速入门指南(6.6KB)
|
||
- 新增 `Code/docs/RELEASE.md` — 版本发布说明(5.1KB)
|
||
- 完善项目文档体系,覆盖架构设计、快速上手、版本历史
|
||
|
||
## [v1.0.0] - 2026-05-25
|
||
|
||
### 🎉 首次发布
|
||
|
||
#### 功能
|
||
- **PinMAP 解析**:支持方形/长方形封装,左上角为 1 脚,逆时针排序
|
||
- **格式支持**:兼容 `.xls`(BIFF8 引擎)和 `.xlsx` 两种 Excel 格式
|
||
- **智能验证**:自动检测重复引脚、间隙、空单元格等结构问题
|
||
- **PinList 生成**:按顺时针顺序输出引脚序号列表
|
||
- **GUI 模式**:支持 tkinter 文件选择器,零命令行使用
|
||
- **命令行模式**:`python main.py input.xlsx` 快速转换
|
||
|
||
#### 技术
|
||
- Python 标准库,零第三方依赖
|
||
- 自定义 BIFF8 引擎解析 `.xls` 文件(~19KB)
|
||
- `openpyxl` 读写 `.xlsx` 文件
|
||
- 模块化架构:解析 → 验证 → 生成 → 输出
|
||
|
||
#### 架构
|
||
- `main.py` — 入口与流程编排
|
||
- `xls_reader.py` — BIFF8 `.xls` 解析引擎
|
||
- `xlsx_reader.py` — `.xlsx` 解析器
|
||
- `pinmap_parser.py` — PinMAP 结构解析
|
||
- `validator.py` — 结构验证与错误检测
|
||
- `pinlist_generator.py` — PinList 生成器
|
||
- `xlsx_writer.py` — `.xlsx` 输出
|
||
- `file_selector.py` — tkinter 文件选择器
|
||
- `models.py` — 数据模型
|
||
- `utils.py` — 工具函数
|
||
|
||
#### 测试
|
||
- 6 个测试夹具覆盖正常/异常场景
|
||
- 测试报告:`Test/test_report.md`
|