From 228b50f8587708c5736524692e26ed9efef0646d Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 14 Apr 2025 22:51:58 +0800 Subject: [PATCH 01/14] Ensure bed shape is in correct orientation (SoftFever/OrcaSlicer#9345) --- src/OrcaSlicer.cpp | 2 +- src/libslic3r/BuildVolume.cpp | 1 + src/libslic3r/ClipperUtils.cpp | 10 ++++++++++ src/libslic3r/ClipperUtils.hpp | 2 ++ src/libslic3r/GCode/GCodeProcessor.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 6 +++--- src/slic3r/GUI/3DBed.cpp | 2 +- src/slic3r/GUI/BedShapeDialog.cpp | 17 +++++++++-------- src/slic3r/GUI/BedShapeDialog.hpp | 16 ++++++++-------- src/slic3r/GUI/ConfigWizard.cpp | 2 +- src/slic3r/GUI/PartPlate.cpp | 1 - src/slic3r/GUI/PartPlate.hpp | 1 - src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 2 +- src/slic3r/Utils/CalibUtils.cpp | 2 +- 15 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index 6b4954a024..dbd7282759 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -3081,7 +3081,7 @@ int CLI::run(int argc, char **argv) else { partplate_list.reset_size(old_printable_width, old_printable_depth, old_printable_height, false); } - partplate_list.set_shapes(current_printable_area, current_exclude_area, bed_texture, height_to_lid, height_to_rod); + partplate_list.set_shapes(make_counter_clockwise(current_printable_area), current_exclude_area, bed_texture, height_to_lid, height_to_rod); //plate_stride = partplate_list.plate_stride_x(); } diff --git a/src/libslic3r/BuildVolume.cpp b/src/libslic3r/BuildVolume.cpp index 147a556aa3..f73330827c 100644 --- a/src/libslic3r/BuildVolume.cpp +++ b/src/libslic3r/BuildVolume.cpp @@ -14,6 +14,7 @@ BuildVolume::BuildVolume(const std::vector &printable_area, const double assert(printable_height >= 0); m_polygon = Polygon::new_scale(printable_area); + assert(m_polygon.is_counter_clockwise()); // Calcuate various metrics of the input polygon. m_convex_hull = Geometry::convex_hull(m_polygon.points); diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index 7d893a3bf2..1918145c4c 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -1410,4 +1410,14 @@ ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vector> &deltas, double miter_limit = 2.); +Pointfs make_counter_clockwise(const Pointfs& pointfs); + } // namespace Slic3r #endif // slic3r_ClipperUtils_hpp_ diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 063785ce90..63cece2bac 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -831,7 +831,7 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) const ConfigOptionPoints* printable_area = config.option("printable_area"); if (printable_area != nullptr) - m_result.printable_area = printable_area->values; + m_result.printable_area = make_counter_clockwise(printable_area->values); //BBS: add bed_exclude_area const ConfigOptionPoints* bed_exclude_area = config.option("bed_exclude_area"); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 3e07459566..283949ba5e 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -8086,15 +8086,15 @@ Points get_bed_shape(const DynamicPrintConfig &config) return {}; } - return to_points(bed_shape_opt->values); + return to_points(make_counter_clockwise(bed_shape_opt->values)); } Points get_bed_shape(const PrintConfig &cfg) { - return to_points(cfg.printable_area.values); + return to_points(make_counter_clockwise(cfg.printable_area.values)); } -Points get_bed_shape(const SLAPrinterConfig &cfg) { return to_points(cfg.printable_area.values); } +Points get_bed_shape(const SLAPrinterConfig &cfg) { return to_points(make_counter_clockwise(cfg.printable_area.values)); } Polygon get_bed_shape_with_excluded_area(const PrintConfig& cfg) { diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 67dd8d1a83..a27f5ce05d 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -432,7 +432,7 @@ std::tuple Bed3D::detect_type(const Point while (curr != nullptr) { if (curr->config.has("printable_area")) { std::string texture_filename, model_filename; - if (shape == dynamic_cast(curr->config.option("printable_area"))->values) { + if (shape == make_counter_clockwise(dynamic_cast(curr->config.option("printable_area"))->values)) { if (curr->is_system) model_filename = PresetUtils::system_printer_bed_model(*curr); else { diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp index 2d229a3e39..67814d66be 100644 --- a/src/slic3r/GUI/BedShapeDialog.cpp +++ b/src/slic3r/GUI/BedShapeDialog.cpp @@ -20,9 +20,9 @@ namespace Slic3r { namespace GUI { -BedShape::BedShape(const ConfigOptionPoints& points) +BedShape::BedShape(const Pointfs& points) { - m_build_volume = { points.values, 0. }; + m_build_volume = { points, 0. }; } static std::string get_option_label(BedShape::Parameter param) @@ -130,7 +130,7 @@ void BedShape::apply_optgroup_values(ConfigOptionsGroupShp optgroup) } } -void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model) +void BedShapeDialog::build_dialog(const Pointfs& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model) { SetFont(wxGetApp().normal_font()); @@ -172,10 +172,10 @@ void BedShapeDialog::on_dpi_changed(const wxRect &suggested_rect) const std::string BedShapePanel::NONE = "None"; const std::string BedShapePanel::EMPTY_STRING = ""; -void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const std::string& custom_texture, const std::string& custom_model) +void BedShapePanel::build_panel(const Pointfs& default_pt, const std::string& custom_texture, const std::string& custom_model) { wxGetApp().UpdateDarkUI(this); - m_shape = default_pt.values; + m_shape = make_counter_clockwise(default_pt); m_custom_texture = custom_texture.empty() ? NONE : custom_texture; m_custom_model = custom_model.empty() ? NONE : custom_model; @@ -240,7 +240,7 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const std: SetSizerAndFit(top_sizer); - set_shape(default_pt); + set_shape(m_shape); update_preview(); } @@ -454,7 +454,7 @@ wxPanel* BedShapePanel::init_model_panel() // Deduce the bed shape type(rect, circle, custom) // This routine shall be smart enough if the user messes up // with the list of points in the ini file directly. -void BedShapePanel::set_shape(const ConfigOptionPoints& points) +void BedShapePanel::set_shape(const Pointfs& points) { BedShape shape(points); @@ -463,7 +463,7 @@ void BedShapePanel::set_shape(const ConfigOptionPoints& points) // Copy the polygon to the canvas, make a copy of the array, if custom shape is selected if (shape.is_custom()) - m_loaded_shape = points.values; + m_loaded_shape = points; update_shape(); @@ -580,6 +580,7 @@ void BedShapePanel::load_stl() } auto polygon = expolygons[0].contour; + polygon.make_counter_clockwise(); std::vector points; for (auto pt : polygon.points) points.push_back(unscale(pt)); diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp index 912faf6bfb..c42fb76b9f 100644 --- a/src/slic3r/GUI/BedShapeDialog.hpp +++ b/src/slic3r/GUI/BedShapeDialog.hpp @@ -34,7 +34,7 @@ struct BedShape Diameter }; - BedShape(const ConfigOptionPoints& points); + BedShape(const Pointfs& points); bool is_custom() { return m_build_volume.type() == BuildVolume_Type::Convex || m_build_volume.type() == BuildVolume_Type::Custom; } @@ -56,18 +56,18 @@ class BedShapePanel : public wxPanel static const std::string EMPTY_STRING; Bed_2D* m_canvas; - std::vector m_shape; - std::vector m_loaded_shape; + Pointfs m_shape; + Pointfs m_loaded_shape; std::string m_custom_texture; std::string m_custom_model; public: BedShapePanel(wxWindow* parent) : wxPanel(parent, wxID_ANY), m_custom_texture(NONE), m_custom_model(NONE) {} - void build_panel(const ConfigOptionPoints& default_pt, const std::string& custom_texture, const std::string& custom_model); + void build_panel(const Pointfs& default_pt, const std::string& custom_texture, const std::string& custom_model); // Returns the resulting bed shape polygon. This value will be stored to the ini file. - const std::vector& get_shape() const { return m_shape; } + const Pointfs& get_shape() const { return m_shape; } const std::string& get_custom_texture() const { return (m_custom_texture != NONE) ? m_custom_texture : EMPTY_STRING; } const std::string& get_custom_model() const { return (m_custom_model != NONE) ? m_custom_model : EMPTY_STRING; } @@ -76,7 +76,7 @@ private: void activate_options_page(ConfigOptionsGroupShp options_group); wxPanel* init_texture_panel(); wxPanel* init_model_panel(); - void set_shape(const ConfigOptionPoints& points); + void set_shape(const Pointfs& points); void update_preview(); void update_shape(); void load_stl(); @@ -96,9 +96,9 @@ public: BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) {} - void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model); + void build_dialog(const Pointfs& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model); - const std::vector& get_shape() const { return m_panel->get_shape(); } + const Pointfs& get_shape() const { return m_panel->get_shape(); } const std::string& get_custom_texture() const { return m_panel->get_custom_texture(); } const std::string& get_custom_model() const { return m_panel->get_custom_model(); } diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index f6c059e540..1673a6ec7f 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -1278,7 +1278,7 @@ PageBedShape::PageBedShape(ConfigWizard* parent) { append_text(_L("Set the shape of your printer's bed.")); - shape_panel->build_panel(*wizard_p()->custom_config->option("printable_area"), + shape_panel->build_panel(wizard_p()->custom_config->option("printable_area")->values, *wizard_p()->custom_config->option("bed_custom_texture"), *wizard_p()->custom_config->option("bed_custom_model")); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 88008b7f52..b265da49e9 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2656,7 +2656,6 @@ void PartPlate::generate_exclude_polygon(ExPolygon &exclude_polygon) bool PartPlate::set_shape(const Pointfs& shape, const Pointfs& exclude_areas, Vec2d position, float height_to_lid, float height_to_rod) { Pointfs new_shape, new_exclude_areas; - m_raw_shape = shape; for (const Vec2d& p : shape) { new_shape.push_back(Vec2d(p.x() + position.x(), p.y() + position.y())); } diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 6bed8c7f0f..b262f91f17 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -117,7 +117,6 @@ private: friend class PartPlateList; - Pointfs m_raw_shape; Pointfs m_shape; Pointfs m_exclude_area; BoundingBoxf3 m_bounding_box; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 9c006fc5d1..3403104378 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -13369,7 +13369,7 @@ void Plater::set_bed_shape() const //BBS: add bed exclude area void Plater::set_bed_shape(const Pointfs& shape, const Pointfs& exclude_area, const double printable_height, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom) const { - p->set_bed_shape(shape, exclude_area, printable_height, custom_texture, custom_model, force_as_custom); + p->set_bed_shape(make_counter_clockwise(shape), exclude_area, printable_height, custom_texture, custom_model, force_as_custom); } void Plater::force_filament_colors_update() diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d58d7122aa..93801a8f06 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -5941,7 +5941,7 @@ wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent) btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { bool is_configed_by_BBL = PresetUtils::system_printer_bed_model(m_preset_bundle->printers.get_edited_preset()).size() > 0; BedShapeDialog dlg(this); - dlg.build_dialog(*m_config->option("printable_area"), + dlg.build_dialog(m_config->option("printable_area")->values, *m_config->option("bed_custom_texture"), *m_config->option("bed_custom_model")); if (dlg.ShowModal() == wxID_OK) { diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 2649fa5348..2cd3581af7 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -990,7 +990,7 @@ bool CalibUtils::get_pa_k_n_value_by_cali_idx(const MachineObject *obj, int cali bool CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &full_config, const Calib_Params ¶ms, wxString &error_message) { - Pointfs bedfs = full_config.opt("printable_area")->values; + Pointfs bedfs = make_counter_clockwise(full_config.opt("printable_area")->values); double print_height = full_config.opt_float("printable_height"); double current_width = bedfs[2].x() - bedfs[0].x(); double current_depth = bedfs[2].y() - bedfs[0].y(); From bbf17e919e803d1537d80df81a84cae965c4f2d1 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Tue, 15 Apr 2025 14:05:08 +0800 Subject: [PATCH 02/14] Fix non-rectangular bed rendering offset issue --- src/slic3r/GUI/3DBed.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index a27f5ce05d..3c22880023 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -648,8 +648,10 @@ void Bed3D::update_bed_triangles() (*model_offset_ptr)(1) = m_build_volume.bounding_volume2d().min.y() - bed_ext.min.y(); (*model_offset_ptr)(2) = -0.41 + GROUND_Z; - // ORCA fix for circular bed (without 3D model) beds rendered with shifted position - Vec2d point_shift = m_build_volume.type() == BuildVolume_Type::Circle ? Vec2d(0,0) : m_bed_shape[0]; + // ORCA fix for non-rectangular bed (without 3D model) beds rendered with shifted position + // TODO: FIXME: Is this ever needed? + //Vec2d point_shift = m_build_volume.type() == BuildVolume_Type::Circle ? Vec2d(0,0) : m_bed_shape[0]; + Vec2d point_shift(0, 0); std::vector origin_bed_shape; for (size_t i = 0; i < m_bed_shape.size(); i++) { origin_bed_shape.push_back(m_bed_shape[i] - point_shift); From 2cc5b3e3354fa4b13aa2f24abe0141ef995a6462 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sat, 26 Apr 2025 12:38:13 +0800 Subject: [PATCH 03/14] Make sure exclusion area is correctly rendered even in wrong orientation --- src/slic3r/GUI/PartPlate.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index b44824111a..f08211e7c3 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2624,6 +2624,8 @@ void PartPlate::generate_exclude_polygon(ExPolygon &exclude_polygon) exclude_polygon.contour.append({ scale_(p(0)), scale_(p(1)) }); } } + + exclude_polygon.contour.make_counter_clockwise(); } bool PartPlate::set_shape(const Pointfs& shape, const Pointfs& exclude_areas, Vec2d position, float height_to_lid, float height_to_rod) From a9d426a3dcc74803d0013836ecf0ab93a973a71e Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 1 May 2025 17:09:45 +0800 Subject: [PATCH 04/14] Fix Xcode 16.3 build (#9422) * Fix build with Xcode 16.3 * Simplify OpenVDB patch, from https://github.com/AcademySoftwareFoundation/openvdb/commit/930c3acb8e0c7c2f1373f3a70dc197f5d04dfe74#diff-bc3061cc2fe6c64a3d67c8350330bb3a530d01037faace6da27ad9a12aa03e29 * Fix CGAL header under clang 19 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=281880 * Fix compile error due to removal of base template for `std::char_traits` in clang 19 https://releases.llvm.org/19.1.0/projects/libcxx/docs/ReleaseNotes.html#deprecations-and-removals --- deps/CGAL/0001-clang19.patch | 59 ++++++++++++++++++++++++++++ deps/CGAL/CGAL.cmake | 5 +++ deps/OpenCV/0002-clang19-macos.patch | 54 +++++++++++++++++++++++++ deps/OpenCV/OpenCV.cmake | 2 +- deps/OpenVDB/0001-clang19.patch | 29 ++++++++++++++ deps/OpenVDB/OpenVDB.cmake | 5 +++ deps/PNG/0002-clang19-macos.patch | 29 ++++++++++++++ deps/PNG/PNG.cmake | 4 +- src/slic3r/GUI/GUI_App.cpp | 2 +- src/slic3r/GUI/ModelMall.cpp | 2 +- src/slic3r/GUI/Project.cpp | 2 +- src/slic3r/GUI/WebDownPluginDlg.cpp | 2 +- src/slic3r/GUI/WebGuideDialog.cpp | 2 +- 13 files changed, 189 insertions(+), 8 deletions(-) create mode 100644 deps/CGAL/0001-clang19.patch create mode 100644 deps/OpenCV/0002-clang19-macos.patch create mode 100644 deps/OpenVDB/0001-clang19.patch create mode 100644 deps/PNG/0002-clang19-macos.patch diff --git a/deps/CGAL/0001-clang19.patch b/deps/CGAL/0001-clang19.patch new file mode 100644 index 0000000000..92a0293735 --- /dev/null +++ b/deps/CGAL/0001-clang19.patch @@ -0,0 +1,59 @@ +--- a/BGL/include/CGAL/boost/graph/iterator.h 2022-10-07 19:04:41 UTC ++++ b/BGL/include/CGAL/boost/graph/iterator.h +@@ -213,18 +213,7 @@ class Halfedge_around_source_iterator { (public) + {} + + #ifndef DOXYGEN_RUNNING +- // design patter: "safe bool" +- // will be replaced by explicit operator bool with C++11 +- typedef void (Halfedge_around_source_iterator::*bool_type)() const; + +- void this_type_does_not_support_comparisons() const {} +- +- operator bool_type() const +- { +- return (! (this->base() == nullptr)) ? +- &Halfedge_around_source_iterator::this_type_does_not_support_comparisons : 0; +- } +- + bool operator==( const Self& i) const { + CGAL_assertion( anchor == anchor); + return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding); +@@ -313,18 +302,7 @@ class Halfedge_around_target_iterator { (public) + {} + + #ifndef DOXYGEN_RUNNING +- // design patter: "safe bool" +- // will be replaced by explicit operator bool with C++11 +- typedef void (Halfedge_around_target_iterator::*bool_type)() const; + +- void this_type_does_not_support_comparisons() const {} +- +- operator bool_type() const +- { +- return (! (this->base() == nullptr)) ? +- &Halfedge_around_target_iterator::this_type_does_not_support_comparisons : 0; +- } +- + bool operator==( const Self& i) const { + CGAL_assertion( anchor == anchor); + return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding); +@@ -411,18 +389,6 @@ class Halfedge_around_face_iterator { (public) + const value_type& operator * ( ) const { return pos; } + pointer operator -> ( ) { return &pos; } + const value_type* operator -> ( ) const { return &pos; } +- +- // design patter: "safe bool" +- // will be replaced by explicit operator bool with C++11 +- typedef void (Halfedge_around_face_iterator::*bool_type)() const; +- +- void this_type_does_not_support_comparisons() const {} +- +- operator bool_type() const +- { +- return (! (this->base() == nullptr)) ? +- &Halfedge_around_face_iterator::this_type_does_not_support_comparisons : 0; +- } + + bool operator==( const Self& i) const { + CGAL_assertion( anchor == anchor); diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index 18fee7c15e..73eee6701b 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -1,3 +1,7 @@ +if (IN_GIT_REPO) + set(CGAL_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_CGAL-prefix/src/dep_CGAL) +endif () + orcaslicer_add_cmake_project( CGAL # GIT_REPOSITORY https://github.com/CGAL/cgal.git @@ -5,6 +9,7 @@ orcaslicer_add_cmake_project( # For whatever reason, this keeps downloading forever (repeats downloads if finished) URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 + PATCH_COMMAND git apply ${CGAL_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-clang19.patch DEPENDS dep_Boost dep_GMP dep_MPFR ) diff --git a/deps/OpenCV/0002-clang19-macos.patch b/deps/OpenCV/0002-clang19-macos.patch new file mode 100644 index 0000000000..84eb522ea3 --- /dev/null +++ b/deps/OpenCV/0002-clang19-macos.patch @@ -0,0 +1,54 @@ +From 893b8113f04d408cc6177c6de19c9889a48faa24 Mon Sep 17 00:00:00 2001 +From: Zixu Wang +Date: Thu, 18 Jan 2024 11:12:00 -0800 +Subject: [PATCH] Fix unused platform check and configuration for macOS + +In a similar manner as zlib (https://github.com/madler/zlib/pull/895), +libpng contains a header configuration that's no longer valid and +hasn't been exercised for the macOS target. + +- The target OS conditional macros are misused. Specifically + `TARGET_OS_MAC` covers all Apple targets, including iOS, and it + should not be checked with `#if defined` as they would always be + defined (to either 1 or 0) on Apple platforms. +- `#include ` no longer works for the macOS target and results + in a compilation failure. macOS ships all required functions in + `math.h`, and clients should use `math.h` instead. + +This problem has not been noticed until a recent extension in clang +(https://github.com/llvm/llvm-project/pull/74676) exposed the issue +and broke libpng builds on Apple platforms. The failure can be +reproduced now by adding `#include ` before the +block. + +Signed-off-by: Cosmin Truta +--- + AUTHORS | 2 ++ + pngpriv.h | 14 ++------------ + 2 files changed, 4 insertions(+), 12 deletions(-) + +diff --git a/3rdparty/libpng/pngpriv.h b/3rdparty/libpng/pngpriv.h +index 6c7280cf53..190eb85cbf 100644 +--- a/3rdparty/libpng/pngpriv.h ++++ b/3rdparty/libpng/pngpriv.h +@@ -556,18 +556,8 @@ + */ + # include + +-# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ +- defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +- /* We need to check that hasn't already been included earlier +- * as it seems it doesn't agree with , yet we should really use +- * if possible. +- */ +-# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +-# include +-# endif +-# else +-# include +-# endif ++# include ++ + # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 diff --git a/deps/OpenCV/OpenCV.cmake b/deps/OpenCV/OpenCV.cmake index 23cbafa2a6..3794094fcf 100644 --- a/deps/OpenCV/OpenCV.cmake +++ b/deps/OpenCV/OpenCV.cmake @@ -11,7 +11,7 @@ endif () orcaslicer_add_cmake_project(OpenCV URL https://github.com/opencv/opencv/archive/refs/tags/4.6.0.tar.gz URL_HASH SHA256=1ec1cba65f9f20fe5a41fda1586e01c70ea0c9a6d7b67c9e13edf0cfe2239277 - PATCH_COMMAND git apply ${OpenCV_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-vs2022.patch + PATCH_COMMAND git apply ${OpenCV_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-vs2022.patch ${CMAKE_CURRENT_LIST_DIR}/0002-clang19-macos.patch CMAKE_ARGS -DBUILD_SHARED_LIBS=0 -DBUILD_PERE_TESTS=OFF diff --git a/deps/OpenVDB/0001-clang19.patch b/deps/OpenVDB/0001-clang19.patch new file mode 100644 index 0000000000..f9843ba267 --- /dev/null +++ b/deps/OpenVDB/0001-clang19.patch @@ -0,0 +1,29 @@ +--- a/openvdb/openvdb/tree/NodeManager.h 2023-11-01 20:31:11 UTC ++++ b/openvdb/openvdb/tree/NodeManager.h +@@ -327,7 +327,7 @@ class NodeList (private) + void operator()(const NodeRange& range) const + { + for (typename NodeRange::Iterator it = range.begin(); it; ++it) { +- OpT::template eval(mNodeOp, it); ++ OpT::eval(mNodeOp, it); + } + } + const NodeOp mNodeOp; +@@ -347,7 +347,7 @@ class NodeList (private) + void operator()(const NodeRange& range) const + { + for (typename NodeRange::Iterator it = range.begin(); it; ++it) { +- OpT::template eval(mNodeOp, it); ++ OpT::eval(mNodeOp, it); + } + } + const NodeOp& mNodeOp; +@@ -372,7 +372,7 @@ class NodeList (private) + void operator()(const NodeRange& range) + { + for (typename NodeRange::Iterator it = range.begin(); it; ++it) { +- OpT::template eval(*mNodeOp, it); ++ OpT::eval(*mNodeOp, it); + } + } + void join(const NodeReducer& other) diff --git a/deps/OpenVDB/OpenVDB.cmake b/deps/OpenVDB/OpenVDB.cmake index 7080b8b5d5..df6ad9c913 100644 --- a/deps/OpenVDB/OpenVDB.cmake +++ b/deps/OpenVDB/OpenVDB.cmake @@ -6,10 +6,15 @@ else() set(_build_static ON) endif() +if (IN_GIT_REPO) + set(OPENVDB_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_OpenVDB-prefix/src/dep_OpenVDB) +endif () + orcaslicer_add_cmake_project(OpenVDB # support vs2022, update to 8.2 URL https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip URL_HASH SHA256=f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81 + PATCH_COMMAND git apply ${OPENVDB_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-clang19.patch DEPENDS dep_TBB dep_Blosc dep_OpenEXR dep_Boost CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON diff --git a/deps/PNG/0002-clang19-macos.patch b/deps/PNG/0002-clang19-macos.patch new file mode 100644 index 0000000000..69fd888a81 --- /dev/null +++ b/deps/PNG/0002-clang19-macos.patch @@ -0,0 +1,29 @@ +--- a/pngpriv.h 2025-04-20 19:36:04.000000000 ++++ b/pngpriv.h 2025-04-20 19:35:55.000000000 +@@ -511,24 +511,14 @@ + * DBL_DIG Maximum number of decimal digits (can be set to any constant) + * DBL_MIN Smallest normalized fp number (can be set to an arbitrary value) + * DBL_MAX Maximum floating point number (can be set to an arbitrary value) + */ + # include + +-# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ +- defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +- /* We need to check that hasn't already been included earlier +- * as it seems it doesn't agree with , yet we should really use +- * if possible. +- */ +-# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +-# include +-# endif +-# else +-# include +-# endif ++# include ++ + # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 + */ + # include + # endif diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake index 313a147bab..332fdfe274 100644 --- a/deps/PNG/PNG.cmake +++ b/deps/PNG/PNG.cmake @@ -12,7 +12,7 @@ if(APPLE AND IS_CROSS_COMPILE) GIT_TAG v1.6.35 DEPENDS ${ZLIB_PKG} PATCH_COMMAND ${GIT_EXECUTABLE} checkout -f -- . && git clean -df && - ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/macos-arm64.patch + ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/macos-arm64.patch ${CMAKE_CURRENT_LIST_DIR}/0002-clang19-macos.patch CMAKE_ARGS -DPNG_SHARED=OFF -DPNG_STATIC=ON @@ -24,7 +24,7 @@ if(APPLE AND IS_CROSS_COMPILE) else () set(_patch_step "") if (APPLE) - set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch) + set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch ${CMAKE_CURRENT_LIST_DIR}/0002-clang19-macos.patch) endif () orcaslicer_add_cmake_project(PNG # GIT_REPOSITORY https://github.com/glennrp/libpng.git diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index dbbf21ad2d..9c2d46512d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4053,7 +4053,7 @@ void GUI_App::on_http_error(wxCommandEvent &evt) try { auto evt_str = evt.GetString(); if (!evt_str.empty()) { - json j = json::parse(evt_str); + json j = json::parse(evt_str.utf8_string()); if (j.contains("code")) { if (!j["code"].is_null()) code = j["code"].get(); diff --git a/src/slic3r/GUI/ModelMall.cpp b/src/slic3r/GUI/ModelMall.cpp index 45833ba80c..f5a6b6d4af 100644 --- a/src/slic3r/GUI/ModelMall.cpp +++ b/src/slic3r/GUI/ModelMall.cpp @@ -124,7 +124,7 @@ namespace GUI { { try { wxString strInput = evt.GetString(); - json j = json::parse(strInput); + json j = json::parse(strInput.utf8_string()); wxString strCmd = j["command"]; diff --git a/src/slic3r/GUI/Project.cpp b/src/slic3r/GUI/Project.cpp index e69ba143db..8e06180f4c 100644 --- a/src/slic3r/GUI/Project.cpp +++ b/src/slic3r/GUI/Project.cpp @@ -237,7 +237,7 @@ void ProjectPanel::OnScriptMessage(wxWebViewEvent& evt) { try { wxString strInput = evt.GetString(); - json j = json::parse(strInput); + json j = json::parse(strInput.utf8_string()); wxString strCmd = j["command"]; diff --git a/src/slic3r/GUI/WebDownPluginDlg.cpp b/src/slic3r/GUI/WebDownPluginDlg.cpp index a4f3cc93ce..aa61b07683 100644 --- a/src/slic3r/GUI/WebDownPluginDlg.cpp +++ b/src/slic3r/GUI/WebDownPluginDlg.cpp @@ -199,7 +199,7 @@ void DownPluginFrame::OnScriptMessage(wxWebViewEvent &evt) { try { wxString strInput = evt.GetString(); - json j = json::parse(strInput); + json j = json::parse(strInput.utf8_string()); wxString strCmd = j["command"]; diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index c4df177a53..95994e999b 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -373,7 +373,7 @@ void GuideFrame::OnScriptMessage(wxWebViewEvent &evt) try { wxString strInput = evt.GetString(); BOOST_LOG_TRIVIAL(trace) << "GuideFrame::OnScriptMessage;OnRecv:" << strInput.c_str(); - json j = json::parse(strInput); + json j = json::parse(strInput.utf8_string()); wxString strCmd = j["command"]; BOOST_LOG_TRIVIAL(trace) << "GuideFrame::OnScriptMessage;Command:" << strCmd; From 8c4b7456c1e835b9be8c0a08086a25ca37fb2628 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 1 May 2025 17:12:03 +0800 Subject: [PATCH 05/14] Fix vendor/model selector on create printer dialog (#9344) * Make sure printer vendor matches * Handle cases where some vendor do not have printers (such as `OrcaFilamentLibrary`) * Ignore vendor `custom printer` from create printer vendor list * Fix missing end bracket * Update printer vendor and model list on create printer dialog --- scripts/generate_presets_vendors.py | 6 +- src/slic3r/GUI/CreatePresetsDialog.cpp | 136 ++++++++++++++++--------- 2 files changed, 93 insertions(+), 49 deletions(-) diff --git a/scripts/generate_presets_vendors.py b/scripts/generate_presets_vendors.py index 0105ea236e..294ee10b77 100644 --- a/scripts/generate_presets_vendors.py +++ b/scripts/generate_presets_vendors.py @@ -18,8 +18,10 @@ for entry in profiles_dir.glob('*.json'): if entry.is_file(): entry_info = json.loads(entry.read_text()) vendor_name = entry_info.get('name', None) - if vendor_name: + if vendor_name and vendor_name != 'Custom Printer': models = [machine.get('name', None) for machine in entry_info.get('machine_model_list', []) if machine.get('name', None)] + if not models: + continue printers[vendor_name] = models vendor_names = [f'"{vendor_name}",' for vendor_name in sorted(printers.keys(), key=str.casefold)] @@ -43,7 +45,7 @@ for vendor_name in sorted(printers.keys(), key=str.casefold): models_formatted += '},\n ' -models_formatted = models_formatted.rstrip()[:-1] +models_formatted = models_formatted.rstrip()[:-1] + '}' print(models_formatted) diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index bd7090837c..7f2fa2c78f 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -67,55 +67,96 @@ static const std::vector filament_types = {"PLA", "rPLA", "PLA+ static const std::vector printer_vendors = {"Anker", "Anycubic", "Artillery", "Bambulab", "BIQU", - "Comgrow", "Creality", "Custom Printer", "Elegoo", "Flashforge", - "FLSun", "FlyingBear", "Folgertech", "InfiMech", "Kingroon", - "Orca Arena Printer", "Peopoly", "Prusa", "Qidi", "Raise3D", - "RatRig", "SecKit", "Snapmaker", "Sovol", "Tronxy", - "TwoTrees", "UltiMaker", "Vivedino", "Voron", "Voxelab", - "Vzbot", "Wanhao"}; + "Blocks", "Chuanying", "Co Print", "Comgrow", "CONSTRUCT3D", + "Creality", "DeltaMaker", "Dremel", "Elegoo", "Flashforge", + "FLSun", "FlyingBear", "Folgertech", "Geeetech", "Ginger Additive", + "InfiMech", "Kingroon", "Lulzbot", "MagicMaker", "Mellow", + "Orca Arena Printer", "Peopoly", "Positron 3D", "Prusa", "Qidi", + "Raise3D", "RatRig", "RolohaunDesign", "SecKit", "Snapmaker", + "Sovol", "Thinker X400", "Tronxy", "TwoTrees", "UltiMaker", + "Vivedino", "Volumic", "Voron", "Voxelab", "Vzbot", + "Wanhao", "Z-Bolt"}; static const std::unordered_map> printer_model_map = - {{"Anker", {"Anker M5", "Anker M5 All-Metal Hot End", "Anker M5C"}}, - {"Anycubic", {"Kossel Linear Plus", "Kossel Pulley(Linear)", "Mega Zero", "i3 Mega", "Predator"}}, - {"Artillery", {"sidewinder X1", "Genius", "Hornet"}}, - {"BIBO", {"BIBO2 Touch"}}, - {"BIQU", {"BX"}}, - {"Creality ENDER", {"Ender-3", "Ender-3 BLTouch", "Ender-3 Pro", "Ender-3 Neo", - "Ender-3 V2 Neo", "Ender-3 S1 Plus", "Ender-3 Max", "Ender-3 Max Neo", - "Ender-4", "Ender-5 Pro", "Ender-5 Pro", - "Ender-7", "Ender-2", "Ender-2 Pro"}}, - {"Creality CR", {"CR-5 Pro", "CR-5 Pro H", "CR-10 SMART", "CR-10 SMART Pro", "CR-10 Mini", - "CR-10", "CR-10 v3", "CR-10 S", "CR-10 v2", "CR-10 v2", - "CR-10 S Pro", "CR-10 S Pro v2", "CR-10 S4", "CR-10 S5", "CR-20", "CR-20 Pro", "CR-200B", - "CR-8"}}, - {"Creality SERMOON",{"Sermoon-D1", "Sermoon-V1", "Sermoon-V1 Pro"}}, - {"FLSun", {"FLSun QQs Pro", "FLSun Q5"}}, - {"gCreate", {"gMax 1.5XT Plus", "gMax 2", "gMax 2 Pro", "gMax 2 Dual 2in1", "gMax 2 Dual Chimera"}}, - {"Geeetech", {"Thunder", "Thunder Pro", "Mizar s", "Mizar Pro", "Mizar", "Mizar Max", - "Mizar M", "A10 Pro", "A10 M", "A10 T", "A20", "A20 M", - "A20T", "A30 Pro", "A30 M", "A30 T", "E180", "Me Ducer", - "Me creator", "Me Creator2", "GiantArmD200", "l3 ProB", "l3 Prow", "l3 ProC"}}, - {"INAT", {"Proton X Rail", "Proton x Rod", "Proton XE-750"}}, - {"Infinity3D", {"DEV-200", "DEV-350"}}, - {"Jubilee", {"Jubilee"}}, - {"LNL3D", {"D3 v2", "D3 Vulcan", "D5", "D6"}}, - {"LulzBot", {"Mini Aero", "Taz6 Aero"}}, - {"MakerGear", {"Micro", "M2(V4 Hotend)", "M2 Dual", "M3-single Extruder", "M3-Independent Dual Rev.0", "M3-Independent Dual Rev.0(Duplication Mode)", - "M3-Independent Dual Rev.1", "M3-Independent Dual Rev.1(Duplication Mode)", "ultra One", "Ultra One (DuplicationMode)"}}, - {"Original Prusa", {"MK4", "SL1S SPEED", "MMU3"}}, - {"Papapiu", {"N1s"}}, - {"Print4Taste", {"mycusini 2.0"}}, - {"RatRig", {"V-core-3 300mm", "V-Core-3 400mm", "V-Core-3 500mm", "V-Minion"}}, - {"Rigid3D", {"Zero2", "Zero3"}}, - {"Snapmaker", {"A250", "A350"}}, - {"Sovol", {"SV06", "SV06 PLUS", "SV05", "SV04", "SV03 / SV03 BLTOUCH", "SVO2 / SV02 BLTOUCH", "SVO1 / SV01 BLToUCH", "SV01 PRO"}}, - {"TriLAB", {"AzteQ Industrial","AzteQ Dynamic", "DeltiQ 2", "DeltiQ 2 Plus", "DeltiQ 2 + FlexPrint 2", "DeltiQ 2 Plus + FlexPrint 2", "DeltiQ 2 +FlexPrint", - "DeltiQ 2 Plus + FlexPrint", "DeltiQ M", "DeltiQ L", "DeltiQ XL"}}, - {"Trimaker", {"Nebula cloud", "Nebula", "Cosmos ll"}}, - {"Ultimaker", {"Ultimaker 2"}}, - {"Voron", {"v2 250mm3", "v2 300mm3", "v2 350mm3", "v1 250mm3", "v1 300mm3", "v1 350mm3", - "Zero 120mm3", "Switchwire"}}, - {"Zonestar", {"Z5", "Z6", "Z5x", "Z8", "Z9"}}}; + {{"Anker", {"Anker M5", "Anker M5 All-Metal Hot End", "Anker M5C"}}, + {"Anycubic", {"Anycubic i3 Mega S", "Anycubic Chiron", "Anycubic Vyper", "Anycubic Kobra", "Anycubic Kobra Max", + "Anycubic Kobra Plus", "Anycubic 4Max Pro", "Anycubic 4Max Pro 2", "Anycubic Kobra 2", "Anycubic Kobra 2 Plus", + "Anycubic Kobra 2 Max", "Anycubic Kobra 2 Pro", "Anycubic Kobra 2 Neo", "Anycubic Kobra 3", "Anycubic Kobra S1"}}, + {"Artillery", {"Artillery Sidewinder X1", "Artillery Genius", "Artillery Genius Pro", "Artillery Sidewinder X2", "Artillery Hornet", + "Artillery Sidewinder X3 Pro", "Artillery Sidewinder X3 Plus", "Artillery Sidewinder X4 Pro", "Artillery Sidewinder X4 Plus"}}, + {"Bambulab", {"Bambu Lab X1 Carbon", "Bambu Lab X1", "Bambu Lab X1E", "Bambu Lab P1P", "Bambu Lab P1S", + "Bambu Lab A1 mini", "Bambu Lab A1"}}, + {"BIQU", {"BIQU B1", "BIQU BX", "BIQU Hurakan"}}, + {"Blocks", {"BLOCKS Pro S100", "BLOCKS RD50 V2", "BLOCKS RF50"}}, + {"Chuanying", {"Chuanying X1"}}, + {"Co Print", {"Co Print ChromaSet"}}, + {"Comgrow", {"Comgrow T300", "Comgrow T500"}}, + {"CONSTRUCT3D", {"Construct 1 XL", "Construct 1"}}, + {"Creality", {"Creality CR-10 V2", "Creality CR-10 Max", "Creality CR-10 SE", "Creality CR-6 SE", "Creality CR-6 Max", + "Creality CR-M4", "Creality Ender-3 V2", "Creality Ender-3 V2 Neo", "Creality Ender-3 S1", "Creality Ender-3", + "Creality Ender-3 Pro", "Creality Ender-3 S1 Pro", "Creality Ender-3 S1 Plus", "Creality Ender-3 V3 SE", "Creality Ender-3 V3 KE", + "Creality Ender-3 V3", "Creality Ender-3 V3 Plus", "Creality Ender-5", "Creality Ender-5 Max", "Creality Ender-5 Plus", + "Creality Ender-5 Pro (2019)", "Creality Ender-5S", "Creality Ender-5 S1", "Creality Ender-6", "Creality Sermoon V1", + "Creality K1", "Creality K1C", "Creality K1 Max", "Creality K1 SE", "Creality K2 Plus", + "Creality Hi"}}, + {"DeltaMaker", {"DeltaMaker 2", "DeltaMaker 2T", "DeltaMaker 2XT"}}, + {"Dremel", {"Dremel 3D20", "Dremel 3D40", "Dremel 3D45"}}, + {"Elegoo", {"Elegoo Centauri Carbon", "Elegoo Centauri", "Elegoo Neptune", "Elegoo Neptune X", "Elegoo Neptune 2", + "Elegoo Neptune 2S", "Elegoo Neptune 2D", "Elegoo Neptune 3", "Elegoo Neptune 3 Pro", "Elegoo Neptune 3 Plus", + "Elegoo Neptune 3 Max", "Elegoo Neptune 4 Pro", "Elegoo Neptune 4", "Elegoo Neptune 4 Max", "Elegoo Neptune 4 Plus", + "Elegoo OrangeStorm Giga"}}, + {"Flashforge", {"Flashforge Adventurer 5M", "Flashforge Adventurer 5M Pro", "Flashforge AD5X", "Flashforge Adventurer 3 Series", "Flashforge Adventurer 4 Series", + "Flashforge Guider 3 Ultra", "Flashforge Guider 2s"}}, + {"FLSun", {"FLSun Q5", "FLSun QQ-S Pro", "FLSun Super Racer (SR)", "FLSun V400", "FLSun T1", + "FLSun S1"}}, + {"FlyingBear", {"FlyingBear Reborn3", "FlyingBear S1", "FlyingBear Ghost 6"}}, + {"Folgertech", {"Folgertech i3", "Folgertech FT-5", "Folgertech FT-6"}}, + {"Geeetech", {"Geeetech Thunder", "Geeetech Mizar M", "Geeetech Mizar S", "Geeetech Mizar Pro", "Geeetech Mizar Max", + "Geeetech Mizar", "Geeetech A10 Pro", "Geeetech A10 M", "Geeetech A10 T", "Geeetech A20", + "Geeetech A20 M", "Geeetech A20 T", "Geeetech A30 Pro", "Geeetech A30 M", "Geeetech A30 T", + "Geeetech M1"}}, + {"Ginger Additive", {"ginger G1"}}, + {"InfiMech", {"InfiMech TX", "InfiMech TX Hardened Steel Nozzle"}}, + {"Kingroon", {"Kingroon KP3S PRO S1", "Kingroon KP3S PRO V2", "Kingroon KP3S 3.0", "Kingroon KP3S V1", "Kingroon KLP1"}}, + {"Lulzbot", {"Lulzbot Taz 6", "Lulzbot Taz 4 or 5", "Lulzbot Taz Pro Dual", "Lulzbot Taz Pro S"}}, + {"MagicMaker", {"MM hqs hj", "MM hqs SF", "MM hj SK", "MM BoneKing", "MM slb"}}, + {"Mellow", {"M1"}}, + {"Orca Arena Printer",{"Orca Arena X1 Carbon"}}, + {"Peopoly", {"Peopoly Magneto X"}}, + {"Positron 3D", {"The Positron"}}, + {"Prusa", {"MK4IS", "MINIIS", "MK3S", "MINI", "MK3.5", + "Prusa XL", "Prusa XL 5T", "MK4S", "MK4S HF"}}, + {"Qidi", {"Qidi X-Plus 4", "Qidi Q1 Pro", "Qidi X-Max 3", "Qidi X-Plus 3", "Qidi X-Smart 3", + "Qidi X-Plus", "Qidi X-Max", "Qidi X-CF Pro"}}, + {"Raise3D", {"Raise3D Pro3", "Raise3D Pro3 Plus"}}, + {"RatRig", {"RatRig V-Core 3 200", "RatRig V-Core 3 300", "RatRig V-Core 3 400", "RatRig V-Core 3 500", "RatRig V-Minion", + "RatRig V-Cast", "RatRig V-Core 4 300", "RatRig V-Core 4 400", "RatRig V-Core 4 500", "RatRig V-Core 4 HYBRID 300", + "RatRig V-Core 4 HYBRID 400", "RatRig V-Core 4 HYBRID 500", "RatRig V-Core 4 IDEX 300", "RatRig V-Core 4 IDEX 300 COPY MODE", "RatRig V-Core 4 IDEX 300 MIRROR MODE", + "RatRig V-Core 4 IDEX 400", "RatRig V-Core 4 IDEX 400 COPY MODE", "RatRig V-Core 4 IDEX 400 MIRROR MODE", "RatRig V-Core 4 IDEX 500", "RatRig V-Core 4 IDEX 500 COPY MODE", + "RatRig V-Core 4 IDEX 500 MIRROR MODE"}}, + {"RolohaunDesign", {"Rook MK1 LDO"}}, + {"SecKit", {"SecKit SK-Tank", "Seckit Go3"}}, + {"Snapmaker", {"Snapmaker J1", "Snapmaker A250", "Snapmaker A350", "Snapmaker A250 Dual", "Snapmaker A350 Dual", + "Snapmaker A250 QSKit", "Snapmaker A350 QSKit", "Snapmaker A250 BKit", "Snapmaker A350 BKit", "Snapmaker A250 QS+B Kit", + "Snapmaker A350 QS+B Kit", "Snapmaker A250 Dual QSKit", "Snapmaker A350 Dual QSKit", "Snapmaker A250 Dual BKit", "Snapmaker A350 Dual BKit", + "Snapmaker A250 Dual QS+B Kit", "Snapmaker A350 Dual QS+B Kit", "Snapmaker Artisan"}}, + {"Sovol", {"Sovol SV01 Pro", "Sovol SV02", "Sovol SV05", "Sovol SV06", "Sovol SV06 Plus", + "Sovol SV06 ACE", "Sovol SV06 Plus ACE", "Sovol SV07", "Sovol SV07 Plus", "Sovol SV08"}}, + {"Thinker X400", {"Thinker X400"}}, + {"Tronxy", {"Tronxy X5SA 400 Marlin Firmware"}}, + {"TwoTrees", {"TwoTrees SP-5 Klipper", "TwoTrees SK1"}}, + {"UltiMaker", {"UltiMaker 2"}}, + {"Vivedino", {"Troodon 2.0 - RRF", "Troodon 2.0 - Klipper"}}, + {"Volumic", {"EXO42 Performance", "EXO65 Performance", "SH65 Performance", "EXO42", "EXO65", + "SH65", "VS30SC2", "VS30SC", "VS30ULTRA", "VS30MK3", + "VS30MK2", "VS20MK2"}}, + {"Voron", {"Voron 2.4 250", "Voron 2.4 300", "Voron 2.4 350", "Voron Trident 250", "Voron Trident 300", + "Voron Trident 350", "Voron 0.1", "Voron Switchwire 250"}}, + {"Voxelab", {"Voxelab Aquila X2"}}, + {"Vzbot", {"Vzbot 235 AWD", "Vzbot 330 AWD"}}, + {"Wanhao", {"Wanhao D12-300"}}, + {"Z-Bolt", {"Z-Bolt S300", "Z-Bolt S300 Dual", "Z-Bolt S400", "Z-Bolt S400 Dual", "Z-Bolt S600", + "Z-Bolt S600 Dual"}}}; static std::vector nozzle_diameter_vec = {"0.4", "0.15", "0.2", "0.25", "0.3", "0.35", "0.5", "0.6", "0.75", "0.8", "1.0", "1.2"}; static std::unordered_map nozzle_diameter_map = {{"0.15", 0.15}, {"0.2", 0.2}, {"0.25", 0.25}, {"0.3", 0.3}, @@ -1704,6 +1745,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_item(wxWindow *parent) m_select_vendor->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR); wxArrayString printer_vendor; for (const std::string &vendor : printer_vendors) { + assert(printer_model_map.find(vendor) != printer_model_map.end()); printer_vendor.Add(vendor); } m_select_vendor->Set(printer_vendor); From 2304e6a9cd70135d3afda87bfdbe15fa6e6e3b70 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Fri, 2 May 2025 12:02:37 -0400 Subject: [PATCH 06/14] Prusa CORE One Profiles (#9352) * update profiles from https://github.com/bwees/orca_coreone/commit/3b3aa19543626f4c77e2782d9707b20d7a28a96c * capitalize SPEED * Capitalize SPEED * sync with https://github.com/bwees/orca_coreone/commit/cac592a4628478896f91d9b43708e005c1de6c4f#diff-b2ec55404a83d29c6c998171282a456702f47a98bade1a24aa583ea65c4314e0 * sync with https://github.com/bwees/orca_coreone/commit/1d5331b7d92e228f1d71b427dec727cc6d880678 there was an issue with the filament start gcode conversion that appears to make the gcode invalid * tweak Prusa CORE One --------- Co-authored-by: Noisyfox Co-authored-by: SoftFever --- resources/profiles/Prusa.json | 571 +++++++++++++++++- .../Prusa/Prusa CORE One HF_cover.png | Bin 0 -> 51735 bytes .../profiles/Prusa/Prusa CORE One_cover.png | Bin 0 -> 51735 bytes resources/profiles/Prusa/coreone.svg | 457 ++++++++++++++ resources/profiles/Prusa/coreone_bed.stl | Bin 0 -> 119984 bytes .../Prusa Generic ABS @CORE One 0.6.json | 12 + .../Prusa Generic ABS @CORE One 0.8.json | 15 + .../Prusa Generic ABS @CORE One HF 0.4.json | 18 + .../Prusa Generic ABS @CORE One HF 0.5.json | 18 + .../Prusa Generic ABS @CORE One HF 0.6.json | 18 + .../Prusa Generic ABS @CORE One HF 0.8.json | 24 + .../filament/Prusa Generic ABS @CORE One.json | 93 +++ .../Prusa Generic ASA @CORE One 0.6.json | 18 + .../Prusa Generic ASA @CORE One 0.8.json | 21 + .../Prusa Generic ASA @CORE One HF 0.4.json | 24 + .../Prusa Generic ASA @CORE One HF 0.5.json | 24 + .../Prusa Generic ASA @CORE One HF 0.6.json | 27 + .../Prusa Generic ASA @CORE One HF 0.8.json | 33 + .../filament/Prusa Generic ASA @CORE One.json | 93 +++ .../Prusa Generic PETG @CORE One 0.6.json | 21 + .../Prusa Generic PETG @CORE One 0.8.json | 39 ++ .../Prusa Generic PETG @CORE One HF 0.4.json | 24 + .../Prusa Generic PETG @CORE One HF 0.5.json | 27 + .../Prusa Generic PETG @CORE One HF 0.6.json | 24 + .../Prusa Generic PETG @CORE One HF 0.8.json | 42 ++ .../Prusa Generic PETG @CORE One.json | 111 ++++ .../Prusa Generic PLA @CORE One 0.6.json | 18 + .../Prusa Generic PLA @CORE One 0.8.json | 21 + .../Prusa Generic PLA @CORE One HF 0.4.json | 21 + .../Prusa Generic PLA @CORE One HF 0.5.json | 24 + .../Prusa Generic PLA @CORE One HF 0.6.json | 27 + .../Prusa Generic PLA @CORE One HF 0.8.json | 27 + .../filament/Prusa Generic PLA @CORE One.json | 102 ++++ .../Prusa Generic PLA Silk @CORE One 0.6.json | 22 + .../Prusa Generic PLA Silk @CORE One 0.8.json | 19 + .../Prusa Generic PLA Silk @CORE One.json | 104 ++++ .../Prusa Generic TPU @CORE One 0.6.json | 19 + .../Prusa Generic TPU @CORE One 0.8.json | 19 + .../filament/Prusa Generic TPU @CORE One.json | 113 ++++ .../filament/Prusament ASA @CORE One 0.6.json | 18 + .../filament/Prusament ASA @CORE One 0.8.json | 21 + .../Prusament ASA @CORE One HF 0.4.json | 24 + .../Prusament ASA @CORE One HF 0.5.json | 24 + .../Prusament ASA @CORE One HF 0.6.json | 27 + .../Prusament ASA @CORE One HF 0.8.json | 33 + .../filament/Prusament ASA @CORE One.json | 93 +++ .../Prusament PA-CF @CORE One 0.6.json | 19 + .../Prusament PA-CF @CORE One 0.8.json | 19 + .../filament/Prusament PA-CF @CORE One.json | 98 +++ .../Prusament PC Blend @CORE One 0.6.json | 15 + .../Prusament PC Blend @CORE One 0.8.json | 24 + .../Prusament PC Blend @CORE One HF 0.4.json | 15 + .../Prusament PC Blend @CORE One HF 0.5.json | 15 + .../Prusament PC Blend @CORE One HF 0.6.json | 15 + .../Prusament PC Blend @CORE One HF 0.8.json | 24 + .../Prusament PC Blend @CORE One.json | 96 +++ .../Prusament PC-CF @CORE One 0.6.json | 22 + .../Prusament PC-CF @CORE One 0.8.json | 22 + .../filament/Prusament PC-CF @CORE One.json | 98 +++ .../Prusament PETG @CORE One 0.6.json | 24 + .../Prusament PETG @CORE One 0.8.json | 33 + .../Prusament PETG @CORE One HF 0.4.json | 18 + .../Prusament PETG @CORE One HF 0.5.json | 21 + .../Prusament PETG @CORE One HF 0.6.json | 24 + .../Prusament PETG @CORE One HF 0.8.json | 42 ++ .../filament/Prusament PETG @CORE One.json | 111 ++++ .../filament/Prusament PLA @CORE One 0.6.json | 21 + .../filament/Prusament PLA @CORE One 0.8.json | 18 + .../Prusament PLA @CORE One HF 0.4.json | 21 + .../Prusament PLA @CORE One HF 0.5.json | 24 + .../Prusament PLA @CORE One HF 0.6.json | 27 + .../Prusament PLA @CORE One HF 0.8.json | 27 + .../filament/Prusament PLA @CORE One.json | 102 ++++ .../filament/Prusament PVB @CORE One 0.6.json | 22 + .../filament/Prusament PVB @CORE One 0.8.json | 28 + .../filament/Prusament PVB @CORE One.json | 104 ++++ .../Prusament rPLA @CORE One 0.6.json | 19 + .../Prusament rPLA @CORE One 0.8.json | 19 + .../filament/Prusament rPLA @CORE One.json | 104 ++++ .../machine/Prusa CORE One 0.25 nozzle.json | 26 + .../machine/Prusa CORE One 0.3 nozzle.json | 26 + .../machine/Prusa CORE One 0.4 nozzle.json | 15 + .../machine/Prusa CORE One 0.5 nozzle.json | 15 + .../machine/Prusa CORE One 0.6 nozzle.json | 15 + .../machine/Prusa CORE One 0.8 nozzle.json | 15 + .../machine/Prusa CORE One HF 0.4 nozzle.json | 131 ++++ .../machine/Prusa CORE One HF 0.5 nozzle.json | 19 + .../machine/Prusa CORE One HF 0.6 nozzle.json | 19 + .../machine/Prusa CORE One HF 0.8 nozzle.json | 22 + .../Prusa/machine/Prusa CORE One HF.json | 12 + .../Prusa/machine/Prusa CORE One.json | 12 + .../process/0.05mm DETAIL @CORE One 0.25.json | 14 + .../process/0.07mm DETAIL @CORE One 0.25.json | 14 + .../0.10mm FAST DETAIL @CORE One 0.4.json | 17 + .../0.10mm STRUCTURAL @CORE One 0.5.json | 17 + .../process/0.12mm SPEED @CORE One 0.25.json | 14 + .../0.12mm STRUCTURAL @CORE One 0.25.json | 14 + .../0.12mm STRUCTURAL @CORE One 0.3.json | 16 + .../process/0.15mm SPEED @CORE One 0.25.json | 14 + .../process/0.15mm SPEED @CORE One 0.4.json | 20 + .../0.15mm SPEED @CORE One HF 0.4.json | 22 + .../0.15mm STRUCTURAL @CORE One 0.25.json | 14 + .../0.15mm STRUCTURAL @CORE One 0.4.json | 21 + .../0.15mm STRUCTURAL @CORE One 0.5.json | 20 + .../0.15mm STRUCTURAL @CORE One 0.6.json | 22 + .../process/0.16mm SPEED @CORE One 0.3.json | 17 + .../0.16mm STRUCTURAL @CORE One 0.3.json | 16 + .../0.20mm SOLUBLE FULL @CORE One 0.4.json | 15 + ....20mm SOLUBLE INTERFACE @CORE One 0.4.json | 15 + .../process/0.20mm SPEED @CORE One 0.3.json | 17 + .../process/0.20mm SPEED @CORE One 0.4.json | 20 + .../process/0.20mm SPEED @CORE One 0.5.json | 20 + .../process/0.20mm SPEED @CORE One 0.6.json | 21 + .../0.20mm SPEED @CORE One HF 0.4.json | 22 + .../0.20mm SPEED @CORE One HF 0.5.json | 20 + .../0.20mm SPEED @CORE One HF 0.6.json | 21 + .../0.20mm STRUCTURAL @CORE One 0.3.json | 16 + .../0.20mm STRUCTURAL @CORE One 0.4.json | 20 + .../0.20mm STRUCTURAL @CORE One 0.5.json | 20 + .../0.20mm STRUCTURAL @CORE One 0.6.json | 20 + .../process/0.25mm SPEED @CORE One 0.5.json | 20 + .../process/0.25mm SPEED @CORE One 0.6.json | 21 + .../0.25mm SPEED @CORE One HF 0.4.json | 22 + .../0.25mm SPEED @CORE One HF 0.5.json | 20 + .../0.25mm SPEED @CORE One HF 0.6.json | 21 + .../0.25mm STRUCTURAL @CORE One 0.5.json | 20 + .../0.25mm STRUCTURAL @CORE One 0.6.json | 20 + .../0.25mm STRUCTURAL @CORE One HF 0.4.json | 20 + .../0.28mm DRAFT @CORE One HF 0.4.json | 23 + .../process/0.30mm DETAIL @CORE One 0.8.json | 19 + .../0.30mm SPEED @CORE One HF 0.8.json | 18 + .../0.30mm STRUCTURAL @CORE One HF 0.8.json | 23 + .../process/0.32mm SPEED @CORE One 0.6.json | 21 + .../0.32mm SPEED @CORE One HF 0.5.json | 21 + .../0.32mm SPEED @CORE One HF 0.6.json | 22 + .../0.32mm STRUCTURAL @CORE One 0.6.json | 20 + .../0.32mm STRUCTURAL @CORE One HF 0.5.json | 22 + .../0.32mm STRUCTURAL @CORE One HF 0.6.json | 22 + .../process/0.40mm QUALITY @CORE One 0.8.json | 19 + .../0.40mm SPEED @CORE One HF 0.6.json | 22 + .../0.40mm SPEED @CORE One HF 0.8.json | 18 + .../0.40mm STRUCTURAL @CORE One HF 0.6.json | 20 + .../0.40mm STRUCTURAL @CORE One HF 0.8.json | 21 + .../process/0.55mm DRAFT @CORE One 0.8.json | 18 + .../0.55mm SPEED @CORE One HF 0.8.json | 18 + 145 files changed, 5176 insertions(+), 2 deletions(-) create mode 100644 resources/profiles/Prusa/Prusa CORE One HF_cover.png create mode 100644 resources/profiles/Prusa/Prusa CORE One_cover.png create mode 100644 resources/profiles/Prusa/coreone.svg create mode 100644 resources/profiles/Prusa/coreone_bed.stl create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ABS @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic ASA @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PETG @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA Silk @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA Silk @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic PLA Silk @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic TPU @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic TPU @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusa Generic TPU @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament ASA @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PA-CF @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PA-CF @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PA-CF @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC Blend @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC-CF @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC-CF @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PC-CF @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PETG @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PLA @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament PVB @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament PVB @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament PVB @CORE One.json create mode 100644 resources/profiles/Prusa/filament/Prusament rPLA @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/filament/Prusament rPLA @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/filament/Prusament rPLA @CORE One.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.25 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.3 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.4 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.5 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.6 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One 0.8 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One HF 0.4 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One HF 0.5 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One HF 0.6 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One HF 0.8 nozzle.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One HF.json create mode 100644 resources/profiles/Prusa/machine/Prusa CORE One.json create mode 100644 resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json create mode 100644 resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json create mode 100644 resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json create mode 100644 resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json create mode 100644 resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json create mode 100644 resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json create mode 100644 resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json create mode 100644 resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json create mode 100644 resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json create mode 100644 resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json create mode 100644 resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json create mode 100644 resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json create mode 100644 resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json create mode 100644 resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json diff --git a/resources/profiles/Prusa.json b/resources/profiles/Prusa.json index efdb9c7028..e2291ea064 100644 --- a/resources/profiles/Prusa.json +++ b/resources/profiles/Prusa.json @@ -1,6 +1,6 @@ { "name": "Prusa", - "version": "02.03.00.03", + "version": "02.03.00.05", "force_update": "0", "description": "Prusa configurations", "machine_model_list": [ @@ -39,6 +39,14 @@ { "name": "MK4S HF", "sub_path": "machine/Prusa MK4S HF.json" + }, + { + "name": "Prusa CORE One", + "sub_path": "machine/Prusa CORE One.json" + }, + { + "name": "Prusa CORE One HF", + "sub_path": "machine/Prusa CORE One HF.json" } ], "process_list": [ @@ -806,6 +814,14 @@ "name": "0.28mm DRAFT @MK4S HF0.4", "sub_path": "process/0.28mm DRAFT @MK4S HF0.4.json" }, + { + "name": "0.20mm SOLUBLE FULL @MK4S 0.4", + "sub_path": "process/0.20mm SOLUBLE FULL @MK4S 0.4.json" + }, + { + "name": "0.20mm SOLUBLE INTERFACE @MK4S 0.4", + "sub_path": "process/0.20mm SOLUBLE INTERFACE @MK4S 0.4.json" + }, { "name": "0.30mm DETAIL @MK4S 0.8", "sub_path": "process/0.30mm DETAIL @MK4S 0.8.json" @@ -873,8 +889,223 @@ { "name": "0.55mm STRUCTURAL @MK4S HF0.8", "sub_path": "process/0.55mm STRUCTURAL @MK4S HF0.8.json" + }, + { + "name": "0.28mm DRAFT @CORE One HF 0.4", + "sub_path": "process/0.28mm DRAFT @CORE One HF 0.4.json" + }, + { + "name": "0.20mm SOLUBLE FULL @CORE One 0.4", + "sub_path": "process/0.20mm SOLUBLE FULL @CORE One 0.4.json" + }, + { + "name": "0.20mm SOLUBLE INTERFACE @CORE One 0.4", + "sub_path": "process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json" + }, + { + "name": "0.25mm SPEED @CORE One HF 0.4", + "sub_path": "process/0.25mm SPEED @CORE One HF 0.4.json" + }, + { + "name": "0.25mm STRUCTURAL @CORE One HF 0.4", + "sub_path": "process/0.25mm STRUCTURAL @CORE One HF 0.4.json" + }, + { + "name": "0.20mm SPEED @CORE One 0.4", + "sub_path": "process/0.20mm SPEED @CORE One 0.4.json" + }, + { + "name": "0.20mm SPEED @CORE One HF 0.4", + "sub_path": "process/0.20mm SPEED @CORE One HF 0.4.json" + }, + { + "name": "0.20mm STRUCTURAL @CORE One 0.4", + "sub_path": "process/0.20mm STRUCTURAL @CORE One 0.4.json" + }, + { + "name": "0.15mm SPEED @CORE One 0.4", + "sub_path": "process/0.15mm SPEED @CORE One 0.4.json" + }, + { + "name": "0.15mm SPEED @CORE One HF 0.4", + "sub_path": "process/0.15mm SPEED @CORE One HF 0.4.json" + }, + { + "name": "0.15mm STRUCTURAL @CORE One 0.4", + "sub_path": "process/0.15mm STRUCTURAL @CORE One 0.4.json" + }, + { + "name": "0.10mm FAST DETAIL @CORE One 0.4", + "sub_path": "process/0.10mm FAST DETAIL @CORE One 0.4.json" + }, + { + "name": "0.05mm DETAIL @CORE One 0.25", + "sub_path": "process/0.05mm DETAIL @CORE One 0.25.json" + }, + { + "name": "0.07mm DETAIL @CORE One 0.25", + "sub_path": "process/0.07mm DETAIL @CORE One 0.25.json" + }, + { + "name": "0.12mm SPEED @CORE One 0.25", + "sub_path": "process/0.12mm SPEED @CORE One 0.25.json" + }, + { + "name": "0.12mm STRUCTURAL @CORE One 0.25", + "sub_path": "process/0.12mm STRUCTURAL @CORE One 0.25.json" + }, + { + "name": "0.15mm SPEED @CORE One 0.25", + "sub_path": "process/0.15mm SPEED @CORE One 0.25.json" + }, + { + "name": "0.15mm STRUCTURAL @CORE One 0.25", + "sub_path": "process/0.15mm STRUCTURAL @CORE One 0.25.json" + }, + { + "name": "0.12mm STRUCTURAL @CORE One 0.3", + "sub_path": "process/0.12mm STRUCTURAL @CORE One 0.3.json" + }, + { + "name": "0.16mm STRUCTURAL @CORE One 0.3", + "sub_path": "process/0.16mm STRUCTURAL @CORE One 0.3.json" + }, + { + "name": "0.16mm SPEED @CORE One 0.3", + "sub_path": "process/0.16mm SPEED @CORE One 0.3.json" + }, + { + "name": "0.20mm SPEED @CORE One 0.3", + "sub_path": "process/0.20mm SPEED @CORE One 0.3.json" + }, + { + "name": "0.20mm STRUCTURAL @CORE One 0.3", + "sub_path": "process/0.20mm STRUCTURAL @CORE One 0.3.json" + }, + { + "name": "0.10mm STRUCTURAL @CORE One 0.5", + "sub_path": "process/0.10mm STRUCTURAL @CORE One 0.5.json" + }, + { + "name": "0.15mm STRUCTURAL @CORE One 0.5", + "sub_path": "process/0.15mm STRUCTURAL @CORE One 0.5.json" + }, + { + "name": "0.20mm SPEED @CORE One 0.5", + "sub_path": "process/0.20mm SPEED @CORE One 0.5.json" + }, + { + "name": "0.20mm SPEED @CORE One HF 0.5", + "sub_path": "process/0.20mm SPEED @CORE One HF 0.5.json" + }, + { + "name": "0.20mm STRUCTURAL @CORE One 0.5", + "sub_path": "process/0.20mm STRUCTURAL @CORE One 0.5.json" + }, + { + "name": "0.25mm SPEED @CORE One 0.5", + "sub_path": "process/0.25mm SPEED @CORE One 0.5.json" + }, + { + "name": "0.25mm SPEED @CORE One HF 0.5", + "sub_path": "process/0.25mm SPEED @CORE One HF 0.5.json" + }, + { + "name": "0.25mm STRUCTURAL @CORE One 0.5", + "sub_path": "process/0.25mm STRUCTURAL @CORE One 0.5.json" + }, + { + "name": "0.32mm SPEED @CORE One HF 0.5", + "sub_path": "process/0.32mm SPEED @CORE One HF 0.5.json" + }, + { + "name": "0.32mm STRUCTURAL @CORE One HF 0.5", + "sub_path": "process/0.32mm STRUCTURAL @CORE One HF 0.5.json" + }, + { + "name": "0.15mm STRUCTURAL @CORE One 0.6", + "sub_path": "process/0.15mm STRUCTURAL @CORE One 0.6.json" + }, + { + "name": "0.20mm SPEED @CORE One 0.6", + "sub_path": "process/0.20mm SPEED @CORE One 0.6.json" + }, + { + "name": "0.20mm SPEED @CORE One HF 0.6", + "sub_path": "process/0.20mm SPEED @CORE One HF 0.6.json" + }, + { + "name": "0.20mm STRUCTURAL @CORE One 0.6", + "sub_path": "process/0.20mm STRUCTURAL @CORE One 0.6.json" + }, + { + "name": "0.25mm SPEED @CORE One 0.6", + "sub_path": "process/0.25mm SPEED @CORE One 0.6.json" + }, + { + "name": "0.25mm SPEED @CORE One HF 0.6", + "sub_path": "process/0.25mm SPEED @CORE One HF 0.6.json" + }, + { + "name": "0.25mm STRUCTURAL @CORE One 0.6", + "sub_path": "process/0.25mm STRUCTURAL @CORE One 0.6.json" + }, + { + "name": "0.32mm SPEED @CORE One 0.6", + "sub_path": "process/0.32mm SPEED @CORE One 0.6.json" + }, + { + "name": "0.32mm STRUCTURAL @CORE One 0.6", + "sub_path": "process/0.32mm STRUCTURAL @CORE One 0.6.json" + }, + { + "name": "0.32mm SPEED @CORE One HF 0.6", + "sub_path": "process/0.32mm SPEED @CORE One HF 0.6.json" + }, + { + "name": "0.32mm STRUCTURAL @CORE One HF 0.6", + "sub_path": "process/0.32mm STRUCTURAL @CORE One HF 0.6.json" + }, + { + "name": "0.40mm SPEED @CORE One HF 0.6", + "sub_path": "process/0.40mm SPEED @CORE One HF 0.6.json" + }, + { + "name": "0.40mm STRUCTURAL @CORE One HF 0.6", + "sub_path": "process/0.40mm STRUCTURAL @CORE One HF 0.6.json" + }, + { + "name": "0.30mm DETAIL @CORE One 0.8", + "sub_path": "process/0.30mm DETAIL @CORE One 0.8.json" + }, + { + "name": "0.30mm SPEED @CORE One HF 0.8", + "sub_path": "process/0.30mm SPEED @CORE One HF 0.8.json" + }, + { + "name": "0.30mm STRUCTURAL @CORE One HF 0.8", + "sub_path": "process/0.30mm STRUCTURAL @CORE One HF 0.8.json" + }, + { + "name": "0.40mm QUALITY @CORE One 0.8", + "sub_path": "process/0.40mm QUALITY @CORE One 0.8.json" + }, + { + "name": "0.40mm SPEED @CORE One HF 0.8", + "sub_path": "process/0.40mm SPEED @CORE One HF 0.8.json" + }, + { + "name": "0.40mm STRUCTURAL @CORE One HF 0.8", + "sub_path": "process/0.40mm STRUCTURAL @CORE One HF 0.8.json" + }, + { + "name": "0.55mm DRAFT @CORE One 0.8", + "sub_path": "process/0.55mm DRAFT @CORE One 0.8.json" + }, + { + "name": "0.55mm SPEED @CORE One HF 0.8", + "sub_path": "process/0.55mm SPEED @CORE One HF 0.8.json" } - ], "filament_list": [ { @@ -1592,6 +1823,302 @@ { "name": "Prusa Generic PLA Silk @MK4S 0.8", "sub_path": "filament/Prusa Generic PLA Silk @MK4S 0.8.json" + }, + { + "name": "Prusa Generic ABS @CORE One", + "sub_path": "filament/Prusa Generic ABS @CORE One.json" + }, + { + "name": "Prusa Generic ABS @CORE One 0.6", + "sub_path": "filament/Prusa Generic ABS @CORE One 0.6.json" + }, + { + "name": "Prusa Generic ABS @CORE One 0.8", + "sub_path": "filament/Prusa Generic ABS @CORE One 0.8.json" + }, + { + "name": "Prusa Generic ABS @CORE One HF 0.4", + "sub_path": "filament/Prusa Generic ABS @CORE One HF 0.4.json" + }, + { + "name": "Prusa Generic ABS @CORE One HF 0.5", + "sub_path": "filament/Prusa Generic ABS @CORE One HF 0.5.json" + }, + { + "name": "Prusa Generic ABS @CORE One HF 0.6", + "sub_path": "filament/Prusa Generic ABS @CORE One HF 0.6.json" + }, + { + "name": "Prusa Generic ABS @CORE One HF 0.8", + "sub_path": "filament/Prusa Generic ABS @CORE One HF 0.8.json" + }, + { + "name": "Prusa Generic ASA @CORE One", + "sub_path": "filament/Prusa Generic ASA @CORE One.json" + }, + { + "name": "Prusa Generic ASA @CORE One 0.6", + "sub_path": "filament/Prusa Generic ASA @CORE One 0.6.json" + }, + { + "name": "Prusa Generic ASA @CORE One 0.8", + "sub_path": "filament/Prusa Generic ASA @CORE One 0.8.json" + }, + { + "name": "Prusa Generic ASA @CORE One HF 0.4", + "sub_path": "filament/Prusa Generic ASA @CORE One HF 0.4.json" + }, + { + "name": "Prusa Generic ASA @CORE One HF 0.5", + "sub_path": "filament/Prusa Generic ASA @CORE One HF 0.5.json" + }, + { + "name": "Prusa Generic ASA @CORE One HF 0.6", + "sub_path": "filament/Prusa Generic ASA @CORE One HF 0.6.json" + }, + { + "name": "Prusa Generic ASA @CORE One HF 0.8", + "sub_path": "filament/Prusa Generic ASA @CORE One HF 0.8.json" + }, + { + "name": "Prusa Generic PETG @CORE One", + "sub_path": "filament/Prusa Generic PETG @CORE One.json" + }, + { + "name": "Prusa Generic PETG @CORE One 0.6", + "sub_path": "filament/Prusa Generic PETG @CORE One 0.6.json" + }, + { + "name": "Prusa Generic PETG @CORE One 0.8", + "sub_path": "filament/Prusa Generic PETG @CORE One 0.8.json" + }, + { + "name": "Prusa Generic PETG @CORE One HF 0.4", + "sub_path": "filament/Prusa Generic PETG @CORE One HF 0.4.json" + }, + { + "name": "Prusa Generic PETG @CORE One HF 0.5", + "sub_path": "filament/Prusa Generic PETG @CORE One HF 0.5.json" + }, + { + "name": "Prusa Generic PETG @CORE One HF 0.6", + "sub_path": "filament/Prusa Generic PETG @CORE One HF 0.6.json" + }, + { + "name": "Prusa Generic PETG @CORE One HF 0.8", + "sub_path": "filament/Prusa Generic PETG @CORE One HF 0.8.json" + }, + { + "name": "Prusa Generic PLA @CORE One", + "sub_path": "filament/Prusa Generic PLA @CORE One.json" + }, + { + "name": "Prusa Generic PLA @CORE One 0.6", + "sub_path": "filament/Prusa Generic PLA @CORE One 0.6.json" + }, + { + "name": "Prusa Generic PLA @CORE One 0.8", + "sub_path": "filament/Prusa Generic PLA @CORE One 0.8.json" + }, + { + "name": "Prusa Generic PLA @CORE One HF 0.4", + "sub_path": "filament/Prusa Generic PLA @CORE One HF 0.4.json" + }, + { + "name": "Prusa Generic PLA @CORE One HF 0.5", + "sub_path": "filament/Prusa Generic PLA @CORE One HF 0.5.json" + }, + { + "name": "Prusa Generic PLA @CORE One HF 0.6", + "sub_path": "filament/Prusa Generic PLA @CORE One HF 0.6.json" + }, + { + "name": "Prusa Generic PLA @CORE One HF 0.8", + "sub_path": "filament/Prusa Generic PLA @CORE One HF 0.8.json" + }, + { + "name": "Prusa Generic PLA Silk @CORE One", + "sub_path": "filament/Prusa Generic PLA Silk @CORE One.json" + }, + { + "name": "Prusa Generic PLA Silk @CORE One 0.6", + "sub_path": "filament/Prusa Generic PLA Silk @CORE One 0.6.json" + }, + { + "name": "Prusa Generic PLA Silk @CORE One 0.8", + "sub_path": "filament/Prusa Generic PLA Silk @CORE One 0.8.json" + }, + { + "name": "Prusa Generic TPU @CORE One", + "sub_path": "filament/Prusa Generic TPU @CORE One.json" + }, + { + "name": "Prusa Generic TPU @CORE One 0.6", + "sub_path": "filament/Prusa Generic TPU @CORE One 0.6.json" + }, + { + "name": "Prusa Generic TPU @CORE One 0.8", + "sub_path": "filament/Prusa Generic TPU @CORE One 0.8.json" + }, + { + "name": "Prusament ASA @CORE One", + "sub_path": "filament/Prusament ASA @CORE One.json" + }, + { + "name": "Prusament ASA @CORE One 0.6", + "sub_path": "filament/Prusament ASA @CORE One 0.6.json" + }, + { + "name": "Prusament ASA @CORE One 0.8", + "sub_path": "filament/Prusament ASA @CORE One 0.8.json" + }, + { + "name": "Prusament ASA @CORE One HF 0.4", + "sub_path": "filament/Prusament ASA @CORE One HF 0.4.json" + }, + { + "name": "Prusament ASA @CORE One HF 0.5", + "sub_path": "filament/Prusament ASA @CORE One HF 0.5.json" + }, + { + "name": "Prusament ASA @CORE One HF 0.6", + "sub_path": "filament/Prusament ASA @CORE One HF 0.6.json" + }, + { + "name": "Prusament ASA @CORE One HF 0.8", + "sub_path": "filament/Prusament ASA @CORE One HF 0.8.json" + }, + { + "name": "Prusament PA-CF @CORE One", + "sub_path": "filament/Prusament PA-CF @CORE One.json" + }, + { + "name": "Prusament PA-CF @CORE One 0.6", + "sub_path": "filament/Prusament PA-CF @CORE One 0.6.json" + }, + { + "name": "Prusament PA-CF @CORE One 0.8", + "sub_path": "filament/Prusament PA-CF @CORE One 0.8.json" + }, + { + "name": "Prusament PC Blend @CORE One", + "sub_path": "filament/Prusament PC Blend @CORE One.json" + }, + { + "name": "Prusament PC Blend @CORE One 0.6", + "sub_path": "filament/Prusament PC Blend @CORE One 0.6.json" + }, + { + "name": "Prusament PC Blend @CORE One 0.8", + "sub_path": "filament/Prusament PC Blend @CORE One 0.8.json" + }, + { + "name": "Prusament PC Blend @CORE One HF 0.4", + "sub_path": "filament/Prusament PC Blend @CORE One HF 0.4.json" + }, + { + "name": "Prusament PC Blend @CORE One HF 0.5", + "sub_path": "filament/Prusament PC Blend @CORE One HF 0.5.json" + }, + { + "name": "Prusament PC Blend @CORE One HF 0.6", + "sub_path": "filament/Prusament PC Blend @CORE One HF 0.6.json" + }, + { + "name": "Prusament PC Blend @CORE One HF 0.8", + "sub_path": "filament/Prusament PC Blend @CORE One HF 0.8.json" + }, + { + "name": "Prusament PC-CF @CORE One", + "sub_path": "filament/Prusament PC-CF @CORE One.json" + }, + { + "name": "Prusament PC-CF @CORE One 0.6", + "sub_path": "filament/Prusament PC-CF @CORE One 0.6.json" + }, + { + "name": "Prusament PC-CF @CORE One 0.8", + "sub_path": "filament/Prusament PC-CF @CORE One 0.8.json" + }, + { + "name": "Prusament PETG @CORE One", + "sub_path": "filament/Prusament PETG @CORE One.json" + }, + { + "name": "Prusament PETG @CORE One 0.6", + "sub_path": "filament/Prusament PETG @CORE One 0.6.json" + }, + { + "name": "Prusament PETG @CORE One 0.8", + "sub_path": "filament/Prusament PETG @CORE One 0.8.json" + }, + { + "name": "Prusament PETG @CORE One HF 0.4", + "sub_path": "filament/Prusament PETG @CORE One HF 0.4.json" + }, + { + "name": "Prusament PETG @CORE One HF 0.5", + "sub_path": "filament/Prusament PETG @CORE One HF 0.5.json" + }, + { + "name": "Prusament PETG @CORE One HF 0.6", + "sub_path": "filament/Prusament PETG @CORE One HF 0.6.json" + }, + { + "name": "Prusament PETG @CORE One HF 0.8", + "sub_path": "filament/Prusament PETG @CORE One HF 0.8.json" + }, + { + "name": "Prusament PLA @CORE One", + "sub_path": "filament/Prusament PLA @CORE One.json" + }, + { + "name": "Prusament PLA @CORE One 0.6", + "sub_path": "filament/Prusament PLA @CORE One 0.6.json" + }, + { + "name": "Prusament PLA @CORE One 0.8", + "sub_path": "filament/Prusament PLA @CORE One 0.8.json" + }, + { + "name": "Prusament PLA @CORE One HF 0.4", + "sub_path": "filament/Prusament PLA @CORE One HF 0.4.json" + }, + { + "name": "Prusament PLA @CORE One HF 0.5", + "sub_path": "filament/Prusament PLA @CORE One HF 0.5.json" + }, + { + "name": "Prusament PLA @CORE One HF 0.6", + "sub_path": "filament/Prusament PLA @CORE One HF 0.6.json" + }, + { + "name": "Prusament PLA @CORE One HF 0.8", + "sub_path": "filament/Prusament PLA @CORE One HF 0.8.json" + }, + { + "name": "Prusament PVB @CORE One", + "sub_path": "filament/Prusament PVB @CORE One.json" + }, + { + "name": "Prusament PVB @CORE One 0.6", + "sub_path": "filament/Prusament PVB @CORE One 0.6.json" + }, + { + "name": "Prusament PVB @CORE One 0.8", + "sub_path": "filament/Prusament PVB @CORE One 0.8.json" + }, + { + "name": "Prusament rPLA @CORE One", + "sub_path": "filament/Prusament rPLA @CORE One.json" + }, + { + "name": "Prusament rPLA @CORE One 0.6", + "sub_path": "filament/Prusament rPLA @CORE One 0.6.json" + }, + { + "name": "Prusament rPLA @CORE One 0.8", + "sub_path": "filament/Prusament rPLA @CORE One 0.8.json" } ], "machine_list": [ @@ -1778,6 +2305,46 @@ { "name": "Prusa MK4S HF0.8 nozzle", "sub_path": "machine/Prusa MK4S HF0.8 nozzle.json" + }, + { + "name": "Prusa CORE One HF 0.4 nozzle", + "sub_path": "machine/Prusa CORE One HF 0.4 nozzle.json" + }, + { + "name": "Prusa CORE One HF 0.5 nozzle", + "sub_path": "machine/Prusa CORE One HF 0.5 nozzle.json" + }, + { + "name": "Prusa CORE One HF 0.6 nozzle", + "sub_path": "machine/Prusa CORE One HF 0.6 nozzle.json" + }, + { + "name": "Prusa CORE One HF 0.8 nozzle", + "sub_path": "machine/Prusa CORE One HF 0.8 nozzle.json" + }, + { + "name": "Prusa CORE One 0.25 nozzle", + "sub_path": "machine/Prusa CORE One 0.25 nozzle.json" + }, + { + "name": "Prusa CORE One 0.3 nozzle", + "sub_path": "machine/Prusa CORE One 0.3 nozzle.json" + }, + { + "name": "Prusa CORE One 0.4 nozzle", + "sub_path": "machine/Prusa CORE One 0.4 nozzle.json" + }, + { + "name": "Prusa CORE One 0.5 nozzle", + "sub_path": "machine/Prusa CORE One 0.5 nozzle.json" + }, + { + "name": "Prusa CORE One 0.6 nozzle", + "sub_path": "machine/Prusa CORE One 0.6 nozzle.json" + }, + { + "name": "Prusa CORE One 0.8 nozzle", + "sub_path": "machine/Prusa CORE One 0.8 nozzle.json" } ] } diff --git a/resources/profiles/Prusa/Prusa CORE One HF_cover.png b/resources/profiles/Prusa/Prusa CORE One HF_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..d19a92c8e61bd79ddc655cc0f7f4cc044c3fa828 GIT binary patch literal 51735 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 + diff --git a/resources/profiles/Prusa/coreone_bed.stl b/resources/profiles/Prusa/coreone_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..a9dd873c60b9e46ffe4cef1b71ca317f285ab8e9 GIT binary patch literal 119984 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 150}\nM201 X{interpolate_table(layer_z, (0,7000), (150,7000), (200,4000), (270,2000))} Y{interpolate_table(layer_z, (0,7000), (150,7000), (200,4000), (270,2000))}\n{endif}\n" + ], + "change_filament_gcode": [ + "M600\nG1 E0.3 F1500 ; prime after color change" + ], + "default_filament_profile": "Prusament PLA @CORE One HF 0.4", + "default_print_profile": "0.20mm SPEED @CORE One 0.4", + "deretraction_speed": "25", + "emit_machine_limits_to_gcode": "1", + "extruder_clearance_height_to_lid": "50", + "extruder_clearance_height_to_rod": "33", + "extruder_clearance_radius": "75", + "from": "system", + "gcode_flavor": "marlin2", + "host_type": "prusalink", + "inherits": "fdm_machine_common", + "instantiation": "true", + "layer_change_gcode": [ + ";AFTER_LAYER_CHANGE\n;[layer_z]" + ], + "machine_end_gcode": [ + "{if layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+1, max_print_height)} F720 ; move print head up{endif}\nG1 E-1 F2400 ; additional retraction\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM141 S0 ; disable chamber control\nM107 ; turn off fan\nG1 X242 Y-9 F10200 ; park\nG4 ; wait\nM572 S0 ; reset PA\nM84 X Y E ; disable motors\n; max_layer_z = [max_layer_z]" + ], + "machine_max_acceleration_e": [ + "5000", + "2500" + ], + "machine_max_acceleration_extruding": [ + "7000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "2500", + "1200" + ], + "machine_max_acceleration_travel": [ + "7000", + "2500" + ], + "machine_max_acceleration_x": [ + "10000", + "2500" + ], + "machine_max_acceleration_y": [ + "10000", + "2500" + ], + "machine_max_acceleration_z": [ + "400", + "200" + ], + "machine_max_jerk_e": [ + "10", + "10" + ], + "machine_max_jerk_x": [ + "10", + "8" + ], + "machine_max_jerk_y": [ + "10", + "8" + ], + "machine_max_jerk_z": [ + "2", + "2" + ], + "machine_max_speed_e": [ + "100", + "100" + ], + "machine_max_speed_x": [ + "350", + "160" + ], + "machine_max_speed_y": [ + "350", + "160" + ], + "machine_max_speed_z": [ + "12", + "12" + ], + "machine_pause_gcode": "M601", + "machine_start_gcode": [ + "; --- Printer Initialization and Checks ---\n\nM17 ; enable steppers\nM862.1 P[nozzle_diameter] A{(printer_notes=~/.*ABRASIVE_NOZZLE.*/ ? 1 : 0)} F{(printer_notes=~/.*HF_NOZZLE.*/ ? 1 : 0)} ; nozzle check\nM862.3 P \"COREONE\" ; printer model check\nM862.5 P2 ; g-code level check\nM862.6 P\"Input shaper\" ; FW feature check\nM115 U6.3.0+10073\n\n; --- Print Area and Coordinate System ---\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))} ; define print area\n\nG90 ; use absolute coordinates\nM83 ; extruder in relative mode\n\n; --- Preparation ---\n\n{if chamber_temperature[initial_tool] > 35} \n; we need to preheat the chamber\nM140 S115 ; set bed temp for chamber heating\n{else} \n; just set the selected bed temp otherwise\nM140 S[first_layer_bed_temperature] ; set bed temp\n{endif}\n\nM109 R{((filament_notes[0]=~/.*HT_MBL10.*/) ? (first_layer_temperature[0] - 10) : (filament_type[0] == \"PC\" or filament_type[0] == \"PA\") ? (first_layer_temperature[0] - 25) : (filament_type[0] == \"FLEX\") ? 210 : 170)} ; wait for temp\n\nM84 E ; turn off E motor\n\nG28 ; home all axes without mesh bed leveling\n\n\n; -- Chamber Temperature Control --\n{if chamber_temperature[initial_tool] > 35} ; if we need to heat the chamber\n; min chamber temp section\nM104 T{initial_tool} S{if idle_temperature[initial_tool] == 0}100{else}{idle_temperature[initial_tool]}{endif} ; set idle temp\nG1 Z10 F720 ; set bed position\nG1 X242 Y-9 F4800 ; set print head position\nM191 S{chamber_temperature[initial_tool]} ; wait for minimal chamber temp\nM141 S0 ; set nominal chamber temp\nM107\nM140 S[first_layer_bed_temperature] ; set bed temp\n\n{else}\nM141 S{if chamber_temperature[initial_tool] == 0}20{else}{chamber_temperature[initial_tool]}{endif} ; set nominal chamber temp\n{endif}\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S70{endif}\nG0 Z40 F10000\nM104 T{initial_tool} S{if idle_temperature[initial_tool] == 0}100{else}{idle_temperature[initial_tool]}{endif}\nM190 R[first_layer_bed_temperature] ; wait for bed temp\nM107\n\nG29 G ; absorb heat\n\nM109 R{((filament_notes[0]=~/.*HT_MBL10.*/) ? (first_layer_temperature[0] - 10) : (filament_type[0] == \"PC\" or filament_type[0] == \"PA\") ? (first_layer_temperature[0] - 25) : (filament_type[0] == \"FLEX\") ? 210 : 170)} ; wait for MBL temp\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]==\"FLEX\"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\n; --- Mesh Bed Leveling (MBL) ---\n\nG29 P9 X208 Y-2.5 W32 H4 ; limited MBL\nM84 E ; turn off E motor\n\nG29 P1 ; invalidate MBL and probe print area\nG29 P1 X150 Y0 W100 H20 C ; probe near purge area\nG29 P3.2 ; MBL interpolation\nG29 P3.13 ; MBL extrapolation outside probe area\nG29 A ; activate MBL\n\n; --- Preparation for Purge Line ---\n\nM104 S{first_layer_temperature[initial_extruder]}\nG0 X249 Y-2.5 Z15 F4800 ; move away and ready for the purge\nM109 S{first_layer_temperature[initial_extruder]}\n\nG92 E0 ; reset extruder position\nM569 S0 E ; set spreadcycle mode for extruder\n\n; --- Extrude Purge Line ---\n\nG92 E0 ; reset extruder position\nG1 E{(filament_type[0] == \"FLEX\" ? 4 : 2)} F2400 ; deretraction after the initial one\nG0 E5 X235 Z0.2 F500 ; purge\nG0 X225 E4 F500 ; purge\nG0 X215 E4 F650 ; purge\nG0 X205 E4 F800 ; purge\nG0 X202 Z0.05 F8000 ; wipe, close to bed\nG0 X199 Z0.2 F8000 ; wipe, quickly away from bed\n\nG92 E0 ; reset extruder position\nM221 S100 ; set flow to 100%" + ], + "max_layer_height": "0.30", + "min_layer_height": "0.07", + "name": "Prusa CORE One HF 0.4 nozzle", + "nozzle_diameter": [ + "0.4" + ], + "printable_area": [ + "0x0", + "250x0", + "250x220", + "0x220" + ], + "printable_height": "270", + "printer_model": "Prusa CORE One HF", + "printer_notes": [ + "Don't remove the following keywords! These keywords are used in the \"compatible printer\" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_MODEL_COREONE\nHF_NOZZLE\nPG\nNO_TEMPLATES" + ], + "printer_variant": "0.4", + "retract_before_wipe": "80", + "retract_length_toolchange": "0", + "retract_lift_above": "0", + "retract_lift_below": "269", + "retract_when_changing_layer": "1", + "retraction_length": "0.7", + "retraction_minimum_travel": "1.5", + "retraction_speed": "45", + "single_extruder_multi_material": "0", + "thumbnails": [ + "16x16/QOI", + "313x173/QOI", + "440x240/QOI", + "480x240/QOI", + "640x480/PNG" + ], + "travel_slope": "1", + "type": "machine", + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": "0", + "z_hop": "0.2", + "z_hop_types": "Slope Lift" +} diff --git a/resources/profiles/Prusa/machine/Prusa CORE One HF 0.5 nozzle.json b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.5 nozzle.json new file mode 100644 index 0000000000..6a34054939 --- /dev/null +++ b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.5 nozzle.json @@ -0,0 +1,19 @@ +{ + "default_filament_profile": "Prusament PLA @CORE One HF 0.5", + "default_print_profile": "0.20mm SPEED @CORE One HF 0.5", + "deretraction_speed": "25", + "from": "system", + "inherits": "Prusa CORE One HF 0.4 nozzle", + "instantiation": "true", + "max_layer_height": "0.32", + "min_layer_height": "0.07", + "name": "Prusa CORE One HF 0.5 nozzle", + "nozzle_diameter": [ + "0.5" + ], + "printer_model": "Prusa CORE One HF", + "printer_variant": "0.5", + "retraction_length": "0.7", + "type": "machine", + "wipe": "1" +} diff --git a/resources/profiles/Prusa/machine/Prusa CORE One HF 0.6 nozzle.json b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.6 nozzle.json new file mode 100644 index 0000000000..20cb6bb37e --- /dev/null +++ b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.6 nozzle.json @@ -0,0 +1,19 @@ +{ + "default_filament_profile": "Prusament PLA @CORE One HF 0.6", + "default_print_profile": "0.32mm SPEED @CORE One HF 0.6", + "deretraction_speed": "25", + "from": "system", + "inherits": "Prusa CORE One HF 0.4 nozzle", + "instantiation": "true", + "max_layer_height": "0.40", + "min_layer_height": "0.15", + "name": "Prusa CORE One HF 0.6 nozzle", + "nozzle_diameter": [ + "0.6" + ], + "printer_model": "Prusa CORE One HF", + "printer_variant": "0.6", + "retraction_length": "0.7", + "type": "machine", + "wipe": "1" +} diff --git a/resources/profiles/Prusa/machine/Prusa CORE One HF 0.8 nozzle.json b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.8 nozzle.json new file mode 100644 index 0000000000..c28fa6fafb --- /dev/null +++ b/resources/profiles/Prusa/machine/Prusa CORE One HF 0.8 nozzle.json @@ -0,0 +1,22 @@ +{ + "default_filament_profile": "Prusament PLA @CORE One HF 0.8", + "default_print_profile": "0.40mm STRUCTURAL @CORE One HF 0.8", + "deretraction_speed": "15", + "from": "system", + "inherits": "Prusa CORE One HF 0.4 nozzle", + "instantiation": "true", + "max_layer_height": "0.6", + "min_layer_height": "0.2", + "name": "Prusa CORE One HF 0.8 nozzle", + "nozzle_diameter": [ + "0.8" + ], + "printer_model": "Prusa CORE One HF", + "printer_variant": "0.8", + "retract_before_wipe": "50", + "retraction_length": "0.6", + "retraction_speed": "15", + "type": "machine", + "wipe": "1", + "z_hop": "0.25" +} diff --git a/resources/profiles/Prusa/machine/Prusa CORE One HF.json b/resources/profiles/Prusa/machine/Prusa CORE One HF.json new file mode 100644 index 0000000000..f2a54e3c1f --- /dev/null +++ b/resources/profiles/Prusa/machine/Prusa CORE One HF.json @@ -0,0 +1,12 @@ +{ + "bed_model": "coreone_bed.stl", + "bed_texture": "coreone.svg", + "default_materials": "Prusa Generic ABS @CORE One;Prusa Generic ASA @CORE One;Prusa Generic PETG @CORE One;Prusa Generic PLA @CORE One;Prusa Generic PLA Silk @CORE One;Prusa Generic TPU @CORE One", + "family": "Prusa", + "hotend_model": "", + "machine_tech": "FFF", + "model_id": "Prusa_CORE_One_HF", + "name": "Prusa CORE One HF", + "nozzle_diameter": "0.4;0.5;0.6;0.8", + "type": "machine_model" +} diff --git a/resources/profiles/Prusa/machine/Prusa CORE One.json b/resources/profiles/Prusa/machine/Prusa CORE One.json new file mode 100644 index 0000000000..037b830712 --- /dev/null +++ b/resources/profiles/Prusa/machine/Prusa CORE One.json @@ -0,0 +1,12 @@ +{ + "bed_model": "coreone_bed.stl", + "bed_texture": "coreone.svg", + "default_materials": "Prusa Generic ABS @CORE One;Prusa Generic ASA @CORE One;Prusa Generic PETG @CORE One;Prusa Generic PLA @CORE One;Prusa Generic PLA Silk @CORE One;Prusa Generic TPU @CORE One", + "family": "Prusa", + "hotend_model": "", + "machine_tech": "FFF", + "model_id": "Prusa_CORE_One", + "name": "Prusa CORE One", + "nozzle_diameter": "0.25;0.3;0.4;0.5;0.6;0.8", + "type": "machine_model" +} diff --git a/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json new file mode 100644 index 0000000000..f05bb7d048 --- /dev/null +++ b/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.05mm DETAIL @MK4S 0.25", + "instantiation": "true", + "name": "0.05mm DETAIL @CORE One 0.25", + "type": "process", + "travel_speed": "350", + "travel_acceleration": "4000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json new file mode 100644 index 0000000000..8225707d8a --- /dev/null +++ b/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.07mm DETAIL @MK4S 0.25", + "instantiation": "true", + "name": "0.07mm DETAIL @CORE One 0.25", + "type": "process", + "travel_speed": "350", + "travel_acceleration": "4000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json new file mode 100644 index 0000000000..ac3f8ee878 --- /dev/null +++ b/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json @@ -0,0 +1,17 @@ +{ + "from": "system", + "inherits": "0.10mm FAST DETAIL @MK4S 0.4", + "instantiation": "true", + "name": "0.10mm FAST DETAIL @CORE One 0.4", + "type": "process", + "inner_wall_acceleration": "3000", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json new file mode 100644 index 0000000000..6e70f3275f --- /dev/null +++ b/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json @@ -0,0 +1,17 @@ +{ + "from": "system", + "inherits": "0.10mm STRUCTURAL @MK4S 0.5", + "instantiation": "true", + "name": "0.10mm STRUCTURAL @CORE One 0.5", + "type": "process", + "inner_wall_speed": "80", + "small_perimeter_speed": "45", + "outer_wall_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json b/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json new file mode 100644 index 0000000000..3329c01ba7 --- /dev/null +++ b/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.12mm SPEED @MK4S 0.25", + "instantiation": "true", + "name": "0.12mm SPEED @CORE One 0.25", + "type": "process", + "travel_acceleration": "4000", + "travel_speed": "350", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json new file mode 100644 index 0000000000..512b0c8bde --- /dev/null +++ b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.12mm STRUCTURAL @MK4S 0.25", + "instantiation": "true", + "name": "0.12mm STRUCTURAL @CORE One 0.25", + "type": "process", + "travel_speed": "350", + "travel_acceleration": "4000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json new file mode 100644 index 0000000000..bcc5440ab9 --- /dev/null +++ b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json @@ -0,0 +1,16 @@ +{ + "from": "system", + "inherits": "0.12mm STRUCTURAL @MK4S 0.3", + "instantiation": "true", + "name": "0.12mm STRUCTURAL @CORE One 0.3", + "type": "process", + "sparse_infill_acceleration": "5000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "45", + "top_surface_acceleration": "1500", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json new file mode 100644 index 0000000000..424d46cb62 --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.15mm SPEED @MK4S 0.25", + "instantiation": "true", + "name": "0.15mm SPEED @CORE One 0.25", + "type": "process", + "travel_acceleration": "4000", + "travel_speed": "350", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json new file mode 100644 index 0000000000..9ea602d2c5 --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.15mm SPEED @MK4S 0.4", + "instantiation": "true", + "name": "0.15mm SPEED @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json new file mode 100644 index 0000000000..d776bd7d60 --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.15mm SPEED @MK4S HF0.4", + "instantiation": "true", + "name": "0.15mm SPEED @CORE One HF 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "60%", + "sparse_infill_speed": "300", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json new file mode 100644 index 0000000000..a6d6b27f1c --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json @@ -0,0 +1,14 @@ +{ + "from": "system", + "inherits": "0.15mm STRUCTURAL @MK4S 0.25", + "instantiation": "true", + "name": "0.15mm STRUCTURAL @CORE One 0.25", + "type": "process", + "travel_speed": "350", + "travel_acceleration": "4000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "45", + "initial_layer_speed": "25", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json new file mode 100644 index 0000000000..f038832344 --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.15mm STRUCTURAL @MK4S 0.4", + "instantiation": "true", + "name": "0.15mm STRUCTURAL @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "45", + "sparse_infill_speed": "120", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json new file mode 100644 index 0000000000..44f4113abf --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.15mm STRUCTURAL @MK4S 0.5", + "instantiation": "true", + "name": "0.15mm STRUCTURAL @CORE One 0.5", + "type": "process", + "overhang_2_4_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json new file mode 100644 index 0000000000..366df4bb73 --- /dev/null +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.15mm STRUCTURAL @MK4S 0.6", + "instantiation": "true", + "name": "0.15mm STRUCTURAL @CORE One 0.6", + "type": "process", + "inner_wall_speed": "80", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json b/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json new file mode 100644 index 0000000000..b267ebede2 --- /dev/null +++ b/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json @@ -0,0 +1,17 @@ +{ + "from": "system", + "inherits": "0.16mm SPEED @MK4S 0.3", + "instantiation": "true", + "name": "0.16mm SPEED @CORE One 0.3", + "type": "process", + "sparse_infill_acceleration": "6000", + "inner_wall_acceleration": "3000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "45", + "top_surface_acceleration": "1500", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json new file mode 100644 index 0000000000..22dd441fca --- /dev/null +++ b/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json @@ -0,0 +1,16 @@ +{ + "from": "system", + "inherits": "0.16mm STRUCTURAL @MK4S 0.3", + "instantiation": "true", + "name": "0.16mm STRUCTURAL @CORE One 0.3", + "type": "process", + "sparse_infill_acceleration": "6000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "45", + "top_surface_acceleration": "1500", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json new file mode 100644 index 0000000000..2927f2bec1 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json @@ -0,0 +1,15 @@ +{ + "from": "system", + "inherits": "0.20mm SOLUBLE FULL @MK4S 0.4", + "instantiation": "true", + "name": "0.20mm SOLUBLE FULL @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json new file mode 100644 index 0000000000..2d5c49f0ab --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json @@ -0,0 +1,15 @@ +{ + "from": "system", + "inherits": "0.20mm SOLUBLE INTERFACE @MK4S 0.4", + "instantiation": "true", + "name": "0.20mm SOLUBLE INTERFACE @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json new file mode 100644 index 0000000000..9334f02c5a --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json @@ -0,0 +1,17 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S 0.3", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One 0.3", + "type": "process", + "sparse_infill_acceleration": "6000", + "inner_wall_acceleration": "3000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "45", + "top_surface_acceleration": "1500", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json new file mode 100644 index 0000000000..1164c683e5 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S 0.4", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json new file mode 100644 index 0000000000..58c02160bd --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S 0.5", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One 0.5", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes!~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json new file mode 100644 index 0000000000..b0008c9731 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S 0.6", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json new file mode 100644 index 0000000000..7ded53e928 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S HF0.4", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One HF 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "60%", + "sparse_infill_speed": "300", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json new file mode 100644 index 0000000000..7b80b6d8eb --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S HF0.5", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One HF 0.5", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json new file mode 100644 index 0000000000..d3c16c5a91 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.20mm SPEED @MK4S HF0.6", + "instantiation": "true", + "name": "0.20mm SPEED @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json new file mode 100644 index 0000000000..b1c645dfc9 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json @@ -0,0 +1,16 @@ +{ + "from": "system", + "inherits": "0.20mm STRUCTURAL @MK4S 0.3", + "instantiation": "true", + "name": "0.20mm STRUCTURAL @CORE One 0.3", + "type": "process", + "sparse_infill_acceleration": "6000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "45", + "top_surface_acceleration": "1500", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json new file mode 100644 index 0000000000..66bc3b78cb --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm STRUCTURAL @MK4S 0.4", + "instantiation": "true", + "name": "0.20mm STRUCTURAL @CORE One 0.4", + "type": "process", + "overhang_2_4_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json new file mode 100644 index 0000000000..ae49f33716 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm STRUCTURAL @MK4S 0.5", + "instantiation": "true", + "name": "0.20mm STRUCTURAL @CORE One 0.5", + "type": "process", + "overhang_2_4_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json new file mode 100644 index 0000000000..a963c6c514 --- /dev/null +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.20mm STRUCTURAL @MK4S 0.6", + "instantiation": "true", + "name": "0.20mm STRUCTURAL @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json new file mode 100644 index 0000000000..e28aab6d2d --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.25mm SPEED @MK4S 0.5", + "instantiation": "true", + "name": "0.25mm SPEED @CORE One 0.5", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes!~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json new file mode 100644 index 0000000000..b8fa2c705f --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.25mm SPEED @MK4S 0.6", + "instantiation": "true", + "name": "0.25mm SPEED @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json new file mode 100644 index 0000000000..2d9d230cf0 --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.25mm SPEED @MK4S HF0.4", + "instantiation": "true", + "name": "0.25mm SPEED @CORE One HF 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "60%", + "sparse_infill_speed": "300", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json new file mode 100644 index 0000000000..f8ebad583b --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.25mm SPEED @MK4S HF0.5", + "instantiation": "true", + "name": "0.25mm SPEED @CORE One HF 0.5", + "type": "process", + "overhang_2_4_speed": "50", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json new file mode 100644 index 0000000000..44f7c83a32 --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.25mm SPEED @MK4S HF0.6", + "instantiation": "true", + "name": "0.25mm SPEED @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json new file mode 100644 index 0000000000..9b99c7d804 --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.25mm STRUCTURAL @MK4S 0.5", + "instantiation": "true", + "name": "0.25mm STRUCTURAL @CORE One 0.5", + "type": "process", + "overhang_2_4_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json new file mode 100644 index 0000000000..c941670b66 --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.25mm STRUCTURAL @MK4S 0.6", + "instantiation": "true", + "name": "0.25mm STRUCTURAL @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json new file mode 100644 index 0000000000..9c0013b961 --- /dev/null +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.25mm STRUCTURAL @MK4S HF0.4", + "instantiation": "true", + "name": "0.25mm STRUCTURAL @CORE One HF 0.4", + "type": "process", + "overhang_2_4_speed": "45", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json new file mode 100644 index 0000000000..52c71f206a --- /dev/null +++ b/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json @@ -0,0 +1,23 @@ +{ + "from": "system", + "inherits": "0.28mm DRAFT @MK4S HF0.4", + "instantiation": "true", + "name": "0.28mm DRAFT @CORE One HF 0.4", + "type": "process", + "overhang_2_4_speed": "50", + "support_threshold_angle": "35", + "outer_wall_acceleration": "3000", + "inner_wall_acceleration": "6000", + "support_base_pattern_spacing": "2.5", + "sparse_infill_speed": "300", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json b/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json new file mode 100644 index 0000000000..b4fc3d02d0 --- /dev/null +++ b/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json @@ -0,0 +1,19 @@ +{ + "from": "system", + "inherits": "0.30mm DETAIL @MK4S 0.8", + "instantiation": "true", + "name": "0.30mm DETAIL @CORE One 0.8", + "type": "process", + "overhang_2_4_speed": "35", + "top_surface_speed": "2000", + "inner_wall_acceleration": "2500", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json new file mode 100644 index 0000000000..c867faaa7f --- /dev/null +++ b/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json @@ -0,0 +1,18 @@ +{ + "from": "system", + "inherits": "0.30mm SPEED @MK4S HF0.8", + "instantiation": "true", + "name": "0.30mm SPEED @CORE One HF 0.8", + "type": "process", + "overhang_2_4_speed": "45", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json new file mode 100644 index 0000000000..8e8501388a --- /dev/null +++ b/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json @@ -0,0 +1,23 @@ +{ + "from": "system", + "inherits": "0.30mm STRUCTURAL @MK4S HF0.8", + "instantiation": "true", + "name": "0.30mm STRUCTURAL @CORE One HF 0.8", + "type": "process", + "overhang_2_4_speed": "40", + "top_surface_speed": "2000", + "support_speed": "100", + "support_interface_speed": "55%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json new file mode 100644 index 0000000000..6dfdbee6a6 --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.32mm SPEED @MK4S 0.6", + "instantiation": "true", + "name": "0.32mm SPEED @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "70%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json new file mode 100644 index 0000000000..3bb9b17e5d --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.32mm SPEED @MK4S HF0.5", + "instantiation": "true", + "name": "0.32mm SPEED @CORE One HF 0.5", + "type": "process", + "overhang_2_4_speed": "50", + "support_interface_speed": "50%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "7000", + "internal_solid_infill_acceleration": "6000", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json new file mode 100644 index 0000000000..cd76a87a95 --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.32mm SPEED @MK4S HF0.6", + "instantiation": "true", + "name": "0.32mm SPEED @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "35", + "overhang_3_4_speed": "70%", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json new file mode 100644 index 0000000000..22c4f52d54 --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.32mm STRUCTURAL @MK4S 0.6", + "instantiation": "true", + "name": "0.32mm STRUCTURAL @CORE One 0.6", + "type": "process", + "overhang_2_4_speed": "30", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json new file mode 100644 index 0000000000..37f3b4afc4 --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.32mm STRUCTURAL @MK4S HF0.5", + "instantiation": "true", + "name": "0.32mm STRUCTURAL @CORE One HF 0.5", + "type": "process", + "overhang_2_4_speed": "45", + "support_speed": "120", + "support_interface_speed": "50%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "100", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.5 and printer_notes=~/.*HF_NOZZLE.*/", + "sparse_infill_acceleration": "6000", + "internal_solid_infill_acceleration": "4000", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json new file mode 100644 index 0000000000..d0956416eb --- /dev/null +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.32mm STRUCTURAL @MK4S HF0.6", + "instantiation": "true", + "name": "0.32mm STRUCTURAL @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "35", + "support_speed": "110", + "support_interface_speed": "50%", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json b/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json new file mode 100644 index 0000000000..6f1785233f --- /dev/null +++ b/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json @@ -0,0 +1,19 @@ +{ + "from": "system", + "inherits": "0.40mm QUALITY @MK4S 0.8", + "instantiation": "true", + "name": "0.40mm QUALITY @CORE One 0.8", + "type": "process", + "overhang_2_4_speed": "35", + "top_surface_speed": "2000", + "inner_wall_acceleration": "2500", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json new file mode 100644 index 0000000000..5b8723d781 --- /dev/null +++ b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json @@ -0,0 +1,22 @@ +{ + "from": "system", + "inherits": "0.40mm SPEED @MK4S HF0.6", + "instantiation": "true", + "name": "0.40mm SPEED @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "35", + "overhang_3_4_speed": "70%", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "6000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "6000", + "outer_wall_acceleration": "3000", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json new file mode 100644 index 0000000000..76beb4e842 --- /dev/null +++ b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json @@ -0,0 +1,18 @@ +{ + "from": "system", + "inherits": "0.40mm SPEED @MK4S HF0.8", + "instantiation": "true", + "name": "0.40mm SPEED @CORE One HF 0.8", + "type": "process", + "overhang_2_4_speed": "45", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json new file mode 100644 index 0000000000..b7c0106f74 --- /dev/null +++ b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json @@ -0,0 +1,20 @@ +{ + "from": "system", + "inherits": "0.40mm STRUCTURAL @MK4S HF0.6", + "instantiation": "true", + "name": "0.40mm STRUCTURAL @CORE One HF 0.6", + "type": "process", + "overhang_2_4_speed": "35", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json new file mode 100644 index 0000000000..80c0825146 --- /dev/null +++ b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json @@ -0,0 +1,21 @@ +{ + "from": "system", + "inherits": "0.40mm STRUCTURAL @MK4S HF0.8", + "instantiation": "true", + "name": "0.40mm STRUCTURAL @CORE One HF 0.8", + "type": "process", + "overhang_2_4_speed": "40", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "4000", + "sparse_infill_acceleration": "6000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/", + "inner_wall_acceleration": "2500", + "outer_wall_acceleration": "1500", + "top_surface_acceleration": "2000" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json b/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json new file mode 100644 index 0000000000..f85413ae63 --- /dev/null +++ b/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json @@ -0,0 +1,18 @@ +{ + "from": "system", + "inherits": "0.55mm DRAFT @MK4S 0.8", + "instantiation": "true", + "name": "0.55mm DRAFT @CORE One 0.8", + "type": "process", + "top_surface_speed": "2000", + "inner_wall_acceleration": "2500", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/" +} \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json new file mode 100644 index 0000000000..70ac34b19d --- /dev/null +++ b/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json @@ -0,0 +1,18 @@ +{ + "from": "system", + "inherits": "0.55mm SPEED @MK4S HF0.8", + "instantiation": "true", + "name": "0.55mm SPEED @CORE One HF 0.8", + "type": "process", + "overhang_2_4_speed": "45", + "top_surface_speed": "2000", + "travel_speed": "350", + "travel_acceleration": "7000", + "default_acceleration": "3000", + "support_interface_top_layers": "3", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "45", + "internal_solid_infill_acceleration": "5000", + "sparse_infill_acceleration": "7000", + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/" +} \ No newline at end of file From a37d648370aba557282fd70f7d57987b6f1a9ad4 Mon Sep 17 00:00:00 2001 From: yw4z Date: Sat, 3 May 2025 07:01:09 +0300 Subject: [PATCH 07/14] Match UI style of object list (#9494) * Update GUI_ObjectList.cpp * fix scaling issue on arrow * Update GUI_ObjectList.cpp * Update name column on Linux as well * Always use column width from `m_columns_width` * Always use column width from `m_columns_width` * Remove object list extra horizontal spacing on macOS * Remove object list header * Avoid negative width * Fix compile error --------- Co-authored-by: Noisyfox --- src/slic3r/CMakeLists.txt | 1 + src/slic3r/GUI/GUI_ObjectList.cpp | 80 ++++++++++++++++++++----------- src/slic3r/GUI/GUI_Utils.hpp | 4 ++ src/slic3r/GUI/GUI_UtilsMac.mm | 19 ++++++++ 4 files changed, 75 insertions(+), 29 deletions(-) create mode 100644 src/slic3r/GUI/GUI_UtilsMac.mm diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 628aab75b5..b264030d76 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -595,6 +595,7 @@ if (APPLE) GUI/Mouse3DHandlerMac.mm GUI/InstanceCheckMac.mm GUI/InstanceCheckMac.h + GUI/GUI_UtilsMac.mm GUI/wxMediaCtrl2.mm GUI/wxMediaCtrl2.h ) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index e4e4989ac2..ac2ada113e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -83,15 +83,49 @@ class wxRenderer : public wxDelegateRendererNative { public: wxRenderer() : wxDelegateRendererNative(wxRendererNative::Get()) {} - virtual void DrawItemSelectionRect(wxWindow *win, - wxDC& dc, - const wxRect& rect, - int flags = 0) wxOVERRIDE - { GetGeneric().DrawItemSelectionRect(win, dc, rect, flags); } + virtual void DrawItemSelectionRect(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0) override + { // ORCA draw selection background to improve consistency between platforms + dc.SetBrush(StateColor::darkModeColorFor(wxColour("#BFE1DE"))); + dc.DrawRectangle(rect); + //GetGeneric().DrawItemSelectionRect(win, dc, rect, flags); + } + virtual void DrawFocusRect( wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0) override + { // ORCA draw focus rectangle to improve consistency between platforms + dc.SetPen( StateColor::darkModeColorFor(wxColour("#009688"))); + dc.DrawRectangle(rect); + } + virtual void DrawTreeItemButton( wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0) override + { // ORCA draw custom triangle to improve consistency between platforms + dc.SetPen( StateColor::darkModeColorFor(wxColour("#7C8282"))); + dc.SetBrush(StateColor::darkModeColorFor(wxColour("#7C8282"))); + bool expanded = (flags == wxCONTROL_EXPANDED || flags == (wxCONTROL_CURRENT | wxCONTROL_EXPANDED)); + wxRect r = rect; + // stretch rectangle depends on orientation + r.Deflate((expanded ? wxSize(4, 6) : wxSize(6, 4)) * (wxGetApp().em_unit() * .1)); + wxPoint triangle[3]; + triangle[0] = wxPoint(r.x, r.y); + triangle[1] = triangle[0] + wxPoint(r.width, expanded ? 0 :r.height/2); + triangle[2] = triangle[0] + wxPoint(expanded ? r.width/2 : 0, r.height); + dc.DrawPolygon(3, &triangle[0]); + } + virtual void DrawItemText( + wxWindow* win, + wxDC& dc, + const wxString& text, + const wxRect& rect, + int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, + int flags = 0, // wxCONTROL_SELECTED wxCONTROL_FOCUSED wxCONTROL_DISABLED + wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END + ) override + { // ORCA draw custom text to improve consistency between platforms + dc.SetFont(Label::Body_13); + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour("#262E30"))); // use same color for selected / non-selected + dc.DrawText(text,wxPoint(rect.x, rect.y)); + } }; ObjectList::ObjectList(wxWindow* parent) : - wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE) + wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE | wxNO_BORDER | wxDV_NO_HEADER) // ORCA: Remove border and header { wxGetApp().UpdateDVCDarkUI(this, true); @@ -103,7 +137,6 @@ ObjectList::ObjectList(wxWindow* parent) : SetFont(Label::sysFont(13)); #ifdef __WXMSW__ - GenericGetHeader()->SetFont(Label::sysFont(13)); static auto render = new wxRenderer; wxRendererNative::Set(render); #endif @@ -289,18 +322,12 @@ ObjectList::ObjectList(wxWindow* parent) : } else { m_last_size = this->GetSize(); } -#ifdef __WXGTK__ - // On GTK, the EnsureVisible call is postponed to Idle processing (see wxDataViewCtrl::m_ensureVisibleDefered). - // So the postponed EnsureVisible() call is planned for an item, which may not exist at the Idle processing time, if this wxEVT_SIZE - // event is succeeded by a delete of the currently active item. We are trying our luck by postponing the wxEVT_SIZE triggered EnsureVisible(), - // which seems to be working as of now. - this->CallAfter([this](){ ensure_current_item_visible(); }); -#else + update_name_column_width(); // BBS this->CallAfter([this]() { ensure_current_item_visible(); }); -#endif + e.Skip(); })); m_last_size = this->GetSize(); @@ -390,7 +417,7 @@ void ObjectList::create_objects_ctrl() AppendColumn(name_col); // column PrintableProperty (Icon) of the view control: - AppendBitmapColumn(" ", colPrint, wxOSX ? wxDATAVIEW_CELL_EDITABLE : wxDATAVIEW_CELL_INERT, 3*em, + AppendBitmapColumn(" ", colPrint, wxOSX ? wxDATAVIEW_CELL_EDITABLE : wxDATAVIEW_CELL_INERT, m_columns_width[colPrint]*em, wxALIGN_CENTER_HORIZONTAL, 0); // column Extruder of the view control: @@ -426,11 +453,11 @@ void ObjectList::create_objects_ctrl() // For some reason under OSX on 4K(5K) monitors in wxDataViewColumn constructor doesn't set width of column. // Therefore, force set column width. - if (wxOSX) - { +#ifdef __WXOSX__ + dataview_remove_insets(this); for (int cn = colName; cn < colCount; cn++) GetColumn(cn)->SetWidth(m_columns_width[cn] * em); - } +#endif } void ObjectList::get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxDataViewItem& input_item/* = wxDataViewItem(nullptr)*/) @@ -831,7 +858,8 @@ void ObjectList::update_objects_list_filament_column(size_t filaments_count) // set show/hide for this column set_filament_column_hidden(filaments_count == 1); //a workaround for a wrong last column width updating under OSX - GetColumn(colEditing)->SetWidth(25); + auto em = em_unit(this); + GetColumn(colEditing)->SetWidth(m_columns_width[colEditing]*em); m_prevent_update_filament_in_config = false; } @@ -859,7 +887,7 @@ void ObjectList::update_name_column_width() const } } - GetColumn(colName)->SetWidth(client_size.x - (others_width)*em); + GetColumn(colName)->SetWidth(max(0, client_size.x - (others_width)*em)); } void ObjectList::set_filament_column_hidden(const bool hide) const @@ -5470,14 +5498,8 @@ void ObjectList::msw_rescale() const int em = wxGetApp().em_unit(); - GetColumn(colName )->SetWidth(20 * em); - GetColumn(colPrint )->SetWidth( 3 * em); - GetColumn(colFilament)->SetWidth( 5 * em); - // BBS - GetColumn(colSupportPaint)->SetWidth(3 * em); - GetColumn(colColorPaint)->SetWidth(3 * em); - GetColumn(colSinking)->SetWidth(3 * em); - GetColumn(colEditing )->SetWidth( 3 * em); + for (int cn = colName; cn < colCount; cn++) + GetColumn(cn)->SetWidth(m_columns_width[cn] * em); // rescale/update existing items with bitmaps m_objects_model->Rescale(); diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index a0f4308f1a..66b4c96230 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -493,6 +494,9 @@ bool load_image(const std::string& filename, wxImage &image); bool generate_image(const std::string &filename, wxImage &image, wxSize img_size, int method = GERNERATE_IMAGE_RESIZE); int get_dpi_for_window(const wxWindow *window); +#ifdef __WXOSX__ +void dataview_remove_insets(wxDataViewCtrl* dv); +#endif }} diff --git a/src/slic3r/GUI/GUI_UtilsMac.mm b/src/slic3r/GUI/GUI_UtilsMac.mm new file mode 100644 index 0000000000..46ee9dce7e --- /dev/null +++ b/src/slic3r/GUI/GUI_UtilsMac.mm @@ -0,0 +1,19 @@ + +#import +#import "GUI_Utils.hpp" + +namespace Slic3r { +namespace GUI { + +void dataview_remove_insets(wxDataViewCtrl* dv) { + NSScrollView* scrollview = (NSScrollView*) ((wxCocoaDataViewControl*)dv->GetDataViewPeer())->GetWXWidget(); + NSOutlineView* outlineview = scrollview.documentView; + [outlineview setIntercellSpacing: NSMakeSize(0.0, 1.0)]; + if (@available(macOS 11, *)) { + [outlineview setStyle:NSTableViewStylePlain]; + } +} + +} +} + From 81f1cd45320f87b8f74c16a3cb48516fbcbcef65 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sat, 3 May 2025 18:06:04 +0800 Subject: [PATCH 08/14] Fix filament/printer selection loading page translation (#9530) --- resources/web/guide/0/load.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/web/guide/0/load.js b/resources/web/guide/0/load.js index 4cb2729da8..424c9ebdb3 100644 --- a/resources/web/guide/0/load.js +++ b/resources/web/guide/0/load.js @@ -3,6 +3,8 @@ var TargetPage=null; function OnInit() { + TranslatePage(); + TargetPage=GetQueryString("target"); //setTimeout("JumpToTarget()",20*1000); From 86f4c3a014565832ce657c94de298d1992157a49 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sat, 3 May 2025 19:26:37 +0800 Subject: [PATCH 09/14] PA calib: Don't decrease speed too much for the speed trick line (#9358) * Don't decrease speed too much for the speed trick line (SoftFever/OrcaSlicer#9354) * Make sure no negative accel/speed --- src/libslic3r/calib.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index ad52476dbd..e7cc7a8932 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -676,9 +676,9 @@ CustomGCode::Info CalibPressureAdvancePattern::generate_custom_gcodes(const Dyna /* Draw a line at slightly slower accel and speed in order to trick gcode writer to force update acceleration and speed. * We do this since several tests may be generated by their own gcode writers which are * not aware about their neighbours updating acceleration/speed */ - gcode << m_writer.set_print_acceleration(accel - 10); + gcode << m_writer.set_print_acceleration(std::max(1, accel - 1)); gcode << move_to(Vec2d(m_starting_point.x(), m_starting_point.y()), m_writer, "Move to starting point", zhop_height, layer_height); - gcode << draw_line(m_writer, Vec2d(m_starting_point.x(), m_starting_point.y() + frame_size_y()), line_width(), height_layer(), speed_adjust(speed_perimeter() - 10), "Accel/flow trick line"); + gcode << draw_line(m_writer, Vec2d(m_starting_point.x(), m_starting_point.y() + frame_size_y()), line_width(), height_layer(), speed_adjust(std::max(1, speed_perimeter() - 1)), "Accel/flow trick line"); gcode << m_writer.set_print_acceleration(accel); } From 038b25627ee5524f105ada61ae1be2b891ae6d6f Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Sun, 4 May 2025 16:02:15 +0800 Subject: [PATCH 10/14] Show proper printer names on printer selection page (#9363) * Show actual printer name from sub_path files on printer selection screen * Merge branch 'main' into bugfox/preset-name-consistency --- resources/web/guide/21/21.js | 6 +++--- resources/web/guide/24/24.js | 6 +++--- src/slic3r/GUI/WebGuideDialog.cpp | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/resources/web/guide/21/21.js b/resources/web/guide/21/21.js index 4ade5cb150..cd359610b6 100644 --- a/resources/web/guide/21/21.js +++ b/resources/web/guide/21/21.js @@ -105,7 +105,7 @@ function HandleModelList( pVal ) let CoverImage=OneModel['cover']; ModelHtml[strVendor]+='
'+ '
'+ -'
'+OneModel['model']+'
'+ HtmlNozzel +'
'; +'
'+OneModel['name']+'
'+ HtmlNozzel +''; } //Update Nozzel Html Append @@ -224,7 +224,7 @@ function FilterModelList(keyword) { let OneModel = pModel[n]; let strVendor = OneModel['vendor']; - let search = (OneModel['model'] + '\0' + strVendor).toLowerCase(); + let search = (OneModel['name'] + '\0' + strVendor).toLowerCase(); if (!kwSplit.every(s => search.includes(s))) continue; @@ -269,7 +269,7 @@ function FilterModelList(keyword) { let CoverImage = OneModel['cover']; ModelHtml[strVendor] += '
' + '
' + - '
' + OneModel['model'] + '
' + HtmlNozzel + '
'; + '
' + OneModel['name'] + '
' + HtmlNozzel + ''; } //Update Nozzel Html Append diff --git a/resources/web/guide/24/24.js b/resources/web/guide/24/24.js index a536da029b..f653a4298d 100644 --- a/resources/web/guide/24/24.js +++ b/resources/web/guide/24/24.js @@ -105,7 +105,7 @@ function HandleModelList( pVal ) let CoverImage=OneModel['cover']; ModelHtml[strVendor]+='
'+ '
'+ -'
'+OneModel['model']+'
'+ HtmlNozzel +'
'; +'
'+OneModel['name']+'
'+ HtmlNozzel +''; } //Update Nozzel Html Append @@ -224,7 +224,7 @@ function FilterModelList(keyword) { let OneModel = pModel[n]; let strVendor = OneModel['vendor']; - let search = (OneModel['model'] + '\0' + strVendor).toLowerCase(); + let search = (OneModel['name'] + '\0' + strVendor).toLowerCase(); if (!kwSplit.every(s => search.includes(s))) continue; @@ -269,7 +269,7 @@ function FilterModelList(keyword) { let CoverImage = OneModel['cover']; ModelHtml[strVendor] += '
' + '
' + - '
' + OneModel['model'] + '
' + HtmlNozzel + '
'; + '
' + OneModel['name'] + '
' + HtmlNozzel + ''; } //Update Nozzel Html Append diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index 95994e999b..eb1006b036 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -1212,6 +1212,7 @@ int GuideFrame::LoadProfileFamily(std::string strVendor, std::string strFilePath json pm = json::parse(contents); // wxLogMessage("GUIDE: json_path2 loaded"); + OneModel["name"] = pm["name"]; OneModel["vendor"] = strVendor; std::string NozzleOpt = pm["nozzle_diameter"]; StringReplace(NozzleOpt, " ", ""); From a91ee67ac7f2936f3ec3fb7522c07d0f7a6b4ca6 Mon Sep 17 00:00:00 2001 From: yw4z Date: Sun, 4 May 2025 11:38:38 +0300 Subject: [PATCH 11/14] 2D Bed (Bed shape dialog) improvements (#9524) * init * fix grid & text colors for light theme * scale axis * fix custom bed plate not appearing * merge functions for generating gridlines * simplify * Fix flatpak build --------- Co-authored-by: Noisyfox --- flatpak/io.github.softfever.OrcaSlicer.yml | 2 +- src/slic3r/GUI/2DBed.cpp | 141 +++++++++++++++++---- src/slic3r/GUI/2DBed.hpp | 5 + src/slic3r/GUI/3DBed.cpp | 10 +- src/slic3r/GUI/3DBed.hpp | 6 + src/slic3r/GUI/BedShapeDialog.cpp | 6 +- src/slic3r/GUI/PartPlate.cpp | 62 ++------- 7 files changed, 147 insertions(+), 85 deletions(-) diff --git a/flatpak/io.github.softfever.OrcaSlicer.yml b/flatpak/io.github.softfever.OrcaSlicer.yml index ae29d671de..4395cc47ca 100755 --- a/flatpak/io.github.softfever.OrcaSlicer.yml +++ b/flatpak/io.github.softfever.OrcaSlicer.yml @@ -298,7 +298,7 @@ modules: - | mkdir -p build CXXFLAGS=-std=gnu++20 cmake . -B build \ - -DSLIC3R_PCH=OFF \ + -DSLIC3R_PCH=ON \ -DSLIC3R_FHS=ON \ -DSLIC3R_GTK=3 \ -DSLIC3R_STATIC=ON \ diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp index 2921e064cf..a08c47c0ef 100644 --- a/src/slic3r/GUI/2DBed.cpp +++ b/src/slic3r/GUI/2DBed.cpp @@ -1,6 +1,9 @@ #include "2DBed.hpp" #include "GUI_App.hpp" +#include "3DBed.hpp" +#include "PartPlate.hpp" + #include #include "libslic3r/BoundingBox.hpp" @@ -21,6 +24,63 @@ wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(25 * wxGetApp().em_unit(), - #endif /*__APPLE__*/ } +int Bed_2D::calculate_grid_step(const BoundingBox& bb) +{ + // Orca: use 500 x 500 bed size as baseline. + int min_edge = (bb.size() / ((coord_t) scale_(1)) ).minCoeff(); // Get short edge + // if the grid is too dense, we increase the step + return min_edge >= 6000 ? 100 // Short edge >= 6000mm Main Grid: 5 x 100 = 500mm + : min_edge >= 1200 ? 50 // Short edge >= 1200mm Main Grid: 5 x 50 = 250mm + : min_edge >= 600 ? 20 // Short edge >= 600mm Main Grid: 5 x 20 = 100mm + : 10; // Short edge < 600mm Main Grid: 5 x 10 = 50mm +} + +std::vector Bed_2D::generate_grid(const ExPolygon& poly, const BoundingBox& bb, const Vec2d& origin, const float& step, const float& scale) +{ + Polylines lines_thin, lines_bold; + int count = 0; + + // ORCA draw grid lines relative to origin + for (coord_t x = origin.x(); x >= bb.min(0); x -= step) { // Negative X axis + (count % 5 ? lines_thin : lines_bold).push_back(Polyline( + Point(x, bb.min(1)), + Point(x, bb.max(1)) + )); + count ++; + } + count = 0; + for (coord_t x = origin.x(); x <= bb.max(0); x += step) { // Positive X axis + (count % 5 ? lines_thin : lines_bold).push_back(Polyline( + Point(x, bb.min(1)), + Point(x, bb.max(1)) + )); + count ++; + } + count = 0; + for (coord_t y = origin.y(); y >= bb.min(1); y -= step) { // Negative Y axis + (count % 5 ? lines_thin : lines_bold).push_back(Polyline( + Point(bb.min(0), y), + Point(bb.max(0), y) + )); + count ++; + } + count = 0; + for (coord_t y = origin.y(); y <= bb.max(1); y += step) { // Positive Y axis + (count % 5 ? lines_thin : lines_bold).push_back(Polyline( + Point(bb.min(0), y), + Point(bb.max(0), y) + )); + count ++; + } + + std::vector grid; + // clip with a slightly grown expolygon because our lines lay on the contours and may get erroneously clipped + auto scaled_poly = offset(poly, scale); + grid.push_back(intersection_pl(lines_thin, scaled_poly)); + grid.push_back(intersection_pl(lines_bold, scaled_poly)); + return grid; +} + void Bed_2D::repaint(const std::vector& shape) { wxAutoBufferedPaintDC dc(this); @@ -28,6 +88,7 @@ void Bed_2D::repaint(const std::vector& shape) auto ch = GetSize().GetHeight(); // when canvas is not rendered yet, size is 0, 0 if (cw == 0) return ; + bool is_dark = wxGetApp().dark_mode(); if (m_user_drawn_background) { // On all systems the AutoBufferedPaintDC() achieves double buffering. @@ -35,7 +96,7 @@ void Bed_2D::repaint(const std::vector& shape) // and on Linux / GTK the background is erased to gray color. // Fill DC with the background on Windows & Linux / GTK. wxColour color; - if (wxGetApp().dark_mode()) {// SetBackgroundColour + if (is_dark) {// SetBackgroundColour color = wxColour(45, 45, 49); } else { @@ -58,7 +119,6 @@ void Bed_2D::repaint(const std::vector& shape) auto ccenter = cbb.center(); // get bounding box of bed shape in G - code coordinates - auto bed_polygon = Polygon::new_scale(shape); auto bb = BoundingBoxf(shape); bb.merge(Vec2d(0, 0)); // origin needs to be in the visible area auto bw = bb.size()(0); @@ -75,8 +135,16 @@ void Bed_2D::repaint(const std::vector& shape) m_scale_factor = sfactor; m_shift = Vec2d(shift(0) + cbb.min(0), shift(1) - (cbb.max(1) - ch)); + // ORCA match colors + ColorRGBA bed_rgba = is_dark ? Bed3D::DEFAULT_MODEL_COLOR_DARK : Bed3D::DEFAULT_MODEL_COLOR; + std::string bed_color = encode_color(ColorRGBA(bed_rgba[0] * 0.8f, bed_rgba[1] * 0.8f,bed_rgba[2] * 0.8f, bed_rgba[3])); + ColorRGBA grid_color = is_dark ? PartPlate::LINE_TOP_SEL_DARK_COLOR : PartPlate::LINE_TOP_SEL_COLOR; + std::string lines_bold_color = encode_color(grid_color); + std::string lines_thin_color = encode_color(grid_color * 0.85); + wxColour text_color = wxColour(lines_bold_color); + // draw bed fill - dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxBRUSHSTYLE_SOLID)); + dc.SetBrush(wxBrush(wxColour(bed_color), wxBRUSHSTYLE_SOLID)); wxPointList pt_list; for (auto pt : shape) { @@ -85,36 +153,40 @@ void Bed_2D::repaint(const std::vector& shape) } dc.DrawPolygon(&pt_list, 0, 0); - // draw grid - auto step = 10; // 1cm grid - Polylines polylines; - for (auto x = bb.min(0) - fmod(bb.min(0), step) + step; x < bb.max(0); x += step) { - polylines.push_back(Polyline::new_scale({ Vec2d(x, bb.min(1)), Vec2d(x, bb.max(1)) })); - } - for (auto y = bb.min(1) - fmod(bb.min(1), step) + step; y < bb.max(1); y += step) { - polylines.push_back(Polyline::new_scale({ Vec2d(bb.min(0), y), Vec2d(bb.max(0), y) })); - } - polylines = intersection_pl(polylines, bed_polygon); + ExPolygon bed_poly; + for (const Vec2d& p : shape) + bed_poly.contour.append({p(0), p(1)}); + auto bed_bb = bed_poly.contour.bounding_box(); + int step = calculate_grid_step(bed_bb); + auto grid_lines = generate_grid(bed_poly, bed_bb, m_pos, step, 1.0f); - dc.SetPen(wxPen(wxColour(230, 230, 230), 1, wxPENSTYLE_SOLID)); - for (auto pl : polylines) - { - for (size_t i = 0; i < pl.points.size()-1; i++) { - Point pt1 = to_pixels(unscale(pl.points[i]), ch); - Point pt2 = to_pixels(unscale(pl.points[i + 1]), ch); + // clip with a slightly grown expolygon because our lines lay on the contours and may get erroneously clipped + dc.SetPen(wxPen(wxColour(lines_thin_color), 1, wxPENSTYLE_SOLID)); + for (auto pl : grid_lines[0]) { + for (size_t i = 0; i < pl.points.size() - 1; i++) { + Point pt1 = to_pixels(pl.points[i ], ch); + Point pt2 = to_pixels(pl.points[i+1], ch); + dc.DrawLine(pt1(0), pt1(1), pt2(0), pt2(1)); + } + } + dc.SetPen(wxPen(wxColour(lines_bold_color), 1, wxPENSTYLE_SOLID)); + for (auto pl : grid_lines[1]) { + for (size_t i = 0; i < pl.points.size() - 1; i++) { + Point pt1 = to_pixels(pl.points[i ], ch); + Point pt2 = to_pixels(pl.points[i+1], ch); dc.DrawLine(pt1(0), pt1(1), pt2(0), pt2(1)); } } // draw bed contour - dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxPENSTYLE_SOLID)); - dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); + dc.SetPen( wxPen( wxColour(lines_bold_color), 1, wxPENSTYLE_SOLID)); + dc.SetBrush(wxBrush(wxColour(lines_bold_color), wxBRUSHSTYLE_TRANSPARENT)); dc.DrawPolygon(&pt_list, 0, 0); auto origin_px = to_pixels(Vec2d(0, 0), ch); // draw axes - auto axes_len = 50; + auto axes_len = 5 * wxGetApp().em_unit(); // scale axis auto arrow_len = 6; auto arrow_angle = Geometry::deg2rad(45.0); dc.SetPen(wxPen(wxColour(255, 0, 0), 2, wxPENSTYLE_SOLID)); // red @@ -139,13 +211,26 @@ void Bed_2D::repaint(const std::vector& shape) dc.DrawCircle(origin_px(0), origin_px(1), 3); static const auto origin_label = wxString("(0,0)"); - dc.SetTextForeground(wxColour(0, 0, 0)); + dc.SetTextForeground(wxColour("#FFFFFF")); dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); auto extent = dc.GetTextExtent(origin_label); - const auto origin_label_x = origin_px(0) <= cw / 2 ? origin_px(0) + 1 : origin_px(0) - 1 - extent.GetWidth(); - const auto origin_label_y = origin_px(1) <= ch / 2 ? origin_px(1) + 1 : origin_px(1) - 1 - extent.GetHeight(); + const auto origin_label_x = origin_px(0) + 2; // ORCA always draw (0,0) text in axes bounding box + const auto origin_label_y = origin_px(1) - extent.GetHeight() - 2; + dc.SetPen( wxPen( wxColour(wxColour(bed_color)), 1, wxPENSTYLE_SOLID)); + dc.SetBrush(wxBrush(wxColour(wxColour(bed_color)), wxBRUSHSTYLE_SOLID)); + dc.DrawRectangle(wxPoint(origin_label_x, origin_label_y), extent); // ORCA draw a background to origin position text to improve readability when overlaps with grid dc.DrawText(origin_label, origin_label_x, origin_label_y); + // ORCA add grid size value as information for large scale beds + auto grid_label = wxString("1x1 Grid: " + std::to_string(step) + " mm"); + Point draw_bb = to_pixels(Vec2d( + std::min(m_pos(0),bb.min(0)), + std::min(m_pos(1),bb.min(1)) + ),ch); + dc.SetTextForeground(wxColour(StateColor::darkModeColorFor("#262E30"))); + dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); + dc.DrawText(grid_label, draw_bb(0), draw_bb(1) + 5); + // draw current position if (m_pos!= Vec2d(0, 0)) { auto pos_px = to_pixels(m_pos, ch); @@ -166,6 +251,12 @@ Point Bed_2D::to_pixels(const Vec2d& point, int height) return Point(p(0) + Border, height - p(1) + Border); } +Point Bed_2D::to_pixels(const Point& point, int height) +{ + auto p = point * m_scale_factor + Point(m_shift); + return Point(p(0) + Border, height - p(1) + Border); +} + void Bed_2D::set_pos(const Vec2d& pos) { m_pos = pos; diff --git a/src/slic3r/GUI/2DBed.hpp b/src/slic3r/GUI/2DBed.hpp index 80926bea72..e6dd1add77 100644 --- a/src/slic3r/GUI/2DBed.hpp +++ b/src/slic3r/GUI/2DBed.hpp @@ -18,11 +18,16 @@ class Bed_2D : public wxPanel Vec2d m_pos = Vec2d::Zero(); Point to_pixels(const Vec2d& point, int height); + Point to_pixels(const Point& point, int height); void set_pos(const Vec2d& pos); public: explicit Bed_2D(wxWindow* parent); + static int calculate_grid_step(const BoundingBox& bb); + + static std::vector generate_grid(const ExPolygon& poly, const BoundingBox& pp_bbox, const Vec2d& origin, const float& step, const float& scale); + void repaint(const std::vector& shape); }; diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 9fddc21262..5686375098 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -28,10 +28,6 @@ #endif static const float GROUND_Z = -0.04f; -static const Slic3r::ColorRGBA DEFAULT_MODEL_COLOR = { 0.3255f, 0.337f, 0.337f, 1.0f }; -static const Slic3r::ColorRGBA DEFAULT_MODEL_COLOR_DARK = { 0.255f, 0.255f, 0.283f, 1.0f }; -static const Slic3r::ColorRGBA DEFAULT_SOLID_GRID_COLOR = { 0.9f, 0.9f, 0.9f, 1.0f }; -static const Slic3r::ColorRGBA DEFAULT_TRANSPARENT_GRID_COLOR = { 0.9f, 0.9f, 0.9f, 0.6f }; namespace Slic3r { namespace GUI { @@ -185,6 +181,12 @@ const float Bed3D::Axes::DefaultStemLength = 25.0f; const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius; const float Bed3D::Axes::DefaultTipLength = 5.0f; +// ORCA make bed colors accessable for 2D bed +ColorRGBA Bed3D::DEFAULT_MODEL_COLOR = { 0.3255f, 0.337f, 0.337f, 1.0f }; +ColorRGBA Bed3D::DEFAULT_MODEL_COLOR_DARK = { 0.255f, 0.255f, 0.283f, 1.0f }; +ColorRGBA Bed3D::DEFAULT_SOLID_GRID_COLOR = { 0.9f, 0.9f, 0.9f, 1.0f }; +ColorRGBA Bed3D::DEFAULT_TRANSPARENT_GRID_COLOR = { 0.9f, 0.9f, 0.9f, 0.6f }; + ColorRGBA Bed3D::AXIS_X_COLOR = ColorRGBA::X(); ColorRGBA Bed3D::AXIS_Y_COLOR = ColorRGBA::Y(); ColorRGBA Bed3D::AXIS_Z_COLOR = ColorRGBA::Z(); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 1f3d3aab8a..c138e8c8dc 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -47,6 +47,12 @@ bool init_model_from_poly(GLModel &model, const ExPolygon &poly, float z); class Bed3D { public: + // ORCA make bed colors accessable for 2D bed + static ColorRGBA DEFAULT_MODEL_COLOR; + static ColorRGBA DEFAULT_MODEL_COLOR_DARK; + static ColorRGBA DEFAULT_SOLID_GRID_COLOR; + static ColorRGBA DEFAULT_TRANSPARENT_GRID_COLOR; + static ColorRGBA AXIS_X_COLOR; static ColorRGBA AXIS_Y_COLOR; static ColorRGBA AXIS_Z_COLOR; diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp index 67814d66be..e70a888ecf 100644 --- a/src/slic3r/GUI/BedShapeDialog.cpp +++ b/src/slic3r/GUI/BedShapeDialog.cpp @@ -458,13 +458,13 @@ void BedShapePanel::set_shape(const Pointfs& points) { BedShape shape(points); - m_shape_options_book->SetSelection(int(shape.get_page_type())); - shape.apply_optgroup_values(m_optgroups[int(shape.get_page_type())]); - // Copy the polygon to the canvas, make a copy of the array, if custom shape is selected if (shape.is_custom()) m_loaded_shape = points; + m_shape_options_book->SetSelection(int(shape.get_page_type())); + shape.apply_optgroup_values(m_optgroups[int(shape.get_page_type())]); + update_shape(); return; diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 2b022d762d..f45ae34c46 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -30,6 +30,7 @@ #include "libslic3r/PresetBundle.hpp" #include "BackgroundSlicingProcess.hpp" #include "Widgets/Label.hpp" +#include "2DBed.hpp" #include "3DBed.hpp" #include "PartPlate.hpp" #include "Camera.hpp" @@ -466,65 +467,22 @@ void PartPlate::calc_gridlines(const ExPolygon& poly, const BoundingBox& pp_bbox m_gridlines.reset(); m_gridlines_bolder.reset(); - Polylines axes_lines, axes_lines_bolder; - int count = 0; - int step = 10; // Uses up to 599mm Main Grid: 10 x 5 = 50mm - // Orca: use 500 x 500 bed size as baseline. - // if the grid is too dense, we increase the step - auto min_edge_scaled = (pp_bbox.size() / ((coord_t) scale_(1))).minCoeff(); - if ( min_edge_scaled >= 6000) // Switch when short edge >= 6000mm Main Grid: 100 x 5 = 500mm - step = 100; - else if (min_edge_scaled >= 1200) // Switch when short edge >= 1200mm Main Grid: 50 x 5 = 250mm - step = 50; - else if (min_edge_scaled >= 600) // Switch when short edge >= 600mm Main Grid: 20 x 5 = 100mm - step = 20; + // calculate and generate grid + int step = Bed_2D::calculate_grid_step(pp_bbox); + Vec2d scaled_origin = Vec2d(scale_(m_origin.x()),scale_(m_origin.x())); + auto grid_lines = Bed_2D::generate_grid(poly, pp_bbox, scaled_origin, scale_(step), SCALED_EPSILON); - // ORCA draw grid lines relative to origin - for (coord_t x = scale_(m_origin.x()); x >= pp_bbox.min(0); x -= scale_(step)) { // Negative X axis - (count % 5 == 0 ? axes_lines_bolder : axes_lines).push_back(Polyline( - Point(x, pp_bbox.min(1)), - Point(x, pp_bbox.max(1)) - )); - count ++; - } - count = 0; - for (coord_t x = scale_(m_origin.x()); x <= pp_bbox.max(0); x += scale_(step)) { // Positive X axis - (count % 5 == 0 ? axes_lines_bolder : axes_lines).push_back(Polyline( - Point(x, pp_bbox.min(1)), - Point(x, pp_bbox.max(1)) - )); - count ++; - } - count = 0; - for (coord_t y = scale_(m_origin.y()); y >= pp_bbox.min(1); y -= scale_(step)) { // Negative Y axis - (count % 5 == 0 ? axes_lines_bolder : axes_lines).push_back(Polyline( - Point(pp_bbox.min(0), y), - Point(pp_bbox.max(0), y) - )); - count ++; - } - count = 0; - for (coord_t y = scale_(m_origin.y()); y <= pp_bbox.max(1); y += scale_(step)) { // Positive Y axis - (count % 5 == 0 ? axes_lines_bolder : axes_lines).push_back(Polyline( - Point(pp_bbox.min(0), y), - Point(pp_bbox.max(0), y) - )); - count ++; - } - count = 0; - - // clip with a slightly grown expolygon because our lines lay on the contours and may get erroneously clipped - Lines gridlines = to_lines(intersection_pl(axes_lines, offset(poly, (float)SCALED_EPSILON))); - Lines gridlines_bolder = to_lines(intersection_pl(axes_lines_bolder, offset(poly, (float)SCALED_EPSILON))); + Lines lines_thin = to_lines(grid_lines[0]); + Lines lines_bold = to_lines(grid_lines[1]); // append bed contours Lines contour_lines = to_lines(poly); - std::copy(contour_lines.begin(), contour_lines.end(), std::back_inserter(gridlines)); + std::copy(contour_lines.begin(), contour_lines.end(), std::back_inserter(lines_thin)); - if (!init_model_from_lines(m_gridlines, gridlines, GROUND_Z_GRIDLINE)) + if (!init_model_from_lines(m_gridlines , lines_thin, GROUND_Z_GRIDLINE)) BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Unable to create bed grid lines\n"; - if (!init_model_from_lines(m_gridlines_bolder, gridlines_bolder, GROUND_Z_GRIDLINE)) + if (!init_model_from_lines(m_gridlines_bolder, lines_bold, GROUND_Z_GRIDLINE)) BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Unable to create bed grid lines\n"; } From e9eb6f9d956fca2cb14a331737a810f153c620bd Mon Sep 17 00:00:00 2001 From: Lee Jong Mun <43285072+crwusiz@users.noreply.github.com> Date: Sun, 4 May 2025 19:04:52 +0900 Subject: [PATCH 12/14] kor translation update (#9423) * kor translation update --- localization/i18n/ko/OrcaSlicer_ko.po | 201 +++++++++++++------------- 1 file changed, 104 insertions(+), 97 deletions(-) diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 753188a3e2..ad21eb895b 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -8,16 +8,15 @@ msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-16 22:32+0800\n" -"PO-Revision-Date: 2025-03-04 04:56+0900\n" -"Last-Translator: ElectricalBoy " -"<15651807+ElectricalBoy@users.noreply.github.com>\n" -"Language-Team: crwusiz@gmail.com\n" +"PO-Revision-Date: 2025-04-20 21:25+0900\n" +"Last-Translator: crwusiz \n" +"Language-Team: \n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.5\n" +"X-Generator: Poedit 3.6\n" msgid "Supports Painting" msgstr "서포트 칠하기" @@ -216,7 +215,7 @@ msgid "in" msgstr "인치" msgid "mm" -msgstr "밀리미터" +msgstr "mm" msgid "Position" msgstr "위치" @@ -548,7 +547,7 @@ msgid "Detail level" msgstr "세부 레벨" msgid "Decimate ratio" -msgstr "데시메이트 비율" +msgstr "감소 비율" #, boost-format msgid "" @@ -1004,7 +1003,7 @@ msgstr "텍스트 방향을 카메라 쪽으로 향하게 합니다." #, boost-format msgid "Font \"%1%\" can't be used. Please select another." -msgstr "" +msgstr "글꼴 “%1%”를 사용할 수 없습니다. 다른 글꼴을 선택하세요." #, boost-format msgid "" @@ -1203,7 +1202,7 @@ msgstr "양각 방향의 크기입니다." #. TRN: The placeholder contains a number. #, boost-format msgid "Scale also changes amount of curve samples (%1%)" -msgstr "규모도 곡선 샘플의 양을 변경합니다(%1%)." +msgstr "규모도 곡선 샘플의 양을 변경합니다 (%1%)" msgid "Width of SVG." msgstr "SVG의 너비." @@ -1263,7 +1262,7 @@ msgid "SVG file does NOT contain a single path to be embossed (%1%)." msgstr "SVG 파일에는 양각할 단일 경로(%1%)가 포함되어 있지 않습니다." msgid "No feature" -msgstr "" +msgstr "기능 없음" msgid "Vertex" msgstr "꼭지점" @@ -1312,7 +1311,7 @@ msgstr "측정" msgid "" "Please confirm explosion ratio = 1,and please select at least one object" -msgstr "폭발 비율 = 1인지 확인하고 객체를 하나 이상 선택하십시오." +msgstr "폭발 비율 = 1인지 확인하고 객체를 하나 이상 선택하십시오" msgid "Please select at least one object." msgstr "객체를 하나 이상 선택하세요." @@ -3175,7 +3174,7 @@ msgstr "" #, boost-format msgid "A fatal error occurred: \"%1%\"" -msgstr "" +msgstr "치명적인 오류가 발생했습니다: “%1%”" msgid "Please save project and restart the program." msgstr "프로젝트를 저장하고 프로그램을 다시 시작하세요." @@ -4409,7 +4408,7 @@ msgid "Calibration step selection" msgstr "교정 단계 선택" msgid "Micro lidar calibration" -msgstr "마이크로 레이더 교정" +msgstr "마이크로 라이다 교정" msgid "Bed leveling" msgstr "베드 레벨링" @@ -4772,12 +4771,13 @@ msgid "Use Orthogonal View" msgstr "평행 투영 보기 사용" msgid "Auto Perspective" -msgstr "" +msgstr "자동 시점" msgid "" "Automatically switch between orthographic and perspective when changing from " "top/bottom/side views" msgstr "" +"상단/하단/측면 보기에서 변경할 때 직교와 투시 사이를 자동으로 전환합니다." msgid "Show &G-code Window" msgstr "Gcode 창 표시 (&G)" @@ -4930,7 +4930,7 @@ msgid "Overwrite file" msgstr "파일 덮어쓰기" msgid "Overwrite config" -msgstr "" +msgstr "구성 덮어쓰기" msgid "Yes to All" msgstr "모두 예" @@ -4989,7 +4989,7 @@ msgstr "" "다음과 같은 정보가 포함되어 있습니다:\n" "1. 프로세스 사전 설정\n" "2. 필라멘트 사전 설정\n" -"3. 프린터가 사전 설정" +"3. 프린터 사전 설정" msgid "Synchronization" msgstr "동기화" @@ -6096,7 +6096,7 @@ msgid "" " Do you want to scale to millimeters?" msgstr "" "%s 파일의 객체가 너무 작습니다. 단위가 미터나 인치일 수 있습니다.\n" -" 밀리미터 단위로 확장하시겠습니까?" +" mm 단위로 확장하시겠습니까?" msgid "Object too small" msgstr "객체가 너무 작음" @@ -6284,17 +6284,17 @@ msgstr "" "요." msgid "INFO:" -msgstr "" +msgstr "정보:" msgid "" "No accelerations provided for calibration. Use default acceleration value " -msgstr "" +msgstr "보정을 위해 가속도가 제공되지 않습니다. 기본 가속도 값 사용 " msgid "mm/s²" msgstr "mm/s²" msgid "No speeds provided for calibration. Use default optimal speed " -msgstr "" +msgstr "보정을 위한 속도가 제공되지 않습니다. 기본 최적 속도 사용 " msgid "mm/s" msgstr "mm/s" @@ -7825,7 +7825,7 @@ msgid "Recommended nozzle temperature range of this filament. 0 means no set" msgstr "이 필라멘트의 권장 노즐 온도 범위. 0은 설정하지 않음을 의미합니다" msgid "Flow ratio and Pressure Advance" -msgstr "압출량 비율 및 압력 사전" +msgstr "압출량 비율 및 PA" msgid "Print chamber temperature" msgstr "출력 챔버 온도" @@ -7938,7 +7938,7 @@ msgid "Auxiliary part cooling fan" msgstr "보조 출력물 냉각 팬" msgid "Exhaust fan" -msgstr "환기 팬" +msgstr "공기 여과 팬" msgid "During print" msgstr "출력 중" @@ -9413,6 +9413,8 @@ msgid "" "The prime tower is only supported for multiple objects if they are printed " "with the same support_top_z_distance" msgstr "" +"프라임 타워는 여러 오브젝트가 동일한 support_top_z_distance로 출력된 경우에" +"만 지원됩니다." msgid "" "The prime tower requires that all objects are sliced with the same layer " @@ -9427,7 +9429,7 @@ msgstr "" msgid "" "One or more object were assigned an extruder that the printer does not have." -msgstr "" +msgstr "하나 이상의 객체에 프린터에 없는 압출기가 할당되었습니다." msgid "Too small line width" msgstr "선 너비가 너무 작습니다" @@ -9441,6 +9443,9 @@ msgid "" "support_interface_filament == 0), all nozzles have to be of the same " "diameter." msgstr "" +"노즐 직경이 다른 여러 개의 압출기로 출력. 현재 필라멘트를 사용하여 서포트를 " +"출하려면(support_filament == 0 또는 support_interface_ilament == 0) 모든 노즐" +"의 직경이 같아야 합니다." msgid "" "The prime tower requires that support has the same layer height with object." @@ -9450,7 +9455,7 @@ msgid "" "Organic support tree tip diameter must not be smaller than support material " "extrusion width." msgstr "" -"유기체 서포트 나무 끝 직경은 서포트 재료 압출 너비보다 작아서는 안 됩니다." +"유기체 서포트 트리 끝 직경은 서포트 재료 압출 너비보다 작아서는 안 됩니다." msgid "" "Organic support branch diameter must not be smaller than 2x support material " @@ -9461,7 +9466,7 @@ msgstr "" msgid "" "Organic support branch diameter must not be smaller than support tree tip " "diameter." -msgstr "유기체 서포트 가지 직경은 서포트 나무 끝 직경보다 작을 수 없습니다." +msgstr "유기체 서포트 가지 직경은 서포트 트리 끝 직경보다 작을 수 없습니다." msgid "" "Support enforcers are used but support is not enabled. Please enable support." @@ -9916,7 +9921,7 @@ msgstr "" "2. 상단 및 하단 표면: 상단 및 하단 표면에만 갭 채우기를 적용하여 프린트 속도 " "균형을 맞추고, 솔리드 인필의 돌출 가능성을 줄이며, 상단 및 하단 표면에 핀홀 " "틈이 없도록 합니다\n" -"3. 비활성: 모든 솔리드 인필 영역에 대해 갭 채우기를 비활성화합니다.\n" +"3. 미사용: 모든 솔리드 인필 영역에 대해 갭 채우기를 사용하지않습니다.\n" "\n" "기존 경계 생성기를 사용하는 경우 경계 사이에 전체 너비 선이 맞지 않는 경우 경" "계 사이에 갭 채우기가 생성될 수도 있습니다. 해당 경계선 간격 채우기는 이 설정" @@ -9937,7 +9942,7 @@ msgid "Top and bottom surfaces" msgstr "상단 및 하단 표면" msgid "Nowhere" -msgstr "아무데도" +msgstr "미사용" msgid "Force cooling for overhangs and bridges" msgstr "오버행 및 브릿지에 대한 강제 냉각" @@ -9986,7 +9991,7 @@ msgid "" "by the layer beneath it. Setting this value to 0% forces the cooling fan to " "run for all outer walls, regardless of the overhang degree." msgstr "" -"오버행가 이 지정된 임계값을 초과하면 아래에 설정된 '오버행 팬 속도'로 냉각 팬" +"오버행이 지정된 임계값을 초과하면 아래에 설정된 '오버행 팬 속도'로 냉각 팬" "이 강제로 작동합니다. 이 임계값은 백분율로 표시되며, 각 선 너비에서 그 아래 " "레이어가 지원하지 않는 부분을 나타냅니다. 이 값을 0%로 설정하면 돌출 정도에 " "관계없이 모든 외벽에 대해 냉각 팬이 강제로 작동합니다." @@ -10015,14 +10020,14 @@ msgid "" "It is recommended to leave it at 0 unless there is a specific model need not " "to." msgstr "" -"내부 브리징 각도 오버라이드. 0으로 두면 브리징 각도가 자동으로 계산됩니다. 그" +"내부 브릿지 각도 오버라이드. 0으로 두면 브릿지 각도가 자동으로 계산됩니다. 그" "렇지 않으면 제공된 각도가 내부 브릿지에 사용됩니다. 0 각도는 180°를 사용합니" "다.\n" "\n" "특정 모델이 필요하지 않는 한 0으로 두는 것이 좋습니다." msgid "External bridge density" -msgstr "외부 브지 밀도" +msgstr "외부 브릿지 밀도" msgid "" "Controls the density (spacing) of external bridge lines. 100% means solid " @@ -10165,7 +10170,7 @@ msgstr "" "상단 표면을 출력해야 하고 부분적으로 다른 레이어로 덮여 있는 경우 너비가 이 " "값 미만인 상단 레이어에서는 고려되지 않습니다. 이는 둘레로만 덮여야 하는 표면" "에서 '상단 둘레 하나'가 발동되지 않도록 하는 데 유용할 수 있습니다. 이 값은 " -"압출 너비의 mm 또는 % o로 설정됩니다.\n" +"압출 너비의 mm 또는 %로 설정됩니다.\n" "경고: 활성화된 경우, 의도치 않은 형상이 생성되는건 다음 레이어에 문자와 같은 " "일부 얇은 형상이 있기 때문입니다. 이러한 형상을 제거하려면 이 값을 0으로 설정" "하세요." @@ -10249,8 +10254,8 @@ msgstr "" "이 옵션은 카운터보어 구멍에 대한 브릿지를 생성하여 서포트 없이 출력할 수 있도" "록 합니다. 사용 가능한 모드는 다음과 같습니다.\n" "1. 없음: 브릿지가 생성되지 않습니다.\n" -"2. 부분적으로 브릿지됨: 지원되지 않는 영역의 일부만 브릿지됩니다.\n" -"3. 희생 레이어: 전체 희생 브릿지 레이어가 생성됩니다." +"2. 부분적 브릿지: 지원되지 않는 영역의 일부만 브릿지됩니다.\n" +"3. 희생층: 전체 희생 브릿지 레이어가 생성됩니다." msgid "Partially bridged" msgstr "부분적 브릿지" @@ -10747,7 +10752,7 @@ msgstr "" "어)를 보장합니다.\n" "없음: 솔리드 채우기가 어디에도 추가되지 않습니다. 주의: 모델에 경사면이 있는 " "경우 이 옵션을 주의해서 사용하십시오.\n" -"중요 사항: 벽에 견고한 채우기를 추가하지 마십시오.\n" +"중요한 것만: 벽에 견고한 채우기를 추가하지 마십시오.\n" "보통: 경사가 심한 표면에만 견고한 채우기를 추가합니다.\n" "모두: 적합한 모든 경사면에 대해 솔리드 채우기를 추가합니다.\n" "기본값은 모두입니다." @@ -10863,9 +10868,9 @@ msgid "" "\n" " " msgstr "" -"내부(내벽) 및 외부(외벽)의 출력 순서를 지정합니다.\n" +"내벽 및 외벽의 출력 순서를 지정합니다.\n" "\n" -"오버행를 가장 잘 출력하려면 내부/외부를 사용합니다. 이는 돌출된 벽이 출력하" +"오버행을 가장 잘 출력하려면 내부/외부를 사용합니다. 이는 돌출된 벽이 출력하" "는 동안 인접한 경계에 부착될 수 있기 때문입니다. 그러나 이 옵션을 사용하면 외" "부 경계가 내부 경계에 눌려 변형되므로 표면 품질이 약간 저하됩니다.\n" "\n" @@ -10907,7 +10912,7 @@ msgstr "" "벽/채우기 순서. 확인란을 선택 취소하면 벽이 먼저 출력되며 이는 대부분의 경우 " "가장 잘 작동합니다.\n" "\n" -"충전재를 먼저 출력하면 벽에 접착할 인접 충전재가 있으므로 오버행가 심한 경우 " +"충전재를 먼저 출력하면 벽에 접착할 인접 충전재가 있으므로 오버행이 심한 경우 " "도움이 될 수 있습니다. 그러나 충전재는 출력된 벽이 부착된 부분을 약간 밀어내" "어 외부 표면 마감이 더 나빠집니다. 또한 충전재가 부품의 외부 표면을 통해 빛" "날 수도 있습니다." @@ -10968,7 +10973,7 @@ msgid "The height of nozzle tip." msgstr "노즐 팁의 높이." msgid "Bed mesh min" -msgstr "배드 메시 최소" +msgstr "베드 메시 최소" msgid "" "This option sets the min point for the allowed bed mesh area. Due to the " @@ -10980,7 +10985,7 @@ msgid "" "your printer manufacturer. The default setting is (-99999, -99999), which " "means there are no limits, thus allowing probing across the entire bed." msgstr "" -"이 옵션은 허용되는 배드 메시 영역의 최소 지점을 설정합니다. 프로브의 XY 옵셋" +"이 옵션은 허용되는 베드 메시 영역의 최소 지점을 설정합니다. 프로브의 XY 옵셋" "으로 인해 대부분의 프린터는 전체 베드를 프로브할 수 없습니다. 프로브 포인트" "가 베드 영역 밖으로 나가지 않도록 하려면 베드 메시의 최소 및 최대 지점을 적절" "하게 설정해야 합니다. OrcaSlicer는 adaptive_bed_mesh_min/" @@ -10990,7 +10995,7 @@ msgstr "" "을 의미합니다." msgid "Bed mesh max" -msgstr "배드 메시 최대" +msgstr "베드 메시 최대" msgid "" "This option sets the max point for the allowed bed mesh area. Due to the " @@ -11028,7 +11033,7 @@ msgid "" "This option determines the additional distance by which the adaptive bed " "mesh area should be expanded in the XY directions." msgstr "" -"이 옵션은 적응형 배드 메시 영역이 XY 방향으로 확장되어야 하는 추가 거리를 결" +"이 옵션은 적응형 베드 메시 영역이 XY 방향으로 확장되어야 하는 추가 거리를 결" "정합니다." msgid "Extruder Color" @@ -11073,19 +11078,19 @@ msgstr "" "최종 객체 흐름 비율은 이 값에 필라멘트 흐름 비율을 곱한 값입니다." msgid "Enable pressure advance" -msgstr "프레셔 어드밴스 활성화" +msgstr "PA 활성화" msgid "" "Enable pressure advance, auto calibration result will be overwritten once " "enabled." msgstr "" -"프레셔 어드밴스를 활성화합니다. 활성화되면 자동 보정 결과를 덮어씁니다." +"PA를 활성화합니다. 활성화되면 자동 보정 결과를 덮어씁니다." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" -msgstr "프레셔 어드밴스(Klipper)/리니어 어드밴스(Marlin)" +msgstr "프레셔 어드밴스(Klipper) / 리니어 어드밴스(Marlin)" msgid "Enable adaptive pressure advance (beta)" -msgstr "적응형 압력 진행 활성화(베타)" +msgstr "적응형 PA 활성화(베타)" #, no-c-format, no-boost-format msgid "" @@ -11116,14 +11121,14 @@ msgstr "" "\n" "이 기능은 출력 중인 압출 흐름 속도와 가속도에 따라 프린터 압출 시스템의 반응" "을 모델링하여 이러한 제한 사항을 해결하는 것을 목표로 합니다. 내부적으로는 주" -"어진 압출 흐름 속도 및 가속도에 대해 필요한 압력 전진을 추정할 수 있는 적합 " +"어진 압출 흐름 속도 및 가속도에 대해 필요한 PA를 추정할 수 있는 적합 " "모델을 생성하며, 이는 현재 출력 조건에 따라 프린터로 방출됩니다.\n" "\n" -"활성화되면 위의 압력 전진 값이 무시됩니다. 그러나 대체 수단으로 사용하거나 도" +"활성화되면 위의 PA 값이 무시됩니다. 그러나 대체 수단으로 사용하거나 도" "구를 변경할 때 위의 합리적인 기본값을 사용하는 것이 좋습니다.\n" msgid "Adaptive pressure advance measurements (beta)" -msgstr "적응형 압력 사전 측정(베타)" +msgstr "적응형 PA 측정(베타)" #, no-c-format, no-boost-format msgid "" @@ -11155,7 +11160,7 @@ msgid "" "your filament profile\n" "\n" msgstr "" -"압력 전진(PA) 값 세트, 측정된 압출 압출량 속도 및 가속도를 쉼표로 구분하여 추" +"PA 값 세트, 측정된 압출 압출량 속도 및 가속도를 쉼표로 구분하여 추" "가합니다. 한 줄에 하나의 값 세트가 있습니다. 예를 들어\n" "0.04,3.96,3000\n" "0.033,3.96,10000\n" @@ -11163,7 +11168,7 @@ msgstr "" "0.026,7.91,10000\n" "\n" "교정 방법:\n" -"1. 가속도 값당 최소 3개 속도에 대해 압력 전진 테스트를 실행합니다. 최소한 외" +"1. 가속도 값당 최소 3개 속도에 대해 PA 테스트를 실행합니다. 최소한 외" "부 둘레의 속도, 내부 둘레의 속도 및 프로필의 가장 빠른 기능 출력 속도(일반적" "으로 희박하거나 단단한 충전재)에 대해 테스트를 실행하는 것이 좋습니다. 그런 " "다음 가장 느리고 가장 빠른 출력 가속을 위해 동일한 속도로 실행하고 Klipper 입" @@ -11178,7 +11183,7 @@ msgstr "" "라멘트 프로필을 저장하세요.\n" msgid "Enable adaptive pressure advance for overhangs (beta)" -msgstr "오버행에 대한 적응형 압력 전진 활성화(베타)" +msgstr "오버행에 대한 적응형 PA 활성화(베타)" msgid "" "Enable adaptive PA for overhangs as well as when flow changes within the " @@ -11191,7 +11196,7 @@ msgstr "" "행 전후의 외부 표면에 균일성 문제가 발생할 수 있습니다.\n" msgid "Pressure advance for bridges" -msgstr "브릿지를 위한 압력 전진" +msgstr "브릿지를 위한 PA" msgid "" "Pressure advance value for bridges. Set to 0 to disable. \n" @@ -11201,7 +11206,7 @@ msgid "" "pressure drop in the nozzle when printing in the air and a lower PA helps " "counteract this." msgstr "" -"브릿지의 압력 전진 값입니다. 비활성화하려면 0으로 설정합니다. \n" +"브릿지의 PA 값입니다. 비활성화하려면 0으로 설정합니다. \n" "\n" " 브릿지를 프린팅할 때 PA 값이 낮으면 브릿지 직후에 약간의 언더 압출이 나타나" "는 것을 줄이는 데 도움이 됩니다. 이는 공중에서 출력할 때 노즐의 압력 강하로 " @@ -11225,7 +11230,7 @@ msgstr "" "여 시동 및 정지 빈도를 줄입니다" msgid "Don't slow down outer walls" -msgstr "외벽 감속하지 않기" +msgstr "외벽에서 감속하지 않기" msgid "" "If enabled, this setting will ensure external perimeters are not slowed down " @@ -11414,7 +11419,7 @@ msgid "" msgstr "채워넣기 직후 필라멘트 끝을 빼는 데 사용되는 속도입니다." msgid "Delay after unloading" -msgstr "빼기 후 지연" +msgstr "언로드 후 지연" msgid "" "Time to wait after the filament is unloaded. May help to get reliable tool " @@ -12233,10 +12238,10 @@ msgid "Enable this option if your printer uses pellets instead of filaments" msgstr "프린터가 필라멘트 대신 펠릿을 사용할 경우 활성화하세요" msgid "Support multi bed types" -msgstr "멀티 배드 유형 지원" +msgstr "멀티 베드 유형 지원" msgid "Enable this option if you want to use multiple bed types" -msgstr "여러 배드 유형을 사용하려면 이 옵션을 활성화하세요" +msgstr "여러 베드 유형을 사용하려면 이 옵션을 활성화하세요" msgid "Label objects" msgstr "객체 이름표" @@ -12680,7 +12685,7 @@ msgstr "" "를 활성화할 때 최대 레이어 높이를 제한합니다" msgid "Extrusion rate smoothing" -msgstr "유연한 압출 압출량" +msgstr "유연한 압출량" msgid "" "This parameter smooths out sudden extrusion rate changes that happen when " @@ -12869,7 +12874,7 @@ msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -"빼기 시 필라멘트가 고정되는 위치에서 압출기 끝까지의 거리입니다. 이는 프린터 " +"언로드시 필라멘트가 고정되는 위치에서 압출기 끝까지의 거리입니다. 이는 프린터 " "펌웨어의 값과 일치해야 합니다." msgid "Extra loading distance" @@ -12881,9 +12886,9 @@ msgid "" "positive, it is loaded further, if negative, the loading move is shorter " "than unloading." msgstr "" -"0으로 설정하면 압출 중에 필라멘트가 주차 위치에서 이동한 거리는 빼기 중에 다" +"0으로 설정하면 압출 중에 필라멘트가 파킹 위치에서 이동한 거리는 언로드 중에 다" "시 이동한 거리와 정확히 동일합니다. 양수이면 더 많이 압출되고, 음수이면 압출 " -"이동이 빼기 이동보다 짧습니다." +"이동이 언로드 이동보다 짧습니다." msgid "Start end points" msgstr "시작점과 끝점" @@ -13296,7 +13301,7 @@ msgid "" "This option causes the inner seams to be shifted backwards based on their " "depth, forming a zigzag pattern." msgstr "" -"이 옵션을 사용하면 내부 재봉선가 깊이에 따라 뒤로 이동하여 지그재그 패턴을 형" +"이 옵션을 사용하면 내부 재봉선의 깊이에 따라 뒤로 이동하여 지그재그 패턴을 형" "성합니다." msgid "Seam gap" @@ -13310,7 +13315,7 @@ msgid "" msgstr "" "폐쇄 루프 압출에서 재봉선의 가시성을 줄이기 위해 루프가 중단되고 지정된 양만" "큼 짧아집니다.\n" -"이 양은 밀리미터로 지정하거나 현재 압출기 직경의 백분율로 지정할 수 있습니" +"이 양은 mm로 지정하거나 현재 압출기 직경의 백분율로 지정할 수 있습니" "다. 이 매개 변수의 기본값은 10%입니다." msgid "Scarf joint seam (beta)" @@ -13398,7 +13403,7 @@ msgid "" "current layer height. The default value for this parameter is 0." msgstr "" "스카프의 시작 높이.\n" -"이 양은 밀리미터 또는 현재 레이어 높이의 백분율로 지정할 수 있습니다. 이 매개" +"이 양은 mm 또는 현재 레이어 높이의 백분율로 지정할 수 있습니다. 이 매개" "변수의 기본값은 0입니다." msgid "Scarf around entire wall" @@ -13510,13 +13515,15 @@ msgstr "" "사용합니다" msgid "Single loop draft shield" -msgstr "" +msgstr "단일 루프 드래프트 실드" msgid "" "Limits the draft shield loops to one wall after the first layer. This is " "useful, on occasion, to conserve filament but may cause the draft shield to " "warp / crack." msgstr "" +"드래프트 실드 루프를 첫 번째 레이어 뒤의 한 벽으로 제한합니다. 이 방법은 필라" +"멘트를 보존하는 데 유용하지만 드래프트 실드가 휘어지거나 갈라질 수 있습니다." msgid "Draft shield" msgstr "드래프트 실드" @@ -14046,7 +14053,7 @@ msgstr "" "에 일반 서포트와 유사한 구조를 만듭니다." msgid "Default (Grid/Organic)" -msgstr "기본값(그리드/오가닉" +msgstr "기본값(그리드/오가닉)" msgid "Snug" msgstr "맞춤" @@ -14055,13 +14062,13 @@ msgid "Organic" msgstr "유기체" msgid "Tree Slim" -msgstr "얇은 나무" +msgstr "얇은 트리" msgid "Tree Strong" -msgstr "강한 나무" +msgstr "강한 트리" msgid "Tree Hybrid" -msgstr "혼합 나무" +msgstr "혼합 트리" msgid "Independent support layer height" msgstr "독립적 서포트 레이어 높이" @@ -14389,7 +14396,7 @@ msgstr "" "실제 버리기 볼륨은 버리기 승수에 테이블의 버리기 볼륨을 곱한 것과 같습니다." msgid "Prime volume" -msgstr "프라임 부피" +msgstr "프라임양" msgid "The volume of material to prime extruder on tower." msgstr "탑에서 압출을 실행할 재료의 부피." @@ -14437,8 +14444,8 @@ msgid "" "For the wipe tower external perimeters the internal perimeter speed is used " "regardless of this setting." msgstr "" -"와이프 타워에서 퍼징하고 와이프 타워 희박 레이어를 출력할 때 최대 출력 속도입" -"니다. 퍼징 시 희소 충전 속도 또는 필라멘트 최대 압출 속도에서 계산된 속도가 " +"와이프 타워에서 버리기하고 와이프 타워 희박 레이어를 출력할 때 최대 출력 속도입" +"니다. 버리기 시 희소 충전 속도 또는 필라멘트 최대 압출 속도에서 계산된 속도가 " "더 낮은 경우 가장 낮은 속도가 대신 사용됩니다.\n" "\n" "희소 레이어를 출력할 때 내부 주변 속도 또는 필라멘트 최대 압출 속도에서 계산" @@ -14458,10 +14465,10 @@ msgid "" "use the one that is available (non-soluble would be preferred)." msgstr "" "프라임 타워의 둘레를 출력할 때 사용하는 압출기입니다. 사용 가능한 압출기를 사" -"용하려면 0으로 설정하세요(비가용성 재료가 적절함)." +"용하려면 0으로 설정하세요 (비가용성 재료가 적절합니다)." msgid "Purging volumes - load/unload volumes" -msgstr "제거 부피 - 넣기/빼기 부피" +msgstr "버리기량 - 로드/언로드량" msgid "" "This vector saves required volumes to change from/to each tool used on the " @@ -14944,7 +14951,7 @@ msgid "Load General Settings" msgstr "일반 설정 로드" msgid "Load process/machine settings from the specified file" -msgstr "지정된 파일에서 프로세스/기계 설정 로드" +msgstr "지정된 파일에서 프로세스/장치 설정 로드" msgid "Load Filament Settings" msgstr "필라멘트 설정 로드" @@ -15126,10 +15133,10 @@ msgstr "" "수 있도록 이 변수에 기록해야 합니다." msgid "Extra de-retraction" -msgstr "추가 철회" +msgstr "추가 후퇴" msgid "Currently planned extra extruder priming after de-retraction." -msgstr "현재 철회 후 추가 압출기 프라이밍이 계획되어 있습니다." +msgstr "현재 후퇴 후 추가 압출기 프라이밍이 계획되어 있습니다." msgid "Absolute E position" msgstr "절대 E 위치" @@ -16052,19 +16059,19 @@ msgid "PA step: " msgstr "PA 단계: " msgid "Accelerations: " -msgstr "" +msgstr "가속: " msgid "Speeds: " -msgstr "" +msgstr "속도: " msgid "Print numbers" msgstr "출력 수" msgid "Comma-separated list of printing accelerations" -msgstr "" +msgstr "쉼표로 구분된 출력 가속 목록" msgid "Comma-separated list of printing speeds" -msgstr "" +msgstr "쉼표로 구분된 출력 속도 목록" msgid "" "Please input valid values:\n" @@ -17388,7 +17395,7 @@ msgid "" "overhangs?" msgstr "" "샌드위치 모드\n" -"모델에 가파른 오버행가 없는 경우 샌드위치 모드(내부-외부-내부)를 사용하여 정" +"모델에 가파른 오버행이 없는 경우 샌드위치 모드(내부-외부-내부)를 사용하여 정" "밀도와 레이어 일관성을 향상시킬 수 있다는 것을 알고 계셨나요?" #: resources/data/hints.ini: [hint:Chamber temperature] @@ -17752,7 +17759,7 @@ msgstr "" #~ "support volume but weaker strength.\n" #~ "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." #~ msgstr "" -#~ "서포트 부피는 작지만 강도는 약한 것이 특징인 실험적 모양 \"얇은 나무\"를 " +#~ "서포트 부피는 작지만 강도는 약한 것이 특징인 실험적 모양 \"얇은 트리\"를 " #~ "추가했습니다.\n" #~ "접점 레이어 0, 상단 Z 거리 0, 벽 루프 2 와 함께 사용하는 것이 좋습니다." @@ -17761,7 +17768,7 @@ msgstr "" #~ "following settings: at least 2 interface layers, at least 0.1mm top z " #~ "distance or using support materials on interface." #~ msgstr "" -#~ "\"강한 나무\" 및 \"혼합 나무\" 모양의 경우 최소 접점 레이어 2, 상단 Z 거" +#~ "\"강한 트리\" 및 \"혼합 트리\" 모양의 경우 최소 접점 레이어 2, 상단 Z 거" #~ "리 0.1 또는 접점에서 서포트 재료를 사용하는 설정을 권장합니다." #~ msgid "Branch Diameter with double walls" @@ -17881,7 +17888,7 @@ msgstr "" #~ "cooling for all outer wall no matter how much overhang degree" #~ msgstr "" #~ "출력물의 돌출부 정도가 이 값을 초과하면 냉각 팬이 특정 속도가 되도록 강제" -#~ "합니다. 지지대가 없는 하단 레이어 선 너비의 백분율로 표시됩니다. 0은 돌출" +#~ "합니다. 서포트가 없는 하단 레이어 선 너비의 백분율로 표시됩니다. 0은 돌출" #~ "부 정도에 관계없이 모든 외벽을 강제 냉각한다는 의미입니다" #~ msgid "Bridge infill direction" @@ -17971,7 +17978,7 @@ msgstr "" #~ "Set to -1 to disable this override.\n" #~ "Can only be overridden by disable_fan_first_layers." #~ msgstr "" -#~ "이 설정값은 높은 팬 속도로 접점의 결합을 약화시킬 수 있도록 모든 지지대 접" +#~ "이 설정값은 높은 팬 속도로 접점의 결합을 약화시킬 수 있도록 모든 서포트 접" #~ "점(Support interface)에 적용됩니다.\n" #~ "사용하지 않으려면 -1로 설정합니다.\n" #~ "disable_fan_first_layers로만 재정의할 수 있습니다." @@ -17989,8 +17996,8 @@ msgstr "" #~ "normal(manual) or tree(manual) is selected, only support enforcers are " #~ "generated" #~ msgstr "" -#~ "일반(자동) 및 나무(자동)은 지지대를 자동으로 생성합니다. 일반(수동) 또는 " -#~ "나무(수동) 선택시에는 강제된 지지대만 생성됩니다" +#~ "일반(자동) 및 트리(자동)은 서포트를 자동으로 생성합니다. 일반(수동) 또는 " +#~ "트리(수동) 선택시에는 강제된 서포트만 생성됩니다" #~ msgid "ShiftLeft mouse button" #~ msgstr "Shift + 왼쪽 마우스 버튼" @@ -18879,10 +18886,10 @@ msgstr "" #~ "내부 드문 내부 채우기 밀도, 100은 전체가 꽉찬 내부 채우기임을 의미합니다" #~ msgid "Tree support wall loops" -#~ msgstr "나무 지지대 벽 루프" +#~ msgstr "트리 서포트 벽 루프" #~ msgid "This setting specify the count of walls around tree support" -#~ msgstr "이 설정은 나무 지지대의 벽 수를 지정합니다" +#~ msgstr "이 설정은 트리 서포트의 벽 수를 지정합니다" #, c-format, boost-format #~ msgid " doesn't work at 100%% density " @@ -19143,7 +19150,7 @@ msgstr "" #~ "는 것을 지원하지 않음을 의미합니다" #~ msgid "Internal bridge support thickness" -#~ msgstr "내부 다리 지지대 두께" +#~ msgstr "내부 다리 서포트 두께" #~ msgid "" #~ "If enabled, support loops will be generated under the contours of " @@ -19152,9 +19159,9 @@ msgstr "" #~ "when the sparse infill density is low.This value determines the thickness " #~ "of the support loops. 0 means disable this feature" #~ msgstr "" -#~ "활성화된 경우 내부 다리의 윤곽선 아래에 지지대 루프를 생성합니다. 이러한 " -#~ "지지대 루프는 내부 다리를 공중에서 압출하는 것을 방지하고, 특히 드문 채우" -#~ "기 밀도가 낮을 때 상단 표면 품질을 향상시킬 수 있습니다. 이 값은 지지대 루" +#~ "활성화된 경우 내부 다리의 윤곽선 아래에 서포트 루프를 생성합니다. 이러한 " +#~ "서포트 루프는 내부 다리를 공중에서 압출하는 것을 방지하고, 특히 드문 채우" +#~ "기 밀도가 낮을 때 상단 표면 품질을 향상시킬 수 있습니다. 이 값은 서포트 루" #~ "프의 두께를 결정하며 0은 이 기능을 사용하지 않음을 의미합니다" #~ msgid "" @@ -19165,9 +19172,9 @@ msgstr "" #~ "save a lot of material (default), while hybrid style will create similar " #~ "structure to normal support under large flat overhangs." #~ msgstr "" -#~ "지지대의 모양. 일반 지지대의 경우, 격자는 보다 안정적인 지지대(기본값)가 " -#~ "생성되는 반면 맞춤 지지대는 재료를 절약하고 객체 자국을 줄입니다.\n" -#~ "나무 지지대의 경우 얇은 모양은 가지를 더 적극적으로 병합하고 많은 재료를 " +#~ "서포트의 모양. 일반 서포트의 경우, 격자는 보다 안정적인 서포트(기본값)가 " +#~ "생성되는 반면 맞춤 서포트는 재료를 절약하고 객체 자국을 줄입니다.\n" +#~ "트리 서포트의 경우 얇은 모양은 가지를 더 적극적으로 병합하고 많은 재료를 " #~ "절약합니다(기본값). 반면 혼합 스타일은 크고 평평한 오버행 아래에 일반 지지" #~ "대와 유사한 구조를 만듭니다." From 0dd356a3a74312afa3a936fa5dee9e843cef63d1 Mon Sep 17 00:00:00 2001 From: yw4z Date: Sun, 4 May 2025 18:12:04 +0300 Subject: [PATCH 13/14] Fix exclusion area shape and color (#8792) * Update PartPlate.cpp --- src/slic3r/GUI/PartPlate.cpp | 71 ++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index f45ae34c46..0afca8fcba 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -831,8 +831,8 @@ void PartPlate::render_exclude_area(bool force_default_color) { if (force_default_color) //for thumbnail case return; - ColorRGBA select_color{ 0.765f, 0.7686f, 0.7686f, 1.0f }; - ColorRGBA unselect_color{ 0.9f, 0.9f, 0.9f, 1.0f }; + ColorRGBA select_color{ .9f, .86f, .82f, .7f }; // ORCA + ColorRGBA unselect_color{ .6f, .6f, .6f, .3f }; // ORCA //ColorRGBA default_color{ 0.9f, 0.9f, 0.9f, 1.0f }; // draw exclude area @@ -2548,37 +2548,44 @@ void PartPlate::generate_exclude_polygon(ExPolygon &exclude_polygon) int points_count = 8; if (m_exclude_area.size() == 4) { - //rectangle case - for (int i = 0; i < 4; i++) - { - const Vec2d& p = m_exclude_area[i]; - Vec2d center; - double start_angle, stop_angle, radius; - switch (i) { - case 0: - radius = 5.f; - center(0) = p(0) + radius; - center(1) = p(1) + radius; - start_angle = PI; - stop_angle = 1.5 * PI; - compute_exclude_points(center, radius, start_angle, stop_angle, points_count); - break; - case 1: - exclude_polygon.contour.append({ scale_(p(0)), scale_(p(1)) }); - break; - case 2: - radius = 3.f; - center(0) = p(0) - radius; - center(1) = p(1) - radius; - start_angle = 0; - stop_angle = 0.5 * PI; - compute_exclude_points(center, radius, start_angle, stop_angle, points_count); - break; - case 3: - exclude_polygon.contour.append({ scale_(p(0)), scale_(p(1)) }); - break; - } + //rectangle case + for (int i = 0; i < 4; i++) + { + const Vec2d& p = m_exclude_area[i]; + Vec2d center; + double start_angle, stop_angle, radius; + radius = 1.f; // ORCA use equal rounding for all corners + switch (i) { + case 0: // Left-Bottom + center(0) = p(0) + radius; + center(1) = p(1) + radius; + start_angle = 1.0 * PI; //180 + stop_angle = 1.5 * PI; //270 + compute_exclude_points(center, radius, start_angle, stop_angle, points_count); + break; + case 1: // Right-Bottom + center(0) = p(0) - radius; + center(1) = p(1) + radius; + start_angle = 1.5 * PI; //270 + stop_angle = 2.0 * PI; //360 + compute_exclude_points(center, radius, start_angle, stop_angle, points_count); + break; + case 2: // Right-Top + center(0) = p(0) - radius; + center(1) = p(1) - radius; + start_angle = 0.0 * PI; //0 + stop_angle = 0.5 * PI; //90 + compute_exclude_points(center, radius, start_angle, stop_angle, points_count); + break; + case 3: // Left-Top + center(0) = p(0) + radius; + center(1) = p(1) - radius; + start_angle = 0.5 * PI; //90 + stop_angle = 1.0 * PI; //180 + compute_exclude_points(center, radius, start_angle, stop_angle, points_count); + break; } + } } else { for (const Vec2d& p : m_exclude_area) { From be2d1931178da95602c365525d71a11b69c3c7df Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 5 May 2025 11:27:42 +0800 Subject: [PATCH 14/14] Fix floating brim (#9393) * FIX: brim should be extruded only on first layer github: github.com/bambulab/BambuStudio/issues/4678 Change-Id: Ib00795dfba2e6d869c30ac906385f170088bbfd6 (cherry picked from commit b51ff1721ddc2080c4f7e487f67c4f1a722bf091) * Fix compile --- src/libslic3r/GCode.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b7b2a51531..d8e4768063 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4337,16 +4337,18 @@ LayerResult GCode::process_layer( for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) { const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast(instance_to_print.instance_id), extruder_id, print_wipe_extrusions != 0) : island.by_region; //BBS: add brim by obj by extruder - if (this->m_objsWithBrim.find(instance_to_print.print_object.id()) != this->m_objsWithBrim.end() && !print_wipe_extrusions) { - this->set_origin(0., 0.); - m_avoid_crossing_perimeters.use_external_mp(); - for (const ExtrusionEntity* ee : print.m_brimMap.at(instance_to_print.print_object.id()).entities) { - gcode += this->extrude_entity(*ee, "brim", m_config.support_speed.value); + if (first_layer) { + if (this->m_objsWithBrim.find(instance_to_print.print_object.id()) != this->m_objsWithBrim.end() && !print_wipe_extrusions) { + this->set_origin(0., 0.); + m_avoid_crossing_perimeters.use_external_mp(); + for (const ExtrusionEntity* ee : print.m_brimMap.at(instance_to_print.print_object.id()).entities) { + gcode += this->extrude_entity(*ee, "brim", m_config.support_speed.value); + } + m_avoid_crossing_perimeters.use_external_mp(false); + // Allow a straight travel move to the first object point. + m_avoid_crossing_perimeters.disable_once(); + this->m_objsWithBrim.erase(instance_to_print.print_object.id()); } - m_avoid_crossing_perimeters.use_external_mp(false); - // Allow a straight travel move to the first object point. - m_avoid_crossing_perimeters.disable_once(); - this->m_objsWithBrim.erase(instance_to_print.print_object.id()); } // When starting a new object, use the external motion planner for the first travel move. const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift;