From 4f17c2b7d1979963078e22fdaf7dbcac67e766ac Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Fri, 25 Apr 2014 17:14:39 +0200 Subject: [PATCH] First working implementation of a GUI for cutting --- lib/Slic3r/GUI/Plater.pm | 5 +++-- lib/Slic3r/GUI/Plater/ObjectCutDialog.pm | 2 ++ lib/Slic3r/Model.pm | 12 +++++++++--- xs/src/TriangleMesh.cpp | 11 +++++++++++ xs/src/TriangleMesh.hpp | 1 + xs/xsp/TriangleMesh.xsp | 1 + 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 35d19bee..27beb25a 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1103,7 +1103,7 @@ sub mouse_event { $self->{drag_object} = undef; $self->SetCursor(wxSTANDARD_CURSOR); } elsif ($event->ButtonDClick) { - $parent->object_preview_dialog if $parent->selected_object; + $parent->object_cut_dialog if $parent->selected_object; } elsif ($event->Dragging) { return if !$self->{drag_start_pos}; # concurrency problems my ($obj_idx, $instance_idx) = @{ $self->{drag_object} }; @@ -1146,7 +1146,7 @@ sub list_item_activated { my ($self, $event, $obj_idx) = @_; $obj_idx //= $event->GetIndex; - $self->object_preview_dialog($obj_idx); + $self->object_cut_dialog($obj_idx); } sub object_cut_dialog { @@ -1171,6 +1171,7 @@ sub object_cut_dialog { if (my @new_objects = $dlg->NewModelObjects) { $self->remove($obj_idx); $self->load_model_objects(@new_objects); + $self->arrange; } } diff --git a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm index b16bf428..411c4954 100644 --- a/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm +++ b/lib/Slic3r/GUI/Plater/ObjectCutDialog.pm @@ -116,6 +116,8 @@ sub perform_cut { if $self->{cut_options}{keep_upper} && defined $upper_object; push @{$self->{new_model_objects}}, $lower_object if $self->{cut_options}{keep_lower} && defined $lower_object; + + $self->Close; } sub NewModelObjects { diff --git a/lib/Slic3r/Model.pm b/lib/Slic3r/Model.pm index 6180cc0a..1efe3c9f 100644 --- a/lib/Slic3r/Model.pm +++ b/lib/Slic3r/Model.pm @@ -571,15 +571,19 @@ sub cut { model => $self->model, config => $self->config->clone, layer_height_ranges => $self->layer_height_ranges, + origin_translation => $self->origin_translation->clone, ); my $lower = Slic3r::Model::Object->new( input_file => $self->input_file, model => $self->model, config => $self->config->clone, layer_height_ranges => $self->layer_height_ranges, + origin_translation => $self->origin_translation->clone, ); - $upper->add_instance(offset => Slic3r::Point->new(0,0)); - $lower->add_instance(offset => Slic3r::Point->new(0,0)); + foreach my $instance (@{$self->instances}) { + $upper->add_instance(offset => $instance->offset); + $lower->add_instance(offset => $instance->offset); + } foreach my $volume (@{$self->volumes}) { if ($volume->modifier) { @@ -589,9 +593,11 @@ sub cut { } else { my $upper_mesh = Slic3r::TriangleMesh->new; my $lower_mesh = Slic3r::TriangleMesh->new; - $volume->mesh->cut($z, $upper_mesh, $lower_mesh); + $volume->mesh->cut($z + $volume->mesh->bounding_box->z_min, $upper_mesh, $lower_mesh); $upper_mesh->repair; $lower_mesh->repair; + $upper_mesh->reset_repair_stats; + $lower_mesh->reset_repair_stats; $upper->add_volume( material_id => $volume->material_id, diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index c3fb3b44..29fdf13c 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -125,6 +125,17 @@ TriangleMesh::repair() { this->repaired = true; } +void +TriangleMesh::reset_repair_stats() { + this->stl.stats.degenerate_facets = 0; + this->stl.stats.edges_fixed = 0; + this->stl.stats.facets_removed = 0; + this->stl.stats.facets_added = 0; + this->stl.stats.facets_reversed = 0; + this->stl.stats.backwards_edges = 0; + this->stl.stats.normals_fixed = 0; +} + void TriangleMesh::WriteOBJFile(char* output_file) { stl_generate_shared_vertices(&stl); diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index 34980d75..3b751912 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -36,6 +36,7 @@ class TriangleMesh void horizontal_projection(ExPolygons &retval) const; void convex_hull(Polygon* hull); void bounding_box(BoundingBoxf3* bb) const; + void reset_repair_stats(); stl_file stl; bool repaired; diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index c3233fb5..a124f8da 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -34,6 +34,7 @@ %}; int facets_count() %code{% RETVAL = THIS->stl.stats.number_of_facets; %}; + void reset_repair_stats(); %{ SV*