From e1619e2ff193220458597c7671dee269512cf27c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 12 Apr 2021 09:15:28 +0200 Subject: [PATCH 01/57] Fixed a typo in an error message (--sw_renderer -> --sw-renderer) --- src/slic3r/GUI/OpenGLManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp index c843da4600..0b24617172 100644 --- a/src/slic3r/GUI/OpenGLManager.cpp +++ b/src/slic3r/GUI/OpenGLManager.cpp @@ -252,7 +252,7 @@ bool OpenGLManager::init_gl() message += _L("You may need to update your graphics card driver."); #ifdef _WIN32 message += "\n"; - message += _L("As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."); + message += _L("As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw-renderer parameter."); #endif wxMessageBox(message, wxString("PrusaSlicer - ") + _L("Unsupported OpenGL version"), wxOK | wxICON_ERROR); } From 41acfd36c7906eb0b88ea58bc8d5daf151133598 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:27:29 +0200 Subject: [PATCH 02/57] Bumped up version to 0.0.9 --- resources/profiles/Anycubic.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 639d5df475..44308abc89 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,7 +5,7 @@ name = Anycubic # 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.0.8 +config_version = 0.0.9 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% From 2fad684c4313eb8b84cf23289218edefcca9c633 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:28:10 +0200 Subject: [PATCH 03/57] Update Anycubic.idx --- resources/profiles/Anycubic.idx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index b57fe3e660..f3d115ca23 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.3.1 +0.0.9 Updated bed textures min_slic3r_version = 2.3.0-beta2 0.0.8 Updated start and end g-code for Anycubic Mega. 0.0.7 Updated start g-code for Anycubic Mega. From c68403ae78af72c90fd7fdddcb8c07d2f794dbaa Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:40:55 +0200 Subject: [PATCH 04/57] updated min_slic3r_version --- resources/profiles/Artillery.idx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Artillery.idx b/resources/profiles/Artillery.idx index 1fa68f82b5..b73e786a7f 100644 --- a/resources/profiles/Artillery.idx +++ b/resources/profiles/Artillery.idx @@ -1,2 +1,2 @@ -min_slic3r_version = 2.4.0-alpha0 +min_slic3r_version = 2.3.1 0.0.1 Initial Artillery bundle From 6121f1de3ba998579af8ebe0fcab0e074e08d5cd Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:42:32 +0200 Subject: [PATCH 05/57] version bumped up to 0.0.15 --- 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 6d977ade19..0b4e4cf140 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.0.14 +config_version = 0.0.15 # 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 0ecf5dc1a00325583e31711d12ae4e0b39242ef2 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:44:14 +0200 Subject: [PATCH 06/57] Creality 0.0.15 --- resources/profiles/Creality.idx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 328ae4cf33..34102212eb 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.3.1 +0.0.15 Added new printer models, filament profiles. Various improvements. min_slic3r_version = 2.3.0-rc2 0.0.14 Optimized start g-code. Added filament profile. Various improvements. 0.0.13 Optimized start and end g-code. General improvements. From 5af4167b746f119d895608164f65dce2b3345f1b Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:45:26 +0200 Subject: [PATCH 07/57] updated min_slic3r_version --- resources/profiles/INAT.idx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/INAT.idx b/resources/profiles/INAT.idx index 0d81f55a0f..ea8d97b281 100644 --- a/resources/profiles/INAT.idx +++ b/resources/profiles/INAT.idx @@ -1,3 +1,3 @@ -min_slic3r_version = 2.4.0-alpha0 +min_slic3r_version = 2.3.1 0.0.1 Initial version 0.0.2 Improved start gcode, changed filename format From 1bf56542316157703aaf59cbc6aa2ca4e449ed65 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 12 Apr 2021 12:11:46 +0200 Subject: [PATCH 08/57] Updated min_slic3r_version 2.3.1-beta --- resources/profiles/Anycubic.idx | 2 +- resources/profiles/Artillery.idx | 2 +- resources/profiles/Creality.idx | 2 +- resources/profiles/INAT.idx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index f3d115ca23..24a881f303 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,4 +1,4 @@ -min_slic3r_version = 2.3.1 +min_slic3r_version = 2.3.1-beta 0.0.9 Updated bed textures min_slic3r_version = 2.3.0-beta2 0.0.8 Updated start and end g-code for Anycubic Mega. diff --git a/resources/profiles/Artillery.idx b/resources/profiles/Artillery.idx index b73e786a7f..d1e3657728 100644 --- a/resources/profiles/Artillery.idx +++ b/resources/profiles/Artillery.idx @@ -1,2 +1,2 @@ -min_slic3r_version = 2.3.1 +min_slic3r_version = 2.3.1-beta 0.0.1 Initial Artillery bundle diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 34102212eb..2833b8afbb 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,4 @@ -min_slic3r_version = 2.3.1 +min_slic3r_version = 2.3.1-beta 0.0.15 Added new printer models, filament profiles. Various improvements. min_slic3r_version = 2.3.0-rc2 0.0.14 Optimized start g-code. Added filament profile. Various improvements. diff --git a/resources/profiles/INAT.idx b/resources/profiles/INAT.idx index ea8d97b281..47632c29a0 100644 --- a/resources/profiles/INAT.idx +++ b/resources/profiles/INAT.idx @@ -1,3 +1,3 @@ -min_slic3r_version = 2.3.1 +min_slic3r_version = 2.3.1-beta 0.0.1 Initial version 0.0.2 Improved start gcode, changed filename format From dbd1c095239a476eb0a7955b06a2cb5ac4af2738 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 12 Apr 2021 14:56:30 +0200 Subject: [PATCH 09/57] FDM snug supports: New parameter "closing radius", inspired by Cura's support_join_distance --- src/libslic3r/Config.hpp | 3 ++- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 10 ++++++++++ src/libslic3r/PrintConfig.hpp | 3 +++ src/libslic3r/PrintObject.cpp | 1 + src/libslic3r/SupportMaterial.cpp | 16 ++++++++++++---- src/slic3r/GUI/ConfigManipulation.cpp | 2 ++ src/slic3r/GUI/Tab.cpp | 1 + 8 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 80d34e8216..9aab435edd 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1967,8 +1967,9 @@ public: int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. + // Thus the virtual method getInt() is used to retrieve the enum value. template - ENUM opt_enum(const t_config_option_key &opt_key) const { return this->option>(opt_key)->value; } + ENUM opt_enum(const t_config_option_key &opt_key) const { return static_cast(this->option(opt_key)->getInt()); } bool opt_bool(const t_config_option_key &opt_key) const { return this->option(opt_key)->value != 0; } bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index d57bcb4516..7db61a20f1 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -427,7 +427,7 @@ const std::vector& Preset::print_options() "bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield", "min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", - "support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_style", + "support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_closing_radius", "support_material_style", "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", "support_material_bottom_interface_layers", "support_material_interface_pattern", "support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance", "support_material_bottom_contact_distance", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 08ab716d21..5516b298d3 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2366,6 +2366,16 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(-1)); + def = this->add("support_material_closing_radius", coFloat); + def->label = L("Closing radius"); + def->category = L("Support material"); + def->tooltip = L("For snug supports, the support regions will be merged using morphological closing operation." + " Gaps smaller than the closing radius will be filled in."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(2)); + def = this->add("support_material_interface_spacing", coFloat); def->label = L("Interface pattern spacing"); def->category = L("Support material"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 7cfd515b0a..aab5096624 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -530,6 +530,8 @@ public: ConfigOptionFloatOrPercent support_material_interface_speed; ConfigOptionEnum support_material_pattern; ConfigOptionEnum support_material_interface_pattern; + // Morphological closing of support areas. Only used for "sung" supports. + ConfigOptionFloat support_material_closing_radius; // Spacing between support material lines (the hatching distance). ConfigOptionFloat support_material_spacing; ConfigOptionFloat support_material_speed; @@ -579,6 +581,7 @@ protected: OPT_PTR(support_material_interface_extruder); OPT_PTR(support_material_interface_layers); OPT_PTR(support_material_bottom_interface_layers); + OPT_PTR(support_material_closing_radius); OPT_PTR(support_material_interface_spacing); OPT_PTR(support_material_interface_speed); OPT_PTR(support_material_pattern); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 1989b18846..cbf3e71ab7 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -591,6 +591,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_style" || opt_key == "support_material_xy_spacing" || opt_key == "support_material_spacing" + || opt_key == "support_material_closing_radius" || opt_key == "support_material_synchronize_layers" || opt_key == "support_material_threshold" || opt_key == "support_material_with_sheath" diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index a343927921..1242df1ea5 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -672,6 +672,7 @@ struct SupportGridParams { grid_resolution(object_config.support_material_spacing.value + support_material_flow.spacing()), support_angle(Geometry::deg2rad(object_config.support_material_angle.value)), extrusion_width(support_material_flow.spacing()), + support_material_closing_radius(object_config.support_material_closing_radius.value), expansion_to_slice(coord_t(support_material_flow.scaled_spacing() / 2 + 5)), expansion_to_propagate(-3) {} @@ -679,6 +680,7 @@ struct SupportGridParams { double grid_resolution; double support_angle; double extrusion_width; + double support_material_closing_radius; coord_t expansion_to_slice; coord_t expansion_to_propagate; }; @@ -694,7 +696,9 @@ public: const SupportGridParams ¶ms) : m_style(params.style), m_support_polygons(support_polygons), m_trimming_polygons(trimming_polygons), - m_support_spacing(params.grid_resolution), m_support_angle(params.support_angle) + m_support_spacing(params.grid_resolution), m_support_angle(params.support_angle), + m_extrusion_width(params.extrusion_width), + m_support_material_closing_radius(params.support_material_closing_radius) { switch (m_style) { case smsGrid: @@ -878,9 +882,10 @@ public: return out; } case smsSnug: - // Just close the gaps. - float thr = scaled(0.5); - return smooth_outward(offset(offset_ex(*m_support_polygons, thr), - thr), thr); + // Merge the support polygons by applying morphological closing and inwards smoothing. + auto closing_distance = scaled(m_support_material_closing_radius); + auto smoothing_distance = scaled(m_extrusion_width); + return smooth_outward(offset(offset_ex(*m_support_polygons, closing_distance), - closing_distance), smoothing_distance); } assert(false); return Polygons(); @@ -1128,6 +1133,9 @@ private: coordf_t m_support_angle; // X spacing of the support lines parallel with the Y axis. coordf_t m_support_spacing; + coordf_t m_extrusion_width; + // For snug supports: Morphological closing of support areas. + coordf_t m_support_material_closing_radius; #ifdef SUPPORT_USE_AGG_RASTERIZER Vec2i m_grid_size; diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 9334eea471..cd7805a880 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -278,6 +278,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) bool have_support_material_auto = have_support_material && config->opt_bool("support_material_auto"); bool have_support_interface = config->opt_int("support_material_interface_layers") > 0; bool have_support_soluble = have_support_material && config->opt_float("support_material_contact_distance") == 0; + auto support_material_style = config->opt_enum("support_material_style"); for (auto el : { "support_material_style", "support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_angle", "support_material_interface_pattern", "support_material_interface_layers", @@ -286,6 +287,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, have_support_material); toggle_field("support_material_threshold", have_support_material_auto); toggle_field("support_material_bottom_contact_distance", have_support_material && ! have_support_soluble); + toggle_field("support_material_closing_radius", have_support_material && support_material_style == smsSnug); for (auto el : { "support_material_bottom_interface_layers", "support_material_interface_spacing", "support_material_interface_extruder", "support_material_interface_speed", "support_material_interface_contact_loops" }) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index cfd36e6878..0e954a9064 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1515,6 +1515,7 @@ void TabPrint::build() optgroup->append_single_option_line("support_material_with_sheath", category_path + "with-sheath-around-the-support"); optgroup->append_single_option_line("support_material_spacing", category_path + "pattern-spacing-0-inf"); optgroup->append_single_option_line("support_material_angle", category_path + "pattern-angle"); + optgroup->append_single_option_line("support_material_closing_radius", category_path + "pattern-angle"); optgroup->append_single_option_line("support_material_interface_layers", category_path + "interface-layers"); optgroup->append_single_option_line("support_material_bottom_interface_layers", category_path + "interface-layers"); optgroup->append_single_option_line("support_material_interface_pattern", category_path + "interface-pattern"); From e8643125d8e682d03b36b34082e1a3dc693f80ba Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 13 Apr 2021 11:31:54 +0200 Subject: [PATCH 10/57] Clipper / ClipperUtils: 1) Let Clipper use int32_t for representing its coordinates. This reduces memory and allows to skip conversion between Slic3r Polygon and Clipper polygon. 2) Disable additional offset before executing the Clipper Offset algorithm. We don't see any reason for that and it required 64bit Clipper coordinates, which were disabled with 1). --- src/clipper/clipper.cpp | 52 +++++++++++++-------- src/clipper/clipper.hpp | 31 ++++++++++--- src/libslic3r/ClipperUtils.cpp | 85 ++++++++++++++++++++++++++++++++-- src/libslic3r/ClipperUtils.hpp | 26 ++++++----- src/libslic3r/Geometry.cpp | 2 + 5 files changed, 155 insertions(+), 41 deletions(-) diff --git a/src/clipper/clipper.cpp b/src/clipper/clipper.cpp index 3c0057b22b..cbe54a0647 100644 --- a/src/clipper/clipper.cpp +++ b/src/clipper/clipper.cpp @@ -287,6 +287,11 @@ bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) } //---------------------------------------------------------------------- +#ifdef CLIPPERLIB_INT32 +inline bool SlopesEqual(const cInt dx1, const cInt dy1, const cInt dx2, const cInt dy2, bool /* UseFullInt64Range */) { + return int64_t(dy1) * int64_t(dx2) == int64_t(dx1) * int64_t(dy2); +} +#else inline bool SlopesEqual(const cInt dx1, const cInt dy1, const cInt dx2, const cInt dy2, bool UseFullInt64Range) { return (UseFullInt64Range) ? // |dx1| < 2^63, |dx2| < 2^63 etc, @@ -296,6 +301,8 @@ inline bool SlopesEqual(const cInt dx1, const cInt dy1, const cInt dx2, const cI // therefore the following computation could be done with 64bit arithmetics. dy1 * dx2 == dx1 * dy2; } +#endif + inline bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) { return SlopesEqual(e1.Delta.X, e1.Delta.Y, e2.Delta.X, e2.Delta.Y, UseFullInt64Range); } inline bool SlopesEqual(const IntPoint &pt1, const IntPoint &pt2, const IntPoint &pt3, bool UseFullInt64Range) @@ -363,8 +370,8 @@ void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) } else { - b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; - b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; + b1 = double(Edge1.Bot.X) - double(Edge1.Bot.Y) * Edge1.Dx; + b2 = double(Edge2.Bot.X) - double(Edge2.Bot.Y) * Edge2.Dx; double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); ip.Y = Round(q); ip.X = (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) ? @@ -569,6 +576,7 @@ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) // ClipperBase class methods ... //------------------------------------------------------------------------------ +#ifndef CLIPPERLIB_INT32 // Called from ClipperBase::AddPath() to verify the scale of the input polygon coordinates. inline void RangeTest(const IntPoint& Pt, bool& useFullRange) { @@ -583,6 +591,7 @@ inline void RangeTest(const IntPoint& Pt, bool& useFullRange) RangeTest(Pt, useFullRange); } } +#endif // CLIPPERLIB_INT32 //------------------------------------------------------------------------------ // Called from ClipperBase::AddPath() to construct the Local Minima List. @@ -805,13 +814,17 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b try { edges[1].Curr = pg[1]; +#ifndef CLIPPERLIB_INT32 RangeTest(pg[0], m_UseFullRange); RangeTest(pg[highI], m_UseFullRange); +#endif // CLIPPERLIB_INT32 InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); for (int i = highI - 1; i >= 1; --i) { +#ifndef CLIPPERLIB_INT32 RangeTest(pg[i], m_UseFullRange); +#endif // CLIPPERLIB_INT32 InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); } } @@ -967,7 +980,9 @@ void ClipperBase::Clear() CLIPPERLIB_PROFILE_FUNC(); m_MinimaList.clear(); m_edges.clear(); +#ifndef CLIPPERLIB_INT32 m_UseFullRange = false; +#endif // CLIPPERLIB_INT32 m_HasOpenPaths = false; } //------------------------------------------------------------------------------ @@ -3322,9 +3337,9 @@ DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) if(pt2.X == pt1.X && pt2.Y == pt1.Y) return DoublePoint(0, 0); - double Dx = (double)(pt2.X - pt1.X); - double dy = (double)(pt2.Y - pt1.Y); - double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); + double Dx = double(pt2.X - pt1.X); + double dy = double(pt2.Y - pt1.Y); + double f = 1.0 / std::sqrt( Dx*Dx + dy*dy ); Dx *= f; dy *= f; return DoublePoint(dy, -Dx); @@ -3530,8 +3545,9 @@ void ClipperOffset::DoOffset(double delta) } //see offset_triginometry3.svg in the documentation folder ... - if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); - else m_miterLim = 0.5; + m_miterLim = (MiterLimit > 2) ? + 2. / (MiterLimit * MiterLimit) : + 0.5; double y; if (ArcTolerance <= 0.0) y = def_arc_tolerance; @@ -3633,11 +3649,9 @@ void ClipperOffset::DoOffset(double delta) if (node.m_endtype == etOpenButt) { int j = len - 1; - pt1 = IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * - delta), Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); + pt1 = IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * delta), Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); m_destPoly.push_back(pt1); - pt1 = IntPoint(Round(m_srcPoly[j].X - m_normals[j].X * - delta), Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); + pt1 = IntPoint(Round(m_srcPoly[j].X - m_normals[j].X * delta), Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); m_destPoly.push_back(pt1); } else @@ -3662,11 +3676,9 @@ void ClipperOffset::DoOffset(double delta) if (node.m_endtype == etOpenButt) { - pt1 = IntPoint(Round(m_srcPoly[0].X - m_normals[0].X * delta), - Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); + pt1 = IntPoint(Round(m_srcPoly[0].X - m_normals[0].X * delta), Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); m_destPoly.push_back(pt1); - pt1 = IntPoint(Round(m_srcPoly[0].X + m_normals[0].X * delta), - Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); + pt1 = IntPoint(Round(m_srcPoly[0].X + m_normals[0].X * delta), Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); m_destPoly.push_back(pt1); } else @@ -3753,7 +3765,7 @@ void ClipperOffset::DoRound(int j, int k) { double a = std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); - int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); + auto steps = std::max(Round(m_StepsPerRad * std::fabs(a)), 1); double X = m_normals[k].X, Y = m_normals[k].Y, X2; for (int i = 0; i < steps; ++i) @@ -3885,8 +3897,8 @@ void SimplifyPolygons(Paths &polys, PolyFillType fillType) inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) { - double Dx = ((double)pt1.X - pt2.X); - double dy = ((double)pt1.Y - pt2.Y); + auto Dx = double(pt1.X - pt2.X); + auto dy = double(pt1.Y - pt2.Y); return (Dx*Dx + dy*dy); } //------------------------------------------------------------------------------ @@ -3937,8 +3949,8 @@ bool SlopesNearCollinear(const IntPoint& pt1, bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) { - double Dx = (double)pt1.X - pt2.X; - double dy = (double)pt1.Y - pt2.Y; + auto Dx = double(pt1.X - pt2.X); + auto dy = double(pt1.Y - pt2.Y); return ((Dx * Dx) + (dy * dy) <= distSqrd); } //------------------------------------------------------------------------------ diff --git a/src/clipper/clipper.hpp b/src/clipper/clipper.hpp index 8b34779e3a..48e83d0461 100644 --- a/src/clipper/clipper.hpp +++ b/src/clipper/clipper.hpp @@ -71,12 +71,22 @@ enum PolyType { ptSubject, ptClip }; //see http://glprogramming.com/red/chapter11.html enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; +// If defined, Clipper will work with 32bit signed int coordinates to reduce memory +// consumption and to speed up exact orientation predicate calculation. +// In that case, coordinates and their differences (vectors of the coordinates) have to fit int32_t. +#define CLIPPERLIB_INT32 + // Point coordinate type -typedef int64_t cInt; -// Maximum cInt value to allow a cross product calculation using 32bit expressions. -static cInt const loRange = 0x3FFFFFFF; -// Maximum allowed cInt value. -static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; +#ifdef CLIPPERLIB_INT32 + // Coordinates and their differences (vectors of the coordinates) have to fit int32_t. + typedef int32_t cInt; +#else + typedef int64_t cInt; + // Maximum cInt value to allow a cross product calculation using 32bit expressions. + static constexpr cInt const loRange = 0x3FFFFFFF; // 0x3FFFFFFF = 1 073 741 823 + // Maximum allowed cInt value. + static constexpr cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; +#endif // CLIPPERLIB_INT32 struct IntPoint { cInt X; @@ -289,7 +299,11 @@ enum EdgeSide { esLeft = 1, esRight = 2}; class ClipperBase { public: - ClipperBase() : m_UseFullRange(false), m_HasOpenPaths(false) {} + ClipperBase() : +#ifndef CLIPPERLIB_INT32 + m_UseFullRange(false), +#endif // CLIPPERLIB_INT32 + m_HasOpenPaths(false) {} ~ClipperBase() { Clear(); } bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); @@ -310,9 +324,14 @@ protected: // Local minima (Y, left edge, right edge) sorted by ascending Y. std::vector m_MinimaList; +#ifdef CLIPPERLIB_INT32 + static constexpr const bool m_UseFullRange = false; +#else // CLIPPERLIB_INT32 // True if the input polygons have abs values higher than loRange, but lower than hiRange. // False if the input polygons have abs values lower or equal to loRange. bool m_UseFullRange; +#endif // CLIPPERLIB_INT32 + // A vector of edges per each input path. std::vector> m_edges; // Don't remove intermediate vertices of a collinear sequence of points. diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index 305ea134f0..cd243dfb1b 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -57,6 +57,7 @@ err: } #endif /* CLIPPER_UTILS_DEBUG */ +#ifdef CLIPPERUTILS_OFFSET_SCALE void scaleClipperPolygon(ClipperLib::Path &polygon) { CLIPPERUTILS_PROFILE_FUNC(); @@ -98,6 +99,7 @@ void unscaleClipperPolygons(ClipperLib::Paths &polygons) pit->Y >>= CLIPPER_OFFSET_POWER_OF_2; } } +#endif // CLIPPERUTILS_OFFSET_SCALE //----------------------------------------------------------- // legacy code from Clipper documentation @@ -222,8 +224,10 @@ ClipperLib::Paths Slic3rMultiPoints_to_ClipperPaths(const Polylines &input) ClipperLib::Paths _offset(ClipperLib::Paths &&input, ClipperLib::EndType endType, const float delta, ClipperLib::JoinType joinType, double miterLimit) { +#ifdef CLIPPERUTILS_OFFSET_SCALE // scale input scaleClipperPolygons(input); +#endif // CLIPPERUTILS_OFFSET_SCALE // perform offset ClipperLib::ClipperOffset co; @@ -231,14 +235,20 @@ ClipperLib::Paths _offset(ClipperLib::Paths &&input, ClipperLib::EndType endType co.ArcTolerance = miterLimit; else co.MiterLimit = miterLimit; +#ifdef CLIPPERUTILS_OFFSET_SCALE float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + float delta_scaled = delta; +#endif // CLIPPERUTILS_OFFSET_SCALE co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); co.AddPaths(input, joinType, endType); ClipperLib::Paths retval; co.Execute(retval, delta_scaled); +#ifdef CLIPPERUTILS_OFFSET_SCALE // unscale output unscaleClipperPolygons(retval); +#endif // CLIPPERUTILS_OFFSET_SCALE return retval; } @@ -257,14 +267,24 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygon &expolygon, const float delta, { // printf("new ExPolygon offset\n"); // 1) Offset the outer contour. - const float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE); +#ifdef CLIPPERUTILS_OFFSET_SCALE + float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + float delta_scaled = delta; +#endif // CLIPPERUTILS_OFFSET_SCALE ClipperLib::Paths contours; { ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath(expolygon.contour); +#ifdef CLIPPERUTILS_OFFSET_SCALE scaleClipperPolygon(input); +#endif // CLIPPERUTILS_OFFSET_SCALE ClipperLib::ClipperOffset co; if (joinType == jtRound) +#ifdef CLIPPERUTILS_OFFSET_SCALE co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + co.ArcTolerance = miterLimit; +#endif // CLIPPERUTILS_OFFSET_SCALE else co.MiterLimit = miterLimit; co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); @@ -278,17 +298,23 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygon &expolygon, const float delta, holes.reserve(expolygon.holes.size()); for (Polygons::const_iterator it_hole = expolygon.holes.begin(); it_hole != expolygon.holes.end(); ++ it_hole) { ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath_reversed(*it_hole); +#ifdef CLIPPERUTILS_OFFSET_SCALE scaleClipperPolygon(input); +#endif // CLIPPERUTILS_OFFSET_SCALE ClipperLib::ClipperOffset co; if (joinType == jtRound) +#ifdef CLIPPERUTILS_OFFSET_SCALE co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + co.ArcTolerance = miterLimit; +#endif // CLIPPERUTILS_OFFSET_SCALE else co.MiterLimit = miterLimit; co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); co.AddPath(input, joinType, ClipperLib::etClosedPolygon); ClipperLib::Paths out; co.Execute(out, - delta_scaled); - holes.insert(holes.end(), out.begin(), out.end()); + append(holes, std::move(out)); } } @@ -305,7 +331,9 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygon &expolygon, const float delta, } // 4) Unscale the output. +#ifdef CLIPPERUTILS_OFFSET_SCALE unscaleClipperPolygons(output); +#endif // CLIPPERUTILS_OFFSET_SCALE return output; } @@ -315,7 +343,11 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygon &expolygon, const float delta, ClipperLib::Paths _offset(const Slic3r::ExPolygons &expolygons, const float delta, ClipperLib::JoinType joinType, double miterLimit) { - const float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE); +#ifdef CLIPPERUTILS_OFFSET_SCALE + float delta_scaled = delta * float(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + float delta_scaled = delta; +#endif // CLIPPERUTILS_OFFSET_SCALE // Offsetted ExPolygons before they are united. ClipperLib::Paths contours_cummulative; contours_cummulative.reserve(expolygons.size()); @@ -327,10 +359,16 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygons &expolygons, const float delt ClipperLib::Paths contours; { ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath(it_expoly->contour); +#ifdef CLIPPERUTILS_OFFSET_SCALE scaleClipperPolygon(input); +#endif // CLIPPERUTILS_OFFSET_SCALE ClipperLib::ClipperOffset co; if (joinType == jtRound) +#ifdef CLIPPERUTILS_OFFSET_SCALE co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + co.ArcTolerance = miterLimit; +#endif // CLIPPERUTILS_OFFSET_SCALE else co.MiterLimit = miterLimit; co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); @@ -351,10 +389,16 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygons &expolygons, const float delt { for (Polygons::const_iterator it_hole = it_expoly->holes.begin(); it_hole != it_expoly->holes.end(); ++ it_hole) { ClipperLib::Path input = Slic3rMultiPoint_to_ClipperPath_reversed(*it_hole); +#ifdef CLIPPERUTILS_OFFSET_SCALE scaleClipperPolygon(input); +#endif // CLIPPERUTILS_OFFSET_SCALE ClipperLib::ClipperOffset co; if (joinType == jtRound) +#ifdef CLIPPERUTILS_OFFSET_SCALE co.ArcTolerance = miterLimit * double(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + co.ArcTolerance = miterLimit; +#endif // CLIPPERUTILS_OFFSET_SCALE else co.MiterLimit = miterLimit; co.ShortestEdgeLength = double(std::abs(delta_scaled * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR)); @@ -413,8 +457,10 @@ ClipperLib::Paths _offset(const Slic3r::ExPolygons &expolygons, const float delt output = std::move(contours_cummulative); } +#ifdef CLIPPERUTILS_OFFSET_SCALE // 4) Unscale the output. unscaleClipperPolygons(output); +#endif // CLIPPERUTILS_OFFSET_SCALE return output; } @@ -425,8 +471,10 @@ _offset2(const Polygons &polygons, const float delta1, const float delta2, // read input ClipperLib::Paths input = Slic3rMultiPoints_to_ClipperPaths(polygons); +#ifdef CLIPPERUTILS_OFFSET_SCALE // scale input scaleClipperPolygons(input); +#endif // CLIPPERUTILS_OFFSET_SCALE // prepare ClipperOffset object ClipperLib::ClipperOffset co; @@ -435,8 +483,13 @@ _offset2(const Polygons &polygons, const float delta1, const float delta2, } else { co.MiterLimit = miterLimit; } +#ifdef CLIPPERUTILS_OFFSET_SCALE float delta_scaled1 = delta1 * float(CLIPPER_OFFSET_SCALE); float delta_scaled2 = delta2 * float(CLIPPER_OFFSET_SCALE); +#else // CLIPPERUTILS_OFFSET_SCALE + float delta_scaled1 = delta1; + float delta_scaled2 = delta2; +#endif // CLIPPERUTILS_OFFSET_SCALE co.ShortestEdgeLength = double(std::max(std::abs(delta_scaled1), std::abs(delta_scaled2)) * CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR); // perform first offset @@ -450,8 +503,10 @@ _offset2(const Polygons &polygons, const float delta1, const float delta2, ClipperLib::Paths retval; co.Execute(retval, delta_scaled2); +#ifdef CLIPPERUTILS_OFFSET_SCALE // unscale output unscaleClipperPolygons(retval); +#endif // CLIPPERUTILS_OFFSET_SCALE return retval; } @@ -789,8 +844,10 @@ void safety_offset(ClipperLib::Paths* paths) { CLIPPERUTILS_PROFILE_FUNC(); +#ifdef CLIPPERUTILS_OFFSET_SCALE // scale input scaleClipperPolygons(*paths); +#endif // CLIPPERUTILS_OFFSET_SCALE // perform offset (delta = scale 1e-05) ClipperLib::ClipperOffset co; @@ -816,7 +873,11 @@ void safety_offset(ClipperLib::Paths* paths) CLIPPERUTILS_PROFILE_BLOCK(safety_offset_Execute); // offset outside by 10um ClipperLib::Paths out_this; +#ifdef CLIPPERUTILS_OFFSET_SCALE co.Execute(out_this, ccw ? 10.f * float(CLIPPER_OFFSET_SCALE) : -10.f * float(CLIPPER_OFFSET_SCALE)); +#else // CLIPPERUTILS_OFFSET_SCALE + co.Execute(out_this, ccw ? 10.f : -10.f); +#endif // CLIPPERUTILS_OFFSET_SCALE if (! ccw) { // Reverse the resulting contours once again. for (ClipperLib::Paths::iterator it = out_this.begin(); it != out_this.end(); ++ it) @@ -830,8 +891,10 @@ void safety_offset(ClipperLib::Paths* paths) } *paths = std::move(out); +#ifdef CLIPPERUTILS_OFFSET_SCALE // unscale output unscaleClipperPolygons(*paths); +#endif // CLIPPERUTILS_OFFSET_SCALE } Polygons top_level_islands(const Slic3r::Polygons &polygons) @@ -925,8 +988,10 @@ ClipperLib::Path mittered_offset_path_scaled(const Points &contour, const std::v // Add a new point to the output, scale by CLIPPER_OFFSET_SCALE and round to ClipperLib::cInt. auto add_offset_point = [&out](Vec2d pt) { +#ifdef CLIPPERUTILS_OFFSET_SCALE pt *= double(CLIPPER_OFFSET_SCALE); - pt += Vec2d(0.5 - (pt.x() < 0), 0.5 - (pt.y() < 0)); +#endif // CLIPPERUTILS_OFFSET_SCALE + pt += Vec2d(0.5 - (pt.x() < 0), 0.5 - (pt.y() < 0)); out.emplace_back(ClipperLib::cInt(pt.x()), ClipperLib::cInt(pt.y())); }; @@ -1075,8 +1140,10 @@ Polygons variable_offset_inner(const ExPolygon &expoly, const std::vector& ds : deltas) clipper.Execute(ClipperLib::ctDifference, output, ClipperLib::pftNonZero, ClipperLib::pftNonZero); } +#ifdef CLIPPERUTILS_OFFSET_SCALE // 4) Unscale the output. unscaleClipperPolygons(output); +#endif // CLIPPERUTILS_OFFSET_SCALE return ClipperPaths_to_Slic3rPolygons(output); } @@ -1152,7 +1221,9 @@ for (const std::vector& ds : deltas) #endif /* NDEBUG */ // 3) Subtract holes from the contours. +#ifdef CLIPPERUTILS_OFFSET_SCALE unscaleClipperPolygons(contours); +#endif // CLIPPERUTILS_OFFSET_SCALE ExPolygons output; if (holes.empty()) { output.reserve(contours.size()); @@ -1160,7 +1231,9 @@ for (const std::vector& ds : deltas) output.emplace_back(ClipperPath_to_Slic3rPolygon(path)); } else { ClipperLib::Clipper clipper; +#ifdef CLIPPERUTILS_OFFSET_SCALE unscaleClipperPolygons(holes); +#endif // CLIPPERUTILS_OFFSET_SCALE clipper.AddPaths(contours, ClipperLib::ptSubject, true); clipper.AddPaths(holes, ClipperLib::ptClip, true); ClipperLib::PolyTree polytree; @@ -1200,7 +1273,9 @@ ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vectorvertex0()->x()) > double(CLIPPER_MAX_COORD_UNSCALED) || std::abs(edge->vertex0()->y()) > double(CLIPPER_MAX_COORD_UNSCALED) || std::abs(edge->vertex1()->x()) > double(CLIPPER_MAX_COORD_UNSCALED) || std::abs(edge->vertex1()->y()) > double(CLIPPER_MAX_COORD_UNSCALED)) return false; +#endif // CLIPPERLIB_INT32 // construct the line representing this edge of the Voronoi diagram const Line line( From 279113900209ba624c71020fde22ea9ac089e04e Mon Sep 17 00:00:00 2001 From: cp Date: Mon, 12 Apr 2021 19:52:25 +0200 Subject: [PATCH 11/57] Fix boost dependency url. Original host's lifetime has ended, see here: https://github.com/boostorg/boost/issues/502 This is PR #6349, amended by @lukasmatena who added the changes for platforms other than Windows. --- deps/deps-linux.cmake | 4 ++-- deps/deps-macos.cmake | 4 ++-- deps/deps-mingw.cmake | 5 +++-- deps/deps-windows.cmake | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index 35522504ca..c81d6785db 100644 --- a/deps/deps-linux.cmake +++ b/deps/deps-linux.cmake @@ -13,7 +13,7 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh @@ -100,5 +100,5 @@ ExternalProject_Add(dep_libcurl BUILD_COMMAND make "-j${NPROC}" INSTALL_COMMAND make install "DESTDIR=${DESTDIR}" ) - add_dependencies(dep_openvdb dep_boost) + diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index 53ba008c3e..de77dafa80 100644 --- a/deps/deps-macos.cmake +++ b/deps/deps-macos.cmake @@ -18,7 +18,7 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh @@ -87,5 +87,5 @@ ExternalProject_Add(dep_libcurl BUILD_COMMAND make "-j${NPROC}" INSTALL_COMMAND make install "DESTDIR=${DESTDIR}" ) +add_dependencies(dep_openvdb dep_boost) -add_dependencies(dep_openvdb dep_boost) \ No newline at end of file diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake index c97346bb03..cae7fc3719 100644 --- a/deps/deps-mingw.cmake +++ b/deps/deps-mingw.cmake @@ -9,7 +9,7 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat @@ -58,4 +58,5 @@ ExternalProject_Add(dep_libcurl -DCURL_DISABLE_GOPHER=ON -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local ${DEP_CMAKE_OPTS} -) \ No newline at end of file +) + diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index c0d80bb291..fc9f55f5f4 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -55,7 +55,7 @@ endmacro() ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat @@ -295,4 +295,5 @@ if (${DEP_DEBUG}) COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj WORKING_DIRECTORY "${BINARY_DIR}" ) -endif () \ No newline at end of file +endif () + From c1179fc2c7f9048a315a38d390e55d2052b1213d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 13 Apr 2021 13:28:21 +0200 Subject: [PATCH 12/57] Marked the unsafe ClipperUtils offset functions with CLIPPERUTILS_UNSAFE_OFFSET Replaced some of the unsafe offset functions with safe variants. Please test the 1) print bed from STL function 2) concentric infill --- src/libslic3r/BridgeDetector.cpp | 2 +- src/libslic3r/ClipperUtils.hpp | 13 +++++++++++++ src/libslic3r/ExPolygon.hpp | 22 ++++++++++++++++++++++ src/libslic3r/Fill/FillConcentric.cpp | 8 ++++---- src/libslic3r/Fill/FillLine.cpp | 2 +- src/libslic3r/LayerRegion.cpp | 2 +- src/libslic3r/Polygon.hpp | 4 +++- src/libslic3r/TriangleMesh.cpp | 18 ++++++++++-------- 8 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/BridgeDetector.cpp b/src/libslic3r/BridgeDetector.cpp index ff33e81d53..671ebbdaad 100644 --- a/src/libslic3r/BridgeDetector.cpp +++ b/src/libslic3r/BridgeDetector.cpp @@ -40,7 +40,7 @@ void BridgeDetector::initialize() this->angle = -1.; // Outset our bridge by an arbitrary amout; we'll use this outer margin for detecting anchors. - Polygons grown = offset(to_polygons(this->expolygons), float(this->spacing)); + Polygons grown = offset(this->expolygons, float(this->spacing)); // Detect possible anchoring edges of this bridging region. // Detect what edges lie on lower slices by turning bridge contour and holes diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index c1b8875831..6668a9ae9b 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -12,6 +12,8 @@ using ClipperLib::jtMiter; using ClipperLib::jtRound; using ClipperLib::jtSquare; +#define CLIPPERUTILS_UNSAFE_OFFSET + // #define CLIPPERUTILS_OFFSET_SCALE #ifdef CLIPPERUTILS_OFFSET_SCALE @@ -51,8 +53,11 @@ ClipperLib::Paths _offset(ClipperLib::Path &&input, ClipperLib::EndType endType, ClipperLib::Paths _offset(ClipperLib::Paths &&input, ClipperLib::EndType endType, const float delta, ClipperLib::JoinType joinType, double miterLimit); inline Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rPolygons(_offset(Slic3rMultiPoint_to_ClipperPath(polygon), ClipperLib::etClosedPolygon, delta, joinType, miterLimit)); } + +#ifdef CLIPPERUTILS_UNSAFE_OFFSET inline Slic3r::Polygons offset(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rPolygons(_offset(Slic3rMultiPoints_to_ClipperPaths(polygons), ClipperLib::etClosedPolygon, delta, joinType, miterLimit)); } +#endif // CLIPPERUTILS_UNSAFE_OFFSET // offset Polylines inline Slic3r::Polygons offset(const Slic3r::Polyline &polyline, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtSquare, double miterLimit = 3) @@ -69,13 +74,18 @@ inline Slic3r::Polygons offset(const Slic3r::ExPolygons &expolygons, const float { return ClipperPaths_to_Slic3rPolygons(_offset(expolygons, delta, joinType, miterLimit)); } inline Slic3r::ExPolygons offset_ex(const Slic3r::Polygon &polygon, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rExPolygons(_offset(Slic3rMultiPoint_to_ClipperPath(polygon), ClipperLib::etClosedPolygon, delta, joinType, miterLimit)); } + +#ifdef CLIPPERUTILS_UNSAFE_OFFSET inline Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rExPolygons(_offset(Slic3rMultiPoints_to_ClipperPaths(polygons), ClipperLib::etClosedPolygon, delta, joinType, miterLimit)); } +#endif // CLIPPERUTILS_UNSAFE_OFFSET + inline Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygon &expolygon, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rExPolygons(_offset(expolygon, delta, joinType, miterLimit)); } inline Slic3r::ExPolygons offset_ex(const Slic3r::ExPolygons &expolygons, const float delta, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3) { return ClipperPaths_to_Slic3rExPolygons(_offset(expolygons, delta, joinType, miterLimit)); } +#ifdef CLIPPERUTILS_UNSAFE_OFFSET ClipperLib::Paths _offset2(const Slic3r::Polygons &polygons, const float delta1, const float delta2, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3); @@ -85,6 +95,8 @@ Slic3r::Polygons offset2(const Slic3r::Polygons &polygons, const float delta1, Slic3r::ExPolygons offset2_ex(const Slic3r::Polygons &polygons, const float delta1, const float delta2, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3); +#endif // CLIPPERUTILS_UNSAFE_OFFSET + Slic3r::ExPolygons offset2_ex(const Slic3r::ExPolygons &expolygons, const float delta1, const float delta2, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3); @@ -323,6 +335,7 @@ void safety_offset(ClipperLib::Paths* paths); Polygons top_level_islands(const Slic3r::Polygons &polygons); +ClipperLib::Path mittered_offset_path_scaled(const Points &contour, const std::vector &deltas, double miter_limit); Polygons variable_offset_inner(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); Polygons variable_offset_outer(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); ExPolygons variable_offset_outer_ex(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 46b3a3a1b9..73770bb185 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -217,6 +217,28 @@ inline Polygons to_polygons(const ExPolygons &src) return polygons; } +inline ConstPolygonPtrs to_polygon_ptrs(const ExPolygon &src) +{ + ConstPolygonPtrs polygons; + polygons.reserve(src.holes.size() + 1); + polygons.emplace_back(&src.contour); + for (const Polygon &hole : src.holes) + polygons.emplace_back(&hole); + return polygons; +} + +inline ConstPolygonPtrs to_polygon_ptrs(const ExPolygons &src) +{ + ConstPolygonPtrs polygons; + polygons.reserve(number_polygons(src)); + for (const ExPolygon &expoly : src) { + polygons.emplace_back(&expoly.contour); + for (const Polygon &hole : expoly.holes) + polygons.emplace_back(&hole); + } + return polygons; +} + inline Polygons to_polygons(ExPolygon &&src) { Polygons polygons; diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index 1b96c43a4d..785c93be3b 100644 --- a/src/libslic3r/Fill/FillConcentric.cpp +++ b/src/libslic3r/Fill/FillConcentric.cpp @@ -24,11 +24,11 @@ void FillConcentric::_fill_surface_single( this->spacing = unscale(distance); } - Polygons loops = to_polygons(std::move(expolygon)); - Polygons last = loops; + Polygons loops = to_polygons(expolygon); + ExPolygons last { std::move(expolygon) }; while (! last.empty()) { - last = offset2(last, -(distance + min_spacing/2), +min_spacing/2); - append(loops, last); + last = offset2_ex(last, -(distance + min_spacing/2), +min_spacing/2); + append(loops, to_polygons(last)); } // generate paths from the outermost to the innermost, to avoid diff --git a/src/libslic3r/Fill/FillLine.cpp b/src/libslic3r/Fill/FillLine.cpp index 6a0a19efd2..f6431a3333 100644 --- a/src/libslic3r/Fill/FillLine.cpp +++ b/src/libslic3r/Fill/FillLine.cpp @@ -58,7 +58,7 @@ void FillLine::_fill_surface_single( pts.push_back(it->a); pts.push_back(it->b); } - Polylines polylines = intersection_pl(polylines_src, offset(to_polygons(expolygon), scale_(0.02)), false); + Polylines polylines = intersection_pl(polylines_src, offset(expolygon, scale_(0.02)), false); // FIXME Vojtech: This is only performed for horizontal lines, not for the vertical lines! const float INFILL_OVERLAP_OVER_SPACING = 0.3f; diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index f6c0c9c7a5..059d94e25b 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -216,7 +216,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly break; } // Grown by 3mm. - Polygons polys = offset(to_polygons(bridges[i].expolygon), margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS); + Polygons polys = offset(bridges[i].expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS); if (idx_island == -1) { BOOST_LOG_TRIVIAL(trace) << "Bridge did not fall into the source region!"; } else { diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index aa72b4244d..dd2d68d46f 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -11,7 +11,9 @@ namespace Slic3r { class Polygon; -typedef std::vector Polygons; +using Polygons = std::vector; +using PolygonPtrs = std::vector; +using ConstPolygonPtrs = std::vector; class Polygon : public MultiPoint { diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index d5a3490877..f8fa1ca17f 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -511,20 +511,22 @@ void TriangleMesh::merge(const TriangleMesh &mesh) //FIXME This could be extremely slow! Use it for tiny meshes only! ExPolygons TriangleMesh::horizontal_projection() const { - Polygons pp; - pp.reserve(this->stl.stats.number_of_facets); + ClipperLib::Paths paths; + Polygon p; + p.points.assign(3, Point()); + auto delta = scaled(0.01); + std::vector deltas { delta, delta, delta }; + paths.reserve(this->stl.stats.number_of_facets); for (const stl_facet &facet : this->stl.facet_start) { - Polygon p; - p.points.resize(3); p.points[0] = Point::new_scale(facet.vertex[0](0), facet.vertex[0](1)); p.points[1] = Point::new_scale(facet.vertex[1](0), facet.vertex[1](1)); p.points[2] = Point::new_scale(facet.vertex[2](0), facet.vertex[2](1)); - p.make_counter_clockwise(); // do this after scaling, as winding order might change while doing that - pp.emplace_back(p); + p.make_counter_clockwise(); + paths.emplace_back(mittered_offset_path_scaled(p.points, deltas, 3.)); } // the offset factor was tuned using groovemount.stl - return union_ex(offset(pp, scale_(0.01)), true); + return ClipperPaths_to_Slic3rExPolygons(paths); } // 2D convex hull of a 3D mesh projected into the Z=0 plane. @@ -1797,7 +1799,7 @@ void TriangleMeshSlicer::make_expolygons(const Polygons &loops, const float clos // append to the supplied collection if (safety_offset > 0) - expolygons_append(*slices, offset2_ex(union_(loops, false), +safety_offset, -safety_offset)); + expolygons_append(*slices, offset2_ex(union_ex(loops, false), +safety_offset, -safety_offset)); else expolygons_append(*slices, union_ex(loops, false)); } From 29cd8aac26b4ae0bbe02334823b321aaac2e9a43 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 13 Apr 2021 16:35:46 +0200 Subject: [PATCH 13/57] WIP: Fix of arrangement after reducing ClipperLib::cInt from int64_t to int32_t --- src/libnest2d/include/libnest2d/geometry_traits.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index d9c3d78626..3095c717db 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -474,8 +474,8 @@ inline _Box

_Box

::infinite(const P& center) { // It is important for Mx and My to be strictly less than half of the // range of type C. width(), height() and area() will not overflow this way. - C Mx = C((std::numeric_limits::lowest() + 2 * getX(center)) / 2.01); - C My = C((std::numeric_limits::lowest() + 2 * getY(center)) / 2.01); + C Mx = C((std::numeric_limits::lowest() + 2 * getX(center)) / 4.01); + C My = C((std::numeric_limits::lowest() + 2 * getY(center)) / 4.01); ret.maxCorner() = center - P{Mx, My}; ret.minCorner() = center + P{Mx, My}; From 41c56f2eb8a48ef5530938da08909365108f686d Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Tue, 13 Apr 2021 19:09:54 +0200 Subject: [PATCH 14/57] creality.ini: Extrudr NX2 slightly lower temps After more practical testing, a slightly lower temp is beneficial on small pointy areas, preventing them from being slightly deformed. --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 0b4e4cf140..ead535aed4 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -652,9 +652,9 @@ filament_colour = #FF0000 [filament:Extrudr PLA NX2 @CREALITY] inherits = *PLA* filament_vendor = Extrudr -temperature = 200 +temperature = 195 bed_temperature = 60 -first_layer_temperature = 205 +first_layer_temperature = 200 first_layer_bed_temperature = 60 filament_cost = 23.63 filament_density = 1.3 From 8845b0245abf6da3f9881b65673fd947eb079763 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 14 Apr 2021 07:04:25 +0200 Subject: [PATCH 15/57] Fixed build against wxWidgets 3.0 --- src/slic3r/GUI/MainFrame.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 5c390b66f6..9c426dcd96 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -522,8 +522,10 @@ void MainFrame::init_tabpanel() #ifndef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList m_tabpanel->SetFont(Slic3r::GUI::wxGetApp().normal_font()); #endif +#if wxCHECK_VERSION(3,1,3) if (wxSystemSettings::GetAppearance().IsDark()) m_tabpanel->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif m_tabpanel->Hide(); m_settings_dialog.set_tabpanel(m_tabpanel); From 41a0e270ac3683cb47590d53943c21a36d684051 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 14 Apr 2021 08:51:54 +0200 Subject: [PATCH 16/57] Fix integer overflows in libnest2d tests --- tests/libnest2d/libnest2d_tests_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/libnest2d/libnest2d_tests_main.cpp b/tests/libnest2d/libnest2d_tests_main.cpp index a0f1924603..e3ffe9c6e3 100644 --- a/tests/libnest2d/libnest2d_tests_main.cpp +++ b/tests/libnest2d/libnest2d_tests_main.cpp @@ -1171,7 +1171,7 @@ TEST_CASE("Test for biggest bounding box area", "[Nesting], [NestKernels]") pconfig.object_function = [&pile_box](const Item &item) -> double { Box b = sl::boundingBox(item.boundingBox(), pile_box); - double area = b.area() / (W * W); + double area = b.area() / (double(W) * W); return -area; }; @@ -1187,5 +1187,5 @@ TEST_CASE("Test for biggest bounding box area", "[Nesting], [NestKernels]") // Here the result shall be a stairway of boxes REQUIRE(pile.size() == N); - REQUIRE(bb.area() == N * N * W * W); + REQUIRE(bb.area() == double(N) * N * W * W); } From 0625788583bcd98c10913e484fc2f8e5e59b4584 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 14 Apr 2021 14:25:25 +0200 Subject: [PATCH 17/57] Fixed obvious bug in move operator, discovered by clang lint ran by Tamas. --- src/libslic3r/SupportMaterial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 1242df1ea5..08cd04b909 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -3186,7 +3186,7 @@ struct MyLayerExtruded MyLayerExtruded& operator=(MyLayerExtruded &&rhs) { this->layer = rhs.layer; this->extrusions = std::move(rhs.extrusions); - this->m_polygons_to_extrude = std::move(m_polygons_to_extrude); + this->m_polygons_to_extrude = std::move(rhs.m_polygons_to_extrude); rhs.layer = nullptr; return *this; } From 526233ca472da33070a0d576fe8144100e02cb43 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 14 Apr 2021 14:46:49 +0200 Subject: [PATCH 18/57] Modified version of automatic downscale on load of objects too big --- src/libslic3r/Technologies.hpp | 2 ++ src/slic3r/GUI/Plater.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index d6b2cff8ee..303ffe9274 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -57,6 +57,8 @@ #define ENABLE_GCODE_WINDOW (1 && ENABLE_2_4_0_ALPHA0) // Enable exporting lines M73 for remaining time to next printer stop to gcode #define ENABLE_EXTENDED_M73_LINES (1 && ENABLE_VALIDATE_CUSTOM_GCODE) +// Enable a modified version of automatic downscale on load of objects too big +#define ENABLE_MODIFIED_DOWNSCALE_ON_LOAD_OBJECTS_TOO_BIG (1 && ENABLE_2_4_0_ALPHA0) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e0a5031c23..a3d30d5f8d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2407,6 +2407,29 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode #endif /* AUTOPLACEMENT_ON_LOAD */ } +#if ENABLE_MODIFIED_DOWNSCALE_ON_LOAD_OBJECTS_TOO_BIG + for (size_t i = 0; i < object->instances.size(); ++i) { + ModelInstance* instance = object->instances[i]; + const Vec3d size = object->instance_bounding_box(i).size(); + const Vec3d ratio = size.cwiseQuotient(bed_size); + const double max_ratio = std::max(ratio(0), ratio(1)); + if (max_ratio > 10000) { + // the size of the object is too big -> this could lead to overflow when moving to clipper coordinates, + // so scale down the mesh + double inv = 1. / max_ratio; + object->scale_mesh_after_creation(inv * Vec3d::Ones()); + object->origin_translation = Vec3d::Zero(); + object->center_around_origin(); + scaled_down = true; + break; + } + else if (max_ratio > 5) { + const Vec3d inverse = 1.0 / max_ratio * Vec3d::Ones(); + instance->set_scaling_factor(inverse); + scaled_down = true; + } + } +#else const Vec3d size = object->bounding_box().size(); const Vec3d ratio = size.cwiseQuotient(bed_size); const double max_ratio = std::max(ratio(0), ratio(1)); @@ -2425,6 +2448,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode } scaled_down = true; } +#endif // ENABLE_MODIFIED_DOWNSCALE_ON_LOAD_OBJECTS_TOO_BIG object->ensure_on_bed(); } From d8f56ef5fd49963f88ed72a2baca0c11799ed1ca Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Tue, 13 Apr 2021 19:23:01 +0200 Subject: [PATCH 19/57] creality.ini: add Devil Design approx spool weights by manufacturer specifications: https://devildesign.com/download/PLA_-_product_card.pdf --- resources/profiles/Creality.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index ead535aed4..c737915830 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -637,6 +637,7 @@ first_layer_bed_temperature = 60 filament_cost = 19.00 filament_density = 1.24 filament_colour = #FF0000 +filament_spool_weight = 250 [filament:Devil Design PLA (Galaxy) @CREALITY] inherits = *PLA* @@ -648,6 +649,7 @@ first_layer_bed_temperature = 65 filament_cost = 19.00 filament_density = 1.24 filament_colour = #FF0000 +filament_spool_weight = 250 [filament:Extrudr PLA NX2 @CREALITY] inherits = *PLA* From 10e914d9a935b44ab1b8f0c41fe012863db7fad6 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 14 Apr 2021 17:56:25 +0200 Subject: [PATCH 20/57] creality.ini: add 3DJAKE ecoPLA Matt the filament is very flowy, which means it prints well at lower temperatures. and given the limited part cooling fan on most creality printers, it prints less well at higher temperatures. --- resources/profiles/Creality.ini | 70 +++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index c737915830..80c76932d0 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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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: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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER3V2] name = Creality Ender-3 V2 @@ -39,7 +39,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER3MAX] name = Creality Ender-3 Max @@ -48,7 +48,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER4] name = Creality Ender-4 @@ -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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER5] name = Creality Ender-5 @@ -66,7 +66,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER5PLUS] name = Creality Ender-5 Plus @@ -75,7 +75,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER6] name = Creality Ender-6 @@ -84,7 +84,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:ENDER2] name = Creality Ender-2 @@ -93,7 +93,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR5PRO] name = Creality CR-5 Pro @@ -102,7 +102,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR5PROH] name = Creality CR-5 Pro H @@ -111,7 +111,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR6SE] name = Creality CR-6 SE @@ -120,7 +120,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR6MAX] name = Creality CR-6 Max @@ -129,7 +129,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10MINI] name = Creality CR-10 Mini @@ -138,7 +138,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10MAX] name = Creality CR-10 Max @@ -147,7 +147,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10] name = Creality CR-10 @@ -156,7 +156,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10V2] name = Creality CR-10 V2 @@ -165,7 +165,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10V3] name = Creality CR-10 V3 @@ -174,7 +174,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10S] name = Creality CR-10 S @@ -183,7 +183,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10SPRO] name = Creality CR-10 S Pro @@ -192,7 +192,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10SPROV2] name = Creality CR-10 S Pro V2 @@ -201,7 +201,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10S4] name = Creality CR-10 S4 @@ -210,7 +210,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR10S5] name = Creality CR-10 S5 @@ -219,7 +219,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR20] name = Creality CR-20 @@ -228,7 +228,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR20PRO] name = Creality CR-20 Pro @@ -237,7 +237,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR200B] name = Creality CR-200B @@ -246,7 +246,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CR8] name = Creality CR-8 @@ -255,7 +255,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CRX] #name = Creality CR-X @@ -264,7 +264,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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:CRXPRO] #name = Creality CR-X Pro @@ -273,7 +273,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 (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @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 (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 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -708,6 +708,18 @@ filament_density = 1.24 filament_colour = #125467 filament_spool_weight = 238 +[filament:3DJAKE ecoPLA Matt @CREALITY] +inherits = *PLA* +filament_vendor = 3DJAKE +temperature = 195 +bed_temperature = 60 +first_layer_temperature = 195 +first_layer_bed_temperature = 60 +filament_cost = 24.99 +filament_density = 1.38 +filament_colour = #125467 +filament_spool_weight = 238 + [filament:3DJAKE ecoPLA Tough @CREALITY] inherits = *PLA* filament_vendor = 3DJAKE From c492d0d109a2150743eebf46d1b4916663fc64c6 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:48:06 +0200 Subject: [PATCH 21/57] Add files via upload --- .../profiles/Artillery/Genius_thumbnail.png | Bin 0 -> 42135 bytes resources/profiles/Artillery/X1_thumbnail.png | Bin 0 -> 36381 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/profiles/Artillery/Genius_thumbnail.png create mode 100644 resources/profiles/Artillery/X1_thumbnail.png diff --git a/resources/profiles/Artillery/Genius_thumbnail.png b/resources/profiles/Artillery/Genius_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..227f7ca8a57c11da579439eebd07f9adf50079c3 GIT binary patch literal 42135 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 T#_|TS00000NkvXXu0mjfE)IFE literal 0 HcmV?d00001 diff --git a/resources/profiles/Artillery/X1_thumbnail.png b/resources/profiles/Artillery/X1_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa3a0dcccebc7aaa852a8a82eabd9940a9915e1 GIT binary patch literal 36381 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%0D`01xkydjCR>yIBl{-U7p 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 BwlDwy literal 0 HcmV?d00001 From d2969e155837cc50081d68c4f64a910f1a7291d5 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:48:38 +0200 Subject: [PATCH 22/57] Delete genius_thumbnail.png --- .../profiles/Artillery/genius_thumbnail.png | Bin 42135 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/profiles/Artillery/genius_thumbnail.png diff --git a/resources/profiles/Artillery/genius_thumbnail.png b/resources/profiles/Artillery/genius_thumbnail.png deleted file mode 100644 index 227f7ca8a57c11da579439eebd07f9adf50079c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42135 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 T#_|TS00000NkvXXu0mjfE)IFE From dfe47aa4e47d24a2341ba92016dc13f0c1ff7a95 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:48:48 +0200 Subject: [PATCH 23/57] Delete x1_thumbnail.png --- resources/profiles/Artillery/x1_thumbnail.png | Bin 36381 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/profiles/Artillery/x1_thumbnail.png diff --git a/resources/profiles/Artillery/x1_thumbnail.png b/resources/profiles/Artillery/x1_thumbnail.png deleted file mode 100644 index 4aa3a0dcccebc7aaa852a8a82eabd9940a9915e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36381 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%0D`01xkydjCR>yIBl{-U7p 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 BwlDwy From 1e69e6def14940e044d053d3baa55075302d2f2f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 15 Apr 2021 08:41:20 +0200 Subject: [PATCH 24/57] Follow-up of 526233ca472da33070a0d576fe8144100e02cb43 -> Take in account original instances scale factor --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a3d30d5f8d..50adb89e41 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2425,7 +2425,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode } else if (max_ratio > 5) { const Vec3d inverse = 1.0 / max_ratio * Vec3d::Ones(); - instance->set_scaling_factor(inverse); + instance->set_scaling_factor(inverse.cwiseProduct(instance->get_scaling_factor())); scaled_down = true; } } From 64ec319017258fa99c6abc173c65a5868e5bc18d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 12 Jan 2021 17:01:14 +0100 Subject: [PATCH 25/57] Fix for arrange crash when geometry has zero length segments fixes #5749 --- src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp index 29a1ccd047..6b3ff60c18 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp @@ -220,7 +220,9 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, auto next = std::next(first); while(next != sl::cend(sh)) { - edgelist.emplace_back(*(first), *(next)); + if (pl::magnsq(*next - *first) > 0) + edgelist.emplace_back(*(first), *(next)); + ++first; ++next; } } @@ -230,7 +232,9 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, auto next = std::next(first); while(next != sl::cend(other)) { - edgelist.emplace_back(*(next), *(first)); + if (pl::magnsq(*next - *first) > 0) + edgelist.emplace_back(*(next), *(first)); + ++first; ++next; } } From d5ddf8b00eae98b25106aefdb2fa90a873ee8fd6 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 15 Apr 2021 13:48:20 +0200 Subject: [PATCH 26/57] RemovableManager on OSX: Testing for dictionary values for nullness. Hopefully it fixes Can not start slicer on mac Bigsur #5719 --- src/slic3r/GUI/RemovableDriveManagerMM.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/RemovableDriveManagerMM.mm b/src/slic3r/GUI/RemovableDriveManagerMM.mm index 3bd1fba7eb..8542c2509d 100644 --- a/src/slic3r/GUI/RemovableDriveManagerMM.mm +++ b/src/slic3r/GUI/RemovableDriveManagerMM.mm @@ -80,7 +80,9 @@ static void unmount_callback(DADiskRef disk, DADissenterRef dissenter, void *con NSLog(@"-%@",(CFStringRef)deviceModelKey); */ if (mediaEjectableKey != nullptr) { - BOOL op = ejectable && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceModelKey, CFSTR("SD Card Reader")) || CFEqual(deviceProtocolName, CFSTR("Secure Digital"))); + BOOL op = ejectable && + ( (deviceProtocolName != nullptr && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceProtocolName, CFSTR("Secure Digital")))) || + (deviceModelKey != nullptr && CFEqual(deviceModelKey, CFSTR("SD Card Reader"))) ); //!CFEqual(deviceModelKey, CFSTR("Disk Image")); if (op) [result addObject:volURL.path]; From 48a93e40fb2499832ea4dd61185c58912f6ef18a Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Thu, 15 Apr 2021 16:29:30 +0200 Subject: [PATCH 27/57] After issuing the color change custom G-code, which is most likely just M600, reset the internal retract counter, so that a retract will happen after the firmware returns from M600 to the initial position. Fixes "Blobs on print after manual color change #6362" --- src/libslic3r/GCode.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 0e2b1a57f6..a799408109 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1778,6 +1778,10 @@ namespace ProcessLayer else { gcode += gcodegen.placeholder_parser_process("color_change_gcode", config.color_change_gcode, current_extruder_id); gcode += "\n"; + //FIXME Tell G-code writer that M600 filled the extruder, thus the G-code writer shall reset the extruder to unretracted state after + // return from M600. Thus the G-code generated by the following line is ignored. + // see GH issue #6362 + gcodegen.writer().unretract(); } } else { From 66f6c8c786919958c28345ea10589f673cd8f21c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 09:48:22 +0200 Subject: [PATCH 28/57] Fixed conversion to utf8 of strings entered using Custom G-code dialog --- src/slic3r/GUI/DoubleSlider.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 29b488b907..84a499d6fd 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -2165,7 +2165,7 @@ static std::string get_custom_code(const std::string& code_in, double height) if (dlg.ShowModal() != wxID_OK) return ""; - value = dlg.GetValue().ToStdString(); + value = into_u8(dlg.GetValue()); valid = GUI::Tab::validate_custom_gcode("Custom G-code", value); } while (!valid); return value; @@ -2173,7 +2173,7 @@ static std::string get_custom_code(const std::string& code_in, double height) if (dlg.ShowModal() != wxID_OK) return ""; - return dlg.GetValue().ToStdString(); + return into_u8(dlg.GetValue()); #endif // ENABLE_VALIDATE_CUSTOM_GCODE } From dabac9275540219a691d0f93ed4340183186405a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 12:49:57 +0200 Subject: [PATCH 29/57] Fixed flickering of 3D scene GUI when the scene's bounding box gets very big --- src/slic3r/GUI/Camera.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index ade1d40437..6c183c3430 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -330,28 +330,28 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo far_z += FrustrumZMargin; // ensure min size - if (far_z - near_z < FrustrumMinZRange) - { + if (far_z - near_z < FrustrumMinZRange) { double mid_z = 0.5 * (near_z + far_z); double half_size = 0.5 * FrustrumMinZRange; near_z = mid_z - half_size; far_z = mid_z + half_size; } - if (near_z < FrustrumMinNearZ) - { - float delta = FrustrumMinNearZ - near_z; + if (near_z < FrustrumMinNearZ) { + double delta = FrustrumMinNearZ - near_z; set_distance(m_distance + delta); near_z += delta; far_z += delta; } - else if ((near_z > 2.0 * FrustrumMinNearZ) && (m_distance > DefaultDistance)) - { - float delta = m_distance - DefaultDistance; - set_distance(DefaultDistance); - near_z -= delta; - far_z -= delta; - } +// The following is commented out because it causes flickering of the 3D scene GUI +// when the bounding box of the scene gets large enough +// We need to introduce some smarter code to move the camera back and forth in such case +// else if (near_z > 2.0 * FrustrumMinNearZ && m_distance > DefaultDistance) { +// float delta = m_distance - DefaultDistance; +// set_distance(DefaultDistance); +// near_z -= delta; +// far_z -= delta; +// } return ret; } From 074a44833e0820104212242eeb9aefd72ec1e633 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 13:44:01 +0200 Subject: [PATCH 30/57] Removed mutable members from struct Camera --- src/slic3r/GUI/Camera.cpp | 33 ++++++++++++++++----------------- src/slic3r/GUI/Camera.hpp | 17 ++++++++--------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 6c183c3430..82522b7a33 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -123,7 +123,7 @@ double Camera::get_fov() const void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) const { glsafe(::glViewport(0, 0, w, h)); - glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); + glsafe(::glGetIntegerv(GL_VIEWPORT, const_cast*>(&m_viewport)->data())); } void Camera::apply_view_matrix() const @@ -139,16 +139,17 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa double h = 0.0; double old_distance = m_distance; - m_frustrum_zs = calc_tight_frustrum_zs_around(box); + std::pair* frustrum_zs = const_cast*>(&m_frustrum_zs); + *frustrum_zs = calc_tight_frustrum_zs_around(box); if (m_distance != old_distance) // the camera has been moved re-apply view matrix apply_view_matrix(); if (near_z > 0.0) - m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); + frustrum_zs->first = std::max(std::min(frustrum_zs->first, near_z), FrustrumMinNearZ); if (far_z > 0.0) - m_frustrum_zs.second = std::max(m_frustrum_zs.second, far_z); + frustrum_zs->second = std::max(frustrum_zs->second, far_z); w = 0.5 * (double)m_viewport[2]; h = 0.5 * (double)m_viewport[3]; @@ -162,16 +163,16 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa default: case Ortho: { - m_gui_scale = 1.0; + *const_cast(&m_gui_scale) = 1.0; break; } case Perspective: { // scale near plane to keep w and h constant on the plane at z = m_distance - double scale = m_frustrum_zs.first / m_distance; + double scale = frustrum_zs->first / m_distance; w *= scale; h *= scale; - m_gui_scale = scale; + *const_cast(&m_gui_scale) = scale; break; } } @@ -184,17 +185,17 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa default: case Ortho: { - glsafe(::glOrtho(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second)); + glsafe(::glOrtho(-w, w, -h, h, frustrum_zs->first, frustrum_zs->second)); break; } case Perspective: { - glsafe(::glFrustum(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second)); + glsafe(::glFrustum(-w, w, -h, h, frustrum_zs->first, frustrum_zs->second)); break; } } - glsafe(::glGetDoublev(GL_PROJECTION_MATRIX, m_projection_matrix.data())); + glsafe(::glGetDoublev(GL_PROJECTION_MATRIX, const_cast(&m_projection_matrix)->data())); glsafe(::glMatrixMode(GL_MODELVIEW)); } @@ -202,8 +203,7 @@ void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) { // Calculate the zoom factor needed to adjust the view around the given box. double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); - if (zoom > 0.0) - { + if (zoom > 0.0) { m_zoom = zoom; // center view around box center set_target(box.center()); @@ -470,7 +470,7 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c double dx = margin_factor * (max_x - min_x); double dy = margin_factor * (max_y - min_y); - if ((dx <= 0.0) || (dy <= 0.0)) + if (dx <= 0.0 || dy <= 0.0) return -1.0f; return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); @@ -478,10 +478,9 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c void Camera::set_distance(double distance) const { - if (m_distance != distance) - { - m_view_matrix.translate((distance - m_distance) * get_dir_forward()); - m_distance = distance; + if (m_distance != distance) { + const_cast(&m_view_matrix)->translate((distance - m_distance) * get_dir_forward()); + *const_cast(&m_distance) = distance; } } diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 91f4661b46..574a6eed76 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -35,15 +35,15 @@ private: float m_zenit{ 45.0f }; double m_zoom{ 1.0 }; // Distance between camera position and camera target measured along the camera Z axis - mutable double m_distance{ DefaultDistance }; - mutable double m_gui_scale{ 1.0 }; + double m_distance{ DefaultDistance }; + double m_gui_scale{ 1.0 }; - mutable std::array m_viewport; - mutable Transform3d m_view_matrix{ Transform3d::Identity() }; + std::array m_viewport; + Transform3d m_view_matrix{ Transform3d::Identity() }; // We are calculating the rotation part of the m_view_matrix from m_view_rotation. - mutable Eigen::Quaterniond m_view_rotation{ 1.0, 0.0, 0.0, 0.0 }; - mutable Transform3d m_projection_matrix{ Transform3d::Identity() }; - mutable std::pair m_frustrum_zs; + Eigen::Quaterniond m_view_rotation{ 1.0, 0.0, 0.0, 0.0 }; + Transform3d m_projection_matrix{ Transform3d::Identity() }; + std::pair m_frustrum_zs; BoundingBoxf3 m_scene_box; @@ -119,8 +119,7 @@ public: bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } // forces camera right vector to be parallel to XY plane - void recover_from_free_camera() - { + void recover_from_free_camera() { if (std::abs(get_dir_right()(2)) > EPSILON) look_at(get_position(), m_target, Vec3d::UnitZ()); } From a393df59d74dc252e8e977afa2c35875b2fcf02e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 14:05:55 +0200 Subject: [PATCH 31/57] Further refactoring into struct Camera --- src/slic3r/GUI/Camera.cpp | 156 ++++++++++++++++---------------------- src/slic3r/GUI/Camera.hpp | 10 +-- 2 files changed, 69 insertions(+), 97 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 82522b7a33..d8b80f1ce8 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -21,12 +21,6 @@ double Camera::FrustrumMinNearZ = 100.0; double Camera::FrustrumZMargin = 10.0; double Camera::MaxFovDeg = 60.0; -Camera::Camera() - : requires_zoom_to_bed(false) -{ - set_default_orientation(); -} - std::string Camera::get_type_as_string() const { switch (m_type) @@ -49,11 +43,6 @@ void Camera::set_type(EType type) } } -void Camera::set_type(const std::string& type) -{ - set_type((type == "1") ? Perspective : Ortho); -} - void Camera::select_next_type() { unsigned char next = (unsigned char)m_type + 1; @@ -65,24 +54,18 @@ void Camera::select_next_type() void Camera::set_target(const Vec3d& target) { - Vec3d new_target = validate_target(target); - Vec3d new_displacement = new_target - m_target; - if (!new_displacement.isApprox(Vec3d::Zero())) - { + const Vec3d new_target = validate_target(target); + const Vec3d new_displacement = new_target - m_target; + if (!new_displacement.isApprox(Vec3d::Zero())) { m_target = new_target; m_view_matrix.translate(-new_displacement); } } -void Camera::update_zoom(double delta_zoom) -{ - set_zoom(m_zoom / (1.0 - std::max(std::min(delta_zoom, 4.0), -4.0) * 0.1)); -} - void Camera::set_zoom(double zoom) { // Don't allow to zoom too far outside the scene. - double zoom_min = min_zoom(); + const double zoom_min = min_zoom(); if (zoom_min > 0.0) zoom = std::max(zoom, zoom_min); @@ -138,7 +121,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa double w = 0.0; double h = 0.0; - double old_distance = m_distance; + const double old_distance = m_distance; std::pair* frustrum_zs = const_cast*>(&m_frustrum_zs); *frustrum_zs = calc_tight_frustrum_zs_around(box); if (m_distance != old_distance) @@ -154,7 +137,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa w = 0.5 * (double)m_viewport[2]; h = 0.5 * (double)m_viewport[3]; - double inv_zoom = get_inv_zoom(); + const double inv_zoom = get_inv_zoom(); w *= inv_zoom; h *= inv_zoom; @@ -169,7 +152,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa case Perspective: { // scale near plane to keep w and h constant on the plane at z = m_distance - double scale = frustrum_zs->first / m_distance; + const double scale = frustrum_zs->first / m_distance; w *= scale; h *= scale; *const_cast(&m_gui_scale) = scale; @@ -202,7 +185,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) { // Calculate the zoom factor needed to adjust the view around the given box. - double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); + const double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); if (zoom > 0.0) { m_zoom = zoom; // center view around box center @@ -213,9 +196,8 @@ void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor) { Vec3d center; - double zoom = calc_zoom_to_volumes_factor(volumes, center, margin_factor); - if (zoom > 0.0) - { + const double zoom = calc_zoom_to_volumes_factor(volumes, center, margin_factor); + if (zoom > 0.0) { m_zoom = zoom; // center view around the calculated center set_target(center); @@ -289,8 +271,8 @@ void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, b } } - Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; - auto rot_z = Eigen::AngleAxisd(delta_azimut_rad, Vec3d::UnitZ()); + const Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; + const auto rot_z = Eigen::AngleAxisd(delta_azimut_rad, Vec3d::UnitZ()); m_view_rotation *= rot_z * Eigen::AngleAxisd(delta_zenit_rad, rot_z.inverse() * get_dir_right()); m_view_rotation.normalize(); m_view_matrix.fromPositionOrientationScale(m_view_rotation * (- m_target) + translation, m_view_rotation, Vec3d(1., 1., 1.)); @@ -299,10 +281,10 @@ void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, b // Virtual trackball, rotate around an axis, where the eucledian norm of the axis gives the rotation angle in radians. void Camera::rotate_local_around_target(const Vec3d& rotation_rad) { - double angle = rotation_rad.norm(); + const double angle = rotation_rad.norm(); if (std::abs(angle) > EPSILON) { - Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; - Vec3d axis = m_view_rotation.conjugate() * rotation_rad.normalized(); + const Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; + const Vec3d axis = m_view_rotation.conjugate() * rotation_rad.normalized(); m_view_rotation *= Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)); m_view_rotation.normalize(); m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-m_target) + translation, m_view_rotation, Vec3d(1., 1., 1.)); @@ -310,18 +292,13 @@ void Camera::rotate_local_around_target(const Vec3d& rotation_rad) } } -double Camera::min_zoom() const -{ - return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); -} - std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const { std::pair ret; auto& [near_z, far_z] = ret; // box in eye space - BoundingBoxf3 eye_box = box.transformed(m_view_matrix); + const BoundingBoxf3 eye_box = box.transformed(m_view_matrix); near_z = -eye_box.max(2); far_z = -eye_box.min(2); @@ -331,14 +308,14 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo // ensure min size if (far_z - near_z < FrustrumMinZRange) { - double mid_z = 0.5 * (near_z + far_z); - double half_size = 0.5 * FrustrumMinZRange; + const double mid_z = 0.5 * (near_z + far_z); + const double half_size = 0.5 * FrustrumMinZRange; near_z = mid_z - half_size; far_z = mid_z + half_size; } if (near_z < FrustrumMinNearZ) { - double delta = FrustrumMinNearZ - near_z; + const double delta = FrustrumMinNearZ - near_z; set_distance(m_distance + delta); near_z += delta; far_z += delta; @@ -358,45 +335,43 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor) const { - double max_bb_size = box.max_size(); + const double max_bb_size = box.max_size(); if (max_bb_size == 0.0) return -1.0; // project the box vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes - Vec3d right = get_dir_right(); - Vec3d up = get_dir_up(); - Vec3d forward = get_dir_forward(); - - Vec3d bb_center = box.center(); + const Vec3d right = get_dir_right(); + const Vec3d up = get_dir_up(); + const Vec3d forward = get_dir_forward(); + const Vec3d bb_center = box.center(); // box vertices in world space - std::vector vertices; - vertices.reserve(8); - vertices.push_back(box.min); - vertices.emplace_back(box.max(0), box.min(1), box.min(2)); - vertices.emplace_back(box.max(0), box.max(1), box.min(2)); - vertices.emplace_back(box.min(0), box.max(1), box.min(2)); - vertices.emplace_back(box.min(0), box.min(1), box.max(2)); - vertices.emplace_back(box.max(0), box.min(1), box.max(2)); - vertices.push_back(box.max); - vertices.emplace_back(box.min(0), box.max(1), box.max(2)); + const std::vector vertices = { + box.min, + { box.max(0), box.min(1), box.min(2) }, + { box.max(0), box.max(1), box.min(2) }, + { box.min(0), box.max(1), box.min(2) }, + { box.min(0), box.min(1), box.max(2) }, + { box.max(0), box.min(1), box.max(2) }, + box.max, + { box.min(0), box.max(1), box.max(2) } + }; double min_x = DBL_MAX; double min_y = DBL_MAX; double max_x = -DBL_MAX; double max_y = -DBL_MAX; - for (const Vec3d& v : vertices) - { + for (const Vec3d& v : vertices) { // project vertex on the plane perpendicular to camera forward axis - Vec3d pos = v - bb_center; - Vec3d proj_on_plane = pos - pos.dot(forward) * forward; + const Vec3d pos = v - bb_center; + const Vec3d proj_on_plane = pos - pos.dot(forward) * forward; // calculates vertex coordinate along camera xy axes - double x_on_plane = proj_on_plane.dot(right); - double y_on_plane = proj_on_plane.dot(up); + const double x_on_plane = proj_on_plane.dot(right); + const double y_on_plane = proj_on_plane.dot(up); min_x = std::min(min_x, x_on_plane); min_y = std::min(min_y, y_on_plane); @@ -406,7 +381,7 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double double dx = max_x - min_x; double dy = max_y - min_y; - if ((dx <= 0.0) || (dy <= 0.0)) + if (dx <= 0.0 || dy <= 0.0) return -1.0f; dx *= margin_factor; @@ -423,13 +398,12 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c // project the volumes vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes - Vec3d right = get_dir_right(); - Vec3d up = get_dir_up(); - Vec3d forward = get_dir_forward(); + const Vec3d right = get_dir_right(); + const Vec3d up = get_dir_up(); + const Vec3d forward = get_dir_forward(); BoundingBoxf3 box; - for (const GLVolume* volume : volumes) - { + for (const GLVolume* volume : volumes) { box.merge(volume->transformed_bounding_box()); } center = box.center(); @@ -439,24 +413,22 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c double max_x = -DBL_MAX; double max_y = -DBL_MAX; - for (const GLVolume* volume : volumes) - { + for (const GLVolume* volume : volumes) { const Transform3d& transform = volume->world_matrix(); const TriangleMesh* hull = volume->convex_hull(); if (hull == nullptr) continue; - for (const Vec3f& vertex : hull->its.vertices) - { - Vec3d v = transform * vertex.cast(); + for (const Vec3f& vertex : hull->its.vertices) { + const Vec3d v = transform * vertex.cast(); // project vertex on the plane perpendicular to camera forward axis - Vec3d pos = v - center; - Vec3d proj_on_plane = pos - pos.dot(forward) * forward; + const Vec3d pos = v - center; + const Vec3d proj_on_plane = pos - pos.dot(forward) * forward; // calculates vertex coordinate along camera xy axes - double x_on_plane = proj_on_plane.dot(right); - double y_on_plane = proj_on_plane.dot(up); + const double x_on_plane = proj_on_plane.dot(right); + const double y_on_plane = proj_on_plane.dot(up); min_x = std::min(min_x, x_on_plane); min_y = std::min(min_y, y_on_plane); @@ -467,8 +439,8 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c center += 0.5 * (max_x + min_x) * right + 0.5 * (max_y + min_y) * up; - double dx = margin_factor * (max_x - min_x); - double dy = margin_factor * (max_y - min_y); + const double dx = margin_factor * (max_x - min_x); + const double dy = margin_factor * (max_y - min_y); if (dx <= 0.0 || dy <= 0.0) return -1.0f; @@ -486,13 +458,13 @@ void Camera::set_distance(double distance) const void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) { - Vec3d unit_z = (position - target).normalized(); - Vec3d unit_x = up.cross(unit_z).normalized(); - Vec3d unit_y = unit_z.cross(unit_x).normalized(); + const Vec3d unit_z = (position - target).normalized(); + const Vec3d unit_x = up.cross(unit_z).normalized(); + const Vec3d unit_y = unit_z.cross(unit_x).normalized(); m_target = target; m_distance = (position - target).norm(); - Vec3d new_position = m_target + m_distance * unit_z; + const Vec3d new_position = m_target + m_distance * unit_z; m_view_matrix(0, 0) = unit_x(0); m_view_matrix(0, 1) = unit_x(1); @@ -524,10 +496,10 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up void Camera::set_default_orientation() { m_zenit = 45.0f; - double theta_rad = Geometry::deg2rad(-(double)m_zenit); - double phi_rad = Geometry::deg2rad(45.0); - double sin_theta = ::sin(theta_rad); - Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); + const double theta_rad = Geometry::deg2rad(-(double)m_zenit); + const double phi_rad = Geometry::deg2rad(45.0); + const double sin_theta = ::sin(theta_rad); + const Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ()); m_view_rotation.normalize(); m_view_matrix.fromPositionOrientationScale(m_view_rotation * (- camera_pos), m_view_rotation, Vec3d(1., 1., 1.)); @@ -542,9 +514,9 @@ Vec3d Camera::validate_target(const Vec3d& target) const test_box.scale(ScaleFactor); test_box.translate(m_scene_box.center()); - return Vec3d(std::clamp(target(0), test_box.min(0), test_box.max(0)), - std::clamp(target(1), test_box.min(1), test_box.max(1)), - std::clamp(target(2), test_box.min(2), test_box.max(2))); + return { std::clamp(target(0), test_box.min(0), test_box.max(0)), + std::clamp(target(1), test_box.min(1), test_box.max(1)), + std::clamp(target(2), test_box.min(2), test_box.max(2)) }; } void Camera::update_zenit() diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 574a6eed76..1abb430ca9 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -26,7 +26,7 @@ struct Camera Num_types }; - bool requires_zoom_to_bed; + bool requires_zoom_to_bed{ false }; private: EType m_type{ Perspective }; @@ -48,13 +48,13 @@ private: BoundingBoxf3 m_scene_box; public: - Camera(); + Camera() { set_default_orientation(); } EType get_type() const { return m_type; } std::string get_type_as_string() const; void set_type(EType type); // valid values for type: "0" -> ortho, "1" -> perspective - void set_type(const std::string& type); + void set_type(const std::string& type) { set_type((type == "1") ? Perspective : Ortho); } void select_next_type(); void enable_update_config_on_type_change(bool enable) { m_update_config_on_type_change_enabled = enable; } @@ -67,7 +67,7 @@ public: double get_zoom() const { return m_zoom; } double get_inv_zoom() const { assert(m_zoom != 0.0); return 1.0 / m_zoom; } - void update_zoom(double delta_zoom); + void update_zoom(double delta_zoom) { set_zoom(m_zoom / (1.0 - std::max(std::min(delta_zoom, 4.0), -4.0) * 0.1)); } void set_zoom(double zoom); const BoundingBoxf3& get_scene_box() const { return m_scene_box; } @@ -127,7 +127,7 @@ public: void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); double max_zoom() const { return 250.0; } - double min_zoom() const; + double min_zoom() const { return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); } private: // returns tight values for nearZ and farZ plane around the given bounding box From 4c464b35f97441985b0e3ee6f12d5ee62ad07261 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 15:25:03 +0200 Subject: [PATCH 32/57] Removed mutable members from class Selection --- src/slic3r/GUI/Selection.cpp | 88 ++++++++++++++++-------------------- src/slic3r/GUI/Selection.hpp | 14 +++--- 2 files changed, 45 insertions(+), 57 deletions(-) diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index faf25ff8bc..2acb8cb85b 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1102,39 +1102,32 @@ void Selection::erase() if (is_single_full_object()) wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itObject, get_object_idx(), 0); - else if (is_multiple_full_object()) - { + else if (is_multiple_full_object()) { std::vector items; items.reserve(m_cache.content.size()); - for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) - { + for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) { items.emplace_back(ItemType::itObject, it->first, 0); } wxGetApp().obj_list()->delete_from_model_and_list(items); } - else if (is_multiple_full_instance()) - { + else if (is_multiple_full_instance()) { std::set> instances_idxs; - for (ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.begin(); obj_it != m_cache.content.end(); ++obj_it) - { - for (InstanceIdxsList::reverse_iterator inst_it = obj_it->second.rbegin(); inst_it != obj_it->second.rend(); ++inst_it) - { + for (ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.begin(); obj_it != m_cache.content.end(); ++obj_it) { + for (InstanceIdxsList::reverse_iterator inst_it = obj_it->second.rbegin(); inst_it != obj_it->second.rend(); ++inst_it) { instances_idxs.insert(std::make_pair(obj_it->first, *inst_it)); } } std::vector items; items.reserve(instances_idxs.size()); - for (const std::pair& i : instances_idxs) - { + for (const std::pair& i : instances_idxs) { items.emplace_back(ItemType::itInstance, i.first, i.second); } wxGetApp().obj_list()->delete_from_model_and_list(items); } else if (is_single_full_instance()) wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itInstance, get_object_idx(), get_instance_idx()); - else if (is_mixed()) - { + else if (is_mixed()) { std::set items_set; std::map volumes_in_obj; @@ -1186,11 +1179,9 @@ void Selection::erase() wxGetApp().obj_list()->delete_from_model_and_list(items); } - else - { + else { std::set> volumes_idxs; - for (unsigned int i : m_list) - { + for (unsigned int i : m_list) { const GLVolume* v = (*m_volumes)[i]; // Only remove volumes associated with ModelVolumes from the object list. // Temporary meshes (SLA supports or pads) are not managed by the object list. @@ -1200,8 +1191,7 @@ void Selection::erase() std::vector items; items.reserve(volumes_idxs.size()); - for (const std::pair& v : volumes_idxs) - { + for (const std::pair& v : volumes_idxs) { items.emplace_back(ItemType::itVolume, v.first, v.second); } @@ -1214,7 +1204,7 @@ void Selection::render(float scale_factor) const if (!m_valid || is_empty()) return; - m_scale_factor = scale_factor; + *const_cast(&m_scale_factor) = scale_factor; // render cumulative bounding box of selected volumes render_selected_volumes(); @@ -1224,7 +1214,7 @@ void Selection::render(float scale_factor) const #if ENABLE_RENDER_SELECTION_CENTER void Selection::render_center(bool gizmo_is_dragging) const { - if (!m_valid || is_empty() || (m_quadric == nullptr)) + if (!m_valid || is_empty() || m_quadric == nullptr) return; Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center(); @@ -1250,8 +1240,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) const GLShaderProgram* shader = nullptr; - if (!boost::starts_with(sidebar_field, "layer")) - { + if (!boost::starts_with(sidebar_field, "layer")) { shader = wxGetApp().get_shader("gouraud_light"); if (shader == nullptr) return; @@ -1735,18 +1724,16 @@ void Selection::do_remove_volume(unsigned int volume_idx) void Selection::do_remove_instance(unsigned int object_idx, unsigned int instance_idx) { - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) { GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == (int)object_idx) && (v->instance_idx() == (int)instance_idx)) + if (v->object_idx() == (int)object_idx && v->instance_idx() == (int)instance_idx) do_remove_volume(i); } } void Selection::do_remove_object(unsigned int object_idx) { - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) { GLVolume* v = (*m_volumes)[i]; if (v->object_idx() == (int)object_idx) do_remove_volume(i); @@ -1755,47 +1742,48 @@ void Selection::do_remove_object(unsigned int object_idx) void Selection::calc_bounding_box() const { - m_bounding_box = BoundingBoxf3(); - if (m_valid) - { - for (unsigned int i : m_list) - { - m_bounding_box.merge((*m_volumes)[i]->transformed_convex_hull_bounding_box()); + BoundingBoxf3* bounding_box = const_cast(&m_bounding_box); + *bounding_box = BoundingBoxf3(); + if (m_valid) { + for (unsigned int i : m_list) { + bounding_box->merge((*m_volumes)[i]->transformed_convex_hull_bounding_box()); } } - m_bounding_box_dirty = false; + *const_cast(&m_bounding_box_dirty) = false; } void Selection::calc_unscaled_instance_bounding_box() const { - m_unscaled_instance_bounding_box = BoundingBoxf3(); - if (m_valid) { - for (unsigned int i : m_list) { - const GLVolume &volume = *(*m_volumes)[i]; + BoundingBoxf3* unscaled_instance_bounding_box = const_cast(&m_unscaled_instance_bounding_box); + *unscaled_instance_bounding_box = BoundingBoxf3(); + if (m_valid) { + for (unsigned int i : m_list) { + const GLVolume& volume = *(*m_volumes)[i]; if (volume.is_modifier) continue; - Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, true, false) * volume.get_volume_transformation().get_matrix(); - trafo.translation()(2) += volume.get_sla_shift_z(); - m_unscaled_instance_bounding_box.merge(volume.transformed_convex_hull_bounding_box(trafo)); - } - } - m_unscaled_instance_bounding_box_dirty = false; + Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, true, false) * volume.get_volume_transformation().get_matrix(); + trafo.translation()(2) += volume.get_sla_shift_z(); + unscaled_instance_bounding_box->merge(volume.transformed_convex_hull_bounding_box(trafo)); + } + } + *const_cast(&m_unscaled_instance_bounding_box_dirty) = false; } void Selection::calc_scaled_instance_bounding_box() const { - m_scaled_instance_bounding_box = BoundingBoxf3(); + BoundingBoxf3* scaled_instance_bounding_box = const_cast(&m_scaled_instance_bounding_box); + *scaled_instance_bounding_box = BoundingBoxf3(); if (m_valid) { for (unsigned int i : m_list) { - const GLVolume &volume = *(*m_volumes)[i]; + const GLVolume& volume = *(*m_volumes)[i]; if (volume.is_modifier) continue; Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, false, false) * volume.get_volume_transformation().get_matrix(); trafo.translation()(2) += volume.get_sla_shift_z(); - m_scaled_instance_bounding_box.merge(volume.transformed_convex_hull_bounding_box(trafo)); + scaled_instance_bounding_box->merge(volume.transformed_convex_hull_bounding_box(trafo)); } } - m_scaled_instance_bounding_box_dirty = false; + *const_cast(&m_scaled_instance_bounding_box_dirty) = false; } void Selection::render_selected_volumes() const diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index a9095adcbf..8bb418baac 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -206,14 +206,14 @@ private: IndicesList m_list; Cache m_cache; Clipboard m_clipboard; - mutable BoundingBoxf3 m_bounding_box; - mutable bool m_bounding_box_dirty; + BoundingBoxf3 m_bounding_box; + bool m_bounding_box_dirty; // Bounding box of a selection, with no instance scaling applied. This bounding box // is useful for absolute scaling of tilted objects in world coordinate space. - mutable BoundingBoxf3 m_unscaled_instance_bounding_box; - mutable bool m_unscaled_instance_bounding_box_dirty; - mutable BoundingBoxf3 m_scaled_instance_bounding_box; - mutable bool m_scaled_instance_bounding_box_dirty; + BoundingBoxf3 m_unscaled_instance_bounding_box; + bool m_unscaled_instance_bounding_box_dirty; + BoundingBoxf3 m_scaled_instance_bounding_box; + bool m_scaled_instance_bounding_box_dirty; #if ENABLE_RENDER_SELECTION_CENTER GLUquadricObj* m_quadric; @@ -222,7 +222,7 @@ private: GLModel m_arrow; GLModel m_curved_arrow; - mutable float m_scale_factor; + float m_scale_factor; public: Selection(); From 4da8de5f4909a77ca3d07e3b6540f50508f969c3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 16 Apr 2021 15:49:37 +0200 Subject: [PATCH 33/57] Removed mutable members from class GLToolbar --- src/slic3r/GUI/GLToolbar.cpp | 90 ++++++++++++++---------------------- src/slic3r/GUI/GLToolbar.hpp | 6 +-- 2 files changed, 38 insertions(+), 58 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 79e7ea1c64..0e6a4ce291 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -428,8 +428,7 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) bool processed = false; // mouse anywhere - if (!evt.Dragging() && !evt.Leaving() && !evt.Entering() && (m_mouse_capture.parent != nullptr)) - { + if (!evt.Dragging() && !evt.Leaving() && !evt.Entering() && m_mouse_capture.parent != nullptr) { if (m_mouse_capture.any() && (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())) { // prevents loosing selection into the scene if mouse down was done inside the toolbar and mouse up was down outside it, // as when switching between views @@ -441,38 +440,31 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) if (evt.Moving()) update_hover_state(mouse_pos, parent); - else if (evt.LeftUp()) - { - if (m_mouse_capture.left) - { + else if (evt.LeftUp()) { + if (m_mouse_capture.left) { processed = true; m_mouse_capture.left = false; } else return false; } - else if (evt.MiddleUp()) - { - if (m_mouse_capture.middle) - { + else if (evt.MiddleUp()) { + if (m_mouse_capture.middle) { processed = true; m_mouse_capture.middle = false; } else return false; } - else if (evt.RightUp()) - { - if (m_mouse_capture.right) - { + else if (evt.RightUp()) { + if (m_mouse_capture.right) { processed = true; m_mouse_capture.right = false; } else return false; } - else if (evt.Dragging()) - { + else if (evt.Dragging()) { if (m_mouse_capture.any()) // if the button down was done on this toolbar, prevent from dragging into the scene processed = true; @@ -481,35 +473,29 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) } int item_id = contains_mouse(mouse_pos, parent); - if (item_id != -1) - { + if (item_id != -1) { // mouse inside toolbar - if (evt.LeftDown() || evt.LeftDClick()) - { + if (evt.LeftDown() || evt.LeftDClick()) { m_mouse_capture.left = true; m_mouse_capture.parent = &parent; processed = true; - if ((item_id != -2) && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() && - ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Left))) - { + if (item_id != -2 && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() && + (m_pressed_toggable_id == -1 || m_items[item_id]->get_last_action_type() == GLToolbarItem::Left)) { // mouse is inside an icon do_action(GLToolbarItem::Left, item_id, parent, true); parent.set_as_dirty(); } } - else if (evt.MiddleDown()) - { + else if (evt.MiddleDown()) { m_mouse_capture.middle = true; m_mouse_capture.parent = &parent; } - else if (evt.RightDown()) - { + else if (evt.RightDown()) { m_mouse_capture.right = true; m_mouse_capture.parent = &parent; processed = true; - if ((item_id != -2) && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() && - ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Right))) - { + if (item_id != -2 && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() && + (m_pressed_toggable_id == -1 || m_items[item_id]->get_last_action_type() == GLToolbarItem::Right)) { // mouse is inside an icon do_action(GLToolbarItem::Right, item_id, parent, true); parent.set_as_dirty(); @@ -522,24 +508,26 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) void GLToolbar::calc_layout() const { - switch (m_layout.type) + Layout* layout = const_cast(&m_layout); + + switch (layout->type) { default: case Layout::Horizontal: { - m_layout.width = get_width_horizontal(); - m_layout.height = get_height_horizontal(); + layout->width = get_width_horizontal(); + layout->height = get_height_horizontal(); break; } case Layout::Vertical: { - m_layout.width = get_width_vertical(); - m_layout.height = get_height_vertical(); + layout->width = get_width_vertical(); + layout->height = get_height_vertical(); break; } } - m_layout.dirty = false; + layout->dirty = false; } float GLToolbar::get_width_horizontal() const @@ -1196,19 +1184,17 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const left += scaled_border; top -= scaled_border; - if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) + if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) return; // renders icons - for (const GLToolbarItem* item : m_items) - { + for (const GLToolbarItem* item : m_items) { if (!item->is_visible()) continue; if (item->is_separator()) top -= separator_stride; - else - { + else { item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); top -= icon_stride; } @@ -1219,16 +1205,14 @@ bool GLToolbar::generate_icons_texture() const { std::string path = resources_dir() + "/icons/"; std::vector filenames; - for (GLToolbarItem* item : m_items) - { + for (GLToolbarItem* item : m_items) { const std::string& icon_filename = item->get_icon_filename(); if (!icon_filename.empty()) filenames.push_back(path + icon_filename); } std::vector> states; - if (m_type == Normal) - { + if (m_type == Normal) { states.push_back({ 1, false }); // Normal states.push_back({ 0, false }); // Pressed states.push_back({ 2, false }); // Disabled @@ -1236,8 +1220,7 @@ bool GLToolbar::generate_icons_texture() const states.push_back({ 0, false }); // HoverPressed states.push_back({ 2, false }); // HoverDisabled } - else - { + else { states.push_back({ 1, false }); // Normal states.push_back({ 1, true }); // Pressed states.push_back({ 1, false }); // Disabled @@ -1251,9 +1234,9 @@ bool GLToolbar::generate_icons_texture() const // if (sprite_size_px % 2 != 0) // sprite_size_px += 1; - bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, sprite_size_px, false); + bool res = const_cast(&m_icons_texture)->load_from_svg_files_as_sprites_array(filenames, states, sprite_size_px, false); if (res) - m_icons_texture_dirty = false; + *const_cast(&m_icons_texture_dirty) = false; return res; } @@ -1262,8 +1245,7 @@ bool GLToolbar::update_items_visibility() { bool ret = false; - for (GLToolbarItem* item : m_items) - { + for (GLToolbarItem* item : m_items) { ret |= item->update_visibility(); } @@ -1272,12 +1254,10 @@ bool GLToolbar::update_items_visibility() // updates separators visibility to avoid having two of them consecutive bool any_item_visible = false; - for (GLToolbarItem* item : m_items) - { + for (GLToolbarItem* item : m_items) { if (!item->is_separator()) any_item_visible |= item->is_visible(); - else - { + else { item->set_visible(any_item_visible); any_item_visible = false; } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 74e18de975..3237c44953 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -233,10 +233,10 @@ private: EType m_type; std::string m_name; bool m_enabled; - mutable GLTexture m_icons_texture; - mutable bool m_icons_texture_dirty; + GLTexture m_icons_texture; + bool m_icons_texture_dirty; BackgroundTexture m_background_texture; - mutable Layout m_layout; + Layout m_layout; ItemsList m_items; From 2ffcf97be155c3f2060c19958e40f08b86710a78 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Fri, 16 Apr 2021 19:30:33 +0200 Subject: [PATCH 34/57] creality.ini: more accurate spool weights for Devil Design I just noticed Devil Design uses identical spools to Extrudr NX-2 --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 80c76932d0..9771e7ac6c 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -637,7 +637,7 @@ first_layer_bed_temperature = 60 filament_cost = 19.00 filament_density = 1.24 filament_colour = #FF0000 -filament_spool_weight = 250 +filament_spool_weight = 256 [filament:Devil Design PLA (Galaxy) @CREALITY] inherits = *PLA* @@ -649,7 +649,7 @@ first_layer_bed_temperature = 65 filament_cost = 19.00 filament_density = 1.24 filament_colour = #FF0000 -filament_spool_weight = 250 +filament_spool_weight = 256 [filament:Extrudr PLA NX2 @CREALITY] inherits = *PLA* From d33cffdd1e196bc29354b9eeb7a2f4289522c106 Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Fri, 16 Apr 2021 19:32:32 +0200 Subject: [PATCH 35/57] creality.ini: remove parentheses for galaxy pla filament since we've not using those for other filament subtypes --- resources/profiles/Creality.ini | 61 +++++++++++++++++---------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 9771e7ac6c..95ce8a0dce 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 (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 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: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 (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 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:ENDER3V2] name = Creality Ender-3 V2 @@ -39,7 +39,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 (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 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:ENDER3MAX] name = Creality Ender-3 Max @@ -48,7 +48,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 (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 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:ENDER4] name = Creality Ender-4 @@ -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 (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 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:ENDER5] name = Creality Ender-5 @@ -66,7 +66,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 (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 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:ENDER5PLUS] name = Creality Ender-5 Plus @@ -75,7 +75,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 (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 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:ENDER6] name = Creality Ender-6 @@ -84,7 +84,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 (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 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:ENDER2] name = Creality Ender-2 @@ -93,7 +93,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 (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 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:CR5PRO] name = Creality CR-5 Pro @@ -102,7 +102,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 (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 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:CR5PROH] name = Creality CR-5 Pro H @@ -111,7 +111,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 (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 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:CR6SE] name = Creality CR-6 SE @@ -120,7 +120,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 (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 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:CR6MAX] name = Creality CR-6 Max @@ -129,7 +129,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 (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 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:CR10MINI] name = Creality CR-10 Mini @@ -138,7 +138,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 (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 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:CR10MAX] name = Creality CR-10 Max @@ -147,7 +147,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 (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 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:CR10] name = Creality CR-10 @@ -156,7 +156,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 (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 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:CR10V2] name = Creality CR-10 V2 @@ -165,7 +165,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 (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 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:CR10V3] name = Creality CR-10 V3 @@ -174,7 +174,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 (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 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:CR10S] name = Creality CR-10 S @@ -183,7 +183,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 (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 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:CR10SPRO] name = Creality CR-10 S Pro @@ -192,7 +192,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 (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 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:CR10SPROV2] name = Creality CR-10 S Pro V2 @@ -201,7 +201,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 (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 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:CR10S4] name = Creality CR-10 S4 @@ -210,7 +210,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 (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 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:CR10S5] name = Creality CR-10 S5 @@ -219,7 +219,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 (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 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:CR20] name = Creality CR-20 @@ -228,7 +228,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 (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 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:CR20PRO] name = Creality CR-20 Pro @@ -237,7 +237,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 (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 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:CR200B] name = Creality CR-200B @@ -246,7 +246,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 (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 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:CR8] name = Creality CR-8 @@ -255,7 +255,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 (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 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:CRX] #name = Creality CR-X @@ -264,7 +264,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 (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 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:CRXPRO] #name = Creality CR-X Pro @@ -273,7 +273,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 (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 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 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -639,8 +639,9 @@ filament_density = 1.24 filament_colour = #FF0000 filament_spool_weight = 256 -[filament:Devil Design PLA (Galaxy) @CREALITY] +[filament:Devil Design PLA Galaxy @CREALITY] inherits = *PLA* +renamed_from = "Devil Design PLA (Galaxy) @CREALITY" filament_vendor = Devil Design temperature = 225 bed_temperature = 65 From 321a2b7639d70217bd12c8efc242409f0dec4991 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 19 Apr 2021 15:48:07 +0200 Subject: [PATCH 36/57] Disabled thick bridges, updated support settings. Bundle refactoring. --- resources/profiles/PrusaResearch.idx | 320 ++-- resources/profiles/PrusaResearch.ini | 2072 ++++++++++---------------- 2 files changed, 964 insertions(+), 1428 deletions(-) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 8c14026ce1..dc3c79cd55 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,159 +1,161 @@ -min_slic3r_version = 2.3.0-rc1 -1.2.4 Updated cost/density values in filament settings. Various changes in print settings. -1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles. -1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. -1.2.1 Updated FW version for MK2.5 family printers. -1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version. -min_slic3r_version = 2.3.0-beta2 -1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values. -min_slic3r_version = 2.3.0-beta0 -1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights. -min_slic3r_version = 2.3.0-alpha4 -1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. -1.2.0-alpha0 Added filament spool weights -min_slic3r_version = 2.2.0-alpha3 -1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles. -1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. -1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. -1.1.10 Updated firmware version. -1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. -1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. -1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. -1.1.6 Updated firmware version for MK2.5/S and MK3/S. -1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend -1.1.4 Added Prusament PC Blend filament profile. -1.1.3 Added SLA material and filament profile -1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. -1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. -1.1.1-beta Updated for PrusaSlicer 2.2.0-beta -1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc -1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. -# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, -# so they will see the print bed. -max_slic3r_version = 2.2.0-alpha2 -min_slic3r_version = 2.2.0-alpha0 -1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. -1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 -min_slic3r_version = 2.1.1-beta0 -1.0.11 Updated firmware version. -1.0.10 Updated firmware version for MK2.5/S and MK3/S. -1.0.9 Updated firmware version for MK2.5/S and MK3/S. -1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. -1.0.7 Updated layer height limits for MINI -1.0.6 Added Prusa MINI profiles -min_slic3r_version = 2.1.0-alpha0 -1.0.5 Added SLA materials -1.0.4 Updated firmware version and 0.25mm nozzle profiles -1.0.3 Added filament profiles -1.0.2 Added SLA materials -1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers. -1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports. -1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament. -1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times -1.0.0-alpha2 Printer model and nozzle diameter check -1.0.0-alpha1 Added Prusament ASA profile -1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX -min_slic3r_version = 1.42.0-alpha6 -0.8.10 Updated firmware version. -0.8.9 Updated firmware version for MK2.5/S and MK3/S. -0.8.8 Updated firmware version for MK2.5/S and MK3/S. -0.8.7 Updated firmware version -0.8.6 Updated firmware version for MK2.5/S and MK3/S -0.8.5 Updated SL1 printer and material settings -0.8.4 Added Prusament ASA profile -0.8.3 FW version and SL1 materials update -0.8.2 FFF and SL1 settings update -0.8.1 Output settings and SLA materials update -0.8.0 Updated for the PrusaSlicer 2.0.0 final release -0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S -0.8.0-rc1 Updated SLA profiles -0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release -0.8.0-beta4 Updated SLA profiles -0.8.0-beta3 Updated SLA profiles -0.8.0-beta2 Updated SLA profiles -0.8.0-beta1 Updated SLA profiles -0.8.0-beta Updated SLA profiles -0.8.0-alpha9 Updated SLA and FFF profiles -0.8.0-alpha8 Updated SLA profiles -0.8.0-alpha7 Updated SLA profiles -0.8.0-alpha6 Updated SLA profiles -min_slic3r_version = 1.42.0-alpha -0.8.0-alpha Updated SLA profiles -0.4.0-alpha4 Updated SLA profiles -0.4.0-alpha3 Update of SLA profiles -0.4.0-alpha2 First SLA profiles -min_slic3r_version = 1.41.3-alpha -0.4.12 Updated firmware version for MK2.5/S and MK3/S. -0.4.11 Updated firmware version for MK2.5/S and MK3/S. -0.4.10 Updated firmware version -0.4.9 Updated firmware version for MK2.5/S and MK3/S -0.4.8 MK2.5/3/S FW update -0.4.7 MK2/S/MMU FW update -0.4.6 Updated firmware versions for MK2.5/S and MK3/S -0.4.5 Enabled remaining time support for MK2/S/MMU1 -0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.4.1 New MK2.5S and MK3S FW versions -0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -min_slic3r_version = 1.41.1 -0.3.11 Updated firmware version for MK2.5/S and MK3/S. -0.3.10 Updated firmware version -0.3.9 Updated firmware version for MK2.5/S and MK3/S -0.3.8 MK2.5/3/S FW update -0.3.7 MK2/S/MMU FW update -0.3.6 Updated firmware versions for MK2.5 and MK3 -0.3.5 New MK2.5 and MK3 FW versions -0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt -0.3.3 Prusament PETG released -0.3.2 New MK2.5 and MK3 FW versions -0.3.1 New MK2.5 and MK3 FW versions -0.3.0 New MK2.5 and MK3 FW version -min_slic3r_version = 1.41.0-alpha -0.2.9 New MK2.5 and MK3 FW versions -0.2.8 New MK2.5 and MK3 FW version -min_slic3r_version = 1.41.1 -0.2.7 New MK2.5 and MK3 FW version -0.2.6 Added MMU2 MK2.5 settings -min_slic3r_version = 1.41.0-alpha -0.2.5 Prusament is out - added prusament settings -0.2.4 Added soluble support profiles for MMU2 -0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit -0.2.2 Edited MMU2 Single mode purge line -0.2.1 Added PET and BVOH settings for MMU2 -0.2.0-beta5 Fixed MMU1 ramming parameters -0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower -0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2 -0.2.0-beta2 Edited first layer speed and wipe tower position -0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles -0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets. -0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references -0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version -0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2 -0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers. -0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost -0.2.0-alpha2 Renamed the key MK3SMMU to MK3MMU2, added a generic PLA MMU2 material -0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0 -0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters -min_slic3r_version = 1.40.0 -0.1.18 Updated firmware version -0.1.17 Updated firmware version for MK2.5/S and MK3/S -0.1.16 MK2.5/3/S FW update -0.1.15 MK2/S/MMU FW update -0.1.14 Updated firmware versions for MK2.5 and MK3 -0.1.13 New MK2.5 and MK3 FW versions -0.1.12 New MK2.5 and MK3 FW versions -0.1.11 fw version changed to 3.3.1 -0.1.10 MK3 jerk and acceleration update -0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles -0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes -0.1.7 Fixed errors in 0.25mm and 0.6mm profiles -0.1.6 Split the MK2.5 profile from the MK2S -min_slic3r_version = 1.40.0-beta -0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles -0.1.4 edited fw version, added z-raise after print -min_slic3r_version = 1.40.0-alpha -0.1.3 Fixed an incorrect position of the max_print_height parameter -0.1.2 Wipe tower changes -0.1.1 Minor print speed adjustments -0.1.0 Initial +min_slic3r_version = 2.4.0-alpha0 +1.3.0-alpha0 Disabled thick bridges, updated support settings. +min_slic3r_version = 2.3.0-rc1 +1.2.4 Updated cost/density values in filament settings. Various changes in print settings. +1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles. +1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. +1.2.1 Updated FW version for MK2.5 family printers. +1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version. +min_slic3r_version = 2.3.0-beta2 +1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values. +min_slic3r_version = 2.3.0-beta0 +1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights. +min_slic3r_version = 2.3.0-alpha4 +1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. +1.2.0-alpha0 Added filament spool weights +min_slic3r_version = 2.2.0-alpha3 +1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles. +1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles. +1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles. +1.1.10 Updated firmware version. +1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. +1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. +1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. +1.1.6 Updated firmware version for MK2.5/S and MK3/S. +1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend +1.1.4 Added Prusament PC Blend filament profile. +1.1.3 Added SLA material and filament profile +1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. +1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. +1.1.1-beta Updated for PrusaSlicer 2.2.0-beta +1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc +1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +min_slic3r_version = 2.2.0-alpha0 +1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. +1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 +min_slic3r_version = 2.1.1-beta0 +1.0.11 Updated firmware version. +1.0.10 Updated firmware version for MK2.5/S and MK3/S. +1.0.9 Updated firmware version for MK2.5/S and MK3/S. +1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. +1.0.7 Updated layer height limits for MINI +1.0.6 Added Prusa MINI profiles +min_slic3r_version = 2.1.0-alpha0 +1.0.5 Added SLA materials +1.0.4 Updated firmware version and 0.25mm nozzle profiles +1.0.3 Added filament profiles +1.0.2 Added SLA materials +1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers. +1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports. +1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament. +1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times +1.0.0-alpha2 Printer model and nozzle diameter check +1.0.0-alpha1 Added Prusament ASA profile +1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX +min_slic3r_version = 1.42.0-alpha6 +0.8.10 Updated firmware version. +0.8.9 Updated firmware version for MK2.5/S and MK3/S. +0.8.8 Updated firmware version for MK2.5/S and MK3/S. +0.8.7 Updated firmware version +0.8.6 Updated firmware version for MK2.5/S and MK3/S +0.8.5 Updated SL1 printer and material settings +0.8.4 Added Prusament ASA profile +0.8.3 FW version and SL1 materials update +0.8.2 FFF and SL1 settings update +0.8.1 Output settings and SLA materials update +0.8.0 Updated for the PrusaSlicer 2.0.0 final release +0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S +0.8.0-rc1 Updated SLA profiles +0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release +0.8.0-beta4 Updated SLA profiles +0.8.0-beta3 Updated SLA profiles +0.8.0-beta2 Updated SLA profiles +0.8.0-beta1 Updated SLA profiles +0.8.0-beta Updated SLA profiles +0.8.0-alpha9 Updated SLA and FFF profiles +0.8.0-alpha8 Updated SLA profiles +0.8.0-alpha7 Updated SLA profiles +0.8.0-alpha6 Updated SLA profiles +min_slic3r_version = 1.42.0-alpha +0.8.0-alpha Updated SLA profiles +0.4.0-alpha4 Updated SLA profiles +0.4.0-alpha3 Update of SLA profiles +0.4.0-alpha2 First SLA profiles +min_slic3r_version = 1.41.3-alpha +0.4.12 Updated firmware version for MK2.5/S and MK3/S. +0.4.11 Updated firmware version for MK2.5/S and MK3/S. +0.4.10 Updated firmware version +0.4.9 Updated firmware version for MK2.5/S and MK3/S +0.4.8 MK2.5/3/S FW update +0.4.7 MK2/S/MMU FW update +0.4.6 Updated firmware versions for MK2.5/S and MK3/S +0.4.5 Enabled remaining time support for MK2/S/MMU1 +0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.1 New MK2.5S and MK3S FW versions +0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +min_slic3r_version = 1.41.1 +0.3.11 Updated firmware version for MK2.5/S and MK3/S. +0.3.10 Updated firmware version +0.3.9 Updated firmware version for MK2.5/S and MK3/S +0.3.8 MK2.5/3/S FW update +0.3.7 MK2/S/MMU FW update +0.3.6 Updated firmware versions for MK2.5 and MK3 +0.3.5 New MK2.5 and MK3 FW versions +0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.3.3 Prusament PETG released +0.3.2 New MK2.5 and MK3 FW versions +0.3.1 New MK2.5 and MK3 FW versions +0.3.0 New MK2.5 and MK3 FW version +min_slic3r_version = 1.41.0-alpha +0.2.9 New MK2.5 and MK3 FW versions +0.2.8 New MK2.5 and MK3 FW version +min_slic3r_version = 1.41.1 +0.2.7 New MK2.5 and MK3 FW version +0.2.6 Added MMU2 MK2.5 settings +min_slic3r_version = 1.41.0-alpha +0.2.5 Prusament is out - added prusament settings +0.2.4 Added soluble support profiles for MMU2 +0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit +0.2.2 Edited MMU2 Single mode purge line +0.2.1 Added PET and BVOH settings for MMU2 +0.2.0-beta5 Fixed MMU1 ramming parameters +0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower +0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2 +0.2.0-beta2 Edited first layer speed and wipe tower position +0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles +0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets. +0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references +0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version +0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2 +0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers. +0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost +0.2.0-alpha2 Renamed the key MK3SMMU to MK3MMU2, added a generic PLA MMU2 material +0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0 +0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters +min_slic3r_version = 1.40.0 +0.1.18 Updated firmware version +0.1.17 Updated firmware version for MK2.5/S and MK3/S +0.1.16 MK2.5/3/S FW update +0.1.15 MK2/S/MMU FW update +0.1.14 Updated firmware versions for MK2.5 and MK3 +0.1.13 New MK2.5 and MK3 FW versions +0.1.12 New MK2.5 and MK3 FW versions +0.1.11 fw version changed to 3.3.1 +0.1.10 MK3 jerk and acceleration update +0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles +0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes +0.1.7 Fixed errors in 0.25mm and 0.6mm profiles +0.1.6 Split the MK2.5 profile from the MK2S +min_slic3r_version = 1.40.0-beta +0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles +0.1.4 edited fw version, added z-raise after print +min_slic3r_version = 1.40.0-alpha +0.1.3 Fixed an incorrect position of the max_print_height parameter +0.1.2 Wipe tower changes +0.1.1 Minor print speed adjustments +0.1.0 Initial diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 796d578226..16737d1563 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,18 +5,15 @@ name = Prusa Research # 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 = 1.2.4 +config_version = 1.3.0-alpha0 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. -#TODO: One day we may differentiate variants of the nozzles / hot ends, -#for example by the melt zone size, or whether the nozzle is hardened. # Printer model name will be shown by the installation wizard. - [printer_model:MINI] name = Original Prusa MINI && MINI+ variants = 0.4; 0.25; 0.6; 0.8 @@ -128,20 +125,21 @@ default_materials = Prusa Orange Tough @0.05 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. -# Common print preset, mostly derived from MK2 single material with a 0.4mm nozzle. -# All other print presets will derive from the *common* print preset. +# Common print presets + [print:*common*] avoid_crossing_perimeters = 0 +thick_bridges = 0 bridge_acceleration = 1000 bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 +bridge_flow_ratio = 1 +bridge_speed = 25 brim_width = 0 clip_multipart_objects = 1 compatible_printers = complete_objects = 0 default_acceleration = 1000 -dont_support_bridges = 1 +dont_support_bridges = 0 elefant_foot_compensation = 0.2 ensure_vertical_shell_thickness = 1 external_fill_pattern = rectilinear @@ -154,7 +152,7 @@ extrusion_width = 0.45 fill_angle = 45 fill_density = 20% fill_pattern = cubic -first_layer_acceleration = 1000 +first_layer_acceleration = 800 first_layer_extrusion_width = 0.42 first_layer_height = 0.2 first_layer_speed = 20 @@ -183,6 +181,7 @@ perimeter_extrusion_width = 0.45 post_process = print_settings_id = raft_layers = 0 +raft_first_layer_density = 90% resolution = 0 seam_position = nearest single_extruder_multi_material_priming = 1 @@ -203,7 +202,7 @@ support_material_interface_extruder = 0 support_material_angle = 0 support_material_buildplate_only = 0 support_material_enforce_layers = 0 -support_material_contact_distance = 0.1 +support_material_contact_distance = 0.2 support_material_interface_contact_loops = 0 support_material_interface_layers = 2 support_material_interface_spacing = 0.2 @@ -212,9 +211,10 @@ support_material_pattern = rectilinear support_material_spacing = 2 support_material_speed = 50 support_material_synchronize_layers = 0 -support_material_threshold = 55 +support_material_threshold = 50 support_material_with_sheath = 0 -support_material_xy_spacing = 50% +support_material_xy_spacing = 60% +support_material_bottom_interface_layers = 0 thin_walls = 0 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 40 @@ -240,20 +240,15 @@ wipe_tower_x = 170 wipe_tower_y = 125 [print:*MK306*] +inherits = *MK3* fill_pattern = gyroid fill_density = 15% -single_extruder_multi_material_priming = 0 -travel_speed = 180 -wipe_tower_x = 170 -wipe_tower_y = 125 - -## MINI [print:*MINI*] fill_pattern = grid travel_speed = 150 wipe_tower = 0 -default_acceleration = 1250 +default_acceleration = 1000 first_layer_acceleration = 800 infill_acceleration = 1000 bridge_acceleration = 1000 @@ -262,7 +257,6 @@ max_print_speed = 150 extruder_clearance_height = 20 extruder_clearance_radius = 35 -# Print parameters common to a 0.25mm diameter nozzle. [print:*0.25nozzle*] elefant_foot_compensation = 0 external_perimeter_extrusion_width = 0.25 @@ -277,7 +271,11 @@ support_material_interface_layers = 0 support_material_interface_spacing = 0.15 support_material_spacing = 1 support_material_xy_spacing = 150% +support_material_contact_distance = 0.1 output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +thick_bridges = 0 +bridge_flow_ratio = 1 +bridge_speed = 20 [print:*0.25nozzleMK3*] inherits = *0.25nozzle* @@ -288,7 +286,6 @@ infill_speed = 45 solid_infill_speed = 45 top_solid_infill_speed = 30 support_material_speed = 40 -bridge_speed = 20 gap_fill_speed = 30 perimeter_acceleration = 500 infill_acceleration = 1000 @@ -307,7 +304,6 @@ solid_infill_speed = 40 infill_acceleration = 800 first_layer_acceleration = 500 -# Print parameters common to a 0.6mm diameter nozzle. [print:*0.6nozzle*] external_perimeter_extrusion_width = 0.61 extrusion_width = 0.67 @@ -324,6 +320,31 @@ output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_heig infill_anchor_max = 15 top_solid_min_thickness = 0.9 bottom_solid_min_thickness = 0.6 +thick_bridges = 1 +bridge_flow_ratio = 0.95 +bridge_speed = 25 + +[print:*0.6nozzleMK3*] +inherits = *0.6nozzle* +external_perimeter_extrusion_width = 0.65 +extrusion_width = 0.65 +infill_extrusion_width = 0.65 +thick_bridges = 0 + +[print:*0.6nozzleMINI*] +inherits = *0.6nozzleMK3* +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 +fill_pattern = gyroid +fill_density = 15% +travel_speed = 150 +perimeter_acceleration = 800 +infill_acceleration = 1000 +bridge_acceleration = 1000 +first_layer_acceleration = 800 +default_acceleration = 1250 +support_material_speed = 40 +support_material_interface_speed = 100% [print:*0.8nozzle*] external_perimeter_extrusion_width = 0.9 @@ -356,34 +377,12 @@ bridge_flow_ratio = 0.9 perimeter_acceleration = 800 infill_acceleration = 1000 bridge_acceleration = 1000 -first_layer_acceleration = 1000 +first_layer_acceleration = 800 default_acceleration = 1000 top_solid_min_thickness = 1.2 bottom_solid_min_thickness = 0.8 single_extruder_multi_material_priming = 0 - -[print:*0.6nozzleMK3*] -inherits = *0.6nozzle* -external_perimeter_extrusion_width = 0.65 -extrusion_width = 0.65 -infill_extrusion_width = 0.65 -bridge_flow_ratio = 0.95 -bridge_speed = 25 - -[print:*0.6nozzleMINI*] -inherits = *0.6nozzleMK3* -infill_extrusion_width = 0.68 -solid_infill_extrusion_width = 0.68 -fill_pattern = gyroid -fill_density = 15% -travel_speed = 150 -perimeter_acceleration = 800 -infill_acceleration = 1000 -bridge_acceleration = 1000 -first_layer_acceleration = 1000 -default_acceleration = 1250 -support_material_speed = 40 -support_material_interface_speed = 100% +thick_bridges = 1 [print:*soluble_support*] overhangs = 1 @@ -399,29 +398,29 @@ support_material_threshold = 80 support_material_with_sheath = 1 wipe_tower_bridging = 6 support_material_interface_speed = 80% - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.05mm ---XXX -# XXXXXXXXXXXXXXXXXXXX +support_material_bottom_interface_layers = -1 +thick_bridges = 1 [print:*0.05mm*] inherits = *common* +layer_height = 0.05 bottom_solid_layers = 10 bridge_acceleration = 300 -bridge_flow_ratio = 0.7 +bridge_flow_ratio = 1.15 +bridge_speed = 15 default_acceleration = 1000 external_perimeter_speed = 20 fill_density = 20% -first_layer_acceleration = 500 +first_layer_acceleration = 800 gap_fill_speed = 20 infill_acceleration = 800 infill_speed = 30 max_print_speed = 80 small_perimeter_speed = 20 solid_infill_speed = 30 -support_material_extrusion_width = 0.3 +support_material_extrusion_width = 0.33 support_material_spacing = 1.5 -layer_height = 0.05 +support_material_contact_distance = 0.15 perimeter_acceleration = 300 perimeter_speed = 30 perimeters = 3 @@ -429,151 +428,28 @@ support_material_speed = 30 top_solid_infill_speed = 20 top_solid_layers = 15 -[print:0.05mm ULTRADETAIL] -inherits = *0.05mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -infill_extrusion_width = 0.5 - -# MK3 # -[print:0.05mm ULTRADETAIL @MK3] -inherits = *0.05mm*; *MK3* -fill_pattern = gyroid -fill_density = 15% -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material -top_infill_extrusion_width = 0.4 - -# MK2 # -[print:0.05mm ULTRADETAIL @0.25 nozzle] -inherits = *0.05mm*; *0.25nozzle* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -fill_density = 20% -infill_speed = 20 -max_print_speed = 100 -perimeter_speed = 20 -small_perimeter_speed = 15 -solid_infill_speed = 20 -support_material_speed = 20 - -# MK3 # -[print:0.05mm ULTRADETAIL @0.25 nozzle MK3] -inherits = *0.05mm*; *0.25nozzle*; *MK3* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -fill_pattern = grid -fill_density = 20% - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.07mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - [print:*0.07mm*] -inherits = *common* -bottom_solid_layers = 8 -bridge_acceleration = 300 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -default_acceleration = 1000 -external_perimeter_speed = 20 -fill_density = 15% -first_layer_acceleration = 500 -gap_fill_speed = 20 -infill_acceleration = 800 -infill_speed = 40 -max_print_speed = 80 -small_perimeter_speed = 20 -solid_infill_speed = 40 -support_material_extrusion_width = 0.3 -support_material_spacing = 1.5 +inherits = *0.05mm* layer_height = 0.07 -perimeter_acceleration = 300 -perimeter_speed = 30 -perimeters = 3 +bottom_solid_layers = 8 +bridge_flow_ratio = 1 +fill_density = 15% +infill_speed = 40 +solid_infill_speed = 40 support_material_speed = 40 top_solid_infill_speed = 30 top_solid_layers = 11 -# MK3 # -[print:0.07mm ULTRADETAIL @MK3] -inherits = *0.07mm*; *MK3* -fill_pattern = gyroid -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material -top_infill_extrusion_width = 0.4 - -[print:0.07mm ULTRADETAIL @0.25 nozzle MK3] -inherits = *0.07mm*; *0.25nozzle*; *MK3* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -infill_speed = 30 -solid_infill_speed = 30 -support_material_speed = 30 -top_solid_infill_speed = 20 -fill_pattern = grid -fill_density = 20% - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.10mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - -# MK2 # [print:*0.10mm*] inherits = *common* bottom_solid_layers = 7 -bridge_flow_ratio = 0.7 +bridge_flow_ratio = 1 +bridge_speed = 20 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 layer_height = 0.1 perimeter_acceleration = 800 top_solid_layers = 9 - -# MK2 # -[print:0.10mm DETAIL] -inherits = *0.10mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -external_perimeter_speed = 40 -infill_acceleration = 2000 -infill_speed = 60 -perimeter_speed = 50 -solid_infill_speed = 50 -perimeters = 3 - -# MK3 # -[print:0.10mm DETAIL @MK3] -inherits = *0.10mm*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 25 -infill_acceleration = 1000 -infill_speed = 80 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 80 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -fill_pattern = gyroid -fill_density = 15% -perimeters = 3 - -# MK2 # -[print:0.10mm DETAIL @0.25 nozzle] -inherits = *0.10mm*; *0.25nozzle* -bridge_acceleration = 600 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -external_perimeter_speed = 20 -infill_acceleration = 1000 -infill_speed = 40 -perimeter_acceleration = 600 -perimeter_speed = 25 -small_perimeter_speed = 15 -solid_infill_speed = 40 -top_solid_infill_speed = 30 - -# MK3 # -[print:0.10mm DETAIL @0.25 nozzle MK3] -inherits = *0.10mm*; *0.25nozzleMK3*; *MK3* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 -fill_pattern = grid -fill_density = 20% - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.15mm ---XXX -# XXXXXXXXXXXXXXXXXXXX +support_material_contact_distance = 0.17 [print:*0.15mm*] inherits = *common* @@ -587,138 +463,8 @@ perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 top_solid_layers = 7 - -# MK2 # -[print:0.15mm 100mms Linear Advance] -inherits = *0.15mm* -bridge_flow_ratio = 0.95 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 50 -infill_speed = 100 -max_print_speed = 150 -perimeter_speed = 60 -small_perimeter_speed = 30 -solid_infill_speed = 100 -support_material_speed = 60 -top_solid_infill_speed = 70 - -# MK2 # -[print:0.15mm OPTIMAL] -inherits = *0.15mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 -top_infill_extrusion_width = 0.45 - -# MK2 # -[print:0.15mm OPTIMAL @0.25 nozzle] -inherits = *0.15mm*; *0.25nozzle* -bridge_acceleration = 600 -bridge_flow_ratio = 0.7 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -external_perimeter_speed = 20 -infill_acceleration = 1000 -infill_speed = 40 -perimeter_acceleration = 600 -perimeter_speed = 25 -small_perimeter_speed = 15 -solid_infill_speed = 40 -top_solid_infill_speed = 30 - -# MK2 # -[print:0.15mm OPTIMAL @0.6 nozzle] -inherits = *0.15mm*; *0.6nozzle* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 - -# MK3 # -[print:0.15mm QUALITY @MK3] -inherits = *0.15mm*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 25 -infill_acceleration = 1000 -infill_speed = 80 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 80 -top_solid_infill_speed = 40 -fill_pattern = gyroid -fill_density = 15% - -[print:0.15mm SPEED @MK3] -inherits = *0.15mm*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 200 -max_print_speed = 200 -perimeter_speed = 60 -solid_infill_speed = 200 -top_solid_infill_speed = 50 - -# MK3 MMU # -[print:0.15mm SOLUBLE FULL @MK3] -inherits = 0.15mm SPEED @MK3; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -support_material_extruder = 5 -support_material_interface_extruder = 5 -perimeter_speed = 40 -solid_infill_speed = 40 -infill_speed = 80 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -support_material_speed = 45 - -# MK3 MMU # -[print:0.15mm SOLUBLE INTERFACE @MK3] -inherits = 0.15mm SOLUBLE FULL @MK3 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 - -# MK2 MMU # -[print:0.15mm OPTIMAL SOLUBLE FULL] -inherits = *0.15mm*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -external_perimeter_speed = 25 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -perimeter_speed = 40 -solid_infill_speed = 40 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 - -# MK2 MMU # -[print:0.15mm OPTIMAL SOLUBLE INTERFACE] -inherits = 0.15mm OPTIMAL SOLUBLE FULL -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 -support_material_xy_spacing = 80% - -# MK3 # -[print:0.15mm QUALITY @0.25 nozzle MK3] -inherits = *0.15mm*; *0.25nozzleMK3*; *MK3* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 -fill_pattern = grid -fill_density = 20% - -# MK3 # -[print:0.15mm DETAIL @0.6 nozzle MK3] -inherits = *0.15mm*; *0.6nozzleMK3*; *MK306* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 70 -max_print_speed = 100 -perimeter_speed = 45 -solid_infill_speed = 70 -top_solid_infill_speed = 45 - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.20mm ---XXX -# XXXXXXXXXXXXXXXXXXXX +bridge_flow_ratio = 1 +bridge_speed = 25 [print:*0.20mm*] inherits = *common* @@ -734,114 +480,6 @@ solid_infill_speed = 50 top_infill_extrusion_width = 0.4 top_solid_layers = 5 -# MK2 # -[print:0.20mm 100mms Linear Advance] -inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 50 -infill_speed = 100 -max_print_speed = 150 -perimeter_speed = 60 -small_perimeter_speed = 30 -solid_infill_speed = 100 -support_material_speed = 60 -top_solid_infill_speed = 70 - -# MK3 # -[print:0.20mm QUALITY @MK3] -inherits = *0.20mm*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 25 -infill_acceleration = 1000 -infill_speed = 80 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 80 -top_solid_infill_speed = 40 -fill_pattern = gyroid -fill_density = 15% - -[print:0.20mm SPEED @MK3] -inherits = *0.20mm*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 200 -max_print_speed = 200 -perimeter_speed = 60 -solid_infill_speed = 200 -top_solid_infill_speed = 50 - -# MK3 MMU # -[print:0.20mm SOLUBLE FULL @MK3] -inherits = 0.20mm SPEED @MK3; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -support_material_extruder = 5 -support_material_interface_extruder = 5 -perimeter_speed = 40 -solid_infill_speed = 40 -infill_speed = 80 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -support_material_speed = 45 - -# MK3 MMU # -[print:0.20mm SOLUBLE INTERFACE @MK3] -inherits = 0.20mm SOLUBLE FULL @MK3 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 - -# MK2 # -[print:0.20mm NORMAL] -inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 - -# MK2 # -[print:0.20mm NORMAL @0.6 nozzle] -inherits = *0.20mm*; *0.6nozzle* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 - -# MK2 MMU # -[print:0.20mm NORMAL SOLUBLE FULL] -inherits = *0.20mm*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -external_perimeter_speed = 30 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -perimeter_speed = 40 -solid_infill_speed = 40 -top_solid_infill_speed = 30 - -# MK2 MMU # -[print:0.20mm NORMAL SOLUBLE INTERFACE] -inherits = 0.20mm NORMAL SOLUBLE FULL -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 -support_material_xy_spacing = 80% - -# MK3 # -[print:0.20mm DETAIL @0.6 nozzle MK3] -inherits = *0.20mm*; *0.6nozzleMK3*; *MK306* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 70 -max_print_speed = 100 -perimeter_speed = 45 -solid_infill_speed = 70 -top_solid_infill_speed = 45 - - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.25mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - [print:*0.25mm*] inherits = *common* bottom_solid_layers = 4 @@ -852,10 +490,6 @@ layer_height = 0.25 perimeter_speed = 50 top_solid_layers = 4 -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.30mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - [print:*0.30mm*] inherits = *common* bottom_solid_layers = 4 @@ -869,65 +503,7 @@ perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 top_solid_layers = 4 - -[print:0.30mm QUALITY @0.6 nozzle MK3] -inherits = *0.30mm*; *0.6nozzleMK3*; *MK306* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 70 -max_print_speed = 100 -perimeter_speed = 45 -solid_infill_speed = 70 -top_solid_infill_speed = 45 - -[print:0.30mm SOLUBLE FULL @0.6 nozzle MK3] -inherits = 0.30mm QUALITY @0.6 nozzle MK3; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -support_material_extruder = 5 -support_material_interface_extruder = 5 -support_material_speed = 40 -perimeter_speed = 40 -solid_infill_speed = 40 -top_infill_extrusion_width = 0.6 -support_material_extrusion_width = 0.6 -top_solid_infill_speed = 30 -support_material_xy_spacing = 80% - -[print:0.30mm SOLUBLE INTERFACE @0.6 nozzle MK3] -inherits = 0.30mm SOLUBLE FULL @0.6 nozzle MK3 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 - -[print:0.30mm DRAFT @MK3] -inherits = *0.30mm*; *MK3* -bottom_solid_layers = 3 -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 85 -max_print_speed = 200 -perimeter_speed = 50 -small_perimeter_speed = 30 -solid_infill_speed = 80 -top_solid_infill_speed = 40 -support_material_speed = 45 -external_perimeter_extrusion_width = 0.6 -extrusion_width = 0.5 -first_layer_extrusion_width = 0.42 -infill_extrusion_width = 0.5 -perimeter_extrusion_width = 0.5 -solid_infill_extrusion_width = 0.5 -top_infill_extrusion_width = 0.45 -support_material_extrusion_width = 0.38 - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.35mm ---XXX -# XXXXXXXXXXXXXXXXXXXX +support_material_contact_distance = 0.3 [print:*0.35mm*] inherits = *common* @@ -946,65 +522,6 @@ solid_infill_speed = 60 top_solid_infill_speed = 50 top_solid_layers = 4 -# MK2 # -[print:0.35mm FAST] -inherits = *0.35mm* -bridge_flow_ratio = 0.95 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 -first_layer_extrusion_width = 0.42 -perimeter_extrusion_width = 0.43 -solid_infill_extrusion_width = 0.7 -top_infill_extrusion_width = 0.43 -support_material_extrusion_width = 0.37 - -# MK2 # -[print:0.35mm FAST @0.6 nozzle] -inherits = *0.35mm*; *0.6nozzle* -# alias = 0.35mm FAST -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 - -# MK2 MMU # -[print:0.35mm FAST sol full @0.6 nozzle] -inherits = *0.35mm*; *0.6nozzle*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_model=="MK2SMM" and nozzle_diameter[0]==0.6 and num_extruders>1 -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder -perimeter_speed = 40 -support_material_speed = 40 -support_material_interface_layers = 2 -support_material_xy_spacing = 120% -top_infill_extrusion_width = 0.6 -support_material_extrusion_width = 0.6 - -# MK2 MMU # -[print:0.35mm FAST sol int @0.6 nozzle] -inherits = 0.35mm FAST sol full @0.6 nozzle -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% - -# MK3 # -[print:0.35mm SPEED @0.6 nozzle MK3] -inherits = *0.35mm*; *0.6nozzleMK3*; *MK306* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 70 -max_print_speed = 100 -perimeter_speed = 45 -solid_infill_speed = 70 -top_solid_infill_speed = 45 -external_perimeter_extrusion_width = 0.68 -perimeter_extrusion_width = 0.68 -infill_extrusion_width = 0.68 -solid_infill_extrusion_width = 0.68 - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.40mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - [print:*0.40mm*] inherits = *common* bottom_solid_layers = 3 @@ -1022,71 +539,236 @@ solid_infill_speed = 60 top_solid_infill_speed = 40 top_solid_layers = 4 -# MK3 # -[print:0.40mm DRAFT @0.6 nozzle MK3] -inherits = *0.40mm*; *0.6nozzleMK3*; *MK306* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1000 -infill_speed = 70 +## MK2 family ## + +## MK2 - 0.4mm nozzle +[print:0.05mm ULTRADETAIL] +inherits = *0.05mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 +infill_extrusion_width = 0.5 + +[print:0.10mm DETAIL] +inherits = *0.10mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +perimeter_speed = 50 +solid_infill_speed = 50 +perimeters = 3 +bridge_acceleration = 800 + +[print:0.15mm 100mms Linear Advance] +inherits = *0.15mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 50 +infill_speed = 100 +max_print_speed = 150 +perimeter_speed = 60 +small_perimeter_speed = 30 +solid_infill_speed = 100 +support_material_speed = 60 +top_solid_infill_speed = 70 + +[print:0.15mm OPTIMAL] +inherits = *0.15mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 +top_infill_extrusion_width = 0.45 + +[print:0.20mm 100mms Linear Advance] +inherits = *0.20mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 50 +infill_speed = 100 +max_print_speed = 150 +perimeter_speed = 60 +small_perimeter_speed = 30 +solid_infill_speed = 100 +support_material_speed = 60 +top_solid_infill_speed = 70 + +[print:0.20mm NORMAL] +inherits = *0.20mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 + +[print:0.35mm FAST] +inherits = *0.35mm* +bridge_flow_ratio = 0.95 +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 +first_layer_extrusion_width = 0.42 +perimeter_extrusion_width = 0.43 +solid_infill_extrusion_width = 0.7 +top_infill_extrusion_width = 0.45 +support_material_extrusion_width = 0.37 +support_material_contact_distance = 0.1 +top_solid_infill_speed = 40 +thick_bridges = 1 + +## MMU1 specific +[print:0.15mm OPTIMAL SOLUBLE FULL] +inherits = *0.15mm*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +external_perimeter_speed = 25 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +perimeter_speed = 40 +solid_infill_speed = 40 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 +bridge_flow_ratio = 0.8 +bridge_speed = 30 + +[print:0.15mm OPTIMAL SOLUBLE INTERFACE] +inherits = 0.15mm OPTIMAL SOLUBLE FULL +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 +support_material_xy_spacing = 80% + +[print:0.20mm NORMAL SOLUBLE FULL] +inherits = *0.20mm*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +external_perimeter_speed = 30 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +perimeter_speed = 40 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +bridge_flow_ratio = 0.95 +bridge_speed = 30 + +[print:0.20mm NORMAL SOLUBLE INTERFACE] +inherits = 0.20mm NORMAL SOLUBLE FULL +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 +support_material_xy_spacing = 80% + +## MK2 - 0.25mm nozzle + +[print:0.05mm ULTRADETAIL @0.25 nozzle] +inherits = *0.05mm*; *0.25nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +fill_density = 20% +infill_speed = 20 max_print_speed = 100 -perimeter_speed = 45 -solid_infill_speed = 70 -top_solid_infill_speed = 45 -external_perimeter_extrusion_width = 0.68 -perimeter_extrusion_width = 0.68 -infill_extrusion_width = 0.68 -solid_infill_extrusion_width = 0.68 +perimeter_speed = 20 +small_perimeter_speed = 15 +solid_infill_speed = 20 +support_material_speed = 20 +support_material_contact_distance = 0.07 -# XXXXXXXXXXXXXXXXXXXXXX -# XXX----- MK2.5 ----XXX -# XXXXXXXXXXXXXXXXXXXXXX +[print:0.10mm DETAIL @0.25 nozzle] +inherits = *0.10mm*; *0.25nozzle* +bridge_acceleration = 600 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 20 +infill_acceleration = 1000 +infill_speed = 40 +perimeter_acceleration = 600 +perimeter_speed = 25 +small_perimeter_speed = 15 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +support_material_contact_distance = 0.07 -# MK2.5 # -[print:0.15mm 100mms Linear Advance @MK2.5] -inherits = 0.15mm 100mms Linear Advance -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 -single_extruder_multi_material_priming = 0 +[print:0.15mm OPTIMAL @0.25 nozzle] +inherits = *0.15mm*; *0.25nozzle* +bridge_acceleration = 600 +bridge_flow_ratio = 0.8 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 20 +infill_acceleration = 1000 +infill_speed = 40 +perimeter_acceleration = 600 +perimeter_speed = 25 +small_perimeter_speed = 15 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +support_material_contact_distance = 0.08 -# MK2.5 # -[print:0.15mm OPTIMAL @MK2.5] -inherits = 0.15mm OPTIMAL -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 -single_extruder_multi_material_priming = 0 +## MK2 - 0.6mm nozzle + +[print:0.15mm OPTIMAL @0.6 nozzle] +inherits = *0.15mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +[print:0.20mm NORMAL @0.6 nozzle] +inherits = *0.20mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +[print:0.35mm FAST @0.6 nozzle] +inherits = *0.35mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +## MMU1 specific +[print:0.35mm FAST sol full @0.6 nozzle] +inherits = *0.35mm*; *0.6nozzle*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_model=="MK2SMM" and nozzle_diameter[0]==0.6 and num_extruders>1 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 30 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +perimeter_speed = 40 +support_material_speed = 40 +support_material_interface_layers = 2 +support_material_xy_spacing = 120% +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.6 + +[print:0.35mm FAST sol int @0.6 nozzle] +inherits = 0.35mm FAST sol full @0.6 nozzle +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 +support_material_xy_spacing = 150% + +## MK2.5 -# MK2.5 MMU2 # [print:0.10mm DETAIL @MK2.5] inherits = 0.10mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 single_extruder_multi_material_priming = 0 -# MK2.5 MMU2 # +[print:0.15mm 100mms Linear Advance @MK2.5] +inherits = 0.15mm 100mms Linear Advance +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.15mm OPTIMAL @MK2.5] +inherits = 0.15mm OPTIMAL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.20mm 100mms Linear Advance @MK2.5] +inherits = 0.20mm 100mms Linear Advance +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.20mm NORMAL @MK2.5] +inherits = 0.20mm NORMAL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.35mm FAST @MK2.5] +inherits = 0.35mm FAST +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +## MK2.5 - MMU2 specific + [print:0.15mm OPTIMAL SOLUBLE FULL @MK2.5] inherits = 0.15mm OPTIMAL SOLUBLE FULL support_material_extruder = 5 support_material_interface_extruder = 5 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -# MK2.5 MMU2 # [print:0.15mm OPTIMAL SOLUBLE INTERFACE @MK2.5] inherits = 0.15mm OPTIMAL SOLUBLE INTERFACE support_material_extruder = 0 support_material_interface_extruder = 5 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -# MK2.5 # -[print:0.20mm 100mms Linear Advance @MK2.5] -inherits = 0.20mm 100mms Linear Advance -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 -single_extruder_multi_material_priming = 0 - -# MK2.5 # -[print:0.20mm NORMAL @MK2.5] -inherits = 0.20mm NORMAL -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 -single_extruder_multi_material_priming = 0 - -# MK2.5 MMU2 # [print:0.20mm NORMAL SOLUBLE FULL @MK2.5] inherits = 0.20mm NORMAL SOLUBLE FULL support_material_extruder = 5 @@ -1094,7 +776,6 @@ support_material_interface_extruder = 5 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 single_extruder_multi_material_priming = 0 -# MK2.5 MMU2 # [print:0.20mm NORMAL SOLUBLE INTERFACE @MK2.5] inherits = 0.20mm NORMAL SOLUBLE INTERFACE support_material_extruder = 0 @@ -1102,14 +783,7 @@ support_material_interface_extruder = 5 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 single_extruder_multi_material_priming = 0 -# MK2.5 # -[print:0.35mm FAST @MK2.5] -inherits = 0.35mm FAST -# alias = 0.35mm FAST -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 -single_extruder_multi_material_priming = 0 - -# MK2.5 MMU2 0.6 nozzle # +# MK2.5 MMU2 0.6 nozzle [print:0.35mm SOLUBLE FULL @0.6 nozzle MK2.5] inherits = *0.35mm*; *0.6nozzle*; *soluble_support* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and printer_model!="MK2SMM" and nozzle_diameter[0]==0.6 and num_extruders>1 @@ -1132,12 +806,296 @@ support_material_interface_layers = 3 support_material_with_sheath = 0 support_material_xy_spacing = 80% -## 0.8mm nozzle print profiles +## MK3 family ## + +## MK3 - 0.4mm nozzle + +[print:0.05mm ULTRADETAIL @MK3] +inherits = *0.05mm*; *MK3* +fill_pattern = gyroid +fill_density = 15% +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +top_infill_extrusion_width = 0.4 + +[print:0.07mm ULTRADETAIL @MK3] +inherits = *0.07mm*; *MK3* +fill_pattern = gyroid +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +top_infill_extrusion_width = 0.4 + +[print:0.10mm DETAIL @MK3] +inherits = *0.10mm*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 25 +infill_acceleration = 1000 +bridge_acceleration = 800 +infill_speed = 80 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 80 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 40 +fill_pattern = gyroid +fill_density = 15% +perimeters = 3 + +[print:0.15mm QUALITY @MK3] +inherits = *0.15mm*; *MK3* +bridge_speed = 25 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 25 +infill_acceleration = 1000 +infill_speed = 80 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 80 +top_solid_infill_speed = 40 +fill_pattern = gyroid +fill_density = 15% + +[print:0.15mm SPEED @MK3] +inherits = *0.15mm*; *MK3* +bridge_speed = 25 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 200 +max_print_speed = 200 +perimeter_speed = 60 +solid_infill_speed = 200 +top_solid_infill_speed = 50 + +[print:0.20mm QUALITY @MK3] +inherits = *0.20mm*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 25 +infill_acceleration = 1000 +infill_speed = 80 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 80 +top_solid_infill_speed = 40 +fill_pattern = gyroid +fill_density = 15% + +[print:0.20mm SPEED @MK3] +inherits = *0.20mm*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 200 +max_print_speed = 200 +perimeter_speed = 60 +solid_infill_speed = 200 +top_solid_infill_speed = 50 + +[print:0.30mm DRAFT @MK3] +inherits = *0.30mm*; *MK3* +bottom_solid_layers = 3 +bridge_speed = 25 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 85 +max_print_speed = 200 +perimeter_speed = 50 +small_perimeter_speed = 30 +solid_infill_speed = 80 +top_solid_infill_speed = 40 +support_material_speed = 45 +external_perimeter_extrusion_width = 0.6 +extrusion_width = 0.5 +first_layer_extrusion_width = 0.42 +infill_extrusion_width = 0.5 +perimeter_extrusion_width = 0.5 +solid_infill_extrusion_width = 0.5 +top_infill_extrusion_width = 0.45 +support_material_extrusion_width = 0.38 +support_material_contact_distance = 0.2 + +## MK3 - MMU2 specific +[print:0.15mm SOLUBLE FULL @MK3] +inherits = 0.15mm SPEED @MK3; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +support_material_extruder = 5 +support_material_interface_extruder = 5 +perimeter_speed = 40 +solid_infill_speed = 40 +infill_speed = 80 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 +support_material_speed = 45 +bridge_flow_ratio = 0.8 +bridge_speed = 30 + +[print:0.15mm SOLUBLE INTERFACE @MK3] +inherits = 0.15mm SOLUBLE FULL @MK3 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 + +[print:0.20mm SOLUBLE FULL @MK3] +inherits = 0.20mm SPEED @MK3; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +support_material_extruder = 5 +support_material_interface_extruder = 5 +perimeter_speed = 40 +solid_infill_speed = 40 +infill_speed = 80 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 +support_material_speed = 45 +bridge_flow_ratio = 0.95 +bridge_speed = 30 + +[print:0.20mm SOLUBLE INTERFACE @MK3] +inherits = 0.20mm SOLUBLE FULL @MK3 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 + +## MK3 - 0.25mm nozzle + +[print:0.05mm ULTRADETAIL @0.25 nozzle MK3] +inherits = *0.05mm*; *0.25nozzle*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +fill_pattern = grid +fill_density = 20% +support_material_contact_distance = 0.07 + +[print:0.07mm ULTRADETAIL @0.25 nozzle MK3] +inherits = *0.07mm*; *0.25nozzle*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +infill_speed = 30 +solid_infill_speed = 30 +support_material_speed = 30 +top_solid_infill_speed = 20 +fill_pattern = grid +fill_density = 20% +support_material_contact_distance = 0.07 + +[print:0.10mm DETAIL @0.25 nozzle MK3] +inherits = *0.10mm*; *0.25nozzleMK3*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 +fill_pattern = grid +fill_density = 20% +support_material_contact_distance = 0.07 + +[print:0.15mm QUALITY @0.25 nozzle MK3] +inherits = *0.15mm*; *0.25nozzleMK3*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 +fill_pattern = grid +fill_density = 20% +support_material_contact_distance = 0.08 + +## MK3 - 0.6mm nozzle + +[print:0.15mm DETAIL @0.6 nozzle MK3] +inherits = *0.15mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +support_material_contact_distance = 0.22 +bridge_flow_ratio = 1 + +[print:0.20mm DETAIL @0.6 nozzle MK3] +inherits = *0.20mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +support_material_contact_distance = 0.22 +bridge_flow_ratio = 1 + +[print:0.30mm QUALITY @0.6 nozzle MK3] +inherits = *0.30mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 1 + +[print:0.35mm SPEED @0.6 nozzle MK3] +inherits = *0.35mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 0.95 + +[print:0.40mm DRAFT @0.6 nozzle MK3] +inherits = *0.40mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1000 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 0.95 + +## MK3 - MMU2 specific + +[print:0.30mm SOLUBLE FULL @0.6 nozzle MK3] +inherits = 0.30mm QUALITY @0.6 nozzle MK3; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +support_material_extruder = 5 +support_material_interface_extruder = 5 +support_material_speed = 40 +perimeter_speed = 40 +solid_infill_speed = 40 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.6 +top_solid_infill_speed = 30 +support_material_xy_spacing = 80% + +[print:0.30mm SOLUBLE INTERFACE @0.6 nozzle MK3] +inherits = 0.30mm SOLUBLE FULL @0.6 nozzle MK3 +notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 + +## 0.8mm nozzle - MK2.5 and MK3 +## Only for MMU2 Single mode at the moment [print:0.30mm DETAIL @0.8 nozzle] inherits = *common*; *0.8nozzle* layer_height = 0.30 -## Only for MMU2 Single mode at the moment compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 perimeter_speed = 35 external_perimeter_speed = 25 @@ -1151,7 +1109,6 @@ support_material_speed = 40 [print:0.40mm QUALITY @0.8 nozzle] inherits = *common*; *0.8nozzle* layer_height = 0.4 -## Only for MMU2 Single mode at the moment compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 perimeter_speed = 35 external_perimeter_speed = 25 @@ -1165,7 +1122,6 @@ support_material_speed = 40 [print:0.55mm DRAFT @0.8 nozzle] inherits = *common*; *0.8nozzle* layer_height = 0.55 -## Only for MMU2 Single mode at the moment compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1 perimeter_speed = 30 external_perimeter_speed = 25 @@ -1179,9 +1135,9 @@ top_solid_infill_speed = 30 external_perimeter_extrusion_width = 1 perimeter_extrusion_width = 1 -## MINI print profiles +## MINI ## -# 0.4mm nozzle +# MINI - 0.4mm nozzle [print:0.05mm ULTRADETAIL @MINI] inherits = *0.05mm*; *MINI* @@ -1194,6 +1150,8 @@ perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 support_material_xy_spacing = 60% support_material_speed = 30 +support_material_extrusion_width = 0.35 +bridge_acceleration = 300 [print:0.07mm ULTRADETAIL @MINI] inherits = *0.07mm*; *MINI* @@ -1205,10 +1163,13 @@ small_perimeter_speed = 15 perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 support_material_xy_spacing = 60% +support_material_extrusion_width = 0.35 +bridge_acceleration = 300 [print:0.10mm DETAIL @MINI] inherits = *0.10mm*; *MINI* -bridge_speed = 30 +bridge_speed = 20 +bridge_acceleration = 700 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 external_perimeter_speed = 30 @@ -1219,12 +1180,10 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% perimeters = 3 -bridge_acceleration = 1000 support_material_xy_spacing = 60% [print:0.15mm QUALITY @MINI] inherits = *0.15mm*; *MINI* -bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 external_perimeter_speed = 30 @@ -1233,24 +1192,20 @@ solid_infill_speed = 80 top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% -bridge_flow_ratio = 0.85 support_material_xy_spacing = 60% [print:0.15mm SPEED @MINI] inherits = *0.15mm*; *MINI* -bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 50 external_perimeter_speed = 40 infill_speed = 140 solid_infill_speed = 140 top_solid_infill_speed = 40 -bridge_flow_ratio = 0.85 support_material_xy_spacing = 60% [print:0.20mm QUALITY @MINI] inherits = *0.20mm*; *MINI* -bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 external_perimeter_speed = 30 @@ -1263,7 +1218,6 @@ support_material_xy_spacing = 60% [print:0.20mm SPEED @MINI] inherits = *0.20mm*; *MINI* -bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 50 external_perimeter_speed = 40 @@ -1275,7 +1229,8 @@ support_material_xy_spacing = 60% [print:0.25mm DRAFT @MINI] inherits = *0.25mm*; *MINI* -bridge_speed = 30 +bridge_speed = 25 +bridge_flow_ratio = 0.95 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 40 infill_speed = 110 @@ -1288,8 +1243,9 @@ infill_extrusion_width = 0.45 solid_infill_extrusion_width = 0.45 top_infill_extrusion_width = 0.4 support_material_xy_spacing = 60% +support_material_contact_distance = 0.2 -# 0.25mm nozzle +# MINI - 0.25mm nozzle [print:0.05mm ULTRADETAIL @0.25 nozzle MINI] inherits = *0.05mm*; *0.25nozzle*; *MINI* @@ -1297,6 +1253,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and fill_pattern = grid fill_density = 20% support_material_speed = 30 +support_material_contact_distance = 0.07 [print:0.07mm ULTRADETAIL @0.25 nozzle MINI] inherits = *0.07mm*; *0.25nozzle*; *MINI* @@ -1307,20 +1264,23 @@ support_material_speed = 30 top_solid_infill_speed = 20 fill_pattern = grid fill_density = 20% +support_material_contact_distance = 0.07 [print:0.10mm DETAIL @0.25 nozzle MINI] inherits = *0.10mm*; *0.25nozzleMINI*; *MINI* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% +support_material_contact_distance = 0.07 [print:0.15mm QUALITY @0.25 nozzle MINI] inherits = *0.15mm*; *0.25nozzleMINI*; *MINI* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% +support_material_contact_distance = 0.08 -# 0.6mm nozzle MINI +# MINI - 0.6mm nozzle [print:0.15mm DETAIL @0.6 nozzle MINI] inherits = *0.15mm*; *0.6nozzleMINI* @@ -1333,6 +1293,8 @@ solid_infill_speed = 70 top_solid_infill_speed = 45 infill_extrusion_width = 0.65 solid_infill_extrusion_width = 0.65 +support_material_contact_distance = 0.22 +bridge_flow_ratio = 1 [print:0.20mm DETAIL @0.6 nozzle MINI] inherits = *0.20mm*; *0.6nozzleMINI* @@ -1345,6 +1307,8 @@ solid_infill_speed = 70 top_solid_infill_speed = 45 infill_extrusion_width = 0.65 solid_infill_extrusion_width = 0.65 +support_material_contact_distance = 0.22 +bridge_flow_ratio = 1 [print:0.30mm QUALITY @0.6 nozzle MINI] inherits = *0.30mm*; *0.6nozzleMINI* @@ -1357,6 +1321,8 @@ solid_infill_speed = 65 top_solid_infill_speed = 45 external_perimeter_extrusion_width = 0.68 perimeter_extrusion_width = 0.68 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 1 [print:0.35mm SPEED @0.6 nozzle MINI] inherits = *0.35mm*; *0.6nozzleMINI* @@ -1369,6 +1335,8 @@ solid_infill_speed = 60 top_solid_infill_speed = 45 external_perimeter_extrusion_width = 0.68 perimeter_extrusion_width = 0.68 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 0.95 [print:0.40mm DRAFT @0.6 nozzle MINI] inherits = *0.40mm*; *0.6nozzleMINI* @@ -1383,8 +1351,10 @@ external_perimeter_extrusion_width = 0.68 perimeter_extrusion_width = 0.68 infill_extrusion_width = 0.68 solid_infill_extrusion_width = 0.68 +support_material_contact_distance = 0.25 +bridge_flow_ratio = 0.95 -# 0.8mm nozzle MINI +# MINI - 0.8mm nozzle [print:0.30mm DETAIL @0.8 nozzle MINI] inherits = 0.30mm DETAIL @0.8 nozzle @@ -1490,7 +1460,7 @@ max_fan_speed = 50 min_fan_speed = 30 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 240 -filament_retract_length = 1.4 +filament_retract_length = 1 filament_retract_lift = 0.2 compatible_printers_condition = printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -1500,14 +1470,14 @@ compatible_printers_condition = nozzle_diameter[0]==0.6 and printer_model!="MK2S filament_max_volumetric_speed = 15 [filament:*PETMMU1*] -inherits = *PET* +; inherits = *PET* filament_retract_length = nil filament_retract_speed = nil filament_retract_lift = 0.2 compatible_printers_condition = printer_model=="MK2SMM" [filament:*PETMINI*] -inherits = *PET* +; inherits = *PET* filament_retract_length = nil filament_retract_speed = 40 filament_deretract_speed = 25 @@ -1518,7 +1488,7 @@ compatible_printers_condition = printer_model=="MINI" start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{elsif nozzle_diameter[0]==0.8}0.06{else}0.2{endif} ; Filament gcode" [filament:*PETMINI06*] -inherits = *PET* +; inherits = *PET* filament_retract_length = nil filament_retract_speed = 40 filament_deretract_speed = 25 @@ -1529,7 +1499,7 @@ start_filament_gcode = "M900 K0.12 ; Filament gcode" filament_max_volumetric_speed = 13 [filament:*ABSMINI*] -inherits = *ABS* +; inherits = *ABS* bed_temperature = 100 filament_retract_length = 2.7 filament_retract_speed = nil @@ -1861,8 +1831,8 @@ min_fan_speed = 20 max_fan_speed = 20 min_print_speed = 15 slowdown_below_layer_time = 15 -first_layer_temperature = 265 -temperature = 265 +first_layer_temperature = 260 +temperature = 260 filament_type = ASA [filament:Prusament ASA] @@ -2015,9 +1985,10 @@ filament_cost = 27.82 filament_density = 1.04 filament_spool_weight = 245 -[filament:Plasty Mladec ABS] +[filament:Filament PM ABS] inherits = *ABSC* -filament_vendor = Plasty Mladec +renamed_from = "Plasty Mladec ABS" +filament_vendor = Filament PM filament_cost = 27.82 filament_density = 1.08 filament_spool_weight = 230 @@ -2038,9 +2009,21 @@ filament_cost = 27.82 filament_density = 1.27 compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) -[filament:Plasty Mladec PETG] +[filament:Extrudr PETG] inherits = *PET* -filament_vendor = Plasty Mladec +filament_vendor = Extrudr +filament_cost = 35.45 +filament_density = 1.29 +temperature = 220 +bed_temperature = 70 +first_layer_temperature = 220 +first_layer_bed_temperature = 70 +slowdown_below_layer_time = 20 + +[filament:Filament PM PETG] +inherits = *PET* +renamed_from = "Plasty Mladec PETG" +filament_vendor = Filament PM filament_cost = 27.82 filament_density = 1.27 filament_spool_weight = 230 @@ -2301,9 +2284,10 @@ filament_vendor = Made for Prusa filament_cost = 27.82 filament_spool_weight = 230 -[filament:Plasty Mladec ABS @MMU2] +[filament:Filament PM ABS @MMU2] inherits = *ABS MMU2* -filament_vendor = Plasty Mladec +renamed_from = "Plasty Mladec ABS @MMU2" +filament_vendor = Filament PM filament_density = 1.08 filament_cost = 27.82 filament_spool_weight = 230 @@ -2402,9 +2386,10 @@ filament_density = 1.27 filament_spool_weight = 201 filament_type = PETG -[filament:Plasty Mladec PETG @0.6 nozzle] +[filament:Filament PM PETG @0.6 nozzle] inherits = *PET06* -filament_vendor = Plasty Mladec +renamed_from = "Plasty Mladec PETG @0.6 nozzle" +filament_vendor = Filament PM first_layer_temperature = 230 temperature = 240 filament_cost = 27.82 @@ -2458,7 +2443,7 @@ filament_unload_time = 12 filament_unloading_speed = 20 filament_unloading_speed_start = 120 filament_loading_speed_start = 19 -filament_retract_length = 1.4 +filament_retract_length = 1 filament_retract_lift = 0.2 [filament:*PET MMU2 06*] @@ -2471,9 +2456,10 @@ inherits = *PET MMU2* renamed_from = "Generic PET MMU2"; "Generic PETG MMU2" filament_vendor = Generic -[filament:Plasty Mladec PETG @MMU2] +[filament:Filament PM PETG @MMU2] inherits = *PET MMU2* -filament_vendor = Plasty Mladec +renamed_from = "Plasty Mladec PETG @MMU2" +filament_vendor = Filament PM filament_spool_weight = 230 [filament:Prusa PETG @MMU2] @@ -2510,10 +2496,11 @@ filament_cost = 36.29 filament_density = 1.27 filament_spool_weight = 201 -[filament:Plasty Mladec PETG @MMU2 0.6 nozzle] +[filament:Filament PM PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* +renamed_from = "Plasty Mladec PETG @MMU2 0.6 nozzle" filament_type = PETG -filament_vendor = Plasty Mladec +filament_vendor = Filament PM filament_spool_weight = 230 [filament:Prusa PLA] @@ -2530,9 +2517,10 @@ filament_vendor = Fiberlogy filament_cost = 25.4 filament_density = 1.24 -[filament:Plasty Mladec PLA] +[filament:Filament PM PLA] inherits = *PLA* -filament_vendor = Plasty Mladec +renamed_from = "Plasty Mladec PLA" +filament_vendor = Filament PM filament_cost = 27.82 filament_density = 1.24 filament_spool_weight = 230 @@ -2576,6 +2564,26 @@ filament_vendor = EUMAKERS filament_cost = 25.4 filament_density = 1.24 +[filament:Extrudr PLA NX1] +inherits = *PLA* +filament_vendor = Extrudr +filament_cost = 22.76 +filament_density = 1.24 +temperature = 205 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +full_fan_speed_layer = 3 +max_fan_speed = 90 +min_fan_speed = 30 +slowdown_below_layer_time = 20 + +[filament:Extrudr PLA NX2] +inherits = Extrudr PLA NX1 +filament_vendor = Extrudr +filament_cost = 23.63 +filament_density = 1.3 + [filament:Floreon3D PLA] inherits = *PLA* filament_vendor = Floreon3D @@ -2930,204 +2938,75 @@ temperature = 220 ## Filaments MMU1 [filament:ColorFabb HT @MMU1] -inherits = *PETMMU1* -filament_vendor = ColorFabb -bed_temperature = 110 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_cost = 58.66 -filament_density = 1.18 -filament_spool_weight = 236 -first_layer_bed_temperature = 105 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 +inherits = ColorFabb HT; *PETMMU1* start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 [filament:ColorFabb XT @MMU1] -inherits = *PETMMU1* -filament_vendor = ColorFabb -filament_type = PETG -filament_cost = 62.90 -filament_density = 1.27 -filament_spool_weight = 236 -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -temperature = 270 +inherits = ColorFabb XT; *PETMMU1* [filament:ColorFabb XT-CF20 @MMU1] -inherits = *PETMMU1* -filament_vendor = ColorFabb -compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MK2SMM" -extrusion_multiplier = 1.05 -filament_cost = 80.65 -filament_density = 1.35 -filament_spool_weight = 236 -filament_colour = #804040 -filament_max_volumetric_speed = 2 -first_layer_bed_temperature = 90 -first_layer_temperature = 260 +inherits = ColorFabb XT-CF20; *PETMMU1* start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 260 [filament:ColorFabb nGen @MMU1] -inherits = *PETMMU1* -filament_vendor = ColorFabb -filament_cost = 21.2 -filament_density = 1.2 -filament_spool_weight = 236 -bridge_fan_speed = 40 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_type = NGEN -first_layer_temperature = 240 -max_fan_speed = 35 -min_fan_speed = 20 +inherits = ColorFabb nGen; *PETMMU1* [filament:E3D Edge @MMU1] -inherits = *PETMMU1* -filament_vendor = E3D -filament_cost = 56.9 -filament_density = 1.26 -filament_type = EDGE +inherits = E3D Edge; *PETMMU1* [filament:Fillamentum CPE @MMU1] -inherits = *PETMMU1* -filament_vendor = Fillamentum -filament_cost = 56.45 -filament_density = 1.25 -filament_spool_weight = 230 -filament_type = CPE -first_layer_bed_temperature = 90 -first_layer_temperature = 275 -max_fan_speed = 50 -min_fan_speed = 50 -disable_fan_first_layers = 3 -full_fan_speed_layer = 5 -temperature = 275 +inherits = Fillamentum CPE; *PETMMU1* [filament:Generic PETG @MMU1] -inherits = *PETMMU1* +inherits = Generic PETG; *PETMMU1* renamed_from = "Generic PET MMU1"; "Generic PETG MMU1" -filament_vendor = Generic -filament_cost = 27.82 -filament_density = 1.27 [filament:Devil Design PETG @MMU1] -inherits = *PETMMU1* -filament_vendor = Devil Design -filament_cost = 20.99 -filament_density = 1.23 -filament_spool_weight = 250 -first_layer_temperature = 230 -first_layer_bed_temperature = 85 -temperature = 230 -bed_temperature = 90 +inherits = Devil Design PETG; *PETMMU1* -[filament:Plasty Mladec PETG @MMU1] -inherits = *PETMMU1* -filament_vendor = Plasty Mladec -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 +[filament:Filament PM PETG @MMU1] +inherits = Filament PM PETG; *PETMMU1* +renamed_from = "Plasty Mladec PETG @MMU1" [filament:Verbatim PETG @MMU1] -inherits = *PETMMU1* -filament_vendor = Verbatim -filament_cost = 27.90 -filament_density = 1.27 -filament_spool_weight = 235 +inherits = Verbatim PETG; *PETMMU1* [filament:Fiberlogy PETG @MMU1] -inherits = *PETMMU1* -filament_vendor = Fiberlogy -filament_cost = 21.50 -filament_density = 1.27 +inherits = Fiberlogy PETG; *PETMMU1* [filament:Prusa PETG @MMU1] -inherits = *PETMMU1* +inherits = Prusa PETG; *PETMMU1* renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1" -filament_vendor = Made for Prusa -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 [filament:Prusament PETG @MMU1] -inherits = *PETMMU1* -filament_vendor = Prusa Polymers -first_layer_temperature = 240 -temperature = 250 -filament_cost = 36.29 -filament_density = 1.27 -filament_spool_weight = 201 -filament_type = PETG +inherits = Prusament PETG; *PETMMU1* + +[filament:Extrudr PETG @MMU1] +inherits = Extrudr PETG; *PETMMU1* +filament_vendor = Extrudr [filament:Taulman T-Glase @MMU1] -inherits = *PETMMU1* -filament_vendor = Taulman -filament_cost = 40 -filament_density = 1.27 -bridge_fan_speed = 40 -cooling = 0 -fan_always_on = 0 -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 +inherits = Taulman T-Glase; *PETMMU1* start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" [filament:Fiberthree F3 PA Pure Pro @MMU1] -inherits = *common* -filament_vendor = Fiberthree -filament_cost = 200.84 -filament_density = 1.2 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 270 -temperature = 270 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 1 -fan_below_layer_time = 20 -min_print_speed = 15 -slowdown_below_layer_time = 10 -filament_colour = #DEE0E6 +inherits = Fiberthree F3 PA Pure Pro filament_max_volumetric_speed = 4 -filament_soluble = 0 -filament_type = NYLON -max_fan_speed = 20 -min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_retract_length = nil +filament_retract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil compatible_printers_condition = printer_model=="MK2SMM" [filament:Fiberthree F3 PA-CF Pro @MMU1] -inherits = *common* -filament_vendor = Fiberthree -filament_cost = 208.1 -filament_density = 1.25 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 275 -temperature = 275 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 0 -fan_below_layer_time = 20 -min_print_speed = 15 -slowdown_below_layer_time = 10 -filament_colour = #DEE0E6 +inherits = Fiberthree F3 PA-CF Pro filament_max_volumetric_speed = 4 -filament_soluble = 0 -filament_type = NYLON -max_fan_speed = 0 -min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_retract_length = nil +filament_retract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MK2SMM" [filament:Fiberthree F3 PA-GF Pro @MMU1] @@ -3166,108 +3045,47 @@ compatible_printers_condition = printer_model=="MK2SMM" [filament:Generic PETG @MINI] inherits = Generic PETG; *PETMINI* renamed_from = "Generic PET MINI"; "Generic PETG MINI" -filament_vendor = Generic -filament_cost = 27.82 -filament_density = 1.27 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 [filament:Devil Design PETG @MINI] -inherits = Generic PETG; *PETMINI* -filament_vendor = Devil Design -filament_cost = 20.99 -filament_density = 1.23 -filament_spool_weight = 250 -first_layer_temperature = 230 -first_layer_bed_temperature = 85 -temperature = 230 -bed_temperature = 90 +inherits = Devil Design PETG; *PETMINI* compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 -[filament:Plasty Mladec PETG @MINI] -inherits = Generic PETG; *PETMINI* -filament_vendor = Plasty Mladec -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 +[filament:Filament PM PETG @MINI] +inherits = Filament PM PETG; *PETMINI* +renamed_from = "Plasty Mladec PETG @MINI" compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 [filament:Verbatim PETG @MINI] -inherits = Generic PETG; *PETMINI* -filament_vendor = Verbatim -filament_cost = 27.90 -filament_density = 1.27 -filament_spool_weight = 235 +inherits = Verbatim PETG; *PETMINI* compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 [filament:Fiberlogy PETG @MINI] -inherits = Generic PETG; *PETMINI* -filament_vendor = Fiberlogy -filament_cost = 21.50 -filament_density = 1.27 +inherits = Fiberlogy PETG; *PETMINI* compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 [filament:Generic ABS @MINI] inherits = Generic ABS; *ABSMINI* -filament_vendor = Generic -filament_cost = 27.82 -filament_density = 1.08 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 [filament:Fiberthree F3 PA Pure Pro @MINI] -inherits = *common* -filament_vendor = Fiberthree -filament_cost = 200.84 -filament_density = 1.2 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 270 -temperature = 270 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 1 -fan_below_layer_time = 20 -min_print_speed = 15 -slowdown_below_layer_time = 10 -filament_colour = #DEE0E6 +inherits = Fiberthree F3 PA Pure Pro filament_max_volumetric_speed = 4 -filament_soluble = 0 -filament_type = NYLON -max_fan_speed = 20 -min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_retract_length = nil +filament_retract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil compatible_printers_condition = printer_model=="MINI" [filament:Fiberthree F3 PA-CF Pro @MINI] -inherits = *common* -filament_vendor = Fiberthree -filament_cost = 208.1 -filament_density = 1.25 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 275 -temperature = 275 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 0 -fan_below_layer_time = 20 -min_print_speed = 15 -slowdown_below_layer_time = 10 -filament_colour = #DEE0E6 +inherits = Fiberthree F3 PA-CF Pro filament_max_volumetric_speed = 4 -filament_soluble = 0 -filament_type = NYLON -max_fan_speed = 0 -min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_retract_length = nil +filament_retract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI" [filament:Fiberthree F3 PA-GF Pro @MINI] @@ -3280,14 +3098,8 @@ max_fan_speed = 15 min_fan_speed = 15 [filament:Kimya ABS Carbon @MINI] -inherits = *ABSMINI* -filament_vendor = Kimya -filament_cost = 140.4 -filament_density = 1.032 -filament_colour = #804040 +inherits = Kimya ABS Carbon; *ABSMINI* filament_max_volumetric_speed = 6 -first_layer_temperature = 260 -temperature = 260 compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI" [filament:Kimya ABS Kevlar @MINI] @@ -3296,146 +3108,57 @@ filament_vendor = Kimya filament_density = 1.037 [filament:Esun ABS @MINI] -inherits = Generic ABS; *ABSMINI* -filament_vendor = Esun -filament_cost = 27.82 -filament_density = 1.01 -filament_spool_weight = 265 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 +inherits = Esun ABS; *ABSMINI* [filament:Hatchbox ABS @MINI] -inherits = Generic ABS; *ABSMINI* -filament_vendor = Hatchbox -filament_cost = 27.82 -filament_density = 1.08 -filament_spool_weight = 245 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 +inherits = Hatchbox ABS; *ABSMINI* -[filament:Plasty Mladec ABS @MINI] -inherits = Generic ABS; *ABSMINI* -filament_vendor = Plasty Mladec -filament_cost = 27.82 -filament_density = 1.08 -filament_spool_weight = 230 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 +[filament:Filament PM ABS @MINI] +inherits = Filament PM ABS; *ABSMINI* +renamed_from = "Plasty Mladec ABS @MINI" [filament:Verbatim ABS @MINI] -inherits = Generic ABS; *ABSMINI* -filament_vendor = Verbatim -filament_cost = 25.87 -filament_density = 1.05 -filament_spool_weight = 235 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 +inherits = Verbatim ABS; *ABSMINI* [filament:Prusament PETG @MINI] inherits = Prusament PETG; *PETMINI* -filament_vendor = Prusa Polymers -first_layer_temperature = 240 -temperature = 250 -filament_density = 1.27 -filament_spool_weight = 201 -filament_cost = 36.29 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 +[filament:Extrudr PETG @MINI] +inherits = Extrudr PETG; *PETMINI* +filament_vendor = Extrudr + [filament:Kimya PETG Carbon @MINI] -inherits = *PETMINI* -filament_vendor = Kimya -extrusion_multiplier = 1.05 -filament_cost = 150.02 -filament_density = 1.317 -filament_colour = #804040 +inherits = Kimya PETG Carbon; *PETMINI* filament_max_volumetric_speed = 6 -first_layer_bed_temperature = 85 -first_layer_temperature = 240 -temperature = 240 filament_retract_length = nil filament_retract_lift = 0.3 compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI" [filament:Prusament PETG @0.6 nozzle MINI] inherits = Prusament PETG; *PETMINI06* -first_layer_temperature = 240 -temperature = 250 -filament_density = 1.27 -filament_spool_weight = 201 -filament_cost = 36.29 [filament:Generic PETG @0.6 nozzle MINI] inherits = Generic PETG; *PETMINI06* renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI" -filament_cost = 27.82 -filament_density = 1.27 [filament:Devil Design PETG @0.6 nozzle MINI] -inherits = Generic PETG; *PETMINI06* -filament_vendor = Devil Design -first_layer_temperature = 230 -first_layer_bed_temperature = 85 -temperature = 230 -bed_temperature = 90 -filament_cost = 20.99 -filament_density = 1.23 -filament_spool_weight = 250 +inherits = Devil Design PETG; *PETMINI06* -[filament:Plasty Mladec PETG @0.6 nozzle MINI] -inherits = Generic PETG; *PETMINI06* -filament_vendor = Plasty Mladec -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 +[filament:Filament PM PETG @0.6 nozzle MINI] +inherits = Filament PM PETG; *PETMINI06* +renamed_from = "Plasty Mladec PETG @0.6 nozzle MINI" [filament:Verbatim PETG @0.6 nozzle MINI] -inherits = Generic PETG; *PETMINI06* -filament_vendor = Verbatim -filament_spool_weight = 235 +inherits = Verbatim PETG; *PETMINI06* [filament:Fiberlogy PETG @0.6 nozzle MINI] -inherits = Generic PETG; *PETMINI06* -filament_vendor = Fiberlogy +inherits = Fiberlogy PETG; *PETMINI06* [filament:Prusament ASA @MINI] inherits = Prusament ASA; *ABSMINI* -first_layer_temperature = 260 first_layer_bed_temperature = 100 -temperature = 260 bed_temperature = 100 -fan_always_on = 1 -cooling = 1 -min_fan_speed = 20 -max_fan_speed = 20 -bridge_fan_speed = 30 -min_print_speed = 15 -slowdown_below_layer_time = 15 -disable_fan_first_layers = 4 -filament_type = ASA -filament_colour = #FFF2EC -filament_cost = 42.69 -filament_density = 1.07 -filament_spool_weight = 201 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 [filament:Fillamentum Flexfill 98A @MINI] @@ -3541,89 +3264,43 @@ inherits = Fillamentum CPE; *PETMINI* first_layer_temperature = 265 first_layer_bed_temperature = 90 temperature = 265 -filament_type = CPE -filament_cost = 56.45 -filament_density = 1.25 -filament_spool_weight = 230 disable_fan_first_layers = 3 full_fan_speed_layer = 5 [filament:ColorFabb nGen @MINI] inherits = ColorFabb nGen; *PETMINI* -filament_cost = 52.46 -filament_density = 1.2 -filament_spool_weight = 236 [filament:E3D PC-ABS @MINI] inherits = E3D PC-ABS; *ABSMINI* -filament_density = 1.05 -filament_cost = 28.80 +filament_retract_length = nil +filament_retract_before_travel = nil +filament_wipe = nil [filament:Fillamentum ABS @MINI] inherits = Fillamentum ABS; *ABSMINI* -filament_cost = 32.4 -filament_density = 1.04 -filament_spool_weight = 230 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 [filament:Fillamentum ASA @MINI] inherits = Fillamentum ASA; *ABSMINI* -first_layer_temperature = 255 first_layer_bed_temperature = 100 -temperature = 255 bed_temperature = 100 -fan_always_on = 1 -cooling = 1 -min_fan_speed = 20 -max_fan_speed = 20 -min_print_speed = 15 -slowdown_below_layer_time = 15 -disable_fan_first_layers = 4 -filament_type = ASA -filament_colour = #FFF2EC -filament_cost = 38.7 -filament_density = 1.07 -filament_spool_weight = 230 [filament:Polymaker PC-Max @MINI] inherits = Polymaker PC-Max; *ABSMINI* -filament_type = PC filament_max_volumetric_speed = 7 bed_temperature = 100 -filament_colour = #FFF2EC first_layer_bed_temperature = 100 first_layer_temperature = 270 temperature = 270 -bridge_fan_speed = 0 -filament_cost = 77.3 -filament_density = 1.20 +filament_retract_length = nil +filament_retract_before_travel = nil +filament_wipe = nil [filament:Prusament PC Blend @MINI] -inherits = *ABSMINI* -filament_vendor = Prusa Polymers -filament_cost = 60.49 -filament_density = 1.22 -filament_spool_weight = 201 -fan_always_on = 0 +inherits = Prusament PC Blend; *ABSMINI* first_layer_temperature = 275 first_layer_bed_temperature = 100 temperature = 275 bed_temperature = 100 -cooling = 1 -min_fan_speed = 20 -max_fan_speed = 20 -bridge_fan_speed = 30 -min_print_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -filament_type = PC -filament_colour = #DEE0E6 filament_max_volumetric_speed = 7 filament_retract_length = nil filament_retract_speed = nil @@ -3634,117 +3311,43 @@ filament_wipe = nil compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 [filament:Prusa ABS @MINI] -inherits = *ABSMINI* -filament_vendor = Made for Prusa -filament_cost = 27.82 -filament_density = 1.08 -filament_spool_weight = 230 -fan_always_on = 0 -cooling = 1 -min_fan_speed = 15 -max_fan_speed = 15 -disable_fan_first_layers = 4 -fan_below_layer_time = 30 -bridge_fan_speed = 25 +inherits = Prusa ABS; *ABSMINI* compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 [filament:Generic HIPS @MINI] -inherits = *ABSMINI* -filament_vendor = Generic -filament_cost = 27.3 -filament_density = 1.04 -bridge_fan_speed = 50 -cooling = 1 -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 10 -filament_colour = #FFFFD7 -filament_soluble = 1 -filament_type = HIPS -first_layer_temperature = 230 -max_fan_speed = 20 -min_fan_speed = 20 -temperature = 230 +inherits = Generic HIPS; *ABSMINI* [filament:ColorFabb HT @MINI] -inherits = *PETMINI* -filament_vendor = ColorFabb +inherits = ColorFabb HT; *PETMINI* bed_temperature = 100 -bridge_fan_speed = 30 -cooling = 1 -disable_fan_first_layers = 3 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_cost = 58.66 -filament_density = 1.18 -filament_spool_weight = 236 first_layer_bed_temperature = 100 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 -temperature = 270 +min_fan_speed = 15 [filament:ColorFabb XT @MINI] -inherits = *PETMINI* -filament_vendor = ColorFabb -filament_type = PETG -filament_cost = 62.90 -filament_density = 1.27 -filament_spool_weight = 236 +inherits = ColorFabb XT; *PETMINI* first_layer_bed_temperature = 90 -first_layer_temperature = 260 -temperature = 270 [filament:ColorFabb XT-CF20 @MINI] -inherits = *PETMINI* -filament_vendor = ColorFabb +inherits = ColorFabb XT-CF20; *PETMINI* compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI" -extrusion_multiplier = 1.05 -filament_cost = 80.65 -filament_density = 1.35 -filament_spool_weight = 236 -filament_colour = #804040 -filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 260 [filament:Taulman T-Glase @MINI] -inherits = *PETMINI* -filament_vendor = Taulman -filament_cost = 40 -filament_density = 1.27 -bridge_fan_speed = 40 -cooling = 0 -fan_always_on = 0 -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 +inherits = Taulman T-Glase; *PETMINI* [filament:E3D Edge @MINI] -inherits = *PETMINI* -filament_vendor = E3D -filament_cost = 56.9 -filament_density = 1.26 -filament_type = EDGE +inherits = E3D Edge; *PETMINI* [filament:Prusa PETG @MINI] -inherits = *PETMINI* +inherits = Prusa PETG; *PETMINI* renamed_from = "Prusa PET MINI"; "Prusa PETG MINI" -filament_vendor = Made for Prusa -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 [filament:Prusa PETG @0.6 nozzle MINI] -inherits = *PETMINI06* +inherits = Prusa PETG; *PETMINI06* renamed_from = "Prusa PET 0.6 nozzle MINI"; "Prusa PETG 0.6 nozzle MINI" -filament_vendor = Made for Prusa -filament_cost = 27.82 -filament_density = 1.27 -filament_spool_weight = 230 ## Filaments 0.8 nozzle @@ -5321,7 +4924,7 @@ retract_speed = 35 serial_port = serial_speed = 250000 single_extruder_multi_material = 0 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-2 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 toolchange_gcode = use_firmware_retraction = 0 use_relative_e_distances = 1 @@ -5356,19 +4959,19 @@ printer_model = MK2SMM [printer:*mm-single*] inherits = *multimaterial* -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n +end_gcode = G1 E-4 F2100\nG91\nG1 Z1 F7200\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7\nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3\nG1 E-15 F5000\nG1 E-50 F5400\nG1 E-15 F3000\nG1 E-12 F2000\nG1 F1600\nG1 X0 Y1 E3\nG1 X50 Y1 E-5\nG1 F2000\nG1 X0 Y1 E5\nG1 X50 Y1 E-5\nG1 F2400\nG1 X0 Y1 E5\nG1 X50 Y1 E-5\nG1 F2400\nG1 X0 Y1 E5\nG1 X50 Y1 E-3\nG4 S0\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n 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_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0\nM203 E100\nM92 E140\nG1 Z0.25 F7200\nG1 X50 E80 F1000\nG1 X160 E20 F1000\nG1 Z0.2 F7200\nG1 X220 E13 F1000\nG1 X240 E0 F1000\nG92 E0 default_print_profile = 0.15mm OPTIMAL [printer:*mm-multi*] inherits = *multimaterial* high_current_on_filament_swap = 1 -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors +end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100\nG91\nG1 Z1 F7200\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7\nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3\nG1 E-15 F5000\nG1 E-50 F5400\nG1 E-15 F3000\nG1 E-12 F2000\nG1 F1600\nG1 X0 Y1 E3\nG1 X50 Y1 E-5\nG1 F2000\nG1 X0 Y1 E5\nG1 X50 Y1 E-5\nG1 F2400\nG1 X0 Y1 E5\nG1 X50 Y1 E-5\nG1 F2400\nG1 X0 Y1 E5\nG1 X50 Y1 E-3\nG4 S0\n{endif}\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_colour = #FFAA55;#E37BA0;#4ECDD3;#FB7259 nozzle_diameter = 0.4,0.4,0.4,0.4 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_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.25 F7200\nG1 X50 E80 F1000\nG1 X160 E20 F1000\nG1 Z0.2 F7200\nG1 X220 E13 F1000\nG1 X240 E0 F1000\n{endif}\nG92 E0 default_print_profile = 0.15mm OPTIMAL # XXXXXXXXXXXXXXXXX @@ -5438,21 +5041,21 @@ inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 [printer:Original Prusa i3 MK2.5 0.8 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle @@ -5464,39 +5067,20 @@ min_layer_height = 0.2 retract_length = 1 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle [printer:Original Prusa i3 MK2.5 MMU2 Single] -inherits = Original Prusa i3 MK2.5; *mm2* +inherits = *25mm2* printer_model = MK2.5MMU2 single_extruder_multi_material = 0 max_print_height = 200 -remaining_times = 1 -silent_mode = 0 -retract_lift_below = 199 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 2000 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 9000 -machine_max_acceleration_y = 9000 -machine_max_acceleration_z = 500 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 12 -machine_max_jerk_e = 4.5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.2 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; load to nozzle\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.20 F1000\nG1 X5 E4 F1000\nG92 E0\n +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5 MMU2 Single 0.8 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single 0.8 nozzle @@ -5511,87 +5095,43 @@ inherits = Original Prusa i3 MK2.5S MMU2S Single 0.25 nozzle printer_model = MK2.5MMU2 [printer:Original Prusa i3 MK2.5 MMU2] -inherits = Original Prusa i3 MK2.5; *mm2* +inherits = *25mm2* printer_model = MK2.5MMU2 max_print_height = 200 -remaining_times = 1 -silent_mode = 0 -retract_lift_below = 199 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 2000 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 9000 -machine_max_acceleration_y = 9000 -machine_max_acceleration_z = 500 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 12 -machine_max_jerk_e = 4.5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.2 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n single_extruder_multi_material = 1 -# The 5x nozzle diameter defines the number of extruders. Other extruder parameters -# (for example the retract values) are duplicaed from the first value, so they do not need -# to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E32 F1073\nG1 X5 E32 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\nG92 E0\n +end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S] inherits = Original Prusa i3 MK2.5 printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.25 nozzle] inherits = Original Prusa i3 MK2.5 0.25 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.6 nozzle] inherits = Original Prusa i3 MK2.5 0.6 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.8 nozzle] inherits = Original Prusa i3 MK2.5 0.8 nozzle printer_model = MK2.5S [printer:Original Prusa i3 MK2.5S MMU2S Single] -inherits = Original Prusa i3 MK2.5; *mm2s* +inherits = *25mm2s* printer_model = MK2.5SMMU2S single_extruder_multi_material = 0 max_print_height = 200 -remaining_times = 1 -silent_mode = 0 -retract_lift_below = 199 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 2000 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 9000 -machine_max_acceleration_y = 9000 -machine_max_acceleration_z = 500 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 12 -machine_max_jerk_e = 4.5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.2 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5S MMU2S Single 0.8 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single @@ -5601,7 +5141,7 @@ min_layer_height = 0.2 nozzle_diameter = 0.8 printer_variant = 0.8 retract_length = 1 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -5623,41 +5163,19 @@ nozzle_diameter = 0.25 printer_variant = 0.25 retract_lift = 0.15 default_print_profile = 0.10mm DETAIL 0.25 nozzle -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F1400\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n [printer:Original Prusa i3 MK2.5S MMU2S] -inherits = Original Prusa i3 MK2.5; *mm2s* +inherits = *25mm2s* printer_model = MK2.5SMMU2S max_print_height = 200 -remaining_times = 1 -silent_mode = 0 -retract_lift_below = 199 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 2000 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 9000 -machine_max_acceleration_y = 9000 -machine_max_acceleration_z = 500 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 12 -machine_max_jerk_e = 4.5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.2 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n single_extruder_multi_material = 1 -# The 5x nozzle diameter defines the number of extruders. Other extruder parameters -# (for example the retract values) are duplicaed from the first value, so they do not need -# to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E29 F1073\nG1 X5 E29 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\nG92 E0\n +end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S MMU2S 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S @@ -5675,7 +5193,7 @@ min_layer_height = 0.15 printer_variant = 0.6 default_print_profile = 0.20mm NORMAL @0.6 nozzle -## For later use. 0.8mm nozzle profiles are only available for MMU2 Single mode at the moment. +## 0.8mm nozzle profiles are only available for MMU2 Single mode at the moment. ## [printer:Original Prusa i3 MK2.5S MMU2S 0.8 nozzle] ## inherits = Original Prusa i3 MK2.5S MMU2S @@ -5725,7 +5243,7 @@ remaining_times = 1 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_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} printer_model = MK3 default_print_profile = 0.15mm QUALITY @MK3 @@ -5736,7 +5254,7 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E8 F700 ; intro line\nG1 X100 E12.5 F700 ; intro line\nG92 E0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] @@ -5745,7 +5263,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\nM221 S{if layer_height<0.075}100{else}95{endif} default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 0.8 nozzle] @@ -5755,7 +5273,7 @@ max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 retract_length = 1 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\nM221 S95 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -5763,13 +5281,11 @@ default_filament_profile = Prusament PLA @0.8 nozzle inherits = Original Prusa i3 MK3 renamed_from = "Original Prusa i3 MK3S" printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S & MK3S+ 0.25 nozzle] inherits = Original Prusa i3 MK3 0.25 nozzle renamed_from = "Original Prusa i3 MK3S 0.25 nozzle" printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S & MK3S+ 0.6 nozzle] inherits = Original Prusa i3 MK3 0.6 nozzle @@ -5804,12 +5320,32 @@ printer_model = MK3SMMU2S default_print_profile = 0.15mm QUALITY @MK3 default_filament_profile = Prusament PLA @MMU2 +[printer:*25mm2*] +inherits = Original Prusa i3 MK2.5 +single_extruder_multi_material = 1 +cooling_tube_length = 10 +cooling_tube_retraction = 30 +parking_pos_retraction = 85 +retract_length_toolchange = 3 +extra_loading_move = -13 +default_filament_profile = Prusament PLA @MMU2 + +[printer:*25mm2s*] +inherits = Original Prusa i3 MK2.5S +single_extruder_multi_material = 1 +cooling_tube_length = 20 +cooling_tube_retraction = 40 +parking_pos_retraction = 85 +retract_length_toolchange = 3 +extra_loading_move = -25 +default_filament_profile = Prusament PLA @MMU2 + [printer:Original Prusa i3 MK3 MMU2 Single] inherits = *mm2* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK3 MMU2 Single @@ -5818,7 +5354,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 Single 0.8 nozzle] @@ -5829,7 +5365,7 @@ max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 retract_length = 1 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -5841,27 +5377,24 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F1000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F1400\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2] inherits = *mm2* -# The 5x nozzle diameter defines the number of extruders. Other extruder parameters -# (for example the retract values) are duplicaed from the first value, so they do not need -# to be defined explicitely. machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} -end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E32 F1073\nG1 X5 E32 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single] inherits = *mm2s* renamed_from = "Original Prusa i3 MK3S MMU2S Single" single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK3S & MK3S+ MMU2S Single @@ -5871,7 +5404,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.8 nozzle] @@ -5882,7 +5415,7 @@ max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 retract_length = 1 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -5895,7 +5428,7 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F1400\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3S & MK3S+ MMU2S] @@ -5904,8 +5437,8 @@ renamed_from = "Original Prusa i3 MK3S MMU2S" machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} -end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E29 F1073\nG1 X5 E29 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = ; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\n{if has_wipe_tower}\nG1 E-15 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15 F5800\nG1 E-20 F5500\nG1 E10 F3000\nG1 E-10 F3100\nG1 E10 F3150\nG1 E-10 F3250\nG1 E10 F3300\n{endif}\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nG1 X0 Y210 F3000 ; home X axis\nM84 ; disable motors\n ## 0.6mm nozzle MMU2/S printer profiles @@ -5916,7 +5449,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E29 F1073\nG1 X5 E29 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 0.6 nozzle] @@ -5925,7 +5458,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E32 F1073\nG1 X5 E32 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 ## 0.8mm nozzle MMU2/S printer profiles @@ -5938,7 +5471,7 @@ default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 ## max_layer_height = 0.6 ## min_layer_height = 0.2 ## printer_variant = 0.8 -## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 ## default_print_profile = 0.40mm QUALITY @0.8 nozzle ## [printer:Original Prusa i3 MK3S & MK3S+ MMU2S 0.8 nozzle] @@ -5963,10 +5496,11 @@ thumbnails = 16x16,220x124 bed_shape = 0x0,180x0,180x180,0x180 default_filament_profile = "Prusament PLA" default_print_profile = 0.15mm QUALITY @MINI -gcode_flavor = marlin +gcode_flavor = marlinfirmware machine_max_acceleration_e = 5000 machine_max_acceleration_extruding = 1250 machine_max_acceleration_retracting = 1250 +machine_max_acceleration_travel = 1250 machine_max_acceleration_x = 1250 machine_max_acceleration_y = 1250 machine_max_acceleration_z = 400 @@ -5996,7 +5530,7 @@ retract_lift_below = 179 retract_layer_change = 1 silent_mode = 0 remaining_times = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0\nG1 Y-2 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110 E8 F900\nG1 X40 E10 F700\nG92 E0\n\nM221 S95 ; set flow end_gcode = G1 E-1 F2100 ; retract\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y178 F4200 ; park print head\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} F720 ; Move print head further up\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM900 K0 ; reset LA\nM84 ; disable motors 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_PRUSA3D\nPRINTER_MODEL_MINI\n extruder_colour = @@ -6012,7 +5546,7 @@ default_print_profile = 0.10mm DETAIL @0.25 nozzle MINI retract_length = 3 retract_lift = 0.15 retract_before_travel = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0\nG1 Y-2 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110 E8 F600\nG1 X40 E10 F400\nG92 E0\n\nM221 S95 ; set flow [printer:Original Prusa MINI & MINI+ 0.6 nozzle] inherits = Original Prusa MINI & MINI+ From 548ceb7acce6fdb576d2c59ffa8bcfab2684b19b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 14 Apr 2021 07:38:50 +0200 Subject: [PATCH 37/57] Show info about custom supports and seam in ObjectList Slight refactoring in GLGizmosManager so it is easier to open a gizmo from the ObjectList --- resources/icons/info.png | Bin 0 -> 308 bytes src/slic3r/GUI/GUI_ObjectList.cpp | 68 +++++++++++++++--- src/slic3r/GUI/GUI_ObjectList.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 7 +- src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp | 8 ++- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 45 +++++++----- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 2 + src/slic3r/GUI/ObjectDataViewModel.cpp | 72 ++++++++++++++++++- src/slic3r/GUI/ObjectDataViewModel.hpp | 18 ++++- 9 files changed, 190 insertions(+), 32 deletions(-) create mode 100644 resources/icons/info.png diff --git a/resources/icons/info.png b/resources/icons/info.png new file mode 100644 index 0000000000000000000000000000000000000000..9eeee9b3cdbac7fd819d3f4c3ee85414c5f1ed50 GIT binary patch literal 308 zcmV-40n7f0P)6|`_Rtm|7y^1~Ew=AW5=n0W(fT;mbLc<=CvuP!m`yl+rpgAzqp8NMnw zN!+2v9C;$1N30I+zs_}ZYEa-QtZ4bm;QmokMfEnO_zs(PV)Mv3c0VL!_bF(`IW#IJ zSafGP0SinrjIiz@J%^>R#;Ci-vyowo@ddeKY%{FzAieuODeleteWarningIcon(m_objects_model->GetParent(item)); m_objects_model->Delete(item); + update_info_items(obj_idx); } void ObjectList::del_settings_from_config(const wxDataViewItem& parent_item) @@ -2118,20 +2119,32 @@ void ObjectList::part_selection_changed() { if (item) { - if (m_objects_model->GetParent(item) == wxDataViewItem(nullptr)) { - obj_idx = m_objects_model->GetIdByItem(item); + const ItemType type = m_objects_model->GetItemType(item); + const wxDataViewItem parent = m_objects_model->GetParent(item); + const ItemType parent_type = m_objects_model->GetItemType(parent); + obj_idx = m_objects_model->GetObjectIdByItem(item); + + if (parent == wxDataViewItem(nullptr) + || type == itInfo) { og_name = _(L("Object manipulation")); m_config = &(*m_objects)[obj_idx]->config; update_and_show_manipulations = true; + + if (type == itInfo) { + Unselect(item); + assert(parent_type == itObject); + Select(parent); + InfoItemType info_type = m_objects_model->GetInfoItemType(item); + GLGizmosManager::EType gizmo_type = + info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports + : GLGizmosManager::EType::Seam; + GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); + if (gizmos_mgr.get_current_type() != gizmo_type) + gizmos_mgr.open_gizmo(gizmo_type); + } } else { - obj_idx = m_objects_model->GetObjectIdByItem(item); - - const ItemType type = m_objects_model->GetItemType(item); if (type & itSettings) { - const auto parent = m_objects_model->GetParent(item); - const ItemType parent_type = m_objects_model->GetItemType(parent); - if (parent_type & itObject) { og_name = _(L("Object Settings to modify")); m_config = &(*m_objects)[obj_idx]->config; @@ -2243,6 +2256,38 @@ wxDataViewItem ObjectList::add_settings_item(wxDataViewItem parent_item, const D return ret; } + +void ObjectList::update_info_items(size_t obj_idx) +{ + const ModelObject* model_object = (*m_objects)[obj_idx]; + wxDataViewItem item_obj = m_objects_model->GetItemById(obj_idx); + assert(item_obj.IsOk()); + + for (InfoItemType type : {InfoItemType::CustomSupports, InfoItemType::CustomSeam}) { + wxDataViewItem item = m_objects_model->GetInfoItemByType(item_obj, type); + bool shows = item.IsOk(); + bool should_show = printer_technology() == ptFFF + && std::any_of(model_object->volumes.begin(), model_object->volumes.end(), + [type](const ModelVolume* mv) { + return ! (type == InfoItemType::CustomSupports + ? mv->supported_facets.empty() + : mv->seam_facets.empty()); + }); + + if (! shows && should_show) { + m_objects_model->AddInfoChild(item_obj, type); + Expand(item_obj); + } + else if (shows && ! should_show) { + Unselect(item); + m_objects_model->Delete(item); + Select(item_obj); + } + } +} + + + void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed) { auto model_object = (*m_objects)[obj_idx]; @@ -2251,6 +2296,8 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed) model_object->config.has("extruder") ? model_object->config.extruder() : 0, get_mesh_errors_count(obj_idx) > 0); + update_info_items(obj_idx); + // add volumes to the object if (model_object->volumes.size() > 1) { for (const ModelVolume* volume : model_object->volumes) { @@ -3029,7 +3076,7 @@ void ObjectList::update_selections_on_canvas() if (sel_cnt == 1) { wxDataViewItem item = GetSelection(); - if (m_objects_model->GetItemType(item) & (itSettings | itInstanceRoot | itLayerRoot | itLayer)) + if (m_objects_model->GetItemType(item) & (itSettings | itInstanceRoot | itLayerRoot | itLayer | itInfo)) add_to_selection(m_objects_model->GetParent(item), selection, instance_idx, mode); else add_to_selection(item, selection, instance_idx, mode); @@ -3442,6 +3489,9 @@ void ObjectList::update_object_list_by_printer_technology() m_objects_model->GetChildren(wxDataViewItem(nullptr), object_items); for (auto& object_item : object_items) { + // update custom supports info + update_info_items(m_objects_model->GetObjectIdByItem(object_item)); + // Update Settings Item for object update_settings_item_and_selection(object_item, sel); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index d70c53849d..5812e26f75 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -18,7 +18,6 @@ class wxBoxSizer; class wxBitmapComboBox; class wxMenuItem; -class ObjectDataViewModel; class MenuWithSeparators; namespace Slic3r { @@ -347,6 +346,7 @@ public: void update_and_show_object_settings_item(); void update_settings_item_and_selection(wxDataViewItem item, wxDataViewItemArray& selections); void update_object_list_by_printer_technology(); + void update_info_items(size_t obj_idx); void instances_to_separated_object(const int obj_idx, const std::set& inst_idx); void instances_to_separated_objects(const int obj_idx); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index f3f87cc33e..d870687129 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -7,6 +7,7 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" #include @@ -316,8 +317,12 @@ void GLGizmoFdmSupports::update_model_object() const updated |= mv->supported_facets.set(*m_triangle_selectors[idx].get()); } - if (updated) + if (updated) { + const ModelObjectPtrs& mos = wxGetApp().model().objects; + wxGetApp().obj_list()->update_info_items(std::find(mos.begin(), mos.end(), mo) - mos.begin()); + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index 6c3a8ddd3a..9724767550 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -7,7 +7,7 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/Plater.hpp" - +#include "slic3r/GUI/GUI_ObjectList.hpp" #include @@ -222,8 +222,12 @@ void GLGizmoSeam::update_model_object() const updated |= mv->seam_facets.set(*m_triangle_selectors[idx].get()); } - if (updated) + if (updated) { + const ModelObjectPtrs& mos = wxGetApp().model().objects; + wxGetApp().obj_list()->update_info_items(std::find(mos.begin(), mos.end(), mo) - mos.begin()); + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 9dc785b3fa..2f1396d634 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -163,6 +163,17 @@ void GLGizmosManager::reset_all_states() m_hover = Undefined; } +bool GLGizmosManager::open_gizmo(EType type) +{ + int idx = int(type); + if (m_gizmos[idx]->is_selectable() && m_gizmos[idx]->is_activable()) { + activate_gizmo(m_current == idx ? Undefined : (EType)idx); + update_data(); + return true; + } + return false; +} + void GLGizmosManager::set_hover_id(int id) { if (!m_enabled || m_current == Undefined) @@ -266,24 +277,21 @@ bool GLGizmosManager::is_running() const bool GLGizmosManager::handle_shortcut(int key) { - if (!m_enabled) + if (!m_enabled || m_parent.get_selection().is_empty()) return false; - if (m_parent.get_selection().is_empty()) + auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), + [key](const std::unique_ptr& gizmo) { + int gizmo_key = gizmo->get_shortcut_key(); + return gizmo->is_selectable() + && ((gizmo_key == key - 64) || (gizmo_key == key - 96)); + }); + + if (it == m_gizmos.end()) return false; - bool handled = false; - - for (size_t idx : get_selectable_idxs()) { - int it_key = m_gizmos[idx]->get_shortcut_key(); - - if (m_gizmos[idx]->is_activable() && ((it_key == key - 64) || (it_key == key - 96))) { - activate_gizmo(m_current == idx ? Undefined : (EType)idx); - handled = true; - } - } - - return handled; + EType gizmo_type = EType(it - m_gizmos.begin()); + return open_gizmo(gizmo_type); } bool GLGizmosManager::is_dragging() const @@ -814,10 +822,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) if (!processed && !evt.HasModifiers()) { if (handle_shortcut(keyCode)) - { - update_data(); processed = true; - } } if (processed) @@ -1156,5 +1161,11 @@ bool GLGizmosManager::is_in_editing_mode(bool error_notification) const return true; } + +int GLGizmosManager::get_shortcut_key(GLGizmosManager::EType type) const +{ + return m_gizmos[type]->get_shortcut_key(); +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 917a5830c2..c8951966e6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -171,6 +171,7 @@ public: void refresh_on_off_state(); void reset_all_states(); bool is_serializing() const { return m_serializing; } + bool open_gizmo(EType type); void set_hover_id(int id); void enable_grabber(EType type, unsigned int id, bool enable); @@ -228,6 +229,7 @@ public: void update_after_undo_redo(const UndoRedo::Snapshot& snapshot); int get_selectable_icons_cnt() const { return get_selectable_idxs().size(); } + int get_shortcut_key(GLGizmosManager::EType) const; private: void render_background(float left, float top, float right, float bottom, float border) const; diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index cf7b7b4796..395e329e8b 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -47,6 +47,19 @@ void ObjectDataViewModelNode::init_container() static constexpr char LayerRootIcon[] = "edit_layers_all"; static constexpr char LayerIcon[] = "edit_layers_some"; static constexpr char WarningIcon[] = "exclamation"; +static constexpr char InfoIcon[] = "info"; + +ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const InfoItemType info_type) : + m_parent(parent), + m_type(itInfo), + m_extruder(wxEmptyString) +{ + m_name = info_type == InfoItemType::CustomSupports + ? _L("Paint-on supports") + : _L("Paint-on seam"); + m_info_item_type = info_type; +} + ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : m_parent(parent), @@ -69,6 +82,8 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent m_bmp = create_scaled_bitmap(LayerRootIcon); // FIXME: pass window ptr m_name = _(L("Layers")); } + else if (type == itInfo) + assert(false); if (type & (itInstanceRoot | itLayerRoot)) init_container(); @@ -250,6 +265,7 @@ ObjectDataViewModel::ObjectDataViewModel() m_volume_bmps = MenuFactory::get_volume_bitmaps(); m_warning_bmp = create_scaled_bitmap(WarningIcon); + m_info_bmp = create_scaled_bitmap(InfoIcon); } ObjectDataViewModel::~ObjectDataViewModel() @@ -330,13 +346,44 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent return child; } +wxDataViewItem ObjectDataViewModel::AddInfoChild(const wxDataViewItem &parent_item, InfoItemType info_type) +{ + ObjectDataViewModelNode *root = static_cast(parent_item.GetID()); + if (!root) return wxDataViewItem(0); + + const auto node = new ObjectDataViewModelNode(root, info_type); + + // The new item should be added according to its order in InfoItemType. + // Find last info item with lower index and append after it. + const auto& children = root->GetChildren(); + int idx = -1; + for (int i=0; iGetType() == itInfo && int(children[i]->GetInfoItemType()) < int(info_type) ) + idx = i; + } + + root->Insert(node, idx+1); + node->SetBitmap(m_info_bmp); + // notify control + const wxDataViewItem child((void*)node); + ItemAdded(parent_item, child); + return child; +} + wxDataViewItem ObjectDataViewModel::AddSettingsChild(const wxDataViewItem &parent_item) { ObjectDataViewModelNode *root = static_cast(parent_item.GetID()); if (!root) return wxDataViewItem(0); const auto node = new ObjectDataViewModelNode(root, itSettings); - root->Insert(node, 0); + + // In case there are some info items, append after them. + size_t i = 0; + for (i = 0; iGetChildCount(); ++i) + if (root->GetNthChild(i)->GetType() != itInfo) + break; + + root->Insert(node, i); // notify control const wxDataViewItem child((void*)node); ItemAdded(parent_item, child); @@ -1379,6 +1426,14 @@ ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item) const return node->m_type < 0 ? itUndef : node->m_type; } +InfoItemType ObjectDataViewModel::GetInfoItemType(const wxDataViewItem &item) const +{ + if (!item.IsOk()) + return InfoItemType::Undef; + ObjectDataViewModelNode *node = static_cast(item.GetID()); + return node->m_info_item_type; +} + wxDataViewItem ObjectDataViewModel::GetItemByType(const wxDataViewItem &parent_item, ItemType type) const { if (!parent_item.IsOk()) @@ -1411,6 +1466,21 @@ wxDataViewItem ObjectDataViewModel::GetLayerRootItem(const wxDataViewItem &item) return GetItemByType(item, itLayerRoot); } +wxDataViewItem ObjectDataViewModel::GetInfoItemByType(const wxDataViewItem &parent_item, InfoItemType type) const +{ + if (! parent_item.IsOk()) + return wxDataViewItem(0); + + ObjectDataViewModelNode *node = static_cast(parent_item.GetID()); + for (size_t i = 0; i < node->GetChildCount(); i++) { + const ObjectDataViewModelNode* child_node = node->GetNthChild(i); + if (child_node->m_type == itInfo && child_node->m_info_item_type == type) + return wxDataViewItem((void*)child_node); + } + + return wxDataViewItem(0); // not found +} + bool ObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const { if (!item.IsOk()) diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index c23ec195bd..cf440f5dc4 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -27,6 +27,7 @@ enum ItemType { itSettings = 16, itLayerRoot = 32, itLayer = 64, + itInfo = 128 }; enum ColumnNumber @@ -44,6 +45,13 @@ enum PrintIndicator piUnprintable , // unprintable }; +enum class InfoItemType +{ + Undef, + CustomSupports, + CustomSeam +}; + class ObjectDataViewModelNode; WX_DEFINE_ARRAY_PTR(ObjectDataViewModelNode*, MyObjectTreeModelNodePtrArray); @@ -69,6 +77,7 @@ class ObjectDataViewModelNode std::string m_action_icon_name = ""; ModelVolumeType m_volume_type; + InfoItemType m_info_item_type {InfoItemType::Undef}; public: ObjectDataViewModelNode(const wxString& name, @@ -104,6 +113,7 @@ public: const wxString& extruder = wxEmptyString ); ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); + ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const InfoItemType type); ~ObjectDataViewModelNode() { @@ -176,6 +186,7 @@ public: const wxBitmap& GetBitmap() const { return m_bmp; } const wxString& GetName() const { return m_name; } ItemType GetType() const { return m_type; } + InfoItemType GetInfoItemType() const { return m_info_item_type; } void SetIdx(const int& idx); int GetIdx() const { return m_idx; } ModelVolumeType GetVolumeType() { return m_volume_type; } @@ -244,6 +255,7 @@ class ObjectDataViewModel :public wxDataViewModel std::vector m_objects; std::vector m_volume_bmps; wxBitmap m_warning_bmp; + wxBitmap m_info_bmp; wxDataViewCtrl* m_ctrl { nullptr }; @@ -261,6 +273,7 @@ public: const int extruder = 0, const bool create_frst_child = true); wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); + wxDataViewItem AddInfoChild(const wxDataViewItem &parent_item, InfoItemType info_type); wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, size_t num); wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, const std::vector& print_indicator); wxDataViewItem AddLayersRoot(const wxDataViewItem &parent_item); @@ -335,12 +348,15 @@ public: // In our case it is an item with all columns bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; } - ItemType GetItemType(const wxDataViewItem &item) const ; + ItemType GetItemType(const wxDataViewItem &item) const; + InfoItemType GetInfoItemType(const wxDataViewItem &item) const; wxDataViewItem GetItemByType( const wxDataViewItem &parent_item, ItemType type) const; wxDataViewItem GetSettingsItem(const wxDataViewItem &item) const; wxDataViewItem GetInstanceRootItem(const wxDataViewItem &item) const; wxDataViewItem GetLayerRootItem(const wxDataViewItem &item) const; + wxDataViewItem GetInfoItemByType(const wxDataViewItem &parent_item, InfoItemType type) const; + bool IsSettingsItem(const wxDataViewItem &item) const; void UpdateSettingsDigest( const wxDataViewItem &item, const std::vector& categories); From df3fb312684ec166c0b4361664bb374f65086d2d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 19 Apr 2021 11:51:56 +0200 Subject: [PATCH 38/57] Info in ObjectList: Settings should be above the new info items, info items are selectable --- src/slic3r/GUI/GUI_ObjectList.cpp | 13 ++++++++----- src/slic3r/GUI/ObjectDataViewModel.cpp | 8 +------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index dbfc05a6d3..652fcc65b4 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1525,14 +1525,20 @@ void ObjectList::del_subobject_item(wxDataViewItem& item) if (type == itUndef) return; + wxDataViewItem parent = m_objects_model->GetParent(item); + if (type & itSettings) - del_settings_from_config(m_objects_model->GetParent(item)); + del_settings_from_config(parent); else if (type & itInstanceRoot && obj_idx != -1) del_instances_from_object(obj_idx); else if (type & itLayerRoot && obj_idx != -1) del_layers_from_object(obj_idx); else if (type & itLayer && obj_idx != -1) del_layer_from_object(obj_idx, m_objects_model->GetLayerRangeByItem(item)); + else if (type & itInfo && obj_idx != -1) { + Unselect(item); + Select(parent); + } else if (idx == -1) return; else if (!del_subobject_from_object(obj_idx, idx, type)) @@ -1540,7 +1546,7 @@ void ObjectList::del_subobject_item(wxDataViewItem& item) // If last volume item with warning was deleted, unmark object item if (type & itVolume && (*m_objects)[obj_idx]->get_mesh_errors_count() == 0) - m_objects_model->DeleteWarningIcon(m_objects_model->GetParent(item)); + m_objects_model->DeleteWarningIcon(parent); m_objects_model->Delete(item); update_info_items(obj_idx); @@ -2131,9 +2137,6 @@ void ObjectList::part_selection_changed() update_and_show_manipulations = true; if (type == itInfo) { - Unselect(item); - assert(parent_type == itObject); - Select(parent); InfoItemType info_type = m_objects_model->GetInfoItemType(item); GLGizmosManager::EType gizmo_type = info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index 395e329e8b..541c2f8a9e 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -377,13 +377,7 @@ wxDataViewItem ObjectDataViewModel::AddSettingsChild(const wxDataViewItem &paren const auto node = new ObjectDataViewModelNode(root, itSettings); - // In case there are some info items, append after them. - size_t i = 0; - for (i = 0; iGetChildCount(); ++i) - if (root->GetNthChild(i)->GetType() != itInfo) - break; - - root->Insert(node, i); + root->Insert(node, 0); // notify control const wxDataViewItem child((void*)node); ItemAdded(parent_item, child); From dfe926ef63a6b0e6b9ddc6d27b64f7b1acd42799 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 19 Apr 2021 15:42:57 +0200 Subject: [PATCH 39/57] Info in ObjectList: Added variable layer height --- src/slic3r/GUI/GLCanvas3D.cpp | 4 +++ src/slic3r/GUI/GUI_ObjectList.cpp | 45 ++++++++++++++++++-------- src/slic3r/GUI/ObjectDataViewModel.cpp | 6 ++-- src/slic3r/GUI/ObjectDataViewModel.hpp | 3 +- src/slic3r/GUI/Plater.cpp | 6 ++++ src/slic3r/GUI/Plater.hpp | 1 + 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7bbdc72b11..2149f21e7c 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -508,6 +508,7 @@ void GLCanvas3D::LayersEditing::reset_layer_height_profile(GLCanvas3D& canvas) m_layer_height_profile.clear(); m_layers_texture.valid = false; canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); } void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas, float quality_factor) @@ -517,6 +518,7 @@ void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); m_layers_texture.valid = false; canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); } void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas, const HeightProfileSmoothingParams& smoothing_params) @@ -526,6 +528,7 @@ void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas, const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); m_layers_texture.valid = false; canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); } void GLCanvas3D::LayersEditing::generate_layer_height_texture() @@ -565,6 +568,7 @@ void GLCanvas3D::LayersEditing::accept_changes(GLCanvas3D& canvas) wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Manual edit"))); const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().obj_list()->update_info_items(last_object_id); } } m_layer_height_profile_modified = false; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 652fcc65b4..15c4578d82 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2138,12 +2138,15 @@ void ObjectList::part_selection_changed() if (type == itInfo) { InfoItemType info_type = m_objects_model->GetInfoItemType(item); - GLGizmosManager::EType gizmo_type = - info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports - : GLGizmosManager::EType::Seam; - GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); - if (gizmos_mgr.get_current_type() != gizmo_type) - gizmos_mgr.open_gizmo(gizmo_type); + if (info_type != InfoItemType::VariableLayerHeight) { + GLGizmosManager::EType gizmo_type = + info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports + : GLGizmosManager::EType::Seam; + GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); + if (gizmos_mgr.get_current_type() != gizmo_type) + gizmos_mgr.open_gizmo(gizmo_type); + } else + wxGetApp().plater()->toggle_layers_editing(true); } } else { @@ -2266,16 +2269,30 @@ void ObjectList::update_info_items(size_t obj_idx) wxDataViewItem item_obj = m_objects_model->GetItemById(obj_idx); assert(item_obj.IsOk()); - for (InfoItemType type : {InfoItemType::CustomSupports, InfoItemType::CustomSeam}) { + for (InfoItemType type : {InfoItemType::CustomSupports, + InfoItemType::CustomSeam, + InfoItemType::VariableLayerHeight}) { wxDataViewItem item = m_objects_model->GetInfoItemByType(item_obj, type); bool shows = item.IsOk(); - bool should_show = printer_technology() == ptFFF - && std::any_of(model_object->volumes.begin(), model_object->volumes.end(), - [type](const ModelVolume* mv) { - return ! (type == InfoItemType::CustomSupports - ? mv->supported_facets.empty() - : mv->seam_facets.empty()); - }); + bool should_show = false; + + switch (type) { + case InfoItemType::CustomSupports : + case InfoItemType::CustomSeam : + should_show = printer_technology() == ptFFF + && std::any_of(model_object->volumes.begin(), model_object->volumes.end(), + [type](const ModelVolume* mv) { + return ! (type == InfoItemType::CustomSupports + ? mv->supported_facets.empty() + : mv->seam_facets.empty()); + }); + break; + + case InfoItemType::VariableLayerHeight : + should_show = printer_technology() == ptFFF + && ! model_object->layer_height_profile.empty(); + break; + } if (! shows && should_show) { m_objects_model->AddInfoChild(item_obj, type); diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index 541c2f8a9e..49c75f9f2f 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -54,9 +54,9 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent m_type(itInfo), m_extruder(wxEmptyString) { - m_name = info_type == InfoItemType::CustomSupports - ? _L("Paint-on supports") - : _L("Paint-on seam"); + m_name = info_type == InfoItemType::CustomSupports ? _L("Paint-on supports") + : info_type == InfoItemType::CustomSeam ? _L("Paint-on seam") + : _L("Variable layer height"); m_info_item_type = info_type; } diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index cf440f5dc4..1dd41bb107 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -49,7 +49,8 @@ enum class InfoItemType { Undef, CustomSupports, - CustomSeam + CustomSeam, + VariableLayerHeight }; class ObjectDataViewModelNode; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 50adb89e41..5db983f43a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4967,6 +4967,12 @@ void Plater::convert_unit(ConversionType conv_type) } } +void Plater::toggle_layers_editing(bool enable) +{ + if (canvas3D()->is_layers_editing_enabled() != enable) + wxPostEvent(canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); +} + void Plater::cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper, bool keep_lower, bool rotate_lower) { wxCHECK_RET(obj_idx < p->model.objects.size(), "obj_idx out of bounds"); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 16590ed9b1..e99feee82f 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -191,6 +191,7 @@ public: bool is_selection_empty() const; void scale_selection_to_fit_print_volume(); void convert_unit(ConversionType conv_type); + void toggle_layers_editing(bool enable); void cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false); From 3e09334162a7f3eb9411f87c0af16330fa0e103e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 20 Apr 2021 08:53:56 +0200 Subject: [PATCH 40/57] Removed mutable members from class Bed3D --- src/slic3r/GUI/3DBed.cpp | 83 +++++++++++++++++++++------------------- src/slic3r/GUI/3DBed.hpp | 24 ++++++------ 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 74b58b052a..1c43e7eb04 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -113,7 +113,7 @@ void Bed3D::Axes::render() const glsafe(::glPopMatrix()); }; - m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); + const_cast(&m_arrow)->init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); if (shader == nullptr) @@ -143,13 +143,6 @@ void Bed3D::Axes::render() const glsafe(::glDisable(GL_DEPTH_TEST)); } -Bed3D::Bed3D() - : m_type(Custom) - , m_vbo_id(0) - , m_scale_factor(1.0f) -{ -} - bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom) { auto check_texture = [](const std::string& texture) { @@ -193,7 +186,7 @@ bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, c ExPolygon poly; for (const Vec2d& p : m_shape) { - poly.contour.append(Point(scale_(p(0)), scale_(p(1)))); + poly.contour.append({ scale_(p(0)), scale_(p(1)) }); } calc_triangles(poly); @@ -228,7 +221,8 @@ Point Bed3D::point_projection(const Point& point) const void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture) const { - m_scale_factor = scale_factor; + float* factor = const_cast(&m_scale_factor); + *factor = scale_factor; if (show_axes) render_axes(); @@ -247,22 +241,24 @@ void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, void Bed3D::calc_bounding_boxes() const { - m_bounding_box = BoundingBoxf3(); + BoundingBoxf3* bounding_box = const_cast(&m_bounding_box); + *bounding_box = BoundingBoxf3(); for (const Vec2d& p : m_shape) { - m_bounding_box.merge(Vec3d(p(0), p(1), 0.0)); + bounding_box->merge({ p(0), p(1), 0.0 }); } - m_extended_bounding_box = m_bounding_box; + BoundingBoxf3* extended_bounding_box = const_cast(&m_extended_bounding_box); + *extended_bounding_box = m_bounding_box; // extend to contain axes - m_extended_bounding_box.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones()); - m_extended_bounding_box.merge(m_extended_bounding_box.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, m_extended_bounding_box.max(2))); + extended_bounding_box->merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones()); + extended_bounding_box->merge(extended_bounding_box->min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, extended_bounding_box->max(2))); // extend to contain model, if any BoundingBoxf3 model_bb = m_model.get_bounding_box(); if (model_bb.defined) { model_bb.translate(m_model_offset); - m_extended_bounding_box.merge(model_bb); + extended_bounding_box->merge(model_bb); } } @@ -339,21 +335,24 @@ void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) co void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const { + GLTexture* texture = const_cast(&m_texture); + GLTexture* temp_texture = const_cast(&m_temp_texture); + if (m_texture_filename.empty()) { - m_texture.reset(); + texture->reset(); render_default(bottom); return; } - if ((m_texture.get_id() == 0) || (m_texture.get_source() != m_texture_filename)) { - m_texture.reset(); + if (texture->get_id() == 0 || texture->get_source() != m_texture_filename) { + texture->reset(); if (boost::algorithm::iends_with(m_texture_filename, ".svg")) { // use higher resolution images if graphic card and opengl version allow GLint max_tex_size = OpenGLManager::get_gl_info().get_max_tex_size(); - if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename)) { + if (temp_texture->get_id() == 0 || temp_texture->get_source() != m_texture_filename) { // generate a temporary lower resolution texture to show while no main texture levels have been compressed - if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) { + if (!temp_texture->load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) { render_default(bottom); return; } @@ -361,15 +360,15 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const } // starts generating the main texture, compression will run asynchronously - if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) { + if (!texture->load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) { render_default(bottom); return; } } else if (boost::algorithm::iends_with(m_texture_filename, ".png")) { // generate a temporary lower resolution texture to show while no main texture levels have been compressed - if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename)) { - if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false)) { + if (temp_texture->get_id() == 0 || temp_texture->get_source() != m_texture_filename) { + if (!temp_texture->load_from_file(m_texture_filename, false, GLTexture::None, false)) { render_default(bottom); return; } @@ -377,7 +376,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const } // starts generating the main texture, compression will run asynchronously - if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) { + if (!texture->load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) { render_default(bottom); return; } @@ -387,13 +386,13 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const return; } } - else if (m_texture.unsent_compressed_data_available()) { + else if (texture->unsent_compressed_data_available()) { // sends to gpu the already available compressed levels of the main texture - m_texture.send_compressed_data_to_gpu(); + texture->send_compressed_data_to_gpu(); // the temporary texture is not needed anymore, reset it - if (m_temp_texture.get_id() != 0) - m_temp_texture.reset(); + if (temp_texture->get_id() != 0) + temp_texture->reset(); canvas.request_extra_frame(); @@ -406,9 +405,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const shader->set_uniform("transparent_background", bottom); shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg")); - if (m_vbo_id == 0) { - glsafe(::glGenBuffers(1, &m_vbo_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id)); + unsigned int* vbo_id = const_cast(&m_vbo_id); + + if (*vbo_id == 0) { + glsafe(::glGenBuffers(1, vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, *vbo_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)m_triangles.get_vertices_data_size(), (const GLvoid*)m_triangles.get_vertices_data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } @@ -428,12 +429,12 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const GLint tex_coords_id = shader->get_attrib_location("v_tex_coords"); // show the temporary texture while no compressed data is available - GLuint tex_id = (GLuint)m_temp_texture.get_id(); + GLuint tex_id = (GLuint)temp_texture->get_id(); if (tex_id == 0) - tex_id = (GLuint)m_texture.get_id(); + tex_id = (GLuint)texture->get_id(); glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, *vbo_id)); if (position_id != -1) { glsafe(::glEnableVertexAttribArray(position_id)); @@ -471,24 +472,26 @@ void Bed3D::render_model() const if (m_model_filename.empty()) return; - if ((m_model.get_filename() != m_model_filename) && m_model.init_from_file(m_model_filename)) { + GLModel* model = const_cast(&m_model); + + if (model->get_filename() != m_model_filename && model->init_from_file(m_model_filename)) { // move the model so that its origin (0.0, 0.0, 0.0) goes into the bed shape center and a bit down to avoid z-fighting with the texture quad Vec3d shift = m_bounding_box.center(); shift(2) = -0.03; - m_model_offset = shift; + *const_cast(&m_model_offset) = shift; // update extended bounding box calc_bounding_boxes(); } - if (!m_model.get_filename().empty()) { + if (!model->get_filename().empty()) { GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("uniform_color", m_model_color); ::glPushMatrix(); ::glTranslated(m_model_offset(0), m_model_offset(1), m_model_offset(2)); - m_model.render(); + model->render(); ::glPopMatrix(); shader->stop_using(); } @@ -511,7 +514,7 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture) co void Bed3D::render_default(bool bottom) const { - m_texture.reset(); + const_cast(&m_texture)->reset(); unsigned int triangles_vcount = m_triangles.get_vertices_count(); if (triangles_vcount > 0) { diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 6266304bee..c2630b7993 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -48,7 +48,7 @@ class Bed3D private: Vec3d m_origin{ Vec3d::Zero() }; float m_stem_length{ DefaultStemLength }; - mutable GLModel m_arrow; + GLModel m_arrow; public: const Vec3d& get_origin() const { return m_origin; } @@ -67,28 +67,28 @@ public: }; private: - EType m_type; + EType m_type{ Custom }; Pointfs m_shape; std::string m_texture_filename; std::string m_model_filename; - mutable BoundingBoxf3 m_bounding_box; - mutable BoundingBoxf3 m_extended_bounding_box; + BoundingBoxf3 m_bounding_box; + BoundingBoxf3 m_extended_bounding_box; Polygon m_polygon; GeometryBuffer m_triangles; GeometryBuffer m_gridlines; - mutable GLTexture m_texture; - mutable GLModel m_model; - mutable Vec3d m_model_offset{ Vec3d::Zero() }; - std::array m_model_color{ 0.235f, 0.235f, 0.235f, 1.0f }; + GLTexture m_texture; // temporary texture shown until the main texture has still no levels compressed - mutable GLTexture m_temp_texture; - mutable unsigned int m_vbo_id; + GLTexture m_temp_texture; + GLModel m_model; + Vec3d m_model_offset{ Vec3d::Zero() }; + std::array m_model_color{ 0.235f, 0.235f, 0.235f, 1.0f }; + unsigned int m_vbo_id{ 0 }; Axes m_axes; - mutable float m_scale_factor; + float m_scale_factor{ 1.0f }; public: - Bed3D(); + Bed3D() = default; ~Bed3D() { reset(); } EType get_type() const { return m_type; } From 441cf62ad374ee2c4a7eaec0e4a57c2ba666e9f4 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Mon, 22 Mar 2021 22:36:09 +0100 Subject: [PATCH 41/57] fix of notification states and upload progress bar notification fadeout --- src/slic3r/GUI/NotificationManager.cpp | 33 ++++++++++++++++++-------- src/slic3r/GUI/NotificationManager.hpp | 3 +++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index e83a0014c4..533bcb8dc6 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -169,13 +169,16 @@ void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float init imgui.set_next_window_pos(win_pos.x, win_pos.y, ImGuiCond_Always, 1.0f, 0.0f); imgui.set_next_window_size(m_window_width, m_window_height, ImGuiCond_Always); - // find if hovered - if (m_state == EState::Hovered) - m_state = EState::Shown; - + + // find if hovered FIXME: do it only in update state? + if (m_state == EState::Hovered) { + m_state = EState::Unknown; + init(); + } + if (mouse_pos.x < win_pos.x && mouse_pos.x > win_pos.x - m_window_width && mouse_pos.y > win_pos.y && mouse_pos.y < win_pos.y + m_window_height) { ImGui::SetNextWindowFocus(); - m_state = EState::Hovered; + set_hovered(); } // color change based on fading out @@ -300,8 +303,8 @@ void NotificationManager::PopNotification::init() if (m_lines_count == 3) m_multiline = true; m_notification_start = GLCanvas3D::timestamp_now(); - //if (m_state != EState::Hidden) - // m_state = EState::Shown; + if (m_state == EState::Unknown) + m_state = EState::Shown; } void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& imgui) { @@ -579,9 +582,10 @@ bool NotificationManager::PopNotification::update_state(bool paused, const int64 // reset timers - hovered state is set in render if (m_state == EState::Hovered) { m_current_fade_opacity = 1.0f; - m_notification_start = now; + m_state = EState::Unknown; + init(); // Timers when not fading - } else if (m_state != EState::FadingOut && m_data.duration != 0 && !paused) { + } else if (m_state != EState::NotFading && m_state != EState::FadingOut && m_data.duration != 0 && !paused) { int64_t up_time = now - m_notification_start; if (up_time >= m_data.duration * 1000) { m_state = EState::FadingOut; @@ -787,6 +791,8 @@ void NotificationManager::ProgressBarNotification::init() PopNotification::init(); m_lines_count++; m_endlines.push_back(m_endlines.back()); + if(m_state == EState::Shown) + m_state = EState::NotFading; } void NotificationManager::ProgressBarNotification::count_spaces() { @@ -826,12 +832,19 @@ void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgu ImGui::GetWindowDrawList()->AddLine(lineStart, midPoint, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (1.0f * 255.f)), m_line_height * 0.2f); } //------PrintHostUploadNotification---------------- +void NotificationManager::PrintHostUploadNotification::init() +{ + ProgressBarNotification::init(); + if (m_state == EState::NotFading && m_uj_state == UploadJobState::PB_COMPLETED) + m_state = EState::Shown; +} void NotificationManager::PrintHostUploadNotification::set_percentage(float percent) { m_percentage = percent; if (percent >= 1.0f) { m_uj_state = UploadJobState::PB_COMPLETED; m_has_cancel_button = false; + init(); } else if (percent < 0.0f) { error(); } else { @@ -1123,7 +1136,7 @@ void NotificationManager::push_exporting_finished_notification(const std::string void NotificationManager::push_upload_job_notification(int id, float filesize, const std::string& filename, const std::string& host, float percentage) { std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); - NotificationData data{ NotificationType::PrintHostUpload, NotificationLevel::ProgressBarNotification, 0, text }; + NotificationData data{ NotificationType::PrintHostUpload, NotificationLevel::ProgressBarNotification, 10, text }; push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, 0, id, filesize), 0); } void NotificationManager::set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage) diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 4f3900aeb4..4224694c4d 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -207,6 +207,7 @@ private: Unknown, // NOT initialized Hidden, Shown, // Requesting Render at some time if duration != 0 + NotFading, // Never jumps to state Fading out even if duration says so FadingOut, // Requesting Render at some time ClosePending, // Requesting Render Finished, // Requesting Render @@ -237,6 +238,7 @@ private: int64_t next_render() const { return is_finished() ? 0 : m_next_render; } EState get_state() const { return m_state; } bool is_hovered() const { return m_state == EState::Hovered; } + void set_hovered() { if (m_state != EState::Finished || m_state != EState::ClosePending || m_state != EState::Hidden || m_state != EState::Unknown) m_state = EState::Hovered; } // Call after every size change virtual void init(); @@ -401,6 +403,7 @@ private: { m_has_cancel_button = true; } + virtual void init() override; static std::string get_upload_job_text(int id, const std::string& filename, const std::string& host) { return "[" + std::to_string(id) + "] " + filename + " -> " + host; } virtual void set_percentage(float percent) override; void cancel() { m_uj_state = UploadJobState::PB_CANCELLED; m_has_cancel_button = false; } From 78e61eddf80830749de2d472b75a7dbe3043e2bd Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 23 Mar 2021 09:43:09 +0100 Subject: [PATCH 42/57] typo fix --- src/slic3r/GUI/NotificationManager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 4224694c4d..95532c94e4 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -238,7 +238,7 @@ private: int64_t next_render() const { return is_finished() ? 0 : m_next_render; } EState get_state() const { return m_state; } bool is_hovered() const { return m_state == EState::Hovered; } - void set_hovered() { if (m_state != EState::Finished || m_state != EState::ClosePending || m_state != EState::Hidden || m_state != EState::Unknown) m_state = EState::Hovered; } + void set_hovered() { if (m_state != EState::Finished && m_state != EState::ClosePending && m_state != EState::Hidden && m_state != EState::Unknown) m_state = EState::Hovered; } // Call after every size change virtual void init(); From 9118de4e3ce0d14451eadf816117ddc333a4327c Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 23 Mar 2021 14:46:55 +0100 Subject: [PATCH 43/57] Upload notification text fix --- src/slic3r/GUI/NotificationManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 533bcb8dc6..6c5918fdef 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -859,7 +859,7 @@ void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_PROGRESS: { ProgressBarNotification::render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); - float uploaded = m_file_size / 100 * m_percentage; + float uploaded = m_file_size * m_percentage; std::stringstream stream; stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "% - " << uploaded << " of " << m_file_size << "MB uploaded"; text = stream.str(); From c140974bf40b34345191a79d85410ea62898c2b7 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Fri, 26 Mar 2021 09:18:07 +0100 Subject: [PATCH 44/57] Changed ToolpathOuside error notification from plater to slicing error notification type so it is grayed out correctly --- src/slic3r/GUI/GLCanvas3D.cpp | 40 ++++++++++++++++++-------- src/slic3r/GUI/NotificationManager.cpp | 8 ++++++ src/slic3r/GUI/NotificationManager.hpp | 1 + 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2149f21e7c..fa3d96420b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6314,31 +6314,47 @@ std::vector GLCanvas3D::_parse_colors(const std::vector& col #if ENABLE_WARNING_TEXTURE_REMOVAL void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) { + enum ErrorType{ + PLATER_WARNING, + PLATER_ERROR, + SLICING_ERROR + }; std::string text; - bool error = false; + ErrorType error = ErrorType::PLATER_WARNING; switch (warning) { case EWarning::ObjectOutside: text = _u8L("An object outside the print area was detected."); break; - case EWarning::ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = true; break; - case EWarning::SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = true; break; + case EWarning::ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = ErrorType::SLICING_ERROR; break; + case EWarning::SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = ErrorType::PLATER_ERROR; break; case EWarning::SomethingNotShown: text = _u8L("Some objects are not visible."); break; case EWarning::ObjectClashed: text = _u8L("An object outside the print area was detected.\n" "Resolve the current problem to continue slicing."); - error = true; + error = ErrorType::PLATER_ERROR; break; } auto& notification_manager = *wxGetApp().plater()->get_notification_manager(); - if (state) { - if (error) - notification_manager.push_plater_error_notification(text); - else + switch (error) + { + case PLATER_WARNING: + if (state) notification_manager.push_plater_warning_notification(text); - } - else { - if (error) - notification_manager.close_plater_error_notification(text); else notification_manager.close_plater_warning_notification(text); + break; + case PLATER_ERROR: + if (state) + notification_manager.push_plater_error_notification(text); + else + notification_manager.close_plater_error_notification(text); + break; + case SLICING_ERROR: + if (state) + notification_manager.push_slicing_error_notification(text); + else + notification_manager.close_slicing_error_notification(text); + break; + default: + break; } } #else diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 6c5918fdef..144c89a1ec 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1072,6 +1072,14 @@ void NotificationManager::close_slicing_errors_and_warnings() } } } +void NotificationManager::close_slicing_error_notification(const std::string& text) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::SlicingError && notification->compare_text(_u8L("ERROR:") + "\n" + text)) { + notification->close(); + } + } +} void NotificationManager::push_slicing_complete_notification(int timestamp, bool large) { std::string hypertext; diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 95532c94e4..74ebedde2c 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -125,6 +125,7 @@ public: // void set_slicing_warning_gray(const std::string& text, bool g); // immediately stops showing slicing errors void close_slicing_errors_and_warnings(); + void close_slicing_error_notification(const std::string& text); // Release those slicing warnings, which refer to an ObjectID, which is not in the list. // living_oids is expected to be sorted. void remove_slicing_warnings_of_released_objects(const std::vector& living_oids); From fb645c63941743a8752b216bb04a3da465c8efca Mon Sep 17 00:00:00 2001 From: David Kocik Date: Mon, 29 Mar 2021 18:25:44 +0200 Subject: [PATCH 45/57] two line text for upload progress bar notification --- src/slic3r/GUI/NotificationManager.cpp | 56 ++++++++++++++++++-------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 144c89a1ec..980927d987 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -327,8 +327,8 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons if (m_multiline) { int last_end = 0; - float starting_y = m_line_height/2;//10; - float shift_y = m_line_height;// -m_line_height / 20; + float starting_y = m_line_height/2; + float shift_y = m_line_height; for (size_t i = 0; i < m_lines_count; i++) { std::string line = m_text1.substr(last_end , m_endlines[i] - last_end); if(i < m_lines_count - 1) @@ -789,8 +789,16 @@ bool NotificationManager::ExportFinishedNotification::on_text_click() void NotificationManager::ProgressBarNotification::init() { PopNotification::init(); - m_lines_count++; - m_endlines.push_back(m_endlines.back()); + //m_lines_count++; + if(m_lines_count >= 2) { + m_lines_count = 3; + m_multiline = true; + while (m_endlines.size() < 3) + m_endlines.push_back(m_endlines.back()); + } else { + m_lines_count = 2; + m_endlines.push_back(m_endlines.back()); + } if(m_state == EState::Shown) m_state = EState::NotFading; } @@ -813,20 +821,36 @@ void NotificationManager::ProgressBarNotification::count_spaces() void NotificationManager::ProgressBarNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { // line1 - we do not print any more text than what fits on line 1. Line 2 is bar. - ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 - win_size_y / 6 - m_line_height / 2); - imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); - if (m_has_cancel_button) - render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); - render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + if (m_multiline) { + // two lines text, one line bar + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(m_line_height / 4); + imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(m_line_height + m_line_height / 4); + std::string line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0), m_endlines[1] - m_endlines[0] - (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); + imgui.text(line.c_str()); + if (m_has_cancel_button) + render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + } else { + //one line text, one line bar + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(/*win_size_y / 2 - win_size_y / 6 -*/ m_line_height / 4); + imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); + if (m_has_cancel_button) + render_cancel_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + } + } void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImVec4 orange_color = ImVec4(.99f, .313f, .0f, 1.0f); ImVec4 gray_color = ImVec4(.34f, .34f, .34f, 1.0f); - ImVec2 lineEnd = ImVec2(win_pos_x - m_window_width_offset, win_pos_y + win_size_y / 2 + m_line_height / 4); - ImVec2 lineStart = ImVec2(win_pos_x - win_size_x + m_left_indentation, win_pos_y + win_size_y / 2 + m_line_height / 4); + ImVec2 lineEnd = ImVec2(win_pos_x - m_window_width_offset, win_pos_y + win_size_y / 2 + (m_multiline ? m_line_height / 2 : 0)); + ImVec2 lineStart = ImVec2(win_pos_x - win_size_x + m_left_indentation, win_pos_y + win_size_y / 2 + (m_multiline ? m_line_height / 2 : 0)); ImVec2 midPoint = ImVec2(lineStart.x + (lineEnd.x - lineStart.x) * m_percentage, lineStart.y); ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, IM_COL32((int)(gray_color.x * 255), (int)(gray_color.y * 255), (int)(gray_color.z * 255), (1.0f * 255.f)), m_line_height * 0.2f); ImGui::GetWindowDrawList()->AddLine(lineStart, midPoint, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (1.0f * 255.f)), m_line_height * 0.2f); @@ -864,23 +888,23 @@ void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "% - " << uploaded << " of " << m_file_size << "MB uploaded"; text = stream.str(); ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 /*- m_line_height / 4 * 3*/); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); break; } case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_ERROR: text = _u8L("ERROR"); ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - m_line_height / 2); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); break; case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_CANCELLED: text = _u8L("CANCELED"); ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - m_line_height / 2); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); break; case Slic3r::GUI::NotificationManager::PrintHostUploadNotification::UploadJobState::PB_COMPLETED: text = _u8L("COMPLETED"); ImGui::SetCursorPosX(m_left_indentation); - ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - m_line_height / 2); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? m_line_height / 4 : m_line_height / 2)); break; } From d7b385f14455cde0928e7bea90a91612afb1554d Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 30 Mar 2021 21:03:59 +0200 Subject: [PATCH 46/57] compare upload notification by id and not show id in text --- src/slic3r/GUI/NotificationManager.cpp | 44 +++++++++++++++++--------- src/slic3r/GUI/NotificationManager.hpp | 6 ++-- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 980927d987..005b3c11f1 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -552,7 +552,7 @@ void NotificationManager::PopNotification::update(const NotificationData& n) m_text2 = n.text2; init(); } -bool NotificationManager::PopNotification::compare_text(const std::string& text) +bool NotificationManager::PopNotification::compare_text(const std::string& text) const { std::wstring wt1 = boost::nowide::widen(m_text1); std::wstring wt2 = boost::nowide::widen(text); @@ -1167,39 +1167,53 @@ void NotificationManager::push_exporting_finished_notification(const std::string void NotificationManager::push_upload_job_notification(int id, float filesize, const std::string& filename, const std::string& host, float percentage) { + // find if upload with same id was not already in notification + // done by compare_jon_id not compare_text thus has to be performed here + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PrintHostUpload && dynamic_cast(notification.get())->compare_job_id(id)) { + return; + } + } std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); NotificationData data{ NotificationType::PrintHostUpload, NotificationLevel::ProgressBarNotification, 10, text }; push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, 0, id, filesize), 0); } void NotificationManager::set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage) { - std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); for (std::unique_ptr& notification : m_pop_notifications) { - if (notification->get_type() == NotificationType::PrintHostUpload && notification->compare_text(text)) { - dynamic_cast(notification.get())->set_percentage(percentage); - wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->set_percentage(percentage); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } } } } void NotificationManager::upload_job_notification_show_canceled(int id, const std::string& filename, const std::string& host) { - std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); for (std::unique_ptr& notification : m_pop_notifications) { - if (notification->get_type() == NotificationType::PrintHostUpload && notification->compare_text(text)) { - dynamic_cast(notification.get())->cancel(); - wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); - break; + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if (phun->compare_job_id(id)) { + phun->cancel(); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } } } } void NotificationManager::upload_job_notification_show_error(int id, const std::string& filename, const std::string& host) { - std::string text = PrintHostUploadNotification::get_upload_job_text(id, filename, host); for (std::unique_ptr& notification : m_pop_notifications) { - if (notification->get_type() == NotificationType::PrintHostUpload && notification->compare_text(text)) { - dynamic_cast(notification.get())->error(); - wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); - break; + if (notification->get_type() == NotificationType::PrintHostUpload) { + PrintHostUploadNotification* phun = dynamic_cast(notification.get()); + if(phun->compare_job_id(id)) { + phun->error(); + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + break; + } } } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 74ebedde2c..1cf7809883 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -232,7 +232,7 @@ private: const NotificationData get_data() const { return m_data; } const bool is_gray() const { return m_is_gray; } void set_gray(bool g) { m_is_gray = g; } - bool compare_text(const std::string& text); + virtual bool compare_text(const std::string& text) const; void hide(bool h) { if (is_finished()) return; m_state = h ? EState::Hidden : EState::Unknown; } // sets m_next_render with time of next mandatory rendering. Delta is time since last render. bool update_state(bool paused, const int64_t delta); @@ -405,10 +405,12 @@ private: m_has_cancel_button = true; } virtual void init() override; - static std::string get_upload_job_text(int id, const std::string& filename, const std::string& host) { return "[" + std::to_string(id) + "] " + filename + " -> " + host; } + static std::string get_upload_job_text(int id, const std::string& filename, const std::string& host) { return /*"[" + std::to_string(id) + "] " + */filename + " -> " + host; } virtual void set_percentage(float percent) override; void cancel() { m_uj_state = UploadJobState::PB_CANCELLED; m_has_cancel_button = false; } void error() { m_uj_state = UploadJobState::PB_ERROR; m_has_cancel_button = false; } + bool compare_job_id(const int other_id) const { return m_job_id == other_id; } + virtual bool compare_text(const std::string& text) const override { return false; } protected: virtual void render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, From 429675db2d52e79d8e6c29152acefb9f9e7879cf Mon Sep 17 00:00:00 2001 From: David Kocik Date: Sun, 11 Apr 2021 11:47:20 +0200 Subject: [PATCH 47/57] Error appearance of upload notification and dividing lines with lesser impotance of spaces --- src/slic3r/GUI/NotificationManager.cpp | 185 ++++++++++++++++++------- src/slic3r/GUI/NotificationManager.hpp | 27 ++-- 2 files changed, 157 insertions(+), 55 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 005b3c11f1..7f61ad7f39 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -188,22 +188,8 @@ void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float init fading_pop = true; } - // background color - if (m_is_gray) { - ImVec4 backcolor(0.7f, 0.7f, 0.7f, 0.5f); - Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); - } - else if (m_data.level == NotificationLevel::ErrorNotification) { - ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); - backcolor.x += 0.3f; - Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); - } - else if (m_data.level == NotificationLevel::WarningNotification) { - ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); - backcolor.x += 0.3f; - backcolor.y += 0.15f; - Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); - } + bool bgrnd_color_pop = push_background_color(); + // name of window indentifies window - has to be unique string if (m_id == 0) @@ -222,13 +208,34 @@ void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float init } imgui.end(); - if (m_is_gray || m_data.level == NotificationLevel::ErrorNotification || m_data.level == NotificationLevel::WarningNotification) + if (bgrnd_color_pop) ImGui::PopStyleColor(); if (fading_pop) ImGui::PopStyleColor(2); } - +bool NotificationManager::PopNotification::push_background_color() +{ + if (m_is_gray) { + ImVec4 backcolor(0.7f, 0.7f, 0.7f, 0.5f); + Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); + return true; + } + if (m_data.level == NotificationLevel::ErrorNotification) { + ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); + backcolor.x += 0.3f; + Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); + return true; + } + if (m_data.level == NotificationLevel::WarningNotification) { + ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); + backcolor.x += 0.3f; + backcolor.y += 0.15f; + Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); + return true; + } + return false; +} void NotificationManager::PopNotification::count_spaces() { //determine line width @@ -245,34 +252,28 @@ void NotificationManager::PopNotification::count_spaces() m_window_width = m_line_height * 25; } -void NotificationManager::PopNotification::init() +void NotificationManager::PopNotification::count_lines() { - // Do not init closing notification - if (is_finished()) - return; - - std::string text = m_text1 + " " + m_hypertext; - size_t last_end = 0; - m_lines_count = 0; + std::string text = m_text1 + " " + m_hypertext; + size_t last_end = 0; + m_lines_count = 0; - count_spaces(); - - // count lines m_endlines.clear(); while (last_end < text.length() - 1) { - size_t next_hard_end = text.find_first_of('\n', last_end); - if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { + size_t next_hard_end = text.find_first_of('\n', last_end); + if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { //next line is ended by '/n' m_endlines.push_back(next_hard_end); last_end = next_hard_end + 1; - } else { + } + else { // find next suitable endline if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) { // more than one line till end - size_t next_space = text.find_first_of(' ', last_end); + size_t next_space = text.find_first_of(' ', last_end); if (next_space > 0) { - size_t next_space_candidate = text.find_first_of(' ', next_space + 1); + size_t next_space_candidate = text.find_first_of(' ', next_space + 1); while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset) { next_space = next_space_candidate; next_space_candidate = text.find_first_of(' ', next_space + 1); @@ -286,7 +287,8 @@ void NotificationManager::PopNotification::init() } m_endlines.push_back(last_end + letter_count); last_end += letter_count; - } else { + } + else { m_endlines.push_back(next_space); last_end = next_space + 1; } @@ -300,6 +302,17 @@ void NotificationManager::PopNotification::init() } m_lines_count++; } +} + +void NotificationManager::PopNotification::init() +{ + // Do not init closing notification + if (is_finished()) + return; + + count_spaces(); + count_lines(); + if (m_lines_count == 3) m_multiline = true; m_notification_start = GLCanvas3D::timestamp_now(); @@ -802,22 +815,64 @@ void NotificationManager::ProgressBarNotification::init() if(m_state == EState::Shown) m_state = EState::NotFading; } -void NotificationManager::ProgressBarNotification::count_spaces() -{ - //determine line width - m_line_height = ImGui::CalcTextSize("A").y; - m_left_indentation = m_line_height; - if (m_data.level == NotificationLevel::ErrorNotification || m_data.level == NotificationLevel::WarningNotification) { - std::string text; - text = (m_data.level == NotificationLevel::ErrorNotification ? ImGui::ErrorMarker : ImGui::WarningMarker); - float picture_width = ImGui::CalcTextSize(text.c_str()).x; - m_left_indentation = picture_width + m_line_height / 2; + +void NotificationManager::ProgressBarNotification::count_lines() +{ + std::string text = m_text1 + " " + m_hypertext; + size_t last_end = 0; + m_lines_count = 0; + + m_endlines.clear(); + while (last_end < text.length() - 1) + { + size_t next_hard_end = text.find_first_of('\n', last_end); + if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { + //next line is ended by '/n' + m_endlines.push_back(next_hard_end); + last_end = next_hard_end + 1; + } + else { + // find next suitable endline + if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) { + // more than one line till end + size_t next_space = text.find_first_of(' ', last_end); + if (next_space > 0) { + size_t next_space_candidate = text.find_first_of(' ', next_space + 1); + while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset) { + next_space = next_space_candidate; + next_space_candidate = text.find_first_of(' ', next_space + 1); + } + // when one word longer than line. Or the last space is too early. + if (ImGui::CalcTextSize(text.substr(last_end, next_space - last_end).c_str()).x > m_window_width - m_window_width_offset || + ImGui::CalcTextSize(text.substr(last_end, next_space - last_end).c_str()).x < (m_window_width - m_window_width_offset) / 4 * 3 + ) { + float width_of_a = ImGui::CalcTextSize("a").x; + int letter_count = (int)((m_window_width - m_window_width_offset) / width_of_a); + while (last_end + letter_count < text.size() && ImGui::CalcTextSize(text.substr(last_end, letter_count).c_str()).x < m_window_width - m_window_width_offset) { + letter_count++; + } + m_endlines.push_back(last_end + letter_count); + last_end += letter_count; + } + else { + m_endlines.push_back(next_space); + last_end = next_space + 1; + } + } + } + else { + m_endlines.push_back(text.length()); + last_end = text.length(); + } + + } + m_lines_count++; } - m_window_width_offset = m_line_height * (m_has_cancel_button ? 6 : 4); - m_window_width = m_line_height * 25; } + + void NotificationManager::ProgressBarNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { // line1 - we do not print any more text than what fits on line 1. Line 2 is bar. @@ -862,6 +917,32 @@ void NotificationManager::PrintHostUploadNotification::init() if (m_state == EState::NotFading && m_uj_state == UploadJobState::PB_COMPLETED) m_state = EState::Shown; } +void NotificationManager::PrintHostUploadNotification::count_spaces() +{ + //determine line width + m_line_height = ImGui::CalcTextSize("A").y; + + m_left_indentation = m_line_height; + if (m_uj_state == UploadJobState::PB_ERROR) { + std::string text; + text = (m_data.level == NotificationLevel::ErrorNotification ? ImGui::ErrorMarker : ImGui::WarningMarker); + float picture_width = ImGui::CalcTextSize(text.c_str()).x; + m_left_indentation = picture_width + m_line_height / 2; + } + m_window_width_offset = m_line_height * 6; //(m_has_cancel_button ? 6 : 4); + m_window_width = m_line_height * 25; +} +bool NotificationManager::PrintHostUploadNotification::push_background_color() +{ + + if (m_uj_state == UploadJobState::PB_ERROR) { + ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg); + backcolor.x += 0.3f; + Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_state == EState::FadingOut, m_current_fade_opacity); + return true; + } + return false; +} void NotificationManager::PrintHostUploadNotification::set_percentage(float percent) { m_percentage = percent; @@ -911,6 +992,16 @@ void NotificationManager::PrintHostUploadNotification::render_bar(ImGuiWrapper& imgui.text(text.c_str()); } +void NotificationManager::PrintHostUploadNotification::render_left_sign(ImGuiWrapper& imgui) +{ + if (m_uj_state == UploadJobState::PB_ERROR) { + std::string text; + text = ImGui::ErrorMarker; + ImGui::SetCursorPosX(m_line_height / 3); + ImGui::SetCursorPosY(m_window_height / 2 - m_line_height); + imgui.text(text.c_str()); + } +} void NotificationManager::PrintHostUploadNotification::render_cancel_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImVec2 win_size(win_size_x, win_size_y); diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 1cf7809883..17657948e6 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -240,11 +240,9 @@ private: EState get_state() const { return m_state; } bool is_hovered() const { return m_state == EState::Hovered; } void set_hovered() { if (m_state != EState::Finished && m_state != EState::ClosePending && m_state != EState::Hidden && m_state != EState::Unknown) m_state = EState::Hovered; } - + protected: // Call after every size change virtual void init(); - // Part of init() - virtual void count_spaces(); // Calculetes correct size but not se it in imgui! virtual void set_next_window_size(ImGuiWrapper& imgui); virtual void render_text(ImGuiWrapper& imgui, @@ -258,13 +256,20 @@ private: const std::string text, bool more = false); // Left sign could be error or warning sign - void render_left_sign(ImGuiWrapper& imgui); + virtual void render_left_sign(ImGuiWrapper& imgui); virtual void render_minimize_button(ImGuiWrapper& imgui, const float win_pos_x, const float win_pos_y); // Hypertext action, returns true if notification should close. // Action is stored in NotificationData::callback as std::function virtual bool on_text_click(); - protected: + + // Part of init(), counts horizontal spacing like left indentation + virtual void count_spaces(); + // Part of init(), counts end lines + virtual void count_lines(); + // returns true if PopStyleColor should be called later to pop this push + virtual bool push_background_color(); + const NotificationData m_data; // For reusing ImGUI windows. NotificationIDProvider &m_id_provider; @@ -367,7 +372,8 @@ private: virtual void set_percentage(float percent) { m_percentage = percent; } protected: virtual void init() override; - virtual void count_spaces() override; + virtual void count_lines() override; + virtual void render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; @@ -378,6 +384,8 @@ private: const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) {} + virtual void render_minimize_button(ImGuiWrapper& imgui, + const float win_pos_x, const float win_pos_y) override {} float m_percentage; bool m_has_cancel_button {false}; @@ -404,20 +412,23 @@ private: { m_has_cancel_button = true; } - virtual void init() override; static std::string get_upload_job_text(int id, const std::string& filename, const std::string& host) { return /*"[" + std::to_string(id) + "] " + */filename + " -> " + host; } virtual void set_percentage(float percent) override; void cancel() { m_uj_state = UploadJobState::PB_CANCELLED; m_has_cancel_button = false; } - void error() { m_uj_state = UploadJobState::PB_ERROR; m_has_cancel_button = false; } + void error() { m_uj_state = UploadJobState::PB_ERROR; m_has_cancel_button = false; init(); } bool compare_job_id(const int other_id) const { return m_job_id == other_id; } virtual bool compare_text(const std::string& text) const override { return false; } protected: + virtual void init() override; + virtual void count_spaces() override; + virtual bool push_background_color() override; virtual void render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; virtual void render_cancel_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; + virtual void render_left_sign(ImGuiWrapper& imgui) override; // Identifies job in cancel callback int m_job_id; // Size of uploaded size to be displayed in MB From 453884f908d744609915b6e269c464cae3f4c827 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 13 Apr 2021 08:39:07 +0200 Subject: [PATCH 48/57] Check of correct suffix during PrintHostSend dialog. --- src/slic3r/GUI/PrintHostDialogs.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index f69db2ea30..762450c537 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -68,8 +68,10 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_pr combo_groups->SetValue(recent_group); } - btn_sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL)); - + auto* szr = CreateStdDialogButtonSizer(wxOK | wxCANCEL); + auto* btn_ok = szr->GetAffirmativeButton(); + btn_sizer->Add(szr); + wxString recent_path = from_u8(app_config->get("recent", CONFIG_KEY_PATH)); if (recent_path.Length() > 0 && recent_path[recent_path.Length() - 1] != '/') { recent_path += '/'; @@ -82,6 +84,20 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_pr txt_filename->SetValue(recent_path); txt_filename->SetFocus(); + wxString suffix = recent_path.substr(recent_path.find_last_of('.')); + + btn_ok->Bind(wxEVT_BUTTON, [this, suffix](wxCommandEvent&) { + wxString path = txt_filename->GetValue(); + // .gcode suffix control + if (!path.Lower().EndsWith(suffix.Lower())) + { + wxMessageDialog msg_wingow(this, wxString::Format(_L("Upload filename doesn't end with \"%s\". Do you wish to continue?"), suffix), wxString(SLIC3R_APP_NAME), wxYES | wxNO); + if (msg_wingow.ShowModal() == wxID_NO) + return; + } + EndDialog(wxID_OK); + }); + Fit(); CenterOnParent(); From b0bb1e7b1db6d2b5bca3613df3fb5c5a087ecfa5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 20 Apr 2021 11:42:34 +0200 Subject: [PATCH 49/57] Removed mutable members from class OpenGLManager::GLInfo --- src/slic3r/GUI/OpenGLManager.cpp | 36 +++++++++++++++----------------- src/slic3r/GUI/OpenGLManager.hpp | 14 ++++++------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp index 0b24617172..91f1f1f0b6 100644 --- a/src/slic3r/GUI/OpenGLManager.cpp +++ b/src/slic3r/GUI/OpenGLManager.cpp @@ -90,22 +90,24 @@ float OpenGLManager::GLInfo::get_max_anisotropy() const void OpenGLManager::GLInfo::detect() const { - m_version = gl_get_string_safe(GL_VERSION, "N/A"); - m_glsl_version = gl_get_string_safe(GL_SHADING_LANGUAGE_VERSION, "N/A"); - m_vendor = gl_get_string_safe(GL_VENDOR, "N/A"); - m_renderer = gl_get_string_safe(GL_RENDERER, "N/A"); + *const_cast(&m_version) = gl_get_string_safe(GL_VERSION, "N/A"); + *const_cast(&m_glsl_version) = gl_get_string_safe(GL_SHADING_LANGUAGE_VERSION, "N/A"); + *const_cast(&m_vendor) = gl_get_string_safe(GL_VENDOR, "N/A"); + *const_cast(&m_renderer) = gl_get_string_safe(GL_RENDERER, "N/A"); - glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_max_tex_size)); + int* max_tex_size = const_cast(&m_max_tex_size); + glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, max_tex_size)); - m_max_tex_size /= 2; + *max_tex_size /= 2; if (Slic3r::total_physical_memory() / (1024 * 1024 * 1024) < 6) - m_max_tex_size /= 2; + *max_tex_size /= 2; - if (GLEW_EXT_texture_filter_anisotropic) - glsafe(::glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_max_anisotropy)); - - m_detected = true; + if (GLEW_EXT_texture_filter_anisotropic) { + float* max_anisotropy = const_cast(&m_max_anisotropy); + glsafe(::glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy)); + } + *const_cast(&m_detected) = true; } static bool version_greater_or_equal_to(const std::string& version, unsigned int major, unsigned int minor) @@ -174,19 +176,16 @@ std::string OpenGLManager::GLInfo::to_string(bool format_as_html, bool extension out << b_start << "Renderer: " << b_end << m_renderer << line_end; out << b_start << "GLSL version: " << b_end << m_glsl_version << line_end; - if (extensions) - { + if (extensions) { std::vector extensions_list; std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, ""); boost::split(extensions_list, extensions_str, boost::is_any_of(" "), boost::token_compress_off); - if (!extensions_list.empty()) - { + if (!extensions_list.empty()) { out << h2_start << "Installed extensions:" << h2_end << line_end; std::sort(extensions_list.begin(), extensions_list.end()); - for (const std::string& ext : extensions_list) - { + for (const std::string& ext : extensions_list) { out << ext << line_end; } } @@ -304,8 +303,7 @@ wxGLCanvas* OpenGLManager::create_wxglcanvas(wxWindow& parent) 0 }; - if (s_multisample == EMultisampleState::Unknown) - { + if (s_multisample == EMultisampleState::Unknown) { detect_multisample(attribList); // // debug output // std::cout << "Multisample " << (can_multisample() ? "enabled" : "disabled") << std::endl; diff --git a/src/slic3r/GUI/OpenGLManager.hpp b/src/slic3r/GUI/OpenGLManager.hpp index 5f8cd7959c..ca9452db66 100644 --- a/src/slic3r/GUI/OpenGLManager.hpp +++ b/src/slic3r/GUI/OpenGLManager.hpp @@ -22,14 +22,14 @@ public: class GLInfo { - mutable bool m_detected{ false }; - mutable int m_max_tex_size{ 0 }; - mutable float m_max_anisotropy{ 0.0f }; + bool m_detected{ false }; + int m_max_tex_size{ 0 }; + float m_max_anisotropy{ 0.0f }; - mutable std::string m_version; - mutable std::string m_glsl_version; - mutable std::string m_vendor; - mutable std::string m_renderer; + std::string m_version; + std::string m_glsl_version; + std::string m_vendor; + std::string m_renderer; public: GLInfo() = default; From 0e3090fb28f2fb672a73747ed1d666ed756e4e5f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 20 Apr 2021 12:16:55 +0200 Subject: [PATCH 50/57] Removed mutable members from class GLCanvas3D --- src/slic3r/GUI/GLCanvas3D.cpp | 164 +++++++++++++++++----------------- src/slic3r/GUI/GLCanvas3D.hpp | 40 ++++----- 2 files changed, 98 insertions(+), 106 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index fa3d96420b..97038723bb 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3528,7 +3528,7 @@ Vec2d GLCanvas3D::get_local_mouse_position() const void GLCanvas3D::set_tooltip(const std::string& tooltip) const { if (m_canvas != nullptr) - m_tooltip.set_text(tooltip); + const_cast(&m_tooltip)->set_text(tooltip); } void GLCanvas3D::do_move(const std::string& snapshot_type) @@ -3545,22 +3545,19 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) Selection::EMode selection_mode = m_selection.get_mode(); - for (const GLVolume* v : m_volumes.volumes) - { + for (const GLVolume* v : m_volumes.volumes) { int object_idx = v->object_idx(); int instance_idx = v->instance_idx(); int volume_idx = v->volume_idx(); std::pair done_id(object_idx, instance_idx); - if ((0 <= object_idx) && (object_idx < (int)m_model->objects.size())) - { + if (0 <= object_idx && object_idx < (int)m_model->objects.size()) { done.insert(done_id); // Move instances/volumes ModelObject* model_object = m_model->objects[object_idx]; - if (model_object != nullptr) - { + if (model_object != nullptr) { if (selection_mode == Selection::Instance) model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); else if (selection_mode == Selection::Volume) @@ -3576,8 +3573,7 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) } // Fixes sinking/flying instances - for (const std::pair& i : done) - { + for (const std::pair& i : done) { ModelObject* m = m_model->objects[i.first]; Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); m_selection.translate(i.first, i.second, shift); @@ -3936,13 +3932,13 @@ bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const em *= m_retina_helper->get_scale_factor(); #endif - if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected, m_mouse_wheel)) - m_imgui_undo_redo_hovered_pos = hovered; + int* mouse_wheel = const_cast(&m_mouse_wheel); + if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected, *mouse_wheel)) + *const_cast(&m_imgui_undo_redo_hovered_pos) = hovered; else - m_imgui_undo_redo_hovered_pos = -1; + *const_cast(&m_imgui_undo_redo_hovered_pos) = -1; - if (selected >= 0) - { + if (selected >= 0) { is_undo ? wxGetApp().plater()->undo_to(selected) : wxGetApp().plater()->redo_to(selected); action_taken = true; } @@ -3983,9 +3979,10 @@ bool GLCanvas3D::_render_search_list(float pos_x) const char *s = new char[255]; strcpy(s, search_line.empty() ? _u8L("Enter a search term").c_str() : search_line.c_str()); - imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, - sidebar.get_searcher().view_params, - selected, edited, m_mouse_wheel, wxGetApp().is_localized()); + int* mouse_wheel = const_cast(&m_mouse_wheel); + imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, + sidebar.get_searcher().view_params, + selected, edited, *mouse_wheel, wxGetApp().is_localized()); search_line = s; delete [] s; @@ -4844,8 +4841,10 @@ void GLCanvas3D::_refresh_if_shown_on_screen() void GLCanvas3D::_picking_pass() const { + std::vector* hover_volume_idxs = const_cast*>(&m_hover_volume_idxs); + if (m_picking_enabled && !m_mouse.dragging && m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)) { - m_hover_volume_idxs.clear(); + hover_volume_idxs->clear(); // Render the object for picking. // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. @@ -4860,9 +4859,10 @@ void GLCanvas3D::_picking_pass() const glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - m_camera_clipping_plane = m_gizmos.get_clipping_plane(); - if (m_camera_clipping_plane.is_active()) { - ::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)m_camera_clipping_plane.get_data()); + ClippingPlane* camera_clipping_plane = const_cast(&m_camera_clipping_plane); + *camera_clipping_plane = m_gizmos.get_clipping_plane(); + if (camera_clipping_plane->is_active()) { + ::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)camera_clipping_plane->get_data()); ::glEnable(GL_CLIP_PLANE0); } _render_volumes_for_picking(); @@ -4888,11 +4888,11 @@ void GLCanvas3D::_picking_pass() const if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { // do not add the volume id if any gizmo is active and CTRL is pressed if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL)) - m_hover_volume_idxs.emplace_back(volume_id); - m_gizmos.set_hover_id(-1); + hover_volume_idxs->emplace_back(volume_id); + const_cast(&m_gizmos)->set_hover_id(-1); } else - m_gizmos.set_hover_id(inside && (unsigned int)volume_id <= GLGizmoBase::BASE_ID ? ((int)GLGizmoBase::BASE_ID - volume_id) : -1); + const_cast(&m_gizmos)->set_hover_id(inside && (unsigned int)volume_id <= GLGizmoBase::BASE_ID ? ((int)GLGizmoBase::BASE_ID - volume_id) : -1); _update_volumes_hover_state(); } @@ -4900,12 +4900,11 @@ void GLCanvas3D::_picking_pass() const void GLCanvas3D::_rectangular_selection_picking_pass() const { - m_gizmos.set_hover_id(-1); + const_cast(&m_gizmos)->set_hover_id(-1); std::set idxs; - if (m_picking_enabled) - { + if (m_picking_enabled) { if (m_multisample_allowed) // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. glsafe(::glDisable(GL_MULTISAMPLE)); @@ -4926,8 +4925,7 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const int left = (int)m_rectangle_selection.get_left(); int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); - if ((left >= 0) && (top >= 0)) - { + if (left >= 0 && top >= 0) { #define USE_PARALLEL 1 #if USE_PARALLEL struct Pixel @@ -4947,7 +4945,7 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const for (size_t i = range.begin(); i < range.end(); ++i) if (frame[i].valid()) { int volume_id = frame[i].id(); - if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) { + if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) { mutex.lock(); idxs.insert(volume_id); mutex.unlock(); @@ -4962,14 +4960,14 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const { int px_id = 4 * i; int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); - if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) + if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) idxs.insert(volume_id); } #endif // USE_PARALLEL } } - m_hover_volume_idxs.assign(idxs.begin(), idxs.end()); + const_cast*>(&m_hover_volume_idxs)->assign(idxs.begin(), idxs.end()); _update_volumes_hover_state(); } @@ -5062,7 +5060,9 @@ void GLCanvas3D::_render_objects() const glsafe(::glEnable(GL_DEPTH_TEST)); - m_camera_clipping_plane = m_gizmos.get_clipping_plane(); + ClippingPlane* camera_clipping_plane = const_cast(&m_camera_clipping_plane); + GLVolumeCollection* volumes = const_cast(&m_volumes); + *camera_clipping_plane = m_gizmos.get_clipping_plane(); if (m_picking_enabled) { // Update the layer editing selection to the first object selected, update the current object maximum Z. @@ -5070,17 +5070,17 @@ void GLCanvas3D::_render_objects() const if (m_config != nullptr) { const BoundingBoxf3& bed_bb = wxGetApp().plater()->get_bed().get_bounding_box(false); - m_volumes.set_print_box((float)bed_bb.min(0) - BedEpsilon, (float)bed_bb.min(1) - BedEpsilon, 0.0f, (float)bed_bb.max(0) + BedEpsilon, (float)bed_bb.max(1) + BedEpsilon, (float)m_config->opt_float("max_print_height")); - m_volumes.check_outside_state(m_config, nullptr); + volumes->set_print_box((float)bed_bb.min(0) - BedEpsilon, (float)bed_bb.min(1) - BedEpsilon, 0.0f, (float)bed_bb.max(0) + BedEpsilon, (float)bed_bb.max(1) + BedEpsilon, (float)m_config->opt_float("max_print_height")); + volumes->check_outside_state(m_config, nullptr); } } if (m_use_clipping_planes) - m_volumes.set_z_range(-m_clipping_planes[0].get_data()[3], m_clipping_planes[1].get_data()[3]); + volumes->set_z_range(-m_clipping_planes[0].get_data()[3], m_clipping_planes[1].get_data()[3]); else - m_volumes.set_z_range(-FLT_MAX, FLT_MAX); + volumes->set_z_range(-FLT_MAX, FLT_MAX); - m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data()); + volumes->set_clipping_plane(camera_clipping_plane->get_data()); GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); if (shader != nullptr) { @@ -5088,16 +5088,16 @@ void GLCanvas3D::_render_objects() const if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { int object_id = m_layers_editing.last_object_id; - m_volumes.render(GLVolumeCollection::Opaque, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) { + volumes->render(GLVolumeCollection::Opaque, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) { // Which volume to paint without the layer height profile shader? return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); }); // Let LayersEditing handle rendering of the active object using the layer height profile shader. - m_layers_editing.render_volumes(*this, this->m_volumes); + m_layers_editing.render_volumes(*this, *volumes); } else { - // do not cull backfaces to show broken geometry, if any - m_volumes.render(GLVolumeCollection::Opaque, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) { - return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); + // do not cull backfaces to show broken geometry, if any + volumes->render(GLVolumeCollection::Opaque, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) { + return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); }); } @@ -5115,11 +5115,11 @@ void GLCanvas3D::_render_objects() const } } - m_volumes.render(GLVolumeCollection::Transparent, false, wxGetApp().plater()->get_camera().get_view_matrix()); + volumes->render(GLVolumeCollection::Transparent, false, wxGetApp().plater()->get_camera().get_view_matrix()); shader->stop_using(); } - m_camera_clipping_plane = ClippingPlane::ClipsNothing(); + *camera_clipping_plane = ClippingPlane::ClipsNothing(); } void GLCanvas3D::_render_gcode() const @@ -5160,13 +5160,13 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); #if ENABLE_RETINA_GL const float sc = m_retina_helper->get_scale_factor() * scale; - m_main_toolbar.set_scale(sc); - m_undoredo_toolbar.set_scale(sc); + const_cast(&m_main_toolbar)->set_scale(sc); + const_cast(&m_undoredo_toolbar)->set_scale(sc); collapse_toolbar.set_scale(sc); size *= m_retina_helper->get_scale_factor(); #else - m_main_toolbar.set_icons_size(size); - m_undoredo_toolbar.set_icons_size(size); + const_cast(&m_main_toolbar)->set_icons_size(size); + const_cast(&m_undoredo_toolbar)->set_icons_size(size); collapse_toolbar.set_icons_size(size); #endif // ENABLE_RETINA_GL @@ -5214,13 +5214,13 @@ void GLCanvas3D::_render_overlays() const // to correctly place them #if ENABLE_RETINA_GL const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(/*true*/); - m_main_toolbar.set_scale(scale); - m_undoredo_toolbar.set_scale(scale); + const_cast(&m_main_toolbar)->set_scale(scale); + const_cast(&m_undoredo_toolbar)->set_scale(scale); wxGetApp().plater()->get_collapse_toolbar().set_scale(scale); #else const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(/*true*/)); - m_main_toolbar.set_icons_size(size); - m_undoredo_toolbar.set_icons_size(size); + const_cast(&m_main_toolbar)->set_icons_size(size); + const_cast(&m_undoredo_toolbar)->set_icons_size(size); wxGetApp().plater()->get_collapse_toolbar().set_icons_size(size); #endif // ENABLE_RETINA_GL @@ -5295,12 +5295,12 @@ void GLCanvas3D::_render_gizmos_overlay() const #if ENABLE_RETINA_GL // m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor()); const float scale = m_retina_helper->get_scale_factor()*wxGetApp().toolbar_icon_scale(); - m_gizmos.set_overlay_scale(scale); //! #ys_FIXME_experiment + const_cast(&m_gizmos)->set_overlay_scale(scale); //! #ys_FIXME_experiment #else // m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor()); // m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f); - const float size = int(GLGizmosManager::Default_Icons_Size*wxGetApp().toolbar_icon_scale()); - m_gizmos.set_overlay_icon_size(size); //! #ys_FIXME_experiment + const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); + const_cast(&m_gizmos)->set_overlay_icon_size(size); //! #ys_FIXME_experiment #endif /* __WXMSW__ */ m_gizmos.render_overlay(); @@ -5319,8 +5319,9 @@ void GLCanvas3D::_render_main_toolbar() const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; - m_main_toolbar.set_position(top, left); - m_main_toolbar.render(*this); + GLToolbar* main_toolbar = const_cast(&m_main_toolbar); + main_toolbar->set_position(top, left); + main_toolbar->render(*this); } void GLCanvas3D::_render_undoredo_toolbar() const @@ -5335,8 +5336,10 @@ void GLCanvas3D::_render_undoredo_toolbar() const const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; - m_undoredo_toolbar.set_position(top, left); - m_undoredo_toolbar.render(*this); + + GLToolbar* undoredo_toolbar = const_cast(&m_undoredo_toolbar); + undoredo_toolbar->set_position(top, left); + undoredo_toolbar->render(*this); } void GLCanvas3D::_render_collapse_toolbar() const @@ -5427,20 +5430,21 @@ void GLCanvas3D::_render_sla_slices() const if (!obj->is_step_done(slaposSliceSupports)) continue; - SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); - SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); + SlaCap* sla_caps = const_cast(m_sla_caps); + SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = sla_caps[0].triangles.find(i); + SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = sla_caps[1].triangles.find(i); { - if (it_caps_bottom == m_sla_caps[0].triangles.end()) - it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; - if (! m_sla_caps[0].matches(clip_min_z)) { - m_sla_caps[0].z = clip_min_z; + if (it_caps_bottom == sla_caps[0].triangles.end()) + it_caps_bottom = sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; + if (!sla_caps[0].matches(clip_min_z)) { + sla_caps[0].z = clip_min_z; it_caps_bottom->second.object.clear(); it_caps_bottom->second.supports.clear(); } - if (it_caps_top == m_sla_caps[1].triangles.end()) - it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; - if (! m_sla_caps[1].matches(clip_max_z)) { - m_sla_caps[1].z = clip_max_z; + if (it_caps_top == sla_caps[1].triangles.end()) + it_caps_top = sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; + if (!sla_caps[1].matches(clip_max_z)) { + sla_caps[1].z = clip_max_z; it_caps_top->second.object.clear(); it_caps_top->second.supports.clear(); } @@ -5546,7 +5550,7 @@ void GLCanvas3D::_update_volumes_hover_state() const if (alt_pressed && (shift_pressed || ctrl_pressed)) { // illegal combinations of keys - m_hover_volume_idxs.clear(); + const_cast*>(&m_hover_volume_idxs)->clear(); return; } @@ -5570,7 +5574,7 @@ void GLCanvas3D::_update_volumes_hover_state() const if (hover_modifiers_only && !hover_from_single_instance) { // do not allow to select volumes from different instances - m_hover_volume_idxs.clear(); + const_cast*>(&m_hover_volume_idxs)->clear(); return; } @@ -5591,23 +5595,15 @@ void GLCanvas3D::_update_volumes_hover_state() const (deselect && !m_selection.is_single_full_instance() && (volume.object_idx() == m_selection.get_object_idx()) && (volume.instance_idx() == m_selection.get_instance_idx())) ); - if (as_volume) { - if (deselect) - volume.hover = GLVolume::HS_Deselect; - else - volume.hover = GLVolume::HS_Select; - } + if (as_volume) + volume.hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; else { int object_idx = volume.object_idx(); int instance_idx = volume.instance_idx(); for (GLVolume* v : m_volumes.volumes) { - if (v->object_idx() == object_idx && v->instance_idx() == instance_idx) { - if (deselect) - v->hover = GLVolume::HS_Deselect; - else - v->hover = GLVolume::HS_Select; - } + if (v->object_idx() == object_idx && v->instance_idx() == instance_idx) + v->hover = deselect ? GLVolume::HS_Deselect : GLVolume::HS_Select; } } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index f4d862b66c..9e9a2501e1 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -449,13 +449,13 @@ private: wxTimer m_timer; LayersEditing m_layers_editing; Mouse m_mouse; - mutable GLGizmosManager m_gizmos; - mutable GLToolbar m_main_toolbar; - mutable GLToolbar m_undoredo_toolbar; + GLGizmosManager m_gizmos; + GLToolbar m_main_toolbar; + GLToolbar m_undoredo_toolbar; ClippingPlane m_clipping_planes[2]; - mutable ClippingPlane m_camera_clipping_plane; + ClippingPlane m_camera_clipping_plane; bool m_use_clipping_planes; - mutable SlaCap m_sla_caps[2]; + SlaCap m_sla_caps[2]; std::string m_sidebar_field; // when true renders an extra frame by not resetting m_dirty to false // see request_extra_frame() @@ -463,7 +463,7 @@ private: int m_extra_frame_requested_delayed { std::numeric_limits::max() }; bool m_event_handlers_bound{ false }; - mutable GLVolumeCollection m_volumes; + GLVolumeCollection m_volumes; GCodeViewer m_gcode_viewer; RenderTimer m_render_timer; @@ -478,7 +478,6 @@ private: bool m_dirty; bool m_initialized; bool m_apply_zoom_to_volumes_filter; - mutable std::vector m_hover_volume_idxs; bool m_picking_enabled; bool m_moving_enabled; bool m_dynamic_background_enabled; @@ -487,6 +486,7 @@ private: bool m_tab_down; ECursorType m_cursor_type; GLSelectionRectangle m_rectangle_selection; + std::vector m_hover_volume_idxs; // Following variable is obsolete and it should be safe to remove it. // I just don't want to do it now before a release (Lukas Matena 24.3.2019) @@ -504,13 +504,13 @@ private: RenderStats m_render_stats; #endif // ENABLE_RENDER_STATISTICS - mutable int m_imgui_undo_redo_hovered_pos{ -1 }; - mutable int m_mouse_wheel {0}; + int m_imgui_undo_redo_hovered_pos{ -1 }; + int m_mouse_wheel{ 0 }; int m_selected_extruder; Labels m_labels; - mutable Tooltip m_tooltip; - mutable bool m_tooltip_enabled{ true }; + Tooltip m_tooltip; + bool m_tooltip_enabled{ true }; Slope m_slope; ArrangeSettings m_arrange_settings_fff, m_arrange_settings_sla, @@ -519,8 +519,7 @@ private: PrinterTechnology current_printer_technology() const; template - static auto & get_arrange_settings(Self *self) - { + static auto & get_arrange_settings(Self *self) { PrinterTechnology ptech = self->current_printer_technology(); auto *ptr = &self->m_arrange_settings_fff; @@ -529,11 +528,10 @@ private: ptr = &self->m_arrange_settings_sla; } else if (ptech == ptFFF) { auto co_opt = self->m_config->template option("complete_objects"); - if (co_opt && co_opt->value) { + if (co_opt && co_opt->value) ptr = &self->m_arrange_settings_fff_seq_print; - } else { + else ptr = &self->m_arrange_settings_fff; - } } return *ptr; @@ -715,10 +713,9 @@ public: double m_rotation = 0.; BoundingBoxf m_bb; friend class GLCanvas3D; - public: - - inline operator bool() const - { + + public: + inline operator bool() const { return !std::isnan(m_pos.x()) && !std::isnan(m_pos.y()); } @@ -763,8 +760,7 @@ public: void use_slope(bool use) { m_slope.use(use); } void set_slope_normal_angle(float angle_in_deg) { m_slope.set_normal_angle(angle_in_deg); } - ArrangeSettings get_arrange_settings() const - { + ArrangeSettings get_arrange_settings() const { const ArrangeSettings &settings = get_arrange_settings(this); ArrangeSettings ret = settings; if (&settings == &m_arrange_settings_fff_seq_print) { From 6be2a1be2c9b053b4cd994f816c76a3ef722deb1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 20 Apr 2021 12:55:23 +0200 Subject: [PATCH 51/57] Removed mutable members from class GLVolume --- src/slic3r/GUI/3DScene.cpp | 42 ++++++++++++++++++++------------------ src/slic3r/GUI/3DScene.hpp | 12 +++++------ 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 6c226cd74d..ba62576f23 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -421,20 +421,24 @@ const BoundingBoxf3& GLVolume::transformed_bounding_box() const const BoundingBoxf3& box = bounding_box(); assert(box.defined || box.min(0) >= box.max(0) || box.min(1) >= box.max(1) || box.min(2) >= box.max(2)); - if (m_transformed_bounding_box_dirty) - { - m_transformed_bounding_box = box.transformed(world_matrix()); - m_transformed_bounding_box_dirty = false; + BoundingBoxf3* transformed_bounding_box = const_cast(&m_transformed_bounding_box); + bool* transformed_bounding_box_dirty = const_cast(&m_transformed_bounding_box_dirty); + if (*transformed_bounding_box_dirty) { + *transformed_bounding_box = box.transformed(world_matrix()); + *transformed_bounding_box_dirty = false; } - - return m_transformed_bounding_box; + return *transformed_bounding_box; } const BoundingBoxf3& GLVolume::transformed_convex_hull_bounding_box() const { - if (m_transformed_convex_hull_bounding_box_dirty) - m_transformed_convex_hull_bounding_box = this->transformed_convex_hull_bounding_box(world_matrix()); - return m_transformed_convex_hull_bounding_box; + BoundingBoxf3* transformed_convex_hull_bounding_box = const_cast(&m_transformed_convex_hull_bounding_box); + bool* transformed_convex_hull_bounding_box_dirty = const_cast(&m_transformed_convex_hull_bounding_box_dirty); + if (*transformed_convex_hull_bounding_box_dirty) { + *transformed_convex_hull_bounding_box = this->transformed_convex_hull_bounding_box(world_matrix()); + *transformed_convex_hull_bounding_box_dirty = false; + } + return *transformed_convex_hull_bounding_box; } BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d &trafo) const @@ -795,7 +799,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glDisable(GL_BLEND)); } -bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state) +bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state) const { if (config == nullptr) return false; @@ -805,7 +809,7 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M return false; BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); - BoundingBoxf3 print_volume(Vec3d(unscale(bed_box_2D.min(0)), unscale(bed_box_2D.min(1)), 0.0), Vec3d(unscale(bed_box_2D.max(0)), unscale(bed_box_2D.max(1)), config->opt_float("max_print_height"))); + BoundingBoxf3 print_volume({ unscale(bed_box_2D.min(0)), unscale(bed_box_2D.min(1)), 0.0 }, { unscale(bed_box_2D.max(0)), unscale(bed_box_2D.max(1)), config->opt_float("max_print_height") }); // Allow the objects to protrude below the print bed print_volume.min(2) = -1e10; print_volume.min(0) -= BedEpsilon; @@ -817,9 +821,8 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M bool contained_min_one = false; - for (GLVolume* volume : this->volumes) - { - if ((volume == nullptr) || volume->is_modifier || (volume->is_wipe_tower && !volume->shader_outside_printer_detection_enabled) || ((volume->composite_id.volume_id < 0) && !volume->shader_outside_printer_detection_enabled)) + for (GLVolume* volume : this->volumes) { + if (volume == nullptr || volume->is_modifier || (volume->is_wipe_tower && !volume->shader_outside_printer_detection_enabled) || (volume->composite_id.volume_id < 0 && !volume->shader_outside_printer_detection_enabled)) continue; const BoundingBoxf3& bb = volume->transformed_convex_hull_bounding_box(); @@ -832,10 +835,10 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M if (contained) contained_min_one = true; - if ((state == ModelInstancePVS_Inside) && volume->is_outside) + if (state == ModelInstancePVS_Inside && volume->is_outside) state = ModelInstancePVS_Fully_Outside; - if ((state == ModelInstancePVS_Fully_Outside) && volume->is_outside && print_volume.intersects(bb)) + if (state == ModelInstancePVS_Fully_Outside && volume->is_outside && print_volume.intersects(bb)) state = ModelInstancePVS_Partly_Outside; } @@ -845,7 +848,7 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M return contained_min_one; } -bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, bool& partlyOut, bool& fullyOut) +bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, bool& partlyOut, bool& fullyOut) const { if (config == nullptr) return false; @@ -867,9 +870,8 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, b partlyOut = false; fullyOut = false; - for (GLVolume* volume : this->volumes) - { - if ((volume == nullptr) || volume->is_modifier || (volume->is_wipe_tower && !volume->shader_outside_printer_detection_enabled) || ((volume->composite_id.volume_id < 0) && !volume->shader_outside_printer_detection_enabled)) + for (GLVolume* volume : this->volumes) { + if (volume == nullptr || volume->is_modifier || (volume->is_wipe_tower && !volume->shader_outside_printer_detection_enabled) || (volume->composite_id.volume_id < 0 && !volume->shader_outside_printer_detection_enabled)) continue; const BoundingBoxf3& bb = volume->transformed_convex_hull_bounding_box(); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 2ae2a36b29..25c5443cda 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -267,15 +267,15 @@ private: // Shift in z required by sla supports+pad double m_sla_shift_z; // Bounding box of this volume, in unscaled coordinates. - mutable BoundingBoxf3 m_transformed_bounding_box; + BoundingBoxf3 m_transformed_bounding_box; // Whether or not is needed to recalculate the transformed bounding box. - mutable bool m_transformed_bounding_box_dirty; + bool m_transformed_bounding_box_dirty; // Convex hull of the volume, if any. std::shared_ptr m_convex_hull; // Bounding box of this volume, in unscaled coordinates. - mutable BoundingBoxf3 m_transformed_convex_hull_bounding_box; + BoundingBoxf3 m_transformed_convex_hull_bounding_box; // Whether or not is needed to recalculate the transformed convex hull bounding box. - mutable bool m_transformed_convex_hull_bounding_box_dirty; + bool m_transformed_convex_hull_bounding_box_dirty; public: // Color of the triangles / quads held by this volume. @@ -568,8 +568,8 @@ public: // returns true if all the volumes are completely contained in the print volume // returns the containment state in the given out_state, if non-null - bool check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state); - bool check_outside_state(const DynamicPrintConfig* config, bool& partlyOut, bool& fullyOut); + bool check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state) const; + bool check_outside_state(const DynamicPrintConfig* config, bool& partlyOut, bool& fullyOut) const; void reset_outside_state(); void update_colors_by_extruder(const DynamicPrintConfig* config); From d50c2872bd30dd120d151d0175854f37de38c17e Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Tue, 20 Apr 2021 18:12:08 +0200 Subject: [PATCH 52/57] creality.ini: disable explicit ABL for CR6-SE (#6383) this is also better in line with Creality's intended behavior --- 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 95ce8a0dce..3dab515ab5 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -969,7 +969,7 @@ printer_model = CR5PROH 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_CR5PROH\nPRINTER_HAS_BOWDEN [printer:Creality CR-6 SE] -inherits = *common*; *fastabl*; *pauseprint* +inherits = *common*; *pauseprint* bed_shape = 5x0,230x0,230x235,5x235 printer_model = CR6SE 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_CR6SE\nPRINTER_HAS_BOWDEN From 2cb268c9476b44e2a557302aba8e56df22b34c0b Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Tue, 20 Apr 2021 18:13:21 +0200 Subject: [PATCH 53/57] Revert "creality.ini: Extrudr NX2 slightly lower temps" This reverts commit 41c56f2eb8a48ef5530938da08909365108f686d. --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 3dab515ab5..8420e502e4 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -655,9 +655,9 @@ filament_spool_weight = 256 [filament:Extrudr PLA NX2 @CREALITY] inherits = *PLA* filament_vendor = Extrudr -temperature = 195 +temperature = 200 bed_temperature = 60 -first_layer_temperature = 200 +first_layer_temperature = 205 first_layer_bed_temperature = 60 filament_cost = 23.63 filament_density = 1.3 From b71fa0d6340ef42a7c11436099cb0c60ae319a71 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Tue, 20 Apr 2021 20:35:49 +0200 Subject: [PATCH 54/57] Bumped up version to 0.0.16 --- 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 8420e502e4..5248155250 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.0.15 +config_version = 0.0.16 # 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 8b41285e310355cd2d9b8e6eee6ba3f2ad2bf87b Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Tue, 20 Apr 2021 20:38:27 +0200 Subject: [PATCH 55/57] 0.0.16 Updated CR6-SE start g-code. Added and updated filament profiles. --- resources/profiles/Creality.idx | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 2833b8afbb..c1242f27ec 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.3.1-beta +0.0.16 Updated CR6-SE start g-code. Added and updated filament profiles. 0.0.15 Added new printer models, filament profiles. Various improvements. min_slic3r_version = 2.3.0-rc2 0.0.14 Optimized start g-code. Added filament profile. Various improvements. From 49928e131c8b8f86509e78d3e4e260036f86a7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Wed, 21 Apr 2021 06:08:46 +0200 Subject: [PATCH 56/57] Added missing include (GCC 9.3) --- src/slic3r/GUI/PrintHostDialogs.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 762450c537..935746a64e 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include From d9ed9149ae740218549187bc9aa488a1e667c490 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 21 Apr 2021 12:09:36 +0200 Subject: [PATCH 57/57] 1) Moved first_layer_heigth frrom PrintObjectConfig to PrintConfig. Thus the first_layer_height is no more object specific. That makes a lot of sense due to the brim calculation being performed over all layers at once and due to future merging of supports of different objects at first layer. 2) Because now first_layer_height is print specific, the relative first layer height derived from the object layer height was partially disabled: First the relative first layer height is converted to an absolute value when importing config, second the side text was changed from "mm or %" to "mm". Still the UI allows entering %. Both changes may be controversial, let's wait for user feedback. --- src/libslic3r/Config.cpp | 4 ++-- src/libslic3r/Flow.cpp | 7 ++++--- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/Preset.cpp | 7 +++++++ src/libslic3r/PrintConfig.cpp | 8 +++----- src/libslic3r/PrintConfig.hpp | 4 ++-- src/libslic3r/Slicing.cpp | 4 ++-- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 6755a63781..5db1d8179b 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -471,8 +471,8 @@ bool ConfigBase::set_deserialize_nothrow(const t_config_option_key &opt_key_src, { t_config_option_key opt_key = opt_key_src; std::string value = value_src; - // Both opt_key and value may be modified by _handle_legacy(). - // If the opt_key is no more valid in this version of Slic3r, opt_key is cleared by _handle_legacy(). + // Both opt_key and value may be modified by handle_legacy(). + // If the opt_key is no more valid in this version of Slic3r, opt_key is cleared by handle_legacy(). this->handle_legacy(opt_key, value); if (opt_key.empty()) // Ignore the option. diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 1645bf683a..56d537c398 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -238,13 +238,14 @@ Flow support_material_flow(const PrintObject *object, float layer_height) Flow support_material_1st_layer_flow(const PrintObject *object, float layer_height) { - const auto &width = (object->print()->config().first_layer_extrusion_width.value > 0) ? object->print()->config().first_layer_extrusion_width : object->config().support_material_extrusion_width; + const PrintConfig &print_config = object->print()->config(); + const auto &width = (print_config.first_layer_extrusion_width.value > 0) ? print_config.first_layer_extrusion_width : object->config().support_material_extrusion_width; return Flow::new_from_config_width( frSupportMaterial, // The width parameter accepted by new_from_config_width is of type ConfigOptionFloatOrPercent, the Flow class takes care of the percent to value substitution. (width.value > 0) ? width : object->config().extrusion_width, - float(object->print()->config().nozzle_diameter.get_at(object->config().support_material_extruder-1)), - (layer_height > 0.f) ? layer_height : float(object->config().first_layer_height.get_abs_value(object->config().layer_height.value))); + float(print_config.nozzle_diameter.get_at(object->config().support_material_extruder-1)), + (layer_height > 0.f) ? layer_height : float(print_config.first_layer_height.get_abs_value(object->config().layer_height.value))); } Flow support_material_interface_flow(const PrintObject *object, float layer_height) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a799408109..0d65b71247 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1111,7 +1111,7 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu // Write some terse information on the slicing parameters. const PrintObject *first_object = print.objects().front(); const double layer_height = first_object->config().layer_height.value; - const double first_layer_height = first_object->config().first_layer_height.get_abs_value(layer_height); + const double first_layer_height = print.config().first_layer_height.get_abs_value(layer_height); for (const PrintRegion* region : print.regions()) { _write_format(file, "; external perimeters extrusion width = %.2fmm\n", region->flow(*first_object, frExternalPerimeter, layer_height).width()); _write_format(file, "; perimeters extrusion width = %.2fmm\n", region->flow(*first_object, frPerimeter, layer_height).width()); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 7db61a20f1..c6a86b7193 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -296,6 +296,13 @@ void Preset::normalize(DynamicPrintConfig &config) if (auto *gap_fill_enabled = config.option("gap_fill_enabled", false); gap_fill_enabled) gap_fill_enabled->value = false; } + if (auto *first_layer_height = config.option("first_layer_height", false); first_layer_height && first_layer_height->percent) + if (const auto *layer_height = config.option("layer_height", false); layer_height) { + // Legacy conversion - first_layer_height moved from PrintObject setting to a Print setting, thus we are getting rid of the dependency + // of first_layer_height on PrintObject specific layer_height. Covert the first layer heigth to an absolute value. + first_layer_height->value = first_layer_height->get_abs_value(layer_height->value); + first_layer_height->percent = false; + } } std::string Preset::remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 5516b298d3..9f09bc9f34 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -995,10 +995,8 @@ void PrintConfigDef::init_fff_params() def->label = L("First layer height"); def->category = L("Layers and Perimeters"); def->tooltip = L("When printing with very low layer heights, you might still want to print a thicker " - "bottom layer to improve adhesion and tolerance for non perfect build plates. " - "This can be expressed as an absolute value or as a percentage (for example: 150%) " - "over the default layer height."); - def->sidetext = L("mm or %"); + "bottom layer to improve adhesion and tolerance for non perfect build plates."); + def->sidetext = L("mm"); def->ratio_over = "layer_height"; def->set_default_value(new ConfigOptionFloatOrPercent(0.35, false)); @@ -3628,7 +3626,7 @@ std::string FullPrintConfig::validate() return "--layer-height must be a multiple of print resolution"; // --first-layer-height - if (this->get_abs_value("first_layer_height") <= 0) + if (first_layer_height.value <= 0) return "Invalid value for --first-layer-height"; // --filament-diameter diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index aab5096624..74cb5c7748 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -496,7 +496,6 @@ public: ConfigOptionBool dont_support_bridges; ConfigOptionFloat elefant_foot_compensation; ConfigOptionFloatOrPercent extrusion_width; - ConfigOptionFloatOrPercent first_layer_height; ConfigOptionBool infill_only_where_needed; // Force the generation of solid shells between adjacent materials/volumes. ConfigOptionBool interface_shells; @@ -555,7 +554,6 @@ protected: OPT_PTR(dont_support_bridges); OPT_PTR(elefant_foot_compensation); OPT_PTR(extrusion_width); - OPT_PTR(first_layer_height); OPT_PTR(infill_only_where_needed); OPT_PTR(interface_shells); OPT_PTR(layer_height); @@ -950,6 +948,7 @@ public: ConfigOptionFloat first_layer_acceleration; ConfigOptionInts first_layer_bed_temperature; ConfigOptionFloatOrPercent first_layer_extrusion_width; + ConfigOptionFloatOrPercent first_layer_height; ConfigOptionFloatOrPercent first_layer_speed; ConfigOptionInts first_layer_temperature; ConfigOptionInts full_fan_speed_layer; @@ -1025,6 +1024,7 @@ protected: OPT_PTR(first_layer_acceleration); OPT_PTR(first_layer_bed_temperature); OPT_PTR(first_layer_extrusion_width); + OPT_PTR(first_layer_height); OPT_PTR(first_layer_speed); OPT_PTR(first_layer_temperature); OPT_PTR(full_fan_speed_layer); diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp index d0b1e9ce26..98a5923aa0 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -64,9 +64,9 @@ SlicingParameters SlicingParameters::create_from_config( coordf_t object_height, const std::vector &object_extruders) { - coordf_t first_layer_height = (object_config.first_layer_height.value <= 0) ? + coordf_t first_layer_height = (print_config.first_layer_height.value <= 0) ? object_config.layer_height.value : - object_config.first_layer_height.get_abs_value(object_config.layer_height.value); + print_config.first_layer_height.get_abs_value(object_config.layer_height.value); // If object_config.support_material_extruder == 0 resp. object_config.support_material_interface_extruder == 0, // print_config.nozzle_diameter.get_at(size_t(-1)) returns the 0th nozzle diameter, // which is consistent with the requirement that if support_material_extruder == 0 resp. support_material_interface_extruder == 0,