From 515d5707c99bdefe81ef4420fd4f818886b07c87 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 4 Aug 2013 21:34:26 +0200 Subject: [PATCH] Ported TriangleMesh->scale --- xs/src/TriangleMesh.cpp | 5 +++++ xs/src/TriangleMesh.hpp | 1 + xs/src/admesh/util.c | 6 ++++++ xs/t/01_trianglemesh.t | 13 +++++++++---- xs/xsp/TriangleMesh.xsp | 1 + 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 34dc0943c7..4ed53f3fcf 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -102,4 +102,9 @@ TriangleMesh::WriteOBJFile(char* output_file) { stl_write_obj(&stl, output_file); } +void TriangleMesh::scale(float factor) +{ + stl_scale(&(this->stl), factor); +} + } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index 27aca770bd..ecd597173c 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -15,6 +15,7 @@ class TriangleMesh void ReadFromPerl(SV* vertices, SV* facets); void Repair(); void WriteOBJFile(char* output_file); + void scale(float factor); stl_file stl; }; diff --git a/xs/src/admesh/util.c b/xs/src/admesh/util.c index 6b951e190d..6ff6488ed8 100644 --- a/xs/src/admesh/util.c +++ b/xs/src/admesh/util.c @@ -106,6 +106,7 @@ stl_scale(stl_file *stl, float factor) int i; int j; + // scale extents stl->stats.min.x *= factor; stl->stats.min.y *= factor; stl->stats.min.z *= factor; @@ -113,6 +114,11 @@ stl_scale(stl_file *stl, float factor) stl->stats.max.y *= factor; stl->stats.max.z *= factor; + // scale volume + if (stl->stats.volume > 0.0) { + stl->stats.volume *= (factor * factor * factor); + } + for(i = 0; i < stl->stats.number_of_facets; i++) { for(j = 0; j < 3; j++) diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t index cc08f62168..e766306a0d 100644 --- a/xs/t/01_trianglemesh.t +++ b/xs/t/01_trianglemesh.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 5; +use Test::More tests => 6; is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!', 'hello world'; @@ -23,9 +23,14 @@ my $cube = { is_deeply $vertices, $cube->{vertices}, 'vertices arrayref roundtrip'; is_deeply $facets, $cube->{facets}, 'facets arrayref roundtrip'; - my $stats = $m->stats; - is $stats->{number_of_facets}, scalar(@{ $cube->{facets} }), 'stats.number_of_facets'; - ok abs($stats->{volume} - 20*20*20) < 1E-3, 'stats.volume'; + { + my $stats = $m->stats; + is $stats->{number_of_facets}, scalar(@{ $cube->{facets} }), 'stats.number_of_facets'; + ok abs($stats->{volume} - 20*20*20) < 1E-2, 'stats.volume'; + } + + $m->scale(2); + ok abs($m->stats->{volume} - 40*40*40) < 1E-2, 'scale'; } __END__ diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index 3eb40eea8e..75753971a6 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -12,6 +12,7 @@ void ReadFromPerl(SV* vertices, SV* facets); void Repair(); void WriteOBJFile(char* output_file); + void scale(float factor); %{ SV*