"""ZIP 归档文件中 G-code 成员的读取与解析。 本模块提供了从 .3mf 或 .zip 归档文件中列出 G-code 文件路径的功能, 主要用于识别 Metadata 目录下按 plate_<编号>.gcode 命名的换板 G-code 文件。""" from __future__ import annotations import re import zipfile # 匹配 Metadata 目录下 plate_<数字>.gcode 格式的文件名 GCODE_MEMBER_RE = re.compile(r"^Metadata/plate_(\d+)\.gcode$") # 匹配对应的 MD5 校验文件 plate_<数字>.gcode.md5 MD5_MEMBER_RE = re.compile(r"^Metadata/plate_(\d+)\.gcode\.md5$") def list_gcode_members(archive: zipfile.ZipFile) -> list[str]: """列出归档文件中所有 plate G-code 成员,按板号升序排列。 参数: archive: 已打开的 ZIP 归档文件对象。 返回: 按 plate 编号从小到大排序的 G-code 文件名列表。 """ members: list[tuple[int, str]] = [] for name in archive.namelist(): match = GCODE_MEMBER_RE.match(name) if match: # 提取板号并存储 (板号, 文件名) 元组 members.append((int(match.group(1)), name)) # 按板号升序排列后只返回文件名 return [name for _, name in sorted(members)]