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:
@@ -9,6 +9,26 @@ import sys
|
||||
import os
|
||||
|
||||
|
||||
def show_banner():
|
||||
"""显示程序启动说明"""
|
||||
print("=" * 60)
|
||||
print(" PinMAP → PinList 转换器")
|
||||
print(" 将Excel格式的PinMAP文件转换为PinList格式")
|
||||
print(" 支持.xls和.xlsx格式,输出.xlsx格式")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
|
||||
def wait_for_exit():
|
||||
"""等待用户按键后退出(Windows任意键,其他平台Enter键)"""
|
||||
try:
|
||||
import msvcrt
|
||||
print("按任意键退出...")
|
||||
msvcrt.getch()
|
||||
except ImportError:
|
||||
input("按Enter键退出...")
|
||||
|
||||
|
||||
def build_output_path(input_path: str) -> str:
|
||||
"""Generate output path: {original_filename}_PinList.xlsx"""
|
||||
base, _ = os.path.splitext(input_path)
|
||||
@@ -16,6 +36,9 @@ def build_output_path(input_path: str) -> str:
|
||||
|
||||
|
||||
def main():
|
||||
# ── Banner ──────────────────────────────────────────────────
|
||||
show_banner()
|
||||
|
||||
# ── imports (local to avoid circular issues) ────────────────
|
||||
from file_selector import select_file
|
||||
from xls_reader import read_excel_cells # auto-detects .xls
|
||||
@@ -34,9 +57,11 @@ def main():
|
||||
|
||||
if not filepath:
|
||||
print("未选择文件,退出。")
|
||||
wait_for_exit()
|
||||
return
|
||||
|
||||
# ── 2. Read Excel ───────────────────────────────────────────
|
||||
print(f"[INFO] 正在读取文件: {filepath}")
|
||||
try:
|
||||
if filepath.lower().endswith('.xlsx'):
|
||||
cells = read_xlsx_cells(filepath)
|
||||
@@ -44,39 +69,49 @@ def main():
|
||||
cells = read_excel_cells(filepath)
|
||||
except Exception as e:
|
||||
print(f"[FATAL] 文件读取失败: {e}")
|
||||
wait_for_exit()
|
||||
return
|
||||
|
||||
print(f"[INFO] 文件读取完成,共 {len(cells)} 个非空单元格")
|
||||
|
||||
# ── 3. Parse PinMAP ─────────────────────────────────────────
|
||||
print("[INFO] 正在解析 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}")
|
||||
wait_for_exit()
|
||||
return
|
||||
|
||||
# ── 4. Validate ─────────────────────────────────────────────
|
||||
print("[INFO] 正在验证数据...")
|
||||
validation = validate_pinmap(pinmap)
|
||||
|
||||
# Print errors
|
||||
if validation.errors:
|
||||
print(f"\n[ERROR] 发现 {len(validation.errors)} 个错误:")
|
||||
print(f"[ERROR] 验证未通过,发现 {len(validation.errors)} 个错误:")
|
||||
for err in validation.errors:
|
||||
print(f" - {err.message}: {err.details}")
|
||||
print("\n转换终止,请修正PinMAP文件后重试。")
|
||||
wait_for_exit()
|
||||
return
|
||||
|
||||
# Print warnings (non-fatal — continue processing)
|
||||
if validation.warnings:
|
||||
print(f"\n[WARN] 发现 {len(validation.warnings)} 个警告:")
|
||||
print(f"[WARN] 发现 {len(validation.warnings)} 个警告:")
|
||||
for warn in validation.warnings:
|
||||
print(f" - {warn.message}: {warn.details}")
|
||||
else:
|
||||
print("[INFO] 验证通过")
|
||||
|
||||
# ── 5. Generate PinList ─────────────────────────────────────
|
||||
print("[INFO] 正在生成 PinList...")
|
||||
pinlist = generate_pinlist(pinmap, validation)
|
||||
|
||||
# ── 6. Write XLSX ───────────────────────────────────────────
|
||||
output_path = build_output_path(filepath)
|
||||
print(f"[INFO] 正在写入输出文件: {output_path}")
|
||||
try:
|
||||
data = {}
|
||||
data['A1'] = pinlist.package_info
|
||||
@@ -86,13 +121,20 @@ def main():
|
||||
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}")
|
||||
wait_for_exit()
|
||||
return
|
||||
|
||||
# ── 7. Result summary ───────────────────────────────────────
|
||||
print()
|
||||
print("[SUCCESS] 转换完成!")
|
||||
print(f" 输出文件: {output_path}")
|
||||
print(f" 封装信息: {pinlist.package_info}")
|
||||
print(f" Pin数量: {len(pinlist.rows)}")
|
||||
|
||||
wait_for_exit()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user