This commit is contained in:
enricoturri1966 2021-12-10 08:21:56 +01:00
commit d561d3579a
8 changed files with 204 additions and 180 deletions

View File

@ -627,7 +627,7 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin
list_printer->SetMinSize(wxSize(23*em, list_h)); list_printer->SetMinSize(wxSize(23*em, list_h));
list_type->SetMinSize(wxSize(8*em, list_h)); list_type->SetMinSize(wxSize(13*em, list_h));
list_vendor->SetMinSize(wxSize(13*em, list_h)); list_vendor->SetMinSize(wxSize(13*em, list_h));
list_profile->SetMinSize(wxSize(23*em, list_h)); list_profile->SetMinSize(wxSize(23*em, list_h));

View File

@ -1,6 +1,5 @@
#include "libslic3r/libslic3r.h" #include "libslic3r/libslic3r.h"
#include "DoubleSlider.hpp" #include "DoubleSlider.hpp"
#include "DoubleSlider_Utils.hpp"
#include "libslic3r/GCode.hpp" #include "libslic3r/GCode.hpp"
#include "GUI.hpp" #include "GUI.hpp"
#include "GUI_App.hpp" #include "GUI_App.hpp"
@ -27,7 +26,6 @@
#include <cmath> #include <cmath>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <random>
#include "Field.hpp" #include "Field.hpp"
#include "format.hpp" #include "format.hpp"
#include "NotificationManager.hpp" #include "NotificationManager.hpp"
@ -2562,7 +2560,7 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int
if (mode == SingleExtruder && type == ColorChange && m_use_default_colors) { if (mode == SingleExtruder && type == ColorChange && m_use_default_colors) {
#if 1 #if 1
if (ticks.empty()) if (ticks.empty())
return get_opposite_color((*m_colors)[0]); return color_generator.get_opposite_color((*m_colors)[0]);
auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick); auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick);
if (before_tick_it == ticks.end()) if (before_tick_it == ticks.end())
@ -2571,24 +2569,24 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int
if (--before_tick_it; before_tick_it->type == ColorChange) if (--before_tick_it; before_tick_it->type == ColorChange)
break; break;
if (before_tick_it->type == ColorChange) if (before_tick_it->type == ColorChange)
return get_opposite_color(before_tick_it->color); return color_generator.get_opposite_color(before_tick_it->color);
return get_opposite_color((*m_colors)[0]); return color_generator.get_opposite_color((*m_colors)[0]);
} }
if (before_tick_it == ticks.begin()) if (before_tick_it == ticks.begin())
{ {
const std::string& frst_color = (*m_colors)[0]; const std::string& frst_color = (*m_colors)[0];
if (before_tick_it->type == ColorChange) if (before_tick_it->type == ColorChange)
return get_opposite_color(frst_color, before_tick_it->color); return color_generator.get_opposite_color(frst_color, before_tick_it->color);
auto next_tick_it = before_tick_it; auto next_tick_it = before_tick_it;
while (next_tick_it != ticks.end()) while (next_tick_it != ticks.end())
if (++next_tick_it; next_tick_it->type == ColorChange) if (++next_tick_it; next_tick_it->type == ColorChange)
break; break;
if (next_tick_it->type == ColorChange) if (next_tick_it->type == ColorChange)
return get_opposite_color(frst_color, next_tick_it->color); return color_generator.get_opposite_color(frst_color, next_tick_it->color);
return get_opposite_color(frst_color); return color_generator.get_opposite_color(frst_color);
} }
std::string frst_color = ""; std::string frst_color = "";
@ -2609,13 +2607,13 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int
if (before_tick_it->type == ColorChange) { if (before_tick_it->type == ColorChange) {
if (frst_color.empty()) if (frst_color.empty())
return get_opposite_color(before_tick_it->color); return color_generator.get_opposite_color(before_tick_it->color);
return get_opposite_color(before_tick_it->color, frst_color); return color_generator.get_opposite_color(before_tick_it->color, frst_color);
} }
if (frst_color.empty()) if (frst_color.empty())
return get_opposite_color((*m_colors)[0]); return color_generator.get_opposite_color((*m_colors)[0]);
return get_opposite_color((*m_colors)[0], frst_color); return color_generator.get_opposite_color((*m_colors)[0], frst_color);
#else #else
const std::vector<std::string>& colors = ColorPrintColors::get(); const std::vector<std::string>& colors = ColorPrintColors::get();
if (ticks.empty()) if (ticks.empty())

View File

@ -3,6 +3,7 @@
#include "libslic3r/CustomGCode.hpp" #include "libslic3r/CustomGCode.hpp"
#include "wxExtensions.hpp" #include "wxExtensions.hpp"
#include "DoubleSlider_Utils.hpp"
#include <wx/window.h> #include <wx/window.h>
#include <wx/control.h> #include <wx/control.h>
@ -118,6 +119,7 @@ class TickCodeInfo
// int m_default_color_idx = 0; // int m_default_color_idx = 0;
std::vector<std::string>* m_colors {nullptr}; std::vector<std::string>* m_colors {nullptr};
ColorGenerator color_generator;
std::string get_color_for_tick(TickCode tick, Type type, const int extruder); std::string get_color_for_tick(TickCode tick, Type type, const int extruder);

View File

@ -1,25 +1,28 @@
#include <stdio.h> #include <stdio.h>
#include <random>
#include "wx/colour.h" #include "wx/colour.h"
// next code is borrowed from https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to-rgb-in-range-0-255-for-both class ColorGenerator
{
typedef struct { // Some of next code is borrowed from https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to-rgb-in-range-0-255-for-both
typedef struct {
double r; // a fraction between 0 and 1 double r; // a fraction between 0 and 1
double g; // a fraction between 0 and 1 double g; // a fraction between 0 and 1
double b; // a fraction between 0 and 1 double b; // a fraction between 0 and 1
} rgb; } rgb;
typedef struct { typedef struct {
double h; // angle in degrees double h; // angle in degrees
double s; // a fraction between 0 and 1 double s; // a fraction between 0 and 1
double v; // a fraction between 0 and 1 double v; // a fraction between 0 and 1
} hsv; } hsv;
static hsv rgb2hsv(rgb in); //static hsv rgb2hsv(rgb in);
static rgb hsv2rgb(hsv in); //static rgb hsv2rgb(hsv in);
hsv rgb2hsv(rgb in) hsv rgb2hsv(rgb in)
{ {
hsv out; hsv out;
double min, max, delta; double min, max, delta;
@ -37,46 +40,47 @@ hsv rgb2hsv(rgb in)
out.h = 0; // undefined, maybe nan? out.h = 0; // undefined, maybe nan?
return out; return out;
} }
if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash if (max > 0.0) { // NOTE: if Max is == 0, this divide would cause a crash
out.s = (delta / max); // s out.s = (delta / max); // s
} else { }
else {
// if max is 0, then r = g = b = 0 // if max is 0, then r = g = b = 0
// s = 0, h is undefined // s = 0, h is undefined
out.s = 0.0; out.s = 0.0;
out.h = NAN; // its now undefined out.h = NAN; // its now undefined
return out; return out;
} }
if( in.r >= max ) // > is bogus, just keeps compilor happy if (in.r >= max) // > is bogus, just keeps compilor happy
out.h = ( in.g - in.b ) / delta; // between yellow & magenta out.h = (in.g - in.b) / delta; // between yellow & magenta
else else
if( in.g >= max ) if (in.g >= max)
out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow out.h = 2.0 + (in.b - in.r) / delta; // between cyan & yellow
else else
out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan out.h = 4.0 + (in.r - in.g) / delta; // between magenta & cyan
out.h *= 60.0; // degrees out.h *= 60.0; // degrees
if( out.h < 0.0 ) if (out.h < 0.0)
out.h += 360.0; out.h += 360.0;
return out; return out;
} }
hsv rgb2hsv(const std::string& str_clr_in) hsv rgb2hsv(const std::string& str_clr_in)
{ {
wxColour clr(str_clr_in); wxColour clr(str_clr_in);
rgb in = { clr.Red() / 255.0, clr.Green() / 255.0, clr.Blue() / 255.0 }; rgb in = { clr.Red() / 255.0, clr.Green() / 255.0, clr.Blue() / 255.0 };
return rgb2hsv(in); return rgb2hsv(in);
} }
rgb hsv2rgb(hsv in) rgb hsv2rgb(hsv in)
{ {
double hh, p, q, t, ff; double hh, p, q, t, ff;
long i; long i;
rgb out; rgb out;
if(in.s <= 0.0) { // < is bogus, just shuts up warnings if (in.s <= 0.0) { // < is bogus, just shuts up warnings
out.r = in.v; out.r = in.v;
out.g = in.v; out.g = in.v;
out.b = in.v; out.b = in.v;
@ -91,7 +95,7 @@ rgb hsv2rgb(hsv in)
q = in.v * (1.0 - (in.s * ff)); q = in.v * (1.0 - (in.s * ff));
t = in.v * (1.0 - (in.s * (1.0 - ff))); t = in.v * (1.0 - (in.s * (1.0 - ff)));
switch(i) { switch (i) {
case 0: case 0:
out.r = in.v; out.r = in.v;
out.g = t; out.g = t;
@ -126,15 +130,28 @@ rgb hsv2rgb(hsv in)
break; break;
} }
return out; return out;
} }
double rand_val() std::random_device rd;
{
return 0.1 * (10 - rand() % 8);
}
std::string get_opposite_color(const std::string& color) public:
{
ColorGenerator() {}
~ColorGenerator() {}
double rand_val()
{
std::mt19937 rand_generator(rd());
// this value will be used for Saturation and Value
// to avoid extremely light/dark colors, take this value from range [0.65; 1.0]
std::uniform_real_distribution<double> distrib(0.65, 1.0);
return distrib(rand_generator);
}
std::string get_opposite_color(const std::string& color)
{
std::string opp_color = ""; std::string opp_color = "";
hsv hsv_clr = rgb2hsv(color); hsv hsv_clr = rgb2hsv(color);
@ -148,10 +165,10 @@ std::string get_opposite_color(const std::string& color)
opp_color = clr_str.ToStdString(); opp_color = clr_str.ToStdString();
return opp_color; return opp_color;
} }
std::string get_opposite_color(const std::string& color_frst, const std::string& color_scnd) std::string get_opposite_color(const std::string& color_frst, const std::string& color_scnd)
{ {
std::string opp_color = ""; std::string opp_color = "";
hsv hsv_frst = rgb2hsv(color_frst); hsv hsv_frst = rgb2hsv(color_frst);
@ -170,4 +187,5 @@ std::string get_opposite_color(const std::string& color_frst, const std::string&
opp_color = clr_str.ToStdString(); opp_color = clr_str.ToStdString();
return opp_color; return opp_color;
} }
};

View File

@ -949,25 +949,23 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup)
BOOST_LOG_TRIVIAL(info) << "last app config file used: " << m_older_data_dir_path; BOOST_LOG_TRIVIAL(info) << "last app config file used: " << m_older_data_dir_path;
// ask about using older data folder // ask about using older data folder
RichMessageDialog msg(nullptr, backup ? RichMessageDialog msg(nullptr, backup ?
wxString::Format(_L("PrusaSlicer detected another configuration folder at %s." wxString::Format(_L(
"\nIts version is %s." "Current configuration folder: %s"
"\nLast version you used in current configuration folder is %s." "\n\n%s found another configuration for version %s."
"\nPlease note that PrusaSlicer uses different folders to save configuration of alpha, beta and full release versions." "\nIt is found at %s."
"\nWould you like to copy found configuration to your current configuration folder?" "\n\nDo you wish to copy and use the configuration file for version %s (overwriting any file with the same name)? A backup of your current configuration will be created."
"\nIf you select no, you will continue with the configuration file for version %s (may not be fully compatible).")
"\n\nIf you select yes, PrusaSlicer will copy all profiles and other files from found folder to the current one. Overwriting any existing file with matching name." , current_version.to_string(), SLIC3R_APP_NAME, last_semver.to_string(), m_older_data_dir_path, last_semver.to_string(), current_version.to_string())
"\nIf you select no, you will continue with current configuration.") : wxString::Format(_L(
, m_older_data_dir_path, last_semver.to_string(), current_version.to_string()) "%s found another configuration for version %s."
: wxString::Format(_L("PrusaSlicer detected another configuration folder at %s." "\nIt is found at %s."
"\nIts version is %s."
"\nThere is no configuration file in current configuration folder." "\nThere is no configuration file in current configuration folder."
"\nPlease note that PrusaSlicer uses different folders to save configuration of alpha, beta and full release versions." "\n\nDo you wish to copy and use the configuration file for version %s?"
"\nWould you like to copy found configuration to your current configuration folder?"
"\n\nIf you select yes, PrusaSlicer will copy all profiles and other files from found folder to the current one."
"\nIf you select no, you will start with clean installation with configuration wizard.") "\nIf you select no, you will start with clean installation with configuration wizard.")
, m_older_data_dir_path, last_semver.to_string()) , SLIC3R_APP_NAME, last_semver.to_string(), m_older_data_dir_path, last_semver.to_string())
, _L("PrusaSlicer"), /*wxICON_QUESTION | */wxYES_NO); , _L("PrusaSlicer")
, wxYES_NO
, wxString::Format(_L("Load configuration from version %s?"), last_semver.to_string()));
if (msg.ShowModal() == wxID_YES) { if (msg.ShowModal() == wxID_YES) {
std::string snapshot_id; std::string snapshot_id;
if (backup) { if (backup) {

View File

@ -215,8 +215,10 @@ MessageDialog::MessageDialog(wxWindow* parent,
RichMessageDialog::RichMessageDialog(wxWindow* parent, RichMessageDialog::RichMessageDialog(wxWindow* parent,
const wxString& message, const wxString& message,
const wxString& caption/* = wxEmptyString*/, const wxString& caption/* = wxEmptyString*/,
long style/* = wxOK*/) long style/* = wxOK*/,
: MsgDialog(parent, caption.IsEmpty() ? wxString::Format(_L("%s info"), SLIC3R_APP_NAME) : caption, wxEmptyString, style) const wxString& headline/* = wxEmptyString*/
)
: MsgDialog(parent, caption.IsEmpty() ? wxString::Format(_L("%s info"), SLIC3R_APP_NAME) : caption, headline, style)
{ {
add_msg_content(this, content_sizer, message); add_msg_content(this, content_sizer, message);

View File

@ -133,7 +133,9 @@ public:
RichMessageDialog( wxWindow *parent, RichMessageDialog( wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& caption = wxEmptyString, const wxString& caption = wxEmptyString,
long style = wxOK); long style = wxOK,
const wxString& headline = wxEmptyString
);
RichMessageDialog(RichMessageDialog&&) = delete; RichMessageDialog(RichMessageDialog&&) = delete;
RichMessageDialog(const RichMessageDialog&) = delete; RichMessageDialog(const RichMessageDialog&) = delete;
RichMessageDialog &operator=(RichMessageDialog&&) = delete; RichMessageDialog &operator=(RichMessageDialog&&) = delete;
@ -293,7 +295,9 @@ public:
const wxString& message, const wxString& message,
const wxString& caption = wxEmptyString, const wxString& caption = wxEmptyString,
long style = wxOK) long style = wxOK)
: wxRichMessageDialog(parent, message, caption, style) {} : wxRichMessageDialog(parent, message, caption, style) {
this->SetEscapeId(wxID_CANCEL);
}
~RichMessageDialog() {} ~RichMessageDialog() {}
}; };
#endif #endif

View File

@ -984,6 +984,8 @@ bool OptionsGroup::launch_browser(const std::string& path_end)
RichMessageDialog dialog(parent, _L("Open hyperlink in default browser?"), _L("PrusaSlicer: Open hyperlink"), wxYES_NO); RichMessageDialog dialog(parent, _L("Open hyperlink in default browser?"), _L("PrusaSlicer: Open hyperlink"), wxYES_NO);
dialog.ShowCheckBox(_L("Remember my choice")); dialog.ShowCheckBox(_L("Remember my choice"));
int answer = dialog.ShowModal(); int answer = dialog.ShowModal();
if (answer == wxID_CANCEL)
return false;
if (dialog.IsCheckBoxChecked()) { if (dialog.IsCheckBoxChecked()) {
wxString preferences_item = _L("Suppress to open hyperlink in browser"); wxString preferences_item = _L("Suppress to open hyperlink in browser");