mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-10 02:37:04 +00:00
Thumbnails feature revamp. (#5555)
* Thumbnails feature revamp. Support generating different size/format combinations * misc fix Co-authored-by: Lukas Matena <lukasmatena@seznam.cz>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include "GUI_App.hpp"
|
||||
#include "I18N.hpp"
|
||||
#include "Field.hpp"
|
||||
#include "libslic3r/GCode/Thumbnails.hpp"
|
||||
#include "wxExtensions.hpp"
|
||||
#include "Plater.hpp"
|
||||
#include "MainFrame.hpp"
|
||||
@@ -83,6 +84,22 @@ wxString get_thumbnails_string(const std::vector<Vec2d>& values)
|
||||
return ret_str;
|
||||
}
|
||||
|
||||
ThumbnailErrors validate_thumbnails_string(wxString& str, const wxString& def_ext = "PNG")
|
||||
{
|
||||
std::string input_string = into_u8(str);
|
||||
|
||||
str.Clear();
|
||||
|
||||
auto [thumbnails_list, errors] = GCodeThumbnails::make_and_check_thumbnail_list(input_string);
|
||||
if (!thumbnails_list.empty()) {
|
||||
const auto& extentions = ConfigOptionEnum<GCodeThumbnailsFormat>::get_enum_names();
|
||||
for (const auto& [format, size] : thumbnails_list)
|
||||
str += format_wxstr("%1%x%2%/%3%, ", size.x(), size.y(), extentions[int(format)]);
|
||||
str.resize(str.Len() - 2);
|
||||
}
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
Field::~Field()
|
||||
{
|
||||
@@ -396,6 +413,31 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
|
||||
set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "."
|
||||
}
|
||||
}
|
||||
if (m_opt.opt_key == "thumbnails") {
|
||||
wxString str_out = str;
|
||||
ThumbnailErrors errors = validate_thumbnails_string(str_out);
|
||||
if (errors != enum_bitmask<ThumbnailError>()) {
|
||||
set_value(str_out, true);
|
||||
wxString error_str;
|
||||
if (errors.has(ThumbnailError::InvalidVal))
|
||||
error_str += format_wxstr(_L("Invalid input format. Expected vector of dimensions in the following format: \"%1%\""),
|
||||
"XxY/EXT, XxY/EXT, ...");
|
||||
if (errors.has(ThumbnailError::OutOfRange)) {
|
||||
if (!error_str.empty())
|
||||
error_str += "\n\n";
|
||||
error_str += _L("Input value is out of range");
|
||||
}
|
||||
if (errors.has(ThumbnailError::InvalidExt)) {
|
||||
if (!error_str.empty())
|
||||
error_str += "\n\n";
|
||||
error_str += _L("Some extension in the input is invalid");
|
||||
}
|
||||
show_error(m_parent, error_str);
|
||||
} else if (str_out != str) {
|
||||
str = str_out;
|
||||
set_value(str, true);
|
||||
}
|
||||
}
|
||||
|
||||
m_value = into_u8(str);
|
||||
break; }
|
||||
@@ -434,16 +476,16 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
|
||||
if (!str.IsEmpty()) {
|
||||
bool invalid_val = false;
|
||||
bool out_of_range_val = false;
|
||||
wxStringTokenizer thumbnails(str, ",");
|
||||
while (thumbnails.HasMoreTokens()) {
|
||||
wxString token = thumbnails.GetNextToken();
|
||||
wxStringTokenizer points(str, ",");
|
||||
while (points.HasMoreTokens()) {
|
||||
wxString token = points.GetNextToken();
|
||||
double x, y;
|
||||
wxStringTokenizer thumbnail(token, "x");
|
||||
if (thumbnail.HasMoreTokens()) {
|
||||
wxString x_str = thumbnail.GetNextToken();
|
||||
if (x_str.ToDouble(&x) && thumbnail.HasMoreTokens()) {
|
||||
wxString y_str = thumbnail.GetNextToken();
|
||||
if (y_str.ToDouble(&y) && !thumbnail.HasMoreTokens()) {
|
||||
wxStringTokenizer _point(token, "x");
|
||||
if (_point.HasMoreTokens()) {
|
||||
wxString x_str = _point.GetNextToken();
|
||||
if (x_str.ToDouble(&x) && _point.HasMoreTokens()) {
|
||||
wxString y_str = _point.GetNextToken();
|
||||
if (y_str.ToDouble(&y) && !_point.HasMoreTokens()) {
|
||||
if (m_opt_id == "bed_exclude_area") {
|
||||
if (0 <= x && 0 <= y) {
|
||||
out_values.push_back(Vec2d(x, y));
|
||||
|
||||
@@ -692,8 +692,9 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config,
|
||||
opt_key == "printable_area" || opt_key == "compatible_printers" || opt_key == "compatible_prints" ||
|
||||
opt_key == "thumbnails" || opt_key == "bed_custom_texture" || opt_key == "bed_custom_model") {
|
||||
value = get_config_value(config, opt_key);
|
||||
this->change_opt_value(opt_key, value);
|
||||
OptionsGroup::on_change_OG(opt_key, value);
|
||||
set_value(opt_key, value);
|
||||
this->change_opt_value(opt_key, get_value(opt_key));
|
||||
OptionsGroup::on_change_OG(opt_key, get_value(opt_key));
|
||||
return;
|
||||
} else {
|
||||
auto opt_id = m_opt_map.find(opt_key)->first;
|
||||
@@ -1072,8 +1073,6 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
|
||||
if (opt_key == "printable_area")
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else if (opt_key == "bed_exclude_area")
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else if (opt_key == "thumbnails")
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else
|
||||
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);
|
||||
@@ -1188,8 +1187,6 @@ boost::any ConfigOptionsGroup::get_config_value2(const DynamicPrintConfig& confi
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else if (opt_key == "bed_exclude_area")
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else if (opt_key == "thumbnails")
|
||||
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
else
|
||||
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);
|
||||
break;
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#include "MarkdownTip.hpp"
|
||||
#include "Search.hpp"
|
||||
#include "BedShapeDialog.hpp"
|
||||
#include "libslic3r/GCode/Thumbnails.hpp"
|
||||
|
||||
#include "BedShapeDialog.hpp"
|
||||
// #include "BonjourDialog.hpp"
|
||||
@@ -3669,7 +3670,43 @@ void TabPrinter::build_fff()
|
||||
option = optgroup->get_option("thumbnails");
|
||||
option.opt.full_width = true;
|
||||
optgroup->append_single_option_line(option, "thumbnails");
|
||||
optgroup->append_single_option_line("thumbnails_format", "thumbnails");
|
||||
// optgroup->append_single_option_line("thumbnails_format", "thumbnails");
|
||||
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
|
||||
wxTheApp->CallAfter([this, opt_key, value]() {
|
||||
if (opt_key == "thumbnails" && m_config->has("thumbnails_format")) {
|
||||
// to backward compatibility we need to update "thumbnails_format" from new "thumbnails"
|
||||
const std::string val = boost::any_cast<std::string>(value);
|
||||
if (!value.empty()) {
|
||||
auto [thumbnails_list, errors] = GCodeThumbnails::make_and_check_thumbnail_list(val);
|
||||
|
||||
if (errors != enum_bitmask<ThumbnailError>()) {
|
||||
// TRN: First argument is parameter name, the second one is the value.
|
||||
std::string error_str = format(_u8L("Invalid value provided for parameter %1%: %2%"), "thumbnails", val);
|
||||
error_str += GCodeThumbnails::get_error_string(errors);
|
||||
InfoDialog(parent(), _L("G-code flavor is switched"), from_u8(error_str)).ShowModal();
|
||||
}
|
||||
|
||||
if (!thumbnails_list.empty()) {
|
||||
GCodeThumbnailsFormat old_format = GCodeThumbnailsFormat(m_config->option("thumbnails_format")->getInt());
|
||||
GCodeThumbnailsFormat new_format = thumbnails_list.begin()->first;
|
||||
if (old_format != new_format) {
|
||||
DynamicPrintConfig new_conf = *m_config;
|
||||
|
||||
auto* opt = m_config->option("thumbnails_format")->clone();
|
||||
opt->setInt(int(new_format));
|
||||
new_conf.set_key_value("thumbnails_format", opt);
|
||||
|
||||
load_config(new_conf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update_dirty();
|
||||
on_value_change(opt_key, value);
|
||||
});
|
||||
};
|
||||
|
||||
optgroup->append_single_option_line("use_relative_e_distances");
|
||||
optgroup->append_single_option_line("use_firmware_retraction");
|
||||
// optgroup->append_single_option_line("spaghetti_detector");
|
||||
|
||||
@@ -1367,9 +1367,6 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig&
|
||||
else if (opt_key == "bed_exclude_area") {
|
||||
return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
}
|
||||
else if (opt_key == "thumbnails") {
|
||||
return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
}
|
||||
else if (opt_key == "head_wrap_detect_zone") {
|
||||
return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user