Merge branch 'main' into dev/bbl-network-upd

This commit is contained in:
SoftFever 2025-07-05 19:02:11 +08:00 committed by GitHub
commit 0fa846823a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
97 changed files with 780 additions and 373 deletions

View file

@ -30,7 +30,7 @@ function check_available_memory_and_disk() {
}
function usage() {
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-h][-i][-j N][-p][-r][-s][-u]"
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-h][-i][-j N][-p][-r][-s][-u][-l]"
echo " -1: limit builds to one core (where possible)"
echo " -j N: limit builds to N cores (where possible)"
echo " -b: build in debug mode"
@ -43,6 +43,7 @@ function usage() {
echo " -r: skip RAM and disk checks (low RAM compiling)"
echo " -s: build the Orca Slicer (optional)"
echo " -u: install system dependencies (asks for sudo password; build prerequisite)"
echo " -l: use Clang instead of GCC (default: GCC)"
echo "For a first use, you want to './${SCRIPT_NAME} -u'"
echo " and then './${SCRIPT_NAME} -dsi'"
}
@ -50,7 +51,7 @@ function usage() {
SLIC3R_PRECOMPILED_HEADERS="ON"
unset name
while getopts ":1j:bcCdhiprsu" opt ; do
while getopts ":1j:bcCdhiprsul" opt ; do
case ${opt} in
1 )
export CMAKE_BUILD_PARALLEL_LEVEL=1
@ -88,6 +89,9 @@ while getopts ":1j:bcCdhiprsu" opt ; do
u )
UPDATE_LIB="1"
;;
l )
USE_CLANG="1"
;;
esac
done
@ -139,6 +143,11 @@ if ! [[ -n "${SKIP_RAM_CHECK}" ]] ; then
check_available_memory_and_disk
fi
export CMAKE_C_CXX_COMPILER_CLANG=""
if [[ -n "${USE_CLANG}" ]] ; then
export CMAKE_C_CXX_COMPILER_CLANG="-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++"
fi
if [[ -n "${BUILD_DEPS}" ]] ; then
echo "Configuring dependencies..."
BUILD_ARGS="${DEPS_EXTRA_BUILD_ARGS} -DDEP_WX_GTK3=ON"
@ -155,13 +164,13 @@ if [[ -n "${BUILD_DEPS}" ]] ; then
if [ ! -d "deps/build/release" ] ; then
mkdir deps/build/release
fi
cmake -S deps -B deps/build/release -DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} -G Ninja -DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" -DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" ${COLORED_OUTPUT} ${BUILD_ARGS}
cmake ${CMAKE_C_CXX_COMPILER_CLANG} -S deps -B deps/build/release -DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} -G Ninja -DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" -DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" ${COLORED_OUTPUT} ${BUILD_ARGS}
cmake --build deps/build/release
BUILD_ARGS="${BUILD_ARGS} -DCMAKE_BUILD_TYPE=Debug"
fi
echo "cmake -S deps -B deps/build -G Ninja ${BUILD_ARGS}"
cmake -S deps -B deps/build -G Ninja ${COLORED_OUTPUT} ${BUILD_ARGS}
echo "cmake -S deps -B deps/build ${CMAKE_C_CXX_COMPILER_CLANG} -G Ninja ${BUILD_ARGS}"
cmake -S deps -B deps/build ${CMAKE_C_CXX_COMPILER_CLANG} -G Ninja ${COLORED_OUTPUT} ${BUILD_ARGS}
cmake --build deps/build
fi
@ -180,7 +189,7 @@ if [[ -n "${BUILD_ORCA}" ]] ; then
BUILD_ARGS="${BUILD_ARGS} -DBBL_RELEASE_TO_PUBLIC=1 -DBBL_INTERNAL_TESTING=0"
fi
CMAKE_CMD="cmake -S . -B build -G Ninja \
CMAKE_CMD="cmake -S . -B build ${CMAKE_C_CXX_COMPILER_CLANG} -G Ninja \
-DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} \
-DCMAKE_PREFIX_PATH="${SCRIPT_PATH}/deps/build/destdir/usr/local" \
-DSLIC3R_STATIC=1 \

View file

@ -2,32 +2,56 @@
Orca slicer is a powerful open source slicer for FFF (FDM) 3D Printers. This wiki page aims to provide an detailed explanation of the slicer settings, how to get the most out of them as well as how to calibrate and setup your printer.
- [Prepare](#prepare)
- [Print Settings, Tips and Tricks](#print-settings-tips-and-tricks)
- [Quality Settings](#quality-settings)
- [Speed Settings](#speed-settings)
- [Strength Settings](#strength-settings)
- [Printer Settings](#printer-settings)
- [Material Settings](#material-settings)
- [Printer Settings](#printer-settings)
- [Printer Calibration](#printer-calibration)
- [Prepare](#prepare)
- [Process Settings](#process-settings)
- [Quality Settings](#quality-settings)
- [Strength Settings](#strength-settings)
- [Speed Settings](#speed-settings)
- [Support Settings](#support-settings)
- [Multimaterial Settings](#multimaterial-settings)
- [Others Settings](#others-settings)
- [Calibrations](#calibrations)
- [Developer Section](#developer-section)
> [!NOTE]
> The Wiki is **Work In Progress** so bear with us while we get it up and running!
> Please consider contributing to the wiki following the [How to contribute to the wiki](How-to-wiki) guide.
## Printer Settings
![printer-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/printer-preset.png)
- [Air filtration/Exhaust fan handling](air-filtration)
- [Auxiliary fan handling](Auxiliary-fan)
- [Chamber temperature control](chamber-temperature)
- [Adaptive Bed Mesh](adaptive-bed-mesh)
- [Using different bed types in Orca](bed-types)
## Material Settings
![filament-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/filament-preset.png)
- [Single Extruder Multimaterial](semm)
- [Pellet Printers (pellet flow coefficient)](pellet-flow-coefficient)
## Prepare
First steps to prepare your model/s for printing.
- [STL Transformation](stl-transformation)
## Print Settings, Tips and Tricks
## Process Settings
![process-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process-preset.png)
The below sections provide a detailed settings explanation as well as tips and tricks in setting these for optimal print results.
### Quality Settings
![process-quality](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-quality.png?raw=true)
- [Layer Height Settings](quality_settings_layer_height)
- [Line Width Settings](quality_settings_line_width)
- [Seam Settings](quality_settings_seam)
@ -44,28 +68,38 @@ The below sections provide a detailed settings explanation as well as tips and t
- [Polyholes](quality_settings_precision#polyholes)
- [Wall generator](quality_settings_wall_generator)
### Speed Settings
- [Extrusion rate smoothing](speed_extrusion_rate_smoothing)
### Strength Settings
![process-strength](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-strength.png?raw=true)
- [Top and Bottom Shells](strength_settings_top_bottom_shells)
- [Infill](strength_settings_infill)
## Material Settings
### Speed Settings
- [Single Extruder Multimaterial](semm)
- [Pellet Printers (pellet flow coefficient)](pellet-flow-coefficient)
![process-speed](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-speed.png?raw=true)
### Printer Settings
- [Extrusion rate smoothing](speed_settings_extrusion_rate_smoothing)
- [Air filtration/Exhaust fan handling](air-filtration)
- [Auxiliary fan handling](Auxiliary-fan)
- [Chamber temperature control](chamber-temperature)
- [Adaptive Bed Mesh](adaptive-bed-mesh)
- [Using different bed types in Orca](bed-types)
### Support Settings
## Printer Calibration
![process-support](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-support.png?raw=true)
WIP...
### Multimaterial Settings
![process-multimaterial](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-multimaterial.png?raw=true)
WIP...
### Others Settings
![process-others](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process/process-others.png?raw=true)
WIP...
## Calibrations
The [Calibration Guide](Calibration) outlines Orcas key calibration tests and their suggested order of execution.

View file

@ -25,7 +25,7 @@ The recommended order for calibration is as follows:
- **[Adaptative Pressure Advance](adaptive-pressure-advance-calib):** This is an advanced calibration technique that can be used to further optimize the pressure advance settings for different print speeds and geometries.
<img src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/pa-tower.jpg?raw=true" alt="pa-tower" height="200">
<img src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/pa/pa-tower.jpg?raw=true" alt="pa-tower" height="200">
2. **[Retraction](retraction-calib):** Calibrate the retraction settings to minimize stringing and improve print quality. Doing this after Flow and
@ -47,10 +47,9 @@ The recommended order for calibration is as follows:
<img src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true" alt="Input_Shaping" height="200">
### VFA
7. **[VFA](vfa-calib):** A VFA speed test is available to find resonance speeds.
Vertical Fine Artifacts (VFA) are small artifacts that can occur on the surface of a 3D print, particularly in areas where there are sharp corners or changes in direction. These artifacts can be caused by a variety of factors, including mechanical vibrations, resonance, and other factors that can affect the quality of the print.
Because of the nature of these artifacts the methods to reduce them can be mechanical such as changing motors, belts and pulleys or with advanced calibrations such as Jerk/[Junction Deviation](junction-deviation) corrections or [Input Shaping](input-shaping).
<img src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/vfa/vfa_test_print.jpg?raw=true" alt="vfa_test_print" height="200">
---
@ -62,4 +61,3 @@ _Credits:_
- _The temp tower model is remixed from [Smart compact temperature calibration tower](https://www.thingiverse.com/thing:2729076)._
- _The max flowrate test was inspired by Stefan (CNC Kitchen), and the model used in the test is a remix of his [Extrusion Test Structure](https://www.printables.com/model/342075-extrusion-test-structure)._
- _ZV Input Shaping is inspired by [Marlin Input Shaping](https://marlinfw.org/docs/features/input_shaping.html) and [Ringing Tower 3D STL](https://marlinfw.org/assets/stl/ringing_tower.stl)._
- _ChatGPT_ ;)

View file

@ -4,7 +4,7 @@ Cornering is a critical aspect of 3D printing that affects the quality and accur
## Jerk
WIP... TODO: Jerk calibration not implemented yet.
TODO: Jerk calibration not implemented yet.
## Junction Deviation

View file

@ -3,7 +3,10 @@
During high-speed movements, vibrations can cause a phenomenon called "ringing," where periodic ripples appear on the print surface. Input Shaping provides an effective solution by counteracting these vibrations, improving print quality and reducing wear on components without needing to significantly lower print speeds.
- [Klipper](#klipper)
- [Resonance Compensation](#resonance-compensation)
- [Marlin](#marlin)
- [ZV Input Shaping](#zv-input-shaping)
- [Fixed-Time Motion](#fixed-time-motion)
## Klipper
@ -125,5 +128,4 @@ ZV Input Shaping introduces an anti-vibration signal into the stepper motion for
### Fixed-Time Motion
WIP...
This calibration test is currently under development. See the [Marlin documentation](https://marlinfw.org/docs/gcode/M493.html) for more information.
TODO: This calibration test is currently under development. See the [Marlin documentation](https://marlinfw.org/docs/gcode/M493.html) for more information.

View file

@ -0,0 +1,13 @@
# VFA
Vertical Fine Artifacts (VFA) are small artifacts that can occur on the surface of a 3D print, particularly in areas where there are sharp corners or changes in direction. These artifacts can be caused by a variety of factors, including mechanical vibrations, resonance, and other factors that can affect the quality of the print.
Because of the nature of these artifacts the methods to reduce them can be mechanical such as changing motors, belts and pulleys or with advanced calibrations such as [Jerk/Junction Deviation](cornering-calib) corrections or [Input Shaping](input-shaping-calib).
## VFA Test
OrcaSlicer's VFA test is used to identify the print speed that minimizes ringing artifacts. It prints a tower with walls at key angles while gradually increasing the print speed. The goal is to find the speed at which VFA artifacts are least visible, revealing the optimal range for clean surfaces.
![vfa_test_menu](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/vfa/vfa_test_menu.png?raw=true)
![vfa_test_print](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/vfa/vfa_test_print.jpg?raw=true)

View file

@ -1,4 +1,4 @@
# Max Volumetric speed
# Max Volumetric Speed (FlowRate) Calibration
This is a test designed to calibrate the maximum volumetric speed of the specific filament. The generic or 3rd party filament types may not have the correct volumetric flow rate set in the filament. This test will help you to find the maximum volumetric speed of the filament.
@ -6,15 +6,15 @@ You will be promted to enter the settings for the test: start volumetric speed,
Once printed, take note of where the layers begin to fail and where the quality begins to suffer. Pay attention to changes from matte to shiny as well.
![vmf_measurement_point](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images//vmf_measurement_point.jpg?raw=true)
![mvf_measurement_point](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/mvf/mvf_measurement_point.jpg?raw=true)
Using calipers or a ruler, measure the height of the print at that point. Use the following calculation to determine the correct max flow value: `start + (height-measured * step)` . For example in the photo below, and using the default setting values, the print quality began to suffer at 19mm measured, so the calculation would be: `5 + (19 * 0.5)` , or `13mm³/s` using the default values. Enter your number into the "Max volumetric speed" value in the filament settings.
![caliper_sample_mvf](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images//caliper_sample_mvf.jpg?raw=true)
![mvf_caliper_sample_mvf](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/mvf/mvf_caliper_sample_mvf.jpg?raw=true)
You can also return to OrcaSlicer in the "Preview" tab, make sure the color scheme "flow" is selected. Scroll down to the layer height that you measured, and click on the toolhead slider. This will indicate the max flow level for your filmanet.
You can also return to OrcaSlicer in the "Preview" tab, make sure the color scheme "flow" is selected. Scroll down to the layer height that you measured, and click on the toolhead slider. This will indicate the max flow level for your filament.
![image](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/max_volumetric_flow.jpg?raw=true)
![mvf_gui_flow](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/mvf/mvf_gui_flow.jpg?raw=true)
> [!NOTE]
> You may also choose to conservatively reduce the flow by 5-10% to ensure print quality.

View file

@ -1,10 +1,33 @@
# How to Build
This wiki page provides detailed instructions for building OrcaSlicer from source on different operating systems, including Windows, macOS, and Linux.
It includes tool requirements, setup commands, and build steps for each platform.
Whether you're a contributor or just want a custom build, this guide will help you compile OrcaSlicer successfully.
- [Windows 64-bit](#windows-64-bit)
- [Windows Tools Required](#windows-tools-required)
- [Windows Instructions](#windows-instructions)
- [MacOS 64-bit](#macos-64-bit)
- [MacOS Tools Required](#macos-tools-required)
- [MacOS Instructions](#macos-instructions)
- [Debugging in Xcode](#debugging-in-xcode)
- [Linux](#linux)
- [Using Docker (Recommended)](#using-docker-recommended)
- [Docker Dependencies](#docker-dependencies)
- [Docker Instructions](#docker-instructions)
- [Troubleshooting](#troubleshooting)
- [Ubuntu](#ubuntu)
- [Ubuntu Dependencies](#ubuntu-dependencies)
- [Ubuntu Instructions](#ubuntu-instructions)
- [Portable User Configuration](#portable-user-configuration)
- [Example folder structure](#example-folder-structure)
## Windows 64-bit
This guide is for building your Visual Studio 2022 solution for OrcaSlicer on Windows 64-bit.
How to building with Visual Studio 2022 on Windows 64-bit.
### Tools Required
### Windows Tools Required
- [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) or Visual Studio 2019
```shell
@ -33,7 +56,7 @@ This guide is for building your Visual Studio 2022 solution for OrcaSlicer on Wi
> winget install --id=GitHub.GitHubDesktop -e
> ```
### Instructions
### Windows Instructions
1. Clone the repository:
- If using GitHub Desktop clone the repository from the GUI.
@ -74,9 +97,11 @@ This guide is for building your Visual Studio 2022 solution for OrcaSlicer on Wi
> [!NOTE]
> If the build fails, try deleting the `build/` and `deps/build/` directories to clear any cached build data. Rebuilding after a clean-up is usually sufficient to resolve most issues.
## macOS 64-bit
## MacOS 64-bit
### Tools Required
How to building with Xcode on MacOS 64-bit.
### MacOS Tools Required
- Xcode
- CMake (version 3.31.x is mandatory)
@ -114,7 +139,7 @@ cmake --version
> [!IMPORTANT]
> If you've recently upgraded Xcode, be sure to open Xcode at least once and install the required macOS build support.
### Instructions
### MacOS Instructions
1. Clone the repository:
```shell
@ -147,14 +172,18 @@ To build and debug directly in Xcode:
## Linux
Linux instructions are available in two formats: using Docker (recommended) or building directly on your system.
### Using Docker (Recommended)
#### Dependencies
How to build and run OrcaSlicer using Docker.
#### Docker Dependencies
- Docker
- Git
#### Instructions
#### Docker Instructions
```shell
git clone https://github.com/SoftFever/OrcaSlicer && cd OrcaSlicer && ./DockerBuild.sh && ./DockerRun.sh
@ -179,7 +208,9 @@ By uncommenting and using these options as needed, you can often resolve issues
## Ubuntu
### Dependencies
How to build OrcaSlicer on Ubuntu.
### Ubuntu Dependencies
All required dependencies will be installed automatically by the provided shell script, including:
@ -199,9 +230,27 @@ All required dependencies will be installed automatically by the provided shell
- git
- texinfo
### Instructions
### Ubuntu Instructions
```shell
`./build_linux.sh -u` # install dependencies
`./build_linux.sh -disr` # build OrcaSlicer
```
## Portable User Configuration
If you want OrcaSlicer to use a custom user configuration folder (e.g., for a portable installation), you can simply place a folder named `data_dir` next to the OrcaSlicer executable. OrcaSlicer will automatically use this folder as its configuration directory.
This allows for multiple self-contained installations with separate user data.
> [!TIP]
> This feature is especially useful if you want to run OrcaSlicer from a USB stick or keep different profiles isolated.
### Example folder structure
```shell
OrcaSlicer.exe
data_dir/
```
You dont need to recompile or modify any settings — this works out of the box as long as `data_dir` exists in the same folder as the executable.

View file

@ -150,10 +150,13 @@ Always use raw GitHub URLs for image links to ensure correct display:
Format = `![[filename]](` + Base URL + filename.extension + Raw tag + `)`
- Base URL:
```markdown
https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/
```
- Raw tag:
```markdown
?raw=true
```
@ -167,6 +170,7 @@ Format = `![[filename]](` + Base URL + filename.extension + Raw tag + `)`
```
- For an image in a subdirectory like `doc/images/calibration/pa-example.svg`:
```markdown
![pa-example](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/calibration/pa-example.svg?raw=true)
```
@ -194,6 +198,7 @@ If resizing is necessary (e.g., for thumbnails), use the following syntax:
HTML Format = `<img src="` + Base URL + filename.extension + Raw tag + `" alt="` + filename + `"` + size limit.
Example:
```html
<img src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true" alt="Input_Shaping" height="200">
```

View file

@ -9,15 +9,15 @@ As the name might suggest this class deals with presets for various things. It d
- `TYPE_PRINT`: Refers to a process preset. It's called 'Print' probably due to some legacy code.
![process-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/process-preset.png?raw=true)
![process-preset-full](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/process-preset-full.png?raw=true)
- `TYPE_FILAMENT`: As the name suggests this preset is for filaments
![filament-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/filament-preset.png?raw=true)
![filament-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/filament-preset.png?raw=true)
- `TYPE_PRINTER`: Preset for printers.
![printer-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/printer-preset.png?raw=true)
![printer-preset](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/printer-preset.png?raw=true)
There are other preset types but some of them are for SLA. Which is legacy code, since SLA printers are no longer supported. Above 3 are the important types.

View file

@ -5,24 +5,24 @@ WIP...
> [!WARNING]
> !! incomplete, possibly inaccurate, being updated with new info !!
## [`Plater`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Plater.hpp)
## [`Plater`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/gui/Plater.hpp)
Refers to the entire application. The whole view, file loading, project saving and loading is all managed by this class. This class contains members for the model viewer, the sidebar, gcode viewer and everything else.
## [`Sidebar`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Plater.hpp)
## [`Sidebar`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/gui/Plater.hpp)
This is relating the the sidebar in the application window
![full-sidebar](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/full-sidebar.png?raw=true)
![full-sidebar](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/full-sidebar.png?raw=true)
## [`ComboBox`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Widgets/ComboBox.hpp)
## [`ComboBox`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/gui/Widgets/ComboBox.hpp)
The drop down menus where you can see and select presets
![combobox](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/combobox.png?raw=true)
![combobox](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/combobox.png?raw=true)
## [`Tab`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Tab.hpp)
## [`Tab`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/gui/Tab.hpp)
Refers to the various windows with settings. e.g. the Popup to edit printer or filament preset. Also the section to edit process preset and the object list. These 4 are managed by `TabPrinter`, `TabFilament`, `TabPrint` and `TabPrintModel` respectively.
![tab-popup](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/tab-popup.png?raw=true)
![tab-popup](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/gui/tab-popup.png?raw=true)

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Before After
Before After

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="401px" height="71px" viewBox="-0.5 -0.5 401 71"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="fhMGX1kBES0GxHB0cy2X-14"><g><rect x="130" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 131px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="200" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-15"><g><rect x="260" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="330" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-9"><g><rect x="0" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#fa6800" style="fill: light-dark(rgb(250, 104, 0), rgb(233, 107, 18)); stroke: light-dark(rgb(199, 53, 0), rgb(255, 145, 100));" stroke="#c73500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Outer wall</div></div></div></foreignObject><text x="70" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Outer wall</text></switch></g></g></g></g></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="803px" height="143px" viewBox="-0.5 -0.5 803 143"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="fhMGX1kBES0GxHB0cy2X-14"/><g data-cell-id="fhMGX1kBES0GxHB0cy2X-15"/><g data-cell-id="fhMGX1kBES0GxHB0cy2X-9"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-1"><g><rect x="260" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 131px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="200" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-2"><g><rect x="520" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="330" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-3"><g><rect x="0" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#fa6800" style="fill: light-dark(rgb(250, 104, 0), rgb(233, 107, 18)); stroke: light-dark(rgb(199, 53, 0), rgb(255, 145, 100));" stroke="#c73500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Outer wall</div></div></div></foreignObject><text x="70" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Outer wall</text></switch></g></g></g><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-4"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-6"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-1"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-5"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-6"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-7"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-8"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-9"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="411px" height="71px" viewBox="-0.5 -0.5 411 71"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="fhMGX1kBES0GxHB0cy2X-14"><g><rect x="140" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="210" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-15"><g><rect x="270" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="340" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-9"><g><rect x="0" y="0" width="140" height="70" rx="25.9" ry="25.9" fill-opacity="0.75" fill="#fa6800" style="fill: light-dark(rgb(250, 104, 0), rgb(233, 107, 18)); stroke: light-dark(rgb(199, 53, 0), rgb(255, 145, 100));" stroke="#c73500" stroke-opacity="0.75" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Outer wall</div></div></div></foreignObject><text x="70" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Outer wall</text></switch></g></g></g></g></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="822px" height="143px" viewBox="-0.5 -0.5 822 143"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="fhMGX1kBES0GxHB0cy2X-14"><g><rect x="280" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="210" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-15"><g><rect x="540" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#e3c800" style="fill: light-dark(rgb(227, 200, 0), rgb(103, 80, 0)); stroke: light-dark(rgb(176, 149, 0), rgb(141, 118, 0));" stroke="#b09500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 271px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Inner wall</div></div></div></foreignObject><text x="340" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Inner wall</text></switch></g></g></g><g data-cell-id="fhMGX1kBES0GxHB0cy2X-9"><g><rect x="0" y="0" width="280" height="140" rx="51.8" ry="51.8" fill-opacity="0.75" fill="#fa6800" style="fill: light-dark(rgb(250, 104, 0), rgb(233, 107, 18)); stroke: light-dark(rgb(199, 53, 0), rgb(255, 145, 100));" stroke="#c73500" stroke-opacity="0.75" stroke-width="2" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)scale(2)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 35px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ededed); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Outer wall</div></div></div></foreignObject><text x="70" y="39" fill="#000000" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Outer wall</text></switch></g></g></g><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-1"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-2"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-3"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-4"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-6"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-1"/><g data-cell-id="JIVyJF1suF0Iw4lcCjqO-5"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-6"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-7"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-8"/><g data-cell-id="iafkVJ-x-7XXIqqUWIqP-9"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View file

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

View file

@ -16,4 +16,3 @@ Ramming is a technique used to push the filament through the nozzle to ensure th
## Manual filament change
Manual filament change is a feature that allows the user to change the filament during the print. This can be useful for multi-material prints or when changing colors. The user can specify the position and timing of the filament change, as well as the speed and distance of the ramming process.
WIP...

View file

@ -1,23 +1,58 @@
# Wall Generator
WIP...
The Wall Generator defines how the outer and inner walls (perimeters) of the model are printed.
## Classic
WIP...
The Classic wall generator is a simple and reliable method used in many slicers. It creates as many walls as possible (limited by [Wall Loops](strength_settings_walls#wall-loops)) by extruding along the models perimeter using the defined [Line Width](quality_settings_line_width).
This method does not vary extrusion width and is ideal for fast, predictable slicing.
![wallgenerator-classic](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/WallGenerator/wallgenerator-classic.png?raw=true)
## Arachne
WIP...
The Arachne wall generator dynamically adjusts extrusion width to follow the shape of the model more closely. This allows better handling of thin features and smooth transitions between wall counts.
![wallgenerator-arachne](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/WallGenerator/wallgenerator-arachne.png?raw=true)
- Wall transitioning threshhold angle
- Wall transitioning filter
- Wall transitioning length
- Wall distribution count
- First layer minimum wall width
- Minimum feature size
- Minimum wall length
### Wall transitioning threshhold angle
Defines the minimum angle (in degrees) required for the algorithm to create a transition between an even and odd number of walls. If a wedge shape exceeds this angle, no extra center wall will be added. Lowering this value reduces center walls but may cause under- or over-extrusion in sharp corners.
### Wall transitioning filter margin
Prevents rapid switching between more or fewer walls by defining a tolerance range around the minimum wall width. The extrusion width will stay within the range:
```math
\left[ \text{Minimum Wall Width} - \text{Margin},\ 2 \times \text{Minimum Wall Width} + \text{Margin} \right]
```
Higher values reduce transitions, travel moves, and extrusion starts/stops, but may increase extrusion variability and introduce print quality issues. Expressed as a percentage of nozzle diameter.
### Wall transitioning length
Controls how far into the model the transition between wall counts extends. A lower value shortens or removes center walls, improving print time but potentially reducing coverage in tight areas.
### Wall distribution count
Sets how many walls (counted inward from the outer wall) are allowed to vary in width. Lower values constrain variation to inner walls, keeping outer walls consistent for best surface quality.
### Minimum wall width
Defines the narrowest wall that can be printed to represent thin features. If the feature is thinner than this value, the wall will match its width. Expressed as a percentage of nozzle diameter.
#### First layer minimum wall width
Specifies the minimum wall width for the first layer. It is recommended to match the nozzle diameter to improve adhesion and ensure stable base walls.
### Minimum feature size
Minimum width required for a model feature to be printed. Features below this value are skipped; features above it are widened to match the **Minimum Wall Width**. Expressed as a percentage of nozzle diameter.
### Minimum wall length
Avoids very short or isolated wall segments that add unnecessary time. Increasing this value removes short unconnected walls, improving efficiency.
> [!NOTE]
> Top and bottom surfaces are not affected by this setting to avoid visual artifacts.
> Use the One Wall Threshold (in Advanced settings) to adjust how aggressively OrcaSlicer considers a region a top surface. This option only appears when this setting exceeds 0.5, or if single-wall top surfaces are enabled.

View file

@ -2,6 +2,41 @@
Infill is the internal structure of a 3D print, providing strength and support. It can be adjusted to balance material usage, print time, and part strength.
- [Sparse infill density](#sparse-infill-density)
- [Direction and Rotation](#direction-and-rotation)
- [Direction](#direction)
- [Rotation](#rotation)
- [Infill Wall Overlap](#infill-wall-overlap)
- [Apply gap fill](#apply-gap-fill)
- [Anchor](#anchor)
- [Internal Solid Infill](#internal-solid-infill)
- [Sparse Infill Pattern](#sparse-infill-pattern)
- [Concentric](#concentric)
- [Rectilinear](#rectilinear)
- [Grid](#grid)
- [2D Lattice](#2d-lattice)
- [Line](#line)
- [Cubic](#cubic)
- [Triangles](#triangles)
- [Tri-hexagon](#tri-hexagon)
- [Gyroid](#gyroid)
- [TPMS-D](#tpms-d)
- [Honeycomb](#honeycomb)
- [Adaptive Cubic](#adaptive-cubic)
- [Aligned Rectilinear](#aligned-rectilinear)
- [2D Honeycomb](#2d-honeycomb)
- [3D Honeycomb](#3d-honeycomb)
- [Hilbert Curve](#hilbert-curve)
- [Archimedean Chords](#archimedean-chords)
- [Octagram Spiral](#octagram-spiral)
- [Support Cubic](#support-cubic)
- [Lightning](#lightning)
- [Cross Hatch](#cross-hatch)
- [Quarter Cubic](#quarter-cubic)
- [Zig Zag](#zig-zag)
- [Coss Zag](#coss-zag)
- [Locked Zag](#locked-zag)
## Sparse infill density
Density usually should be calculated as a % of the total infill volume, not the total print volume.
@ -9,6 +44,82 @@ Higher density increases strength but also material usage and print time. Lower
Nevertheless, **not all patterns interpret density the same way**, so the actual material usage may vary. You can see each pattern's material usage in the [Sparse Infill Pattern](#sparse-infill-pattern) section.
## Direction and Rotation
### Direction
Controls the direction of the infill lines to optimize or strengthen the print.
### Rotation
This parameter adds a rotation to the sparse infill direction for each layer according to the specified template. The template is a comma-separated list of angles in degrees.
For example:
```c++
0,90
```
The first layer uses 0°, the second uses 90°, and the pattern repeats for subsequent layers.
Other examples:
```c++
0,45,90
```
```c++
0,60,120,180
```
If there are more layers than angles, the sequence repeats.
> [!NOTE]
> Not all sparse infill patterns support rotation.
## Infill Wall Overlap
Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill. Set this value to ~10-15% to minimize potential over extrusion and accumulation of material resulting in rough surfaces.
- **Infill Wall Overlap Off**
![InfillWallOverlapOff](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/InfillWallOverlapOff.svg?raw=true)
- **Infill Wall Overlap On**
![InfillWallOverlapOn](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/InfillWallOverlapOn.svg?raw=true)
## Apply gap fill
Enables gap fill for the selected solid surfaces. The minimum gap length that will be filled can be controlled from the filter out tiny gaps option.
1. **Everywhere:** Applies gap fill to top, bottom and internal solid surfaces for maximum strength.
2. **Top and Bottom surfaces:** Applies gap fill to top and bottom surfaces only, balancing print speed, reducing potential over extrusion in the solid infill and making sure the top and bottom surfaces have no pinhole gaps.
3. **Nowhere:** Disables gap fill for all solid infill areas.
Note that if using the [classic perimeter generator](quality_settings_wall_generator#classic), gap fill may also be generated between perimeters, if a full width line cannot fit between them.
That perimeter gap fill is not controlled by this setting.
If you would like all gap fill, including the classic perimeter generated one, removed, set the filter out tiny gaps value to a large number, like 999999.
However this is not advised, as gap fill between perimeters is contributing to the model's strength. For models where excessive gap fill is generated between perimeters, a better option would be to switch to the [arachne wall generator](quality_settings_wall_generator#arachne) and use this option to control whether the cosmetic top and bottom surface gap fill is generated.
## Anchor
Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width.
OrcaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0.
- **Anchor Off**
![InfillAnchorOff](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/InfillAnchorOff.png?raw=true)
- **Anchor On**
![InfillAnchorOn](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/InfillAnchorOn.png?raw=true)
## Internal Solid Infill
Line pattern of internal solid infill. If the [detect narrow internal solid infill](strength_settings_advanced#detect-narrow-internal-solid-infill) be enabled, the concentric pattern will be used for the small area.
## Sparse Infill Pattern
Infill patterns determine how material is distributed within a print. Different patterns can affect strength, flexibility, and print speed using the same density setting.
@ -18,30 +129,33 @@ There is no one-size-fits-all solution, as the best pattern depends on the speci
Many patterns may look similar and have similar overall specifications, but they can behave very differently in practice.
As most settings in 3D printing, experience is the best way to determine which pattern works best for your specific needs.
| Infill | X-Y Strength | Z Strength | Material Usage | Print Time |
|---------------------------------------------|--------------|-------------|----------------|-------------|
| [Concentric](#concentric) | Low | Normal | Normal | Normal |
| [Rectilinear](#rectilinear) | Normal-Low | Low | Normal | Normal |
| [Grid](#grid) | High | High | Normal | Normal |
| [2D Lattice](#2d-lattice) | Normal-Low | Low | Normal | Normal |
| [Line](#line) | Low | Low | Normal | Normal-Low |
| [Cubic](#cubic) | High | High | Normal | Normal-Low |
| [Triangles](#triangles) | High | Normal | Normal | Normal-Low |
| [Tri-hexagon](#tri-hexagon) | High | Normal-High | Normal | Normal-Low |
| [Gyroid](#gyroid) | High | High | Normal | Normal-High |
| [TPMS-D](#tpms-d) | High | High | Normal | High |
| [Honeycomb](#honeycomb) | High | High | High | Ultra-High |
| [Adaptive Cubic](#adaptive-cubic) | Normal-High | Normal-High | Low | Low |
| [Aligned Rectilinear](#aligned-rectilinear) | Normal-Low | Normal | Normal | Normal |
| [2D Honeycomb](#2d-honeycomb) | Normal-Low | Normal-Low | Normal | Normal-Low |
| [3D Honeycomb](#3d-honeycomb) | Normal-High | Normal-High | Normal-Low | High |
| [Hilbert Curve](#hilbert-curve) | Low | Normal | Normal | High |
| [Archimedean Chords](#archimedean-chords) | Low | Normal | Normal | Normal-Low |
| [Octagram Spiral](#octagram-spiral) | Low | Normal | Normal | Normal-High |
| [Support Cubic](#support-cubic) | Low | Low | Extra-Low | Extra-Low |
| [Lightning](#lightning) | Low | Low | Ultra-Low | Ultra-Low |
| [Cross Hatch](#cross-hatch) | Normal-High | Normal-High | Normal | Normal-High |
| [Quarter Cubic](#quarter-cubic) | High | High | Normal | Normal-Low |
| Pattern | X-Y Strength | Z Strength | Material Usage | Print Time |
|-----------------------------------------------|--------------|-------------|----------------|-------------|
| [Concentric](#concentric) | Low | Normal | Normal | Normal |
| [Rectilinear](#rectilinear) | Normal-Low | Low | Normal | Normal-Low |
| [Grid](#grid) | High | High | Normal | Normal-Low |
| [2D Lattice](#2d-lattice) | Normal-Low | Low | Normal | Normal-Low |
| [Line](#line) | Low | Low | Normal | Normal-Low |
| [Cubic](#cubic) | High | High | Normal | Normal-Low |
| [Triangles](#triangles) | High | Normal | Normal | Normal-Low |
| [Tri-hexagon](#tri-hexagon) | High | Normal-High | Normal | Normal-Low |
| [Gyroid](#gyroid) | High | High | Normal | Normal-High |
| [TPMS-D](#tpms-d) | High | High | Normal | High |
| [Honeycomb](#honeycomb) | High | High | High | Ultra-High |
| [Adaptive Cubic](#adaptive-cubic) | Normal-High | Normal-High | Low | Low |
| [Aligned Rectilinear](#aligned-rectilinear) | Normal-Low | Normal | Normal | Normal-Low |
| [2D Honeycomb](#2d-honeycomb) | Normal-Low | Normal-Low | Normal | Normal-Low |
| [3D Honeycomb](#3d-honeycomb) | Normal-High | Normal-High | Normal-Low | High |
| [Hilbert Curve](#hilbert-curve) | Low | Normal | Normal | High |
| [Archimedean Chords](#archimedean-chords) | Low | Normal | Normal | Normal-Low |
| [Octagram Spiral](#octagram-spiral) | Low | Normal | Normal | Normal |
| [Support Cubic](#support-cubic) | Low | Low | Extra-Low | Extra-Low |
| [Lightning](#lightning) | Low | Low | Ultra-Low | Ultra-Low |
| [Cross Hatch](#cross-hatch) | Normal-High | Normal-High | Normal | Normal-High |
| [Quarter Cubic](#quarter-cubic) | High | High | Normal | Normal-Low |
| [Zig Zag](#zig-zag) | Normal-Low | Low | Normal | Normal |
| [Coss Zag](#coss-zag) | Normal | Low | Normal | Normal |
| [Locked Zag](#locked-zag) | Normal-Low | Normal-Low | Normal-High | Extra-High |
> [!NOTE]
> You can download [infill_desc_calculator.xlsx](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/print_settings/strength/infill_desc_calculator.xlsx?raw=true) used to calculate the values above.
@ -61,14 +175,14 @@ Fills the area with progressively smaller versions of the outer contour, creatin
### Rectilinear
Parallel lines spaced according to infill density. Each layer is printed perpendicular to the previous, resulting in low vertical bonding.
Parallel lines spaced according to infill density. Each layer is printed perpendicular to the previous, resulting in low vertical bonding. Considere using new [Zig Zag](#zig-zag) infill instead.
- **Horizontal Strength (X-Y):** Normal-Low
- **Vertical Strength (Z):** Low
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Material/Time (Higher better):** Normal-High
- **Print Time:** Normal-Low
- **Material/Time (Higher better):** Normal
![infill-top-rectilinear](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-rectilinear.png?raw=true)
@ -80,7 +194,7 @@ Two-layer pattern of perpendicular lines, forming a grid. Overlapping points may
- **Vertical Strength (Z):** High
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Print Time:** Normal-Low
- **Material/Time (Higher better):** Normal
![infill-top-grid](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-grid.png?raw=true)
@ -93,7 +207,7 @@ Low-strength pattern with good flexibility. Angle 1 and angle 2 TBD.
- **Vertical Strength (Z):** Low
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Print Time:** Normal-Low
- **Material/Time (Higher better):** Normal
![infill-top-2d-lattice](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-2d-lattice.png?raw=true)
@ -159,7 +273,7 @@ Mathematical, isotropic surface providing equal strength in all directions. Exce
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal-High
- **Material/Time (Higher better):** Low
- **Material/Time (Higher better):** Normal-Low
![infill-top-gyroid](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-gyroid.png?raw=true)
@ -172,7 +286,7 @@ Triply Periodic Minimal Surface - D. Hybrid between [Cross Hatch](#cross-hatch)
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** High
- **Material/Time (Higher better):** Low
- **Material/Time (Higher better):** Normal-Low
![infill-top-tpms-d](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-tpms-d.png?raw=true)
@ -185,7 +299,7 @@ Hexagonal pattern balancing strength and material use. Double walls in each hexa
- **Density Calculation:** % of total infill volume
- **Material Usage:** High
- **Print Time:** Ultra-High
- **Material/Time (Higher better):** Extra Low
- **Material/Time (Higher better):** Low
![infill-top-honeycomb](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-honeycomb.png?raw=true)
@ -211,7 +325,7 @@ Recommended with layer anchoring to improve not perpendicular strength.
- **Vertical Strength (Z):** Normal
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Print Time:** Normal-Low
- **Material/Time (Higher better):** Normal
![infill-top-aligned-rectilinear](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-aligned-rectilinear.png?raw=true)
@ -238,7 +352,7 @@ This infill tries to generate a printable honeycomb structure by printing square
- **Density Calculation:** Unknown
- **Material Usage:** Normal-Low
- **Print Time:** High
- **Material/Time (Higher better):** Extra Low
- **Material/Time (Higher better):** Low
![infill-top-3d-honeycomb](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-3d-honeycomb.png?raw=true)
@ -252,7 +366,7 @@ Print speed is very low due to the complexity of the path, which can lead to lon
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** High
- **Material/Time (Higher better):** Extra Low
- **Material/Time (Higher better):** Low
![infill-top-hilbert-curve](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-hilbert-curve.png?raw=true)
@ -277,8 +391,8 @@ Esthetic pattern with low strength and high print time.
- **Vertical Strength (Z):** Normal
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal-High
- **Material/Time (Higher better):** Normal
- **Print Time:** Normal
- **Material/Time (Higher better):** Normal-Low
![infill-top-octagram-spiral](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-octagram-spiral.png?raw=true)
@ -304,7 +418,7 @@ Ultra-fast, ultra-low material infill. Designed for speed and efficiency, ideal
- **Density Calculation:** % of layer before top shell layers
- **Material Usage:** Ultra-Low
- **Print Time:** Ultra-Low
- **Material/Time (Higher better):** Extra Low
- **Material/Time (Higher better):** Low
![infill-top-lightning](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-lightning.png?raw=true)
@ -317,7 +431,7 @@ Similar to [Gyroid](#gyroid) but with linear patterns, creating weak points at i
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal-High
- **Material/Time (Higher better):** Low
- **Material/Time (Higher better):** Normal-Low
![infill-top-cross-hatch](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-cross-hatch.png?raw=true)
@ -333,3 +447,42 @@ Similar to [Gyroid](#gyroid) but with linear patterns, creating weak points at i
- **Material/Time (Higher better):** Normal
![infill-top-quarter-cubic](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-quarter-cubic.png?raw=true)
### Zig Zag
Similar to [rectilinear](#rectilinear) with consistent pattern between layers. Allows you to add a Symmetric infil Y axis for models with two symmetric parts.
- **Horizontal Strength (X-Y):** Normal-Low
- **Vertical Strength (Z):** Low
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Material/Time (Higher better):** Normal
![infill-top-zig-zag](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-zig-zag.png?raw=true)
### Coss Zag
Similar to [Zig Zag](#zig-zag) but displacing each lager with Infill shift step parammeter.
- **Horizontal Strength (X-Y):** Normal
- **Vertical Strength (Z):** Low
- **Density Calculation:** % of total infill volume
- **Material Usage:** Normal
- **Print Time:** Normal
- **Material/Time (Higher better):** Normal
![infill-top-coss-zag](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-coss-zag.png?raw=true)
### Locked Zag
Adaptative version of [Zig Zag](#zig-zag) adding an external skin texture to interlock layers and a low material skeleton.
- **Horizontal Strength (X-Y):** Normal-Low
- **Vertical Strength (Z):** Normal-Low
- **Density Calculation:** Same as [Zig Zag](#zig-zag) but increasing near walls
- **Material Usage:** Normal-High
- **Print Time:** Extra-High
- **Material/Time (Higher better):** Low
![infill-top-locked-zag](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/fill/infill-top-locked-zag.png?raw=true)

View file

@ -0,0 +1,19 @@
# Top and Bottom Shells
Controls how the top and bottom solid layers (shells) are generated in the print.
- **Shells:** This is the number of solid layers of shell, including the surface layer. When the thickness calculated by this value is thinner than shell thickness, the shell layers will be increased.
- **Shell Thickness:** The number of solid layers is increased when slicing if the thickness calculated by shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of shell is absolutely determined by shell layers.
- **Infill/Wall Overlap:** Top solid infill area is enlarged slightly to overlap with wall for better bonding and to minimize the appearance of pinholes where the infill meets the walls. A value of 25-30% is a good starting point, minimizing the appearance of pinholes. The percentage value is relative to line width of sparse infill.
- **Surface Pattern:** This setting controls the pattern of the surface. The options are:
- **Concentric:** Fills the surface with inward-tracing loops that follow the outer contour.
- **Rectilinear:** Fills the surface with straight lines alternating direction per layer.
- **Monotonic:** Prints lines in a uniform direction for a smoother visual surface.
- **Monotonic Lines:** Similar to Monotonic but avoids overlapping with the perimeter, reducing excess material at joints. May introduce visible seams.
- **Aligned Rectilinear:** The surface is printed with rectilinear lines that are aligned with the infill pattern.
- **Hilbert Curve:** Applies a space-filling curve for even material distribution and a unique appearance. Slow to print but useful in esthetic applications.
- **Archimedean Chords:** Generates concentric arc-like lines, promoting uniform material spread.
- **Octagram Spiral:** Creates an octagonal spiral for decorative, esthetic surfaces.
> [!NOTE]
> Some patterns may have further information in its [Sparse Infill Pattern Wiki](strength_settings_infill#sparse-infill-pattern)

View file

@ -22,93 +22,16 @@
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="24.479167"
inkscape:cx="12.214468"
inkscape:cy="12.88851"
inkscape:zoom="45.254834"
inkscape:cx="17.987029"
inkscape:cy="12.805262"
inkscape:window-width="2560"
inkscape:window-height="1377"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
showguides="true">
<sodipodi:guide
position="7.4348935,20.691064"
orientation="1,0"
id="guide13"
inkscape:locked="false" />
<sodipodi:guide
position="10.662128,17.545532"
orientation="0,-1"
id="guide14"
inkscape:locked="false" />
<sodipodi:guide
position="17.525106,21.140426"
orientation="1,0"
id="guide19"
inkscape:locked="false" />
<sodipodi:guide
position="11.029787,7.4961704"
orientation="0,-1"
id="guide20"
inkscape:locked="false" />
</sodipodi:namedview>
<line
x1="1.5"
y1="17.5"
x2="17.5"
y2="1.5"
style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round;opacity:0.75"
id="line1" />
<line
x1="22.5"
y1="16.5"
x2="17.5"
y2="21.5"
style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round;opacity:0.75"
id="line2" />
<line
x1="7.5"
y1="1.5"
x2="1.5"
y2="7.5"
style="fill:none;stroke:#575757;stroke-linecap:round;stroke-linejoin:round;opacity:0.75;stroke-opacity:1"
id="line3" />
<line
x1="22.5"
y1="6.5"
x2="6.5"
y2="22.5"
style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round;opacity:0.75"
id="line4" />
<line
x1="18.5"
y1="22.5"
x2="1.5"
y2="5.5"
style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"
id="line7" />
<line
x1="17.5"
y1="1.5"
x2="22.5"
y2="6.5"
style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"
id="line8" />
<line
x1="1.5"
y1="15.5"
x2="8.5"
y2="22.5"
style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"
id="line9" />
<line
x1="7.5"
y1="1.5"
x2="22.5"
y2="16.5"
style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"
id="line10" />
showguides="true" />
<path
d="M3.5,1.5h17a2,2,0,0,1,2,2v17a2,2,0,0,1-2,2H3.5a2,2,0,0,1-2-2V3.5A2,2,0,0,1,3.5,1.5Z"
style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"
@ -117,76 +40,42 @@
style="fill:#939393;fill-opacity:1;stroke:none;stroke-width:0.0408511"
d="M 2.90923,22.896259 C 2.0613133,22.674106 1.4709446,22.121791 1.1317723,21.233374 l -0.09007,-0.235927 -0.010758,-8.854467 c -0.0094,-7.7388928 -0.00304,-8.8917826 0.050495,-9.1506389 0.1859554,-0.8991302 0.9034473,-1.644147 1.8305395,-1.9007639 0.2366323,-0.065499 0.8566253,-0.070301 9.0778082,-0.070301 7.25241,0 8.863843,0.00978 9.048511,0.054939 0.41936,0.1025422 0.894759,0.3676462 1.184681,0.6606312 0.460787,0.465656 0.674736,0.9256377 0.740656,1.5923869 0.02306,0.2331921 0.03324,3.8138627 0.02551,8.9669367 -0.01218,8.11996 -0.0168,8.591678 -0.08634,8.820989 -0.280161,0.923863 -1.004037,1.61516 -1.884942,1.800108 -0.246575,0.05177 -1.492743,0.05983 -9.04851,0.0585 -8.488697,-0.0015 -8.7718539,-0.004 -9.0601322,-0.07951 z m 18.140693,-0.972914 c 0.331179,-0.133671 0.679356,-0.465886 0.829868,-0.791824 l 0.118507,-0.256627 0.01067,-8.781151 C 22.020819,2.3471958 22.04116,3.0891606 21.749942,2.6450177 21.599404,2.4154289 21.375482,2.2298349 21.079149,2.0890425 l -0.18383,-0.08734 H 12.010213 3.1251064 L 2.8684789,2.1202084 C 2.5425414,2.270721 2.2103264,2.6188978 2.0766551,2.9500767 l -0.095379,0.2363063 -0.011773,8.578723 c -0.00774,5.63809 0.00244,8.687076 0.029697,8.89482 0.093595,0.713409 0.5893405,1.239468 1.2564016,1.333226 0.1304402,0.01833 4.1343554,0.03159 8.8975893,0.02945 l 8.660426,-0.0039 z"
id="path18" />
<path
style="fill:#575757;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511;stroke-opacity:1"
d="m 12.847206,16.115289 -0.325345,-0.327265 2.133833,-2.133833 2.133833,-2.133833 0.336923,0.336924 0.336923,0.336923 -2.12388,2.124174 c -1.168133,1.168296 -2.133568,2.124174 -2.14541,2.124174 -0.01184,0 -0.167937,-0.147269 -0.346877,-0.327264 z"
id="path21" />
<path
style="fill:#575757;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511;stroke-opacity:1"
d="m 7.8534456,21.130094 -0.3361443,-0.3379 2.1346396,-2.134349 2.1346401,-2.134349 0.336144,0.3379 0.336144,0.337899 -2.13464,2.134349 -2.1346391,2.134349 z"
id="path22" />
<path
style="fill:#575757;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511;stroke-opacity:1"
d="m 6.546827,21.763848 0.2344496,-0.234449 0.2344496,0.234449 0.2344496,0.23445 H 6.7812766 6.3123774 Z"
id="path23" />
<path
style="fill:#575757;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511;stroke-opacity:1"
d="m 17.861947,11.121574 -0.336135,-0.33789 2.13578,-2.1354894 2.135779,-2.135489 0.09025,0.096067 c 0.0827,0.088027 0.09025,0.1368911 0.09025,0.583812 v 0.4877446 l -1.889895,1.8895673 -1.889895,1.8895675 z"
id="path24" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 6.5877715,21.763941 0.193505,-0.193505 0.193505,0.193505 0.1935051,0.193506 H 6.7812765 6.3942664 Z"
id="path1" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="M 7.8529991,21.088808 7.558256,20.792085 9.6516156,18.699021 c 1.1513474,-1.151185 2.1121364,-2.093064 2.1350854,-2.093064 0.02295,0 0.174361,0.133526 0.33647,0.296724 l 0.294743,0.296723 -2.09336,2.093064 c -1.1513475,1.151185 -2.1121362,2.093064 -2.1350855,2.093064 -0.022949,0 -0.1743606,-0.133526 -0.3364694,-0.296724 z"
id="path2" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 12.847659,16.074118 -0.285957,-0.284076 2.113902,-2.114406 2.113903,-2.114406 0.316736,0.318165 0.316735,0.318166 -2.093037,2.081645 c -1.15117,1.144905 -2.116277,2.081047 -2.144681,2.080316 -0.0284,-7.31e-4 -0.180324,-0.129163 -0.337601,-0.285404 z"
id="path3" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 17.86151,11.080298 -0.294742,-0.296722 2.118341,-2.118048 c 2.117619,-2.1173249 2.118364,-2.1180149 2.185127,-2.0226982 0.05244,0.074868 0.06679,0.1965381 0.06679,0.5664281 v 0.4710787 l -1.848677,1.8483423 c -1.016773,1.0165881 -1.867445,1.8483421 -1.890384,1.8483421 -0.02294,0 -0.174341,-0.133525 -0.33645,-0.296723 z"
id="path4" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="M 2.8696064,6.137744 2.5334527,5.7998348 4.422634,3.9109812 6.3118152,2.0221276 H 6.804957 c 0.4607028,0 0.4989051,0.00614 0.5807596,0.093265 L 7.4733352,2.2086584 5.3395475,4.3421556 3.20576,6.475653 Z"
id="path5" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 17.861947,21.130084 -0.336135,-0.33789 2.135779,-2.135489 2.13578,-2.135489 0.09025,0.09607 c 0.0827,0.08803 0.09025,0.136891 0.09025,0.583812 v 0.487745 l -1.889895,1.889567 -1.889895,1.889567 z"
id="path6" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="M 7.8633763,11.131459 7.5380311,10.804194 9.6718639,8.6703613 11.805697,6.5365285 12.14262,6.8734517 12.479543,7.2103748 10.355663,9.334549 c -1.1681333,1.168296 -2.1335682,2.124174 -2.1454103,2.124174 -0.011842,0 -0.1679366,-0.147269 -0.3468764,-0.327264 z"
id="path7" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 2.8696157,16.146264 -0.3361442,-0.3379 2.1346395,-2.134349 2.1346397,-2.134349 0.3361442,0.3379 0.3361442,0.337899 -2.1346396,2.134349 -2.1346395,2.134349 z"
id="path8" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="m 2.0017021,17.218723 v -0.468899 l 0.2344496,0.23445 0.2344496,0.234449 -0.2344496,0.23445 -0.2344496,0.234449 z"
id="path9" />
<path
style="fill:#949494;fill-opacity:0.74902;stroke:#575757;stroke-width:0.0408511"
d="M 12.878117,6.137744 12.541963,5.7998348 14.431144,3.9109812 16.320326,2.0221276 h 0.493142 c 0.460702,0 0.498905,0.00614 0.580759,0.093265 l 0.08762,0.093265 -2.133788,2.1334972 -2.133787,2.1334974 z"
id="path11" />
<path
style="fill:#009688;fill-opacity:1;stroke:#575757;stroke-width:0.0408511"
d="M 6.8044173,8.9013728 C 5.8891463,8.6799894 5.1293329,7.9312103 4.8777561,7.0026907 4.7837651,6.6557878 4.7837651,6.0488929 4.8777561,5.70199 5.3133212,4.0944072 7.0721201,3.2823661 8.5576782,4.0029623 9.8573624,4.6333971 10.401452,6.2283001 9.7552143,7.513329 9.4074091,8.204932 8.7490599,8.7280789 8.0061889,8.9031641 7.6791867,8.9802341 7.1270552,8.9794111 6.8044173,8.9013741 Z M 7.7254879,7.9858114 c 0.518457,-0.097597 0.962572,-0.4436182 1.1925798,-0.929168 0.1209241,-0.2552726 0.1304428,-0.3066675 0.1304428,-0.704303 0,-0.3976356 -0.00952,-0.4490305 -0.1304428,-0.7043031 -0.6030824,-1.2731159 -2.4041171,-1.2731159 -3.0071994,0 -0.1209241,0.2552726 -0.1304429,0.3066675 -0.1304429,0.7043031 0,0.3976355 0.00952,0.4490304 0.1304429,0.704303 0.3306819,0.6980745 1.0595769,1.0713019 1.8146196,0.929168 z"
id="path19" />
<path
style="fill:#009688;fill-opacity:1;stroke:#575757;stroke-width:0.0408511"
d="M 16.935481,8.9013728 C 16.02021,8.6799894 15.260397,7.9312103 15.00882,7.0026907 c -0.09399,-0.3469029 -0.09399,-0.9537978 0,-1.3007007 0.435565,-1.6075828 2.194364,-2.4196239 3.679922,-1.6990277 1.299684,0.6304348 1.843774,2.2253378 1.197536,3.5103667 -0.347805,0.691603 -1.006154,1.2147499 -1.749025,1.3898351 -0.327003,0.07707 -0.879134,0.076247 -1.201772,-0.00179 z m 0.921071,-0.9155614 c 0.518457,-0.097597 0.962572,-0.4436182 1.192579,-0.929168 0.120924,-0.2552726 0.130443,-0.3066675 0.130443,-0.704303 0,-0.3976356 -0.0095,-0.4490305 -0.130443,-0.7043031 -0.603082,-1.2731159 -2.404117,-1.2731159 -3.007199,0 -0.120924,0.2552726 -0.130443,0.3066675 -0.130443,0.7043031 0,0.3976355 0.0095,0.4490304 0.130443,0.704303 0.330682,0.6980745 1.059577,1.0713019 1.81462,0.929168 z"
id="path20" />
<path
style="fill:#009688;fill-opacity:1;stroke:#575757;stroke-width:0.0408511"
d="m 6.8044173,19.073288 c -0.915271,-0.221384 -1.6750844,-0.970163 -1.9266612,-1.898683 -0.093991,-0.346902 -0.093991,-0.953797 0,-1.3007 0.4355651,-1.607583 2.194364,-2.419624 3.6799221,-1.699028 1.2996842,0.630435 1.8437738,2.225338 1.1975361,3.510367 -0.3478052,0.691603 -1.0061544,1.21475 -1.7490254,1.389835 -0.3270022,0.07707 -0.8791337,0.07625 -1.2017716,-0.0018 z m 0.9210706,-0.915562 c 0.518457,-0.0976 0.962572,-0.443618 1.1925798,-0.929168 0.1209241,-0.255272 0.1304428,-0.306667 0.1304428,-0.704303 0,-0.397635 -0.00952,-0.44903 -0.1304428,-0.704303 -0.6030824,-1.273116 -2.4041171,-1.273116 -3.0071994,0 -0.1209241,0.255273 -0.1304429,0.306668 -0.1304429,0.704303 0,0.397636 0.00952,0.449031 0.1304429,0.704303 0.3306819,0.698075 1.0595769,1.071302 1.8146196,0.929168 z"
id="path25" />
<path
style="fill:#009688;fill-opacity:1;stroke:#575757;stroke-width:0.0408511"
d="m 16.935481,19.073288 c -0.915271,-0.221384 -1.675084,-0.970163 -1.926661,-1.898683 -0.09399,-0.346902 -0.09399,-0.953797 0,-1.3007 0.435565,-1.607583 2.194364,-2.419624 3.679922,-1.699028 1.299684,0.630435 1.843774,2.225338 1.197536,3.510367 -0.347805,0.691603 -1.006154,1.21475 -1.749025,1.389835 -0.327003,0.07707 -0.879134,0.07625 -1.201772,-0.0018 z m 0.921071,-0.915562 c 0.518457,-0.0976 0.962572,-0.443618 1.192579,-0.929168 0.120924,-0.255272 0.130443,-0.306667 0.130443,-0.704303 0,-0.397635 -0.0095,-0.44903 -0.130443,-0.704303 -0.603082,-1.273116 -2.404117,-1.273116 -3.007199,0 -0.120924,0.255273 -0.130443,0.306668 -0.130443,0.704303 0,0.397636 0.0095,0.449031 0.130443,0.704303 0.330682,0.698075 1.059577,1.071302 1.81462,0.929168 z"
id="path26" />
<g
id="g22"
transform="matrix(1.005528,0,0,1.005528,-284.3849,-929.53132)"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.01989005;stroke-dasharray:none;stroke-opacity:1">
<g
id="g26"
transform="matrix(0.20848903,0,0,0.20848903,234.2996,741.49731)"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1">
<g
id="g25"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 242.24433,953.1427 c 2.41634,0.034 4.85811,0.0685 7.25372,0.0238 4.81496,-0.09 9.44196,-0.45875 13.41146,-1.99804 1.82617,-0.70815 3.52041,-1.68272 4.93981,-3.03133 1.13152,-1.0751 2.07818,-2.41806 2.7437,-3.88292 0.66553,-1.46486 1.08821,-3.02601 1.39603,-4.62759 0.66119,-3.44013 0.80391,-7.10747 1.15952,-10.39304 0.26711,-2.46787 0.66196,-4.70591 1.31545,-6.35074 0.42497,-1.06965 0.92891,-1.86275 1.55021,-2.45158 0.62129,-0.58883 1.482,-1.08822 2.60084,-1.49345 1.11885,-0.40523 2.47944,-0.70639 3.98056,-0.93114 3.33585,-0.49945 7.32241,-0.60831 11.10357,-1.1895 1.97868,-0.30414 3.91492,-0.73834 5.71534,-1.518 1.42883,-0.61874 2.76044,-1.49742 3.83999,-2.56194 1.07956,-1.06452 1.93659,-2.30465 2.6115,-3.64247 1.45684,-2.88778 2.10667,-6.21944 2.43293,-9.75357 0.32626,-3.53412 0.31166,-7.28875 0.26414,-11.02316 -0.006,-0.49199 -0.0132,-0.98354 -0.0201,-1.474 h -5.10039 l 5.1e-4,0.0359 c 0.0396,2.81557 0.0778,5.59659 0.0778,5.59659 -0.19559,6.41285 -0.58043,9.85971 -0.58043,9.85971 -1.33123,4.00029 -1.91463,5.1435 -1.91463,5.1435 -1.41735,1.80699 -2.21458,2.46835 -2.21458,2.46835 -2.23261,1.0634 -3.69969,1.46201 -3.69969,1.46201 -4.95371,0.83909 -8.97151,0.95184 -8.97151,0.95184 -5.71276,0.79548 -7.55271,1.1586 -7.55271,1.1586 -3.47167,1.26386 -5.13747,2.19295 -5.13747,2.19295 -2.29139,2.41691 -3.00736,3.60745 -3.00736,3.60745 -1.35336,3.13091 -1.791,5.1587 -1.791,5.1587 -0.85869,5.83665 -0.97122,9.79137 -0.97122,9.79137 -0.73101,4.72236 -1.02483,6.01996 -1.02483,6.01996 -0.779,2.14885 -1.24169,2.95922 -1.24169,2.95922 -1.51073,1.73921 -2.75354,2.55079 -2.75354,2.55079 -4.56905,1.75542 -8.70783,2.18247 -8.70783,2.18247 -6.85743,0.12671 -9.25191,0.0935 -11.67225,0.0594 l -0.0359,-5e-4 z"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1"
id="path7-4"
sodipodi:nodetypes="cssssssssssssssssccscccccccccccccccscc" />
<path
d="m 271.56839,982.46676 c -0.034,-2.41634 -0.0686,-4.85811 -0.0238,-7.25372 0.09,-4.81496 0.45876,-9.44196 1.99805,-13.41146 0.70815,-1.82617 1.68271,-3.52041 3.03133,-4.93981 1.0751,-1.13152 2.41806,-2.07818 3.88292,-2.74371 1.46486,-0.66552 3.02601,-1.0882 4.62759,-1.39602 3.44012,-0.6612 7.10747,-0.80391 10.39304,-1.15952 2.46787,-0.26711 4.70591,-0.66196 6.35074,-1.31545 1.06965,-0.42497 1.86275,-0.92891 2.45158,-1.55021 0.58883,-0.62129 1.08822,-1.482 1.49345,-2.60084 0.40523,-1.11885 0.70638,-2.47944 0.93114,-3.98056 0.49945,-3.33585 0.60831,-7.32241 1.1895,-11.10357 0.30414,-1.97868 0.73834,-3.91492 1.518,-5.71534 0.61874,-1.42883 1.49742,-2.76044 2.56194,-3.84 1.06452,-1.07955 2.30465,-1.93658 3.64247,-2.61149 2.88778,-1.45684 6.21944,-2.10667 9.75357,-2.43293 3.53412,-0.32626 7.28875,-0.31166 11.02315,-0.26415 0.492,0.006 0.98354,0.0132 1.47401,0.0201 v 5.10039 l -0.0359,-5.1e-4 c -2.81557,-0.0396 -5.59659,-0.0778 -5.59659,-0.0778 -6.41285,0.19559 -9.85971,0.58043 -9.85971,0.58043 -4.00029,1.33123 -5.1435,1.91463 -5.1435,1.91463 -1.80699,1.41735 -2.46835,2.21458 -2.46835,2.21458 -1.0634,2.2326 -1.46201,3.69969 -1.46201,3.69969 -0.8391,4.9537 -0.95184,8.97151 -0.95184,8.97151 -0.79549,5.71276 -1.1586,7.55271 -1.1586,7.55271 -1.26386,3.47166 -2.19295,5.13747 -2.19295,5.13747 -2.41692,2.29138 -3.60745,3.00736 -3.60745,3.00736 -3.13091,1.35336 -5.15871,1.791 -5.15871,1.791 -5.83664,0.85869 -9.79136,0.97122 -9.79136,0.97122 -4.72236,0.73101 -6.01996,1.02483 -6.01996,1.02483 -2.14885,0.779 -2.95922,1.24169 -2.95922,1.24169 -1.73921,1.51073 -2.55079,2.75354 -2.55079,2.75354 -1.75542,4.56905 -2.18247,8.70783 -2.18247,8.70783 -0.12671,6.85743 -0.0935,9.25191 -0.0594,11.67225 l 5e-4,0.0359 z"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1"
id="path8-2"
sodipodi:nodetypes="cssssssssssssssssccscccccccccccccccscc" />
<path
d="m 315.53867,982.46676 c 0.56866,-3.26382 0.71472,-6.69801 1.04975,-9.79336 0.26711,-2.46787 0.66196,-4.70591 1.31544,-6.35074 0.42497,-1.06965 0.92892,-1.86275 1.55021,-2.45158 0.6213,-0.58883 1.48201,-1.08823 2.60085,-1.49345 1.11884,-0.40523 2.47943,-0.70639 3.98056,-0.93114 3.33585,-0.49945 7.32241,-0.60831 11.10357,-1.1895 0.24338,-0.0374 0.48612,-0.0768 0.72804,-0.11853 V 954.947 c -0.32137,0.0671 -0.65252,0.12937 -0.99227,0.18692 -3.27703,0.55509 -7.29483,0.66783 -11.13625,1.20274 -1.87134,0.26058 -3.7113,0.6237 -5.44713,1.25562 -1.73583,0.63193 -3.40164,1.56103 -4.72047,2.95211 -0.97255,1.02583 -1.68853,2.21637 -2.22915,3.46706 -0.81273,1.88021 -1.25037,3.90801 -1.5549,5.97793 -0.55416,3.76672 -0.66669,7.72145 -1.17617,11.01266 -0.0784,0.50627 -0.16578,0.99584 -0.26328,1.46472 z"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1"
id="path10-3"
sodipodi:nodetypes="cssssssccssssssscc" />
<path
id="path13"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1"
d="m 242.24433,914.36362 c 5.93188,-1.18366 12.18304,-0.64248 17.9227,-2.77546 2.99045,-1.06215 5.46813,-3.40375 6.63316,-6.36102 1.97348,-4.85312 1.85987,-10.18795 2.48623,-15.30992 0.11991,-1.02993 0.26559,-2.05784 0.47767,-3.07322 h -5.19146 c -0.215,1.24914 -0.36892,2.50793 -0.49786,3.76858 -0.49119,4.23086 -0.41243,8.62265 -1.97915,12.64584 -0.67781,1.8559 -2.3263,3.16931 -4.18514,3.72589 -5.06962,1.59358 -10.4786,1.23093 -15.66615,2.18811 z"
sodipodi:nodetypes="ccccccccccc" />
<path
d="m 242.24433,914.36362 z m 8.71065,-0.88529 z m 12.18589,-3.36566 z m 4.97298,-9.26881 z"
style="fill:#009688;fill-opacity:1;stroke:#000000;stroke-width:0.09540093;stroke-dasharray:none;stroke-opacity:1"
id="path21-2" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 9 KiB

Before After
Before After

View file

@ -67,11 +67,13 @@
"travel_acceleration": "2500",
"travel_jerk": "7",
"travel_speed": "250",
"version": "0.0.0.0",
"version": "0.0.0.1",
"wipe_on_loops": "1",
"wipe_speed": "30",
"xy_contour_compensation": "0",
"xy_hole_compensation": "0",
"instantiation": "true",
"skin_infill_line_width": "1.2",
"skeleton_infill_line_width": "1.2",
"compatible_printers": ["Ginger G1 1.2 nozzle"]
}

View file

@ -56,7 +56,7 @@
"travel_acceleration": "2500",
"travel_jerk": "7",
"travel_speed": "250",
"version": "0.0.0.0",
"version": "0.0.0.1",
"wall_generator": "arachne",
"wall_loops": "1",
"wipe_on_loops": "1",
@ -64,5 +64,7 @@
"xy_contour_compensation": "0",
"xy_hole_compensation": "0",
"instantiation": "true",
"skin_infill_line_width": "3.0",
"skeleton_infill_line_width": "3.0",
"compatible_printers": ["Ginger G1 3.0 nozzle"]
}

View file

@ -63,12 +63,14 @@
"travel_acceleration": "2500",
"travel_jerk": "7",
"travel_speed": "250",
"version": "0.0.0.0",
"version": "0.0.0.1",
"wall_loops": "1",
"wipe_on_loops": "1",
"wipe_speed": "40",
"xy_contour_compensation": "0",
"xy_hole_compensation": "0",
"instantiation": "true",
"skin_infill_line_width": "3.0",
"skeleton_infill_line_width": "3.0",
"compatible_printers": ["Ginger G1 3.0 nozzle"]
}

View file

@ -63,7 +63,7 @@
"travel_acceleration": "2500",
"travel_jerk": "7",
"travel_speed": "250",
"version": "0.0.0.0",
"version": "0.0.0.1",
"wall_generator": "arachne",
"wall_loops": "1",
"wipe_on_loops": "1",
@ -71,5 +71,7 @@
"xy_contour_compensation": "0",
"xy_hole_compensation": "0",
"instantiation": "true",
"skin_infill_line_width": "5.0",
"skeleton_infill_line_width": "5.0",
"compatible_printers": ["Ginger G1 5.0 nozzle"]
}

View file

@ -61,7 +61,7 @@
"travel_acceleration": "2500",
"travel_jerk": "7",
"travel_speed": "250",
"version": "0.0.0.0",
"version": "0.0.0.1",
"wall_generator": "arachne",
"wall_loops": "1",
"wipe_on_loops": "1",
@ -69,5 +69,7 @@
"xy_contour_compensation": "0",
"xy_hole_compensation": "0",
"instantiation": "true",
"skin_infill_line_width": "8.0",
"skeleton_infill_line_width": "8.0",
"compatible_printers": ["Ginger G1 8.0 nozzle"]
}

View file

@ -5986,6 +5986,11 @@ bool CLI::setup(int argc, char **argv)
// The resources are packed to 'resources'
// Path from Slic3r binary to resources:
boost::filesystem::path path_resources = boost::filesystem::canonical(path_to_binary).parent_path().parent_path() / "resources";
//Orca: for build systems that support multiple configurations, the binary may be in a subdirectory like "bin/Release" or "bin/Debug".
if( !boost::filesystem::exists(path_resources)) {
// If the resources directory does not exist, try to use the resources directory
path_resources = boost::filesystem::canonical(path_to_binary).parent_path().parent_path().parent_path() / "resources";
}
#endif
set_resources_dir(path_resources.string());

View file

@ -3,9 +3,6 @@ project(libslic3r)
include(PrecompiledHeader)
string(TIMESTAMP COMPILE_TIME %Y%m%d-%H%M%S)
set(SLIC3R_BUILD_TIME ${COMPILE_TIME})
if(NOT DEFINED ORCA_CHECK_GCODE_PLACEHOLDERS)
set(ORCA_CHECK_GCODE_PLACEHOLDERS "0")
endif()

View file

@ -41,6 +41,8 @@ struct SurfaceFillParams
// FillParams
float density = 0.f;
// Infill line multiplier count.
int multiline = 1;
// Don't adjust spacing to fill the space evenly.
// bool dont_adjust = false;
// Length of the infill anchor along the perimeter line.
@ -88,6 +90,7 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(overlap);
RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(density);
RETURN_COMPARE_NON_EQUAL(multiline);
// RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust);
RETURN_COMPARE_NON_EQUAL(anchor_length);
RETURN_COMPARE_NON_EQUAL(anchor_length_max);
@ -117,6 +120,7 @@ struct SurfaceFillParams
this->bridge == rhs.bridge &&
this->bridge_angle == rhs.bridge_angle &&
this->density == rhs.density &&
this->multiline == rhs.multiline &&
// this->dont_adjust == rhs.dont_adjust &&
this->anchor_length == rhs.anchor_length &&
this->anchor_length_max == rhs.anchor_length_max &&
@ -647,6 +651,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer, LockRegionParam &lock_p
params.extruder = layerm.region().extruder(extrusion_role);
params.pattern = region_config.sparse_infill_pattern.value;
params.density = float(region_config.sparse_infill_density);
params.multiline = int(region_config.fill_multiline);
params.lattice_angle_1 = region_config.lattice_angle_1;
params.lattice_angle_2 = region_config.lattice_angle_2;
params.infill_overhang_angle = region_config.infill_overhang_angle;
@ -1023,6 +1028,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
// apply half spacing using this flow's own spacing and generate infill
FillParams params;
params.density = float(0.01 * surface_fill.params.density);
params.multiline = surface_fill.params.multiline;
params.dont_adjust = false; // surface_fill.params.dont_adjust;
params.anchor_length = surface_fill.params.anchor_length;
params.anchor_length_max = surface_fill.params.anchor_length_max;
@ -1199,6 +1205,7 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
params.lattice_angle_1 = surface_fill.params.lattice_angle_1;
params.lattice_angle_2 = surface_fill.params.lattice_angle_2;
params.infill_overhang_angle = surface_fill.params.infill_overhang_angle;
params.multiline = surface_fill.params.multiline;
for (ExPolygon &expoly : surface_fill.expolygons) {
// Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon.

View file

@ -1,7 +1,7 @@
#include "../ClipperUtils.hpp"
#include "../ShortestPath.hpp"
#include "../Surface.hpp"
#include "FillBase.hpp"
#include "Fill3DHoneycomb.hpp"
namespace Slic3r {
@ -212,7 +212,7 @@ void Fill3DHoneycomb::_fill_surface_single(
// = 4 * integrate(func=4*x(sqrt(2) - 1) + 1, from=0, to=0.25)
// = (sqrt(2) + 1) / 2 [... I think]
// make a first guess at the preferred grid Size
coordf_t gridSize = (scale_(this->spacing) * ((zScale + 1.) / 2.) / params.density);
coordf_t gridSize = (scale_(this->spacing) * ((zScale + 1.) / 2.) * params.multiline / params.density);
// This density calculation is incorrect for many values > 25%, possibly
// due to quantisation error, so this value is used as a first guess, then the
@ -228,7 +228,7 @@ void Fill3DHoneycomb::_fill_surface_single(
layersPerModule = 2;
// re-adjust the grid size for a partial octahedral path
// (scale of 1.1 guessed based on modeling)
gridSize = (scale_(this->spacing) * 1.1 / params.density);
gridSize = (scale_(this->spacing) * 1.1 * params.multiline / params.density);
// re-adjust zScale to make layering consistent
zScale = (gridSize * 2) / (layersPerModule * layerHeight);
} else {
@ -238,7 +238,7 @@ void Fill3DHoneycomb::_fill_surface_single(
// re-adjust zScale to make layering consistent
zScale = (gridSize * 2) / (layersPerModule * layerHeight);
// re-adjust the grid size to account for the new zScale
gridSize = (scale_(this->spacing) * ((zScale + 1.) / 2.) / params.density);
gridSize = (scale_(this->spacing) * ((zScale + 1.) / 2.) * params.multiline / params.density);
// re-calculate layersPerModule and zScale
layersPerModule = floor((gridSize * 2) / (zScale * layerHeight) + 0.05);
if(layersPerModule < 2){
@ -264,11 +264,24 @@ void Fill3DHoneycomb::_fill_surface_single(
// move pattern in place
for (Polyline &pl : polylines){
pl.translate(bb.min);
pl.simplify(5 * spacing); // simplify to 5x line width
}
// Apply multiline offset if needed
multiline_fill(polylines, params, spacing);
// clip pattern to boundaries, chain the clipped polylines
polylines = intersection_pl(polylines, to_polygons(expolygon));
if (! polylines.empty()) {
// Remove very small bits, but be careful to not remove infill lines connecting thin walls!
// The infill perimeter lines should be separated by around a single infill line width.
const double minlength = scale_(0.8 * this->spacing);
polylines.erase(
std::remove_if(polylines.begin(), polylines.end(), [minlength](const Polyline &pl) { return pl.length() < minlength; }),
polylines.end());
}
// copy from fliplines
if (!polylines.empty()) {
int infill_start_idx = polylines_out.size(); // only rotate what belongs to us.

View file

@ -1369,6 +1369,10 @@ void Filler::_fill_surface_single(
// Convert lines to polylines.
all_polylines.reserve(lines.size());
std::transform(lines.begin(), lines.end(), std::back_inserter(all_polylines), [](const Line& l) { return Polyline{ l.a, l.b }; });
// Apply multiline offset if needed
multiline_fill(all_polylines, params, spacing);
// Crop all polylines
all_polylines = intersection_pl(std::move(all_polylines), expolygon);
#endif

View file

@ -1,6 +1,7 @@
#include <stdio.h>
#include <numeric>
#include <cmath>
#include "../ClipperUtils.hpp"
#include "../EdgeGrid.hpp"
#include "../Geometry.hpp"
@ -25,7 +26,6 @@
// BBS: new infill pattern header
#include "FillConcentricInternal.hpp"
#include "FillCrossHatch.hpp"
// #define INFILL_DEBUG_OUTPUT
namespace Slic3r {
@ -190,22 +190,22 @@ void Fill::fill_surface_extrusion(const Surface* surface, const FillParams& para
// Orca: Dedicated function to calculate gap fill lines for the provided surface, according to the print object parameters
// and append them to the out ExtrusionEntityCollection.
void Fill::_create_gap_fill(const Surface* surface, const FillParams& params, ExtrusionEntityCollection* out){
//Orca: just to be safe, check against null pointer for the print object config and if NULL return.
if (this->print_object_config == nullptr) return;
// Orca: Enable gap fill as per the user preference. Return early if gap fill is to not be applied.
if ((this->print_object_config->gap_fill_target.value == gftNowhere) ||
(surface->surface_type == stInternalSolid && this->print_object_config->gap_fill_target.value != gftEverywhere))
return;
Flow new_flow = params.flow;
ExPolygons unextruded_areas;
unextruded_areas = diff_ex(this->no_overlap_expolygons, union_ex(out->polygons_covered_by_spacing(10)));
ExPolygons gapfill_areas = union_ex(unextruded_areas);
if (!this->no_overlap_expolygons.empty())
gapfill_areas = intersection_ex(gapfill_areas, this->no_overlap_expolygons);
if (gapfill_areas.size() > 0 && params.density >= 1) {
double min = 0.2 * new_flow.scaled_spacing() * (1 - INSET_OVERLAP_TOLERANCE);
double max = 2. * new_flow.scaled_spacing();
@ -222,20 +222,20 @@ void Fill::_create_gap_fill(const Surface* surface, const FillParams& params, Ex
std::vector<Points::size_type> order2 = chain_points(ordering_points);
for (size_t i : order2)
gaps_ex_sorted.emplace_back(std::move(gaps_ex[i]));
ThickPolylines polylines;
for (ExPolygon& ex : gaps_ex_sorted) {
//BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well.
ex.douglas_peucker(SCALED_RESOLUTION * 0.1);
ex.medial_axis(min, max, &polylines);
}
if (!polylines.empty() && !is_bridge(params.extrusion_role)) {
polylines.erase(std::remove_if(polylines.begin(), polylines.end(),
[&](const ThickPolyline& p) {
return p.length() < scale_(params.config->filter_out_gap_fill.value);
}), polylines.end());
ExtrusionEntityCollection gap_fill;
variable_width(polylines, erGapFill, params.flow, gap_fill.entities);
auto gap = std::move(gap_fill.entities);
@ -2696,4 +2696,55 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const Polygons &boun
connect_base_support(std::move(infill_ordered), polygons_src, bbox, polylines_out, spacing, params);
}
//Fill Multiline
void multiline_fill(Polylines& polylines, const FillParams& params, float spacing)
{
if (params.multiline > 1) {
const int n_lines = params.multiline;
const int n_polylines = static_cast<int>(polylines.size());
Polylines all_polylines;
all_polylines.reserve(n_lines * n_polylines);
const float center = (n_lines - 1) / 2.0f;
for (int line = 0; line < n_lines; ++line) {
float offset = (static_cast<float>(line) - center) * spacing;
for (const Polyline& pl : polylines) {
const size_t n = pl.points.size();
if (n < 2) {
all_polylines.emplace_back(pl);
continue;
}
Points new_points;
new_points.reserve(n);
for (size_t i = 0; i < n; ++i) {
Vec2f tangent;
if (i == 0)
tangent = Vec2f(pl.points[1].x() - pl.points[0].x(), pl.points[1].y() - pl.points[0].y());
else if (i == n - 1)
tangent = Vec2f(pl.points[n - 1].x() - pl.points[n - 2].x(), pl.points[n - 1].y() - pl.points[n - 2].y());
else
tangent = Vec2f(pl.points[i + 1].x() - pl.points[i - 1].x(), pl.points[i + 1].y() - pl.points[i - 1].y());
float len = std::hypot(tangent.x(), tangent.y());
if (len == 0)
len = 1.0f;
tangent /= len;
Vec2f normal(-tangent.y(), tangent.x());
Point p = pl.points[i];
p.x() += scale_(normal.x() * offset);
p.y() += scale_(normal.y() * offset);
new_points.push_back(p);
}
all_polylines.emplace_back(std::move(new_points));
}
}
polylines = std::move(all_polylines);
}
}
} // namespace Slic3r

View file

@ -53,6 +53,7 @@ struct FillParams
// Fill density, fraction in <0, 1>
float density { 0.f };
int multiline{1};
// Length of an infill anchor along the perimeter.
// 1000mm is roughly the maximum length line that fits into a 32bit coord_t.
@ -223,7 +224,8 @@ public:
static coord_t _adjust_solid_spacing(const coord_t width, const coord_t distance);
};
//Fill Multiline
void multiline_fill(Polylines& polylines, const FillParams& params, float spacing);
} // namespace Slic3r
#endif // slic3r_FillBase_hpp_

View file

@ -2,7 +2,7 @@
#include "../ShortestPath.hpp"
#include "../Surface.hpp"
#include <cmath>
#include "FillBase.hpp"
#include "FillCrossHatch.hpp"
namespace Slic3r {
@ -186,7 +186,8 @@ void FillCrossHatch ::_fill_surface_single(
BoundingBox bb = expolygon.contour.bounding_box();
// linespace modifier
coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
double density_adjusted = params.density / params.multiline;
coord_t line_spacing = coord_t(scale_(this->spacing) / density_adjusted);
// reduce density
if (params.density < 0.999) line_spacing *= 1.08;
@ -204,6 +205,9 @@ void FillCrossHatch ::_fill_surface_single(
// shift the pattern to the actual space
for (Polyline &pl : polylines) { pl.translate(bb.min); }
// Apply multiline offset if needed
multiline_fill(polylines, params, spacing);
polylines = intersection_pl(polylines, to_polygons(expolygon));
// --- remove small remains from gyroid infill

View file

@ -4,7 +4,7 @@
#include <cmath>
#include <algorithm>
#include <iostream>
#include "FillBase.hpp"
#include "FillGyroid.hpp"
namespace Slic3r {
@ -149,10 +149,10 @@ static Polylines make_gyroid_waves(double gridZ, double density_adjusted, double
constexpr double FillGyroid::PatternTolerance;
void FillGyroid::_fill_surface_single(
const FillParams &params,
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
ExPolygon expolygon,
const std::pair<float, Point> &direction,
ExPolygon expolygon,
Polylines &polylines_out)
{
auto infill_angle = float(this->angle + (CorrectionAngle * 2*M_PI) / 360.);
@ -161,7 +161,7 @@ void FillGyroid::_fill_surface_single(
BoundingBox bb = expolygon.contour.bounding_box();
// Density adjusted to have a good %of weight.
double density_adjusted = std::max(0., params.density * DensityAdjust);
double density_adjusted = std::max(0., params.density * DensityAdjust / params.multiline);
// Distance between the gyroid waves in scaled coordinates.
coord_t distance = coord_t(scale_(this->spacing) / density_adjusted);
@ -184,6 +184,9 @@ void FillGyroid::_fill_surface_single(
for (Polyline &pl : polylines)
pl.translate(bb.min);
// Apply multiline offset if needed
multiline_fill(polylines, params, spacing);
polylines = intersection_pl(polylines, expolygon);
if (! polylines.empty()) {

View file

@ -7,9 +7,9 @@
namespace Slic3r {
void FillHoneycomb::_fill_surface_single(
const FillParams &params,
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
const std::pair<float, Point> &direction,
ExPolygon expolygon,
Polylines &polylines_out)
{
@ -19,7 +19,7 @@ void FillHoneycomb::_fill_surface_single(
if (it_m == this->cache.end()) {
it_m = this->cache.insert(it_m, std::pair<CacheID, CacheData>(cache_id, CacheData()));
CacheData &m = it_m->second;
coord_t min_spacing = coord_t(scale_(this->spacing));
coord_t min_spacing = coord_t(scale_(this->spacing)) * params.multiline;
m.distance = coord_t(min_spacing / params.density);
m.hex_side = coord_t(m.distance / (sqrt(3)/2));
m.hex_width = m.distance * 2; // $m->{hex_width} == $m->{hex_side} * sqrt(3);
@ -36,14 +36,14 @@ void FillHoneycomb::_fill_surface_single(
{
// adjust actual bounding box to the nearest multiple of our hex pattern
// and align it so that it matches across layers
BoundingBox bounding_box = expolygon.contour.bounding_box();
{
// rotate bounding box according to infill direction
Polygon bb_polygon = bounding_box.polygon();
bb_polygon.rotate(direction.first, m.hex_center);
bounding_box = bb_polygon.bounding_box();
// extend bounding box so that our pattern will be aligned with other layers
// $bounding_box->[X1] and [Y1] represent the displacement between new bounding box offset and old one
// The infill is not aligned to the object bounding box, but to a world coordinate system. Supposedly good enough.
@ -69,10 +69,13 @@ void FillHoneycomb::_fill_surface_single(
x += m.distance;
}
p.rotate(-direction.first, m.hex_center);
p.simplify(5 * spacing); // simplify to 5x line width
all_polylines.push_back(p);
}
}
// Apply multiline offset if needed
multiline_fill(all_polylines, params, 1.1 * spacing);
all_polylines = intersection_pl(std::move(all_polylines), expolygon);
chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params);
}

View file

@ -1,6 +1,6 @@
#include "../Print.hpp"
#include "../ShortestPath.hpp"
#include "FillBase.hpp"
#include "FillLightning.hpp"
#include "Lightning/Generator.hpp"
@ -16,6 +16,10 @@ void Filler::_fill_surface_single(
const Layer &layer = generator->getTreesForLayer(this->layer_id);
Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled<coord_t>(0.5 * this->spacing - this->overlap));
// Apply multiline offset if needed
multiline_fill(fill_lines, params, spacing);
chain_or_connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params);
}

View file

@ -2956,11 +2956,49 @@ void make_fill_lines(const ExPolygonWithOffset &poly_with_offset, Point refpt, d
}
}
// Remove lines that are too close to each other.
static inline void remove_overlapped(Polylines& polylines, coord_t line_width){
const coord_t tolerance = coord_t(0.75 * line_width);
Polylines cleaned;
cleaned.reserve(polylines.size());
auto midpoint = [](const Polyline& line) -> Point {
const Point& p1 = line.first_point();
const Point& p2 = line.last_point();
return Point((p1.x() + p2.x()) / 2, (p1.y() + p2.y()) / 2);
};
for (const Polyline& line : polylines) {
Point mp1 = midpoint(line);
bool overlapped = false;
for (const Polyline& existing : cleaned) {
Point mp2 = midpoint(existing);
// Early skip: if they're far apart on one axis, skip
if (std::abs(mp1.y() - mp2.y()) > tolerance &&
std::abs(mp1.x() - mp2.x()) > tolerance)
continue;
if (mp1.distance_to(mp2) < tolerance) {
overlapped = true;
break;
}
}
if (!overlapped)
cleaned.push_back(line);
}
polylines = std::move(cleaned);
}
bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out)
{
assert(sweep_params.size() >= 1);
assert(! params.full_infill());
assert(!params.full_infill());
params.density /= double(sweep_params.size());
int n_multilines = params.multiline;
assert(params.density > 0.0001f && params.density <= 1.f);
ExPolygonWithOffset poly_with_offset_base(surface->expolygon, 0, float(scale_(this->overlap - 0.5 * this->spacing)));
@ -2970,16 +3008,28 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
Polylines fill_lines;
coord_t line_width = coord_t(scale_(this->spacing));
coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
coord_t line_spacing = coord_t(scale_(this->spacing) * params.multiline / params.density);
std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
for (const SweepParams &sweep : sweep_params) {
// Rotate polygons so that we can work with vertical lines here
float angle = rotate_vector.first + sweep.angle_base;
make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, - angle), rotate_vector.second.rotated(-angle), angle, line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines);
//Fill Multiline
for (int i = 0; i < n_multilines; ++i) {
coord_t group_offset = i * line_spacing;
coord_t internal_offset = (i - (n_multilines - 1) / 2.0f) * line_width;
coord_t total_offset = group_offset + internal_offset;
coord_t pattern_shift = scale_(sweep.pattern_shift + unscale_(total_offset));
make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, -angle), rotate_vector.second.rotated(-angle), angle,
line_width + coord_t(SCALED_EPSILON), line_spacing, pattern_shift, fill_lines);
}
}
if ((params.pattern == ip2DLattice || params.pattern == ip2DHoneycomb ) && params.multiline >1 )
remove_overlapped(fill_lines, line_width);
if (!fill_lines.empty()) {
if (params.dont_connect()) {
if (params.dont_connect()) {
if (fill_lines.size() > 1)
fill_lines = chain_polylines(std::move(fill_lines));
append(polylines_out, std::move(fill_lines));
@ -3057,8 +3107,7 @@ Polylines Fill2DLattice::fill_surface(const Surface *surface, const FillParams &
return polylines_out;
}
Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &params)
{
Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &params){
Polylines polylines_out;
if (! this->fill_surface_by_multilines(
surface, params,
@ -3073,7 +3122,7 @@ Polylines FillStars::fill_surface(const Surface *surface, const FillParams &para
Polylines polylines_out;
if (! this->fill_surface_by_multilines(
surface, params,
{ { 0.f, 0.f }, { float(M_PI / 3.), 0.f }, { float(2. * M_PI / 3.), float((3./2.) * this->spacing / params.density) } },
{ { 0.f, 0.f }, { float(M_PI / 3.), 0.f }, { float(2. * M_PI / 3.), float((3./2.) * this->spacing * params.multiline / params.density) } },
polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillStars::fill_surface() failed to fill a region.";
return polylines_out;
@ -3094,7 +3143,6 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &para
Polylines FillQuarterCubic::fill_surface(const Surface* surface, const FillParams& params)
{
using namespace boost::math::float_constants;
Polylines polylines_out;
coord_t line_width = coord_t(scale_(this->spacing));
@ -3139,7 +3187,7 @@ Polylines Fill2DHoneycomb::fill_surface(const Surface *surface, const FillParams
using namespace boost::math::float_constants;
// lets begin calculating some base properties of the honeycomb pattern
const float half_horizontal_period = .5f * (1*(2/3.f) + 2*(1/3.f)) * float(spacing) / params.density;
const float half_horizontal_period = .5f * (1*(2/3.f) + 2*(1/3.f)) * float(spacing) * params.multiline / params.density;
const float vertical_period = 3 * half_horizontal_period / tanf(degree * float(params.infill_overhang_angle));
// we want to align the base pattern with its knot on height 0

View file

@ -55,8 +55,9 @@ static Polylines make_waves(double gridZ, double density_adjusted, double line_s
std::vector<std::pair<double,double>> wave;
{//fill one wave
const auto v=[&](double u){return acos(a/b*cos(u));};
for(int c=0;c<=4;++c){
const double u=minU+2*M_PI*c/4;
const int initialSegments=16;
for(int c=0;c<=initialSegments;++c){
const double u=minU+2*M_PI*c/initialSegments;
wave.emplace_back(u,v(u));
}
{//refine
@ -110,7 +111,7 @@ void FillTpmsD::_fill_surface_single(
BoundingBox bb = expolygon.contour.bounding_box();
// Density adjusted to have a good %of weight.
double density_adjusted = std::max(0., params.density * DensityAdjust);
double density_adjusted = std::max(0., params.density * DensityAdjust / params.multiline);
// Distance between the gyroid waves in scaled coordinates.
coord_t distance = coord_t(scale_(this->spacing) / density_adjusted);
@ -129,6 +130,8 @@ void FillTpmsD::_fill_surface_single(
for (Polyline &pl : polylines)
pl.translate(bb.min);
// Apply multiline offset if needed
multiline_fill(polylines, params, spacing);
polylines = intersection_pl(polylines, expolygon);

View file

@ -785,7 +785,7 @@ static std::vector<std::string> s_Preset_print_options {
"layer_height", "initial_layer_print_height", "wall_loops", "alternate_extra_wall", "slice_closing_radius", "spiral_mode", "spiral_mode_smooth", "spiral_mode_max_xy_smoothing", "spiral_starting_flow_ratio", "spiral_finishing_flow_ratio", "slicing_mode",
"top_shell_layers", "top_shell_thickness", "top_surface_density", "bottom_surface_density", "bottom_shell_layers", "bottom_shell_thickness",
"extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only", "wall_direction",
"seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density", "sparse_infill_pattern", "lattice_angle_1", "lattice_angle_2", "infill_overhang_angle", "top_surface_pattern", "bottom_surface_pattern",
"seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density","fill_multiline", "sparse_infill_pattern", "lattice_angle_1", "lattice_angle_2", "infill_overhang_angle", "top_surface_pattern", "bottom_surface_pattern",
"infill_direction", "solid_infill_direction", "counterbore_hole_bridging","infill_shift_step", "sparse_infill_rotate_template", "solid_infill_rotate_template", "symmetric_infill_y_axis","skeleton_infill_density", "infill_lock_depth", "skin_infill_depth", "skin_infill_density",
"minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern","gap_fill_target",
"ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "ironing_inset",

View file

@ -2361,6 +2361,14 @@ void PrintConfigDef::init_fff_params()
def->max = 100;
def->set_default_value(new ConfigOptionPercent(20));
// Infill multiline
def = this->add("fill_multiline", coInt);
def->label = L("Fill Multiline");
def->tooltip = L("Using multiple lines for the infill pattern, if supported by infill pattern.");
def->min = 1;
def->max = 5; // Maximum number of lines for infill pattern
def->set_default_value(new ConfigOptionInt(1));
def = this->add("sparse_infill_pattern", coEnum);
def->label = L("Sparse infill pattern");
def->category = L("Strength");
@ -3119,7 +3127,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("This parameter adds a rotation of sparse infill direction to each layer according to the specified template. "
"The template is a comma-separated list of angles in degrees, e.g. '0,90'. "
"The first angle is applied to the first layer, the second angle to the second layer, and so on. "
"If there are more layers than angles, the angles will be repeated. Note that not all all sparse infill patterns support rotation.");
"If there are more layers than angles, the angles will be repeated. Note that not all sparse infill patterns support rotation.");
def->sidetext = L("°");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionString("0,90"));
@ -3131,7 +3139,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("This parameter adds a rotation of solid infill direction to each layer according to the specified template. "
"The template is a comma-separated list of angles in degrees, e.g. '0,90'. "
"The first angle is applied to the first layer, the second angle to the second layer, and so on. "
"If there are more layers than angles, the angles will be repeated. Note that not all all solid infill patterns support rotation.");
"If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation.");
def->sidetext = L("°");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionString("0,90"));
@ -3189,7 +3197,7 @@ void PrintConfigDef::init_fff_params()
def->ratio_over = "nozzle_diameter";
def->min = 0;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
def = this->add("skeleton_infill_line_width", coFloatOrPercent);
def->label = L("Skeleton line width");
@ -3199,7 +3207,7 @@ void PrintConfigDef::init_fff_params()
def->ratio_over = "nozzle_diameter";
def->min = 0;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
def = this->add("symmetric_infill_y_axis", coBool);
def->label = L("Symmetric infill y axis");

View file

@ -993,6 +993,7 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionBool, infill_combination))
// Orca:
((ConfigOptionFloatOrPercent, infill_combination_max_layer_height))
((ConfigOptionInt, fill_multiline))
// Ironing options
((ConfigOptionEnum<IroningType>, ironing_type))
((ConfigOptionEnum<InfillPattern>, ironing_pattern))

View file

@ -1065,6 +1065,7 @@ bool PrintObject::invalidate_state_by_config_options(
#endif
} else if (
opt_key == "interface_shells"
|| opt_key == "infill_multiline"
|| opt_key == "infill_combination"
|| opt_key == "infill_combination_max_layer_height"
|| opt_key == "bottom_shell_thickness"

View file

@ -9,7 +9,6 @@
#define GIT_COMMIT_HASH "0000000" // 0000000 means uninitialized
#endif
#define SLIC3R_BUILD_ID "@SLIC3R_BUILD_ID@"
#define SLIC3R_BUILD_TIME "@SLIC3R_BUILD_TIME@"
//#define SLIC3R_RC_VERSION "@SLIC3R_VERSION@"
#define BBL_RELEASE_TO_PUBLIC @BBL_RELEASE_TO_PUBLIC@
#define BBL_INTERNAL_TESTING @BBL_INTERNAL_TESTING@

View file

@ -262,13 +262,6 @@ AboutDialog::AboutDialog()
vesizer->Add(version, 0, wxRIGHT | wxALIGN_RIGHT, FromDIP(20));
vesizer->AddSpacer(FromDIP(5));
vesizer->Add(credits_string, 0, wxRIGHT | wxALIGN_RIGHT, FromDIP(20));
// #if BBL_INTERNAL_TESTING
// wxString build_time = wxString::Format("Build Time: %s", std::string(SLIC3R_BUILD_TIME));
// wxStaticText* build_time_text = new wxStaticText(this, wxID_ANY, build_time, wxDefaultPosition, wxDefaultSize);
// build_time_text->SetForegroundColour(wxColour("#FFFFFE"));
// build_time_text->SetBackgroundColour(wxColour("#00AF42"));
// vesizer->Add(build_time_text, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5));
// #endif
vesizer->Add(0, 0, 1, wxEXPAND, FromDIP(5));
}

View file

@ -294,6 +294,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
}
double sparse_infill_density = config->option<ConfigOptionPercent>("sparse_infill_density")->value;
int fill_multiline = config->option<ConfigOptionInt>("fill_multiline")->value;
auto timelapse_type = config->opt_enum<TimelapseType>("timelapse_type");
if (!is_plate_config &&
@ -546,6 +547,20 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
bool have_combined_infill = config->opt_bool("infill_combination") && have_infill;
toggle_line("infill_combination_max_layer_height", have_combined_infill);
// Infill patterns that support multiline infill.
InfillPattern pattern = config->opt_enum<InfillPattern>("sparse_infill_pattern");
bool have_multiline_infill_pattern = pattern == ipGyroid || pattern == ipGrid || pattern == ipRectilinear || pattern == ipTpmsD || pattern == ipCrossHatch || pattern == ipHoneycomb || pattern == ip2DLattice || pattern == ip2DHoneycomb ||
pattern == ipCubic || pattern == ipStars || pattern == ipAlignedRectilinear || pattern == ipLightning || pattern == ip3DHoneycomb || pattern == ipAdaptiveCubic || pattern == ipSupportCubic;
toggle_line("fill_multiline", have_multiline_infill_pattern);
// If the infill pattern does not support multiline infill, set fill_multiline to 1.
if (!have_multiline_infill_pattern) {
DynamicPrintConfig new_conf = *config;
new_conf.set_key_value("fill_multiline", new ConfigOptionInt(1));
apply(config, &new_conf);
}
// Hide infill anchor max if sparse_infill_pattern is not line or if sparse_infill_pattern is line but infill_anchor_max is 0.
bool infill_anchor = config->opt_enum<InfillPattern>("sparse_infill_pattern") != ipLine;
toggle_field("infill_anchor_max",infill_anchor);
@ -576,6 +591,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
bool has_solid_infill = has_top_shell || has_bottom_shell;
toggle_field("top_surface_pattern", has_top_shell);
toggle_field("bottom_surface_pattern", has_bottom_shell);
toggle_field("top_surface_density", has_top_shell);
toggle_field("bottom_surface_density", has_bottom_shell);
for (auto el : { "infill_direction", "sparse_infill_line_width",
"sparse_infill_speed", "bridge_speed", "internal_bridge_speed", "bridge_angle", "internal_bridge_angle",

View file

@ -67,10 +67,10 @@ private:
static bool get_stream_url(std::string *url = nullptr);
private:
static constexpr wxMediaState MEDIASTATE_IDLE = (wxMediaState) 3;
static constexpr wxMediaState MEDIASTATE_INITIALIZING = (wxMediaState) 4;
static constexpr wxMediaState MEDIASTATE_LOADING = (wxMediaState) 5;
static constexpr wxMediaState MEDIASTATE_BUFFERING = (wxMediaState) 6;
static const wxMediaState MEDIASTATE_IDLE = (wxMediaState) 3;
static const wxMediaState MEDIASTATE_INITIALIZING = (wxMediaState) 4;
static const wxMediaState MEDIASTATE_LOADING = (wxMediaState) 5;
static const wxMediaState MEDIASTATE_BUFFERING = (wxMediaState) 6;
wxMediaCtrl2 * m_media_ctrl;
wxMediaState m_last_state = MEDIASTATE_IDLE;

View file

@ -263,6 +263,28 @@ wxColor PresetComboBox::different_color(wxColor const &clr)
wxString PresetComboBox::get_tooltip(const Preset &preset)
{
wxString tooltip = from_u8(preset.name);
// Add filament notes if available for filament presets
if (m_type == Preset::TYPE_FILAMENT) {
const DynamicConfig* config = &preset.config;
Tab* tab = wxGetApp().get_tab(m_type);
if (tab && tab->current_preset_is_dirty() && tab->get_presets()->get_selected_preset().name == preset.name) {
config = tab->get_config();
}
if (config->has("filament_notes")) {
const ConfigOptionStrings* notes_opt = config->option<ConfigOptionStrings>("filament_notes");
if (notes_opt && !notes_opt->values.empty() && !notes_opt->values[0].empty()) {
std::string notes = notes_opt->values[0];
// Truncate if longer than 200 characters
if (notes.length() > 200) {
notes = notes.substr(0, 197) + "...";
}
tooltip += "\n" + from_u8(notes);
}
}
}
// BBS: FIXME
#if 0
if (m_type == Preset::TYPE_FILAMENT) {

View file

@ -1522,7 +1522,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
}
update_wiping_button_visibility();
}
if (opt_key == "single_extruder_multi_material" ){
const auto bSEMM = m_config->opt_bool("single_extruder_multi_material");
@ -2137,15 +2137,15 @@ void TabPrint::build()
optgroup->append_single_option_line("ironing_angle");
optgroup = page->new_optgroup(L("Wall generator"), L"param_wall_generator");
optgroup->append_single_option_line("wall_generator", "quality_settings_wall-generator");
optgroup->append_single_option_line("wall_transition_angle");
optgroup->append_single_option_line("wall_transition_filter_deviation");
optgroup->append_single_option_line("wall_transition_length");
optgroup->append_single_option_line("wall_distribution_count");
optgroup->append_single_option_line("initial_layer_min_bead_width");
optgroup->append_single_option_line("min_bead_width");
optgroup->append_single_option_line("min_feature_size");
optgroup->append_single_option_line("min_length_factor");
optgroup->append_single_option_line("wall_generator", "quality_settings_wall_generator");
optgroup->append_single_option_line("wall_transition_angle", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_transition_filter_deviation", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_transition_length", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("wall_distribution_count", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("initial_layer_min_bead_width", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_bead_width", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_feature_size", "quality_settings_wall_generator#arachne");
optgroup->append_single_option_line("min_length_factor", "quality_settings_wall_generator#arachne");
optgroup = page->new_optgroup(L("Walls and surfaces"), L"param_wall_surface");
optgroup->append_single_option_line("wall_sequence");
@ -2195,41 +2195,42 @@ void TabPrint::build()
optgroup->append_single_option_line("detect_thin_wall");
optgroup = page->new_optgroup(L("Top/bottom shells"), L"param_shell");
optgroup->append_single_option_line("top_shell_layers");
optgroup->append_single_option_line("top_shell_thickness");
optgroup->append_single_option_line("top_surface_density");
optgroup->append_single_option_line("top_surface_pattern");
optgroup->append_single_option_line("bottom_shell_layers");
optgroup->append_single_option_line("bottom_shell_thickness");
optgroup->append_single_option_line("bottom_surface_density");
optgroup->append_single_option_line("bottom_surface_pattern");
optgroup->append_single_option_line("top_bottom_infill_wall_overlap");
optgroup->append_single_option_line("top_shell_layers", "strength_top-bottom_shells");
optgroup->append_single_option_line("top_shell_thickness", "strength_top-bottom_shells");
optgroup->append_single_option_line("top_surface_density", "strength_top-bottom_shells");
optgroup->append_single_option_line("top_surface_pattern", "strength_top-bottom_shells");
optgroup->append_single_option_line("bottom_shell_layers", "strength_top-bottom_shells");
optgroup->append_single_option_line("bottom_shell_thickness", "strength_top-bottom_shells");
optgroup->append_single_option_line("bottom_surface_density", "strength_top-bottom_shells");
optgroup->append_single_option_line("bottom_surface_pattern", "strength_top-bottom_shells");
optgroup->append_single_option_line("top_bottom_infill_wall_overlap", "strength_top-bottom_shells");
optgroup = page->new_optgroup(L("Infill"), L"param_infill");
optgroup->append_single_option_line("sparse_infill_density", "strength_settings_infill#sparse-infill-density");
optgroup->append_single_option_line("fill_multiline"); // fill multiline
optgroup->append_single_option_line("sparse_infill_pattern", "strength_settings_infill#sparse-infill-pattern");
optgroup->append_single_option_line("infill_direction");
optgroup->append_single_option_line("sparse_infill_rotate_template");
optgroup->append_single_option_line("skin_infill_density");
optgroup->append_single_option_line("skeleton_infill_density");
optgroup->append_single_option_line("infill_lock_depth");
optgroup->append_single_option_line("skin_infill_depth");
optgroup->append_single_option_line("skin_infill_line_width", "parameter/line-width");
optgroup->append_single_option_line("skeleton_infill_line_width", "parameter/line-width");
optgroup->append_single_option_line("symmetric_infill_y_axis");
optgroup->append_single_option_line("infill_shift_step");
optgroup->append_single_option_line("infill_direction", "strength_settings_infill#direction");
optgroup->append_single_option_line("sparse_infill_rotate_template", "strength_settings_infill#rotation");
optgroup->append_single_option_line("skin_infill_density", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("skeleton_infill_density", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("infill_lock_depth", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("skin_infill_depth", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("skin_infill_line_width", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("skeleton_infill_line_width", "strength_settings_infill#locked-zag");
optgroup->append_single_option_line("symmetric_infill_y_axis", "strength_settings_infill#zig-zag");
optgroup->append_single_option_line("infill_shift_step", "strength_settings_infill#cross-hatch");
optgroup->append_single_option_line("lattice_angle_1");
optgroup->append_single_option_line("lattice_angle_2");
optgroup->append_single_option_line("infill_overhang_angle");
optgroup->append_single_option_line("infill_anchor_max");
optgroup->append_single_option_line("infill_anchor");
optgroup->append_single_option_line("internal_solid_infill_pattern");
optgroup->append_single_option_line("solid_infill_direction");
optgroup->append_single_option_line("solid_infill_rotate_template");
optgroup->append_single_option_line("gap_fill_target");
optgroup->append_single_option_line("filter_out_gap_fill");
optgroup->append_single_option_line("infill_wall_overlap");
optgroup->append_single_option_line("lattice_angle_1", "strength_settings_infill#2d-lattice");
optgroup->append_single_option_line("lattice_angle_2", "strength_settings_infill#2d-lattice");
optgroup->append_single_option_line("infill_overhang_angle", "strength_settings_infill#2d-honeycomb");
optgroup->append_single_option_line("infill_anchor_max", "strength_settings_infill#anchor");
optgroup->append_single_option_line("infill_anchor", "strength_settings_infill#anchor");
optgroup->append_single_option_line("internal_solid_infill_pattern", "strength_settings_infill#internal-solid-infill");
optgroup->append_single_option_line("solid_infill_direction", "strength_settings_infill");
optgroup->append_single_option_line("solid_infill_rotate_template", "strength_settings_infill");
optgroup->append_single_option_line("gap_fill_target", "strength_settings_infill#apply-gap-fill");
optgroup->append_single_option_line("filter_out_gap_fill", "strength_settings_infill");
optgroup->append_single_option_line("infill_wall_overlap", "strength_settings_infill#infill-wall-overlap");
optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->append_single_option_line("bridge_angle");
@ -2302,9 +2303,9 @@ void TabPrint::build()
optgroup->append_single_option_line("default_junction_deviation");
optgroup = page->new_optgroup(L("Advanced"), L"param_advanced", 15);
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope", "speed_extrusion_rate_smoothing");
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_segment_length", "speed_extrusion_rate_smoothing");
optgroup->append_single_option_line("extrusion_rate_smoothing_external_perimeter_only", "speed_extrusion_rate_smoothing");
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope", "speed_settings_extrusion_rate_smoothing");
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_segment_length", "speed_settings_extrusion_rate_smoothing");
optgroup->append_single_option_line("extrusion_rate_smoothing_external_perimeter_only", "speed_settings_extrusion_rate_smoothing");
page = add_options_page(L("Support"), "custom-gcode_support"); // ORCA: icon only visible on placeholders
optgroup = page->new_optgroup(L("Support"), L"param_support");