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: 修改需求评估文档
This commit is contained in:
2026-05-25 17:29:19 +08:00
parent 5fbc215e59
commit 836ad20515
35 changed files with 4105 additions and 25 deletions

View File

@@ -0,0 +1,98 @@
"""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()