fix spacing doesn't do anything until width is modified

supermerill/SuperSlicer#1341
This commit is contained in:
remi durand 2021-06-24 20:34:01 +02:00
parent bb6c3a2d79
commit 573d2d8a22
5 changed files with 20 additions and 10 deletions

View File

@ -469,14 +469,15 @@ void ConfigBase::apply_only(const ConfigBase &other, const t_config_option_keys
} }
// this will *ignore* options not present in both configs // this will *ignore* options not present in both configs
t_config_option_keys ConfigBase::diff(const ConfigBase &other) const t_config_option_keys ConfigBase::diff(const ConfigBase &other, bool even_phony /*=true*/) const
{ {
t_config_option_keys diff; t_config_option_keys diff;
for (const t_config_option_key &opt_key : this->keys()) { for (const t_config_option_key &opt_key : this->keys()) {
const ConfigOption *this_opt = this->option(opt_key); const ConfigOption *this_opt = this->option(opt_key);
const ConfigOption *other_opt = other.option(opt_key); const ConfigOption *other_opt = other.option(opt_key);
//dirty if both exist, they aren't both phony and value is different //dirty if both exist, they aren't both phony and value is different
if (this_opt != nullptr && other_opt != nullptr && !(this_opt->is_phony() && other_opt->is_phony()) if (this_opt != nullptr && other_opt != nullptr
&& (even_phony || !(this_opt->is_phony() && other_opt->is_phony()))
&& ((*this_opt != *other_opt) || (this_opt->is_phony() != other_opt->is_phony()))) && ((*this_opt != *other_opt) || (this_opt->is_phony() != other_opt->is_phony())))
diff.emplace_back(opt_key); diff.emplace_back(opt_key);
} }

View File

@ -1886,7 +1886,7 @@ public:
// or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set. // or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set.
void apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false); void apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false);
bool equals(const ConfigBase &other) const { return this->keys().size() == other.keys().size() && this->diff(other).empty(); } bool equals(const ConfigBase &other) const { return this->keys().size() == other.keys().size() && this->diff(other).empty(); }
t_config_option_keys diff(const ConfigBase &other) const; t_config_option_keys diff(const ConfigBase &other, bool even_phony = true) const;
t_config_option_keys equal(const ConfigBase &other) const; t_config_option_keys equal(const ConfigBase &other) const;
std::string opt_serialize(const t_config_option_key &opt_key) const; std::string opt_serialize(const t_config_option_key &opt_key) const;

View File

@ -1391,14 +1391,15 @@ void add_correct_opts_to_diff(const std::string &opt_key, t_config_option_keys&
} }
// Use deep_diff to correct return of changed options, considering individual options for each extruder. // Use deep_diff to correct return of changed options, considering individual options for each extruder.
inline t_config_option_keys deep_diff(const ConfigBase &config_this, const ConfigBase &config_other) inline t_config_option_keys deep_diff(const ConfigBase &config_this, const ConfigBase &config_other, bool ignore_phony)
{ {
t_config_option_keys diff; t_config_option_keys diff;
for (const t_config_option_key &opt_key : config_this.keys()) { for (const t_config_option_key &opt_key : config_this.keys()) {
const ConfigOption *this_opt = config_this.option(opt_key); const ConfigOption *this_opt = config_this.option(opt_key);
const ConfigOption *other_opt = config_other.option(opt_key); const ConfigOption *other_opt = config_other.option(opt_key);
//dirty if both exist, they aren't both phony and value is different //dirty if both exist, they aren't both phony and value is different
if (this_opt != nullptr && other_opt != nullptr && !(this_opt->is_phony() && other_opt->is_phony()) if (this_opt != nullptr && other_opt != nullptr
&& (ignore_phony || !(this_opt->is_phony() && other_opt->is_phony()))
&& ((*this_opt != *other_opt) || (this_opt->is_phony() != other_opt->is_phony()))) && ((*this_opt != *other_opt) || (this_opt->is_phony() != other_opt->is_phony())))
{ {
if (opt_key == "bed_shape" || opt_key == "compatible_prints" || opt_key == "compatible_printers") { if (opt_key == "bed_shape" || opt_key == "compatible_prints" || opt_key == "compatible_printers") {
@ -1425,13 +1426,13 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi
return diff; return diff;
} }
std::vector<std::string> PresetCollection::dirty_options(const Preset *edited, const Preset *reference, const bool deep_compare /*= false*/) std::vector<std::string> PresetCollection::dirty_options(const Preset *edited, const Preset *reference, const bool deep_compare /*= false*/, const bool ignore_phony)
{ {
std::vector<std::string> changed; std::vector<std::string> changed;
if (edited != nullptr && reference != nullptr) { if (edited != nullptr && reference != nullptr) {
changed = deep_compare ? changed = deep_compare ?
deep_diff(edited->config, reference->config) : deep_diff(edited->config, reference->config, ignore_phony) :
reference->config.diff(edited->config); reference->config.diff(edited->config, ignore_phony);
// The "compatible_printers" option key is handled differently from the others: // The "compatible_printers" option key is handled differently from the others:
// It is not mandatory. If the key is missing, it means it is compatible with any printer. // It is not mandatory. If the key is missing, it means it is compatible with any printer.
// If the key exists and it is empty, it means it is compatible with no printer. // If the key exists and it is empty, it means it is compatible with no printer.

View File

@ -444,8 +444,9 @@ public:
// Compare the content of get_selected_preset() with get_edited_preset() configs, return true if they differ. // Compare the content of get_selected_preset() with get_edited_preset() configs, return true if they differ.
bool current_is_dirty() const { return ! this->current_dirty_options().empty(); } bool current_is_dirty() const { return ! this->current_dirty_options().empty(); }
// Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ. // Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ.
// Note that it won't take into account phony settings. Because current_dirty_options() is only used to see if the preset need to be saved.
std::vector<std::string> current_dirty_options(const bool deep_compare = false) const std::vector<std::string> current_dirty_options(const bool deep_compare = false) const
{ return dirty_options(&this->get_edited_preset(), &this->get_selected_preset(), deep_compare); } { return dirty_options(&this->get_edited_preset(), &this->get_selected_preset(), deep_compare, false); }
// Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ. // Compare the content of get_selected_preset() with get_edited_preset() configs, return the list of keys where they differ.
std::vector<std::string> current_different_from_parent_options(const bool deep_compare = false) const std::vector<std::string> current_different_from_parent_options(const bool deep_compare = false) const
{ return dirty_options(&this->get_edited_preset(), this->get_selected_preset_parent(), deep_compare); } { return dirty_options(&this->get_edited_preset(), this->get_selected_preset_parent(), deep_compare); }
@ -518,7 +519,7 @@ private:
size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible); size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible);
static std::vector<std::string> dirty_options(const Preset *edited, const Preset *reference, const bool is_printer_type = false); static std::vector<std::string> dirty_options(const Preset *edited, const Preset *reference, const bool deep_compare = false, const bool ignore_phony = true);
// Type of this PresetCollection: TYPE_PRINT, TYPE_FILAMENT or TYPE_PRINTER. // Type of this PresetCollection: TYPE_PRINT, TYPE_FILAMENT or TYPE_PRINTER.
Preset::Type m_type; Preset::Type m_type;

View File

@ -685,6 +685,7 @@ namespace Slic3r {
|| opt_key == "overhangs_width" || opt_key == "overhangs_width"
|| opt_key == "overhangs_reverse" || opt_key == "overhangs_reverse"
|| opt_key == "overhangs_reverse_threshold" || opt_key == "overhangs_reverse_threshold"
|| opt_key == "perimeter_extrusion_spacing"
|| opt_key == "perimeter_extrusion_width" || opt_key == "perimeter_extrusion_width"
|| opt_key == "infill_overlap" || opt_key == "infill_overlap"
|| opt_key == "thin_perimeters" || opt_key == "thin_perimeters"
@ -695,6 +696,8 @@ namespace Slic3r {
|| opt_key == "external_perimeters_first" || opt_key == "external_perimeters_first"
|| opt_key == "external_perimeters_hole" || opt_key == "external_perimeters_hole"
|| opt_key == "external_perimeters_nothole" || opt_key == "external_perimeters_nothole"
|| opt_key == "external_perimeter_extrusion_spacing"
|| opt_key == "external_perimeter_extrusion_width"
|| opt_key == "external_perimeters_vase" || opt_key == "external_perimeters_vase"
|| opt_key == "perimeter_loop" || opt_key == "perimeter_loop"
|| opt_key == "perimeter_loop_seam") { || opt_key == "perimeter_loop_seam") {
@ -763,6 +766,7 @@ namespace Slic3r {
|| opt_key == "fill_density" || opt_key == "fill_density"
|| opt_key == "interface_shells" || opt_key == "interface_shells"
|| opt_key == "infill_extruder" || opt_key == "infill_extruder"
|| opt_key == "infill_extrusion_spacing"
|| opt_key == "infill_extrusion_width" || opt_key == "infill_extrusion_width"
|| opt_key == "infill_every_layers" || opt_key == "infill_every_layers"
|| opt_key == "infill_dense" || opt_key == "infill_dense"
@ -793,6 +797,7 @@ namespace Slic3r {
|| opt_key == "infill_connection_solid" || opt_key == "infill_connection_solid"
|| opt_key == "infill_connection_top" || opt_key == "infill_connection_top"
|| opt_key == "infill_connection_bottom" || opt_key == "infill_connection_bottom"
|| opt_key == "top_infill_extrusion_spacing"
|| opt_key == "top_infill_extrusion_width") { || opt_key == "top_infill_extrusion_width") {
steps.emplace_back(posInfill); steps.emplace_back(posInfill);
} else if ( } else if (
@ -804,6 +809,7 @@ namespace Slic3r {
|| opt_key == "no_perimeter_unsupported_algo" || opt_key == "no_perimeter_unsupported_algo"
|| opt_key == "perimeters" || opt_key == "perimeters"
|| opt_key == "perimeter_overlap" || opt_key == "perimeter_overlap"
|| opt_key == "solid_infill_extrusion_spacing"
|| opt_key == "solid_infill_extrusion_width") { || opt_key == "solid_infill_extrusion_width") {
steps.emplace_back(posPerimeters); steps.emplace_back(posPerimeters);
steps.emplace_back(posPrepareInfill); steps.emplace_back(posPrepareInfill);
@ -813,6 +819,7 @@ namespace Slic3r {
steps.emplace_back(posPerimeters); steps.emplace_back(posPerimeters);
steps.emplace_back(posSupportMaterial); steps.emplace_back(posSupportMaterial);
} else if (opt_key == "bridge_flow_ratio" } else if (opt_key == "bridge_flow_ratio"
|| opt_key == "first_layer_extrusion_spacing"
|| opt_key == "first_layer_extrusion_width") { || opt_key == "first_layer_extrusion_width") {
//if (m_config.support_material_contact_distance > 0.) { //if (m_config.support_material_contact_distance > 0.) {
// Only invalidate due to bridging if bridging is enabled. // Only invalidate due to bridging if bridging is enabled.