feat: PinMAP转PinList v1.2.0 - 新增PinList转PinMAP反向转换功能

This commit is contained in:
2026-05-28 01:53:51 +08:00
parent 853f10a73b
commit 3228c1a2e6
18 changed files with 3781 additions and 977 deletions

View File

@@ -2,6 +2,198 @@
---
## v1.2.0 — 2026-05-28
### ✨ 新增 PinList → PinMAP 反向转换
v1.2.0 为项目增加了完整的反向转换能力PinMAP ↔ PinList 现在可以双向互转。
---
### 新增功能
#### PinList → PinMAP 转换
- **PinList 解析**:从 Excel 文件中读取 PinNameA 列)和 Pin 序号B 列)
- **布局计算**:根据用户输入的行数和列数,自动计算四边引脚分配
- **逆时针分配**:左上角为 1 脚,沿左边→下边→右边→上边逆时针排列
- **PinName 定位**:自动计算 PinName 与序号的相对位置(右/上/左/下)
- **周长验证**:检查引脚总数是否匹配 `2×rows + 2×cols 4`
- **优雅降级**:缺失 PinName 自动设为 "NC"
#### 模板样式引擎
- **样式提取**:从模板 xlsx 文件中提取字体、填充、边框、列宽、行高
- **样式应用**:将模板样式应用到生成的 PinMAP 输出文件
- **优雅降级**:模板不存在或解析失败时自动使用默认样式
#### 交互式方向选择
- **启动菜单**:运行 `python main.py` 显示方向选择1: MAP→List / 2: List→MAP
- **尺寸输入**List→MAP 模式需要输入 PinMAP 的行数和列数
- **文件选择**:根据方向自动切换文件选择器标题和提示
#### 数据验证增强
- **PinList 验证**序号连续性、序号唯一性、周长匹配、PinName 完整性
- **非 4 倍数提示**Pin 数量不是 4 的倍数时提示(信息级别)
---
### 新增模块
| 模块 | 代码量 | 说明 |
|------|--------|------|
| `pinlist_parser.py` | ~80 行 | PinList 文件解析A/B 列读取 + 排序) |
| `pinlist_validator.py` | ~90 行 | PinList 数据验证(连续性/唯一性/周长匹配) |
| `pinmap_generator.py` | ~70 行 | PinMAP 生成与输出(布局应用 + 样式) |
| `pinmap_layout.py` | ~100 行 | PinMAP 布局计算(四边分配 + 坐标计算) |
| `template_reader.py` | ~170 行 | 模板样式提取fonts/fills/borders/cols/rows |
### 更新模块
| 模块 | 变更说明 |
|------|----------|
| `main.py` | 增加 `run_list_to_map()` 流程 + 方向选择菜单 |
| `file_selector.py` | 增加 `mode` 参数,支持 "map_to_list" / "list_to_map" |
| `models.py` | 新增 `PinListEntry``EdgePins``PinMAPLayout``LayoutError` |
| `xlsx_writer.py` | 增加 `write_xlsx_with_style()` 支持模板样式写入 |
| `validator.py` | 新增 `PinMapValidator` 类,统一验证接口 |
---
### 技术实现
#### 布局算法
```
总引脚数 = 2 × rows + 2 × cols 4
左边: rows 个引脚(从上到下)
下边: cols 1 个引脚(从左到右)
右边: rows 2 个引脚(从下到上)
上边: cols 1 个引脚(从右到左)
```
#### 坐标映射
```
左边: 序号 (r, 0) → Name (r, 1) 右侧
下边: 序号 (rows, c) → Name (rows-1, c) 上方
右边: 序号 (r, cols) → Name (r, cols-1) 左侧
上边: 序号 (1, c) → Name (2, c) 下方
```
#### 模板样式提取
```
xl/styles.xml:
├── fonts: name, size, bold, italic, color
├── fills: pattern_type, fg_color
├── borders: top, bottom, left, right (style + color)
└── cellXfs: numFmtId, fontId, fillId, borderId, alignment
xl/worksheets/sheet1.xml:
├── cols: column width (min, max, width)
└── sheetData: row height
```
---
### 测试覆盖
#### 单元测试8 个用例)
| 用例 | 测试内容 | 结果 |
|------|----------|------|
| `test_4x4_parse` | 4×4 方形 PinMAP 解析 | ✅ |
| `test_4x4_validate` | 4×4 方形验证 | ✅ |
| `test_missing_names_warning` | PinName 缺失警告 | ✅ |
| `test_duplicate_numbers` | 序号重复检测 | ✅ |
| `test_gap_in_numbers` | 序号不连续检测 | ✅ |
| `test_empty_cells` | 空单元格处理 | ✅ |
| `test_no_pins` | 无引脚数据检测 | ✅ |
| `test_12pin_square` | 12 引脚方形解析 | ✅ |
#### 集成测试6 个用例)
| 用例 | 输入文件 | 测试内容 | 结果 |
|------|----------|----------|------|
| TC001 | `sample_4x4.xlsx` | 标准 4×4 转换8 Pin | ✅ |
| TC002 | `sample_rect.xlsx` | 长方形转换13 Pin | ✅ |
| TC003 | `error_gap.xlsx` | 序号不连续检测 | ✅ |
| TC004 | `error_dup.xlsx` | 序号重复检测 | ✅ |
| TC005 | `warning_missing.xlsx` | PinName 缺失警告 | ✅ |
| TC006 | `error_empty_a1.xlsx` | A1 为空检测 | ✅ |
**测试通过率**100%14/14
---
### 已知问题
---
### 限制
| 限制项 | 说明 |
|--------|------|
| 引脚数量 | 建议 < 1000 引脚(典型封装 < 200 引脚,无压力) |
| 输入格式 | 仅支持 `.xls``.xlsx`,不支持 CSV/其他格式 |
| 输出格式 | 仅输出 `.xlsx`,不支持 `.xls` |
| 工作表 | 仅处理第一个工作表 |
| 公式单元格 | 仅读取公式的计算结果,不保留公式本身 |
| 命令行方向 | 命令行模式直接传入文件默认走 MAP→ListList→MAP 需交互式选择 |
---
### 未来计划
#### v1.3.0 — 格式增强(规划中)
- [ ] 支持 `.xls` 格式输出
- [ ] 保留原始 Excel 的字体和格式MAP→List 方向)
- [ ] 支持多工作表选择
#### v1.4.0 — 功能扩展(规划中)
- [ ] 批量转换(拖拽多个文件)
- [ ] CSV 格式输出
- [ ] PinMAP 结构可视化预览
#### v2.0.0 — 架构升级(远期规划)
- [ ] 支持更多封装类型BGA、QFN 等)
- [ ] 插件式解析器架构
- [ ] Web 界面
---
### 升级指南
**首次使用**:直接运行即可,无需升级。
**从 v1.0.0 升级**:替换 `Code/src/` 目录下所有文件。
**从 v1.1.0 升级**:替换 `Code/src/` 目录下所有文件。
---
### 贡献者
- 架构设计Script Architect
- 编码实现Coding Agent × 3
- 测试验证QA Agent
- 文档编写Doc Gen Agent
---
### 获取帮助
- 查看 `QUICKSTART.md` 了解使用方法
- 查看 `architecture-design.md` 了解技术细节
- 查看 `Test/test_report.md` 了解测试详情
---
## v1.0.0 — 2026-05-25
### 🎉 首次发布