diff --git a/MANIFEST b/MANIFEST index 57f9e42e..c3162de9 100644 --- a/MANIFEST +++ b/MANIFEST @@ -118,6 +118,7 @@ var/cog_go.png var/cross.png var/delete.png var/disk.png +var/error.png var/funnel.png var/hourglass.png var/layers.png diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 8ab6d72f..a7fdc76e 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -249,12 +249,18 @@ sub new { { my $box = Wx::StaticBox->new($self, -1, "Info"); $object_info_sizer = Wx::StaticBoxSizer->new($box, wxVERTICAL); - my $grid_sizer = Wx::FlexGridSizer->new(2, 2, 5, 5); - $object_info_sizer->Add($grid_sizer); + my $grid_sizer = Wx::FlexGridSizer->new(3, 4, 5, 5); + $grid_sizer->SetFlexibleDirection(wxHORIZONTAL); + $grid_sizer->AddGrowableCol(1, 1); + $grid_sizer->AddGrowableCol(3, 1); + $object_info_sizer->Add($grid_sizer, 0, wxEXPAND); my @info = ( - size => "Size", - volume => "Volume", + size => "Size", + volume => "Volume", + facets => "Facets", + materials => "Materials", + manifold => "Manifold", ); while (my $field = shift @info) { my $label = shift @info; @@ -264,7 +270,17 @@ sub new { $self->{"object_info_$field"} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); $self->{"object_info_$field"}->SetFont($Slic3r::GUI::small_font); - $grid_sizer->Add($self->{"object_info_$field"}, 0); + if ($field eq 'manifold') { + $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($self, -1, Wx::Bitmap->new("$Slic3r::var/error.png", wxBITMAP_TYPE_PNG)); + $self->{object_info_manifold_warning_icon}->Hide; + + my $h_sizer = Wx::BoxSizer->new(wxHORIZONTAL); + $h_sizer->Add($self->{object_info_manifold_warning_icon}, 0); + $h_sizer->Add($self->{"object_info_$field"}, 0); + $grid_sizer->Add($h_sizer, 0, wxEXPAND); + } else { + $grid_sizer->Add($self->{"object_info_$field"}, 0); + } } } @@ -1083,14 +1099,32 @@ sub selection_changed { if ($self->{object_info_size}) { # have we already loaded the info pane? if ($have_sel) { my ($obj_idx, $object) = $self->selected_object; - $self->{object_info_size}->SetLabel(sprintf "%.2f x %.2f x %.2f", @{$object->transformed_size}); + $self->{object_info_size}->SetLabel(sprintf("%.2f x %.2f x %.2f", @{$object->transformed_size})); + $self->{object_info_materials}->SetLabel($object->materials); if (my $stats = $object->mesh_stats) { $self->{object_info_volume}->SetLabel(sprintf('%.2f', $stats->{volume} * ($object->scale**3))); + $self->{object_info_facets}->SetLabel(sprintf('%d (%d shells)', $object->facets, $stats->{number_of_parts})); + if (my $errors = sum(@$stats{qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)})) { + $self->{object_info_manifold}->SetLabel(sprintf("Auto-repaired (%d errors)", $errors)); + $self->{object_info_manifold_warning_icon}->Show; + + my $message = sprintf '%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges', + @$stats{qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)}; + $self->{object_info_manifold}->SetToolTipString($message); + $self->{object_info_manifold_warning_icon}->SetToolTipString($message); + } else { + $self->{object_info_manifold}->SetLabel("Yes"); + } + } else { + $self->{object_info_facets}->SetLabel($object->facets); } } else { - $self->{"object_info_$_"}->SetLabel("") for qw(size volume); + $self->{"object_info_$_"}->SetLabel("") for qw(size volume facets materials manifold); + $self->{object_info_manifold_warning_icon}->Hide; + $self->{object_info_manifold}->SetToolTipString(""); } + $self->Layout; } } diff --git a/var/error.png b/var/error.png new file mode 100755 index 00000000..628cf2da Binary files /dev/null and b/var/error.png differ