v1.0.0: PinMAP → PinList 转换器 首次发布
- 支持 .xls (BIFF8) 和 .xlsx 格式 - GUI 文件选择 + 命令行双模式 - 智能结构验证(重复/间隙/空单元格检测) - 逆时针 PinMAP → 顺时针 PinList 自动转换 - Python 标准库,零第三方依赖
This commit is contained in:
60
Code/src/models.py
Normal file
60
Code/src/models.py
Normal file
@@ -0,0 +1,60 @@
|
||||
"""Data models for PinMAP → PinList conversion."""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass
|
||||
class Pin:
|
||||
"""A single pin on the package."""
|
||||
number: int
|
||||
name: str
|
||||
edge: str # "top" | "right" | "bottom" | "left"
|
||||
position_on_edge: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class PinMAP:
|
||||
"""Parsed pin map from an Excel file."""
|
||||
package_info: str
|
||||
pins: list[Pin]
|
||||
width: int
|
||||
height: int
|
||||
grid_origin: tuple[int, int] # (row, col) of top-left corner
|
||||
raw_cells: dict[tuple[int, int], str] = field(default_factory=dict)
|
||||
|
||||
|
||||
@dataclass
|
||||
class PinList:
|
||||
"""Flat pin list for output."""
|
||||
package_info: str
|
||||
rows: list[tuple[str, int]] # [(PinName, Pin序号), ...]
|
||||
|
||||
|
||||
@dataclass
|
||||
class ValidationError:
|
||||
"""A single validation issue."""
|
||||
level: str # "error" | "warning"
|
||||
message: str
|
||||
details: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class ValidationResult:
|
||||
"""Aggregate validation result."""
|
||||
is_valid: bool
|
||||
errors: list[ValidationError] = field(default_factory=list)
|
||||
warnings: list[ValidationError] = field(default_factory=list)
|
||||
|
||||
|
||||
# ── Custom exceptions ──────────────────────────────────────────────
|
||||
|
||||
class PinMapError(Exception):
|
||||
"""Base exception for this project."""
|
||||
|
||||
|
||||
class FileFormatError(PinMapError):
|
||||
"""Raised when a file is not a valid Excel format."""
|
||||
|
||||
|
||||
class StructureError(PinMapError):
|
||||
"""Raised when the PinMAP structure is invalid or unrecognisable."""
|
||||
Reference in New Issue
Block a user