style: 换料G-code改为换盘G-code,弹射后等待改为换盘后等待

This commit is contained in:
2026-07-28 10:47:08 +08:00
parent 8e2797dde6
commit 6b9fd8a93c
4 changed files with 39 additions and 39 deletions
+12 -12
View File
@@ -174,11 +174,11 @@ build/onefile/swap_gcode/
同时启动一次 `build/onefile/a1packer.exe`,确认:
- G-code 下拉框列出已复制的模板。
- G-code 下拉框列出已复制的模板。
- 修改 GUI 选项会创建或更新 `build/onefile/settings.json`
- 首次启动前 `settings.json` 不存在时程序仍能正常运行。
## 换 G-code 模板
## 换 G-code 模板
GUI 会自动扫描以下固定目录:
@@ -200,7 +200,7 @@ swap_gcode/
GUI 中使用方法:
1. 将模板文件放入 `swap_gcode/`
2. 点击 **换 G-code** 旁的 **刷新**
2. 点击 **换 G-code** 旁的 **刷新**
3. 从下拉框中选择模板。
## 可编辑 G-code 补丁
@@ -278,7 +278,7 @@ Metadata/slice_info.config
独立批处理模式下,一次点击为每行输入各生成一个输出 3MF。
### 换 G-code
### 换 G-code
选择插入到每个重复面板中的弹射/换板 G-code 块。
@@ -311,7 +311,7 @@ M190 S45
禁用后,打包器不添加 `M190` 行。
### 弹射后等待时间
### 换盘后等待时间
在 SwapMod G-code 块之后添加驻留时间。
@@ -341,7 +341,7 @@ G4 P45000
启用后,换板/弹射块也会插入到最后一个重复面板之后。
禁用后,最后一个重复面板正常结束,不执行换 G-code 块。
禁用后,最后一个重复面板正常结束,不执行换 G-code 块。
### G-code 补丁
@@ -489,10 +489,10 @@ settings.json
保存的选项包括:
- 当前选中的换 G-code 文件。
- 当前选中的换 G-code 文件。
- 默认份数。
- 热床降温设置。
- 弹射后等待时间。
- 换盘后等待时间。
- 剩余时间板号开关。
- 最后换料开关。
- G-code 补丁开关。
@@ -505,7 +505,7 @@ settings.json
## CLI 使用示例
列出可用的换 G-code 文件:
列出可用的换 G-code 文件:
```bash
python -m a1_swap_mod_packer.cli list-swap-gcode
@@ -563,7 +563,7 @@ python -m a1_swap_mod_packer.cli build \
-o "4 Plates - A_and_B.3mf"
```
指定换 G-code 目录和 ZIP 压缩级别:
指定换 G-code 目录和 ZIP 压缩级别:
```bash
python -m a1_swap_mod_packer.cli build \
@@ -590,10 +590,10 @@ CLI 常用选项速查:
| 选项 | 含义 |
|---|---|
| `--version` | 打印当前版本 |
| `list-swap-gcode` | 列出换 G-code 目录中的文件 |
| `list-swap-gcode` | 列出换 G-code 目录中的文件 |
| `--item PATH COPIES` | 添加一个带独立份数的输入;可多次使用 |
| 位置参数 `inputs` + `--copies N` | 添加多个使用相同份数的输入 |
| `--swap-gcode-dir DIR` | 使用自定义换 G-code 目录 |
| `--swap-gcode-dir DIR` | 使用自定义换 G-code 目录 |
| `--no-bed-cooldown` | 不在换料块前插入 `M190` |
| `--no-swap-after-final` | 最后一块板后不执行换料块 |
| `--line-ending lf\|crlf` | 选择生成 G-code 的换行符;默认 `crlf` |
+10 -10
View File
@@ -1,6 +1,6 @@
"""命令行接口模块:定义参数解析器和命令处理函数。
提供 `build`构建打包 3MF `list-swap-gcode`列出换 G-code 文件
提供 `build`构建打包 3MF `list-swap-gcode`列出换 G-code 文件
两个子命令以及 `main` 入口函数
"""
@@ -94,7 +94,7 @@ def build_command(args: argparse.Namespace) -> int:
def list_swap_gcode_command(args: argparse.Namespace) -> int:
"""执行 'list-swap-gcode' 子命令:列出可用的换 G-code 文件。
"""执行 'list-swap-gcode' 子命令:列出可用的换 G-code 文件。
Args:
args: 解析后的命令行命名空间
@@ -107,7 +107,7 @@ def list_swap_gcode_command(args: argparse.Namespace) -> int:
files = list_swap_gcode_files(directory)
# 目录为空时给出提示
if not files:
print(f"{directory} 中未找到换 G-code 文件")
print(f"{directory} 中未找到换 G-code 文件")
return 0
for path in files:
print(path.name)
@@ -119,7 +119,7 @@ def create_parser() -> argparse.ArgumentParser:
包含两个子命令
- build: 构建打包的 3MF 文件
- list-swap-gcode: 列出换 G-code 文件
- list-swap-gcode: 列出换 G-code 文件
Returns:
argparse.ArgumentParser: 配置完成的参数解析器
@@ -138,19 +138,19 @@ def create_parser() -> argparse.ArgumentParser:
# --item 参数:每个文件可独立指定份数
build.add_argument("--item", nargs=2, action="append", metavar=("PATH", "COPIES"), help="添加一个带有独立份数的输入 3MF 文件。可重复使用。")
build.add_argument("-o", "--output", required=True, help="输出 3MF 路径。")
# 换 G-code 相关
build.add_argument("--swap-gcode", required=True, help=" G-code 文件名,位于 swap_gcode 中,或显式文件路径。")
# 换 G-code 相关
build.add_argument("--swap-gcode", required=True, help=" G-code 文件名,位于 swap_gcode 中,或显式文件路径。")
build.add_argument("--swap-gcode-dir", default=None, help=f"模板目录。默认值:{default_swap_gcode_dir()}")
# 份数与温度
build.add_argument("--copies", type=int, default=1, help="位置参数输入文件的复制份数。")
build.add_argument("--cool-bed", type=int, default=45, help="执行换 G-code 前等待的床温。")
build.add_argument("--cool-bed", type=int, default=45, help="执行换 G-code 前等待的床温。")
build.add_argument("--no-bed-cooldown", action="store_true", help="不在换料代码前插入 M190。")
# 时间与编号
build.add_argument("--wait", type=int, default=45, help="弹射后等待的秒数。")
build.add_argument("--no-eject-wait", action="store_true", help="不插入弹射后等待指令 G4。")
build.add_argument("--wait", type=int, default=45, help="换盘后等待的秒数。")
build.add_argument("--no-eject-wait", action="store_true", help="不插入换盘后等待指令 G4。")
build.add_argument("--show-plate-number", action="store_true", help="每板号向 M73 R 值增加 100 小时。")
# 行为开关
build.add_argument("--no-swap-after-final", action="store_true", help="最后一块板后不执行换 G-code。")
build.add_argument("--no-swap-after-final", action="store_true", help="最后一块板后不执行换 G-code。")
build.add_argument("--metadata-mode", choices=("source", "sum"), default="sum", help="如何写入 slice_info 的 prediction 和 weight。")
build.add_argument("--line-ending", choices=("lf", "crlf"), default="crlf", help="生成 G-code 的换行符。")
build.add_argument("--zip-level", type=int, choices=range(1, 10), default=DEFAULT_ZIP_COMPRESS_LEVEL, metavar="1-9", help="输出 3MF 的 zlib-ng Deflate 压缩级别。默认值:7。")
+15 -15
View File
@@ -3,7 +3,7 @@ A1 SwapMod Packer 的 PySide6 图形用户界面模块。
提供完整的桌面 GUI用于
- 拖放/添加多个 .3mf 输入文件
- 配置换 G-code打包选项输出规则
- 配置换 G-code打包选项输出规则
- 单个或批量构建打包的 3MF 文件
- 显示板缩略图预览合计统计和构建日志
@@ -490,7 +490,7 @@ class MainWindow(QMainWindow):
grid.setVerticalSpacing(6)
# ---- 控件创建 ----
# 换 G-code 选择
# 换 G-code 选择
self.swap_gcode_combo = QComboBox()
self.swap_gcode_combo.setMinimumWidth(260)
self.swap_gcode_combo.setMaximumWidth(440)
@@ -523,8 +523,8 @@ class MainWindow(QMainWindow):
bed_row.addWidget(QLabel("°C"))
bed_row.addStretch(1)
# 弹射后等待时间(勾选后启用,不勾选则不插入等待指令)
self.eject_wait_check = QCheckBox("弹射后等待")
# 换盘后等待时间(勾选后启用,不勾选则不插入等待指令)
self.eject_wait_check = QCheckBox("换盘后等待")
self.eject_wait_check.setChecked(True)
self.wait_spin = QSpinBox()
self.wait_spin.setRange(0, 3600)
@@ -541,7 +541,7 @@ class MainWindow(QMainWindow):
self.show_plate_number_check.setChecked(True)
# 最后换料
self.swap_final_check = QCheckBox("最后一块板后也执行换 G-code")
self.swap_final_check = QCheckBox("最后一块板后也执行换 G-code")
self.swap_final_check.setChecked(True)
# G-code 补丁
@@ -586,8 +586,8 @@ class MainWindow(QMainWindow):
input_handling_row.addStretch(1)
# ---- 网格布局:4 列网格,每行两个选项组 ----
# 第 0 行:[换 G-code | 跨全行]
grid.addWidget(QLabel(" G-code"), 0, 0)
# 第 0 行:[换 G-code | 跨全行]
grid.addWidget(QLabel(" G-code"), 0, 0)
grid.addLayout(swap_gcode_row, 0, 1, 1, 3)
# 第 1 行:默认份数 | 热床降温
@@ -596,8 +596,8 @@ class MainWindow(QMainWindow):
grid.addWidget(QLabel("热床降温"), 1, 2)
grid.addLayout(bed_row, 1, 3)
# 第 2 行:弹射后等待 | 剩余时间板号
grid.addWidget(QLabel("弹射后等待时间"), 2, 0)
# 第 2 行:换盘后等待 | 剩余时间板号
grid.addWidget(QLabel("换盘后等待时间"), 2, 0)
grid.addLayout(eject_wait_row, 2, 1)
grid.addWidget(QLabel("剩余时间板号"), 2, 2)
grid.addWidget(self.show_plate_number_check, 2, 3)
@@ -822,16 +822,16 @@ class MainWindow(QMainWindow):
"{date} — 当前日期,格式 YYYYMMDD\n"
"{time} — 当前时间,格式 HHMMSS\n\n"
"默认规则:\n"
"{plates} Plates - {sources}.3mf\n\n"
"{plates}-Plates-{sources}.3mf\n\n"
"在独立批处理模式下,这些标记会针对每行输入单独计算。",
)
# =========================================================================
# 换 G-code 管理
# 换 G-code 管理
# =========================================================================
def load_swap_gcode_to_combo(self) -> None:
"""扫描换 G-code 目录,填充下拉列表,恢复上次选择。"""
"""扫描换 G-code 目录,填充下拉列表,恢复上次选择。"""
current = self.swap_gcode_combo.currentData() or self._settings.get("last_swap_gcode")
options = self._settings.get("packing_options", {})
if isinstance(options, dict):
@@ -847,7 +847,7 @@ class MainWindow(QMainWindow):
if index >= 0:
self.swap_gcode_combo.setCurrentIndex(index)
if not files:
self.log.append(f"{default_swap_gcode_dir()} 中未找到换 G-code 文件")
self.log.append(f"{default_swap_gcode_dir()} 中未找到换 G-code 文件")
def open_path(self, path: Path) -> None:
"""跨平台打开文件或文件夹(Windows/Mac/Linux)。"""
@@ -861,7 +861,7 @@ class MainWindow(QMainWindow):
subprocess.run(["xdg-open", str(target)], check=False)
def open_swap_gcode_folder(self) -> None:
"""在系统文件管理器中打开换 G-code 目录。"""
"""在系统文件管理器中打开换 G-code 目录。"""
folder = default_swap_gcode_dir()
folder.mkdir(parents=True, exist_ok=True)
self.open_path(folder)
@@ -1311,7 +1311,7 @@ class MainWindow(QMainWindow):
"""根据当前 UI 选项构建 BuildOptions 对象。"""
swap_gcode_path = self.swap_gcode_combo.currentData()
if not swap_gcode_path:
raise ValueError("请在 swap_gcode 文件夹中放入至少一个换 G-code 文件并选择它。")
raise ValueError("请在 swap_gcode 文件夹中放入至少一个换 G-code 文件并选择它。")
cool_bed_temp = self.cool_bed_spin.value() if self.bed_cooldown_check.isChecked() else None
eject_wait_seconds = self.wait_spin.value() if self.eject_wait_check.isChecked() else 0
return BuildOptions(
+2 -2
View File
@@ -4,7 +4,7 @@
## 总览
给一个源 `.3mf` 文件,设好份数和换 G-code,输出一个打包好的新 `.3mf`
给一个源 `.3mf` 文件,设好份数和换 G-code,输出一个打包好的新 `.3mf`
```mermaid
flowchart LR
@@ -102,7 +102,7 @@ max_count = 1 ← 最多替换 1 次
```gcode
M190 S45 ; 等热床降温到 45°C(可选)
[你选的换G-code] ; 弹射/换板动作
[你选的换G-code] ; 弹射/换板动作
G4 P45000 ; 等 45 秒(可选)
```