Merge with master
This commit is contained in:
commit
85b6784dcb
@ -1620,7 +1620,7 @@ sub Render {
|
|||||||
#==============================================================================================================================
|
#==============================================================================================================================
|
||||||
$self->mark_volumes_for_layer_height;
|
$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->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
|
# do not cull backfaces to show broken geometry, if any
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
@ -2444,10 +2444,8 @@ sub reset_legend_texture {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub get_current_print_zs {
|
sub get_current_print_zs {
|
||||||
my ($self) = @_;
|
my ($self, $active_only) = @_;
|
||||||
|
return $self->volumes->get_current_print_zs($active_only);
|
||||||
my $count = $self->volumes->get_current_print_zs();
|
|
||||||
return $count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -579,7 +579,8 @@ sub _on_select_preset {
|
|||||||
wxTheApp->{preset_bundle}->update_platter_filament_ui($idx, $choice);
|
wxTheApp->{preset_bundle}->update_platter_filament_ui($idx, $choice);
|
||||||
} else {
|
} else {
|
||||||
my $selected_item = $choice->GetSelection();
|
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);
|
my $selected_string = $choice->GetString($selected_item);
|
||||||
if ($selected_string eq ("------- ".L("System presets")." -------") ||
|
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 $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';
|
my $method = ($have_objects && ! $export_in_progress && $model_fits) ? 'Enable' : 'Disable';
|
||||||
$self->{"btn_$_"}->$method
|
$self->{"btn_$_"}->$method
|
||||||
for grep $self->{"btn_$_"}, qw(reslice export_gcode print send_gcode);
|
for grep $self->{"btn_$_"}, qw(reslice export_gcode print send_gcode);
|
||||||
|
@ -243,7 +243,8 @@ sub reload_scene {
|
|||||||
# checks for geometry outside the print volume to render it accordingly
|
# checks for geometry outside the print volume to render it accordingly
|
||||||
if (scalar @{$self->volumes} > 0)
|
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);
|
Slic3r::GUI::_3DScene::enable_warning_texture($self, 1);
|
||||||
# $self->set_warning_enabled(1);
|
# $self->set_warning_enabled(1);
|
||||||
@ -255,7 +256,7 @@ sub reload_scene {
|
|||||||
Slic3r::GUI::_3DScene::enable_warning_texture($self, 0);
|
Slic3r::GUI::_3DScene::enable_warning_texture($self, 0);
|
||||||
# $self->set_warning_enabled(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();
|
Slic3r::GUI::_3DScene::reset_warning_texture();
|
||||||
$self->on_enable_action_buttons->(scalar @{$self->{model}->objects} > 0) if ($self->on_enable_action_buttons);
|
$self->on_enable_action_buttons->(scalar @{$self->{model}->objects} > 0) if ($self->on_enable_action_buttons);
|
||||||
}
|
}
|
||||||
|
@ -331,22 +331,12 @@ sub load_print {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($n_layers == 0) {
|
if ($n_layers == 0) {
|
||||||
$self->enabled(0);
|
$self->reset_sliders;
|
||||||
$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->canvas->reset_legend_texture();
|
$self->canvas->reset_legend_texture();
|
||||||
$self->canvas->Refresh; # clears canvas
|
$self->canvas->Refresh; # clears canvas
|
||||||
return;
|
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') {
|
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.
|
# 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.
|
# Color by feature if it is a single extruder print.
|
||||||
@ -372,6 +362,9 @@ sub load_print {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($self->IsShown) {
|
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) {
|
if ($self->gcode_preview_data->empty) {
|
||||||
# load skirt and brim
|
# load skirt and brim
|
||||||
$self->canvas->load_print_toolpaths($self->print, \@colors);
|
$self->canvas->load_print_toolpaths($self->print, \@colors);
|
||||||
@ -390,15 +383,32 @@ sub load_print {
|
|||||||
$self->show_hide_ui_elements('full');
|
$self->show_hide_ui_elements('full');
|
||||||
|
|
||||||
# recalculates zs and update sliders accordingly
|
# 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}});
|
$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);
|
$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
|
sub update_sliders
|
||||||
{
|
{
|
||||||
my ($self, $n_layers) = @_;
|
my ($self, $n_layers) = @_;
|
||||||
@ -413,18 +423,32 @@ sub update_sliders
|
|||||||
$z_idx_low = 0;
|
$z_idx_low = 0;
|
||||||
$z_idx_high = $n_layers - 1;
|
$z_idx_high = $n_layers - 1;
|
||||||
} elsif ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
|
} elsif ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
|
||||||
# use $z_idx
|
# search new indices for nearest z (size of $self->{layers_z} may change in dependence of what is shown)
|
||||||
} else {
|
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.
|
# Out of range. Disable 'single layer' view.
|
||||||
$self->single_layer(0);
|
$self->single_layer(0);
|
||||||
$self->{checkbox_singlelayer}->SetValue(0);
|
$self->{checkbox_singlelayer}->SetValue(0);
|
||||||
$z_idx_low = 0;
|
$z_idx_low = 0;
|
||||||
$z_idx_high = $n_layers - 1;
|
$z_idx_high = $n_layers - 1;
|
||||||
}
|
} else {
|
||||||
if ($self->single_layer) {
|
|
||||||
$z_idx_low = $z_idx_high;
|
|
||||||
} elsif ($z_idx_low > $z_idx_high) {
|
|
||||||
$z_idx_low = 0;
|
$z_idx_low = 0;
|
||||||
|
$z_idx_high = $n_layers - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->slider_low->SetValue($z_idx_low);
|
$self->slider_low->SetValue($z_idx_low);
|
||||||
@ -440,12 +464,25 @@ sub set_z_range
|
|||||||
my ($self, $z_low, $z_high) = @_;
|
my ($self, $z_low, $z_high) = @_;
|
||||||
|
|
||||||
return if !$self->enabled;
|
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_low}->SetLabel(sprintf '%.2f', $z_low);
|
||||||
$self->{z_label_high}->SetLabel(sprintf '%.2f', $z_high);
|
$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;
|
my $layers_z = $self->canvas->get_current_print_zs(0);
|
||||||
$self->{z_label_low_idx}->SetLabel(sprintf '%d', $z_idx_low);
|
for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) {
|
||||||
$self->{z_label_high_idx}->SetLabel(sprintf '%d', $z_idx_high);
|
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->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6);
|
||||||
$self->canvas->Refresh if $self->IsShown;
|
$self->canvas->Refresh if $self->IsShown;
|
||||||
}
|
}
|
||||||
|
@ -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<const ConfigOptionPoints*>(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 Model::get_auto_extruder_id(unsigned int max_extruders)
|
||||||
{
|
{
|
||||||
unsigned int id = s_auto_extruder_id;
|
unsigned int id = s_auto_extruder_id;
|
||||||
|
@ -285,10 +285,6 @@ public:
|
|||||||
// Ensures that the min z of the model is not negative
|
// Ensures that the min z of the model is not negative
|
||||||
void adjust_min_z();
|
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(); }
|
void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); }
|
||||||
|
|
||||||
static unsigned int get_auto_extruder_id(unsigned int max_extruders);
|
static unsigned int get_auto_extruder_id(unsigned int max_extruders);
|
||||||
|
@ -646,29 +646,40 @@ void GLVolumeCollection::render_legacy() const
|
|||||||
glDisable(GL_BLEND);
|
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)
|
if (config == nullptr)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
const ConfigOptionPoints* opt = dynamic_cast<const ConfigOptionPoints*>(config->option("bed_shape"));
|
const ConfigOptionPoints* opt = dynamic_cast<const ConfigOptionPoints*>(config->option("bed_shape"));
|
||||||
if (opt == nullptr)
|
if (opt == nullptr)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
|
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")));
|
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
|
// Allow the objects to protrude below the print bed
|
||||||
print_volume.min.z = -1e10;
|
print_volume.min.z = -1e10;
|
||||||
|
|
||||||
|
bool contained = true;
|
||||||
for (GLVolume* volume : this->volumes)
|
for (GLVolume* volume : this->volumes)
|
||||||
{
|
{
|
||||||
if (all_inside)
|
if (volume != nullptr)
|
||||||
{
|
{
|
||||||
volume->is_outside = false;
|
bool state = print_volume.contains(volume->transformed_bounding_box());
|
||||||
continue;
|
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<double> GLVolumeCollection::get_current_print_zs() const
|
std::vector<double> GLVolumeCollection::get_current_print_zs(bool active_only) const
|
||||||
{
|
{
|
||||||
// Collect layer top positions of all volumes.
|
// Collect layer top positions of all volumes.
|
||||||
std::vector<double> print_zs;
|
std::vector<double> print_zs;
|
||||||
for (GLVolume *vol : this->volumes)
|
for (GLVolume *vol : this->volumes)
|
||||||
{
|
{
|
||||||
if (vol->is_active)
|
if (!active_only || vol->is_active)
|
||||||
append(print_zs, vol->print_zs);
|
append(print_zs, vol->print_zs);
|
||||||
}
|
}
|
||||||
std::sort(print_zs.begin(), print_zs.end());
|
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));
|
TypesList::iterator type = std::find(types.begin(), types.end(), Type(polyline.type));
|
||||||
if (type != types.end())
|
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.quad_indices.size());
|
||||||
type->volume->offsets.push_back(type->volume->indexed_vertex_array.triangle_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));
|
FeedratesList::iterator feedrate = std::find(feedrates.begin(), feedrates.end(), Feedrate(polyline.feedrate));
|
||||||
if (feedrate != feedrates.end())
|
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.quad_indices.size());
|
||||||
feedrate->volume->offsets.push_back(feedrate->volume->indexed_vertex_array.triangle_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));
|
ToolsList::iterator tool = std::find(tools.begin(), tools.end(), Tool(polyline.extruder_id));
|
||||||
if (tool != tools.end())
|
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.quad_indices.size());
|
||||||
tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.triangle_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);
|
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->print_zs.push_back(unscale(position.position.z));
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size());
|
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);
|
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->print_zs.push_back(unscale(position.position.z));
|
||||||
volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size());
|
volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size());
|
||||||
|
@ -428,11 +428,13 @@ public:
|
|||||||
print_box_max[0] = max_x; print_box_max[1] = max_y; print_box_max[2] = max_z;
|
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);
|
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
|
// Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection
|
||||||
std::vector<double> get_current_print_zs() const;
|
std::vector<double> get_current_print_zs(bool active_only) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLVolumeCollection(const GLVolumeCollection &other);
|
GLVolumeCollection(const GLVolumeCollection &other);
|
||||||
|
@ -57,6 +57,9 @@ void AppConfig::set_defaults()
|
|||||||
// https://github.com/prusa3d/Slic3r/issues/233
|
// https://github.com/prusa3d/Slic3r/issues/233
|
||||||
if (get("use_legacy_opengl").empty())
|
if (get("use_legacy_opengl").empty())
|
||||||
set("use_legacy_opengl", "0");
|
set("use_legacy_opengl", "0");
|
||||||
|
|
||||||
|
if (get("remember_output_path").empty())
|
||||||
|
set("remember_output_path", "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppConfig::load()
|
void AppConfig::load()
|
||||||
|
@ -607,7 +607,7 @@ void show_error(wxWindow* parent, const wxString& message) {
|
|||||||
|
|
||||||
void show_error_id(int id, const std::string& message) {
|
void show_error_id(int id, const std::string& message) {
|
||||||
auto *parent = id != 0 ? wxWindow::FindWindowById(id) : nullptr;
|
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){
|
void show_info(wxWindow* parent, const wxString& message, const wxString& title){
|
||||||
|
@ -71,11 +71,12 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) :
|
|||||||
text->Wrap(CONTENT_WIDTH);
|
text->Wrap(CONTENT_WIDTH);
|
||||||
p_sizer->Add(text, 1, wxEXPAND);
|
p_sizer->Add(text, 1, wxEXPAND);
|
||||||
|
|
||||||
panel->SetMinSize(wxSize(CONTENT_WIDTH, CONTENT_HEIGHT));
|
panel->SetMinSize(wxSize(CONTENT_WIDTH, 0));
|
||||||
panel->SetScrollRate(0, 5);
|
panel->SetScrollRate(0, 5);
|
||||||
|
|
||||||
content_sizer->Add(panel, 1, wxEXPAND);
|
content_sizer->Add(panel, 1, wxEXPAND);
|
||||||
|
|
||||||
|
SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT));
|
||||||
Fit();
|
Fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ struct MsgDialog : wxDialog
|
|||||||
protected:
|
protected:
|
||||||
enum {
|
enum {
|
||||||
CONTENT_WIDTH = 500,
|
CONTENT_WIDTH = 500,
|
||||||
CONTENT_HEIGHT = 300,
|
CONTENT_MAX_HEIGHT = 600,
|
||||||
BORDER = 30,
|
BORDER = 30,
|
||||||
VERT_SPACING = 15,
|
VERT_SPACING = 15,
|
||||||
HORIZ_SPACING = 5,
|
HORIZ_SPACING = 5,
|
||||||
|
@ -244,6 +244,7 @@ public:
|
|||||||
const std::string& get_suffix_modified();
|
const std::string& get_suffix_modified();
|
||||||
|
|
||||||
// Return a preset possibly with modifications.
|
// Return a preset possibly with modifications.
|
||||||
|
Preset& default_preset() { return m_presets.front(); }
|
||||||
const Preset& default_preset() const { 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.
|
// 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]; }
|
Preset& preset(size_t idx) { return (int(idx) == m_idx_selected) ? m_edited_preset : m_presets[idx]; }
|
||||||
|
@ -53,27 +53,31 @@ PresetBundle::PresetBundle() :
|
|||||||
wxImage::AddHandler(new wxPNGHandler);
|
wxImage::AddHandler(new wxPNGHandler);
|
||||||
|
|
||||||
// Create the ID config keys, as they are not part of the Static print config classes.
|
// 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->prints.default_preset().config.opt_string("print_settings_id", true);
|
||||||
this->filaments.preset(0).config.opt_string("filament_settings_id", true);
|
this->filaments.default_preset().config.opt_string("filament_settings_id", true);
|
||||||
this->printers.preset(0).config.opt_string("print_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.
|
// 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.default_preset().config.optptr("compatible_printers", true);
|
||||||
this->filaments.preset(0).config.optptr("compatible_printers_condition", true);
|
this->filaments.default_preset().config.optptr("compatible_printers_condition", true);
|
||||||
this->prints.preset(0).config.optptr("compatible_printers", true);
|
this->prints.default_preset().config.optptr("compatible_printers", true);
|
||||||
this->prints.preset(0).config.optptr("compatible_printers_condition", true);
|
this->prints.default_preset().config.optptr("compatible_printers_condition", true);
|
||||||
// Create the "inherits" keys.
|
// Create the "inherits" keys.
|
||||||
this->prints.preset(0).config.optptr("inherits", true);
|
this->prints.default_preset().config.optptr("inherits", true);
|
||||||
this->filaments.preset(0).config.optptr("inherits", true);
|
this->filaments.default_preset().config.optptr("inherits", true);
|
||||||
this->printers.preset(0).config.optptr("inherits", true);
|
this->printers.default_preset().config.optptr("inherits", true);
|
||||||
// Create the "printer_vendor", "printer_model" and "printer_variant" keys.
|
// Create the "printer_vendor", "printer_model" and "printer_variant" keys.
|
||||||
this->printers.preset(0).config.optptr("printer_vendor", true);
|
this->printers.default_preset().config.optptr("printer_vendor", true);
|
||||||
this->printers.preset(0).config.optptr("printer_model", true);
|
this->printers.default_preset().config.optptr("printer_model", true);
|
||||||
this->printers.preset(0).config.optptr("printer_variant", true);
|
this->printers.default_preset().config.optptr("printer_variant", true);
|
||||||
|
// Load the default preset bitmaps.
|
||||||
this->prints .load_bitmap_default("cog.png");
|
this->prints .load_bitmap_default("cog.png");
|
||||||
this->filaments.load_bitmap_default("spool.png");
|
this->filaments.load_bitmap_default("spool.png");
|
||||||
this->printers .load_bitmap_default("printer_empty.png");
|
this->printers .load_bitmap_default("printer_empty.png");
|
||||||
this->load_compatible_bitmaps();
|
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);
|
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;
|
continue;
|
||||||
if (presets != nullptr) {
|
if (presets != nullptr) {
|
||||||
// Load the print, filament or printer preset.
|
// 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)
|
for (auto &kvp : section.second)
|
||||||
config.set_deserialize(kvp.first, kvp.second.data());
|
config.set_deserialize(kvp.first, kvp.second.data());
|
||||||
Preset::normalize(config);
|
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) {
|
if ((flags & LOAD_CFGBNDLE_SYSTEM) && presets == &printers) {
|
||||||
// Filter out printer presets, which are not mentioned in the vendor profile.
|
// Filter out printer presets, which are not mentioned in the vendor profile.
|
||||||
// These presets are considered not installed.
|
// These presets are considered not installed.
|
||||||
|
@ -93,9 +93,8 @@
|
|||||||
int count()
|
int count()
|
||||||
%code{% RETVAL = THIS->volumes.size(); %};
|
%code{% RETVAL = THIS->volumes.size(); %};
|
||||||
|
|
||||||
std::vector<double> get_current_print_zs()
|
std::vector<double> get_current_print_zs(bool active_only)
|
||||||
%code{% RETVAL = THIS->get_current_print_zs(); %};
|
%code{% RETVAL = THIS->get_current_print_zs(active_only); %};
|
||||||
|
|
||||||
|
|
||||||
void set_range(double low, double high);
|
void set_range(double low, double high);
|
||||||
|
|
||||||
@ -105,7 +104,12 @@
|
|||||||
void release_geometry();
|
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 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);
|
void update_colors_by_extruder(DynamicPrintConfig* config);
|
||||||
|
|
||||||
bool move_volume_up(int idx)
|
bool move_volume_up(int idx)
|
||||||
|
@ -99,9 +99,6 @@
|
|||||||
|
|
||||||
void print_info() const;
|
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)
|
bool store_stl(char *path, bool binary)
|
||||||
%code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %};
|
%code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %};
|
||||||
bool store_amf(char *path, Print* print, bool export_print_config)
|
bool store_amf(char *path, Print* print, bool export_print_config)
|
||||||
|
Loading…
Reference in New Issue
Block a user