docs: README 全文翻译为简体中文
This commit is contained in:
@@ -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` 文件,可直接发送至打印机。
|
||||
|
||||

|
||||

|
||||
|
||||
<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` 中的规则 |
|
||||
|
||||
Reference in New Issue
Block a user