diff --git a/README.md b/README.md index b8b09b6..3bcb671 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,103 @@ # A1 Swap Mod Packer -Current version: **v0.5.0** +当前版本:**v0.5.0** -A1 Swap Mod Packer is an open-source implementation 3MF packer for Bambu Lab A1 SwapMod workflows. +A1 Swap Mod Packer 是一个开源的 3MF 打包工具,专为 Bambu Lab A1 SwapMod 工作流设计。 -It takes one or more A1-sliced `.3mf` files, repeats their plate G-code according to copy counts, inserts an external SwapMod ejection/swap G-code block, and writes a new packed `.3mf` that can be sent to the printer. +它接收一个或多个 A1 切片后的 `.3mf` 文件,根据设定份数重复其面板 G-code,插入外部 SwapMod 弹射/换板 G-code 块,并输出一个新的打包 `.3mf` 文件,可直接发送至打印机。 -![A1 Swap Mod Packer Screenshot](docs/GUI_window.webp) +![A1 Swap Mod Packer 截图](docs/GUI_window.webp) -## Notes +## 注意事项 -- This project contains no proprietary code. All functionalities were implemented independently by comparing the states before and after 3MF file generation. -- Currently, this project has only been tested and verified on Windows 10. -- Always test a generated file on a safe/simple print before using it in production. +- 本项目不含任何闭源代码。所有功能均通过对比 3MF 文件生成前后的状态独立实现。 +- 目前仅在 Windows 10 上测试验证过。 +- 生产环境使用前,请先在安全/简单的打印任务上测试生成的文件。 -## Key features +## 主要功能 -- GUI for drag-and-drop batch packing. -- CLI for repeatable automation. -- Multiple input `.3mf` files. -- Per-file copy count. -- Automatic time and filament summary from `Metadata/slice_info.config`. -- External SwapMod G-code template folder. -- Editable G-code patch file. -- Optional remaining-time plate-number encoding through `M73 R...`. -- Selected-input thumbnail preview in the GUI. -- Packed preview image composition from up to 9 unique input files, with a short `{plates} P` label. -- Combined mode: all input rows become one packed 3MF. -- Individual batch mode: every input row becomes its own packed 3MF. -- zlib-ng Deflate ZIP compression level, defaulting to Level 7. -- GUI settings are saved to the program folder as `settings.json`. +- 拖放式批量打包 GUI。 +- 可重复执行的自动化 CLI。 +- 支持多个 `.3mf` 输入文件。 +- 每个文件独立份数。 +- 自动从 `Metadata/slice_info.config` 读取并汇总时间和耗材。 +- 外部 SwapMod G-code 模板目录。 +- 可编辑 G-code 补丁文件。 +- 可选通过 `M73 R...` 编码剩余时间板号。 +- GUI 中选中文件缩略图预览。 +- 最多 9 个不同输入文件的预览图合成,带 `{plates} P` 绿色标签。 +- 合并模式:所有输入行合并为一个打包 3MF。 +- 独立批处理模式:每行输入各生成一个独立打包 3MF。 +- zlib-ng Deflate ZIP 压缩,默认级别 7。 +- GUI 设置保存到程序目录的 `settings.json`。 -## Installation for source use +## 源码安装 -Python 3.10 or newer is recommended. +推荐 Python 3.10 及以上。 -Install dependencies: +安装依赖: ```bash pip install -r requirements.txt ``` -Current runtime dependencies: +当前运行时依赖: -| Dependency | Used for | +| 依赖 | 用途 | |---|---| -| `PySide6` | GUI application, drag-and-drop table, file dialogs, thumbnail preview, and settings UI | -| `Pillow` | Reading and composing PNG preview images inside the output 3MF, including the `{plates} P` label | -| `zlib-ng` | Required ZIP Deflate backend for writing compressed 3MF files and honoring the compression level | +| `PySide6` | GUI 界面、拖放表格、文件对话框、缩略图预览、设置界面 | +| `Pillow` | 读取和合成输出 3MF 中的 PNG 预览图,包括 `{plates} P` 标签 | +| `zlib-ng` | ZIP Deflate 压缩后端,用于写入压缩 3MF 并控制压缩级别 | -No Java runtime, Bambu Studio SDK, external archive tool, or encrypted/template decoder is required by the current Python source version. +当前 Python 源码版本不需要 Java 运行时、Bambu Studio SDK、外部压缩工具或加密/模板解码器。 -Run the GUI: +启动 GUI: ```bash python -m a1_swap_mod_packer.gui ``` -or +或 ```bash python run_gui.py ``` -Run the CLI: +启动 CLI: ```bash python -m a1_swap_mod_packer.cli --help ``` -or +或 ```bash python run_cli.py ``` -Show the version: +查看版本: ```bash python -m a1_swap_mod_packer.cli --version ``` -## Build Windows executables +## 构建 Windows 可执行文件 -The repository includes a Windows build script: +仓库包含 Windows 构建脚本: ```cmd build_win.cmd ``` -The script uses Nuitka onefile mode and creates this portable release folder: +脚本使用 Nuitka onefile 模式,生成如下便携发布目录: ```text build/onefile/ ``` -Expected output: +预期输出: ```text build/onefile/ @@ -105,10 +105,10 @@ build/onefile/ a1packer-cli.exe gcode_patches.ini swap_gcode/ - settings.json Optional; created by the GUI after settings are saved + settings.json 可选;GUI 保存设置后自动生成 ``` -External resources are intentionally kept outside the executables. Do not pack these files into the onefile binary: +外部资源刻意保留在可执行文件外部。不要将这些文件打包进 onefile 二进制: ```text swap_gcode/ @@ -116,20 +116,20 @@ gcode_patches.ini settings.json ``` -The application resolves these paths from the executable folder when running as a packaged exe. +打包为 exe 时,程序会从 exe 所在目录解析这些路径。 -### Windows build requirements +### Windows 构建要求 -Tested build environment: +已验证的构建环境: -- Windows 10. -- Python 3.10 or newer. -- A virtual environment at `.venv/`. -- Project runtime dependencies from `requirements.txt`. -- Nuitka with onefile support. -- Microsoft C++ Build Tools / Visual Studio Build Tools with the MSVC compiler and Windows SDK. +- Windows 10。 +- Python 3.10 及以上。 +- 虚拟环境 `.venv/`。 +- `requirements.txt` 中的运行时依赖。 +- Nuitka 支持 onefile 模式。 +- Microsoft C++ Build Tools / Visual Studio Build Tools(含 MSVC 编译器和 Windows SDK)。 -Install the Python dependencies in a fresh virtual environment: +在干净的虚拟环境中安装 Python 依赖: ```cmd py -3.12 -m venv .venv @@ -138,53 +138,55 @@ py -3.12 -m venv .venv .venv\Scripts\python.exe -m pip install "Nuitka[onefile]" ``` -Then run: +然后执行: ```cmd build_win.cmd ``` -The build script performs two Nuitka builds: +构建脚本执行两次 Nuitka 编译: -- GUI: `run_gui.py` -> `build/onefile/a1packer.exe` -- CLI: `run_cli.py` -> `build/onefile/a1packer-cli.exe` +- GUI:`run_gui.py` → `build/onefile/a1packer.exe` +- CLI:`run_cli.py` → `build/onefile/a1packer-cli.exe` -The GUI build enables the PySide6 plugin and includes the Qt plugin groups needed by the current interface: +GUI 编译启用 PySide6 插件并包含当前界面所需的 Qt 插件组: ```text platforms,imageformats,styles,iconengines ``` -### After building +### 构建后验证 -Before publishing the folder, verify the CLI can see the external resources: +发布目录前,先确认 CLI 能识别外部资源: ```cmd build\onefile\a1packer-cli.exe --version build\onefile\a1packer-cli.exe list-swap-gcode ``` -The second command should list files from: +第二条命令应列出: ```text build/onefile/swap_gcode/ ``` -Also start `build/onefile/a1packer.exe` once and confirm that: +中的文件。 -- The Swap G-code dropdown lists the copied templates. -- Editing GUI options creates or updates `build/onefile/settings.json`. -- The app still runs if `settings.json` is absent before first launch. +同时启动一次 `build/onefile/a1packer.exe`,确认: -## Swap G-code templates +- 换料 G-code 下拉框列出已复制的模板。 +- 修改 GUI 选项会创建或更新 `build/onefile/settings.json`。 +- 首次启动前 `settings.json` 不存在时程序仍能正常运行。 -The GUI automatically scans this fixed folder: +## 换料 G-code 模板 + +GUI 会自动扫描以下固定目录: ```text swap_gcode/ ``` -Plain UTF-8 text files are read directly. The current scanner accepts these suffixes: +纯 UTF-8 文本文件直接读取。当前扫描器接受以下后缀: ```text .gcode @@ -193,23 +195,23 @@ Plain UTF-8 text files are read directly. The current scanner accepts these suff .txt ``` -The current source version does not decode encrypted or vendor-template G-code archives. +当前源码版本不解码加密的或厂商模板的 G-code 归档。 -In the GUI: +GUI 中使用方法: -1. Put template files in `swap_gcode/`. -2. Click **Refresh** next to **Swap G-code**. -3. Select the template from the dropdown. +1. 将模板文件放入 `swap_gcode/`。 +2. 点击 **换料 G-code** 旁的 **刷新**。 +3. 从下拉框中选择模板。 -## Editable G-code patches +## 可编辑 G-code 补丁 -The GUI and CLI read the fixed patch file: +GUI 和 CLI 都读取固定补丁文件: ```text gcode_patches.ini ``` -Default rule: +默认规则: ```ini [patch.a1_start_y] @@ -220,198 +222,198 @@ replace = G0 Y250 F3000 ; Patched max_count = 1 ``` -Meaning: +含义: -- Search after the optional `flag` line. -- Replace the first matching `find` line with `replace`. -- Apply at most `max_count` replacements. +- 从可选的 `flag` 行之后开始查找。 +- 将第一个匹配 `find` 的行替换为 `replace`。 +- 最多替换 `max_count` 次。 -You can disable this in the GUI with **G-code patches**, or edit the INI file and keep the option enabled. +可在 GUI 中通过 **G-code 补丁** 复选框禁用,或编辑 INI 文件并保持启用。 -The swap insertion marker can also be edited: +换板插入标记也可编辑: ```ini [swap] insert_before_marker = ;=====printer finish sound========= ``` -## GUI guide +## GUI 使用指南 -### Input 3MF files +### 输入 3MF 文件 -The input table supports: +输入表格支持: -- **Add 3MF**: choose one or more `.3mf` files. -- Drag and drop `.3mf` files into the table. -- Drag and drop a folder into the table. The GUI adds top-level `.3mf` files from that folder. -- **Remove**: remove selected rows. -- **Remove All**: clear the full input list. -- **Move Up / Move Down**: change input order. -- **Apply Default Copies to Selected**: overwrite selected rows with the current default copy count. +- **添加 3MF**:选择一个或多个 `.3mf` 文件。 +- 拖放 `.3mf` 文件到表格中。 +- 拖放文件夹到表格中。GUI 会添加该文件夹内所有顶层 `.3mf` 文件。 +- **移除**:移除选中行。 +- **全部移除**:清空全部输入列表。 +- **上移 / 下移**:调整输入顺序。 +- **应用默认份数至选中行**:将当前默认份数覆盖到选中行。 -Columns: +列说明: -- **3MF path**: source file path. -- **Copies**: how many times this source should be repeated. -- **Time**: estimated print time multiplied by copies. -- **Filament**: estimated filament multiplied by copies. +- **3MF 文件**:源文件路径。 +- **份数**:该源文件重复的次数。 +- **时间**:预估打印时间 × 份数。 +- **耗材**:预估耗材用量 × 份数。 -The time and filament values are read from: +时间和耗材数据读取自: ```text Metadata/slice_info.config ``` -If the source 3MF lacks this metadata, the GUI shows `Unknown`. +如果源 3MF 缺少此元数据,GUI 显示"未知"。 -The summary line under the input list shows the total plate count, estimated time, and filament for the current table. +输入列表下方的汇总行显示当前表格的总板数、预估时间和耗材。 -The right-side thumbnail panel shows the selected input file's active plate preview when one is available in the 3MF. +右侧缩略图面板显示选中输入文件的活动面板预览(若 3MF 中包含)。 -### Build 3MF button +### 构建 3MF 按钮 -The **Build 3MF** button is placed below the input list on the right side for fast batch operation. +**构建 3MF** 按钮位于输入列表右下方,便于快速批量操作。 -In normal combined mode, one click creates one output 3MF containing all input rows. +正常合并模式下,一次点击生成一个包含所有输入行的输出 3MF。 -In individual batch mode, one click creates one output 3MF per input row. +独立批处理模式下,一次点击为每行输入各生成一个输出 3MF。 -### Swap G-code +### 换料 G-code -Selects the ejection/swap G-code block inserted into each repeated plate. +选择插入到每个重复面板中的弹射/换板 G-code 块。 -The dropdown is generated from files in: +下拉框内容来自: ```text swap_gcode/ ``` -Buttons: +按钮: -- **Refresh**: rescan the folder. -- **Open Folder**: open the template folder. +- **刷新**:重新扫描目录。 +- **打开文件夹**:打开模板目录。 -### Default copies for new inputs +### 新输入的默认份数 -Sets the default copy count applied to newly added or dragged-in files. +设置添加到或拖入的新文件的默认份数。 -This does not automatically change existing rows. Use **Apply Default Copies to Selected** for existing rows. +这不会自动更改已有行。对已有行使用 **应用默认份数至选中行**。 -### Bed cooldown +### 热床降温 -Controls whether the tool inserts a bed temperature wait before the SwapMod G-code block. +控制是否在 SwapMod G-code 块之前插入热床等待温度。 -Enabled example: +启用示例: ```gcode M190 S45 ``` -If disabled, no `M190` line is added by the packer. +禁用后,打包器不添加 `M190` 行。 -### Wait after ejection +### 弹射后等待时间 -Adds a dwell after the SwapMod G-code block. +在 SwapMod G-code 块之后添加驻留时间。 -Example for 45 seconds: +45 秒示例: ```gcode G4 P45000 ``` -### Remaining-time plate number +### 剩余时间板号 -When enabled, the packer offsets `M73 ... R...` remaining-time values by: +启用后,打包器按以下公式偏移 `M73 ... R...` 剩余时间值: ```text -plate_number × 100 hours × 60 minutes +板号 × 100 小时 × 60 分钟 ``` -This allows the A1 remaining-time hour hundreds digit to display the current plate number. +这使得 A1 剩余时间的百位能显示当前板号。 -Example concept: +示例: -- Plate 1: +6000 minutes -- Plate 2: +12000 minutes -- Plate 3: +18000 minutes +- 第 1 板:+6000 分钟 +- 第 2 板:+12000 分钟 +- 第 3 板:+18000 分钟 -### Final swap +### 最后换料 -When enabled, the swap/ejection block is also inserted after the final repeated plate. +启用后,换板/弹射块也会插入到最后一个重复面板之后。 -When disabled, the final repeated plate ends normally without running the swap G-code block. +禁用后,最后一个重复面板正常结束,不执行换料 G-code 块。 -### G-code patches +### G-code 补丁 -Applies rules from: +应用来自以下文件的规则: ```text gcode_patches.ini ``` -The **Open Config** button opens that fixed file for editing. +**打开配置文件** 按钮打开该固定文件进行编辑。 -### 3MF metadata +### 3MF 元数据 -Options: +选项: -- **Keep source prediction and weight** - Leaves `slice_info.config` prediction and weight values from the base 3MF unchanged. This best matches the observed vendor packer behavior. +- **保留原始预测和重量** + 保持基础 3MF 中 `slice_info.config` 的预测和重量值不变。这与观察到的厂商打包器行为最一致。 -- **Sum prediction and filament** - Updates the first plate metadata using the sum of all repeated source plates. This is more logically correct for statistics, but may differ from the vendor software. +- **累加预测和耗材用量** + 使用所有重复面板的总和更新第一块面板的元数据。从统计角度看更合理,但可能与厂商软件的表现不同。 -### Preview image handling +### 预览图处理 -By default, the output 3MF keeps the base archive preview members for the active output plate and rewrites those PNG previews with: +默认情况下,输出 3MF 保留基础归档中对应当前输出面板的预览成员,并用以下内容重写这些 PNG 预览: -- a composite of up to 9 unique input-file preview images; -- a short green label such as `5 P`, applied once to the final composite. +- 最多 9 个不同输入文件的预览图合成; +- 一个简短的绿色标签(如 `5 P`),施加在最终合成图上。 -If preview images are missing or cannot be read, the packer keeps the available base preview and still tries to apply the short plate label. +如果预览图缺失或无法读取,打包器保留可用基础预览,仍尝试施加面板标签。 -The CLI can disable preview rewriting with: +CLI 可通过以下选项禁用预览重写: ```bash --no-preview-label ``` -### Batch mode +### 批处理模式 -#### Combined mode +#### 合并模式 -Default behavior. +默认行为。 -All input rows are packed into one output file. +所有输入行打包为一个输出文件。 -Example: +示例: ```text -A.3mf copies 2 -B.3mf copies 3 +A.3mf 份数 2 +B.3mf 份数 3 ``` -Output: +输出: ```text -one packed 3MF containing A, A, B, B, B +一个打包 3MF,包含 A, A, B, B, B ``` -#### Individual batch mode +#### 独立批处理模式 -When enabled, the GUI shows an explanation popup. +启用时,GUI 显示说明弹窗。 -Every input row is treated as an independent build. +每行输入被视为独立构建。 -Example: +示例: ```text -A.3mf copies 5 -B.3mf copies 5 -C.3mf copies 5 +A.3mf 份数 5 +B.3mf 份数 5 +C.3mf 份数 5 ``` -Output: +输出: ```text 5 Plates - A.3mf @@ -419,55 +421,55 @@ Output: 5 Plates - C.3mf ``` -This is intended for quickly converting a large batch of independent single-plate 3MF files into multi-copy SwapMod packs. +此模式用于快速将大量独立的单板 3MF 文件批量转换为多份数 SwapMod 包。 -The GUI builds these independent outputs in parallel, capped by CPU count and a small safety limit. +GUI 并行构建这些独立输出,并发数受 CPU 核心数及安全上限限制。 -It does **not** combine all inputs into one file. +它**不会**将所有输入合并为一个文件。 -### Input handling +### 输入处理 -Options: +选项: -- **Skip duplicate file paths when adding inputs** - Prevents accidentally adding the same path multiple times. +- **添加输入时跳过重复文件路径** + 防止意外多次添加同一路径。 -- **Clear input list after successful build** - Clears the table after a successful build. In individual batch mode, the list is cleared only if all outputs are built successfully. +- **构建成功后清空输入列表** + 构建成功后清空表格。在独立批处理模式下,仅当所有输出构建成功后才会清空。 -### Output directory +### 输出目录 -If this field is empty: +如果此字段为空: -- Combined mode writes next to the first input file. -- Individual batch mode writes each output next to its own input file. +- 合并模式写入第一个输入文件同目录。 +- 独立批处理模式将每个输出写入各自输入文件同目录。 -If a directory is selected, all outputs go to that directory. +如果选择了目录,所有输出都写入该目录。 -### Output filename rule +### 输出文件名规则 -Default: +默认规则: ```text {plates} Plates - {sources}.3mf ``` -Click the `?` button next to the rule field to show token help. +点击规则字段旁的 `?` 按钮显示标记帮助。 -Available tokens: +可用标记: -| Token | Meaning | +| 标记 | 含义 | |---|---| -| `{source}` | First input file stem, without `.3mf` | -| `{sources}` | Source summary. One source uses its stem; multiple sources become `first_source_and_N_more` | -| `{plates}` | Total plate count in this output | -| `{copies}` | Total copy count in this output | -| `{date}` | Current date as `YYYYMMDD` | -| `{time}` | Current time as `HHMMSS` | +| `{source}` | 第一个输入文件的文件名(不含 `.3mf`) | +| `{sources}` | 源文件摘要。单个源使用其文件名;多个源则显示为 `first_source_and_N_more` | +| `{plates}` | 本输出中的总板数 | +| `{copies}` | 本输出中的总份数 | +| `{date}` | 当前日期,格式 `YYYYMMDD` | +| `{time}` | 当前时间,格式 `HHMMSS` | -In individual batch mode, tokens are calculated per input row. +在独立批处理模式下,标记按每行输入单独计算。 -Examples: +示例: ```text {plates} Plates - {sources}.3mf @@ -475,41 +477,41 @@ SwapMod - {source} - x{copies}.3mf {date}_{time}_{source}.3mf ``` -## GUI settings +## GUI 设置 -The GUI writes settings to the program folder: +GUI 将设置写入程序目录: ```text settings.json ``` -This is intentional so a portable extracted folder or future packaged `.exe` build keeps its options next to the application. +这是有意为之,以便便携式解压目录或打包的 `.exe` 版本能将选项保持在应用程序旁边。 -Saved options include: +保存的选项包括: -- Selected Swap G-code file. -- Default copies. -- Bed cooldown settings. -- Wait after ejection. -- Remaining-time plate-number switch. -- Final swap switch. -- G-code patch switch. -- Metadata mode. -- ZIP compression level. -- Individual batch mode. -- Input handling options. -- Output directory. -- Output filename rule. +- 当前选中的换料 G-code 文件。 +- 默认份数。 +- 热床降温设置。 +- 弹射后等待时间。 +- 剩余时间板号开关。 +- 最后换料开关。 +- G-code 补丁开关。 +- 元数据模式。 +- ZIP 压缩级别。 +- 独立批处理模式。 +- 输入处理选项。 +- 输出目录。 +- 输出文件名规则。 -## CLI examples +## CLI 使用示例 -List available Swap G-code files: +列出可用的换料 G-code 文件: ```bash python -m a1_swap_mod_packer.cli list-swap-gcode ``` -Build one source with five copies: +单源文件 × 5 份: ```bash python -m a1_swap_mod_packer.cli build \ @@ -521,7 +523,7 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - SC05720_01.gcode(1).3mf" ``` -Build multiple sources into one output: +多源文件合并输出: ```bash python -m a1_swap_mod_packer.cli build \ @@ -531,7 +533,7 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - A_and_B.3mf" ``` -Use summed metadata instead of source metadata: +使用累加元数据模式: ```bash python -m a1_swap_mod_packer.cli build \ @@ -541,7 +543,7 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - A.3mf" ``` -Disable editable G-code patches: +禁用 G-code 补丁: ```bash python -m a1_swap_mod_packer.cli build \ @@ -551,7 +553,7 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - A.3mf" ``` -Build positional inputs with the same copy count: +位置参数输入 + 统一份数: ```bash python -m a1_swap_mod_packer.cli build \ @@ -561,7 +563,7 @@ python -m a1_swap_mod_packer.cli build \ -o "4 Plates - A_and_B.3mf" ``` -Use an explicit Swap G-code folder and ZIP compression level: +指定换料 G-code 目录和 ZIP 压缩级别: ```bash python -m a1_swap_mod_packer.cli build \ @@ -572,7 +574,7 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - A.3mf" ``` -Disable final swap and preview label rewriting: +禁用最后换料和预览标签重写: ```bash python -m a1_swap_mod_packer.cli build \ @@ -583,19 +585,18 @@ python -m a1_swap_mod_packer.cli build \ -o "5 Plates - A.3mf" ``` -Useful CLI options: +CLI 常用选项速查: -| Option | Meaning | +| 选项 | 含义 | |---|---| -| `--version` | Print the current version | -| `list-swap-gcode` | List files found in the Swap G-code folder | -| `--item PATH COPIES` | Add one input with its own copy count; can be repeated | -| positional `inputs` + `--copies N` | Add multiple inputs with the same copy count | -| `--swap-gcode-dir DIR` | Use a custom Swap G-code folder | -| `--no-bed-cooldown` | Do not insert `M190` before the swap block | -| `--no-swap-after-final` | Do not run the swap block after the final plate | -| `--line-ending lf|crlf` | Choose generated G-code line endings; default is `crlf` | -| `--zip-level 1-9` | zlib-ng Deflate compression level; default is `7` | -| `--no-preview-label` | Do not rewrite the preview image label/composite | -| `--no-gcode-patches` | Do not apply rules from `gcode_patches.ini` | - +| `--version` | 打印当前版本 | +| `list-swap-gcode` | 列出换料 G-code 目录中的文件 | +| `--item PATH COPIES` | 添加一个带独立份数的输入;可多次使用 | +| 位置参数 `inputs` + `--copies N` | 添加多个使用相同份数的输入 | +| `--swap-gcode-dir DIR` | 使用自定义换料 G-code 目录 | +| `--no-bed-cooldown` | 不在换料块前插入 `M190` | +| `--no-swap-after-final` | 最后一块板后不执行换料块 | +| `--line-ending lf\|crlf` | 选择生成 G-code 的换行符;默认 `crlf` | +| `--zip-level 1-9` | zlib-ng Deflate 压缩级别;默认 `7` | +| `--no-preview-label` | 不重写预览图标签/合成图 | +| `--no-gcode-patches` | 不应用 `gcode_patches.ini` 中的规则 |