"""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()