# 快速入门指南 本文档帮助你快速上手 PinMAP ↔ PinList 双向转换器。 --- ## 环境要求 ### 系统要求 | 项目 | 要求 | |------|------| | 操作系统 | Windows 7+ / Linux / macOS | | Python | 3.6+(推荐 3.8+) | | 内存 | ≥ 64MB(实际使用 < 20MB) | | 磁盘 | ≥ 1MB | ### 依赖项 **零第三方依赖** — 仅需 Python 标准库。 ```bash # 检查 Python 版本 python --version # 输出示例: Python 3.12.3 ``` ### GUI 支持(可选) - **Windows**: tkinter 内置,开箱即用 - **Linux**: 需要 `python3-tk` 包(`sudo apt install python3-tk`) - **macOS**: tkinter 内置 > 无 GUI 环境时自动回退到命令行模式,不影响核心功能。 --- ## 快速开始 ### 第一步:获取项目 ```bash # 进入项目目录 cd pinmap-to-pinlist/Code/src/ ``` ### 第二步:运行转换 #### 方式一:交互式模式(推荐) ```bash python main.py ``` 运行后显示方向选择菜单,选择 1 或 2: ``` 请选择转换方向: 1 — PinMAP → PinList 2 — PinList → PinMAP 请输入选项 (1/2): _ ``` #### 方式二:命令行模式 ```bash # PinMAP → PinList(直接指定文件) python main.py /path/to/your/PinMAP.xlsx # PinList → PinMAP(命令行模式默认走 MAP→List 方向) # 如需 List→MAP,请使用交互式模式 ``` ### 第三步:查看输出 转换完成后,在当前目录生成输出文件: ``` PinMAP → PinList: QFP44_PinMAP.xlsx → QFP44_PinMAP_PinList.xlsx PinList → PinMAP: QFN20_PinList.xlsx → QFN20_PinList_PinMAP.xlsx ``` --- ## 方向一:PinMAP → PinList 将方形封装引脚布局图转换为线性引脚列表。 ### 操作步骤 1. 运行 `python main.py`,选择方向 **1** 2. 选择 PinMAP 文件(`.xls` 或 `.xlsx`) 3. 等待转换完成 4. 查看输出的 `_PinList.xlsx` 文件 ### 使用示例 **输入文件** `QFP44.xlsx`(6×6 方形封装,8 个引脚): ``` A B C D E F 1 QFP-44 2 Pin6 6 3 Pin5 5 4 1 Pin1 5 2 Pin2 6 Pin3 Pin4 7 3 4 ``` **运行**: ```bash python main.py QFP44.xlsx ``` **输出**: ``` [INFO] 正在读取文件: QFP44.xlsx [INFO] 文件读取完成,共 16 个非空单元格 [INFO] 正在解析 PinMAP 结构... [INFO] 解析完成: 6x6 方形,共 8 个Pin [INFO] 封装信息: QFP-44 [INFO] 正在验证数据... [INFO] 验证通过 [INFO] 正在生成 PinList... [INFO] 正在写入输出文件: QFP44_PinList.xlsx [SUCCESS] 转换完成! 输出文件: QFP44_PinList.xlsx 封装信息: QFP-44 Pin数量: 8 ``` **输出文件内容**: ``` A B 1 QFP-44 2 Pin1 1 3 Pin2 2 4 Pin3 3 5 Pin4 4 6 Pin5 5 7 Pin6 6 ``` ### PinMAP 文件规范 | 要求 | 说明 | |------|------| | A1 单元格 | 必须包含封装信息(如 "QFP-44") | | 方形区域 | 至少 2×2,引脚沿四条边分布 | | 引脚序号 | 1-based 整数,从 1 到 N 连续 | | 排序方向 | 左上角为 1 脚,逆时针排列 | | PinName 位置 | 在序号单元格的"内侧相邻"位置 | ### 四边 PinName 位置 ``` 左边:序号在 (r, min_col),PinName 在 (r, min_col+1) 下边:序号在 (max_row, c),PinName 在 (max_row-1, c) 右边:序号在 (r, max_col),PinName 在 (r, max_col-1) 上边:序号在 (min_row, c),PinName 在 (min_row+1, c) ``` --- ## 方向二:PinList → PinMAP 将线性引脚列表转换为方形封装引脚布局图。 ### 操作步骤 1. 运行 `python main.py`,选择方向 **2** 2. 选择 PinList 文件(`.xls` 或 `.xlsx`) 3. **输入 PinMAP 行数**(至少 2) 4. **输入 PinMAP 列数**(至少 2) 5. 等待转换完成 6. 查看输出的 `_PinMAP.xlsx` 文件 ### 尺寸输入说明 PinMAP 的引脚分布在四条边上,总引脚数由网格尺寸决定: ``` 总引脚数 = 2 × 行数 + 2 × 列数 − 4 ``` 常见封装尺寸参考: | 封装类型 | 引脚数 | 推荐行数 | 推荐列数 | |----------|--------|----------|----------| | QFP-8 | 8 | 4 | 4 | | QFP-16 | 16 | 6 | 6 | | QFP-20 | 20 | 6 | 6 | | QFP-24 | 24 | 8 | 6 | | QFP-32 | 32 | 10 | 8 | | QFP-44 | 44 | 12 | 10 | | QFP-64 | 64 | 16 | 16 | | QFP-100 | 100 | 26 | 26 | > **提示**:如果不确定尺寸,可以先用公式反推:`行数 + 列数 = (引脚数 + 4) / 2`,然后根据需要调整行和列的比例。 ### 模板文件说明 PinList → PinMAP 转换时,程序会自动尝试从输入文件所在目录读取模板样式: - **模板来源**:程序会尝试解析与输入文件同名的 `.xlsx` 模板文件中的样式信息 - **提取内容**:字体(名称、大小、粗体、斜体、颜色)、填充、边框、列宽、行高 - **优雅降级**:如果模板不存在或解析失败,程序会自动使用默认样式,不影响转换流程 ### 使用示例 **输入文件** `QFN20_PinList.xlsx`(20 个引脚): ``` A B 1 QFN-20 2 VCC 1 3 GND 2 4 IO0 3 5 IO1 4 6 IO2 5 7 IO3 6 8 IO4 7 9 IO5 8 10 IO6 9 11 IO7 10 12 NC 11 13 NC 12 14 NC 13 15 NC 14 16 NC 15 17 NC 16 18 NC 17 19 NC 18 20 NC 19 21 NC 20 ``` **运行**: ```bash python main.py # 选择方向: 2 (PinList → PinMAP) # 选择文件: QFN20_PinList.xlsx # 输入行数: 6 # 输入列数: 6 ``` **输出**: ``` [INFO] PinMAP 尺寸: 6 行 × 6 列 [INFO] 正在解析 PinList 文件: QFN20_PinList.xlsx [INFO] 解析完成: 封装信息 'QFN-20', 共 20 个引脚 [INFO] 正在验证数据... [INFO] 验证通过 [INFO] 正在生成 PinMAP 并写入: QFN20_PinList_PinMAP.xlsx [SUCCESS] 转换完成! 输出文件: QFN20_PinList_PinMAP.xlsx 封装信息: QFN-20 PinMAP 尺寸: 6×6 Pin数量: 20 ``` **输出文件内容**(6×6 网格,20 个引脚): ``` A B C D E F 1 QFN-20 IO8 IO7 2 1 VCC IO6 IO5 3 2 GND IO4 IO3 4 3 IO0 IO2 IO1 5 4 IO1 NC NC 6 20 19 18 17 16 ``` ### 布局规则 引脚按**逆时针**分配到四条边(左上角为 1 脚): ``` 左边: 从上到下(rows 个引脚) 下边: 从左到右(cols − 1 个引脚) 右边: 从下到上(rows − 2 个引脚) 上边: 从右到左(cols − 1 个引脚) ``` PinName 与序号的相对位置: ``` 左边:Name 在序号右侧 下边:Name 在序号上方 右边:Name 在序号左侧 上边:Name 在序号下方 ``` --- ## 使用示例汇总 ### 示例 1:标准方形 PinMAP(MAP→List) **输入** `QFP44.xlsx`(6×6,8 Pin) ```bash python main.py QFP44.xlsx ``` **输出** `QFP44_PinList.xlsx`(A 列 PinName,B 列序号) ### 示例 2:长方形 PinMAP(MAP→List) **输入** `LQFP100.xlsx`(长方形,13 Pin) ```bash python main.py LQFP100.xlsx ``` **输出** `LQFP100_PinList.xlsx` ### 示例 3:标准 PinList(List→MAP) **输入** `QFN20_PinList.xlsx`(20 Pin) ```bash python main.py # 选择 2,输入 6×6 ``` **输出** `QFN20_PinList_PinMAP.xlsx`(6×6 方形) ### 示例 4:处理警告 当 PinMAP 中部分引脚缺少 PinName 时: ``` [WARN] 发现 3 个警告: - 检测到 3 个引脚缺少 PinName: 缺失引脚序号: [2, 3, 4],将默认为 NC [SUCCESS] 转换完成! ``` 缺失 PinName 的引脚在输出中自动标记为 "NC"。 ### 示例 5:处理错误 当 PinList 引脚数与网格尺寸不匹配时: ``` [ERROR] 验证未通过,发现 1 个错误: - Pin数量与网格周长不匹配: 网格 6×6 需要 20 个引脚,但 PinList 有 24 个 转换终止,请修正PinList文件或网格尺寸后重试。 ``` --- ## 支持的格式 ### 输入格式 | 格式 | 扩展名 | 支持情况 | |------|--------|----------| | Excel 97-2003 | `.xls` | ✅ 支持(BIFF8 引擎) | | Excel 2007+ | `.xlsx` | ✅ 支持(OOXML 引擎) | ### 输出格式 | 格式 | 扩展名 | 说明 | |------|--------|------| | Excel 2007+ | `.xlsx` | 唯一输出格式 | --- ## 常见问题 ### Q1: 运行时提示 "未选择文件,退出" **原因**:在 GUI 模式下点击了"取消",或在无 GUI 环境下未提供命令行参数。 **解决**: ```bash # 提供命令行参数 python main.py input.xlsx ``` ### Q2: 提示 "文件读取失败" **可能原因**: - 文件路径不存在 - 文件格式不是有效的 Excel 文件 - 文件已损坏 **解决**: - 检查文件路径是否正确 - 确认文件可以用 Excel 正常打开 - 尝试用 Excel 重新保存文件 ### Q3: 提示 "A1 单元格为空,缺少封装信息" **原因**:文件的 A1 单元格为空。 **解决**:在 Excel 中打开文件,在 A1 单元格填入封装信息(如 "QFP-44"),保存后重新转换。 ### Q4: 提示 "Pin序号不连续" **原因**:Pin 序号存在间隔(如 1, 2, 4, 5,缺少 3)。 **解决**:检查文件,补全缺失的引脚序号。 ### Q5: 提示 "Pin序号重复" **原因**:同一个 Pin 序号出现了多次。 **解决**:检查文件,修正重复的序号。 ### Q6: 提示 "Pin数量与网格周长不匹配" **原因**:PinList 的引脚数与输入的 rows×cols 网格周长不一致。 **解决**: - 检查引脚数量是否正确 - 或调整网格尺寸,使 `2×rows + 2×cols − 4 = 引脚数` ### Q7: 警告 "检测到 N 个引脚缺少 PinName" **说明**:这是警告而非错误,转换会继续进行。缺失的 PinName 会自动设为 "NC"。 **解决**(可选):在 Excel 中补全缺失的 PinName,重新转换。 ### Q8: Linux 下没有弹出文件选择对话框 **说明**:Linux 无头环境(无显示器)不支持 tkinter GUI。 **解决**:使用命令行模式: ```bash python main.py /path/to/input.xlsx ``` 如需 GUI,安装 tkinter: ```bash sudo apt install python3-tk ``` ### Q9: 输出文件打不开 **可能原因**:Excel 版本过旧(2003 及以下不支持 .xlsx)。 **解决**:使用 Excel 2007+ 或 WPS Office 打开输出文件。 ### Q10: 支持多大的 PinMAP? **回答**:当前实现适合 < 1000 引脚的场景。典型 IC 封装引脚数在 8~200 之间,完全满足需求。 ### Q11: 能否批量转换多个文件? **回答**:当前版本一次处理一个文件。如需批量转换,可使用 shell 脚本: ```bash # PinMAP → PinList for f in *.xlsx; do python main.py "$f" done ``` ### Q12: 命令行模式下如何执行 PinList → PinMAP? **回答**:命令行模式下直接传入文件参数默认走 PinMAP → PinList 方向。如需执行 PinList → PinMAP,请使用交互式模式(不带参数运行),选择方向 2。 --- ## 测试验证 运行内置单元测试: ```bash cd Code/src/ python test_pinmap.py ``` 预期输出: ``` ✓ test_4x4_parse passed ✓ test_4x4_validate passed ✓ test_missing_names_warning passed ✓ test_duplicate_numbers passed ✓ test_gap_in_numbers passed ✓ test_empty_cells passed ✓ test_no_pins passed ✓ test_12pin_square passed ✅ All tests passed! ```