Files
pinmap-to-pinlist/Releases/v1.0.1/source/main.py
Agent 836ad20515 v1.1.0: 增加交互提示、路径输入、窗口属性配置
- main.py: 增加show_banner()启动说明、各阶段[INFO]日志、结果摘要、任意键退出
- file_selector.py: 重写为路径输入→验证→空输入弹窗回退→不存在循环重试
- run.bat: 新建启动脚本(chcp 65001, mode con cols=80 lines=20, color 0B, title固定署名, pause)
- Code/docs/modification-assessment.md: 修改需求评估文档
2026-05-25 17:29:19 +08:00

99 lines
3.8 KiB
Python
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.
"""PinMAP → PinList converter
Usage:
python main.py # Interactive file selection
python main.py input.xls # Specify file via command line
"""
import sys
import os
def build_output_path(input_path: str) -> str:
"""Generate output path: {original_filename}_PinList.xlsx"""
base, _ = os.path.splitext(input_path)
return f"{base}_PinList.xlsx"
def main():
# ── imports (local to avoid circular issues) ────────────────
from file_selector import select_file
from xls_reader import read_excel_cells # auto-detects .xls
from xlsx_reader import read_excel_cells as read_xlsx_cells
from pinmap_parser import parse_pinmap
from validator import validate_pinmap
from pinlist_generator import generate_pinlist
from xlsx_writer import write_xlsx
from models import FileFormatError, StructureError
# ── 1. File selection ───────────────────────────────────────
if len(sys.argv) > 1:
filepath = sys.argv[1]
else:
filepath = select_file()
if not filepath:
print("未选择文件,退出。")
return
# ── 2. Read Excel ───────────────────────────────────────────
try:
if filepath.lower().endswith('.xlsx'):
cells = read_xlsx_cells(filepath)
else:
cells = read_excel_cells(filepath)
except Exception as e:
print(f"[FATAL] 文件读取失败: {e}")
return
# ── 3. Parse PinMAP ─────────────────────────────────────────
try:
pinmap = parse_pinmap(cells)
print(f"[INFO] 解析完成: {pinmap.width}x{pinmap.height} 方形,共 {len(pinmap.pins)} 个Pin")
print(f"[INFO] 封装信息: {pinmap.package_info}")
except (FileFormatError, StructureError) as e:
print(f"[FATAL] 结构错误: {e}")
return
# ── 4. Validate ─────────────────────────────────────────────
validation = validate_pinmap(pinmap)
# Print errors
if validation.errors:
print(f"\n[ERROR] 发现 {len(validation.errors)} 个错误:")
for err in validation.errors:
print(f" - {err.message}: {err.details}")
print("\n转换终止请修正PinMAP文件后重试。")
return
# Print warnings (non-fatal — continue processing)
if validation.warnings:
print(f"\n[WARN] 发现 {len(validation.warnings)} 个警告:")
for warn in validation.warnings:
print(f" - {warn.message}: {warn.details}")
# ── 5. Generate PinList ─────────────────────────────────────
pinlist = generate_pinlist(pinmap, validation)
# ── 6. Write XLSX ───────────────────────────────────────────
output_path = build_output_path(filepath)
try:
data = {}
data['A1'] = pinlist.package_info
for i, (pin_name, pin_num) in enumerate(pinlist.rows):
row = i + 2 # data rows start at row 2
data[f'A{row}'] = pin_name
data[f'B{row}'] = str(pin_num)
write_xlsx(data, output_path)
print(f"\n[SUCCESS] 转换完成!输出文件: {output_path}")
print(f" - 封装信息: {pinlist.package_info}")
print(f" - Pin数量: {len(pinlist.rows)}")
except Exception as e:
print(f"[FATAL] 输出失败: {e}")
return
if __name__ == '__main__':
main()