Merge branch 'master' into xsdata

Conflicts:
	lib/Slic3r/GCode.pm
	xs/src/Point.hpp
This commit is contained in:
Alessandro Ranellucci 2013-07-13 21:00:19 +02:00
commit 31809d473f
14 changed files with 127 additions and 16 deletions

View file

@ -13,7 +13,7 @@ sub read_file {
my ($vertices, $facets) = @{$tmesh->ToPerl};
my $model = Slic3r::Model->new;
my $object = $model->add_object(vertices => $vertices);
my $object = $model->add_object(vertices => $vertices, mesh_stats => $tmesh->stats);
my $volume = $object->add_volume(facets => $facets);
return $model;
}

View file

@ -96,9 +96,13 @@ sub change_layer {
my ($layer) = @_;
$self->layer($layer);
# avoid computing overhangs if they're not needed
$self->_layer_overhangs(
$layer->id > 0
$layer->id > 0 && ($Slic3r::Config->overhangs || $Slic3r::Config->start_perimeters_at_non_overhang)
? [ map $_->expolygon->arrayref, grep $_->surface_type == S_TYPE_BOTTOM, map @{$_->slices}, @{$layer->regions} ]
$layer->id > 0 && ($Slic3r::Config->overhangs || $Slic3r::Config->start_perimeters_at_non_overhang)
? [ map $_->expolygon, grep $_->surface_type == S_TYPE_BOTTOM, map @{$_->slices}, @{$layer->regions} ]
: []
);
if ($self->config->avoid_crossing_perimeters) {
@ -168,8 +172,9 @@ sub extrude_loop {
@candidates = @concave;
if (!@candidates) {
# if none, look for any non-overhang vertex
@candidates = grep !Boost::Geometry::Utils::point_covered_by_multi_polygon($_, $self->_layer_overhangs),
@{$loop->polygon};
if ($Slic3r::Config->start_perimeters_at_non_overhang) {
@candidates = grep !Boost::Geometry::Utils::point_covered_by_multi_polygon($_, $self->_layer_overhangs), @{$loop->polygon};
}
if (!@candidates) {
# if none, all points are valid candidates
@candidates = @{$loop->polygon};

View file

@ -317,6 +317,7 @@ sub load_file {
input_file => $input_file,
input_file_object_id => $i,
model_object => $model->objects->[$i],
mesh_stats => $model->objects->[$i]->mesh_stats, # so that we can free model_object
instances => [
$model->objects->[$i]->instances
? (map $_->offset, @{$model->objects->[$i]->instances})
@ -1070,6 +1071,7 @@ sub OnDropFiles {
package Slic3r::GUI::Plater::Object;
use Moo;
use List::Util qw(first);
use Math::ConvexHull::MonotoneChain qw();
use Slic3r::Geometry qw(X Y Z MIN MAX deg2rad);
@ -1086,6 +1088,7 @@ has 'thumbnail' => (is => 'rw', trigger => \&_transform_thumbnail);
has 'transformed_thumbnail' => (is => 'rw');
has 'thumbnail_scaling_factor' => (is => 'rw', trigger => \&_transform_thumbnail);
has 'layer_height_ranges' => (is => 'rw', default => sub { [] }); # [ z_min, z_max, layer_height ]
has 'mesh_stats' => (is => 'rw');
# statistics
has 'facets' => (is => 'rw');
@ -1111,7 +1114,18 @@ sub _trigger_model_object {
sub check_manifoldness {
my $self = shift;
$self->is_manifold($self->get_model_object->check_manifoldness);
if ($self->mesh_stats) {
if (first { $self->mesh_stats->{$_} > 0 } qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)) {
warn "Warning: the input file contains manifoldness errors. "
. "Slic3r repaired it successfully by guessing what the correct shape should be, "
. "but you might still want to inspect the G-code before printing.\n";
$self->is_manifold(0);
} else {
$self->is_manifold(1);
}
} else {
$self->is_manifold($self->get_model_object->check_manifoldness);
}
return $self->is_manifold;
}

View file

@ -10,7 +10,7 @@ use base 'Wx::Dialog';
sub new {
my $class = shift;
my ($parent, %params) = @_;
my $self = $class->SUPER::new($parent, -1, "Object", wxDefaultPosition, [500,350], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
my $self = $class->SUPER::new($parent, -1, "Object", wxDefaultPosition, [500,500], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
$self->{object} = $params{object};
$self->{tabpanel} = Wx::Notebook->new($self, -1, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL);
@ -50,7 +50,7 @@ sub new {
my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize);
$self->{object} = $params{object};
my $grid_sizer = Wx::FlexGridSizer->new(3, 2, 10, 5);
my $grid_sizer = Wx::FlexGridSizer->new(3, 2, 5, 5);
$grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
$grid_sizer->AddGrowableCol(1);
@ -76,14 +76,34 @@ sub get_properties {
my $self = shift;
my $object = $self->{object};
return [
my $properties = [
['Name' => $object->name],
['Size' => sprintf "%.2f x %.2f x %.2f", @{$object->transformed_size}],
['Facets' => $object->facets],
['Vertices' => $object->vertices],
['Materials' => $object->materials],
['Two-Manifold' => $object->is_manifold ? 'Yes' : 'No'],
];
if (my $stats = $object->mesh_stats) {
push @$properties,
[ 'Shells' => $stats->{number_of_parts} ],
[ 'Volume' => sprintf('%.2f', $stats->{volume} * ($object->scale**3)) ],
[ 'Degenerate facets' => $stats->{degenerate_facets} ],
[ 'Edges fixed' => $stats->{edges_fixed} ],
[ 'Facets removed' => $stats->{facets_removed} ],
[ 'Facets added' => $stats->{facets_added} ],
[ 'Facets reversed' => $stats->{facets_reversed} ],
[ 'Backwards edges' => $stats->{backwards_edges} ],
# we don't show normals_fixed because we never provide normals
# to admesh, so it generates normals for all facets
;
} else {
push @$properties,
['Two-Manifold' => $object->is_manifold ? 'Yes' : 'No'],
;
}
return $properties;
}
package Slic3r::GUI::Plater::ObjectDialog::PreviewTab;

View file

@ -297,6 +297,7 @@ has 'vertices' => (is => 'ro', default => sub { [] });
has 'volumes' => (is => 'ro', default => sub { [] });
has 'instances' => (is => 'rw');
has 'layer_height_ranges' => (is => 'rw', default => sub { [] }); # [ z_min, z_max, layer_height ]
has 'mesh_stats' => (is => 'rw');
has '_bounding_box' => (is => 'rw');
sub add_volume {

View file

@ -215,17 +215,34 @@ sub make_loops {
}
@lines = grep $_, @lines;
# build a map of lines by EDGE_A_ID and A_ID
my %by_edge_a_id = my %by_a_id = ();
for (0..$#lines) {
if (defined(my $edge_a_id = $lines[$_][I_EDGE_A_ID])) {
$by_edge_a_id{$edge_a_id} //= [];
push @{ $by_edge_a_id{$edge_a_id} }, $_;
}
if (defined(my $a_id = $lines[$_][I_A_ID])) {
$by_a_id{$a_id} //= [];
push @{ $by_a_id{$a_id} }, $_;
}
}
my (@polygons, @failed_loops) = ();
CYCLE: while (@lines) {
my %used_lines = ();
CYCLE: while (1) {
# take first spare line and start a new loop
my @loop = (shift @lines);
my $first_idx = first { !exists $used_lines{$_} } 0..$#lines;
last if !defined $first_idx;
$used_lines{$first_idx} = 1;
my @loop = ($lines[$first_idx]);
while (1) {
# find a line starting where last one finishes
my $line_idx;
$line_idx = first { defined $lines[$_][I_EDGE_A_ID] && $lines[$_][I_EDGE_A_ID] == $loop[-1][I_EDGE_B_ID] } 0..$#lines
$line_idx = first { !exists $used_lines{$_} } @{ $by_edge_a_id{$loop[-1][I_EDGE_B_ID]} // [] }
if defined $loop[-1][I_EDGE_B_ID];
$line_idx ||= first { defined $lines[$_][I_A_ID] && $lines[$_][I_A_ID] == $loop[-1][I_B_ID] } 0..$#lines
$line_idx //= first { !exists $used_lines{$_} } @{ $by_a_id{$loop[-1][I_B_ID]} // [] }
if defined $loop[-1][I_B_ID];
if (!defined $line_idx) {
@ -244,7 +261,8 @@ sub make_loops {
push @failed_loops, [@loop];
next CYCLE;
}
push @loop, splice @lines, $line_idx, 1;
push @loop, $lines[$line_idx];
$used_lines{$line_idx} = 1;
}
}