From 43581059ff3a03a40f74407bee3ea7062a4077b3 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 15 Dec 2020 12:09:03 +0100 Subject: [PATCH 1/8] Fix of #5450 - Wrong printer preset after loading 3mf project file when having multiple presets for one physical printer --- src/libslic3r/Preset.cpp | 7 +++++++ src/libslic3r/Preset.hpp | 1 + src/libslic3r/PresetBundle.cpp | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 63e4173796..af6b50215e 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1849,6 +1849,13 @@ void PhysicalPrinterCollection::select_printer(const std::string& full_name) m_selected_preset = it->get_preset_name(full_name); } +void PhysicalPrinterCollection::select_printer(const std::string& printer_name, const std::string& preset_name) +{ + if (preset_name.empty()) + return select_printer(printer_name); + return select_printer(printer_name + PhysicalPrinter::separator() + preset_name); +} + void PhysicalPrinterCollection::select_printer(const PhysicalPrinter& printer) { return select_printer(printer.name); diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 2e0e944678..b6d44d58ff 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -701,6 +701,7 @@ public: // If full_name doesn't contain name of selected preset, then select first preset in the list for this printer void select_printer(const std::string& full_name); void select_printer(const PhysicalPrinter& printer); + void select_printer(const std::string& printer_name, const std::string& preset_name); bool has_selection() const; void unselect_printer() ; bool is_selected(ConstIterator it, const std::string &preset_name) const; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 39d1f11c00..ae6a77139c 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -876,7 +876,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool // Activate the physical printer profile if possible. PhysicalPrinter *pp = this->physical_printers.find_printer(physical_printer, true); if (pp != nullptr && std::find(pp->preset_names.begin(), pp->preset_names.end(), this->printers.get_edited_preset().name) != pp->preset_names.end()) - this->physical_printers.select_printer(*pp); + this->physical_printers.select_printer(pp->name, this->printers.get_edited_preset().name); else this->physical_printers.unselect_printer(); } @@ -1396,7 +1396,7 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla if (! active_printer.empty()) printers.select_preset_by_name(active_printer, true); if (! active_physical_printer.empty()) - physical_printers.select_printer(active_physical_printer +" * " + active_printer); + physical_printers.select_printer(active_physical_printer, active_printer); // Activate the first filament preset. if (! active_filaments.empty() && ! active_filaments.front().empty()) filaments.select_preset_by_name(active_filaments.front(), true); From a13b35ce92efed202ef43f02debb83dfb533d9b0 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 15 Dec 2020 12:14:30 +0100 Subject: [PATCH 2/8] Support for HiDPI in OpenGL on Linux / GTK3. wxGTK3 HiDPI support seems to emulate what OSX does quite closely, thus the changes are relatively minimal. Also fixed an ugly rounding issue when populating the ImGUI font map with image thumbnails. Fixes Gtk3 issue on 4k+ screens #4135 Fixes HiDPI screens with Wayland on Fedora 30 cause Plater view to be too small. #3245 --- src/slic3r/GUI/GLCanvas3D.cpp | 10 +++++++++- src/slic3r/GUI/GLCanvas3D.hpp | 5 +++-- src/slic3r/GUI/ImGuiWrapper.cpp | 8 ++++++-- src/slic3r/GUI/MainFrame.cpp | 3 ++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e778de8794..c2e4424313 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -86,6 +86,13 @@ static const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4; namespace Slic3r { namespace GUI { +#ifdef __WXGTK3__ +// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support. +RetinaHelper::RetinaHelper(wxWindow* window) : m_window(window), m_self(nullptr) {} +RetinaHelper::~RetinaHelper() {} +float RetinaHelper::get_scale_factor() { return float(m_window->GetContentScaleFactor()); } +#endif // __WXGTK3__ + Size::Size() : m_width(0) , m_height(0) @@ -3732,7 +3739,8 @@ void GLCanvas3D::update_ui_from_settings() { m_dirty = true; -#if ENABLE_RETINA_GL +#if __APPLE__ + // Update OpenGL scaling on OSX after the user toggled the "use_retina_opengl" settings in Preferences dialog. const float orig_scaling = m_retina_helper->get_scale_factor(); const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1"; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 9c80aa2369..e64e65d1b3 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -31,8 +31,9 @@ class wxPaintEvent; class wxGLCanvas; class wxGLContext; -// Support for Retina OpenGL on Mac OS -#define ENABLE_RETINA_GL __APPLE__ +// Support for Retina OpenGL on Mac OS. +// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support, enable it as well. +#define ENABLE_RETINA_GL (__APPLE__ || __WXGTK3__) namespace Slic3r { diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 3d96967ec8..ff8ba8f48a 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -963,6 +963,8 @@ void ImGuiWrapper::init_font(bool compress) // Fill rectangles from the SVG-icons for (auto icon : font_icons) { if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) { + assert(rect->Width == icon_sz); + assert(rect->Height == icon_sz); std::vector raw_data = load_svg(icon.second, icon_sz, icon_sz); const ImU32* pIn = (ImU32*)raw_data.data(); for (int y = 0; y < icon_sz; y++) { @@ -973,10 +975,12 @@ void ImGuiWrapper::init_font(bool compress) } rect_id++; } - icon_sz = lround(32 * font_scale); // default size of large icon is 32 px - + + icon_sz *= 2; // default size of large icon is 32 px for (auto icon : font_icons_large) { if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) { + assert(rect->Width == icon_sz); + assert(rect->Height == icon_sz); std::vector raw_data = load_svg(icon.second, icon_sz, icon_sz); const ImU32* pIn = (ImU32*)raw_data.data(); for (int y = 0; y < icon_sz; y++) { diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index db4183b407..8e6b1c5ef2 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -228,7 +228,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S // OSX specific issue: // When we move application between Retina and non-Retina displays, The legend on a canvas doesn't redraw // So, redraw explicitly canvas, when application is moved -#if ENABLE_RETINA_GL +//FIXME maybe this is useful for __WXGTK3__ as well? +#if __APPLE__ Bind(wxEVT_MOVE, [this](wxMoveEvent& event) { wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); From 161fb86c431ce20763b574474bdf3dcf9444aaae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Tue, 15 Dec 2020 13:49:35 +0100 Subject: [PATCH 3/8] Fixed percentages in avoid crossing perimeters max detour --- src/libslic3r/PrintConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index db0586f36e..a85348ac7c 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -184,7 +184,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); - def = this->add("avoid_crossing_perimeters_max_detour", coFloat); + def = this->add("avoid_crossing_perimeters_max_detour", coFloatOrPercent); def->label = L("Avoid crossing perimeters - Max detour length"); def->category = L("Layers and Perimeters"); def->tooltip = L("The maximum detour length for avoid crossing perimeters. " From 62c23313befb08034abaa9e6ed011ddd98743830 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 15 Dec 2020 13:57:05 +0100 Subject: [PATCH 4/8] Suppress to change "inches" flag after conversion to the inches. --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5d9f127686..fca933fa70 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2398,7 +2398,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ auto convert_from_imperial_units = [](Model& model, bool only_small_volumes) { model.convert_from_imperial_units(only_small_volumes); - wxGetApp().app_config->set("use_inches", "1"); +// wxGetApp().app_config->set("use_inches", "1"); wxGetApp().sidebar().update_ui_from_settings(); }; From e62f0140494f25d533ebe4e7e2adec83c9f5b51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Tue, 15 Dec 2020 14:03:52 +0100 Subject: [PATCH 5/8] Corrected side text for avoid crossing perimeters max detour --- src/libslic3r/PrintConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a85348ac7c..ada089187e 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -190,7 +190,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("The maximum detour length for avoid crossing perimeters. " "If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. " "Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."); - def->sidetext = L("mm (zero to disable)"); + def->sidetext = L("mm or % (zero to disable)"); def->min = 0; def->mode = comExpert; def->set_default_value(new ConfigOptionFloatOrPercent(0., false)); From d59f345fbb0e77e2fc6618766881c4ecb364c552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Tue, 15 Dec 2020 14:18:11 +0100 Subject: [PATCH 6/8] Fix of #5443 - Assigned input file path for ModelVolume also for AMF archives --- src/libslic3r/Format/AMF.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index a183aeb462..2312005a10 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -1020,6 +1020,12 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model #endif // forward compatibility close_zip_reader(&archive); + + for (ModelObject *o : model->objects) + for (ModelVolume *v : o->volumes) + if (v->source.input_file.empty() && (v->type() == ModelVolumeType::MODEL_PART)) + v->source.input_file = path; + return true; } From aa8f97fce261bcc433a989d6a7f9d38080f6cccc Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 15 Dec 2020 14:26:33 +0100 Subject: [PATCH 7/8] Fix of 3DConnexion 3D SpaceMouse Jumpy Pan moves on Linux #5233 Also improved error reporting on Linux about the 3DConnexion device access issues. --- src/slic3r/GUI/Mouse3DController.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 57748af6f0..692ae7f1ba 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -346,7 +346,6 @@ bool Mouse3DController::State::apply(const Mouse3DController::Params ¶ms, Ca if (params.swap_yz) rot = Vec3d(rot.x(), -rot.z(), rot.y()); camera.rotate_local_around_target(Vec3d(rot.x(), - rot.z(), rot.y())); - break; } else { assert(input_queue_item.is_buttons()); switch (input_queue_item.type_or_buttons) { @@ -895,7 +894,10 @@ bool Mouse3DController::connect_device() if (device.second.size() == 1) { #if defined(__linux__) hid_device* test_device = hid_open(device.first.first, device.first.second, nullptr); - if (test_device != nullptr) { + if (test_device == nullptr) { + BOOST_LOG_TRIVIAL(error) << "3DConnexion device cannot be opened: " << device.second.front().path << + " You may need to update /etc/udev/rules.d"; + } else { hid_close(test_device); #else if (device.second.front().has_valid_usage()) { @@ -940,10 +942,13 @@ bool Mouse3DController::connect_device() break; } #endif // __linux__ + else { + BOOST_LOG_TRIVIAL(error) << "3DConnexion device cannot be opened: " << data.path << + " You may need to update /etc/udev/rules.d"; #if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT - else std::cout << "-> NOT PASSED" << std::endl; #endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + } } if (found) From 8d4d6b6c891084432c19e7cab93704afe1003949 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 15 Dec 2020 14:58:34 +0100 Subject: [PATCH 8/8] UnsavedChangesDialog: Fixed default text color in respect to the system text color (Related to #5444) --- src/slic3r/GUI/UnsavedChangesDialog.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 946bdd8c1b..b4b38b4bd2 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -51,7 +51,12 @@ static std::string get_icon_name(Preset::Type type, PrinterTechnology pt) { return pt == ptSLA && type == Preset::TYPE_PRINTER ? "sla_printer" : type_icon_names.at(type); } -static std::string black = "#000000"; +static std::string def_text_color() +{ + wxColour def_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), def_colour.Red(), def_colour.Green(), def_colour.Blue()); + return clr_str.ToStdString(); +} static std::string grey = "#808080"; static std::string orange = "#ed6b21"; @@ -158,7 +163,7 @@ ModelNode::ModelNode(ModelNode* parent, const wxString& text, const wxString& ol } // "color" strings - color_string(m_old_value, black); + color_string(m_old_value, def_text_color()); color_string(m_new_value, orange); UpdateIcons(); @@ -176,13 +181,13 @@ void ModelNode::UpdateEnabling() }; if (!m_toggle) { - change_text_color(m_text, black, grey); - change_text_color(m_old_value, black, grey); + change_text_color(m_text, def_text_color(), grey); + change_text_color(m_old_value, def_text_color(), grey); change_text_color(m_new_value, orange,grey); } else { - change_text_color(m_text, grey, black); - change_text_color(m_old_value, grey, black); + change_text_color(m_text, grey, def_text_color()); + change_text_color(m_old_value, grey, def_text_color()); change_text_color(m_new_value, grey, orange); } // update icons for the colors @@ -227,7 +232,7 @@ UnsavedChangesModel::~UnsavedChangesModel() wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt) { // "color" strings - color_string(preset_name, black); + color_string(preset_name, def_text_color()); make_string_bold(preset_name); auto preset = new ModelNode(type, m_parent_win, preset_name, get_icon_name(type, pt)); @@ -274,9 +279,9 @@ wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString catego wxString old_value, wxString new_value, const std::string category_icon_name) { // "color" strings - color_string(category_name, black); - color_string(group_name, black); - color_string(option_name, black); + color_string(category_name, def_text_color()); + color_string(group_name, def_text_color()); + color_string(option_name, def_text_color()); // "make" strings bold make_string_bold(category_name);