From c0ab4dc2f547a7427620d068f352419c89bdaceb Mon Sep 17 00:00:00 2001 From: rk0n Date: Tue, 17 May 2022 19:41:54 +0200 Subject: [PATCH 01/18] Add profile for Creality Ender 3 S1 Pro --- resources/profiles/Creality.idx | 2 ++ resources/profiles/Creality.ini | 28 ++++++++++++++++++ .../Creality/ENDER3S1PRO_thumbnail.png | Bin 0 -> 43801 bytes 3 files changed, 30 insertions(+) create mode 100644 resources/profiles/Creality/ENDER3S1PRO_thumbnail.png 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 0fa14d8a8..80ca6313e 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -59,6 +59,15 @@ 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 +[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 variants = 0.4 @@ -842,6 +851,18 @@ 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 +filament_spool_weight = 500 + # Common printer preset [printer:*common*] printer_technology = FFF @@ -992,6 +1013,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 0000000000000000000000000000000000000000..199f2edf3194306253a6f6203cd4ecf3286084ab GIT binary patch literal 43801 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 K?K(|V#Qy-IPD2j> literal 0 HcmV?d00001 From adaed9fdece421dc65a4f2b958c6e31f4ed98e08 Mon Sep 17 00:00:00 2001 From: rk0n Date: Wed, 18 May 2022 00:46:40 +0200 Subject: [PATCH 02/18] Change Alpha to Beta Badge --- .../Creality/ENDER3S1PRO_thumbnail.png | Bin 43801 -> 43931 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/profiles/Creality/ENDER3S1PRO_thumbnail.png b/resources/profiles/Creality/ENDER3S1PRO_thumbnail.png index 199f2edf3194306253a6f6203cd4ecf3286084ab..d11396b05784e53915028604ffad6d6afe8e422f 100644 GIT binary patch literal 43931 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 NfomGvtx|s){y&GM@8kdg literal 43801 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 K?K(|V#Qy-IPD2j> From f6661f4217121342c6743eb99c5fb9274bcd905a Mon Sep 17 00:00:00 2001 From: rk0n Date: Wed, 18 May 2022 00:51:02 +0200 Subject: [PATCH 03/18] Add Verbatim PLA to all Creality printers --- resources/profiles/Creality.ini | 70 ++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 80ca6313e..b537976d1 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -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,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:ENDER3S1PRO] name = Creality Ender-3 S1 Pro @@ -75,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 @@ -84,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 @@ -93,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 @@ -102,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 @@ -111,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 @@ -120,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 @@ -129,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 @@ -138,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 @@ -147,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 @@ -156,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 @@ -165,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 @@ -174,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 @@ -183,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 @@ -192,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 @@ -201,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 @@ -210,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 @@ -219,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 @@ -228,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 @@ -237,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 @@ -246,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 @@ -255,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 @@ -264,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 @@ -273,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 @@ -282,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 @@ -291,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 @@ -300,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 @@ -309,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 @@ -318,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 @@ -327,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 @@ -336,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. From 1cf75100fc34177db09a8c674e73b334f425e946 Mon Sep 17 00:00:00 2001 From: rk0n Date: Wed, 18 May 2022 00:51:19 +0200 Subject: [PATCH 04/18] Remove filament spool weight from Verbatim PLA --- resources/profiles/Creality.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index b537976d1..66a793415 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -861,7 +861,6 @@ first_layer_bed_temperature = 60 filament_cost = 22.99 filament_density = 1.24 filament_colour = #001ca8 -filament_spool_weight = 500 # Common printer preset [printer:*common*] From 4e3369bbfcdadd8c63f06f6e2d2646356fc5c3f4 Mon Sep 17 00:00:00 2001 From: MarkMan0 Date: Wed, 4 May 2022 13:19:47 +0200 Subject: [PATCH 05/18] Improve Proton X profiles, Add Proton XE-750 printer --- resources/profiles/INAT.idx | 3 +- resources/profiles/INAT.ini | 375 +++++++++++++++--- .../profiles/INAT/PROTON_XE750_thumbnail.png | Bin 0 -> 36819 bytes 3 files changed, 320 insertions(+), 58 deletions(-) create mode 100644 resources/profiles/INAT/PROTON_XE750_thumbnail.png diff --git a/resources/profiles/INAT.idx b/resources/profiles/INAT.idx index a756b34b5..6087bae62 100644 --- a/resources/profiles/INAT.idx +++ b/resources/profiles/INAT.idx @@ -1,4 +1,5 @@ -min_slic3r_version = 2.3.1-beta +min_slic3r_version = 2.4.1 +0.0.4 Improve Proton X profiles, Add Proton XE-750 printer 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 0000000000000000000000000000000000000000..114247ade2a5a7628fc1ffda97ea9a2bb4510cb7 GIT binary patch literal 36819 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 literal 0 HcmV?d00001 From cf16dafad943b6869cc93ffa4b8c7440b6b21a09 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 1 Jun 2022 15:39:07 +0200 Subject: [PATCH 06/18] Fix PlaterWorker not calling yield from main thread Also fix UIThreadWorker not setting busy cursor --- src/slic3r/GUI/Jobs/PlaterWorker.hpp | 12 +++++++----- src/slic3r/GUI/Jobs/UIThreadWorker.hpp | 10 +++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/Jobs/PlaterWorker.hpp b/src/slic3r/GUI/Jobs/PlaterWorker.hpp index 58bd1ec32..0fef3655e 100644 --- a/src/slic3r/GUI/Jobs/PlaterWorker.hpp +++ b/src/slic3r/GUI/Jobs/PlaterWorker.hpp @@ -38,22 +38,24 @@ 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(); + // in it's own thread, this will be one additional + // evaluation of the event loop which should have no visible + // effects. + call_on_main_thread([] { wxYieldIfNeeded(); }); } bool was_canceled() const override { return ctl.was_canceled(); } std::future call_on_main_thread(std::function 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 call_on_main_thread(std::function fn) override { - return std::async(std::launch::deferred, [fn]{ fn(); }); + std::future 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: From ae377bd28cb7ff0fd267de106dc2a0516a090c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Mon, 23 May 2022 12:41:23 +0200 Subject: [PATCH 07/18] Fixed assert in Lightning infill (merging empty BoundingBoxes). --- src/libslic3r/Fill/Lightning/Generator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp index e226fbbab..5e2838e46 100644 --- a/src/libslic3r/Fill/Lightning/Generator.cpp +++ b/src/libslic3r/Fill/Lightning/Generator.cpp @@ -125,7 +125,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); From e967d10788191f57058122f80eac64d6d234ebbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Tue, 24 May 2022 14:07:37 +0200 Subject: [PATCH 08/18] Added anchors for the Lightning infill to better connect the infill and perimeters. --- src/libslic3r/Fill/FillLightning.cpp | 23 +++++++++++-------- src/libslic3r/Fill/FillLightning.hpp | 9 ++++++-- .../Fill/Lightning/DistanceField.hpp | 2 +- src/libslic3r/Fill/Lightning/Generator.cpp | 9 ++------ src/libslic3r/Fill/Lightning/Layer.cpp | 5 ++-- src/libslic3r/Fill/Lightning/Layer.hpp | 2 +- src/libslic3r/Fill/Lightning/TreeNode.cpp | 10 ++++---- src/libslic3r/Fill/Lightning/TreeNode.hpp | 10 ++++---- 8 files changed, 37 insertions(+), 33 deletions(-) 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 -#include -#include -#include namespace Slic3r::FillLightning { -Polylines Filler::fill_surface(const Surface *surface, const FillParams ¶ms) +void Filler::_fill_surface_single( + const FillParams ¶ms, + unsigned int thickness_layers, + const std::pair &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(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 ¶ms) override; + + void _fill_surface_single(const FillParams ¶ms, + unsigned int thickness_layers, + const std::pair &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 5e2838e46..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 &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 &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 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: 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)...) {} + explicit EnableMakeShared(Arg&&...arg) : Node(std::forward(arg)...) {} }; return std::make_shared(std::forward(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& last_grounding_location = std::nullopt); + explicit Node(const Point& p, const std::optional& 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; From a47446574eb3f831907248dc841eb6f7684bbdb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Mon, 30 May 2022 15:13:42 +0200 Subject: [PATCH 09/18] Sets locales before any thread start participating in the GCode processing pipeline. Locales should be set once per any participating threads in tbb::parallel_pipeline. It should fix the issue with appearing comma instead of the decimal point in generated Gcode. --- src/libslic3r/GCode.cpp | 36 ++++++++++++++++++++++++++++++++++ src/libslic3r/LocalesUtils.hpp | 19 ++++++++++++++++++ src/libslic3r/Thread.cpp | 18 +++-------------- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index aef83f21f..1f7eaba24 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -35,6 +35,8 @@ #include "SVG.hpp" #include +#include +#include // 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 = default; + + 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, tbb::ets_key_usage_type::ets_key_per_instance> m_is_locales_sets; +}; + // 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(); } }); } From 11f6c67e7c3f6c346b8720afe5087fd5ded1914c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Mon, 9 May 2022 11:42:14 +0200 Subject: [PATCH 10/18] Added detection for corrupted PrusaSlicer.ini and fixed showing instructions on how to recover from it (#8217). Previously when PrusaSlicer.ini was just partly corrupted, it could happen that PrusaSlicer.ini wasn't detected as corrupted, and it could cause that instruction on how to recover from this state wasn't shown, and PrusaSlicer crashed because wrong data from PrusaSlicer.ini was read. --- src/libslic3r/AppConfig.cpp | 49 +++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 16 deletions(-) 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) From 345ee7cf28442980009ed790edc44c7bf40e7a11 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 2 Jun 2022 10:55:59 +0200 Subject: [PATCH 11/18] Let's not call yield in PlaterWorker Not worth the risk, needs further investigation --- src/slic3r/GUI/Jobs/PlaterWorker.hpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Jobs/PlaterWorker.hpp b/src/slic3r/GUI/Jobs/PlaterWorker.hpp index 0fef3655e..37b18b3b8 100644 --- a/src/slic3r/GUI/Jobs/PlaterWorker.hpp +++ b/src/slic3r/GUI/Jobs/PlaterWorker.hpp @@ -39,13 +39,7 @@ class PlaterWorker: public Worker { void update_status(int st, const std::string &msg = "") override { 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, this will be one additional - // evaluation of the event loop which should have no visible - // effects. - call_on_main_thread([] { wxYieldIfNeeded(); }); + wxWakeUpIdle(); } bool was_canceled() const override { return ctl.was_canceled(); } From 6bdaf0eaec949e1f50556c83d9e19fe94302a528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Thu, 2 Jun 2022 11:51:43 +0200 Subject: [PATCH 12/18] Follow-up of a47446574eb3f831907248dc841eb6f7684bbdb3 - Disable tbb::task_scheduler_observer in TBBLocalesSetter destructor. The base class wasn't disabling observing when tbb::task_scheduler_observer was destructed, which leads to undefined behavior. --- src/libslic3r/GCode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1f7eaba24..58951ffa5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1501,7 +1501,7 @@ class TBBLocalesSetter : public tbb::task_scheduler_observer { public: TBBLocalesSetter() { this->observe(true); } - ~TBBLocalesSetter() override = default; + ~TBBLocalesSetter() override { this->observe(false); }; void on_scheduler_entry(bool is_worker) override { @@ -1513,7 +1513,7 @@ public: } private: - tbb::enumerable_thread_specific, tbb::ets_key_usage_type::ets_key_per_instance> m_is_locales_sets; + tbb::enumerable_thread_specific, 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: From df552a92268e4a853c550935761740271da0675c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Thu, 2 Jun 2022 13:45:06 +0200 Subject: [PATCH 13/18] Fixed an undefined symbol when mold linker was used for linking slic3rutils_tests. --- tests/slic3rutils/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 () From f9fb7f947d12ed76ce00a4a8bedb6d14cd056aa0 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 2 Jun 2022 17:44:51 +0200 Subject: [PATCH 14/18] Revamped A* algorithm with extended test suite --- src/libslic3r/AStar.hpp | 169 +++++++++------- tests/libslic3r/test_astar.cpp | 352 ++++++++++++++++++++++++++++++++- 2 files changed, 450 insertions(+), 71 deletions(-) diff --git a/src/libslic3r/AStar.hpp b/src/libslic3r/AStar.hpp index 052d0e814..b3c8b9c5f 100644 --- a/src/libslic3r/AStar.hpp +++ b/src/libslic3r/AStar.hpp @@ -1,11 +1,11 @@ #ifndef ASTAR_HPP #define ASTAR_HPP +#include + #include "libslic3r/Point.hpp" #include "libslic3r/MutablePriorityQueue.hpp" -#include - namespace Slic3r { namespace astar { // Input interface for the Astar algorithm. Specialize this struct for a @@ -34,6 +34,8 @@ template 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); @@ -81,100 +83,133 @@ size_t unique_id(const T &tracer, const TracerNodeT &n) } // namespace astar_detail +constexpr size_t UNASSIGNED = size_t(-1); + +template +struct QNode // Queue node. Keeps track of scores g, and h +{ + TracerNodeT 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 n = {}, + size_t p = UNASSIGNED, + float gval = std::numeric_limits::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 -bool search_route(const Tracer &tracer, const TracerNodeT &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>> +bool search_route(const Tracer &tracer, + const TracerNodeT &source, + It out, + NodeMap &&cached_nodes = {}) { using namespace detail; - using Node = TracerNodeT; - enum class QueueType { Open, Closed, None }; + using Node = TracerNodeT; + using QNode = QNode; - 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; - - // The traversed nodes are stored here encapsulated in QNodes - QMap cached_nodes; - - 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, size_t){}, - LessPred{cached_nodes}); + auto qopen = make_mutable_priority_queue( + [&cached_nodes](size_t el, size_t qidx) { + cached_nodes[el].queue_id = qidx; + }, + LessPred{cached_nodes}); - auto qclosed = - make_mutable_priority_queue([](size_t, size_t){}, - LessPred{cached_nodes}); + QNode initial{source, /*parent = */ UNASSIGNED, /*g = */0.f}; + size_t source_id = unique_id(tracer, source); + cached_nodes[source_id] = initial; + qopen.push(source_id); - QNode initial{source, QueueType::Open}; - cached_nodes.insert({unique_id(tracer, source), initial}); - qopen.push(unique_id(tracer, source)); + size_t goal_id = goal_heuristic(tracer, source) < 0.f ? source_id : + UNASSIGNED; - bool goal_reached = false; - - 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]; - foreach_reachable(tracer, q.node, [&](const Node &nd) { - if (goal_reached) return goal_reached; + // This should absolutely be initialized in the cache already + assert(!std::isinf(q.g)); + + foreach_reachable(tracer, q.node, [&](const Node &succ_nd) { + if (goal_id != UNASSIGNED) + return true; + + float h = goal_heuristic(tracer, succ_nd); + float dst = trace_distance(tracer, q.node, succ_nd); + size_t succ_id = 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 == UNASSIGNED) + // 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 - *out = q.node; - ++out; } - return goal_reached; + // 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 (!std::isinf(q->g) && q->parent != UNASSIGNED) { + *out = q->node; + ++out; + q = &cached_nodes[q->parent]; + } + + if (std::isinf(q->g)) // Something went wrong + goal_id = UNASSIGNED; + } + + return goal_id != UNASSIGNED; } }} // namespace Slic3r::astar diff --git a/tests/libslic3r/test_astar.cpp b/tests/libslic3r/test_astar.cpp index f673ad9fe..6c0f7ab42 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) const {} + }; + + std::vector 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 &grid; size_t final; - PointGridTracer(const PointGrid &g, size_t goal) : + PointGridTracer3D(const PointGrid &g, size_t goal) : grid{g}, final{goal} {} template @@ -49,14 +79,328 @@ struct PointGridTracer { size_t unique_id(size_t n) const { return n; } }; +template> +bool has_duplicates(const std::vector &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{{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 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, Rows> &grid; + Vec2i goal; + + CellGridTracer2D_AllDirs(const std::array, Rows> &g, + const Vec2i &goal_) + : grid{g}, goal{goal_} + {} + + template + 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, Rows> &grid; + Vec2i goal; + + CellGridTracer2D_Axis( + const std::array, Rows> &g, + const Vec2i &goal_) + : grid{g}, goal{goal_} + {} + + template + 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, 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 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, 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 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, 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 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; + + 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 edges; + + ENode(size_t node_id, std::initializer_list 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 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::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 fn) const + { + if (n < nodes.size()) { + for (const Edge &e : nodes[n].edges) + fn(e.to_id); + } + } + } graph; + + std::vector 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 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); + } } From d9ed45be56e2ef5b9836817e98ef7c074e0568b9 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 3 Jun 2022 10:08:11 +0200 Subject: [PATCH 15/18] Apply remarks from code review with additional cosmethics --- src/libslic3r/AStar.hpp | 40 +++++++++++++++++----------------- tests/libslic3r/test_astar.cpp | 8 +++---- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/libslic3r/AStar.hpp b/src/libslic3r/AStar.hpp index b3c8b9c5f..4a652a107 100644 --- a/src/libslic3r/AStar.hpp +++ b/src/libslic3r/AStar.hpp @@ -1,6 +1,7 @@ #ifndef ASTAR_HPP #define ASTAR_HPP +#include // std::isinf() is here #include #include "libslic3r/Point.hpp" @@ -83,23 +84,23 @@ size_t unique_id(const T &tracer, const TracerNodeT &n) } // namespace astar_detail -constexpr size_t UNASSIGNED = size_t(-1); +constexpr size_t Unassigned = size_t(-1); template struct QNode // Queue node. Keeps track of scores g, and h { - TracerNodeT 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 + TracerNodeT 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 g, h; float f() const { return g + h; } - QNode(TracerNodeT n = {}, - size_t p = UNASSIGNED, + QNode(TracerNodeT n = {}, + size_t p = Unassigned, float gval = std::numeric_limits::infinity(), float hval = 0.f) - : node{std::move(n)}, parent{p}, queue_id{UNASSIGNED}, g{gval}, h{hval} + : node{std::move(n)}, parent{p}, queue_id{Unassigned}, g{gval}, h{hval} {} }; @@ -143,15 +144,15 @@ bool search_route(const Tracer &tracer, }, LessPred{cached_nodes}); - QNode initial{source, /*parent = */ UNASSIGNED, /*g = */0.f}; + QNode initial{source, /*parent = */ Unassigned, /*g = */0.f}; size_t source_id = unique_id(tracer, source); cached_nodes[source_id] = initial; qopen.push(source_id); size_t goal_id = goal_heuristic(tracer, source) < 0.f ? source_id : - UNASSIGNED; + Unassigned; - while (goal_id == UNASSIGNED && !qopen.empty()) { + while (goal_id == Unassigned && !qopen.empty()) { size_t q_id = qopen.top(); qopen.pop(); QNode &q = cached_nodes[q_id]; @@ -160,7 +161,7 @@ bool search_route(const Tracer &tracer, assert(!std::isinf(q.g)); foreach_reachable(tracer, q.node, [&](const Node &succ_nd) { - if (goal_id != UNASSIGNED) + if (goal_id != Unassigned) return true; float h = goal_heuristic(tracer, succ_nd); @@ -184,7 +185,7 @@ bool search_route(const Tracer &tracer, // The cache needs to be updated either way prev_nd = qsucc_nd; - if (queue_id == UNASSIGNED) + if (queue_id == decltype(qopen)::invalid_id()) // was in closed or unqueued, rescheduling qopen.push(succ_id); else // was in open, updating @@ -192,24 +193,23 @@ bool search_route(const Tracer &tracer, } } - return goal_id != UNASSIGNED; + return goal_id != Unassigned; }); } // Write the output, do not reverse. Clients can do so if they need to. - if (goal_id != UNASSIGNED) { + if (goal_id != Unassigned) { const QNode *q = &cached_nodes[goal_id]; - while (!std::isinf(q->g) && q->parent != UNASSIGNED) { + while (q->parent != Unassigned) { + assert(!std::isinf(q->g)); // Uninitialized nodes are NOT allowed + *out = q->node; ++out; q = &cached_nodes[q->parent]; } - - if (std::isinf(q->g)) // Something went wrong - goal_id = UNASSIGNED; } - return goal_id != UNASSIGNED; + return goal_id != Unassigned; } }} // namespace Slic3r::astar diff --git a/tests/libslic3r/test_astar.cpp b/tests/libslic3r/test_astar.cpp index 6c0f7ab42..867f5be47 100644 --- a/tests/libslic3r/test_astar.cpp +++ b/tests/libslic3r/test_astar.cpp @@ -384,11 +384,11 @@ TEST_CASE("Zero heuristic function should result in dijsktra's algo", "[AStar]") REQUIRE(out.empty()); // Source node should have it's parent unset - REQUIRE(graph.nodes[0].parent == astar::UNASSIGNED); + 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); + REQUIRE(graph.nodes[i].parent != astar::Unassigned); std::array ref_distances = {0.f, 4.f, 12.f, 19.f, 21.f, 11.f, 9.f, 8.f, 14.f}; @@ -398,9 +398,9 @@ TEST_CASE("Zero heuristic function should result in dijsktra's algo", "[AStar]") 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) + while (k++ < graph.nodes.size() && q->parent != astar::Unassigned) q = &graph.nodes[q->parent]; - REQUIRE(q->parent == astar::UNASSIGNED); + REQUIRE(q->parent == astar::Unassigned); } } From 1d3c8ac5b4eec299786e3b4bb87ff03593d32d69 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 3 Jun 2022 10:17:05 +0200 Subject: [PATCH 16/18] Further refactor Reduce code size for astar --- src/libslic3r/AStar.hpp | 53 +++++++++-------------------------------- 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/src/libslic3r/AStar.hpp b/src/libslic3r/AStar.hpp index 4a652a107..61c82157b 100644 --- a/src/libslic3r/AStar.hpp +++ b/src/libslic3r/AStar.hpp @@ -53,37 +53,6 @@ template struct TracerTraits_ template using TracerNodeT = typename TracerTraits_>::Node; -namespace detail { -// Helper functions dispatching calls through the TracerTraits_ interface - -template using TracerTraits = TracerTraits_>; - -template -void foreach_reachable(const T &tracer, const TracerNodeT &from, Fn &&fn) -{ - TracerTraits::foreach_reachable(tracer, from, fn); -} - -template -float trace_distance(const T &tracer, const TracerNodeT &a, const TracerNodeT &b) -{ - return TracerTraits::distance(tracer, a, b); -} - -template -float goal_heuristic(const T &tracer, const TracerNodeT &n) -{ - return TracerTraits::goal_heuristic(tracer, n); -} - -template -size_t unique_id(const T &tracer, const TracerNodeT &n) -{ - return TracerTraits::unique_id(tracer, n); -} - -} // namespace astar_detail - constexpr size_t Unassigned = size_t(-1); template @@ -126,10 +95,9 @@ bool search_route(const Tracer &tracer, It out, NodeMap &&cached_nodes = {}) { - using namespace detail; - - using Node = TracerNodeT; - using QNode = QNode; + using Node = TracerNodeT; + using QNode = QNode; + using TracerTraits = TracerTraits_>; struct LessPred { // Comparison functor needed by the priority queue NodeMap &m; @@ -145,12 +113,13 @@ bool search_route(const Tracer &tracer, LessPred{cached_nodes}); QNode initial{source, /*parent = */ Unassigned, /*g = */0.f}; - size_t source_id = unique_id(tracer, source); + size_t source_id = TracerTraits::unique_id(tracer, source); cached_nodes[source_id] = initial; qopen.push(source_id); - size_t goal_id = goal_heuristic(tracer, source) < 0.f ? source_id : - Unassigned; + size_t goal_id = TracerTraits::goal_heuristic(tracer, source) < 0.f ? + source_id : + Unassigned; while (goal_id == Unassigned && !qopen.empty()) { size_t q_id = qopen.top(); @@ -160,13 +129,13 @@ bool search_route(const Tracer &tracer, // This should absolutely be initialized in the cache already assert(!std::isinf(q.g)); - foreach_reachable(tracer, q.node, [&](const Node &succ_nd) { + TracerTraits::foreach_reachable(tracer, q.node, [&](const Node &succ_nd) { if (goal_id != Unassigned) return true; - float h = goal_heuristic(tracer, succ_nd); - float dst = trace_distance(tracer, q.node, succ_nd); - size_t succ_id = unique_id(tracer, succ_nd); + 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}; if (h < 0.f) { From 689b274fd3b47fb2365848b54960a182961a8ce4 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 3 Jun 2022 14:57:07 +0200 Subject: [PATCH 17/18] updated bundle version to 0.1.5 --- resources/profiles/Creality.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index d57a885ba..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% From 0b617e2cf6b7fb5aa3f4c8e0098f0dfa509bb8b6 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:00:48 +0200 Subject: [PATCH 18/18] Fixed min_slic3r_version --- resources/profiles/INAT.idx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/profiles/INAT.idx b/resources/profiles/INAT.idx index 6087bae62..0446399a1 100644 --- a/resources/profiles/INAT.idx +++ b/resources/profiles/INAT.idx @@ -1,5 +1,6 @@ -min_slic3r_version = 2.4.1 +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