docs: README 全文翻译为简体中文

This commit is contained in:
2026-07-27 11:27:02 +08:00
parent c5849af14e
commit 27fade244e
+232 -231
View File
@@ -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)
<img src="docs/a1_swapmod_realphoto.webp" width="50%" />
## 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` 中的规则 |