diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index a183aeb46..2312005a1 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; } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 63e417379..af6b50215 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 2e0e94467..b6d44d58f 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 39d1f11c0..ae6a77139 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); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index db0586f36..ada089187 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -184,13 +184,13 @@ 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. " "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)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e778de879..c2e442431 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 9c80aa236..e64e65d1b 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 3d96967ec..ff8ba8f48 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<unsigned char> 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<unsigned char> 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 db4183b40..8e6b1c5ef 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(); diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 57748af6f..692ae7f1b 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) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5d9f12768..fca933fa7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2398,7 +2398,7 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& 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(); }; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 946bdd8c1..b4b38b4bd 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);