mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-01 04:21:59 +08:00
fix spacing doesn't do anything until width is modified
supermerill/SuperSlicer#1341
This commit is contained in:
parent
bb6c3a2d79
commit
573d2d8a22
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user