diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index fce0231e2..5f35fb8e3 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1620,7 +1620,7 @@ sub Render { #============================================================================================================================== $self->mark_volumes_for_layer_height; $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height')); - $self->volumes->update_outside_state($self->{config}, 0); + $self->volumes->check_outside_state($self->{config}); # do not cull backfaces to show broken geometry, if any glDisable(GL_CULL_FACE); } @@ -2444,10 +2444,8 @@ sub reset_legend_texture { } sub get_current_print_zs { - my ($self) = @_; - - my $count = $self->volumes->get_current_print_zs(); - return $count; + my ($self, $active_only) = @_; + return $self->volumes->get_current_print_zs($active_only); } 1; diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index b136d89a1..481ffd013 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -579,7 +579,8 @@ sub _on_select_preset { wxTheApp->{preset_bundle}->update_platter_filament_ui($idx, $choice); } else { my $selected_item = $choice->GetSelection(); - return if ($selected_item == $self->{"selected_item_$group"}); + return if ($selected_item == $self->{"selected_item_$group"} && + !Slic3r::GUI::get_preset_tab($group)->current_preset_is_dirty); my $selected_string = $choice->GetString($selected_item); if ($selected_string eq ("------- ".L("System presets")." -------") || @@ -1984,7 +1985,7 @@ sub object_list_changed { } my $export_in_progress = $self->{export_gcode_output_file} || $self->{send_gcode_file}; - my $model_fits = $self->{model}->fits_print_volume($self->{config}); + my $model_fits = $self->{canvas3D} ? $self->{canvas3D}->volumes->check_outside_state($self->{config}) : 1; my $method = ($have_objects && ! $export_in_progress && $model_fits) ? 'Enable' : 'Disable'; $self->{"btn_$_"}->$method for grep $self->{"btn_$_"}, qw(reslice export_gcode print send_gcode); diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index 407a0b6a9..c6d9d1c79 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -243,7 +243,8 @@ sub reload_scene { # checks for geometry outside the print volume to render it accordingly if (scalar @{$self->volumes} > 0) { - if (!$self->{model}->fits_print_volume($self->{config})) { + my $contained = $self->volumes->check_outside_state($self->{config}); + if (!$contained) { #============================================================================================================================== Slic3r::GUI::_3DScene::enable_warning_texture($self, 1); # $self->set_warning_enabled(1); @@ -255,7 +256,7 @@ sub reload_scene { Slic3r::GUI::_3DScene::enable_warning_texture($self, 0); # $self->set_warning_enabled(0); #============================================================================================================================== - $self->volumes->update_outside_state($self->{config}, 1); + $self->volumes->reset_outside_state(); Slic3r::GUI::_3DScene::reset_warning_texture(); $self->on_enable_action_buttons->(scalar @{$self->{model}->objects} > 0) if ($self->on_enable_action_buttons); } diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index 0aff64310..eb4077579 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -331,22 +331,12 @@ sub load_print { } if ($n_layers == 0) { - $self->enabled(0); - $self->set_z_range(0,0); - $self->slider_low->Hide; - $self->slider_high->Hide; - $self->{z_label_low}->SetLabel(""); - $self->{z_label_high}->SetLabel(""); - $self->{z_label_low_idx}->SetLabel(""); - $self->{z_label_high_idx}->SetLabel(""); + $self->reset_sliders; $self->canvas->reset_legend_texture(); $self->canvas->Refresh; # clears canvas return; } - # used to set the sliders to the extremes of the current zs range - $self->{force_sliders_full_range} = 0; - if ($self->{preferred_color_mode} eq 'tool_or_feature') { # It is left to Slic3r to decide whether the print shall be colored by the tool or by the feature. # Color by feature if it is a single extruder print. @@ -372,6 +362,9 @@ sub load_print { } if ($self->IsShown) { + # used to set the sliders to the extremes of the current zs range + $self->{force_sliders_full_range} = 0; + if ($self->gcode_preview_data->empty) { # load skirt and brim $self->canvas->load_print_toolpaths($self->print, \@colors); @@ -390,15 +383,32 @@ sub load_print { $self->show_hide_ui_elements('full'); # recalculates zs and update sliders accordingly - $self->{layers_z} = $self->canvas->get_current_print_zs(); + $self->{layers_z} = $self->canvas->get_current_print_zs(1); $n_layers = scalar(@{$self->{layers_z}}); - } + if ($n_layers == 0) { + # all layers filtered out + $self->reset_sliders; + $self->canvas->Refresh; # clears canvas + } + } - $self->update_sliders($n_layers); + $self->update_sliders($n_layers) if ($n_layers > 0); $self->_loaded(1); } } +sub reset_sliders { + my ($self) = @_; + $self->enabled(0); + $self->set_z_range(0,0); + $self->slider_low->Hide; + $self->slider_high->Hide; + $self->{z_label_low}->SetLabel(""); + $self->{z_label_high}->SetLabel(""); + $self->{z_label_low_idx}->SetLabel(""); + $self->{z_label_high_idx}->SetLabel(""); +} + sub update_sliders { my ($self, $n_layers) = @_; @@ -413,18 +423,32 @@ sub update_sliders $z_idx_low = 0; $z_idx_high = $n_layers - 1; } elsif ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) { - # use $z_idx - } else { + # search new indices for nearest z (size of $self->{layers_z} may change in dependence of what is shown) + if (defined($self->{z_low})) { + for (my $i = scalar(@{$self->{layers_z}}) - 1; $i >= 0; $i -= 1) { + if ($self->{layers_z}[$i] <= $self->{z_low}) { + $z_idx_low = $i; + last; + } + } + } + if (defined($self->{z_high})) { + for (my $i = scalar(@{$self->{layers_z}}) - 1; $i >= 0; $i -= 1) { + if ($self->{layers_z}[$i] <= $self->{z_high}) { + $z_idx_high = $i; + last; + } + } + } + } elsif ($z_idx_high >= $n_layers) { # Out of range. Disable 'single layer' view. $self->single_layer(0); $self->{checkbox_singlelayer}->SetValue(0); $z_idx_low = 0; $z_idx_high = $n_layers - 1; - } - if ($self->single_layer) { - $z_idx_low = $z_idx_high; - } elsif ($z_idx_low > $z_idx_high) { + } else { $z_idx_low = 0; + $z_idx_high = $n_layers - 1; } $self->slider_low->SetValue($z_idx_low); @@ -440,12 +464,25 @@ sub set_z_range my ($self, $z_low, $z_high) = @_; return if !$self->enabled; + $self->{z_low} = $z_low; + $self->{z_high} = $z_high; $self->{z_label_low}->SetLabel(sprintf '%.2f', $z_low); $self->{z_label_high}->SetLabel(sprintf '%.2f', $z_high); - my $z_idx_low = 1 + $self->slider_low->GetValue; - my $z_idx_high = 1 + $self->slider_high->GetValue; - $self->{z_label_low_idx}->SetLabel(sprintf '%d', $z_idx_low); - $self->{z_label_high_idx}->SetLabel(sprintf '%d', $z_idx_high); + + my $layers_z = $self->canvas->get_current_print_zs(0); + for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) { + if (($z_low - 1e-6 < @{$layers_z}[$i]) && (@{$layers_z}[$i] < $z_low + 1e-6)) { + $self->{z_label_low_idx}->SetLabel(sprintf '%d', $i + 1); + last; + } + } + for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) { + if (($z_high - 1e-6 < @{$layers_z}[$i]) && (@{$layers_z}[$i] < $z_high + 1e-6)) { + $self->{z_label_high_idx}->SetLabel(sprintf '%d', $i + 1); + last; + } + } + $self->canvas->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6); $self->canvas->Refresh if $self->IsShown; } diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 755941144..8ce23b1e5 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -451,36 +451,6 @@ void Model::adjust_min_z() } } -bool Model::fits_print_volume(const DynamicPrintConfig* config) const -{ - if (config == nullptr) - return false; - - if (objects.empty()) - return true; - - const ConfigOptionPoints* opt = dynamic_cast(config->option("bed_shape")); - if (opt == nullptr) - return false; - - BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); - BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height"))); - // Allow the objects to protrude below the print bed - print_volume.min.z = -1e10; - return print_volume.contains(transformed_bounding_box()); -} - -bool Model::fits_print_volume(const FullPrintConfig &config) const -{ - if (objects.empty()) - return true; - BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values)); - BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height)); - // Allow the objects to protrude below the print bed - print_volume.min.z = -1e10; - return print_volume.contains(transformed_bounding_box()); -} - unsigned int Model::get_auto_extruder_id(unsigned int max_extruders) { unsigned int id = s_auto_extruder_id; diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index 4835028b9..8b63c3641 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -285,10 +285,6 @@ public: // Ensures that the min z of the model is not negative void adjust_min_z(); - // Returs true if this model is contained into the print volume defined inside the given config - bool fits_print_volume(const DynamicPrintConfig* config) const; - bool fits_print_volume(const FullPrintConfig &config) const; - void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); } static unsigned int get_auto_extruder_id(unsigned int max_extruders); diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 24e523002..08802139d 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -522,7 +522,7 @@ std::string Print::validate() const // Allow the objects to protrude below the print bed, only the part of the object above the print bed will be sliced. print_volume.min.z = -1e10; for (PrintObject *po : this->objects) { - if (! print_volume.contains(po->model_object()->tight_bounding_box(false))) + if (!print_volume.contains(po->model_object()->tight_bounding_box(false))) return "Some objects are outside of the print volume."; } diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 57c926f7e..76353c15d 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -646,29 +646,40 @@ void GLVolumeCollection::render_legacy() const glDisable(GL_BLEND); } -void GLVolumeCollection::update_outside_state(const DynamicPrintConfig* config, bool all_inside) +bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config) { if (config == nullptr) - return; + return false; const ConfigOptionPoints* opt = dynamic_cast(config->option("bed_shape")); if (opt == nullptr) - return; + return false; BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height"))); // Allow the objects to protrude below the print bed print_volume.min.z = -1e10; + bool contained = true; for (GLVolume* volume : this->volumes) { - if (all_inside) + if (volume != nullptr) { - volume->is_outside = false; - continue; + bool state = print_volume.contains(volume->transformed_bounding_box()); + contained &= state; + volume->is_outside = !state; } + } - volume->is_outside = !print_volume.contains(volume->transformed_bounding_box()); + return contained; +} + +void GLVolumeCollection::reset_outside_state() +{ + for (GLVolume* volume : this->volumes) + { + if (volume != nullptr) + volume->is_outside = false; } } @@ -749,13 +760,13 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con } } -std::vector GLVolumeCollection::get_current_print_zs() const +std::vector GLVolumeCollection::get_current_print_zs(bool active_only) const { // Collect layer top positions of all volumes. std::vector print_zs; for (GLVolume *vol : this->volumes) { - if (vol->is_active) + if (!active_only || vol->is_active) append(print_zs, vol->print_zs); } std::sort(print_zs.begin(), print_zs.end()); @@ -2716,7 +2727,7 @@ bool _3DScene::_travel_paths_by_type(const GCodePreviewData& preview_data, GLVol TypesList::iterator type = std::find(types.begin(), types.end(), Type(polyline.type)); if (type != types.end()) { - type->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().max.z)); + type->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().min.z)); type->volume->offsets.push_back(type->volume->indexed_vertex_array.quad_indices.size()); type->volume->offsets.push_back(type->volume->indexed_vertex_array.triangle_indices.size()); @@ -2782,7 +2793,7 @@ bool _3DScene::_travel_paths_by_feedrate(const GCodePreviewData& preview_data, G FeedratesList::iterator feedrate = std::find(feedrates.begin(), feedrates.end(), Feedrate(polyline.feedrate)); if (feedrate != feedrates.end()) { - feedrate->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().max.z)); + feedrate->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().min.z)); feedrate->volume->offsets.push_back(feedrate->volume->indexed_vertex_array.quad_indices.size()); feedrate->volume->offsets.push_back(feedrate->volume->indexed_vertex_array.triangle_indices.size()); @@ -2848,7 +2859,7 @@ bool _3DScene::_travel_paths_by_tool(const GCodePreviewData& preview_data, GLVol ToolsList::iterator tool = std::find(tools.begin(), tools.end(), Tool(polyline.extruder_id)); if (tool != tools.end()) { - tool->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().max.z)); + tool->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().min.z)); tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.quad_indices.size()); tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.triangle_indices.size()); @@ -2872,7 +2883,10 @@ void _3DScene::_load_gcode_retractions(const GCodePreviewData& preview_data, GLV { volumes.volumes.emplace_back(volume); - for (const GCodePreviewData::Retraction::Position& position : preview_data.retraction.positions) + GCodePreviewData::Retraction::PositionsList copy(preview_data.retraction.positions); + std::sort(copy.begin(), copy.end(), [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2){ return p1.position.z < p2.position.z; }); + + for (const GCodePreviewData::Retraction::Position& position : copy) { volume->print_zs.push_back(unscale(position.position.z)); volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size()); @@ -2900,7 +2914,10 @@ void _3DScene::_load_gcode_unretractions(const GCodePreviewData& preview_data, G { volumes.volumes.emplace_back(volume); - for (const GCodePreviewData::Retraction::Position& position : preview_data.unretraction.positions) + GCodePreviewData::Retraction::PositionsList copy(preview_data.unretraction.positions); + std::sort(copy.begin(), copy.end(), [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2){ return p1.position.z < p2.position.z; }); + + for (const GCodePreviewData::Retraction::Position& position : copy) { volume->print_zs.push_back(unscale(position.position.z)); volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size()); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index ad8ca75e4..9c56fbb59 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -428,11 +428,13 @@ public: print_box_max[0] = max_x; print_box_max[1] = max_y; print_box_max[2] = max_z; } - void update_outside_state(const DynamicPrintConfig* config, bool all_inside); + bool check_outside_state(const DynamicPrintConfig* config); + void reset_outside_state(); + void update_colors_by_extruder(const DynamicPrintConfig* config); // Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection - std::vector get_current_print_zs() const; + std::vector get_current_print_zs(bool active_only) const; private: GLVolumeCollection(const GLVolumeCollection &other); diff --git a/xs/src/slic3r/GUI/AppConfig.cpp b/xs/src/slic3r/GUI/AppConfig.cpp index c1c90fb72..2a33cd733 100644 --- a/xs/src/slic3r/GUI/AppConfig.cpp +++ b/xs/src/slic3r/GUI/AppConfig.cpp @@ -57,6 +57,9 @@ void AppConfig::set_defaults() // https://github.com/prusa3d/Slic3r/issues/233 if (get("use_legacy_opengl").empty()) set("use_legacy_opengl", "0"); + + if (get("remember_output_path").empty()) + set("remember_output_path", "1"); } void AppConfig::load() diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index aad970236..b00813a71 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -607,7 +607,7 @@ void show_error(wxWindow* parent, const wxString& message) { void show_error_id(int id, const std::string& message) { auto *parent = id != 0 ? wxWindow::FindWindowById(id) : nullptr; - show_error(parent, message); + show_error(parent, wxString::FromUTF8(message.data())); } void show_info(wxWindow* parent, const wxString& message, const wxString& title){ diff --git a/xs/src/slic3r/GUI/MsgDialog.cpp b/xs/src/slic3r/GUI/MsgDialog.cpp index 6fba47a37..58679ed9e 100644 --- a/xs/src/slic3r/GUI/MsgDialog.cpp +++ b/xs/src/slic3r/GUI/MsgDialog.cpp @@ -71,11 +71,12 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) : text->Wrap(CONTENT_WIDTH); p_sizer->Add(text, 1, wxEXPAND); - panel->SetMinSize(wxSize(CONTENT_WIDTH, CONTENT_HEIGHT)); + panel->SetMinSize(wxSize(CONTENT_WIDTH, 0)); panel->SetScrollRate(0, 5); content_sizer->Add(panel, 1, wxEXPAND); + SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT)); Fit(); } diff --git a/xs/src/slic3r/GUI/MsgDialog.hpp b/xs/src/slic3r/GUI/MsgDialog.hpp index a01127023..2d570a0bf 100644 --- a/xs/src/slic3r/GUI/MsgDialog.hpp +++ b/xs/src/slic3r/GUI/MsgDialog.hpp @@ -31,7 +31,7 @@ struct MsgDialog : wxDialog protected: enum { CONTENT_WIDTH = 500, - CONTENT_HEIGHT = 300, + CONTENT_MAX_HEIGHT = 600, BORDER = 30, VERT_SPACING = 15, HORIZ_SPACING = 5, diff --git a/xs/src/slic3r/GUI/Preset.hpp b/xs/src/slic3r/GUI/Preset.hpp index ab01a48ff..31fb69aa8 100644 --- a/xs/src/slic3r/GUI/Preset.hpp +++ b/xs/src/slic3r/GUI/Preset.hpp @@ -244,6 +244,7 @@ public: const std::string& get_suffix_modified(); // Return a preset possibly with modifications. + Preset& default_preset() { return m_presets.front(); } const Preset& default_preset() const { return m_presets.front(); } // Return a preset by an index. If the preset is active, a temporary copy is returned. Preset& preset(size_t idx) { return (int(idx) == m_idx_selected) ? m_edited_preset : m_presets[idx]; } diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index ef48eb6d4..a34640da7 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -53,27 +53,31 @@ PresetBundle::PresetBundle() : wxImage::AddHandler(new wxPNGHandler); // Create the ID config keys, as they are not part of the Static print config classes. - this->prints.preset(0).config.opt_string("print_settings_id", true); - this->filaments.preset(0).config.opt_string("filament_settings_id", true); - this->printers.preset(0).config.opt_string("print_settings_id", true); + this->prints.default_preset().config.opt_string("print_settings_id", true); + this->filaments.default_preset().config.opt_string("filament_settings_id", true); + this->printers.default_preset().config.opt_string("printer_settings_id", true); // Create the "compatible printers" keys, as they are not part of the Static print config classes. - this->filaments.preset(0).config.optptr("compatible_printers", true); - this->filaments.preset(0).config.optptr("compatible_printers_condition", true); - this->prints.preset(0).config.optptr("compatible_printers", true); - this->prints.preset(0).config.optptr("compatible_printers_condition", true); + this->filaments.default_preset().config.optptr("compatible_printers", true); + this->filaments.default_preset().config.optptr("compatible_printers_condition", true); + this->prints.default_preset().config.optptr("compatible_printers", true); + this->prints.default_preset().config.optptr("compatible_printers_condition", true); // Create the "inherits" keys. - this->prints.preset(0).config.optptr("inherits", true); - this->filaments.preset(0).config.optptr("inherits", true); - this->printers.preset(0).config.optptr("inherits", true); + this->prints.default_preset().config.optptr("inherits", true); + this->filaments.default_preset().config.optptr("inherits", true); + this->printers.default_preset().config.optptr("inherits", true); // Create the "printer_vendor", "printer_model" and "printer_variant" keys. - this->printers.preset(0).config.optptr("printer_vendor", true); - this->printers.preset(0).config.optptr("printer_model", true); - this->printers.preset(0).config.optptr("printer_variant", true); - + this->printers.default_preset().config.optptr("printer_vendor", true); + this->printers.default_preset().config.optptr("printer_model", true); + this->printers.default_preset().config.optptr("printer_variant", true); + // Load the default preset bitmaps. this->prints .load_bitmap_default("cog.png"); this->filaments.load_bitmap_default("spool.png"); this->printers .load_bitmap_default("printer_empty.png"); this->load_compatible_bitmaps(); + // Re-activate the default presets, so their "edited" preset copies will be updated with the additional configuration values above. + this->prints .select_preset(0); + this->filaments.select_preset(0); + this->printers .select_preset(0); this->project_config.apply_only(FullPrintConfig::defaults(), s_project_options); } @@ -832,10 +836,28 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla continue; if (presets != nullptr) { // Load the print, filament or printer preset. - DynamicPrintConfig config(presets->default_preset().config); + const DynamicPrintConfig &default_config = presets->default_preset().config; + DynamicPrintConfig config(default_config); for (auto &kvp : section.second) config.set_deserialize(kvp.first, kvp.second.data()); Preset::normalize(config); + // Report configuration fields, which are misplaced into a wrong group. + std::string incorrect_keys; + size_t n_incorrect_keys = 0; + for (const std::string &key : config.keys()) + if (! default_config.has(key)) { + if (incorrect_keys.empty()) + incorrect_keys = key; + else { + incorrect_keys += ", "; + incorrect_keys += key; + } + config.erase(key); + ++ n_incorrect_keys; + } + if (! incorrect_keys.empty()) + BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The printer preset \"" << + section.first << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed"; if ((flags & LOAD_CFGBNDLE_SYSTEM) && presets == &printers) { // Filter out printer presets, which are not mentioned in the vendor profile. // These presets are considered not installed. diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 0bb22888b..51317ec5d 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -93,10 +93,9 @@ int count() %code{% RETVAL = THIS->volumes.size(); %}; - std::vector get_current_print_zs() - %code{% RETVAL = THIS->get_current_print_zs(); %}; + std::vector get_current_print_zs(bool active_only) + %code{% RETVAL = THIS->get_current_print_zs(active_only); %}; - void set_range(double low, double high); void render_VBOs() const; @@ -105,7 +104,12 @@ void release_geometry(); void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z); - void update_outside_state(DynamicPrintConfig* config, bool all_inside); + bool check_outside_state(DynamicPrintConfig* config) + %code%{ + RETVAL = THIS->check_outside_state(config); + %}; + + void reset_outside_state(); void update_colors_by_extruder(DynamicPrintConfig* config); bool move_volume_up(int idx) diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp index 5b8318353..25c26c380 100644 --- a/xs/xsp/Model.xsp +++ b/xs/xsp/Model.xsp @@ -99,9 +99,6 @@ void print_info() const; - bool fits_print_volume(DynamicPrintConfig* config) const - %code%{ RETVAL = THIS->fits_print_volume(config); %}; - bool store_stl(char *path, bool binary) %code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %}; bool store_amf(char *path, Print* print, bool export_print_config)