Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenricoturri1966 <enricoturri@seznam.cz>2022-06-06 15:57:09 +0300
committerenricoturri1966 <enricoturri@seznam.cz>2022-06-06 15:57:09 +0300
commit904e3a874eb8369d9bac2d575febcc19e3a7a1d9 (patch)
tree4b9461693f547ea4f634cfd4e7531f9df114055c
parentc99e93c3578f0ccb92a9de2a546a56a88662129e (diff)
parent0b617e2cf6b7fb5aa3f4c8e0098f0dfa509bb8b6 (diff)
Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer into et_trafo_matrix_rebaseet_trafo_matrix_rebase
-rw-r--r--resources/profiles/Creality.idx2
-rw-r--r--resources/profiles/Creality.ini99
-rw-r--r--resources/profiles/Creality/ENDER3S1PRO_thumbnail.pngbin0 -> 43931 bytes
-rw-r--r--resources/profiles/INAT.idx4
-rw-r--r--resources/profiles/INAT.ini375
-rw-r--r--resources/profiles/INAT/PROTON_XE750_thumbnail.pngbin0 -> 36819 bytes
-rw-r--r--src/libslic3r/AStar.hpp194
-rw-r--r--src/libslic3r/AppConfig.cpp49
-rw-r--r--src/libslic3r/Fill/FillLightning.cpp23
-rw-r--r--src/libslic3r/Fill/FillLightning.hpp9
-rw-r--r--src/libslic3r/Fill/Lightning/DistanceField.hpp2
-rw-r--r--src/libslic3r/Fill/Lightning/Generator.cpp12
-rw-r--r--src/libslic3r/Fill/Lightning/Layer.cpp5
-rw-r--r--src/libslic3r/Fill/Lightning/Layer.hpp2
-rw-r--r--src/libslic3r/Fill/Lightning/TreeNode.cpp10
-rw-r--r--src/libslic3r/Fill/Lightning/TreeNode.hpp10
-rw-r--r--src/libslic3r/GCode.cpp36
-rw-r--r--src/libslic3r/LocalesUtils.hpp19
-rw-r--r--src/libslic3r/Thread.cpp18
-rw-r--r--src/slic3r/GUI/Jobs/PlaterWorker.hpp12
-rw-r--r--src/slic3r/GUI/Jobs/UIThreadWorker.hpp10
-rw-r--r--tests/libslic3r/test_astar.cpp352
-rw-r--r--tests/slic3rutils/CMakeLists.txt3
23 files changed, 978 insertions, 268 deletions
diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx
index 1ff148aad..8f7dd0e8c 100644
--- a/resources/profiles/Creality.idx
+++ b/resources/profiles/Creality.idx
@@ -1,3 +1,5 @@
+min_slic3r_version = 2.5.0-alpha0
+0.1.5 Added Ender-3 S1 Pro
min_slic3r_version = 2.4.1
0.1.4 Added Ender-3 Pro. Added M25 support for some printers.
min_slic3r_version = 2.4.0-rc
diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini
index 84ec0f37a..ce39cd6d6 100644
--- a/resources/profiles/Creality.ini
+++ b/resources/profiles/Creality.ini
@@ -5,7 +5,7 @@
name = Creality
# Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the PrusaSlicer configuration to be downgraded.
-config_version = 0.1.4
+config_version = 0.1.5
# Where to get the updates from?
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/
# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
@@ -21,7 +21,7 @@ technology = FFF
family = ENDER
bed_model = ender3_bed.stl
bed_texture = ender3.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER3BLTOUCH]
name = Creality Ender-3 BLTouch
@@ -30,7 +30,7 @@ technology = FFF
family = ENDER
bed_model = ender3_bed.stl
bed_texture = ender3.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER3PRO]
name = Creality Ender-3 Pro
@@ -39,7 +39,7 @@ technology = FFF
family = ENDER
bed_model = ender3_bed.stl
bed_texture = ender3.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER3V2]
name = Creality Ender-3 V2
@@ -48,7 +48,7 @@ technology = FFF
family = ENDER
bed_model = ender3v2_bed.stl
bed_texture = ender3v2.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER3S1]
name = Creality Ender-3 S1
@@ -57,7 +57,16 @@ technology = FFF
family = ENDER
bed_model = ender3v2_bed.stl
bed_texture = ender3v2.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
+
+[printer_model:ENDER3S1PRO]
+name = Creality Ender-3 S1 Pro
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender3v2_bed.stl
+bed_texture = ender3v2.svg
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER3MAX]
name = Creality Ender-3 Max
@@ -66,7 +75,7 @@ technology = FFF
family = ENDER
bed_model = cr10v2_bed.stl
bed_texture = cr10spro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER4]
name = Creality Ender-4
@@ -75,7 +84,7 @@ technology = FFF
family = ENDER
bed_model = ender3v2_bed.stl
bed_texture = ender3v2.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER5]
name = Creality Ender-5
@@ -84,7 +93,7 @@ technology = FFF
family = ENDER
bed_model = ender3_bed.stl
bed_texture = ender3.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER5PLUS]
name = Creality Ender-5 Plus
@@ -93,7 +102,7 @@ technology = FFF
family = ENDER
bed_model = ender5plus_bed.stl
bed_texture = ender5plus.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER6]
name = Creality Ender-6
@@ -102,7 +111,7 @@ technology = FFF
family = ENDER
bed_model = ender6_bed.stl
bed_texture = ender6.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER7]
name = Creality Ender-7
@@ -111,7 +120,7 @@ technology = FFF
family = ENDER
bed_model = ender7_bed.stl
bed_texture = ender7.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER2]
name = Creality Ender-2
@@ -120,7 +129,7 @@ technology = FFF
family = ENDER
bed_model = ender2_bed.stl
bed_texture = ender2.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER2PRO]
name = Creality Ender-2 Pro
@@ -129,7 +138,7 @@ technology = FFF
family = ENDER
bed_model = ender2pro_bed.stl
bed_texture = ender2pro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR5PRO]
name = Creality CR-5 Pro
@@ -138,7 +147,7 @@ technology = FFF
family = CR
bed_model = cr5pro_bed.stl
bed_texture = cr5pro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR5PROH]
name = Creality CR-5 Pro H
@@ -147,7 +156,7 @@ technology = FFF
family = CR
bed_model = cr5pro_bed.stl
bed_texture = cr5pro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR6SE]
name = Creality CR-6 SE
@@ -156,7 +165,7 @@ technology = FFF
family = CR
bed_model = cr6se_bed.stl
bed_texture = cr6se.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR6MAX]
name = Creality CR-6 Max
@@ -165,7 +174,7 @@ technology = FFF
family = CR
bed_model = cr10s4_bed.stl
bed_texture = cr10s4.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10SMART]
name = Creality CR-10 SMART
@@ -174,7 +183,7 @@ technology = FFF
family = CR
bed_model = cr10v2_bed.stl
bed_texture = cr10spro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10MINI]
name = Creality CR-10 Mini
@@ -183,7 +192,7 @@ technology = FFF
family = CR
bed_model = cr10mini_bed.stl
bed_texture = cr10mini.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10MAX]
name = Creality CR-10 Max
@@ -192,7 +201,7 @@ technology = FFF
family = CR
bed_model = cr10max_bed.stl
bed_texture = cr10max.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10]
name = Creality CR-10
@@ -201,7 +210,7 @@ technology = FFF
family = CR
bed_model = cr10_bed.stl
bed_texture = cr10.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10V2]
name = Creality CR-10 V2
@@ -210,7 +219,7 @@ technology = FFF
family = CR
bed_model = cr10v2_bed.stl
bed_texture = cr10.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10V3]
name = Creality CR-10 V3
@@ -219,7 +228,7 @@ technology = FFF
family = CR
bed_model = cr10v2_bed.stl
bed_texture = cr10.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10S]
name = Creality CR-10 S
@@ -228,7 +237,7 @@ technology = FFF
family = CR
bed_model = cr10_bed.stl
bed_texture = cr10.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10SPRO]
name = Creality CR-10 S Pro
@@ -237,7 +246,7 @@ technology = FFF
family = CR
bed_model = cr10v2_bed.stl
bed_texture = cr10spro.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10SPROV2]
name = Creality CR-10 S Pro V2
@@ -246,7 +255,7 @@ technology = FFF
family = CR
bed_model = cr10v2_bed.stl
bed_texture = cr10.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10S4]
name = Creality CR-10 S4
@@ -255,7 +264,7 @@ technology = FFF
family = CR
bed_model = cr10s4_bed.stl
bed_texture = cr10s4.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR10S5]
name = Creality CR-10 S5
@@ -264,7 +273,7 @@ technology = FFF
family = CR
bed_model = cr10s5_bed.stl
bed_texture = cr10s5.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR20]
name = Creality CR-20
@@ -273,7 +282,7 @@ technology = FFF
family = CR
bed_model = ender3_bed.stl
bed_texture = cr20.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR20PRO]
name = Creality CR-20 Pro
@@ -282,7 +291,7 @@ technology = FFF
family = CR
bed_model = ender3_bed.stl
bed_texture = cr20.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR200B]
name = Creality CR-200B
@@ -291,7 +300,7 @@ technology = FFF
family = CR
bed_model = cr200b_bed.stl
bed_texture = cr200b.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:CR8]
name = Creality CR-8
@@ -300,7 +309,7 @@ technology = FFF
family = CR
bed_model = cr8_bed.stl
bed_texture = cr8.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
#[printer_model:CRX]
#name = Creality CR-X
@@ -309,7 +318,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @
#family = CR-X
#bed_model = cr10v2_bed.stl
#bed_texture = cr10spro.svg
-#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
#[printer_model:CRXPRO]
#name = Creality CR-X Pro
@@ -318,7 +327,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @
#family = CR-X
#bed_model = cr10v2_bed.stl
#bed_texture = cr10spro.svg
-#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:SERMOOND1]
name = Creality Sermoon-D1
@@ -327,7 +336,7 @@ technology = FFF
family = SERMOON
bed_model = sermoond1_bed.stl
bed_texture = sermoond1.svg
-default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY
+default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
# All presets starting with asterisk, for example *common*, are intermediate and they will
# not make it into the user interface.
@@ -842,6 +851,17 @@ filament_cost = 27.44
filament_density = 1.29
filament_colour = #C7F935
+[filament:Verbatim PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = Verbatim
+temperature = 205
+bed_temperature = 60
+first_layer_temperature = 210
+first_layer_bed_temperature = 60
+filament_cost = 22.99
+filament_density = 1.24
+filament_colour = #001ca8
+
# Common printer preset
[printer:*common*]
printer_technology = FFF
@@ -989,6 +1009,13 @@ max_print_height = 270
printer_model = ENDER3S1
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1
+[printer:Creality Ender-3 S1 Pro]
+inherits = *common*; *pauseprint*; *spriteextruder*
+bed_shape = 5x0,215x0,215x220,5x220
+max_print_height = 270
+printer_model = ENDER3S1PRO
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1PRO
+
[printer:Creality Ender-3 Max]
inherits = *common*; *pauseprint*
retract_length = 6
diff --git a/resources/profiles/Creality/ENDER3S1PRO_thumbnail.png b/resources/profiles/Creality/ENDER3S1PRO_thumbnail.png
new file mode 100644
index 000000000..d11396b05
--- /dev/null
+++ b/resources/profiles/Creality/ENDER3S1PRO_thumbnail.png
Binary files differ
diff --git a/resources/profiles/INAT.idx b/resources/profiles/INAT.idx
index a756b34b5..0446399a1 100644
--- a/resources/profiles/INAT.idx
+++ b/resources/profiles/INAT.idx
@@ -1,4 +1,6 @@
-min_slic3r_version = 2.3.1-beta
+min_slic3r_version = 2.5.0-alpha0
+0.0.4 Improve Proton X profiles, Add Proton XE-750 printer
+min_slic3r_version = 2.4.1
0.0.3 Set default filament profile.
0.0.2 Improved start gcode, changed filename format
0.0.1 Initial version
diff --git a/resources/profiles/INAT.ini b/resources/profiles/INAT.ini
index 3c1a753b5..0bba8c976 100644
--- a/resources/profiles/INAT.ini
+++ b/resources/profiles/INAT.ini
@@ -3,7 +3,7 @@
[vendor]
# Vendor name will be shown by the Config Wizard.
name = INAT
-config_version = 0.0.3
+config_version = 0.0.4
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/INAT/
###
@@ -24,9 +24,16 @@ technology = FFF
family = Proton
default_materials = PLA @PROTON_X
+[printer_model:PROTON_XE750]
+name = INAT Proton XE-750
+variants = 0.4
+technology = FFF
+family = Proton
+default_materials = PLA @PROTON_XE750
+
###
-### QUALITY DEFINITIONS
+### COMMON QUALITY DEFINITIONS
###
[print:*common*]
@@ -35,14 +42,15 @@ layer_height = 0.2
first_layer_height = 0.2
perimeters = 3
spiral_vase = 0
-top_solid_layers = 4
+top_solid_layers = 5
bottom_solid_layers = 3
-top_solid_min_thickness = 0.8
+top_solid_min_thickness = 1
bottom_solid_min_thickness = 0.6
extra_perimeters = 1
ensure_vertical_shell_thickness = 1
avoid_crossing_perimeters = 0
thin_walls = 0
+thick_bridges = 0
overhangs = 1
seam_position = aligned
external_perimeters_first = 0
@@ -76,7 +84,9 @@ support_material_auto = 1
support_material_threshold = 0
support_material_enforce_layers = 0
raft_layers = 0
-support_material_contact_distance = 0.2
+support_material_style = grid
+support_material_contact_distance = 0.25
+support_material_bottom_contact_distance = 0.3
support_material_pattern = rectilinear
support_material_with_sheath = 0
support_material_spacing = 5
@@ -92,8 +102,8 @@ perimeter_speed = 60
small_perimeter_speed = 75%
external_perimeter_speed = 50%
infill_speed = 80
-solid_infill_speed = 100%
-top_solid_infill_speed = 30
+solid_infill_speed = 80%
+top_solid_infill_speed = 20
support_material_speed = 80
support_material_interface_speed = 100%
bridge_speed = 60
@@ -126,7 +136,7 @@ infill_overlap = 25%
bridge_flow_ratio = 1
slice_closing_radius = 0.049
resolution = 0
-xy_size_compensation = 0
+xy_size_compensation = -0.05
elefant_foot_compensation = 0.3
clip_multipart_objects = 0
#output
@@ -138,47 +148,50 @@ gcode_label_objects = 0
output_filename_format = {input_filename_base}_{filament_type[0]}.gcode
-[print:0.2mm Standard @PROTON_X]
+[print:*common 0.2mm Standard @INAT*]
inherits = *common*
-[print:0.2mm Strong @PROTON_X]
+[print:*common 0.2mm Strong @INAT*]
inherits = *common*
fill_density = 50%
perimeters = 6
-[print:0.2mm Advanced Material @PROTON_X]
+[print:*common 0.2mm Advanced Material @INAT*]
inherits = *common*
bottom_solid_layers = 5
top_solid_layers = 6
skirts = 0
-brim_width = 30
+brim_width = 20
infill_speed = 60
support_material_speed = 60
travel_speed = 100
first_layer_speed = 20
elefant_foot_compensation = 0
-[print:0.12mm Fine @PROTON_X]
+[print:*common 0.12mm Fine @INAT*]
inherits = *common*
+layer_height = 0.12
bottom_solid_layers = 7
top_solid_layers = 7
infill_every_layers = 2
perimeter_speed = 50
infill_speed = 50
-[print:0.32mm Draft @PROTON_X]
+[print:*common 0.32mm Draft @INAT*]
inherits = *common*
+layer_height = 0.32
perimeter_speed = 80
external_perimeter_speed = 75%
infill_speed = 100
top_solid_infill_speed = 60
fill_density = 15%
+support_material_style = snug
###
-### PRINTER DEFINITIONS
+### COMMON PRINTER DEFINITIONS
###
-[printer:*common*]
+[printer:*proton_x_common*]
printer_vendor = INAT s.r.o.
default_filament_profile = "PLA @PROTON_X"
#general
@@ -206,14 +219,14 @@ machine_max_feedrate_z = 10,10
machine_max_feedrate_e = 100,100
machine_max_acceleration_x = 500,500
machine_max_acceleration_y = 500,500
-machine_max_acceleration_z = 100,100
-machine_max_acceleration_e = 2000,2000
+machine_max_acceleration_z = 200,200
+machine_max_acceleration_e = 8000,8000
machine_max_acceleration_extruding = 1000,1000
-machine_max_acceleration_retracting = 1500,1500
+machine_max_acceleration_retracting = 8000,8000
machine_max_jerk_x = 8,8
machine_max_jerk_y = 8,8
-machine_max_jerk_z = 1,1
-machine_max_jerk_e = 2.5,2.5
+machine_max_jerk_z = 3,3
+machine_max_jerk_e = 10,10
machine_min_extruding_rate = 5
#extruder 1
nozzle_diameter = 0.4
@@ -233,24 +246,65 @@ wipe = 1
retract_before_wipe = 100%
-[printer:Proton X Rail]
-inherits = *common*
-printer_model = PROTON_X_RAIL
-printer_variant = 0.4
-default_print_profile = 0.2mm Standard @PROTON_X
-gcode_flavor = marlin
-machine_max_acceleration_y = 800,800
-
-[printer:Proton X Rod]
-inherits = *common*
-printer_model = PROTON_X_ROD
-printer_variant = 0.4
-default_print_profile = 0.2mm Standard @PROTON_X
+[printer:*proton_xe750_common*]
+printer_vendor = INAT s.r.o.
+default_filament_profile = "PLA @PROTON_XE750"
+#general
+printer_technology = FFF
+bed_shape = 0x0,600x0,600x500,0x500
+max_print_height = 750
+z_offset = 0
+extruders_count = 2
gcode_flavor = marlin
+silent_mode = 0
+remaining_times = 1
+use_relative_e_distances = 0
+use_firmware_retraction = 0
+use_volumetric_e = 0
+variable_layer_height = 1
+#gcodes
+start_gcode = G28 ;Home\nG0 Z10 F1000\nG29\nG0 X0 Y0 Z30 F6000\nM84 E\nM0\nG1 Z15.0 F6000 ;Move the platform down 15mm\n
+end_gcode = M400\nM104 S0\nM140 S0\nM107\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X R5\nG0 Y300 F2000\nM84\nG4 S180\nM81 S30\n
+color_change_gcode = M600
+#limits
+machine_limits_usage = emit_to_gcode
+machine_max_feedrate_x = 200,200
+machine_max_feedrate_y = 200,200
+machine_max_feedrate_z = 10,10
+machine_max_feedrate_e = 100,100
+machine_max_acceleration_x = 1500,1500
+machine_max_acceleration_y = 1500,1500
+machine_max_acceleration_z = 500,500
+machine_max_acceleration_e = 20000,20000
+machine_max_acceleration_extruding = 2000,2000
+machine_max_acceleration_retracting = 8000,8000
+machine_max_jerk_x = 12,12
+machine_max_jerk_y = 12,12
+machine_max_jerk_z = 3,3
+machine_max_jerk_e = 20,20
+machine_min_extruding_rate = 5
+#extruder 1
+nozzle_diameter = 0.4,0.4
+min_layer_height = 0.05,0.05
+max_layer_height = 0.33,0.33
+extruder_offset = 0x0,0x0
+retract_length = 1.5,1.5
+retract_lift = 0.6,0.6
+retract_lift_above = 0,0
+retract_lift_below = 0,0
+retract_speed = 45,45
+deretract_speed = 0,0
+retract_restart_extra = 0,0
+retract_before_travel = 2,2
+retract_layer_change = 0,0
+wipe = 1,1
+retract_before_wipe = 100%,100%
+retract_length_toolchange = 37,37
+extruder_colour = #33CC33;#3399FF
###
-### MATERIAL DEFINITIONS
+### COMMON MATERIAL DEFINITIONS
###
[filament:*common*]
@@ -272,7 +326,7 @@ min_print_speed = 10
filament_soluble = 0
-[filament:PLA @PROTON_X]
+[filament:*common PLA @INAT*]
inherits = *common*
temperature = 210
bed_temperature = 60
@@ -281,11 +335,12 @@ first_layer_bed_temperature = 60
filament_type = PLA
filament_cost = 20
filament_density = 1.25
+fan_always_on = 1
min_fan_speed = 50
max_fan_speed = 100
-[filament:PETG @PROTON_X]
+[filament:*common PETG @INAT*]
inherits = *common*
temperature = 240
bed_temperature = 80
@@ -294,10 +349,11 @@ first_layer_bed_temperature = 80
filament_type = PETG
filament_cost = 25
filament_density = 1.27
-min_fan_speed = 0
+fan_always_on = 1
+min_fan_speed = 25
max_fan_speed = 50
-[filament:ABS @PROTON_X]
+[filament:*common ABS @INAT*]
inherits = *common*
temperature = 235
bed_temperature = 100
@@ -309,7 +365,7 @@ filament_density = 1.01
cooling = 0
bridge_fan_speed = 0
-[filament:ASA @PROTON_X]
+[filament:*common ASA @INAT*]
inherits = *common*
temperature = 240
bed_temperature = 110
@@ -320,7 +376,7 @@ filament_cost = 22
filament_density = 1.07
cooling = 0
-[filament:TPE @PROTON_X]
+[filament:*common TPE @INAT*]
inherits = *common*
temperature = 220
bed_temperature = 40
@@ -334,7 +390,7 @@ max_fan_speed = 50
filament_retract_length = 0.8
filament_retract_speed = 25
-[filament:HIPS @PROTON_X]
+[filament:*common HIPS @INAT*]
inherits = *common*
temperature = 245
bed_temperature = 100
@@ -347,7 +403,7 @@ min_fan_speed = 0
max_fan_speed = 50
filament_soluble = 1
-[filament:Nylon @PROTON_X]
+[filament:*common Nylon @INAT*]
inherits = *common*
temperature = 235
bed_temperature = 130
@@ -359,19 +415,19 @@ filament_density = 1.01
cooling = 0
bridge_fan_speed = 0
-[filament:PC @PROTON_X]
+[filament:*common PC @INAT*]
inherits = *common*
temperature = 270
-bed_temperature = 130
+bed_temperature = 115
first_layer_temperature = 270
-first_layer_bed_temperature = 130
+first_layer_bed_temperature = 115
filament_type = PC
filament_cost = 65
filament_density = 1.19
cooling = 0
bridge_fan_speed = 0
-[filament:CPE @PROTON_X]
+[filament:*common CPE @INAT*]
inherits = *common*
temperature = 280
bed_temperature = 90
@@ -383,7 +439,7 @@ filament_density = 1.27
cooling = 0
bridge_fan_speed = 0
-[filament:PEEK @PROTON_X]
+[filament:*common PEEK @INAT*]
inherits = *common*
temperature = 440
bed_temperature = 150
@@ -395,7 +451,7 @@ filament_density = 1.3
cooling = 0
bridge_fan_speed = 0
-[filament:PEI @PROTON_X]
+[filament:*common PEI @INAT*]
inherits = *common*
temperature = 400
bed_temperature = 150
@@ -407,7 +463,7 @@ filament_density = 1.27
cooling = 0
bridge_fan_speed = 0
-[filament:Polymaker PolyMide CoPA @PROTON_X]
+[filament:*common Polymaker PolyMide CoPA @INAT*]
inherits = *common*
filament_vendor = Polymaker
temperature = 265
@@ -419,7 +475,7 @@ filament_cost = 93
filament_density = 1.12
cooling = 0
-[filament:Polymaker PolyMide PA6-CF @PROTON_X]
+[filament:*common Polymaker PolyMide PA6-CF @INAT*]
inherits = *common*
filament_vendor = Polymaker
temperature = 300
@@ -431,7 +487,7 @@ filament_cost = 95
filament_density = 1.17
cooling = 0
-[filament:Polymaker PolyMide PA6-GF @PROTON_X]
+[filament:*common Polymaker PolyMide PA6-GF @INAT*]
inherits = *common*
filament_vendor = Polymaker
temperature = 300
@@ -443,20 +499,21 @@ filament_cost = 95
filament_density = 1.2
cooling = 0
-[filament:Devil Design PETG @PROTON_X]
+[filament:*common Devil Design PETG @INAT*]
inherits = *common*
filament_vendor = Devil Design
-temperature = 250
+temperature = 245
bed_temperature = 80
-first_layer_temperature = 250
+first_layer_temperature = 245
first_layer_bed_temperature = 80
filament_type = PETG
filament_cost = 22
filament_density = 1.23
-min_fan_speed = 0
+fan_always_on = 1
+min_fan_speed = 25
max_fan_speed = 50
-[filament:Filament PM PETG FRJet @PROTON_X]
+[filament:*common Filament PM PETG FRJet @INAT*]
inherits = *common*
filament_vendor = Filament PM
temperature = 250
@@ -467,3 +524,207 @@ filament_type = PETG
filament_cost = 45.5
filament_density = 1.27
cooling = 0
+
+
+######
+###### PROTON X PRINTERS
+######
+
+[printer:Proton X Rail]
+inherits = *proton_x_common*
+printer_model = PROTON_X_RAIL
+printer_variant = 0.4
+default_print_profile = 0.2mm Standard @PROTON_X
+gcode_flavor = marlin
+machine_max_acceleration_x = 800,800
+machine_max_acceleration_y = 800,800
+machine_max_jerk_x = 10,10
+machine_max_jerk_y = 10,10
+
+[printer:Proton X Rod]
+inherits = *proton_x_common*
+printer_model = PROTON_X_ROD
+printer_variant = 0.4
+default_print_profile = 0.2mm Standard @PROTON_X
+gcode_flavor = marlin
+
+[print:0.2mm Standard @PROTON_X]
+inherits = *common 0.2mm Standard @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[print:0.2mm Strong @PROTON_X]
+inherits = *common 0.2mm Strong @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[print:0.2mm Advanced Material @PROTON_X]
+inherits = *common 0.2mm Advanced Material @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[print:0.12mm Fine @PROTON_X]
+inherits = *common 0.12mm Fine @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[print:0.32mm Draft @PROTON_X]
+inherits = *common 0.32mm Draft @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+
+
+[filament:PLA @PROTON_X]
+inherits =*common PLA @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:PETG @PROTON_X]
+inherits =*common PETG @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:ABS @PROTON_X]
+inherits =*common ABS @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:ASA @PROTON_X]
+inherits =*common ASA @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:TPE @PROTON_X]
+inherits =*common TPE @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:HIPS @PROTON_X]
+inherits =*common HIPS @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Nylon @PROTON_X]
+inherits =*common Nylon @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:PC @PROTON_X]
+inherits =*common PC @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:CPE @PROTON_X]
+inherits =*common CPE @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:PEEK @PROTON_X]
+inherits =*common PEEK @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:PEI @PROTON_X]
+inherits =*common PEI @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Polymaker PolyMide CoPA @PROTON_X]
+inherits =*common Polymaker PolyMide CoPA @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Polymaker PolyMide PA6-CF @PROTON_X]
+inherits =*common Polymaker PolyMide PA6-CF @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Polymaker PolyMide PA6-GF @PROTON_X]
+inherits =*common Polymaker PolyMide PA6-GF @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Devil Design PETG @PROTON_X]
+inherits =*common Devil Design PETG @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+[filament:Filament PM PETG FRJet @PROTON_X]
+inherits =*common Filament PM PETG FRJet @INAT*
+compatible_printers = "Proton X Rail";"Proton X Rod"
+
+
+
+
+######### #########
+######### Proton XE 750 #########
+######### #########
+
+[printer:Proton XE-750]
+inherits = *proton_xe750_common*
+printer_model = PROTON_XE750
+printer_variant = 0.4
+default_print_profile = 0.2mm Standard @PROTON_XE750
+gcode_flavor = marlin
+
+
+[print:0.2mm Standard @PROTON_XE750]
+inherits = *common 0.2mm Standard @INAT*
+compatible_printers = "Proton XE-750"
+
+[print:0.2mm Strong @PROTON_XE750]
+inherits = *common 0.2mm Strong @INAT*
+compatible_printers = "Proton XE-750"
+
+[print:0.2mm Advanced Material @PROTON_XE750]
+inherits = *common 0.2mm Advanced Material @INAT*
+compatible_printers = "Proton XE-750"
+
+[print:0.12mm Fine @PROTON_XE750]
+inherits = *common 0.12mm Fine @INAT*
+compatible_printers = "Proton XE-750"
+
+[print:0.32mm Draft @PROTON_XE750]
+inherits = *common 0.32mm Draft @INAT*
+compatible_printers = "Proton XE-750"
+
+
+
+
+
+
+[filament:*start_end_gcode @PROTON_XE750*]
+start_filament_gcode = "; Filament start gcode BEGIN\nM104 S[temperature[current_extruder]]\nG4 S20\n; Filament start gcode END\n"
+end_filament_gcode = "; Filament end gcode BEGIN\nG0 X-5 Y250 F10000\nM104 S{temperature[current_extruder] - 50}\n; Filament end gcode END\n"
+compatible_printers = "Proton XE-750"
+
+
+
+[filament:PLA @PROTON_XE750]
+inherits =*common PLA @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:PETG @PROTON_XE750]
+inherits =*common PETG @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:ABS @PROTON_XE750]
+inherits =*common ABS @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:ASA @PROTON_XE750]
+inherits =*common ASA @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:TPE @PROTON_XE750]
+inherits =*common TPE @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:HIPS @PROTON_XE750]
+inherits =*common HIPS @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Nylon @PROTON_XE750]
+inherits =*common Nylon @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:PC @PROTON_XE750]
+inherits =*common PC @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:CPE @PROTON_XE750]
+inherits =*common CPE @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:PEEK @PROTON_XE750]
+inherits =*common PEEK @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:PEI @PROTON_XE750]
+inherits =*common PEI @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Polymaker PolyMide CoPA @PROTON_XE750]
+inherits =*common Polymaker PolyMide CoPA @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Polymaker PolyMide PA6-CF @PROTON_XE750]
+inherits =*common Polymaker PolyMide PA6-CF @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Polymaker PolyMide PA6-GF @PROTON_XE750]
+inherits =*common Polymaker PolyMide PA6-GF @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Devil Design PETG @PROTON_XE750]
+inherits =*common Devil Design PETG @INAT*; *start_end_gcode @PROTON_XE750*
+
+[filament:Filament PM PETG FRJet @PROTON_XE750]
+inherits =*common Filament PM PETG FRJet @INAT*; *start_end_gcode @PROTON_XE750*
diff --git a/resources/profiles/INAT/PROTON_XE750_thumbnail.png b/resources/profiles/INAT/PROTON_XE750_thumbnail.png
new file mode 100644
index 000000000..114247ade
--- /dev/null
+++ b/resources/profiles/INAT/PROTON_XE750_thumbnail.png
Binary files differ
diff --git a/src/libslic3r/AStar.hpp b/src/libslic3r/AStar.hpp
index 052d0e814..61c82157b 100644
--- a/src/libslic3r/AStar.hpp
+++ b/src/libslic3r/AStar.hpp
@@ -1,11 +1,12 @@
#ifndef ASTAR_HPP
#define ASTAR_HPP
+#include <cmath> // std::isinf() is here
+#include <unordered_map>
+
#include "libslic3r/Point.hpp"
#include "libslic3r/MutablePriorityQueue.hpp"
-#include <unordered_map>
-
namespace Slic3r { namespace astar {
// Input interface for the Astar algorithm. Specialize this struct for a
@@ -34,6 +35,8 @@ template<class T> struct TracerTraits_
// Get the estimated distance heuristic from node 'n' to the destination.
// This is referred to as the h value in AStar context.
// If node 'n' is the goal, this function should return a negative value.
+ // Note that this heuristic should be admissible (never bigger than the real
+ // cost) in order for Astar to work.
static float goal_heuristic(const T &tracer, const Node &n)
{
return tracer.goal_heuristic(n);
@@ -50,131 +53,132 @@ template<class T> struct TracerTraits_
template<class T>
using TracerNodeT = typename TracerTraits_<remove_cvref_t<T>>::Node;
-namespace detail {
-// Helper functions dispatching calls through the TracerTraits_ interface
-
-template<class T> using TracerTraits = TracerTraits_<remove_cvref_t<T>>;
-
-template<class T, class Fn>
-void foreach_reachable(const T &tracer, const TracerNodeT<T> &from, Fn &&fn)
-{
- TracerTraits<T>::foreach_reachable(tracer, from, fn);
-}
-
-template<class T>
-float trace_distance(const T &tracer, const TracerNodeT<T> &a, const TracerNodeT<T> &b)
-{
- return TracerTraits<T>::distance(tracer, a, b);
-}
+constexpr size_t Unassigned = size_t(-1);
-template<class T>
-float goal_heuristic(const T &tracer, const TracerNodeT<T> &n)
+template<class Tracer>
+struct QNode // Queue node. Keeps track of scores g, and h
{
- return TracerTraits<T>::goal_heuristic(tracer, n);
-}
-
-template<class T>
-size_t unique_id(const T &tracer, const TracerNodeT<T> &n)
-{
- return TracerTraits<T>::unique_id(tracer, n);
-}
-
-} // namespace astar_detail
+ TracerNodeT<Tracer> node; // The actual node itself
+ size_t queue_id; // Position in the open queue or Unassigned if closed
+ size_t parent; // unique id of the parent or Unassigned
+
+ float g, h;
+ float f() const { return g + h; }
+
+ QNode(TracerNodeT<Tracer> n = {},
+ size_t p = Unassigned,
+ float gval = std::numeric_limits<float>::infinity(),
+ float hval = 0.f)
+ : node{std::move(n)}, parent{p}, queue_id{Unassigned}, g{gval}, h{hval}
+ {}
+};
// Run the AStar algorithm on a tracer implementation.
// The 'tracer' argument encapsulates the domain (grid, point cloud, etc...)
// The 'source' argument is the starting node.
// The 'out' argument is the output iterator into which the output nodes are
-// written.
-// Note that no destination node is given. The tracer's goal_heuristic() method
-// should return a negative value if a node is a destination node.
-template<class Tracer, class It>
-bool search_route(const Tracer &tracer, const TracerNodeT<Tracer> &source, It out)
+// written. For performance reasons, the order is reverse, from the destination
+// to the source -- (destination included, source is not).
+// The 'cached_nodes' argument is an optional associative container to hold a
+// QNode entry for each visited node. Any compatible container can be used
+// (like std::map or maps with different allocators, even a sufficiently large
+// std::vector).
+//
+// Note that no destination node is given in the signature. The tracer's
+// goal_heuristic() method should return a negative value if a node is a
+// destination node.
+template<class Tracer,
+ class It,
+ class NodeMap = std::unordered_map<size_t, QNode<Tracer>>>
+bool search_route(const Tracer &tracer,
+ const TracerNodeT<Tracer> &source,
+ It out,
+ NodeMap &&cached_nodes = {})
{
- using namespace detail;
-
- using Node = TracerNodeT<Tracer>;
- enum class QueueType { Open, Closed, None };
-
- struct QNode // Queue node. Keeps track of scores g, and h
- {
- Node node; // The actual node itself
- QueueType qtype = QueueType::None; // Which queue holds this node
-
- float g = 0.f, h = 0.f;
- float f() const { return g + h; }
- };
-
- // TODO: apply a linear memory allocator
- using QMap = std::unordered_map<size_t, QNode>;
-
- // The traversed nodes are stored here encapsulated in QNodes
- QMap cached_nodes;
+ using Node = TracerNodeT<Tracer>;
+ using QNode = QNode<Tracer>;
+ using TracerTraits = TracerTraits_<remove_cvref_t<Tracer>>;
- struct LessPred { // Comparison functor needed by MutablePriorityQueue
- QMap &m;
+ struct LessPred { // Comparison functor needed by the priority queue
+ NodeMap &m;
bool operator ()(size_t node_a, size_t node_b) {
- auto ait = m.find(node_a);
- auto bit = m.find(node_b);
- assert (ait != m.end() && bit != m.end());
-
- return ait->second.f() < bit->second.f();
+ return m[node_a].f() < m[node_b].f();
}
};
- auto qopen =
- make_mutable_priority_queue<size_t, false>([](size_t, size_t){},
- LessPred{cached_nodes});
-
- auto qclosed =
- make_mutable_priority_queue<size_t, false>([](size_t, size_t){},
- LessPred{cached_nodes});
+ auto qopen = make_mutable_priority_queue<size_t, true>(
+ [&cached_nodes](size_t el, size_t qidx) {
+ cached_nodes[el].queue_id = qidx;
+ },
+ LessPred{cached_nodes});
- QNode initial{source, QueueType::Open};
- cached_nodes.insert({unique_id(tracer, source), initial});
- qopen.push(unique_id(tracer, source));
+ QNode initial{source, /*parent = */ Unassigned, /*g = */0.f};
+ size_t source_id = TracerTraits::unique_id(tracer, source);
+ cached_nodes[source_id] = initial;
+ qopen.push(source_id);
- bool goal_reached = false;
+ size_t goal_id = TracerTraits::goal_heuristic(tracer, source) < 0.f ?
+ source_id :
+ Unassigned;
- while (!goal_reached && !qopen.empty()) {
+ while (goal_id == Unassigned && !qopen.empty()) {
size_t q_id = qopen.top();
qopen.pop();
- QNode q = cached_nodes.at(q_id);
+ QNode &q = cached_nodes[q_id];
+
+ // This should absolutely be initialized in the cache already
+ assert(!std::isinf(q.g));
+
+ TracerTraits::foreach_reachable(tracer, q.node, [&](const Node &succ_nd) {
+ if (goal_id != Unassigned)
+ return true;
- foreach_reachable(tracer, q.node, [&](const Node &nd) {
- if (goal_reached) return goal_reached;
+ float h = TracerTraits::goal_heuristic(tracer, succ_nd);
+ float dst = TracerTraits::distance(tracer, q.node, succ_nd);
+ size_t succ_id = TracerTraits::unique_id(tracer, succ_nd);
+ QNode qsucc_nd{succ_nd, q_id, q.g + dst, h};
- float h = goal_heuristic(tracer, nd);
if (h < 0.f) {
- goal_reached = true;
+ goal_id = succ_id;
+ cached_nodes[succ_id] = qsucc_nd;
} else {
- float dst = trace_distance(tracer, q.node, nd);
- QNode qnd{nd, QueueType::None, q.g + dst, h};
- size_t qnd_id = unique_id(tracer, nd);
+ // If succ_id is not in cache, it gets created with g = infinity
+ QNode &prev_nd = cached_nodes[succ_id];
- auto it = cached_nodes.find(qnd_id);
+ if (qsucc_nd.g < prev_nd.g) {
+ // new route is better, apply it:
- if (it == cached_nodes.end() ||
- (it->second.qtype != QueueType::None && qnd.f() < it->second.f())) {
- qnd.qtype = QueueType::Open;
- cached_nodes.insert_or_assign(qnd_id, qnd);
- qopen.push(qnd_id);
+ // Save the old queue id, it would be lost after the next line
+ size_t queue_id = prev_nd.queue_id;
+
+ // The cache needs to be updated either way
+ prev_nd = qsucc_nd;
+
+ if (queue_id == decltype(qopen)::invalid_id())
+ // was in closed or unqueued, rescheduling
+ qopen.push(succ_id);
+ else // was in open, updating
+ qopen.update(queue_id);
}
}
- return goal_reached;
+ return goal_id != Unassigned;
});
+ }
- q.qtype = QueueType::Closed;
- cached_nodes.insert_or_assign(q_id, q);
- qclosed.push(q_id);
+ // Write the output, do not reverse. Clients can do so if they need to.
+ if (goal_id != Unassigned) {
+ const QNode *q = &cached_nodes[goal_id];
+ while (q->parent != Unassigned) {
+ assert(!std::isinf(q->g)); // Uninitialized nodes are NOT allowed
- // write the output
- *out = q.node;
- ++out;
+ *out = q->node;
+ ++out;
+ q = &cached_nodes[q->parent];
+ }
}
- return goal_reached;
+ return goal_id != Unassigned;
}
}} // namespace Slic3r::astar
diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index 928febffd..82c0a72a6 100644
--- a/src/libslic3r/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -230,8 +230,13 @@ static std::string appconfig_md5_hash_line(const std::string_view data)
return "# MD5 checksum " + md5_digest_str + "\n";
};
+struct ConfigFileInfo {
+ bool correct_checksum {false};
+ bool contains_null {false};
+};
+
// Assume that the last line with the comment inside the config file contains a checksum and that the user didn't modify the config file.
-static bool verify_config_file_checksum(boost::nowide::ifstream &ifs)
+static ConfigFileInfo check_config_file_and_verify_checksum(boost::nowide::ifstream &ifs)
{
auto read_whole_config_file = [&ifs]() -> std::string {
std::stringstream ss;
@@ -240,7 +245,8 @@ static bool verify_config_file_checksum(boost::nowide::ifstream &ifs)
};
ifs.seekg(0, boost::nowide::ifstream::beg);
- std::string whole_config = read_whole_config_file();
+ const std::string whole_config = read_whole_config_file();
+ const bool contains_null = whole_config.find_first_of('\0') != std::string::npos;
// The checksum should be on the last line in the config file.
if (size_t last_comment_pos = whole_config.find_last_of('#'); last_comment_pos != std::string::npos) {
@@ -249,9 +255,9 @@ static bool verify_config_file_checksum(boost::nowide::ifstream &ifs)
// When the checksum isn't found, the checksum was not saved correctly, it was removed or it is an older config file without the checksum.
// If the checksum is incorrect, then the file was either not saved correctly or modified.
if (std::string_view(whole_config.c_str() + last_comment_pos, whole_config.size() - last_comment_pos) == appconfig_md5_hash_line({ whole_config.data(), last_comment_pos }))
- return true;
+ return {true, contains_null};
}
- return false;
+ return {false, contains_null};
}
#endif
@@ -269,14 +275,25 @@ std::string AppConfig::load(const std::string &path)
ifs.open(path);
#ifdef WIN32
// Verify the checksum of the config file without taking just for debugging purpose.
- if (!verify_config_file_checksum(ifs))
- BOOST_LOG_TRIVIAL(info) << "The configuration file " << path <<
- " has a wrong MD5 checksum or the checksum is missing. This may indicate a file corruption or a harmless user edit.";
+ const ConfigFileInfo config_file_info = check_config_file_and_verify_checksum(ifs);
+ if (!config_file_info.correct_checksum)
+ BOOST_LOG_TRIVIAL(info)
+ << "The configuration file " << path
+ << " has a wrong MD5 checksum or the checksum is missing. This may indicate a file corruption or a harmless user edit.";
+
+ if (!config_file_info.correct_checksum && config_file_info.contains_null) {
+ BOOST_LOG_TRIVIAL(info) << "The configuration file " + path + " is corrupted, because it is contains null characters.";
+ throw Slic3r::CriticalException("The configuration file contains null characters.");
+ }
ifs.seekg(0, boost::nowide::ifstream::beg);
#endif
- pt::read_ini(ifs, tree);
- } catch (pt::ptree_error& ex) {
+ try {
+ pt::read_ini(ifs, tree);
+ } catch (pt::ptree_error &ex) {
+ throw Slic3r::CriticalException(ex.what());
+ }
+ } catch (Slic3r::CriticalException &ex) {
#ifdef WIN32
// The configuration file is corrupted, try replacing it with the backup configuration.
ifs.close();
@@ -284,29 +301,29 @@ std::string AppConfig::load(const std::string &path)
if (boost::filesystem::exists(backup_path)) {
// Compute checksum of the configuration backup file and try to load configuration from it when the checksum is correct.
boost::nowide::ifstream backup_ifs(backup_path);
- if (!verify_config_file_checksum(backup_ifs)) {
- BOOST_LOG_TRIVIAL(error) << format("Both \"%1%\" and \"%2%\" are corrupted. It isn't possible to restore configuration from the backup.", path, backup_path);
+ if (const ConfigFileInfo config_file_info = check_config_file_and_verify_checksum(backup_ifs); !config_file_info.correct_checksum || config_file_info.contains_null) {
+ BOOST_LOG_TRIVIAL(error) << format(R"(Both "%1%" and "%2%" are corrupted. It isn't possible to restore configuration from the backup.)", path, backup_path);
backup_ifs.close();
boost::filesystem::remove(backup_path);
} else if (std::string error_message; copy_file(backup_path, path, error_message, false) != SUCCESS) {
- BOOST_LOG_TRIVIAL(error) << format("Configuration file \"%1%\" is corrupted. Failed to restore from backup \"%2%\": %3%", path, backup_path, error_message);
+ BOOST_LOG_TRIVIAL(error) << format(R"(Configuration file "%1%" is corrupted. Failed to restore from backup "%2%": %3%)", path, backup_path, error_message);
backup_ifs.close();
boost::filesystem::remove(backup_path);
} else {
- BOOST_LOG_TRIVIAL(info) << format("Configuration file \"%1%\" was corrupted. It has been succesfully restored from the backup \"%2%\".", path, backup_path);
+ BOOST_LOG_TRIVIAL(info) << format(R"(Configuration file "%1%" was corrupted. It has been successfully restored from the backup "%2%".)", path, backup_path);
// Try parse configuration file after restore from backup.
try {
ifs.open(path);
pt::read_ini(ifs, tree);
recovered = true;
} catch (pt::ptree_error& ex) {
- BOOST_LOG_TRIVIAL(info) << format("Failed to parse configuration file \"%1%\" after it has been restored from backup: %2%", path, ex.what());
+ BOOST_LOG_TRIVIAL(info) << format(R"(Failed to parse configuration file "%1%" after it has been restored from backup: %2%)", path, ex.what());
}
}
} else
#endif // WIN32
- BOOST_LOG_TRIVIAL(info) << format("Failed to parse configuration file \"%1%\": %2%", path, ex.what());
- if (! recovered) {
+ BOOST_LOG_TRIVIAL(info) << format(R"(Failed to parse configuration file "%1%": %2%)", path, ex.what());
+ if (!recovered) {
// Report the initial error of parsing PrusaSlicer.ini.
// Error while parsing config file. We'll customize the error message and rethrow to be displayed.
// ! But to avoid the use of _utf8 (related to use of wxWidgets)
diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp
index 2ba6fe017..dd2189e6b 100644
--- a/src/libslic3r/Fill/FillLightning.cpp
+++ b/src/libslic3r/Fill/FillLightning.cpp
@@ -1,20 +1,25 @@
#include "../Print.hpp"
+#include "../ShortestPath.hpp"
#include "FillLightning.hpp"
#include "Lightning/Generator.hpp"
-#include "../Surface.hpp"
-
-#include <cstdlib>
-#include <cmath>
-#include <algorithm>
-#include <numeric>
namespace Slic3r::FillLightning {
-Polylines Filler::fill_surface(const Surface *surface, const FillParams &params)
+void Filler::_fill_surface_single(
+ const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out)
{
- const Layer &layer = generator->getTreesForLayer(this->layer_id);
- return layer.convertToLines(to_polygons(surface->expolygon), generator->infilll_extrusion_width());
+ 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));
+
+ if (params.dont_connect() || fill_lines.size() <= 1) {
+ append(polylines_out, chain_polylines(std::move(fill_lines)));
+ } else
+ connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params);
}
void GeneratorDeleter::operator()(Generator *p) {
diff --git a/src/libslic3r/Fill/FillLightning.hpp b/src/libslic3r/Fill/FillLightning.hpp
index 941392103..6e672783a 100644
--- a/src/libslic3r/Fill/FillLightning.hpp
+++ b/src/libslic3r/Fill/FillLightning.hpp
@@ -24,8 +24,13 @@ public:
Generator *generator { nullptr };
protected:
Fill* clone() const override { return new Filler(*this); }
- // Perform the fill.
- Polylines fill_surface(const Surface *surface, const FillParams &params) override;
+
+ void _fill_surface_single(const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
+
// Let the G-code export reoder the infill lines.
bool no_sort() const override { return false; }
};
diff --git a/src/libslic3r/Fill/Lightning/DistanceField.hpp b/src/libslic3r/Fill/Lightning/DistanceField.hpp
index d4a142c05..1a47ee6ca 100644
--- a/src/libslic3r/Fill/Lightning/DistanceField.hpp
+++ b/src/libslic3r/Fill/Lightning/DistanceField.hpp
@@ -176,7 +176,7 @@ protected:
const Point offset_loc = loc - m_grid_range.min;
const size_t flat_idx = m_grid_size.x() * offset_loc.y() + offset_loc.x();
assert(offset_loc.x() >= 0 && offset_loc.y() >= 0);
- assert(flat_idx < m_grid_size.y() * m_grid_size.x());
+ assert(flat_idx < size_t(m_grid_size.y() * m_grid_size.x()));
return flat_idx;
}
};
diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp
index e226fbbab..4aba7202d 100644
--- a/src/libslic3r/Fill/Lightning/Generator.cpp
+++ b/src/libslic3r/Fill/Lightning/Generator.cpp
@@ -7,7 +7,6 @@
#include "../../ClipperUtils.hpp"
#include "../../Layer.hpp"
#include "../../Print.hpp"
-#include "../../Surface.hpp"
/* Possible future tasks/optimizations,etc.:
* - Improve connecting heuristic to favor connecting to shorter trees
@@ -54,8 +53,6 @@ Generator::Generator(const PrintObject &print_object, const std::function<void()
void Generator::generateInitialInternalOverhangs(const PrintObject &print_object, const std::function<void()> &throw_on_cancel_callback)
{
m_overhang_per_layer.resize(print_object.layers().size());
- // FIXME: It can be adjusted to improve bonding between infill and perimeters.
- const float infill_wall_offset = 0;// m_infill_extrusion_width;
Polygons infill_area_above;
//Iterate from top to bottom, to subtract the overhang areas above from the overhang areas on the layer below, to get only overhang in the top layer where it is overhanging.
@@ -65,7 +62,7 @@ void Generator::generateInitialInternalOverhangs(const PrintObject &print_object
for (const LayerRegion* layerm : print_object.get_layer(layer_nr)->regions())
for (const Surface& surface : layerm->fill_surfaces.surfaces)
if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid)
- append(infill_area_here, infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
+ infill_area_here.emplace_back(surface.expolygon);
//Remove the part of the infill area that is already supported by the walls.
Polygons overhang = diff(offset(infill_area_here, -float(m_wall_supporting_radius)), infill_area_above);
@@ -84,8 +81,6 @@ const Layer& Generator::getTreesForLayer(const size_t& layer_id) const
void Generator::generateTrees(const PrintObject &print_object, const std::function<void()> &throw_on_cancel_callback)
{
m_lightning_layers.resize(print_object.layers().size());
- // FIXME: It can be adjusted to improve bonding between infill and perimeters.
- const coord_t infill_wall_offset = 0;// m_infill_extrusion_width;
std::vector<Polygons> infill_outlines(print_object.layers().size(), Polygons());
@@ -95,7 +90,7 @@ void Generator::generateTrees(const PrintObject &print_object, const std::functi
for (const LayerRegion *layerm : print_object.get_layer(layer_id)->regions())
for (const Surface &surface : layerm->fill_surfaces.surfaces)
if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid)
- append(infill_outlines[layer_id], infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
+ infill_outlines[layer_id].emplace_back(surface.expolygon);
}
// For various operations its beneficial to quickly locate nearby features on the polygon:
@@ -125,7 +120,8 @@ void Generator::generateTrees(const PrintObject &print_object, const std::functi
if (const BoundingBox &outlines_locator_bbox = outlines_locator.bbox(); outlines_locator_bbox.defined)
below_outlines_bbox.merge(outlines_locator_bbox);
- below_outlines_bbox.merge(get_extents(current_lightning_layer.tree_roots).inflated(SCALED_EPSILON));
+ if (!current_lightning_layer.tree_roots.empty())
+ below_outlines_bbox.merge(get_extents(current_lightning_layer.tree_roots).inflated(SCALED_EPSILON));
outlines_locator.set_bbox(below_outlines_bbox);
outlines_locator.create(below_outlines, locator_cell_size);
diff --git a/src/libslic3r/Fill/Lightning/Layer.cpp b/src/libslic3r/Fill/Lightning/Layer.cpp
index 0bd2a65c4..354623e51 100644
--- a/src/libslic3r/Fill/Lightning/Layer.cpp
+++ b/src/libslic3r/Fill/Lightning/Layer.cpp
@@ -433,15 +433,14 @@ static unsigned int moveInside(const Polygons& polygons, Point& from, int distan
}
#endif
-// Returns 'added someting'.
-Polylines Layer::convertToLines(const Polygons& limit_to_outline, const coord_t line_width) const
+Polylines Layer::convertToLines(const Polygons& limit_to_outline, const coord_t line_overlap) const
{
if (tree_roots.empty())
return {};
Polylines result_lines;
for (const auto &tree : tree_roots)
- tree->convertToPolylines(result_lines, line_width);
+ tree->convertToPolylines(result_lines, line_overlap);
return intersection_pl(result_lines, limit_to_outline);
}
diff --git a/src/libslic3r/Fill/Lightning/Layer.hpp b/src/libslic3r/Fill/Lightning/Layer.hpp
index 87431fb1c..e8c0a38b4 100644
--- a/src/libslic3r/Fill/Lightning/Layer.hpp
+++ b/src/libslic3r/Fill/Lightning/Layer.hpp
@@ -80,7 +80,7 @@ public:
coord_t wall_supporting_radius
);
- Polylines convertToLines(const Polygons& limit_to_outline, coord_t line_width) const;
+ Polylines convertToLines(const Polygons& limit_to_outline, coord_t line_overlap) const;
coord_t getWeightedDistance(const Point& boundary_loc, const Point& unsupported_location);
diff --git a/src/libslic3r/Fill/Lightning/TreeNode.cpp b/src/libslic3r/Fill/Lightning/TreeNode.cpp
index 9ef509611..982d47b10 100644
--- a/src/libslic3r/Fill/Lightning/TreeNode.cpp
+++ b/src/libslic3r/Fill/Lightning/TreeNode.cpp
@@ -347,12 +347,12 @@ coord_t Node::prune(const coord_t& pruning_distance)
return max_distance_pruned;
}
-void Node::convertToPolylines(Polylines &output, const coord_t line_width) const
+void Node::convertToPolylines(Polylines &output, const coord_t line_overlap) const
{
Polylines result;
result.emplace_back();
convertToPolylines(0, result);
- removeJunctionOverlap(result, line_width);
+ removeJunctionOverlap(result, line_overlap);
append(output, std::move(result));
}
@@ -376,10 +376,10 @@ void Node::convertToPolylines(size_t long_line_idx, Polylines &output) const
}
}
-void Node::removeJunctionOverlap(Polylines &result_lines, const coord_t line_width) const
+void Node::removeJunctionOverlap(Polylines &result_lines, const coord_t line_overlap) const
{
- const coord_t reduction = line_width / 2; // TODO make configurable?
- size_t res_line_idx = 0;
+ const coord_t reduction = line_overlap;
+ size_t res_line_idx = 0;
while (res_line_idx < result_lines.size()) {
Polyline &polyline = result_lines[res_line_idx];
if (polyline.size() <= 1) {
diff --git a/src/libslic3r/Fill/Lightning/TreeNode.hpp b/src/libslic3r/Fill/Lightning/TreeNode.hpp
index 81c63f7f6..8791b4331 100644
--- a/src/libslic3r/Fill/Lightning/TreeNode.hpp
+++ b/src/libslic3r/Fill/Lightning/TreeNode.hpp
@@ -46,7 +46,7 @@ public:
{
struct EnableMakeShared : public Node
{
- EnableMakeShared(Arg&&...arg) : Node(std::forward<Arg>(arg)...) {}
+ explicit EnableMakeShared(Arg&&...arg) : Node(std::forward<Arg>(arg)...) {}
};
return std::make_shared<EnableMakeShared>(std::forward<Arg>(arg)...);
}
@@ -179,16 +179,16 @@ public:
*/
bool hasOffspring(const NodeSPtr& to_be_checked) const;
-protected:
Node() = delete; // Don't allow empty contruction
+protected:
/*!
* Construct a new node, either for insertion in a tree or as root.
* \param p The physical location in the 2D layer that this node represents.
* Connecting other nodes to this node indicates that a line segment should
* be drawn between those two physical positions.
*/
- Node(const Point& p, const std::optional<Point>& last_grounding_location = std::nullopt);
+ explicit Node(const Point& p, const std::optional<Point>& last_grounding_location = std::nullopt);
/*!
* Copy this node and its entire sub-tree.
@@ -239,7 +239,7 @@ public:
*
* \param output all branches in this tree connected into polylines
*/
- void convertToPolylines(Polylines &output, coord_t line_width) const;
+ void convertToPolylines(Polylines &output, coord_t line_overlap) const;
/*! If this was ever a direct child of the root, it'll have a previous grounding location.
*
@@ -260,7 +260,7 @@ protected:
*/
void convertToPolylines(size_t long_line_idx, Polylines &output) const;
- void removeJunctionOverlap(Polylines &polylines, coord_t line_width) const;
+ void removeJunctionOverlap(Polylines &polylines, coord_t line_overlap) const;
bool m_is_root;
Point m_p;
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index aef83f21f..58951ffa5 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -35,6 +35,8 @@
#include "SVG.hpp"
#include <tbb/parallel_for.h>
+#include <tbb/task_scheduler_observer.h>
+#include <tbb/enumerable_thread_specific.h>
// Intel redesigned some TBB interface considerably when merging TBB with their oneAPI set of libraries, see GH #7332.
// We are using quite an old TBB 2017 U7. Before we update our build servers, let's use the old API, which is deprecated in up to date TBB.
@@ -1488,6 +1490,32 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
print.throw_if_canceled();
}
+// For unknown reasons and in sporadic cases when GCode export is processing, some participating thread
+// in tbb::parallel_pipeline has not set locales to "C", probably because this thread is newly spawned.
+// So in this class method on_scheduler_entry is called for every thread before it starts participating
+// in tbb::parallel_pipeline to ensure that locales are set correctly
+
+// For tbb::parallel_pipeline, it seems that on_scheduler_entry is called for every layer and every filter.
+// We ensure using thread-local storage that locales will be set to "C" just once for any participating thread.
+class TBBLocalesSetter : public tbb::task_scheduler_observer
+{
+public:
+ TBBLocalesSetter() { this->observe(true); }
+ ~TBBLocalesSetter() override { this->observe(false); };
+
+ void on_scheduler_entry(bool is_worker) override
+ {
+ if (bool &is_locales_sets = m_is_locales_sets.local(); !is_locales_sets) {
+ // Set locales of the worker thread to "C".
+ set_c_locales();
+ is_locales_sets = true;
+ }
+ }
+
+private:
+ tbb::enumerable_thread_specific<bool, tbb::cache_aligned_allocator<bool>, tbb::ets_key_usage_type::ets_key_per_instance> m_is_locales_sets{false};
+};
+
// Process all layers of all objects (non-sequential mode) with a parallel pipeline:
// Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser
// and export G-code into file.
@@ -1531,6 +1559,10 @@ void GCode::process_layers(
[&output_stream](std::string s) { output_stream.write(s); }
);
+ // It registers a handler that sets locales to "C" before any TBB thread starts participating in tbb::parallel_pipeline.
+ // Handler is unregistered when the destructor is called.
+ TBBLocalesSetter locales_setter;
+
// The pipeline elements are joined using const references, thus no copying is performed.
output_stream.find_replace_supress();
if (m_spiral_vase && m_find_replace)
@@ -1584,6 +1616,10 @@ void GCode::process_layers(
[&output_stream](std::string s) { output_stream.write(s); }
);
+ // It registers a handler that sets locales to "C" before any TBB thread starts participating in tbb::parallel_pipeline.
+ // Handler is unregistered when the destructor is called.
+ TBBLocalesSetter locales_setter;
+
// The pipeline elements are joined using const references, thus no copying is performed.
output_stream.find_replace_supress();
if (m_spiral_vase && m_find_replace)
diff --git a/src/libslic3r/LocalesUtils.hpp b/src/libslic3r/LocalesUtils.hpp
index f63c3572f..ce8030ceb 100644
--- a/src/libslic3r/LocalesUtils.hpp
+++ b/src/libslic3r/LocalesUtils.hpp
@@ -43,6 +43,25 @@ std::string float_to_string_decimal_point(double value, int precision = -1);
//std::string float_to_string_decimal_point(float value, int precision = -1);
double string_to_double_decimal_point(const std::string_view str, size_t* pos = nullptr);
+// Set locales to "C".
+inline void set_c_locales()
+{
+#ifdef _WIN32
+ _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
+ std::setlocale(LC_ALL, "C");
+#else
+ // We are leaking some memory here, because the newlocale() produced memory will never be released.
+ // This is not a problem though, as there will be a maximum one worker thread created per physical thread.
+ uselocale(newlocale(
+#ifdef __APPLE__
+ LC_ALL_MASK
+#else // some Unix / Linux / BSD
+ LC_ALL
+#endif
+ , "C", nullptr));
+#endif
+}
+
} // namespace Slic3r
#endif // slic3r_LocalesUtils_hpp_
diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp
index 4e7bd073a..c099f8de6 100644
--- a/src/libslic3r/Thread.cpp
+++ b/src/libslic3r/Thread.cpp
@@ -15,6 +15,7 @@
#include "Thread.hpp"
#include "Utils.hpp"
+#include "LocalesUtils.hpp"
namespace Slic3r {
@@ -234,21 +235,8 @@ void name_tbb_thread_pool_threads_set_locale()
std::ostringstream name;
name << "slic3r_tbb_" << range.begin();
set_current_thread_name(name.str().c_str());
- // Set locales of the worker thread to "C".
-#ifdef _WIN32
- _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
- std::setlocale(LC_ALL, "C");
-#else
- // We are leaking some memory here, because the newlocale() produced memory will never be released.
- // This is not a problem though, as there will be a maximum one worker thread created per physical thread.
- uselocale(newlocale(
-#ifdef __APPLE__
- LC_ALL_MASK
-#else // some Unix / Linux / BSD
- LC_ALL
-#endif
- , "C", nullptr));
-#endif
+ // Set locales of the worker thread to "C".
+ set_c_locales();
}
});
}
diff --git a/src/slic3r/GUI/Jobs/PlaterWorker.hpp b/src/slic3r/GUI/Jobs/PlaterWorker.hpp
index 58bd1ec32..37b18b3b8 100644
--- a/src/slic3r/GUI/Jobs/PlaterWorker.hpp
+++ b/src/slic3r/GUI/Jobs/PlaterWorker.hpp
@@ -38,22 +38,18 @@ class PlaterWorker: public Worker {
void update_status(int st, const std::string &msg = "") override
{
- wxWakeUpIdle();
ctl.update_status(st, msg);
-
- // If the worker is not using additional threads, the UI
- // is refreshed with this call. If the worker is running
- // in it's own thread, the yield should not have any
- // visible effects.
- wxYieldIfNeeded();
+ wxWakeUpIdle();
}
bool was_canceled() const override { return ctl.was_canceled(); }
std::future<void> call_on_main_thread(std::function<void()> fn) override
{
+ auto ftr = ctl.call_on_main_thread(std::move(fn));
wxWakeUpIdle();
- return ctl.call_on_main_thread(std::move(fn));
+
+ return ftr;
}
} wctl{c};
diff --git a/src/slic3r/GUI/Jobs/UIThreadWorker.hpp b/src/slic3r/GUI/Jobs/UIThreadWorker.hpp
index 610d205cf..91213c239 100644
--- a/src/slic3r/GUI/Jobs/UIThreadWorker.hpp
+++ b/src/slic3r/GUI/Jobs/UIThreadWorker.hpp
@@ -62,7 +62,15 @@ protected:
std::future<void> call_on_main_thread(std::function<void()> fn) override
{
- return std::async(std::launch::deferred, [fn]{ fn(); });
+ std::future<void> ftr = std::async(std::launch::deferred, [fn]{ fn(); });
+
+ // So, it seems that the destructor of std::future will not call the
+ // packaged function. The future needs to be accessed at least ones
+ // or waited upon. Calling wait() instead of get() will keep the
+ // returned future's state valid.
+ ftr.wait();
+
+ return ftr;
}
public:
diff --git a/tests/libslic3r/test_astar.cpp b/tests/libslic3r/test_astar.cpp
index f673ad9fe..867f5be47 100644
--- a/tests/libslic3r/test_astar.cpp
+++ b/tests/libslic3r/test_astar.cpp
@@ -7,12 +7,42 @@
using namespace Slic3r;
-struct PointGridTracer {
+TEST_CASE("Testing basic invariants of AStar", "[AStar]") {
+ struct DummyTracer {
+ using Node = int;
+
+ int goal = 0;
+
+ float distance(int a, int b) const { return a - b; }
+
+ float goal_heuristic(int n) const { return n == goal ? -1.f : 0.f; }
+
+ size_t unique_id(int n) const { return n; }
+
+ void foreach_reachable(int, std::function<bool(int)>) const {}
+ };
+
+ std::vector<int> out;
+
+ SECTION("Output is empty when source is also the destination") {
+ bool found = astar::search_route(DummyTracer{}, 0, std::back_inserter(out));
+ REQUIRE(out.empty());
+ REQUIRE(found);
+ }
+
+ SECTION("Return false when there is no route to destination") {
+ bool found = astar::search_route(DummyTracer{}, 1, std::back_inserter(out));
+ REQUIRE(!found);
+ REQUIRE(out.empty());
+ }
+}
+
+struct PointGridTracer3D {
using Node = size_t;
const PointGrid<float> &grid;
size_t final;
- PointGridTracer(const PointGrid<float> &g, size_t goal) :
+ PointGridTracer3D(const PointGrid<float> &g, size_t goal) :
grid{g}, final{goal} {}
template<class Fn>
@@ -49,14 +79,328 @@ struct PointGridTracer {
size_t unique_id(size_t n) const { return n; }
};
+template<class Node, class Cmp = std::less<Node>>
+bool has_duplicates(const std::vector<Node> &res, Cmp cmp = {})
+{
+ auto cpy = res;
+ std::sort(cpy.begin(), cpy.end(), cmp);
+ auto it = std::unique(cpy.begin(), cpy.end());
+ return it != cpy.end();
+}
+
TEST_CASE("astar algorithm test over 3D point grid", "[AStar]") {
auto vol = BoundingBox3Base<Vec3f>{{0.f, 0.f, 0.f}, {1.f, 1.f, 1.f}};
auto pgrid = point_grid(ex_seq, vol, {0.1f, 0.1f, 0.1f});
- PointGridTracer pgt{pgrid, pgrid.point_count() - 1};
+ size_t target = pgrid.point_count() - 1;
+
+ PointGridTracer3D pgt{pgrid, target};
std::vector<size_t> out;
- bool found = astar::search_route(pgt, size_t(0), std::back_inserter(out));
+ bool found = astar::search_route(pgt, 0, std::back_inserter(out));
REQUIRE(found);
+ REQUIRE(!out.empty());
+ REQUIRE(out.front() == target);
+
+#ifndef NDEBUG
+ std::cout << "Route taken: ";
+ for (auto it = out.rbegin(); it != out.rend(); ++it) {
+ std::cout << "(" << pgrid.get_coord(*it).transpose() << ") ";
+ }
+ std::cout << std::endl;
+#endif
+
+ REQUIRE(!has_duplicates(out)); // No duplicates in output
+}
+
+enum CellValue {ON, OFF};
+
+struct CellGridTracer2D_AllDirs {
+ using Node = Vec2i;
+
+ static constexpr auto Cols = size_t(5);
+ static constexpr auto Rows = size_t(8);
+ static constexpr size_t GridSize = Cols * Rows;
+
+ const std::array<std::array<CellValue, Cols>, Rows> &grid;
+ Vec2i goal;
+
+ CellGridTracer2D_AllDirs(const std::array<std::array<CellValue, Cols>, Rows> &g,
+ const Vec2i &goal_)
+ : grid{g}, goal{goal_}
+ {}
+
+ template<class Fn>
+ void foreach_reachable(const Vec2i &src, Fn &&fn) const
+ {
+ auto is_inside = [](const Vec2i& v) { return v.x() >= 0 && v.x() < Cols && v.y() >= 0 && v.y() < Rows; };
+ if (Vec2i crd = src + Vec2i{0, 1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{1, 0}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{1, 1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{0, -1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{-1, 0}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{-1, -1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{1, -1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{-1, 1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ }
+
+ float distance(const Vec2i & a, const Vec2i & b) const { return (a - b).squaredNorm(); }
+
+ float goal_heuristic(const Vec2i & n) const { return n == goal ? -1.f : (n - goal).squaredNorm(); }
+
+ size_t unique_id(const Vec2i & n) const { return n.y() * Cols + n.x(); }
+};
+
+struct CellGridTracer2D_Axis {
+ using Node = Vec2i;
+
+ static constexpr auto Cols = size_t(5);
+ static constexpr auto Rows = size_t(8);
+ static constexpr size_t GridSize = Cols * Rows;
+
+ const std::array<std::array<CellValue, Cols>, Rows> &grid;
+ Vec2i goal;
+
+ CellGridTracer2D_Axis(
+ const std::array<std::array<CellValue, Cols>, Rows> &g,
+ const Vec2i &goal_)
+ : grid{g}, goal{goal_}
+ {}
+
+ template<class Fn>
+ void foreach_reachable(const Vec2i &src, Fn &&fn) const
+ {
+ auto is_inside = [](const Vec2i& v) { return v.x() >= 0 && v.x() < Cols && v.y() >= 0 && v.y() < Rows; };
+ if (Vec2i crd = src + Vec2i{0, 1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{0, -1}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{1, 0}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ if (Vec2i crd = src + Vec2i{-1, 0}; is_inside(crd) && grid[crd.y()] [crd.x()] == ON) fn(crd);
+ }
+
+ float distance(const Vec2i & a, const Vec2i & b) const { return (a - b).squaredNorm(); }
+
+ float goal_heuristic(const Vec2i &n) const
+ {
+ int manhattan_dst = std::abs(n.x() - goal.x()) +
+ std::abs(n.y() - goal.y());
+
+ return n == goal ? -1.f : manhattan_dst;
+ }
+
+ size_t unique_id(const Vec2i & n) const { return n.y() * Cols + n.x(); }
+};
+
+using TestClasses = std::tuple< CellGridTracer2D_AllDirs, CellGridTracer2D_Axis >;
+
+TEMPLATE_LIST_TEST_CASE("Astar should avoid simple barrier", "[AStar]", TestClasses) {
+
+ std::array<std::array<CellValue, 5>, 8> grid = {{
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , ON , ON},
+ {ON , OFF, OFF, OFF, ON},
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , ON , ON}
+ }};
+
+ Vec2i dst = {2, 0};
+ TestType cgt{grid, dst};
+
+ std::vector<Vec2i> out;
+ bool found = astar::search_route(cgt, {2, 7}, std::back_inserter(out));
+
+ REQUIRE(found);
+ REQUIRE(!out.empty());
+ REQUIRE(out.front() == dst);
+ REQUIRE(!has_duplicates(out, [](const Vec2i &a, const Vec2i &b) {
+ return a.x() == b.x() ? a.y() < b.y() : a.x() < b.x();
+ }));
+
+#ifndef NDEBUG
+ std::cout << "Route taken: ";
+ for (auto it = out.rbegin(); it != out.rend(); ++it) {
+ std::cout << "(" << it->transpose() << ") ";
+ }
+ std::cout << std::endl;
+#endif
+}
+
+TEMPLATE_LIST_TEST_CASE("Astar should manage to avoid arbitrary barriers", "[AStar]", TestClasses) {
+
+ std::array<std::array<CellValue, 5>, 8> grid = {{
+ {ON , ON , ON , ON , ON},
+ {ON , ON , ON , OFF, ON},
+ {OFF, OFF, ON , OFF, ON},
+ {ON , ON , ON , OFF, ON},
+ {ON , OFF, ON , OFF, ON},
+ {ON , OFF, ON , ON , ON},
+ {ON , OFF, ON , OFF, ON},
+ {ON , ON , ON , ON , ON}
+ }};
+
+ Vec2i dst = {0, 0};
+ TestType cgt{grid, dst};
+
+ std::vector<Vec2i> out;
+ bool found = astar::search_route(cgt, {0, 7}, std::back_inserter(out));
+
+ REQUIRE(found);
+ REQUIRE(!out.empty());
+ REQUIRE(out.front() == dst);
+ REQUIRE(!has_duplicates(out, [](const Vec2i &a, const Vec2i &b) {
+ return a.x() == b.x() ? a.y() < b.y() : a.x() < b.x();
+ }));
+
+#ifndef NDEBUG
+ std::cout << "Route taken: ";
+ for (auto it = out.rbegin(); it != out.rend(); ++it) {
+ std::cout << "(" << it->transpose() << ") ";
+ }
+ std::cout << std::endl;
+#endif
+}
+
+TEMPLATE_LIST_TEST_CASE("Astar should find the way out of a labyrinth", "[AStar]", TestClasses) {
+
+ std::array<std::array<CellValue, 5>, 8> grid = {{
+ {ON , ON , ON , ON , ON },
+ {ON , OFF, OFF, OFF, OFF},
+ {ON , ON , ON , ON , ON },
+ {OFF, OFF, OFF, OFF, ON },
+ {ON , ON , ON , ON , ON },
+ {ON , OFF, OFF, OFF, OFF},
+ {ON , ON , ON , ON , ON },
+ {OFF, OFF, OFF, OFF, ON }
+ }};
+
+ Vec2i dst = {4, 0};
+ TestType cgt{grid, dst};
+
+ std::vector<Vec2i> out;
+ bool found = astar::search_route(cgt, {4, 7}, std::back_inserter(out));
+
+ REQUIRE(found);
+ REQUIRE(!out.empty());
+ REQUIRE(out.front() == dst);
+ REQUIRE(!has_duplicates(out, [](const Vec2i &a, const Vec2i &b) {
+ return a.x() == b.x() ? a.y() < b.y() : a.x() < b.x();
+ }));
+
+#ifndef NDEBUG
+ std::cout << "Route taken: ";
+ for (auto it = out.rbegin(); it != out.rend(); ++it) {
+ std::cout << "(" << it->transpose() << ") ";
+ }
+ std::cout << std::endl;
+#endif
+}
+
+TEST_CASE("Zero heuristic function should result in dijsktra's algo", "[AStar]")
+{
+ struct GraphTracer {
+ using Node = size_t;
+ using QNode = astar::QNode<GraphTracer>;
+
+ struct Edge
+ {
+ size_t to_id = size_t(-1);
+ float cost = 0.f;
+ bool operator <(const Edge &e) const { return to_id < e.to_id; }
+ };
+
+ struct ENode: public QNode {
+ std::vector<Edge> edges;
+
+ ENode(size_t node_id, std::initializer_list<Edge> edgelist)
+ : QNode{node_id}, edges(edgelist)
+ {}
+
+ ENode &operator=(const QNode &q)
+ {
+ assert(node == q.node);
+ g = q.g;
+ h = q.h;
+ parent = q.parent;
+ queue_id = q.queue_id;
+
+ return *this;
+ }
+ };
+
+ // Example graph from
+ // https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/?ref=lbp
+ std::vector<ENode> nodes = {
+ {0, {{1, 4.f}, {7, 8.f}}},
+ {1, {{0, 4.f}, {2, 8.f}, {7, 11.f}}},
+ {2, {{1, 8.f}, {3, 7.f}, {5, 4.f}, {8, 2.f}}},
+ {3, {{2, 7.f}, {4, 9.f}, {5, 14.f}}},
+ {4, {{3, 9.f}, {5, 10.f}}},
+ {5, {{2, 4.f}, {3, 14.f}, {4, 10.f}, {6, 2.f}}},
+ {6, {{5, 2.f}, {7, 1.f}, {8, 6.f}}},
+ {7, {{0, 8.f}, {1, 11.f}, {6, 1.f}, {8, 7.f}}},
+ {8, {{2, 2.f}, {6, 6.f}, {7, 7.f}}}
+ };
+
+ float distance(size_t a, size_t b) const {
+ float ret = std::numeric_limits<float>::infinity();
+ if (a < nodes.size()) {
+ auto it = std::lower_bound(nodes[a].edges.begin(),
+ nodes[a].edges.end(),
+ Edge{b, 0.f});
+
+ if (it != nodes[a].edges.end()) {
+ ret = it->cost;
+ }
+ }
+
+ return ret;
+ }
+
+ float goal_heuristic(size_t) const { return 0.f; }
+
+ size_t unique_id(size_t n) const { return n; }
+
+ void foreach_reachable(size_t n, std::function<bool(int)> fn) const
+ {
+ if (n < nodes.size()) {
+ for (const Edge &e : nodes[n].edges)
+ fn(e.to_id);
+ }
+ }
+ } graph;
+
+ std::vector<size_t> out;
+
+ // 'graph.nodes' is able to be a node cache (it simulates an associative container)
+ bool found = astar::search_route(graph, size_t(0), std::back_inserter(out), graph.nodes);
+
+ // But should not crash or loop infinitely.
+ REQUIRE(!found);
+
+ // Without a destination, there is no output. But the algorithm should halt.
+ REQUIRE(out.empty());
+
+ // Source node should have it's parent unset
+ REQUIRE(graph.nodes[0].parent == astar::Unassigned);
+
+ // All other nodes should have their parents set
+ for (size_t i = 1; i < graph.nodes.size(); ++i)
+ REQUIRE(graph.nodes[i].parent != astar::Unassigned);
+
+ std::array<float, 9> ref_distances = {0.f, 4.f, 12.f, 19.f, 21.f,
+ 11.f, 9.f, 8.f, 14.f};
+
+ // Try to trace each node back to the source node. Each of them should
+ // arrive to the source within less hops than the full number of nodes.
+ for (size_t i = 0, k = 0; i < graph.nodes.size(); ++i, k = 0) {
+ GraphTracer::QNode *q = &graph.nodes[i];
+ REQUIRE(q->g == Approx(ref_distances[i]));
+ while (k++ < graph.nodes.size() && q->parent != astar::Unassigned)
+ q = &graph.nodes[q->parent];
+
+ REQUIRE(q->parent == astar::Unassigned);
+ }
}
diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt
index 256e6efd6..e9fcf84f1 100644
--- a/tests/slic3rutils/CMakeLists.txt
+++ b/tests/slic3rutils/CMakeLists.txt
@@ -4,7 +4,8 @@ add_executable(${_TEST_NAME}_tests
slic3r_jobs_tests.cpp
)
-target_link_libraries(${_TEST_NAME}_tests test_common libslic3r_gui libslic3r)
+# mold linker for successful linking needs also to link TBB library and link it before libslic3r.
+target_link_libraries(${_TEST_NAME}_tests test_common TBB::tbb libslic3r_gui libslic3r)
if (MSVC)
target_link_libraries(${_TEST_NAME}_tests Setupapi.lib)
endif ()