mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-13 07:29:04 +08:00
Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer
This commit is contained in:
commit
9704eb6ece
@ -1020,6 +1020,12 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model
|
|||||||
#endif // forward compatibility
|
#endif // forward compatibility
|
||||||
|
|
||||||
close_zip_reader(&archive);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1849,6 +1849,13 @@ void PhysicalPrinterCollection::select_printer(const std::string& full_name)
|
|||||||
m_selected_preset = it->get_preset_name(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)
|
void PhysicalPrinterCollection::select_printer(const PhysicalPrinter& printer)
|
||||||
{
|
{
|
||||||
return select_printer(printer.name);
|
return select_printer(printer.name);
|
||||||
|
@ -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
|
// 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 std::string& full_name);
|
||||||
void select_printer(const PhysicalPrinter& printer);
|
void select_printer(const PhysicalPrinter& printer);
|
||||||
|
void select_printer(const std::string& printer_name, const std::string& preset_name);
|
||||||
bool has_selection() const;
|
bool has_selection() const;
|
||||||
void unselect_printer() ;
|
void unselect_printer() ;
|
||||||
bool is_selected(ConstIterator it, const std::string &preset_name) const;
|
bool is_selected(ConstIterator it, const std::string &preset_name) const;
|
||||||
|
@ -876,7 +876,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
|
|||||||
// Activate the physical printer profile if possible.
|
// Activate the physical printer profile if possible.
|
||||||
PhysicalPrinter *pp = this->physical_printers.find_printer(physical_printer, true);
|
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())
|
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
|
else
|
||||||
this->physical_printers.unselect_printer();
|
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())
|
if (! active_printer.empty())
|
||||||
printers.select_preset_by_name(active_printer, true);
|
printers.select_preset_by_name(active_printer, true);
|
||||||
if (! active_physical_printer.empty())
|
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.
|
// Activate the first filament preset.
|
||||||
if (! active_filaments.empty() && ! active_filaments.front().empty())
|
if (! active_filaments.empty() && ! active_filaments.front().empty())
|
||||||
filaments.select_preset_by_name(active_filaments.front(), true);
|
filaments.select_preset_by_name(active_filaments.front(), true);
|
||||||
|
@ -184,13 +184,13 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
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->label = L("Avoid crossing perimeters - Max detour length");
|
||||||
def->category = L("Layers and Perimeters");
|
def->category = L("Layers and Perimeters");
|
||||||
def->tooltip = L("The maximum detour length for avoid crossing 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. "
|
"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.");
|
"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->min = 0;
|
||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
|
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
|
||||||
|
@ -86,6 +86,13 @@ static const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4;
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
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()
|
Size::Size()
|
||||||
: m_width(0)
|
: m_width(0)
|
||||||
, m_height(0)
|
, m_height(0)
|
||||||
@ -3732,7 +3739,8 @@ void GLCanvas3D::update_ui_from_settings()
|
|||||||
{
|
{
|
||||||
m_dirty = true;
|
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 float orig_scaling = m_retina_helper->get_scale_factor();
|
||||||
|
|
||||||
const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1";
|
const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1";
|
||||||
|
@ -31,8 +31,9 @@ class wxPaintEvent;
|
|||||||
class wxGLCanvas;
|
class wxGLCanvas;
|
||||||
class wxGLContext;
|
class wxGLContext;
|
||||||
|
|
||||||
// Support for Retina OpenGL on Mac OS
|
// Support for Retina OpenGL on Mac OS.
|
||||||
#define ENABLE_RETINA_GL __APPLE__
|
// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support, enable it as well.
|
||||||
|
#define ENABLE_RETINA_GL (__APPLE__ || __WXGTK3__)
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
|
@ -963,6 +963,8 @@ void ImGuiWrapper::init_font(bool compress)
|
|||||||
// Fill rectangles from the SVG-icons
|
// Fill rectangles from the SVG-icons
|
||||||
for (auto icon : font_icons) {
|
for (auto icon : font_icons) {
|
||||||
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
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);
|
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
||||||
const ImU32* pIn = (ImU32*)raw_data.data();
|
const ImU32* pIn = (ImU32*)raw_data.data();
|
||||||
for (int y = 0; y < icon_sz; y++) {
|
for (int y = 0; y < icon_sz; y++) {
|
||||||
@ -973,10 +975,12 @@ void ImGuiWrapper::init_font(bool compress)
|
|||||||
}
|
}
|
||||||
rect_id++;
|
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) {
|
for (auto icon : font_icons_large) {
|
||||||
if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
|
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);
|
std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
|
||||||
const ImU32* pIn = (ImU32*)raw_data.data();
|
const ImU32* pIn = (ImU32*)raw_data.data();
|
||||||
for (int y = 0; y < icon_sz; y++) {
|
for (int y = 0; y < icon_sz; y++) {
|
||||||
|
@ -228,7 +228,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
|||||||
// OSX specific issue:
|
// OSX specific issue:
|
||||||
// When we move application between Retina and non-Retina displays, The legend on a canvas doesn't redraw
|
// 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
|
// 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) {
|
Bind(wxEVT_MOVE, [this](wxMoveEvent& event) {
|
||||||
wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
|
wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
|
||||||
wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
|
wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
|
||||||
|
@ -346,7 +346,6 @@ bool Mouse3DController::State::apply(const Mouse3DController::Params ¶ms, Ca
|
|||||||
if (params.swap_yz)
|
if (params.swap_yz)
|
||||||
rot = Vec3d(rot.x(), -rot.z(), rot.y());
|
rot = Vec3d(rot.x(), -rot.z(), rot.y());
|
||||||
camera.rotate_local_around_target(Vec3d(rot.x(), - rot.z(), rot.y()));
|
camera.rotate_local_around_target(Vec3d(rot.x(), - rot.z(), rot.y()));
|
||||||
break;
|
|
||||||
} else {
|
} else {
|
||||||
assert(input_queue_item.is_buttons());
|
assert(input_queue_item.is_buttons());
|
||||||
switch (input_queue_item.type_or_buttons) {
|
switch (input_queue_item.type_or_buttons) {
|
||||||
@ -895,7 +894,10 @@ bool Mouse3DController::connect_device()
|
|||||||
if (device.second.size() == 1) {
|
if (device.second.size() == 1) {
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
hid_device* test_device = hid_open(device.first.first, device.first.second, nullptr);
|
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);
|
hid_close(test_device);
|
||||||
#else
|
#else
|
||||||
if (device.second.front().has_valid_usage()) {
|
if (device.second.front().has_valid_usage()) {
|
||||||
@ -940,11 +942,14 @@ bool Mouse3DController::connect_device()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif // __linux__
|
#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
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
||||||
else
|
|
||||||
std::cout << "-> NOT PASSED" << std::endl;
|
std::cout << "-> NOT PASSED" << std::endl;
|
||||||
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
break;
|
break;
|
||||||
|
@ -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) {
|
auto convert_from_imperial_units = [](Model& model, bool only_small_volumes) {
|
||||||
model.convert_from_imperial_units(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();
|
wxGetApp().sidebar().update_ui_from_settings();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
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 grey = "#808080";
|
||||||
static std::string orange = "#ed6b21";
|
static std::string orange = "#ed6b21";
|
||||||
|
|
||||||
@ -158,7 +163,7 @@ ModelNode::ModelNode(ModelNode* parent, const wxString& text, const wxString& ol
|
|||||||
}
|
}
|
||||||
|
|
||||||
// "color" strings
|
// "color" strings
|
||||||
color_string(m_old_value, black);
|
color_string(m_old_value, def_text_color());
|
||||||
color_string(m_new_value, orange);
|
color_string(m_new_value, orange);
|
||||||
|
|
||||||
UpdateIcons();
|
UpdateIcons();
|
||||||
@ -176,13 +181,13 @@ void ModelNode::UpdateEnabling()
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (!m_toggle) {
|
if (!m_toggle) {
|
||||||
change_text_color(m_text, black, grey);
|
change_text_color(m_text, def_text_color(), grey);
|
||||||
change_text_color(m_old_value, black, grey);
|
change_text_color(m_old_value, def_text_color(), grey);
|
||||||
change_text_color(m_new_value, orange,grey);
|
change_text_color(m_new_value, orange,grey);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
change_text_color(m_text, grey, black);
|
change_text_color(m_text, grey, def_text_color());
|
||||||
change_text_color(m_old_value, grey, black);
|
change_text_color(m_old_value, grey, def_text_color());
|
||||||
change_text_color(m_new_value, grey, orange);
|
change_text_color(m_new_value, grey, orange);
|
||||||
}
|
}
|
||||||
// update icons for the colors
|
// update icons for the colors
|
||||||
@ -227,7 +232,7 @@ UnsavedChangesModel::~UnsavedChangesModel()
|
|||||||
wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt)
|
wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt)
|
||||||
{
|
{
|
||||||
// "color" strings
|
// "color" strings
|
||||||
color_string(preset_name, black);
|
color_string(preset_name, def_text_color());
|
||||||
make_string_bold(preset_name);
|
make_string_bold(preset_name);
|
||||||
|
|
||||||
auto preset = new ModelNode(type, m_parent_win, preset_name, get_icon_name(type, pt));
|
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)
|
wxString old_value, wxString new_value, const std::string category_icon_name)
|
||||||
{
|
{
|
||||||
// "color" strings
|
// "color" strings
|
||||||
color_string(category_name, black);
|
color_string(category_name, def_text_color());
|
||||||
color_string(group_name, black);
|
color_string(group_name, def_text_color());
|
||||||
color_string(option_name, black);
|
color_string(option_name, def_text_color());
|
||||||
|
|
||||||
// "make" strings bold
|
// "make" strings bold
|
||||||
make_string_bold(category_name);
|
make_string_bold(category_name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user