From 9402898c5875436739ffcbc64152bbd9e2699fc3 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 5 Aug 2013 19:39:10 +0200 Subject: [PATCH] Ported TriangleMesh->size --- xs/src/TriangleMesh.cpp | 2 ++ xs/src/admesh/stl.h | 1 + xs/src/admesh/util.c | 16 ++++++++++++++-- xs/t/01_trianglemesh.t | 4 +++- xs/xsp/TriangleMesh.xsp | 12 ++++++++++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 77cc9c387..2c84cedc9 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -42,6 +42,8 @@ void TriangleMesh::ReadFromPerl(SV* vertices, SV* facets) stl.facet_start[i] = facet; } + + stl_get_size(&(this->stl)); } void diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h index a5f79fa86..c7a9a7e56 100644 --- a/xs/src/admesh/stl.h +++ b/xs/src/admesh/stl.h @@ -181,3 +181,4 @@ static void stl_facet_stats(stl_file *stl, stl_facet facet, int first); static void stl_reallocate(stl_file *stl); static int stl_get_little_int(FILE *fp); static float stl_get_little_float(FILE *fp); +extern void stl_get_size(stl_file *stl); diff --git a/xs/src/admesh/util.c b/xs/src/admesh/util.c index fc19328e7..332b21ce6 100644 --- a/xs/src/admesh/util.c +++ b/xs/src/admesh/util.c @@ -26,7 +26,6 @@ #include "stl.h" static void stl_rotate(float *x, float *y, float angle); -static void stl_get_size(stl_file *stl); static float get_area(stl_facet *facet); static float get_volume(stl_file *stl); @@ -116,6 +115,11 @@ stl_scale(stl_file *stl, float factor) stl->stats.max.y *= factor; stl->stats.max.z *= factor; + // scale size + stl->stats.size.x *= factor; + stl->stats.size.y *= factor; + stl->stats.size.z *= factor; + // scale volume if (stl->stats.volume > 0.0) { stl->stats.volume *= (factor * factor * factor); @@ -219,7 +223,7 @@ stl_rotate(float *x, float *y, float angle) *y = r * sin(theta + radian_angle); } -static void +extern void stl_get_size(stl_file *stl) { int i; @@ -250,6 +254,14 @@ stl_get_size(stl_file *stl) stl->facet_start[i].vertex[j].z); } } + stl->stats.size.x = stl->stats.max.x - stl->stats.min.x; + stl->stats.size.y = stl->stats.max.y - stl->stats.min.y; + stl->stats.size.z = stl->stats.max.z - stl->stats.min.z; + stl->stats.bounding_diameter = sqrt( + stl->stats.size.x * stl->stats.size.x + + stl->stats.size.y * stl->stats.size.y + + stl->stats.size.z * stl->stats.size.z + ); } void diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t index 760c6af04..0db846267 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 => 8; +use Test::More tests => 9; is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!', 'hello world'; @@ -37,6 +37,8 @@ my $cube = { $m->align_to_origin; is_deeply $m->vertices->[2], [0,0,0], 'align_to_origin'; + + is_deeply $m->size, [40,40,40], 'size'; } __END__ diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index 9690a3489..82f723873 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -79,6 +79,18 @@ TriangleMesh::facets() OUTPUT: RETVAL +SV* +TriangleMesh::size() + CODE: + AV* size = newAV(); + av_extend(size, 2); + av_store(size, 0, newSVnv(THIS->stl.stats.size.x)); + av_store(size, 1, newSVnv(THIS->stl.stats.size.y)); + av_store(size, 2, newSVnv(THIS->stl.stats.size.z)); + RETVAL = newRV_noinc((SV*)size); + OUTPUT: + RETVAL + %} };