From 9ed459e132baee9d82a926bb4b47b930aa4eacb1 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Fri, 25 Sep 2026 13:25:45 +0800 Subject: [PATCH 01/12] fix: slicing event name and ID --- src/libslic3r/GCode.cpp | 15 ++++++++++----- src/libslic3r/Print.cpp | 15 ++++++++++----- src/slic3r/GUI/Plater.cpp | 8 ++++---- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1a1d1bcbff..8bbd7a0344 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2479,7 +2479,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = path; ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2531,7 +2532,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu } { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\n" + err_msg; ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2555,7 +2557,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu boost::nowide::remove(path_tmp.c_str()); { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\n" + ex.what(); ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2668,7 +2671,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu if (ret) { { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = std::string(path) + "\nFailed to rename the output G-code file: " + ret.message(); ctx.cancellation_check = [print]() { return print->canceled(); }; @@ -2687,7 +2691,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu { LifecycleEventContext ctx; - ctx.name = std::to_string(print->model().id().id); + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = path; ctx.cancellation_check = [print]() { return print->canceled(); }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 477c2c74ca..850761339f 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2716,7 +2716,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.cancellation_check = [this]() { return canceled(); }; fire_lifecycle_event(LifecycleEvent::SliceStarted, ctx); @@ -3343,7 +3344,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.cancellation_check = [this]() { return canceled(); }; fire_lifecycle_event(LifecycleEvent::SliceGeometryFinished, ctx); @@ -4949,7 +4951,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces { { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = file; ctx.cancellation_check = [this]() { return canceled(); }; @@ -4979,7 +4982,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": found errors when process gcode file %1%") %file.c_str(); { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Error; ctx.msg = file + "\n" + ex.what(); ctx.cancellation_check = [this]() { return canceled(); }; @@ -4993,7 +4997,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces { LifecycleEventContext ctx; - ctx.name = std::to_string(m_model.id().id); + ctx.id = std::to_string(m_model.id().id); + ctx.name = get_model_name(); ctx.code = LifecycleEvtCode::Ok; ctx.msg = file; ctx.cancellation_check = [this]() { return canceled(); }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5eb36f20f9..04318dcbb5 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12801,9 +12801,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) this->background_process.stop(); notification_manager->set_slicing_progress_export_possible(); - // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. - const std::string lifecycle_job_name = this->background_process.fff_print() ? - this->background_process.fff_print()->output_filename() : std::string(); this->background_process.reset_export(); // This bool stops showing export finished notification even when process_completed_with_error is false bool has_error = false; @@ -12850,7 +12847,10 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) { Slic3r::LifecycleEventContext ctx; - ctx.name = lifecycle_job_name; + if (const Print* print = this->background_process.fff_print()) { + ctx.id = std::to_string(print->model().id().id); + ctx.name = print->get_model_name(); + } ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok); ctx.msg = evt.cancelled() ? "cancelled" : (has_error ? lifecycle_error_msg : std::string()); Slic3r::fire_lifecycle_event(Slic3r::LifecycleEvent::SlicingJobComplete, ctx); From 04204ec0d3e740f80ecc1e526ad2f03e1943500a Mon Sep 17 00:00:00 2001 From: peachismomo Date: Sun, 27 Sep 2026 17:25:56 +0800 Subject: [PATCH 02/12] test: cover slicing lifecycle event context --- tests/fff_print/test_print.cpp | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/fff_print/test_print.cpp b/tests/fff_print/test_print.cpp index 383a7165d5..83dbfa0945 100644 --- a/tests/fff_print/test_print.cpp +++ b/tests/fff_print/test_print.cpp @@ -15,6 +15,9 @@ #include "libslic3r/Layer.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/GCodeReader.hpp" +#include "libslic3r/GCode/GCodeProcessor.hpp" +#include "libslic3r/Exception.hpp" +#include "libslic3r/LifecycleEvents.hpp" #include "test_helpers.hpp" #include "test_utils.hpp" @@ -22,7 +25,10 @@ #include #include #include +#include #include +#include +#include using namespace Slic3r; using namespace Slic3r::Test; @@ -224,8 +230,68 @@ std::string resolved_output_name(Model& model, const std::string& format, const return print.output_filename(filename_base); } +struct ScopedLifecycleHook +{ + explicit ScopedLifecycleHook(LifecycleHookFn hook) { set_lifecycle_hook_fn(std::move(hook)); } + ~ScopedLifecycleHook() { set_lifecycle_hook_fn(nullptr); } +}; + } // namespace +TEST_CASE("Slicing lifecycle events identify the model", "[Print][LifecycleEvents]") +{ + struct ObservedEvent { + LifecycleEvent event; + std::string id; + std::string name; + }; + std::vector events; + ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) { + events.push_back({ event, ctx.id, ctx.name }); + }); + + Print print; + Model model; + ModelInfo info; + info.model_name = "Lifecycle test model"; + model.model_info = std::make_shared(std::move(info)); + init_print({cube(20)}, print, model); + + print.process(); + ScopedTemporaryFile temp(".gcode"); + print.export_gcode(temp.string(), nullptr, nullptr); + GCodeProcessorResult result; + print.export_gcode_from_previous_file(temp.string(), &result); + + const std::string expected_id = std::to_string(print.model().id().id); + const std::vector expected_events = { + LifecycleEvent::SliceStarted, + LifecycleEvent::SliceGeometryFinished, + LifecycleEvent::GCodeExportStarted, + LifecycleEvent::GCodeExportFinished, + LifecycleEvent::GCodeExportStarted, + LifecycleEvent::GCodeExportFinished, + }; + REQUIRE(events.size() == expected_events.size()); + for (size_t i = 0; i < expected_events.size(); ++i) { + CHECK(events[i].event == expected_events[i]); + CHECK(events[i].id == expected_id); + CHECK(events[i].name == "Lifecycle test model"); + } +} + +TEST_CASE("Output filenames with numeric statistics fail before slicing finishes", "[Print][Regression]") +{ + DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); + config.set_key_value("filename_format", new ConfigOptionString("{int(total_weight*10) / 10.0}")); + + Print print; + Model model; + init_print({cube(20)}, print, model, config); + + CHECK_THROWS_AS(print.output_filename(), PlaceholderParserError); +} + TEST_CASE("Print: {first_object_name} names the first printable object on the plate", "[Print]") { Model model; From 58842bab05d0ce9208239da97f886a27233e4fe2 Mon Sep 17 00:00:00 2001 From: peachismomo Date: Sun, 27 Sep 2026 17:29:01 +0800 Subject: [PATCH 03/12] test: test for SliceStarted ensuring stable model ID is presetn when model name is absent --- tests/fff_print/test_print.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/fff_print/test_print.cpp b/tests/fff_print/test_print.cpp index 83dbfa0945..32cd608b43 100644 --- a/tests/fff_print/test_print.cpp +++ b/tests/fff_print/test_print.cpp @@ -280,6 +280,26 @@ TEST_CASE("Slicing lifecycle events identify the model", "[Print][LifecycleEvent } } +TEST_CASE("Slicing lifecycle event name is empty without model metadata", "[Print][LifecycleEvents]") +{ + std::string event_id; + std::string event_name = "unset"; + ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) { + if (event == LifecycleEvent::SliceStarted) { + event_id = ctx.id; + event_name = ctx.name; + } + }); + + Print print; + Model model; + init_print({cube(20)}, print, model); + print.process(); + + CHECK(event_id == std::to_string(print.model().id().id)); + CHECK(event_name.empty()); +} + TEST_CASE("Output filenames with numeric statistics fail before slicing finishes", "[Print][Regression]") { DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); From 9e16cdb23b710d533a0abc186a84ee830f6b5d28 Mon Sep 17 00:00:00 2001 From: peachismomo Date: Sun, 27 Sep 2026 17:29:25 +0800 Subject: [PATCH 04/12] fix: comment above reset_export --- src/slic3r/GUI/Plater.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 04318dcbb5..0555a43776 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12801,6 +12801,7 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) this->background_process.stop(); notification_manager->set_slicing_progress_export_possible(); + // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. this->background_process.reset_export(); // This bool stops showing export finished notification even when process_completed_with_error is false bool has_error = false; From e340a13c186e024ece6b3b4873c34137836aabe8 Mon Sep 17 00:00:00 2001 From: peachismomo Date: Sun, 27 Sep 2026 17:53:41 +0800 Subject: [PATCH 05/12] fix: use current print for slicing lifecycle identity --- src/slic3r/GUI/Plater.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0555a43776..a7023c6966 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12848,11 +12848,18 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) { Slic3r::LifecycleEventContext ctx; - if (const Print* print = this->background_process.fff_print()) { - ctx.id = std::to_string(print->model().id().id); - ctx.name = print->get_model_name(); + if (const PrintBase* print = this->background_process.current_print()) { + const Model& model = print->model(); + ctx.id = std::to_string(model.id().id); + if (model.model_info) + ctx.name = model.model_info->model_name; + } else { + // Realistically Printbase* print will never be null because select_technology already asserts an active print + // and the worker thread asserts it before processing. + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": slicing completed without an active print; lifecycle event has no model ID"; } - ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok); + ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : + (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok); ctx.msg = evt.cancelled() ? "cancelled" : (has_error ? lifecycle_error_msg : std::string()); Slic3r::fire_lifecycle_event(Slic3r::LifecycleEvent::SlicingJobComplete, ctx); } From 5298e49dd270e09077540000d779292b1e7d609f Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Sun, 27 Sep 2026 17:08:27 -0500 Subject: [PATCH 06/12] fix: Klipper/Moonraker upload errors show a raw Python traceback (#14841) --- src/slic3r/Utils/PrintHost.cpp | 60 +++++++- tests/slic3rutils/CMakeLists.txt | 1 + tests/slic3rutils/test_printhost.cpp | 213 +++++++++++++++++++++++++++ 3 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 tests/slic3rutils/test_printhost.cpp diff --git a/src/slic3r/Utils/PrintHost.cpp b/src/slic3r/Utils/PrintHost.cpp index 04709fef4c..f3333c731d 100644 --- a/src/slic3r/Utils/PrintHost.cpp +++ b/src/slic3r/Utils/PrintHost.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -115,10 +116,67 @@ std::string PrintHost::get_print_host_webui(DynamicPrintConfig* config) return webui_url; } +namespace { + +// Moonraker (Klipper's API server) reports a raised exception as { "error": { "code", "message", "traceback" } } +// under every host type that connects to it, often with the cause only in the traceback. Returns the reason to show, +// or empty for any other body. +std::string moonraker_error_reason(const std::string &body) +{ + const auto root = nlohmann::json::parse(body, nullptr, false); + const auto err = root.find("error"); + if (err == root.end()) + return {}; + const auto message = err->find("message"); + const auto traceback = err->find("traceback"); + if (message == err->end() || traceback == err->end() || !message->is_string() || !traceback->is_string()) + return {}; + + const auto &msg = message->get_ref(); + const auto &tb = traceback->get_ref(); + if (msg.empty()) + return {}; + const auto end = tb.find_last_not_of(" \t\r\n"); + if (end == std::string::npos) + return msg; + + // Chained exceptions each start a new traceback; the one that failed the request is the last. + const auto header = tb.rfind("Traceback (most recent call last):", end); + + // Tornado renders a raised HTTPError as "HTTP : [ ()]", and the detail may span lines. + const auto code = err->find("code"); + if (code != err->end() && code->is_number_integer()) { + const std::string marker = "HTTP " + std::to_string(code->get()) + ": "; + const auto pos = tb.rfind(marker, end); + if (pos != std::string::npos && (header == std::string::npos || pos > header) && pos + marker.size() <= end) { + const std::string reason = tb.substr(pos + marker.size(), end + 1 - pos - marker.size()); + // An HTTPError whose detail equals its reason, like HTTPError(401, "Unauthorized"), renders the phrase twice. + return reason == msg + " (" + msg + ")" ? msg : reason; + } + } + + // Any other exception's type and message are everything from the first unindented line after its frames. + auto begin = (header == std::string::npos) ? std::string::npos : tb.find('\n', header); + while (begin != std::string::npos && begin < end) { + ++begin; + if (tb[begin] != ' ' && tb[begin] != '\r' && tb[begin] != '\n') + break; + begin = tb.find('\n', begin); + } + if (begin == std::string::npos || begin > end) { + const auto nl = tb.rfind('\n', end); + begin = (nl == std::string::npos) ? 0 : nl + 1; + } + return msg + " (" + tb.substr(begin, end + 1 - begin) + ")"; +} + +} // namespace + wxString PrintHost::format_error(const std::string &body, const std::string &error, unsigned status) const { if (status != 0) { - auto wxbody = wxString::FromUTF8(body.data()); + const std::string reason = moonraker_error_reason(body); + auto wxbody = wxString::FromUTF8(reason.empty() ? body : reason); return wxString::Format("HTTP %u: %s", status, wxbody); } else { if (error.find("curl:Timeout was reached") != std::string::npos) { diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index 08f1a6dd8f..7f541f3701 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(${_TEST_NAME}_tests test_plugin_install.cpp test_plugin_lifecycle.cpp test_plugin_printer_agent.cpp + test_printhost.cpp test_slicing_pipeline_bindings.cpp test_slicing_pipeline_config.cpp test_plugin_sort.cpp diff --git a/tests/slic3rutils/test_printhost.cpp b/tests/slic3rutils/test_printhost.cpp new file mode 100644 index 0000000000..557d4a5c89 --- /dev/null +++ b/tests/slic3rutils/test_printhost.cpp @@ -0,0 +1,213 @@ +#include + +#include + +#include "slic3r/Utils/PrintHost.hpp" + +using namespace Slic3r; + +namespace { + +class TestPrintHost : public PrintHost +{ +public: + using PrintHost::format_error; + + const char* get_name() const override { return "Test"; } + bool test(wxString&) const override { return true; } + wxString get_test_ok_msg() const override { return {}; } + wxString get_test_failed_msg(wxString&) const override { return {}; } + bool upload(PrintHostUpload, ProgressFn, ErrorFn, InfoFn) const override { return true; } + bool has_auto_discovery() const override { return false; } + bool can_test() const override { return false; } + PrintHostPostUploadActions get_post_upload_actions() const override { return {}; } + std::string get_host() const override { return {}; } +}; + +std::string format_error(const std::string& body, const std::string& error, unsigned status) +{ + return TestPrintHost().format_error(body, error, status).ToStdString(); +} + +std::string envelope(int code, const std::string& message, const std::string& traceback) +{ + return nlohmann::json{{"error", {{"code", code}, {"message", message}, {"traceback", traceback}}}}.dump(); +} + +std::string moonraker_error(int code, const std::string& message, const std::string& detail = {}) +{ + std::string line = "tornado.web.HTTPError: HTTP " + std::to_string(code) + ": " + message; + if (!detail.empty()) + line += " (" + detail + ")"; + return envelope(code, message, "Traceback (most recent call last):\n ...\n" + line + "\n"); +} + +// A real Moonraker body for uploading a file that is being printed. +constexpr const char* k_busy_file_403 = + R"JSON({"error": {"code": 403, "message": "Forbidden", "traceback": "Traceback (most recent call last):\n\n File \"/home/lava/moonraker/moonraker/components/file_manager/file_manager.py\", line 1017, in _finish_gcode_upload\n can_start = self._handle_operation_check(check_path)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nmoonraker.utils.exceptions.ServerError: File currently in use\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n\n File \"/home/lava/moonraker/moonraker/components/application.py\", line 1069, in post\n raise tornado.web.HTTPError(\ntornado.web.HTTPError: HTTP 403: Forbidden (File is loaded, upload not permitted)\n"}})JSON"; + +} // namespace + +TEST_CASE("A Klipper upload error shows its reason instead of a Python traceback", "[PrintHost][Regression]") +{ + const std::string msg = format_error(k_busy_file_403, "", 403); + INFO("actual: " << msg); + + CHECK(msg == "HTTP 403: Forbidden (File is loaded, upload not permitted)"); + CHECK_THAT(msg, !Catch::Matchers::ContainsSubstring("Traceback")); + CHECK_THAT(msg, !Catch::Matchers::ContainsSubstring("file_manager.py")); +} + +TEST_CASE("The specific cause is recovered from a file endpoint's traceback", "[PrintHost]") +{ + SECTION("a plain detail") + { + const std::string body = moonraker_error(403, "Forbidden", "File is loaded, upload not permitted"); + CHECK(format_error(body, "", 403) == "HTTP 403: Forbidden (File is loaded, upload not permitted)"); + } + + SECTION("a detail whose own parentheses nest (a filename)") + { + const std::string detail = "Directory does not exist (/home/pi/gcodes/plate (1).gcode)"; + const std::string body = moonraker_error(400, "Bad Request", detail); + CHECK(format_error(body, "", 400) == "HTTP 400: Bad Request (" + detail + ")"); + } + + SECTION("a detail that contains the reason phrase") + { + const std::string body = moonraker_error(403, "Forbidden", "Forbidden zone: access denied"); + CHECK(format_error(body, "", 403) == "HTTP 403: Forbidden (Forbidden zone: access denied)"); + } + + SECTION("a detail that spans lines") + { + const std::string detail = "Move out of range\nX=250.000 Y=10.000"; + const std::string body = moonraker_error(400, "Bad Request", detail); + CHECK(format_error(body, "", 400) == "HTTP 400: Bad Request (" + detail + ")"); + } + + SECTION("a detail that only repeats the reason phrase is dropped") + { + const std::string body = moonraker_error(401, "Unauthorized", "Unauthorized"); + CHECK(format_error(body, "", 401) == "HTTP 401: Unauthorized"); + } +} + +TEST_CASE("An unhandled exception shows its type and message", "[PrintHost]") +{ + const std::string frame = "Traceback (most recent call last):\n" + " File \"/home/pi/moonraker/moonraker/components/file_manager/file_manager.py\", line 1, in write\n" + " self._write(data)\n"; + + SECTION("a one-line message") + { + const std::string body = envelope(500, "Internal Server Error", frame + "OSError: [Errno 28] No space left on device\n"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 28] No space left on device)"); + } + + SECTION("a message that spans lines") + { + const std::string body = envelope(500, "Internal Server Error", frame + "ServerError: Klippy request failed\n see klippy.log\n"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (ServerError: Klippy request failed\n see klippy.log)"); + } + + SECTION("raised while handling an HTTPError with the same code") + { + const std::string traceback = frame + "tornado.web.HTTPError: HTTP 500: Internal Server Error (Database locked)\n\n" + "During handling of the above exception, another exception occurred:\n\n" + + frame + "OSError: [Errno 5] Input/output error\n"; + const std::string body = envelope(500, "Internal Server Error", traceback); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 5] Input/output error)"); + } + + SECTION("a traceback with no header") + { + const std::string body = envelope(500, "Internal Server Error", "OSError: [Errno 5] Input/output error"); + CHECK(format_error(body, "", 500) == "HTTP 500: Internal Server Error (OSError: [Errno 5] Input/output error)"); + } +} + +TEST_CASE("A reason already complete in message is shown unchanged", "[PrintHost]") +{ + SECTION("message is the whole reason, no trailing detail") + { + const std::string body = moonraker_error(503, "Klippy is not ready"); + CHECK(format_error(body, "", 503) == "HTTP 503: Klippy is not ready"); + } + + SECTION("a message that itself contains parentheses is not duplicated") + { + const std::string reason = "Requested blocks (0-5) are unavailable"; + const std::string body = moonraker_error(400, reason); + CHECK(format_error(body, "", 400) == "HTTP 400: " + reason); + } +} + +TEST_CASE("A Moonraker error with no usable detail shows just the reason phrase", "[PrintHost]") +{ + struct Case + { + const char* name; + const char* body; + unsigned status; + const char* expected; + }; + + const auto c = GENERATE( + Case{"an empty traceback", R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": ""}})JSON", 500, + "HTTP 500: Internal Server Error"}, + Case{"a traceback of only whitespace", R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": "\n \n"}})JSON", + 500, "HTTP 500: Internal Server Error"}); + + DYNAMIC_SECTION(c.name) { CHECK(format_error(c.body, "", c.status) == c.expected); } +} + +TEST_CASE("A percent sign in the reason is not a format specifier", "[PrintHost]") +{ + const std::string body = moonraker_error(507, "Insufficient Storage", "disk 100% full"); + CHECK(format_error(body, "", 507) == "HTTP 507: Insufficient Storage (disk 100% full)"); +} + +TEST_CASE("Error bodies that are not a Moonraker envelope are left unchanged", "[PrintHost]") +{ + SECTION("OctoPrint's string-valued error member") + { + const std::string body = R"JSON({"error": "File not found"})JSON"; + CHECK(format_error(body, "", 404) == "HTTP 404: " + body); + } + + SECTION("PrusaLink's top-level message, not under error") + { + const std::string body = R"JSON({"title": "Conflict", "message": "Printer is printing"})JSON"; + CHECK(format_error(body, "", 409) == "HTTP 409: " + body); + } + + SECTION("a body that is not JSON") + { + const std::string html = "502 Bad Gateway"; + CHECK(format_error(html, "", 502) == "HTTP 502: " + html); + } + + SECTION("an error object with no traceback") + { + const std::string body = R"JSON({"error": {"code": 500, "message": "Internal Server Error"}})JSON"; + CHECK(format_error(body, "", 500) == "HTTP 500: " + body); + } + + SECTION("an error object whose traceback is null") + { + const std::string body = R"JSON({"error": {"code": 500, "message": "Internal Server Error", "traceback": null}})JSON"; + CHECK(format_error(body, "", 500) == "HTTP 500: " + body); + } + + SECTION("an envelope whose reason phrase is empty") + { + const std::string body = envelope(403, "", "Traceback (most recent call last):\nOSError: denied\n"); + CHECK(format_error(body, "", 403) == "HTTP 403: " + body); + } + + SECTION("a transport error with no HTTP status") + { + CHECK(format_error("", "curl:Could not connect", 0) == "curl:Could not connect"); + } +} From cda158857870b79492abd176a3e48861cce97e05 Mon Sep 17 00:00:00 2001 From: HanifKoh <76276251+HanifKoh@users.noreply.github.com> Date: Mon, 28 Sep 2026 15:36:08 +0800 Subject: [PATCH 07/12] Draw the Toolpaths Top-Down When the Camera Looks Down on the Print (#15883) The segments come in print order, bottom layer first, which seen from above is back to front: every hidden fragment is shaded before the one that covers it, and on an integrated GPU that overdraw is most of the frame. Drawing the instances last to first whenever the camera looks down lets the depth test reject the hidden fragments instead. Side views and views from below keep the print order, and the shadow-caster pass is unchanged. --- src/libvgcode/src/Shaders.hpp | 7 ++++++- src/libvgcode/src/ViewerImpl.cpp | 11 +++++++++++ src/libvgcode/src/ViewerImpl.hpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/libvgcode/src/Shaders.hpp b/src/libvgcode/src/Shaders.hpp index 596b42df5c..9f546d6dc8 100644 --- a/src/libvgcode/src/Shaders.hpp +++ b/src/libvgcode/src/Shaders.hpp @@ -34,6 +34,10 @@ static const char* Segments_Vertex_Shader = // ORCA: 0 during the shadow caster pass - the bias below shifts eye_position but not // world_position, so the caster would write a depth the receiver never looks up. "uniform float bias_scale;\n" +// draw the instances last to first, top layers before the ones they hide, so that early depth +// rejection discards most of the hidden fragments; set when the camera looks down on the print +"uniform int reverse_order;\n" +"uniform int instance_count;\n" "in int vertex_id;\n" "out vec3 color;\n" "// ORCA: realistic view - the light the shadow map is able to block, kept apart from the\n" @@ -59,7 +63,8 @@ static const char* Segments_Vertex_Shader = " return top_diffuse + front_diffuse + top_specular;\n" "}\n" "void main() {\n" -" int id_a = int(texelFetch(segment_index_tex, gl_InstanceID).r);\n" +" int instance = (reverse_order != 0) ? instance_count - 1 - gl_InstanceID : gl_InstanceID;\n" +" int id_a = int(texelFetch(segment_index_tex, instance).r);\n" " int id_b = id_a + 1;\n" " vec3 pos_a = texelFetch(position_tex, id_a).xyz;\n" " vec3 pos_b = texelFetch(position_tex, id_b).xyz;\n" diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index b1a7550b42..8212717931 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -763,6 +763,8 @@ void ViewerImpl::init(const std::string& opengl_context_version) m_uni_segments_height_width_angle_tex_id = glGetUniformLocation(m_segments_shader_id, "height_width_angle_tex"); m_uni_segments_colors_tex_id = glGetUniformLocation(m_segments_shader_id, "color_tex"); m_uni_segments_segment_index_tex_id = glGetUniformLocation(m_segments_shader_id, "segment_index_tex"); + m_uni_segments_reverse_order_id = glGetUniformLocation(m_segments_shader_id, "reverse_order"); + m_uni_segments_instance_count_id = glGetUniformLocation(m_segments_shader_id, "instance_count"); // ORCA: realistic view m_uni_segments_shadow_map_id = glGetUniformLocation(m_segments_shader_id, "shadow_map"); m_uni_segments_shadow_light_vp_id = glGetUniformLocation(m_segments_shader_id, "shadow_light_vp"); @@ -2090,6 +2092,15 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec glsafe(glUniformMatrix4fv(m_uni_segments_view_matrix_id, 1, GL_FALSE, view_matrix.data())); glsafe(glUniformMatrix4fv(m_uni_segments_projection_matrix_id, 1, GL_FALSE, projection_matrix.data())); glsafe(glUniform3fv(m_uni_segments_camera_position_id, 1, camera_position.data())); + // The segments come in print order, bottom layer first. Seen from above, that is back to front, + // and every hidden fragment is shaded before the one that covers it. Drawing them last to first + // lets the depth test reject the hidden ones instead. The camera looks down when the world's + // up axis points towards it, which is the view matrix's (2, 2) entry being positive. + const bool top_down = !m_rendering_shadow_casters && view_matrix[10] > 0.0f; + glsafe(glUniform1i(m_uni_segments_reverse_order_id, top_down ? 1 : 0)); +#ifndef ENABLE_OPENGL_ES + glsafe(glUniform1i(m_uni_segments_instance_count_id, static_cast(m_enabled_segments_count))); +#endif // ENABLE_OPENGL_ES // ORCA: realistic view. The depth pass writes the map it would otherwise read, so it shades // with the lookup off. glsafe(glUniform1i(m_uni_segments_shadow_map_id, m_shadow_map_texture_unit)); diff --git a/src/libvgcode/src/ViewerImpl.hpp b/src/libvgcode/src/ViewerImpl.hpp index c9d658beb1..707f0f6bb7 100644 --- a/src/libvgcode/src/ViewerImpl.hpp +++ b/src/libvgcode/src/ViewerImpl.hpp @@ -362,6 +362,8 @@ private: int m_uni_segments_height_width_angle_tex_id{ -1 }; int m_uni_segments_colors_tex_id{ -1 }; int m_uni_segments_segment_index_tex_id{ -1 }; + int m_uni_segments_reverse_order_id{ -1 }; + int m_uni_segments_instance_count_id{ -1 }; int m_uni_segments_shadow_map_id{ -1 }; int m_uni_segments_shadow_light_vp_id{ -1 }; int m_uni_segments_shadow_intensity_id{ -1 }; From 3df9c215f8a19232388710bed2af501bc068822d Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Mon, 28 Sep 2026 10:16:55 +0100 Subject: [PATCH 08/12] Blocks: branded filaments, naming/loading fixes, RF50 bed type and other fixes. (#15804) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description This PR fixes some problems with the current profiles for Blocks printers - **Fix**: start gcode for the Blocks 0.6mm RF50 printer where the start gcode command had no newline separation on two commands so they were concatenated and would make printing fail. - **Added**: multi material plates selection for the RF50 printers, right now only textured PEI and smooth high temp plates are available, but in the future more to come. - **Naming consistancy** for Blocks Pro S100 processes and filaments, target labels used bare `@Blocks` while RD50 and RF50 used `@Blocks_RD50` and `@Blocks_RF50`. Renamed Pro S100 to `@Blocks_Pro_S100` to match the structure. - **Filament restructure**: replaced Blocks tuned-generic filaments (e.g. `Generic PLA @Blocks`) with real Blocks-branded filaments. One for each printer model. Every material keeps the same coverage we already had. - **Fix**: `sparse_infill_pattern` was misspelled `sparse_infill_patter` on 13 `@Blocks_RF50` process presets. Harmless due to inheritances but fixed non the less. - **Fix**: `Blocks RD50 V2 0.4 nozzle.json` was missing `printer_variant`. - **Normalize** all Blocks profiles to standard formatting (tab indentation, key order) and bumped `Blocks.json` version. - **RF50 retraction length** increased on all RF50 machines. ## Tests - [x] `orca_profile_tool.py check --vendor Blocks` - clean - [x] `orca_profile_tool.py check` - clean - [x] `normalize` / `generate-id` / `update-index --dry-run` — fully settled, no pending changes - [x] `check_profile.sh --vendor Blocks` → `profile_tool` check — passes - [ ] `validate_system` / `validate_slice` / `validate_filament_subtypes` / `validate_custom` — could not run locally (dev host's glibc 2.36 is older than the nightly validator binary's required 2.38); needs CI or a compatible host - [x] In-app confirmation that the Blocks bundle loads [How to Download Pull Requests Artifacts for Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts) --- resources/profiles/Blocks.json | 210 +++++++++++++----- .../filament/Blocks ABS @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks ABS @Blocks_RF50.json | 13 ++ ...ABS @Blocks.json => Blocks ABS @base.json} | 19 +- .../filament/Blocks ASA @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks ASA @Blocks_RF50.json | 13 ++ ...ASA @Blocks.json => Blocks ASA @base.json} | 19 +- .../Blocks ASA-CF @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks ASA-CF @Blocks_RF50.json | 13 ++ ... @Blocks.json => Blocks ASA-CF @base.json} | 19 +- .../filament/Blocks PA @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks PA @Blocks_RF50.json | 13 ++ .../Blocks/filament/Blocks PA @base.json | 17 ++ .../Blocks PA-CF @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks PA-CF @Blocks_RF50.json | 13 ++ ...F @Blocks.json => Blocks PA-CF @base.json} | 19 +- .../filament/Blocks PC @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks PC @Blocks_RF50.json | 13 ++ .../Blocks/filament/Blocks PC @base.json | 17 ++ .../Blocks PETG @Blocks_Pro_S100.json | 16 ++ .../filament/Blocks PETG @Blocks_RD50_V2.json | 13 ++ .../filament/Blocks PETG @Blocks_RF50.json | 13 ++ ...TG @Blocks.json => Blocks PETG @base.json} | 24 +- .../filament/Blocks PLA @Blocks_Pro_S100.json | 16 ++ .../filament/Blocks PLA @Blocks_RD50_V2.json | 13 ++ .../filament/Blocks PLA @Blocks_RF50.json | 13 ++ ...PLA @Blocks.json => Blocks PLA @base.json} | 24 +- .../Blocks PLA-CF @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks PLA-CF @Blocks_RF50.json | 13 ++ .../Blocks/filament/Blocks PLA-CF @base.json | 23 ++ .../filament/Blocks PVA @Blocks_RD50_V2.json | 14 ++ .../filament/Blocks PVA @Blocks_RF50.json | 13 ++ .../Blocks/filament/Blocks PVA @base.json | 17 ++ .../filament/Blocks TPU @Blocks_Pro_S100.json | 16 ++ .../filament/Blocks TPU @Blocks_RD50_V2.json | 13 ++ .../filament/Blocks TPU @Blocks_RF50.json | 13 ++ ...TPU @Blocks.json => Blocks TPU @base.json} | 24 +- .../Blocks/filament/Generic PA @Blocks.json | 24 -- .../Blocks/filament/Generic PC @Blocks.json | 24 -- .../filament/Generic PLA-CF @Blocks.json | 30 --- .../Blocks/filament/Generic PVA @Blocks.json | 24 -- .../machine/BLOCKS Pro S100 0.4 nozzle.json | 5 +- .../machine/BLOCKS Pro S100 0.6 nozzle.json | 7 +- .../machine/BLOCKS Pro S100 0.8 nozzle.json | 7 +- .../machine/BLOCKS Pro S100 1.0 nozzle.json | 7 +- .../machine/BLOCKS Pro S100 1.2 nozzle.json | 7 +- .../Blocks/machine/BLOCKS Pro S100.json | 2 +- .../machine/BLOCKS RD50 V2 0.4 nozzle.json | 4 + .../machine/BLOCKS RD50 V2 0.6 nozzle.json | 5 +- .../machine/BLOCKS RD50 V2 0.8 nozzle.json | 5 +- .../Blocks/machine/BLOCKS RD50 V2.json | 2 +- .../machine/BLOCKS RF50 0.4 nozzle.json | 9 +- .../machine/BLOCKS RF50 0.6 nozzle.json | 13 +- .../machine/BLOCKS RF50 0.8 nozzle.json | 9 +- .../profiles/Blocks/machine/BLOCKS RF50.json | 3 +- .../Blocks/machine/fdm_klipper_common.json | 3 - .../0.12mm Fine 0.4 nozzle @Blocks_RF50.json | 6 +- ....16mm Optimal 0.4 nozzle @Blocks_RF50.json | 6 +- ....20mm Optimal 0.6 nozzle @Blocks_RF50.json | 6 +- ...Standard 0.4 nozzle @Blocks_Pro_S100.json} | 7 +- ...20mm Standard 0.4 nozzle @Blocks_RF50.json | 6 +- ...mm Draft 0.4 nozzle @Blocks_Pro_S100.json} | 7 +- .../0.24mm Draft 0.4 nozzle @Blocks_RF50.json | 6 +- ...26mm Standard 0.6 nozzle @Blocks_RF50.json | 6 +- ...m Extra Draft 0.4 nozzle @Blocks_RF50.json | 6 +- ...ra Draft 0.4 nozzle @Blocks_Pro_S100.json} | 7 +- ... Optimal 0.8 nozzle @Blocks_Pro_S100.json} | 7 +- ....30mm Optimal 0.8 nozzle @Blocks_RF50.json | 6 +- ... Optimal 1.0 nozzle @Blocks_Pro_S100.json} | 7 +- ...Standard 0.6 nozzle @Blocks_Pro_S100.json} | 7 +- .../0.32mm Draft 0.6 nozzle @Blocks_RF50.json | 6 +- ...m Extra Draft 0.6 nozzle @Blocks_RF50.json | 6 +- ...38mm Standard 0.8 nozzle @Blocks_RF50.json | 6 +- ...mm Draft 0.6 nozzle @Blocks_Pro_S100.json} | 7 +- ...Standard 0.8 nozzle @Blocks_Pro_S100.json} | 7 +- .../0.46mm Draft 0.8 nozzle @Blocks_RF50.json | 6 +- ...mm Draft 0.8 nozzle @Blocks_Pro_S100.json} | 7 +- ... Optimal 1.2 nozzle @Blocks_Pro_S100.json} | 7 +- ...Standard 1.0 nozzle @Blocks_Pro_S100.json} | 7 +- ...m Extra Draft 0.8 nozzle @Blocks_RF50.json | 6 +- ...mm Draft 1.0 nozzle @Blocks_Pro_S100.json} | 7 +- ...Standard 1.2 nozzle @Blocks_Pro_S100.json} | 7 +- ...mm Draft 1.2 nozzle @Blocks_Pro_S100.json} | 7 +- ...ra Draft 1.0 nozzle @Blocks_Pro_S100.json} | 7 +- ...ra Draft 1.2 nozzle @Blocks_Pro_S100.json} | 7 +- 85 files changed, 792 insertions(+), 362 deletions(-) create mode 100644 resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic ABS @Blocks.json => Blocks ABS @base.json} (75%) create mode 100644 resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic ASA @Blocks.json => Blocks ASA @base.json} (75%) create mode 100644 resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic ASA-CF @Blocks.json => Blocks ASA-CF @base.json} (75%) create mode 100644 resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json create mode 100644 resources/profiles/Blocks/filament/Blocks PA @base.json create mode 100644 resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic PA-CF @Blocks.json => Blocks PA-CF @base.json} (76%) create mode 100644 resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json create mode 100644 resources/profiles/Blocks/filament/Blocks PC @base.json create mode 100644 resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json create mode 100644 resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic PETG @Blocks.json => Blocks PETG @base.json} (68%) create mode 100644 resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json create mode 100644 resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic PLA @Blocks.json => Blocks PLA @base.json} (52%) create mode 100644 resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json create mode 100644 resources/profiles/Blocks/filament/Blocks PLA-CF @base.json create mode 100644 resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json create mode 100644 resources/profiles/Blocks/filament/Blocks PVA @base.json create mode 100644 resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json create mode 100644 resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json create mode 100644 resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json rename resources/profiles/Blocks/filament/{Generic TPU @Blocks.json => Blocks TPU @base.json} (58%) delete mode 100644 resources/profiles/Blocks/filament/Generic PA @Blocks.json delete mode 100644 resources/profiles/Blocks/filament/Generic PC @Blocks.json delete mode 100644 resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json delete mode 100644 resources/profiles/Blocks/filament/Generic PVA @Blocks.json rename resources/profiles/Blocks/process/{0.20mm Standard 0.4 nozzle @Blocks.json => 0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json} (62%) rename resources/profiles/Blocks/process/{0.24mm Draft 0.4 nozzle @Blocks.json => 0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.30mm Extra Draft 0.4 nozzle @Blocks.json => 0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json} (61%) rename resources/profiles/Blocks/process/{0.30mm Optimal 0.8 nozzle @Blocks.json => 0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.30mm Optimal 1.0 nozzle @Blocks.json => 0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.30mm Standard 0.6 nozzle @Blocks.json => 0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json} (62%) rename resources/profiles/Blocks/process/{0.40mm Draft 0.6 nozzle @Blocks.json => 0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.40mm Standard 0.8 nozzle @Blocks.json => 0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json} (62%) rename resources/profiles/Blocks/process/{0.50mm Draft 0.8 nozzle @Blocks.json => 0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.50mm Optimal 1.2 nozzle @Blocks.json => 0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.50mm Standard 1.0 nozzle @Blocks.json => 0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json} (62%) rename resources/profiles/Blocks/process/{0.60mm Draft 1.0 nozzle @Blocks.json => 0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.60mm Standard 1.2 nozzle @Blocks.json => 0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json} (62%) rename resources/profiles/Blocks/process/{0.70mm Draft 1.2 nozzle @Blocks.json => 0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json} (63%) rename resources/profiles/Blocks/process/{0.70mm Extra Draft 1.0 nozzle @Blocks.json => 0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json} (61%) rename resources/profiles/Blocks/process/{0.80mm Extra Draft 1.2 nozzle @Blocks.json => 0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json} (61%) diff --git a/resources/profiles/Blocks.json b/resources/profiles/Blocks.json index f24bcb81da..4c4936ab28 100644 --- a/resources/profiles/Blocks.json +++ b/resources/profiles/Blocks.json @@ -1,6 +1,6 @@ { "name": "Blocks", - "version": "02.04.00.04", + "version": "02.04.00.13", "force_update": "0", "description": "Blocks configurations", "machine_model_list": [ @@ -43,8 +43,8 @@ "sub_path": "process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.20mm Standard 0.4 nozzle @Blocks", - "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks.json" + "name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "0.20mm Standard 0.4 nozzle @Blocks_RD50_V2", @@ -55,8 +55,8 @@ "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.24mm Draft 0.4 nozzle @Blocks", - "sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks.json" + "name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "0.24mm Draft 0.4 nozzle @Blocks_RD50_V2", @@ -75,8 +75,8 @@ "sub_path": "process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Extra Draft 0.4 nozzle @Blocks", - "sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks.json" + "name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json" }, { "name": "fdm_process_common 0.6 nozzle", @@ -111,8 +111,8 @@ "sub_path": "process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Standard 0.6 nozzle @Blocks", - "sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks.json" + "name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json" }, { "name": "0.32mm Draft 0.6 nozzle @Blocks_RD50_V2", @@ -131,12 +131,12 @@ "sub_path": "process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json" }, { - "name": "0.40mm Draft 0.6 nozzle @Blocks", - "sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks.json" + "name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.30mm Optimal 0.8 nozzle @Blocks", - "sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks.json" + "name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.30mm Optimal 0.8 nozzle @Blocks_RD50_V2", @@ -155,8 +155,8 @@ "sub_path": "process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.40mm Standard 0.8 nozzle @Blocks", - "sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks.json" + "name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.46mm Draft 0.8 nozzle @Blocks_RD50_V2", @@ -167,8 +167,8 @@ "sub_path": "process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.50mm Draft 0.8 nozzle @Blocks", - "sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks.json" + "name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json" }, { "name": "0.54mm Extra Draft 0.8 nozzle @Blocks_RD50_V2", @@ -179,36 +179,36 @@ "sub_path": "process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json" }, { - "name": "0.30mm Optimal 1.0 nozzle @Blocks", - "sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks.json" + "name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.50mm Standard 1.0 nozzle @Blocks", - "sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks.json" + "name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.60mm Draft 1.0 nozzle @Blocks", - "sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks.json" + "name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.70mm Extra Draft 1.0 nozzle @Blocks", - "sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks.json" + "name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.50mm Optimal 1.2 nozzle @Blocks", - "sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks.json" + "name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.60mm Standard 1.2 nozzle @Blocks", - "sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks.json" + "name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.70mm Draft 1.2 nozzle @Blocks", - "sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks.json" + "name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json" }, { - "name": "0.80mm Extra Draft 1.2 nozzle @Blocks", - "sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks.json" + "name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", + "sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json" } ], "filament_list": [ @@ -249,48 +249,148 @@ "sub_path": "filament/fdm_filament_tpu.json" }, { - "name": "Generic ABS @Blocks", - "sub_path": "filament/Generic ABS @Blocks.json" + "name": "Blocks ABS @base", + "sub_path": "filament/Blocks ABS @base.json" }, { - "name": "Generic ASA @Blocks", - "sub_path": "filament/Generic ASA @Blocks.json" + "name": "Blocks ASA @base", + "sub_path": "filament/Blocks ASA @base.json" }, { - "name": "Generic ASA-CF @Blocks", - "sub_path": "filament/Generic ASA-CF @Blocks.json" + "name": "Blocks ASA-CF @base", + "sub_path": "filament/Blocks ASA-CF @base.json" }, { - "name": "Generic PA @Blocks", - "sub_path": "filament/Generic PA @Blocks.json" + "name": "Blocks PA @base", + "sub_path": "filament/Blocks PA @base.json" }, { - "name": "Generic PA-CF @Blocks", - "sub_path": "filament/Generic PA-CF @Blocks.json" + "name": "Blocks PA-CF @base", + "sub_path": "filament/Blocks PA-CF @base.json" }, { - "name": "Generic PC @Blocks", - "sub_path": "filament/Generic PC @Blocks.json" + "name": "Blocks PC @base", + "sub_path": "filament/Blocks PC @base.json" }, { - "name": "Generic PETG @Blocks", - "sub_path": "filament/Generic PETG @Blocks.json" + "name": "Blocks PETG @base", + "sub_path": "filament/Blocks PETG @base.json" }, { - "name": "Generic PLA @Blocks", - "sub_path": "filament/Generic PLA @Blocks.json" + "name": "Blocks PLA @base", + "sub_path": "filament/Blocks PLA @base.json" }, { - "name": "Generic PLA-CF @Blocks", - "sub_path": "filament/Generic PLA-CF @Blocks.json" + "name": "Blocks PLA-CF @base", + "sub_path": "filament/Blocks PLA-CF @base.json" }, { - "name": "Generic PVA @Blocks", - "sub_path": "filament/Generic PVA @Blocks.json" + "name": "Blocks PVA @base", + "sub_path": "filament/Blocks PVA @base.json" }, { - "name": "Generic TPU @Blocks", - "sub_path": "filament/Generic TPU @Blocks.json" + "name": "Blocks TPU @base", + "sub_path": "filament/Blocks TPU @base.json" + }, + { + "name": "Blocks ABS @Blocks_RD50_V2", + "sub_path": "filament/Blocks ABS @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ABS @Blocks_RF50", + "sub_path": "filament/Blocks ABS @Blocks_RF50.json" + }, + { + "name": "Blocks ASA @Blocks_RD50_V2", + "sub_path": "filament/Blocks ASA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ASA @Blocks_RF50", + "sub_path": "filament/Blocks ASA @Blocks_RF50.json" + }, + { + "name": "Blocks ASA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks ASA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks ASA-CF @Blocks_RF50", + "sub_path": "filament/Blocks ASA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PA @Blocks_RF50", + "sub_path": "filament/Blocks PA @Blocks_RF50.json" + }, + { + "name": "Blocks PA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks PA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PA-CF @Blocks_RF50", + "sub_path": "filament/Blocks PA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PC @Blocks_RD50_V2", + "sub_path": "filament/Blocks PC @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PC @Blocks_RF50", + "sub_path": "filament/Blocks PC @Blocks_RF50.json" + }, + { + "name": "Blocks PETG @Blocks_Pro_S100", + "sub_path": "filament/Blocks PETG @Blocks_Pro_S100.json" + }, + { + "name": "Blocks PETG @Blocks_RD50_V2", + "sub_path": "filament/Blocks PETG @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PETG @Blocks_RF50", + "sub_path": "filament/Blocks PETG @Blocks_RF50.json" + }, + { + "name": "Blocks PLA @Blocks_Pro_S100", + "sub_path": "filament/Blocks PLA @Blocks_Pro_S100.json" + }, + { + "name": "Blocks PLA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PLA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PLA @Blocks_RF50", + "sub_path": "filament/Blocks PLA @Blocks_RF50.json" + }, + { + "name": "Blocks PLA-CF @Blocks_RD50_V2", + "sub_path": "filament/Blocks PLA-CF @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PLA-CF @Blocks_RF50", + "sub_path": "filament/Blocks PLA-CF @Blocks_RF50.json" + }, + { + "name": "Blocks PVA @Blocks_RD50_V2", + "sub_path": "filament/Blocks PVA @Blocks_RD50_V2.json" + }, + { + "name": "Blocks PVA @Blocks_RF50", + "sub_path": "filament/Blocks PVA @Blocks_RF50.json" + }, + { + "name": "Blocks TPU @Blocks_Pro_S100", + "sub_path": "filament/Blocks TPU @Blocks_Pro_S100.json" + }, + { + "name": "Blocks TPU @Blocks_RD50_V2", + "sub_path": "filament/Blocks TPU @Blocks_RD50_V2.json" + }, + { + "name": "Blocks TPU @Blocks_RF50", + "sub_path": "filament/Blocks TPU @Blocks_RF50.json" } ], "machine_list": [ diff --git a/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json new file mode 100644 index 0000000000..7ce4729e96 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ABS @Blocks_RD50_V2", + "inherits": "Blocks ABS @base", + "from": "system", + "setting_id": "qhQ0qQDGJgsueCAF", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ABS;Generic ABS @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json new file mode 100644 index 0000000000..3f418a8d6b --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ABS @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ABS @Blocks_RF50", + "inherits": "Blocks ABS @base", + "from": "system", + "setting_id": "bGYMFFdKiROKuSiY", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ABS @Blocks.json b/resources/profiles/Blocks/filament/Blocks ABS @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ABS @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ABS @base.json index c3d09cfd18..e475770f64 100644 --- a/resources/profiles/Blocks/filament/Generic ABS @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ABS @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ABS @Blocks", + "name": "Blocks ABS @base", "inherits": "fdm_filament_abs", - "renamed_from": "Blocks Generic ABS", "from": "system", - "setting_id": "TL1Q1kA4t36GGObG", - "filament_id": "OFY9muEs", - "instantiation": "true", + "filament_id": "OFBBhiX8", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -81,13 +82,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..bab020171f --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ASA @Blocks_RD50_V2", + "inherits": "Blocks ASA @base", + "from": "system", + "setting_id": "HW7xDXThvpVFbMq5", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ASA;Generic ASA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json new file mode 100644 index 0000000000..603c2d7dfa --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ASA @Blocks_RF50", + "inherits": "Blocks ASA @base", + "from": "system", + "setting_id": "lBW7SCsvawi4icNU", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ASA @Blocks.json b/resources/profiles/Blocks/filament/Blocks ASA @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ASA @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ASA @base.json index 0c1ee32085..8fed35b779 100644 --- a/resources/profiles/Blocks/filament/Generic ASA @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ASA @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ASA @Blocks", + "name": "Blocks ASA @base", "inherits": "fdm_filament_asa", - "renamed_from": "Blocks Generic ASA", "from": "system", - "setting_id": "xP7cB4RHgbm4cYDD", - "filament_id": "OFLPAxz3", - "instantiation": "true", + "filament_id": "OFTz2YXa", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -81,13 +82,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..bdfb288047 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks ASA-CF @Blocks_RD50_V2", + "inherits": "Blocks ASA-CF @base", + "from": "system", + "setting_id": "x5ksnGLGGy1PgDns", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic ASA-CF;Generic ASA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1304f52400 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks ASA-CF @Blocks_RF50", + "inherits": "Blocks ASA-CF @base", + "from": "system", + "setting_id": "pcbd5qFiMZAvDPg1", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json b/resources/profiles/Blocks/filament/Blocks ASA-CF @base.json similarity index 75% rename from resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json rename to resources/profiles/Blocks/filament/Blocks ASA-CF @base.json index 0d9f0aa862..fb1cdeb998 100644 --- a/resources/profiles/Blocks/filament/Generic ASA-CF @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks ASA-CF @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic ASA-CF @Blocks", + "name": "Blocks ASA-CF @base", "inherits": "fdm_filament_asa", - "renamed_from": "Blocks Generic ASA-CF", "from": "system", - "setting_id": "ju4ue7yJoz3ujny6", - "filament_id": "OF53eLVD", - "instantiation": "true", + "filament_id": "OF8b9I7o", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_type": [ "ASA-CF" ], @@ -84,13 +85,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..6486ec0ed8 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PA @Blocks_RD50_V2", + "inherits": "Blocks PA @base", + "from": "system", + "setting_id": "gxD81n2jjrReLD29", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PA;Generic PA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json new file mode 100644 index 0000000000..6b11df1a22 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PA @Blocks_RF50", + "inherits": "Blocks PA @base", + "from": "system", + "setting_id": "PzKxRMDnQUzVWRer", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PA @base.json b/resources/profiles/Blocks/filament/Blocks PA @base.json new file mode 100644 index 0000000000..ff6ca4b599 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PA @base", + "inherits": "fdm_filament_pa", + "from": "system", + "filament_id": "OFidOgK4", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "10" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..1946ce16b6 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PA-CF @Blocks_RD50_V2", + "inherits": "Blocks PA-CF @base", + "from": "system", + "setting_id": "EtbeKx3rbhUo1TtM", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PA-CF;Generic PA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1b1e02f58e --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PA-CF @Blocks_RF50", + "inherits": "Blocks PA-CF @base", + "from": "system", + "setting_id": "udI8Q4X7HaPIaPt4", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json b/resources/profiles/Blocks/filament/Blocks PA-CF @base.json similarity index 76% rename from resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PA-CF @base.json index 7ec957f6d1..360a090042 100644 --- a/resources/profiles/Blocks/filament/Generic PA-CF @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PA-CF @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PA-CF @Blocks", + "name": "Blocks PA-CF @base", "inherits": "fdm_filament_pa", - "renamed_from": "Blocks Generic PA-CF", "from": "system", - "setting_id": "T6SO0WRdnG6wcyG8", - "filament_id": "OFQLcbps", - "instantiation": "true", + "filament_id": "OFdWrXpL", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_type": [ "PA-CF" ], @@ -87,13 +88,5 @@ ], "during_print_exhaust_fan_speed": [ "80" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json new file mode 100644 index 0000000000..cdeec3a9aa --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PC @Blocks_RD50_V2", + "inherits": "Blocks PC @base", + "from": "system", + "setting_id": "HLc0shWnKwJzSFyW", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PC;Generic PC @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json new file mode 100644 index 0000000000..ad23b4ba03 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PC @Blocks_RF50", + "inherits": "Blocks PC @base", + "from": "system", + "setting_id": "9a6bccZopMTeNHYu", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PC @base.json b/resources/profiles/Blocks/filament/Blocks PC @base.json new file mode 100644 index 0000000000..83b3d75300 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PC @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PC @base", + "inherits": "fdm_filament_pc", + "from": "system", + "filament_id": "OFlGY0MN", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "10" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json new file mode 100644 index 0000000000..3a6619c8ef --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_Pro_S100", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "AhMR49fcFqtrQ6hI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic PETG;Generic PETG @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json new file mode 100644 index 0000000000..e48e2d8145 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_RD50_V2", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "3v7ah1zVG8MERPSJ", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json new file mode 100644 index 0000000000..c810cf0e8f --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PETG @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PETG @Blocks_RF50", + "inherits": "Blocks PETG @base", + "from": "system", + "setting_id": "S7weR19wo9meJ6Yz", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PETG @Blocks.json b/resources/profiles/Blocks/filament/Blocks PETG @base.json similarity index 68% rename from resources/profiles/Blocks/filament/Generic PETG @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PETG @base.json index 45a2a13e9b..f272fa9049 100644 --- a/resources/profiles/Blocks/filament/Generic PETG @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PETG @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PETG @Blocks", + "name": "Blocks PETG @base", "inherits": "fdm_filament_petg", - "renamed_from": "Blocks Generic PETG", "from": "system", - "setting_id": "NgzPlYItKHbmGgv3", - "filament_id": "OFYPdQJh", - "instantiation": "true", + "filament_id": "OF9t1Ga0", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.94" ], @@ -81,18 +82,5 @@ ], "slow_down_layer_time": [ "5" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json new file mode 100644 index 0000000000..64f6bbefa0 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_Pro_S100", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "vWojuLYIfduLGFLL", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic PLA;Generic PLA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..ac283bbe06 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_RD50_V2", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "y7y8NcXNdp17sJUs", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json new file mode 100644 index 0000000000..c59a35df74 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA @Blocks_RF50", + "inherits": "Blocks PLA @base", + "from": "system", + "setting_id": "jt1MJF4eZzkkscEJ", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic PLA @Blocks.json b/resources/profiles/Blocks/filament/Blocks PLA @base.json similarity index 52% rename from resources/profiles/Blocks/filament/Generic PLA @Blocks.json rename to resources/profiles/Blocks/filament/Blocks PLA @base.json index 3a5c942899..c4051967af 100644 --- a/resources/profiles/Blocks/filament/Generic PLA @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks PLA @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic PLA @Blocks", + "name": "Blocks PLA @base", "inherits": "fdm_filament_pla", - "renamed_from": "Blocks Generic PLA", "from": "system", - "setting_id": "kjhuttx4T8OtTNmV", - "filament_id": "OFDSrzZ8", - "instantiation": "true", + "filament_id": "OFVGAC8g", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_flow_ratio": [ "0.95" ], @@ -39,18 +40,5 @@ ], "during_print_exhaust_fan_speed": [ "100" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json new file mode 100644 index 0000000000..08050266b7 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @Blocks_RD50_V2", + "inherits": "Blocks PLA-CF @base", + "from": "system", + "setting_id": "lhBtMKP1DmOB3HOI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PLA-CF;Generic PLA-CF @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json new file mode 100644 index 0000000000..1f27f49fdf --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @Blocks_RF50", + "inherits": "Blocks PLA-CF @base", + "from": "system", + "setting_id": "6CU83mAyhcZ4FCPI", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json b/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json new file mode 100644 index 0000000000..989a427df4 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PLA-CF @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "name": "Blocks PLA-CF @base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "OF6FfwOP", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_type": [ + "PLA-CF" + ], + "slow_down_layer_time": [ + "7" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json new file mode 100644 index 0000000000..f1beff3b23 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RD50_V2.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Blocks PVA @Blocks_RD50_V2", + "inherits": "Blocks PVA @base", + "from": "system", + "setting_id": "hREDqwKF6qyKkakp", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ], + "renamed_from": "Blocks Generic PVA;Generic PVA @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json new file mode 100644 index 0000000000..91a0a0e5e6 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks PVA @Blocks_RF50", + "inherits": "Blocks PVA @base", + "from": "system", + "setting_id": "q6pKqHY7Iz4OZaAC", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks PVA @base.json b/resources/profiles/Blocks/filament/Blocks PVA @base.json new file mode 100644 index 0000000000..326e61b362 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks PVA @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Blocks PVA @base", + "inherits": "fdm_filament_pva", + "from": "system", + "filament_id": "OFqcNuE1", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json new file mode 100644 index 0000000000..d186e824ef --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_Pro_S100.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_Pro_S100", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "6Rkz2je91JRTRoTi", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS Pro S100 0.4 nozzle", + "BLOCKS Pro S100 0.6 nozzle", + "BLOCKS Pro S100 0.8 nozzle", + "BLOCKS Pro S100 1.0 nozzle", + "BLOCKS Pro S100 1.2 nozzle" + ], + "renamed_from": "Blocks Generic TPU;Generic TPU @Blocks" +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json new file mode 100644 index 0000000000..088ad69bbb --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RD50_V2.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_RD50_V2", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "mkCqRQTtXldzoEUg", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RD50 V2 0.4 nozzle", + "BLOCKS RD50 V2 0.6 nozzle", + "BLOCKS RD50 V2 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json new file mode 100644 index 0000000000..53773dd813 --- /dev/null +++ b/resources/profiles/Blocks/filament/Blocks TPU @Blocks_RF50.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Blocks TPU @Blocks_RF50", + "inherits": "Blocks TPU @base", + "from": "system", + "setting_id": "bCCvu5Ow1JkwIrRR", + "instantiation": "true", + "compatible_printers": [ + "BLOCKS RF50 0.4 nozzle", + "BLOCKS RF50 0.6 nozzle", + "BLOCKS RF50 0.8 nozzle" + ] +} diff --git a/resources/profiles/Blocks/filament/Generic TPU @Blocks.json b/resources/profiles/Blocks/filament/Blocks TPU @base.json similarity index 58% rename from resources/profiles/Blocks/filament/Generic TPU @Blocks.json rename to resources/profiles/Blocks/filament/Blocks TPU @base.json index 8b5873a745..9b26d57636 100644 --- a/resources/profiles/Blocks/filament/Generic TPU @Blocks.json +++ b/resources/profiles/Blocks/filament/Blocks TPU @base.json @@ -1,12 +1,13 @@ { "type": "filament", - "name": "Generic TPU @Blocks", + "name": "Blocks TPU @base", "inherits": "fdm_filament_tpu", - "renamed_from": "Blocks Generic TPU", "from": "system", - "setting_id": "6iVYOCZo8ugs4JA0", - "filament_id": "OFgbpcy9", - "instantiation": "true", + "filament_id": "OFYnedOZ", + "instantiation": "false", + "filament_vendor": [ + "Blocks" + ], "filament_max_volumetric_speed": [ "4" ], @@ -54,18 +55,5 @@ ], "during_print_exhaust_fan_speed": [ "80" - ], - "compatible_printers": [ - "BLOCKS Pro S100 0.4 nozzle", - "BLOCKS Pro S100 0.6 nozzle", - "BLOCKS Pro S100 0.8 nozzle", - "BLOCKS Pro S100 1.0 nozzle", - "BLOCKS Pro S100 1.2 nozzle", - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" ] } diff --git a/resources/profiles/Blocks/filament/Generic PA @Blocks.json b/resources/profiles/Blocks/filament/Generic PA @Blocks.json deleted file mode 100644 index e624226ded..0000000000 --- a/resources/profiles/Blocks/filament/Generic PA @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PA @Blocks", - "inherits": "fdm_filament_pa", - "renamed_from": "Blocks Generic PA", - "from": "system", - "setting_id": "hL3p8gAeciwDkjNK", - "filament_id": "OFg8ndtj", - "instantiation": "true", - "filament_flow_ratio": [ - "0.98" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PC @Blocks.json b/resources/profiles/Blocks/filament/Generic PC @Blocks.json deleted file mode 100644 index 7b5df77bc5..0000000000 --- a/resources/profiles/Blocks/filament/Generic PC @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PC @Blocks", - "inherits": "fdm_filament_pc", - "renamed_from": "Blocks Generic PC", - "from": "system", - "setting_id": "Xhs8PjtmwwVj0ksE", - "filament_id": "OFLakOUI", - "instantiation": "true", - "filament_flow_ratio": [ - "0.94" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json b/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json deleted file mode 100644 index 3a3ac5daba..0000000000 --- a/resources/profiles/Blocks/filament/Generic PLA-CF @Blocks.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "filament", - "name": "Generic PLA-CF @Blocks", - "inherits": "fdm_filament_pla", - "renamed_from": "Blocks Generic PLA-CF", - "from": "system", - "setting_id": "oKUqzwAWMrpiyGLf", - "filament_id": "OFWbdGsC", - "instantiation": "true", - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "20" - ], - "filament_type": [ - "PLA-CF" - ], - "slow_down_layer_time": [ - "7" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/filament/Generic PVA @Blocks.json b/resources/profiles/Blocks/filament/Generic PVA @Blocks.json deleted file mode 100644 index 5b6a3ad368..0000000000 --- a/resources/profiles/Blocks/filament/Generic PVA @Blocks.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "filament", - "name": "Generic PVA @Blocks", - "inherits": "fdm_filament_pva", - "renamed_from": "Blocks Generic PVA", - "from": "system", - "setting_id": "tNw3oe7VovLkgUbB", - "filament_id": "OFDvXujf", - "instantiation": "true", - "filament_flow_ratio": [ - "0.98" - ], - "filament_max_volumetric_speed": [ - "20" - ], - "compatible_printers": [ - "BLOCKS RD50 V2 0.4 nozzle", - "BLOCKS RD50 V2 0.6 nozzle", - "BLOCKS RD50 V2 0.8 nozzle", - "BLOCKS RF50 0.4 nozzle", - "BLOCKS RF50 0.6 nozzle", - "BLOCKS RF50 0.8 nozzle" - ] -} diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json index e8cc1893c7..43951cf9c5 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.4 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "G7HQgaspHXduDM8O", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks", + "default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.30" ], @@ -25,5 +25,8 @@ "printable_height": "900", "upward_compatible_machine": [ "BLOCKS Pro S100" + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json index 49e519d2ec..a55153bab7 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.6 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "XkWdS210oUMQN17N", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks", + "default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.50" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "0.6" + "printer_variant": "0.6", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json index 3c3a29f111..7e889bbf14 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 0.8 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "I6PdeCS7SbvIlkZf", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks", + "default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.56" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "0.8" + "printer_variant": "0.8", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json index 1be375c34b..c84ad8c227 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.0 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "elLdUyy9RhUoa37o", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks", + "default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.7" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "1.0" + "printer_variant": "1.0", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json index 426fdafd55..11aab094cf 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100 1.2 nozzle.json @@ -6,7 +6,7 @@ "setting_id": "xtsGSJ4JkbHTPi44", "instantiation": "true", "printer_model": "BLOCKS Pro S100", - "default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks", + "default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "max_layer_height": [ "0.8" ], @@ -26,5 +26,8 @@ "upward_compatible_machine": [ "BLOCKS Pro S100" ], - "printer_variant": "1.2" + "printer_variant": "1.2", + "default_filament_profile": [ + "Blocks PLA @Blocks_Pro_S100" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS Pro S100.json b/resources/profiles/Blocks/machine/BLOCKS Pro S100.json index de9ea3756c..e034ffd9b1 100644 --- a/resources/profiles/Blocks/machine/BLOCKS Pro S100.json +++ b/resources/profiles/Blocks/machine/BLOCKS Pro S100.json @@ -8,5 +8,5 @@ "bed_model": "PRO S100 HotBed model.stl", "bed_texture": "PRO S100 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_Pro_S100;Blocks PETG @Blocks_Pro_S100;Blocks TPU @Blocks_Pro_S100" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json index 3d2908a403..c5613b39ec 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.4 nozzle.json @@ -34,5 +34,9 @@ "printable_height": "500", "upward_compatible_machine": [ "BLOCKS RD50 V2" + ], + "printer_variant": "0.4", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json index bf41f1070f..92cde6244c 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.6 nozzle.json @@ -35,5 +35,8 @@ "deretraction_speed": [ "80" ], - "printer_variant": "0.6" + "printer_variant": "0.6", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json index 23c0808be2..756e77efb7 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2 0.8 nozzle.json @@ -35,5 +35,8 @@ "deretraction_speed": [ "80" ], - "printer_variant": "0.8" + "printer_variant": "0.8", + "default_filament_profile": [ + "Blocks PLA @Blocks_RD50_V2" + ] } diff --git a/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json b/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json index 76dafd429e..1cc75448ac 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json +++ b/resources/profiles/Blocks/machine/BLOCKS RD50 V2.json @@ -8,5 +8,5 @@ "bed_model": "RD50 V2 HotBed model.stl", "bed_texture": "RD50 V2 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_RD50_V2;Blocks PETG @Blocks_RD50_V2;Blocks TPU @Blocks_RD50_V2" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json index a589b6620b..9e523ef843 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.4 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -79,5 +79,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json index fea3007abc..b0dbc7d2b9 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.6 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -75,8 +75,8 @@ "BLOCKS RF50" ], "machine_start_gcode": [ - "PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]", - "SET_PRESSURE_ADVANCE ADVANCE=0.046" + "PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]\n", + "SET_PRESSURE_ADVANCE ADVANCE=0.046\n" ], "printer_variant": "0.6", "wipe_distance": [ @@ -84,5 +84,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json b/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json index c8d6cec882..c361a8da16 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50 0.8 nozzle.json @@ -51,7 +51,7 @@ "12" ], "retraction_length": [ - "1" + "1.2" ], "retraction_speed": [ "60" @@ -80,5 +80,10 @@ ], "retract_before_wipe": [ "0" - ] + ], + "default_filament_profile": [ + "Blocks PLA @Blocks_RF50" + ], + "support_multi_bed_types": "1", + "default_bed_type": "Textured PEI Plate" } diff --git a/resources/profiles/Blocks/machine/BLOCKS RF50.json b/resources/profiles/Blocks/machine/BLOCKS RF50.json index 14ae8bc5f4..79aeec9ebc 100644 --- a/resources/profiles/Blocks/machine/BLOCKS RF50.json +++ b/resources/profiles/Blocks/machine/BLOCKS RF50.json @@ -8,5 +8,6 @@ "bed_model": "RF50 HotBed model.stl", "bed_texture": "RF50 HotBed texture.svg", "hotend_model": "BLOCKS PrintCore.stl", - "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks" + "default_materials": "Blocks PLA @Blocks_RF50;Blocks PETG @Blocks_RF50;Blocks TPU @Blocks_RF50", + "not_support_bed_type": "Smooth Cool Plate;Engineering Plate;Textured Cool Plate;Cool Plate (SuperTack)" } diff --git a/resources/profiles/Blocks/machine/fdm_klipper_common.json b/resources/profiles/Blocks/machine/fdm_klipper_common.json index 5372b42547..eab501bf4b 100644 --- a/resources/profiles/Blocks/machine/fdm_klipper_common.json +++ b/resources/profiles/Blocks/machine/fdm_klipper_common.json @@ -123,9 +123,6 @@ "wipe": [ "1" ], - "default_filament_profile": [ - "Generic PLA @Blocks" - ], "bed_exclude_area": [ "0x0" ], diff --git a/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json index 315256dcab..43474f76c1 100644 --- a/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.12mm Fine 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json index ca6facb720..b7351a4996 100644 --- a/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json index b80b051a71..aa2b2c8e4a 100644 --- a/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.20mm Optimal 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json index 9f66196279..d5a27fa23b 100644 --- a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.20mm Standard 0.4 nozzle @Blocks", + "name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "47aDtVL6E5DVr7Mt", + "setting_id": "QSEguMMChNFZsK5H", "instantiation": "true", "layer_height": "0.2", "bottom_shell_layers": "4", "top_shell_layers": "5", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.20mm Standard 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json index 5c88e00c2a..901f3f811d 100644 --- a/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json @@ -25,7 +25,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -61,5 +61,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json index 2bc124f2dc..2716ce0c66 100644 --- a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.24mm Draft 0.4 nozzle @Blocks", + "name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "ETADjxV6ViJQdnHA", + "setting_id": "uALfEFHGmup6vBYI", "instantiation": "true", "layer_height": "0.24", "bottom_shell_layers": "4", "top_shell_layers": "5", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.24mm Draft 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json index edb1bfcc2d..ab911910b9 100644 --- a/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.24mm Draft 0.4 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json index d2f853b638..739b4f7168 100644 --- a/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json index dd6b60d371..7c9a108287 100644 --- a/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json index 0cef66fb5a..c67ebf9341 100644 --- a/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Extra Draft 0.4 nozzle @Blocks", + "name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_blocks_common", "from": "system", - "setting_id": "UbuICsmppKDsaaZ4", + "setting_id": "HYKF5l2OGvpugSQy", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 0.4 nozzle" - ] + ], + "renamed_from": "0.30mm Extra Draft 0.4 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json index bbb74c97a9..bbd486176f 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Optimal 0.8 nozzle @Blocks", + "name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "YqkYzp5zdH4R5upm", + "setting_id": "OUfZvizM5MGnvHfp", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.3", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.30mm Optimal 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json index 9d909c1dd4..f6763c9494 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 0.8 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json index 8820018b9d..e7ce874a77 100644 --- a/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Optimal 1.0 nozzle @Blocks", + "name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "8pBawPScHkyQu0SW", + "setting_id": "HGG9WxKVr89qNFDx", "instantiation": "true", "bottom_shell_layers": "4", "top_shell_layers": "4", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.30mm Optimal 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json index d2a815e849..00e37a7860 100644 --- a/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.30mm Standard 0.6 nozzle @Blocks", + "name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.6 nozzle", "from": "system", - "setting_id": "EPI3PAVK9LpJOZWO", + "setting_id": "gO2I1YjBl4nf8yzr", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.30", "compatible_printers": [ "BLOCKS Pro S100 0.6 nozzle" - ] + ], + "renamed_from": "0.30mm Standard 0.6 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json index 60c6eae19e..b19346e30a 100644 --- a/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.32mm Draft 0.6 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json index f28a975208..12922fa105 100644 --- a/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json index 7b94febc1c..5c2245f114 100644 --- a/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json index 45fdd61179..915d160b6c 100644 --- a/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.40mm Draft 0.6 nozzle @Blocks", + "name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.6 nozzle", "from": "system", - "setting_id": "CShVKoGspbMJNPw8", + "setting_id": "OjsLUl1heqv1cevs", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "2", "layer_height": "0.40", "compatible_printers": [ "BLOCKS Pro S100 0.6 nozzle" - ] + ], + "renamed_from": "0.40mm Draft 0.6 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json index 177b620e51..20f02ff7af 100644 --- a/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.40mm Standard 0.8 nozzle @Blocks", + "name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "TSRjmfWaatY7oLJB", + "setting_id": "laOTioBGySeudJpl", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.40", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.40mm Standard 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json index d49633e89d..be66641b28 100644 --- a/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json @@ -22,7 +22,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json index fc1a875d67..8f358e60e2 100644 --- a/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Draft 0.8 nozzle @Blocks", + "name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 0.8 nozzle", "from": "system", - "setting_id": "vOtZHrDS88Shmf2m", + "setting_id": "oAhgUZdADR7kP87e", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "4", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 0.8 nozzle" - ] + ], + "renamed_from": "0.50mm Draft 0.8 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json index 6b59b1c101..11c79d1a65 100644 --- a/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Optimal 1.2 nozzle @Blocks", + "name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "BKrEAKqDYzdH43wc", + "setting_id": "0eqNgX26jemsBfV5", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.50mm Optimal 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json index 80e3ba5649..0bd91d3405 100644 --- a/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.50mm Standard 1.0 nozzle @Blocks", + "name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "D40iksDm7mFjhSKn", + "setting_id": "z1qCW1cEMc4QvBbV", "instantiation": "true", "bottom_shell_layers": "3", "top_shell_layers": "3", "layer_height": "0.50", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.50mm Standard 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json b/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json index a0e9121ceb..6700893916 100644 --- a/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json +++ b/resources/profiles/Blocks/process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json @@ -21,7 +21,7 @@ "top_solid_infill_flow_ratio": "0.97", "bottom_solid_infill_flow_ratio": "1.08", "seam_position": "aligned", - "sparse_infill_patter": "grid", + "sparse_infill_pattern": "grid", "initial_layer_speed": "60", "initial_layer_infill_speed": "80", "initial_travel_speed": "100%", @@ -57,5 +57,7 @@ "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "elefant_foot_compensation": "0.25", - "elefant_foot_compensation_layers": "1" + "elefant_foot_compensation_layers": "1", + "skirt_loops": "2", + "skirt_type": "perobject" } diff --git a/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json index e59174620f..f63ebde1bc 100644 --- a/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.60mm Draft 1.0 nozzle @Blocks", + "name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "UJUe8XCBzZf8NyCL", + "setting_id": "gTTgtfG8qb9My3hH", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.60", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.60mm Draft 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json similarity index 62% rename from resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json index 598534c050..ba93c393a6 100644 --- a/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.60mm Standard 1.2 nozzle @Blocks", + "name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "PSBFrTykpkytPI2Q", + "setting_id": "ApcyToENCIANrI71", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.60", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.60mm Standard 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json similarity index 63% rename from resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json index 905bb32a48..7950bce0ca 100644 --- a/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.70mm Draft 1.2 nozzle @Blocks", + "name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "0ZQ0USGX9SwAKr29", + "setting_id": "DEv7X7zaTfxRQmjo", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.70", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.70mm Draft 1.2 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json index 49eaf2c7b9..49d864ed8f 100644 --- a/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.70mm Extra Draft 1.0 nozzle @Blocks", + "name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.0 nozzle", "from": "system", - "setting_id": "69PFmjOVFBOIp3Qg", + "setting_id": "nUW7N9dJmTyQT4AG", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "3", "layer_height": "0.70", "compatible_printers": [ "BLOCKS Pro S100 1.0 nozzle" - ] + ], + "renamed_from": "0.70mm Extra Draft 1.0 nozzle @Blocks" } diff --git a/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json b/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json similarity index 61% rename from resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json rename to resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json index df6d97a9d7..22f7628081 100644 --- a/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks.json +++ b/resources/profiles/Blocks/process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json @@ -1,14 +1,15 @@ { "type": "process", - "name": "0.80mm Extra Draft 1.2 nozzle @Blocks", + "name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", "inherits": "fdm_process_common 1.2 nozzle", "from": "system", - "setting_id": "iBwRI5JJewW5HJSv", + "setting_id": "JMy62SonRfK0cAdL", "instantiation": "true", "bottom_shell_layers": "2", "top_shell_layers": "2", "layer_height": "0.80", "compatible_printers": [ "BLOCKS Pro S100 1.2 nozzle" - ] + ], + "renamed_from": "0.80mm Extra Draft 1.2 nozzle @Blocks" } From 770748725253bca43d95c40245db96e7b88eba28 Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Mon, 28 Sep 2026 10:59:39 +0100 Subject: [PATCH 09/12] Fix overhang slowdown and fan applied to whole walls ahead of an overhang (#15945) --- src/libslic3r/GCode.cpp | 51 ++--- src/libslic3r/GCode/ExtrusionProcessor.hpp | 184 +++++++++++-------- tests/fff_print/test_extrusion_processor.cpp | 93 ++++++++++ 3 files changed, 231 insertions(+), 97 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 77a05ed171..941818c78f 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -7969,6 +7969,20 @@ double GCode::calc_max_volumetric_speed(const double layer_height, const double return res; } +// ORCA: Overlap at or below which the overhang fan switches on; negative when it does not depend on overlap +// (Overhang_threshold_none cools every external perimeter). +static float overhang_fan_overlap_threshold(int overhang_fan_threshold) +{ + switch (overhang_fan_threshold) { + case (int) Overhang_threshold_1_4: return 0.9f; + case (int) Overhang_threshold_2_4: return 0.75f; + case (int) Overhang_threshold_3_4: return 0.5f; + case (int) Overhang_threshold_4_4: return 0.25f; + case (int) Overhang_threshold_bridge: return 0.05f; + default: return -1.f; + } +} + std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed) { std::string gcode; @@ -8311,6 +8325,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, ConfigOptionPercents overhang_overlap_levels({90, 75, 50, 25, 13, 0}); + // ORCA: Lets the path be split where the overhang fan switches, not only where the speed changes. + // Bridges and overhang perimeters are cooled regardless of overlap. + float fan_overlap_threshold = -1.f; + if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers && path.role() != erBridgeInfill && + path.role() != erOverhangPerimeter) + fan_overlap_threshold = overhang_fan_overlap_threshold(FILAMENT_CONFIG(overhang_fan_threshold)); + if (NOZZLE_CONFIG(slowdown_for_curled_perimeters)){ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( {FloatOrPercent{100, true}, @@ -8331,7 +8352,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, FloatOrPercent{NOZZLE_CONFIG(overhang_4_4_speed).get_abs_value(ref_speed) * 100 / ref_speed, true}}); new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters)); + ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), + fan_overlap_threshold); }else{ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( {FloatOrPercent{100, true}, @@ -8350,7 +8372,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, FloatOrPercent{NOZZLE_CONFIG(bridge_speed) * 100 / ref_speed, true}}); new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters)); + ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), + fan_overlap_threshold); } variable_speed = std::any_of(new_points.begin(), new_points.end(), [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) @@ -8502,28 +8525,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings return true; } - switch (overhang_fan_threshold) { - case (int)Overhang_threshold_1_4: - return overlap <= 0.9f; - break; - case (int)Overhang_threshold_2_4: - return overlap <= 0.75f; - break; - case (int)Overhang_threshold_3_4: - return overlap <= 0.5f; - break; - case (int)Overhang_threshold_4_4: - return overlap <= 0.25f; - break; - case (int)Overhang_threshold_bridge: - return overlap <= 0.05f; - break; - case (int)Overhang_threshold_none: + if (overhang_fan_threshold == Overhang_threshold_none) return is_external_perimeter(role); - break; - default: - return false; - } + const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold); + return overlap_threshold >= 0.f && overlap <= overlap_threshold; }; std::string comment; diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp index 1d65e83f3e..8ed829aa6e 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.hpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -41,10 +41,12 @@ std::vector> estimate_points_properties(const POINTS& float flow_width, float max_line_length = -1.0f, float min_distance = -1.0f, - // Maps an overhang distance onto the speed it will be printed at. Interior sampling - // needs it to tell which of the points it could add would change the G-code, and is - // skipped without it. - const std::function& distance_to_speed = {}) + // Speed an overhang distance prints at. Without it, interior sampling + // is skipped and every line over 4mm is split. + const std::function& distance_to_speed = {}, + // Overlap (1 - distance / flow_width) at or below which the overhang + // fan switches on; negative when the fan does not depend on overlap. + float fan_overlap_threshold = -1.0f) { bool looped = input_points.front() == input_points.back(); std::function get_prev_index = [](size_t idx, size_t count) { @@ -125,29 +127,43 @@ std::vector> estimate_points_properties(const POINTS& points.push_back(next_point); } + // ORCA: How an overhang distance prints, which is what the passes below compare. A segment is printed at the lower + // of the speeds at its two ends, and with the overhang fan on if the overlap at either end turns it on. A point + // added to a path can therefore only change the G-code where it prints at a different speed or fan state from the + // points either side of it, and the passes below add points there and nowhere else. + const float width_inv = 1.f / flow_width; + // Whether an overhang distance turns the overhang fan on. The overlap test check_overhang_fan applies in GCode.cpp. + auto fan_on = [fan_overlap_threshold, width_inv](float distance) { + return fan_overlap_threshold >= 0.f && 1.f - distance * width_inv <= fan_overlap_threshold; + }; + // Whether two overhang distances are interchangeable ie have the same speed (beyond a 1mm/sec threshold that gcode.cpp filters out on) + // and the same fan state. + auto same_speed_and_fan = [&distance_to_speed, &fan_on](float a, float b) { + return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f && fan_on(a) == fan_on(b); + }; + // Whether the first overhang distance prints slower than the second, beyond the 1mm/sec gcode.cpp tolerance, or turns the overhang + // fan on where the second does not. Against a supported point (overhang distance 0) it tells whether an end is + // affected by the overhang. + auto slower_or_cooled = [&distance_to_speed, &fan_on](float a, float b) { + return distance_to_speed(a) < distance_to_speed(b) - 1.f || (fan_on(a) && !fan_on(b)); + }; + // ORCA: Interior sampling - // The passes below infer the support under a span from its endpoints alone, so an interior that is supported - // differently from both ends is invisible to them: the outer perimeter of an overhang whose ends are caged by - // full height walls reads as supported along its whole length. Probe the interior, keep the samples the - // endpoint interpolation fails to predict, and bisect either side of each one, so a span that is only partly - // unsupported gets points where its support actually changes instead of one reading spread across all of it. - if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && min_distance > 0 && distance_to_speed) { + // The passes below infer the support under a span from its endpoints alone, so a part that is supported + // differently from both ends is invisible to them. The outer perimeter of an overhang whose ends are supported by + // reads as supported along its whole length. Probe the interior, keep the samples the endpoint interpolation fails to predict, + // and bisect either side of each one, so a span that is only partly unsupported gets points where its support actually changes + // instead of one reading being spread across all of it. + // Skipped where there is nothing to find: min_distance <= 0 when no overhang can slow this path down, and + // fan_overlap_threshold < 0 when no overhang switches the fan on. It also needs distance_to_speed to tell which of + // the points it could add would change the G-code. + if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && distance_to_speed && (min_distance > 0 || fan_overlap_threshold >= 0.f)) { // Probe at least this densely before treating matching samples as evidence that a span is uniform. The // segmentation pass below only splits lines of 2mm or more, and every pass here drops points closer - // together than min_spacing, so finer discovery would not produce a more precise speed transition. + // together than min_spacing, so finer discovery would not produce a more precise transition. const double max_probe_spacing = std::max(2., 4. * min_spacing); // A backstop for that length test, which on a non-finite length would never be met. constexpr int max_bisection_depth = 10; - // Whether two readings are interchangeable. A segment is printed at the lower of the speeds its ends - // read, so a sample that agrees on speed with what is already known cannot change the G-code, whatever - // its distance says. The distances themselves are far too coarse a stand-in for this: the speed sections - // interpolate, so readings a small fraction of min_distance apart can still be tens of mm/s apart. - // The tolerance matches the one GCode.cpp applies when it decides a path has a variable speed at all. - auto same_speed = [&distance_to_speed](float a, float b) { - return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f; - }; - // Whether the first reading is printed slower than the second, once they are known to differ. - auto prints_slower = [&distance_to_speed](float a, float b) { return distance_to_speed(a) < distance_to_speed(b); }; // Part of a segment still to bisect: its positions along the segment and bisections left. struct Subspan { double t0, t1; int depth; }; @@ -185,8 +201,8 @@ std::vector> estimate_points_properties(const POINTS& if (!interior.empty()) { std::sort(interior.begin(), interior.end(), [](const std::pair& l, const std::pair& r) { return l.first < r.first; }); - // Coarse probing keeps every sample it took until this pass can see which ones bracket a speed - // transition. Matching samples cannot be discarded during discovery: one may be the last + // Coarse probing keeps every sample it took until this pass can see which ones bracket a speed or + // fan transition. Matching samples cannot be discarded during discovery: one may be the last // supported point before a narrow unsupported pocket found by a later probe. size_t kept = 0; for (size_t i = 0; i < interior.size(); ++i) { @@ -195,15 +211,15 @@ std::vector> estimate_points_properties(const POINTS& const bool at_end = i + 1 == interior.size(); // And nothing follows the last sample but the segment's end const float before = at_start ? curr.distance : interior[kept - 1].second; const float after = at_end ? next.distance : interior[i + 1].second; - // A sample is worth a point in the path only where it prints at a different speed from the - // readings either side of it. Differing from one of the segment's own ends is not enough on - // its own where the sample is the faster of the two: the segmentation pass below already - // ends the slowdown an end reads, at a distance taken from how far out that end is rather - // than from wherever bisection happened to stop, and a point here would leave the span - // beside the end too short for that pass to run at all. Support an end cannot account for, - // where the interior is the slower reading, is exactly what this pass is here to find. - const bool worth_before = !same_speed(sample, before) && (!at_start || prints_slower(sample, before)); - const bool worth_after = !same_speed(sample, after) && (!at_end || prints_slower(sample, after)); + // A sample is worth a point in the path only where it prints differently, in speed or fan state, + // from the points either side of it. Differing from one of the segment's own ends is not enough on + // its own where the sample is not the slower or cooled of the two: the segmentation pass below + // already confines the slowdown and cooling at an end, at a distance taken from how far out that + // end is rather than from wherever bisection happened to stop, and a point here would leave the + // span beside the end too short for that pass to run at all. Support an end cannot account for, + // where the interior is the slower or cooled of the two, is exactly what this pass is here to find. + const bool worth_before = !same_speed_and_fan(sample, before) && (!at_start || slower_or_cooled(sample, before)); + const bool worth_after = !same_speed_and_fan(sample, after) && (!at_end || slower_or_cooled(sample, after)); if (worth_before || worth_after) interior[kept++] = interior[i]; } @@ -238,52 +254,60 @@ std::vector> estimate_points_properties(const POINTS& if ((curr.distance > -boundary_offset && curr.distance < boundary_offset + 2.0f) || (next.distance > -boundary_offset && next.distance < boundary_offset + 2.0f)) { double line_len = (next.position - curr.position).norm(); - - // ORCA: Segment path to smaller lines by adding additional points only if the path has an overhang that - // will trigger a slowdown and the path is also reasonably large, i.e. 2mm in length or more - // If there is no overhang in the start/end point, dont segment it. - // Ignore this check if the control of segmentation for overhangs is disabled (min_distance=-1) - if ((min_distance > 0 && ((std::abs(curr.distance) > min_distance) || (std::abs(next.distance) > min_distance)) && line_len >= 2.f) || - (min_distance <= 0 && line_len > 4.0f)) { + + // ORCA: A line prints as slow as its slower end and is cooled if either end is, so an overhang at one + // end would otherwise slow down or cool the whole line. Split the line so that only the part beside + // that end prints that way, if the line is reasonably long (2mm or more) and at least one end prints + // slower or cooled compared with a supported point (overhang distance 0). Deciding on how the end + // prints, rather than on its overhang distance against min_distance, also catches an end whose overhang + // distance is exactly where the slowdown begins, such as an outline crossing at half a line width. + // Without distance_to_speed, split every line over 4mm. + const bool split_line = distance_to_speed ? + line_len >= 2.f && (slower_or_cooled(curr.distance, 0.f) || slower_or_cooled(next.distance, 0.f)) : + line_len > 4.0f; + if (split_line) { + // Each end's piece is that end's overhang distance plus 1.5 line widths (3 * boundary_offset) long: + // a0 ends the piece beside curr, a1 starts the piece beside next. double a0 = std::clamp((curr.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double a1 = std::clamp(1.0f - (next.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double t0 = std::min(a0, a1); double t1 = std::max(a0, a1); - if (t0 < 1.0) { - Vec p0 = curr.position + t0 * (next.position - curr.position); - auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra( - p0.template cast()); - ExtendedPoint new_p{}; - new_p.position = p0; - new_p.distance = float(p0_dist + boundary_offset); - // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change - // or if this option is disabled (min_distance<=0) - if( (std::abs(p0_dist) > min_distance) || (min_distance<=0)){ - // ORCA: also filter out points that are introduced to the start of the path when their distance from the start point is - // not meaningful - if ((p0 - curr.position).norm() > min_spacing && (next.position - p0).norm() > min_spacing) { - new_points.push_back(new_p); - } - } + // Up to two cut points, in order along the line. Each takes its own overhang distance, so every + // piece prints by the overhang distances at its own two ends. t0 >= 1 or t1 <= 0 falls on the + // line's own end, so there is no cut. A cut closer than min_spacing to either end of the line is + // not meaningful and is filtered out (#6714). + ExtendedPoint cut[2]{}; + bool keep[2] = {false, false}; + for (int k = 0; k < 2; ++k) { + const double t = k == 0 ? t0 : t1; + if (k == 0 ? t >= 1.0 : t <= 0.0) + continue; + const Vec p = curr.position + t * (next.position - curr.position); + auto [p_dist, p_near_l, p_x] = unscaled_prev_layer.template distance_from_lines_extra( + p.template cast()); + cut[k].position = p; + cut[k].distance = float(p_dist + boundary_offset); + keep[k] = (p - curr.position).norm() > min_spacing && (next.position - p).norm() > min_spacing; } - if (t1 > 0.0) { - Vec p1 = curr.position + t1 * (next.position - curr.position); - auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra( - p1.template cast()); - ExtendedPoint new_p{}; - new_p.position = p1; - new_p.distance = float(p1_dist + boundary_offset); - // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change - // or if this option is disabled (min_distance<=0) - if( (std::abs(p1_dist) > min_distance) || (min_distance<=0)){ - // ORCA: filter out points that are introduced to the end of the path when their distance from the end point is - // not meaningful - if ((p1 - curr.position).norm() > min_spacing && (next.position - p1).norm() > min_spacing) { - new_points.push_back(new_p); - } - } + if (distance_to_speed) { + // Only keep a cut that changes the G-code: one that prints differently from at least one of the + // points either side of it, which are the line's ends or the other cut where that is kept. A cut + // that prints like both would only split a move into two identical ones. + if (keep[0]) + keep[0] = !same_speed_and_fan(cut[0].distance, curr.distance) || + !same_speed_and_fan(cut[0].distance, keep[1] ? cut[1].distance : next.distance); + if (keep[1]) + keep[1] = !same_speed_and_fan(cut[1].distance, keep[0] ? cut[0].distance : curr.distance) || + !same_speed_and_fan(cut[1].distance, next.distance); + // Two cuts closer together than min_spacing would leave a micro segment between them, so only the + // first is kept. + if (keep[0] && keep[1] && (cut[1].position - cut[0].position).norm() <= min_spacing) + keep[1] = false; } + for (int k = 0; k < 2; ++k) + if (keep[k]) + new_points.push_back(cut[k]); } } new_points.push_back(next); @@ -423,7 +447,10 @@ public: const ConfigOptionFloatsOrPercents &speeds, float ext_perimeter_speed, float original_speed, - bool slowdown_for_curled_edges) + bool slowdown_for_curled_edges, + // Overlap at or below which the overhang fan switches on; negative when the fan + // does not depend on overlap. + float fan_overlap_threshold = -1.0f) { size_t speed_sections_count = std::min(overlaps.values.size(), speeds.values.size()); std::vector> speed_sections; @@ -463,7 +490,8 @@ public: } } - // If a meaningful (i.e. needing slowdown) overhang distance was not found, then we shouldn't split the lines + // If no overhang distance slows this path down, -1 turns interior sampling off unless the overhang fan can switch. + // Lines are only split where an end prints slower or cooled, so here only a fan switch splits them. if (!found) smallest_distance_with_lower_speed=-1.f; @@ -487,9 +515,17 @@ public: return round(final_speed); }; + // ORCA: The speed sections are built from ext_perimeter_speed, which can be above the speed this path prints at + // (original_speed, e.g. held down by resonance avoidance). Every segment is capped at original_speed below, so + // overhang distances whose speeds differ only above it print the same and must not count as a speed change when + // the path is split. + auto effective_speed = [&calculate_speed, original_speed](float distance) { + return std::min(calculate_speed(distance), original_speed); + }; + std::vector> extended_points = estimate_points_properties(path.polyline.points, prev_layer_boundaries[current_object], path.width, -1, - smallest_distance_with_lower_speed, calculate_speed); + smallest_distance_with_lower_speed, effective_speed, fan_overlap_threshold); const auto width_inv = 1.0f / path.width; std::vector processed_points; processed_points.reserve(extended_points.size()); diff --git a/tests/fff_print/test_extrusion_processor.cpp b/tests/fff_print/test_extrusion_processor.cpp index 76e331d66a..47f9a62ecf 100644 --- a/tests/fff_print/test_extrusion_processor.cpp +++ b/tests/fff_print/test_extrusion_processor.cpp @@ -244,6 +244,44 @@ float furthest_reading(const std::vector>& points) })->distance; } +// A wall along a supported edge of the previous layer, ending past or just short of the edge's end. Crossing the edge's +// end reads half a line width out. +constexpr double edge_run_length = 64.; // mm, wall start, measured from the end of the previous layer's edge +constexpr double edge_step = 0.384; // mm, how far this layer's contour extends past the previous layer's end +// The centreline is inset half a line width from the contour. +constexpr double edge_wall_end_past = edge_step - 0.5 * caged_wall_width; +constexpr double edge_wall_end_short = 0.05; // mm short of the edge, reading 0.21 - 0.05 = 0.16mm out +// Segmentation splits 1.5 line widths plus the end's reading from an end, so an end's slowdown and cooling stay within this. +constexpr double edge_affected_length = 3. * caged_wall_width; + +std::vector> sampled_wall_along_edge(double wall_end_x, + const std::function& distance_to_speed, + float min_distance, + float fan_overlap_threshold) +{ + const AABBTreeLines::LinesDistancer prev_layer(std::vector{ + {{0., 0.}, {edge_run_length + 10., 0.}}, + {{edge_run_length + 10., 0.}, {edge_run_length + 10., -10.}}, + {{edge_run_length + 10., -10.}, {0., -10.}}, + {{0., -10.}, {0., 0.}}, + }); + const double wall_y = -0.5 * caged_wall_width; + const Points wall{Point::new_scale(edge_run_length, wall_y), Point::new_scale(wall_end_x, wall_y)}; + + return estimate_points_properties(wall, prev_layer, caged_wall_width, -1.f, min_distance, + distance_to_speed, fan_overlap_threshold); +} + +// Length printed with the overhang fan on: segments with either end's overlap at or below the threshold. +double cooled_length(const std::vector>& points, float fan_overlap_threshold) +{ + double length = 0.; + for (size_t i = 0; i + 1 < points.size(); ++i) + if (1.f - std::max(points[i].distance, points[i + 1].distance) / float(caged_wall_width) <= fan_overlap_threshold) + length += (points[i + 1].position - points[i].position).norm(); + return length; +} + DynamicPrintConfig caged_overhang_config(const char* wall_generator){ DynamicPrintConfig config = DynamicPrintConfig::full_print_config(); config.set_deserialize_strict({ @@ -431,6 +469,61 @@ TEST_CASE("A supported wall between overhanging corners is slowed no further tha REQUIRE(sampled <= unsampled); } +// Regression: the line up to a step past the previous layer was not split, so the step's slowdown and cooling covered the +// whole wall. The split required an end reading beyond where the slowdown begins, and an edge crossing reads exactly +// there when the wall speed is held below the reference speed (e.g. resonance avoidance). +TEST_CASE("A wall stepping past the previous layer is slowed and cooled only beside the step", "[ExtrusionProcessor][Regression]") +{ + const float crossing_reading = 0.5f * float(caged_wall_width); + const std::function distance_to_speed = [crossing_reading](float distance) { + return distance < crossing_reading ? 70.f : 15.f; + }; + const float fan_overlap_threshold = 0.75f; // The fan switches on at a 25% overhang + + const std::vector> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, crossing_reading, + fan_overlap_threshold); + const double slowed = slowed_length(points, distance_to_speed); + const double cooled = cooled_length(points, fan_overlap_threshold); + + REQUIRE(slowed > 0.); + REQUIRE(cooled > 0.); + REQUIRE(slowed < edge_affected_length); + REQUIRE(cooled < edge_affected_length); +} + +// Regression: the fan can switch on at a smaller overhang than the first slowdown. Splitting only on speed changes left +// the whole wall cooled when its end read between the two. +TEST_CASE("A wall is split where only the overhang fan changes", "[ExtrusionProcessor][Regression]") +{ + const float crossing_reading = 0.5f * float(caged_wall_width); + const std::function distance_to_speed = [crossing_reading](float distance) { + return distance < crossing_reading ? 70.f : 15.f; + }; + // The end reads 0.16mm out (overlap 0.62): cooled at a 25% threshold, but not slowed. + const float fan_overlap_threshold = 0.75f; + + const std::vector> points = sampled_wall_along_edge(edge_wall_end_short, distance_to_speed, crossing_reading, + fan_overlap_threshold); + const double cooled = cooled_length(points, fan_overlap_threshold); + + REQUIRE_THAT(slowed_length(points, distance_to_speed), Catch::Matchers::WithinAbs(0., 1e-9)); + REQUIRE(cooled > 0.); + REQUIRE(cooled < edge_affected_length); +} + +// With one speed and a fan threshold no reading reaches, only the wall's ends and the edge crossing remain. +TEST_CASE("A wall is left whole where neither its speed nor its cooling changes", "[ExtrusionProcessor]") +{ + const std::function distance_to_speed = [](float) { return 70.f; }; + // 95% overhang; the step reads 0.384mm out (overlap 0.09). + const float fan_overlap_threshold = 0.05f; + + const std::vector> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, -1.f, + fan_overlap_threshold); + + REQUIRE(points.size() == 3); +} + TEST_CASE("Benchmark caged overhang interior sampling", "[ExtrusionProcessor][!benchmark]"){ const char* wall_generator = GENERATE("classic", "arachne"); From 00bde9265bb6602e17439d68e20c6f203d8d154d Mon Sep 17 00:00:00 2001 From: Kenneth Raplee <101818165+kenrap@users.noreply.github.com> Date: Mon, 28 Sep 2026 10:42:25 +0000 Subject: [PATCH 10/12] Add missing OCCT (8.x) header includes (#15825) * Add missing TopTools includes to GeometryEngine.cpp * Add missing TDF_LabelSequence include in STEP.cpp --------- Co-authored-by: yw4z --- src/libslic3r/CAD/GeometryEngine.cpp | 2 ++ src/libslic3r/Format/STEP.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/libslic3r/CAD/GeometryEngine.cpp b/src/libslic3r/CAD/GeometryEngine.cpp index ede3924056..2b923938c2 100644 --- a/src/libslic3r/CAD/GeometryEngine.cpp +++ b/src/libslic3r/CAD/GeometryEngine.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/src/libslic3r/Format/STEP.cpp b/src/libslic3r/Format/STEP.cpp index 22e39b207f..8305174e73 100644 --- a/src/libslic3r/Format/STEP.cpp +++ b/src/libslic3r/Format/STEP.cpp @@ -25,6 +25,7 @@ #include "XCAFDoc_DocumentTool.hxx" #include "XCAFDoc_ShapeTool.hxx" #include "XCAFApp_Application.hxx" +#include "TDF_LabelSequence.hxx" #include "TopoDS_Solid.hxx" #include "TopoDS_Compound.hxx" #include "TopoDS_Builder.hxx" From f3a8f711fd4e57b685470b514428c3b6ddc0e754 Mon Sep 17 00:00:00 2001 From: Kenneth Raplee <101818165+kenrap@users.noreply.github.com> Date: Mon, 28 Sep 2026 10:44:32 +0000 Subject: [PATCH 11/12] Catch Standard_Failure before std::exception (OCCT >= 8) (#15826) Co-authored-by: yw4z --- src/libslic3r/CAD/CadDocument.cpp | 4 ++-- src/slic3r/GUI/CAD/DesignPanel.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/CAD/CadDocument.cpp b/src/libslic3r/CAD/CadDocument.cpp index c20b636ae7..ea20ffd966 100644 --- a/src/libslic3r/CAD/CadDocument.cpp +++ b/src/libslic3r/CAD/CadDocument.cpp @@ -2673,10 +2673,10 @@ void CadDocument::apply_feature(TopoDS_Shape& result, bool& have_body, ridge = pipe.Shape(); have_ridge = !ridge.IsNull(); } + } catch (const Standard_Failure&) { + have_ridge = false; // OCCT failure — on OCCT >= 8 Standard_Failure derives from std::exception, so this handler must come first } catch (const std::exception&) { have_ridge = false; // fall back to the bare cylinder/bore below - } catch (const Standard_Failure&) { - have_ridge = false; // OCCT failure (not a std::exception) — must be caught here too } if (f.thread_internal) { diff --git a/src/slic3r/GUI/CAD/DesignPanel.cpp b/src/slic3r/GUI/CAD/DesignPanel.cpp index 0b4f86a618..d247ddfd26 100644 --- a/src/slic3r/GUI/CAD/DesignPanel.cpp +++ b/src/slic3r/GUI/CAD/DesignPanel.cpp @@ -4862,13 +4862,13 @@ void DesignPanel::on_import_mesh() try { shape = GeometryEngine::mesh_to_brep(mesh.its, MESH_IMPORT_TOLERANCE, MESH_IMPORT_MERGE_ANGLE_DEG, stats); - } catch (const std::exception& e) { - fail(_L("Mesh conversion failed: ") + wxString::FromUTF8(e.what())); - return; - } catch (const Standard_Failure& e) { // OCCT throws outside std::exception + } catch (const Standard_Failure& e) { // on OCCT >= 8 Standard_Failure derives from std::exception — must precede that handler fail(_L("Mesh conversion failed: ") + wxString::FromUTF8( e.GetMessageString() ? e.GetMessageString() : "OCCT error")); return; + } catch (const std::exception& e) { + fail(_L("Mesh conversion failed: ") + wxString::FromUTF8(e.what())); + return; } if (shape.IsNull()) { fail(_L("Mesh conversion produced no geometry")); return; } From 576cce2f72d2191cbbaa9ffe96ae0a4a2c588f2b Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Mon, 28 Sep 2026 18:47:41 +0800 Subject: [PATCH 12/12] test: bump elegoo profile to test OFL OTA E2E [TO BE REVERTED] (#15954) Merged by /bot merge on behalf of @peachismomo (id 52488812). Grants: resources/profiles/OrcaFilamentLibrary/filament/Elegoo, resources/profiles/OrcaFilamentLibrary.json, resources/profiles/Elegoo, resources/profiles/Elegoo.json Head: d4a18c633e31600b16b848d42799a93e96ddd67f --- resources/profiles/OrcaFilamentLibrary.json | 2 +- .../OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 3d8a191dc6..f54e45df5a 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.04.00.12", + "version": "02.04.00.13", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json index 3ba4c8c14f..624c4ed95b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Elegoo/Elegoo PLA @base.json @@ -6,7 +6,7 @@ "filament_id": "OFvgE0Zh", "instantiation": "false", "fan_cooling_layer_time": [ - "80" + "81" ], "fan_min_speed": [ "50"