123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- %module{Slic3r::XS};
- %{
- #include <xsinit.h>
- #include "libslic3r/TriangleMesh.hpp"
- #include "libslic3r/TriangleMeshSlicer.hpp"
- %}
- %name{Slic3r::TriangleMesh} class TriangleMesh {
- TriangleMesh();
- ~TriangleMesh();
- Clone<TriangleMesh> clone()
- %code{% RETVAL = THIS; %};
- void write_ascii(char* output_file);
- void write_binary(char* output_file);
- void scale(float factor);
- void scale_xyz(Vec3d* versor)
- %code{% THIS->scale(versor->cast<float>()); %};
- void translate(float x, float y, float z);
- void rotate_x(float angle);
- void rotate_y(float angle);
- void rotate_z(float angle);
- void mirror_x();
- void mirror_y();
- void mirror_z();
- void align_to_origin();
- void rotate(double angle, Point* center);
- void merge(TriangleMesh* mesh)
- %code{% THIS->merge(*mesh); %};
- Clone<Polygon> convex_hull();
- Clone<BoundingBoxf3> bounding_box();
- Clone<Vec3d> center()
- %code{% RETVAL = THIS->bounding_box().center(); %};
- int facets_count();
- %{
- void
- TriangleMesh::ReadFromPerl(vertices, facets)
- SV* vertices
- SV* facets
- CODE:
- std::vector<Slic3r::Vec3f> out_vertices;
- {
- AV* vertices_av = (AV*)SvRV(vertices);
- int number_of_vertices = av_len(vertices_av) + 1;
- out_vertices.reserve(number_of_vertices);
- for (int i = 0; i < number_of_vertices; ++ i) {
- AV* vertex_av = (AV*)SvRV(*av_fetch(vertices_av, i, 0));
- out_vertices.push_back(Slic3r::Vec3f(SvNV(*av_fetch(vertex_av, 0, 0)), SvNV(*av_fetch(vertex_av, 1, 0)), SvNV(*av_fetch(vertex_av, 2, 0))));
- }
- }
- std::vector<Slic3r::Vec3i> out_indices;
- {
- AV* facets_av = (AV*)SvRV(facets);
- int number_of_facets = av_len(facets_av) + 1;
- out_indices.reserve(number_of_facets);
- for (int i = 0; i < number_of_facets; ++ i) {
- AV* facet_av = (AV*)SvRV(*av_fetch(facets_av, i, 0));
- out_indices.push_back(Slic3r::Vec3i(SvIV(*av_fetch(facet_av, 0, 0)), SvIV(*av_fetch(facet_av, 1, 0)), SvIV(*av_fetch(facet_av, 2, 0))));
- }
- }
- *THIS = TriangleMesh(std::move(out_vertices), std::move(out_indices));
- SV*
- TriangleMesh::stats()
- CODE:
- HV* hv = newHV();
- (void)hv_stores( hv, "number_of_facets", newSViv(THIS->facets_count()) );
- (void)hv_stores( hv, "number_of_parts", newSViv(THIS->stats().number_of_parts) );
- (void)hv_stores( hv, "volume", newSVnv(THIS->stats().volume) );
- (void)hv_stores( hv, "degenerate_facets", newSViv(THIS->stats().repaired_errors.degenerate_facets) );
- (void)hv_stores( hv, "edges_fixed", newSViv(THIS->stats().repaired_errors.edges_fixed) );
- (void)hv_stores( hv, "facets_removed", newSViv(THIS->stats().repaired_errors.facets_removed) );
- (void)hv_stores( hv, "facets_reversed", newSViv(THIS->stats().repaired_errors.facets_reversed) );
- (void)hv_stores( hv, "backwards_edges", newSViv(THIS->stats().repaired_errors.backwards_edges) );
- RETVAL = (SV*)newRV_noinc((SV*)hv);
- OUTPUT:
- RETVAL
- SV*
- TriangleMesh::vertices()
- CODE:
- // vertices
- AV* vertices = newAV();
- av_extend(vertices, THIS->its.vertices.size());
- for (size_t i = 0; i < THIS->its.vertices.size(); i++) {
- AV* vertex = newAV();
- av_store(vertices, i, newRV_noinc((SV*)vertex));
- av_extend(vertex, 2);
- av_store(vertex, 0, newSVnv(THIS->its.vertices[i](0)));
- av_store(vertex, 1, newSVnv(THIS->its.vertices[i](1)));
- av_store(vertex, 2, newSVnv(THIS->its.vertices[i](2)));
- }
-
- RETVAL = newRV_noinc((SV*)vertices);
- OUTPUT:
- RETVAL
- SV*
- TriangleMesh::facets()
- CODE:
- // facets
- AV* facets = newAV();
- av_extend(facets, THIS->facets_count());
- for (int i = 0; i < THIS->facets_count(); i++) {
- AV* facet = newAV();
- av_store(facets, i, newRV_noinc((SV*)facet));
- av_extend(facet, 2);
- av_store(facet, 0, newSVnv(THIS->its.indices[i][0]));
- av_store(facet, 1, newSVnv(THIS->its.indices[i][1]));
- av_store(facet, 2, newSVnv(THIS->its.indices[i][2]));
- }
-
- RETVAL = newRV_noinc((SV*)facets);
- OUTPUT:
- RETVAL
- SV*
- TriangleMesh::size()
- CODE:
- AV* size = newAV();
- av_extend(size, 2);
- av_store(size, 0, newSVnv(THIS->stats().size(0)));
- av_store(size, 1, newSVnv(THIS->stats().size(1)));
- av_store(size, 2, newSVnv(THIS->stats().size(2)));
- RETVAL = newRV_noinc((SV*)size);
- OUTPUT:
- RETVAL
- SV*
- TriangleMesh::slice(z)
- std::vector<double> z
- CODE:
- // convert doubles to floats
- std::vector<float> z_f = cast<float>(z);
-
- std::vector<ExPolygons> layers = slice_mesh_ex(THIS->its, z_f, 0.049f);
-
- AV* layers_av = newAV();
- size_t len = layers.size();
- if (len > 0) av_extend(layers_av, len-1);
- for (unsigned int i = 0; i < layers.size(); i++) {
- AV* expolygons_av = newAV();
- len = layers[i].size();
- if (len > 0) av_extend(expolygons_av, len-1);
- unsigned int j = 0;
- for (ExPolygons::iterator it = layers[i].begin(); it != layers[i].end(); ++it) {
- av_store(expolygons_av, j++, perl_to_SV_clone_ref(*it));
- }
- av_store(layers_av, i, newRV_noinc((SV*)expolygons_av));
- }
- RETVAL = (SV*)newRV_noinc((SV*)layers_av);
- OUTPUT:
- RETVAL
- void
- TriangleMesh::cut(z, upper_mesh, lower_mesh)
- float z;
- TriangleMesh* upper_mesh;
- TriangleMesh* lower_mesh;
- CODE:
- indexed_triangle_set upper, lower;
- cut_mesh(THIS->its, z, upper_mesh ? &upper : nullptr, lower_mesh ? &lower : nullptr);
- if (upper_mesh)
- *upper_mesh = TriangleMesh(upper);
- if (lower_mesh)
- *lower_mesh = TriangleMesh(lower);
- std::vector<double>
- TriangleMesh::bb3()
- CODE:
- RETVAL.push_back(THIS->stats().min(0));
- RETVAL.push_back(THIS->stats().min(1));
- RETVAL.push_back(THIS->stats().max(0));
- RETVAL.push_back(THIS->stats().max(1));
- RETVAL.push_back(THIS->stats().min(2));
- RETVAL.push_back(THIS->stats().max(2));
- OUTPUT:
- RETVAL
- Clone<TriangleMesh>
- cube(double x, double y, double z)
- CODE:
- RETVAL = make_cube(x,y,z);
- OUTPUT:
- RETVAL
- Clone<TriangleMesh>
- cylinder(double r, double h)
- CODE:
- RETVAL = make_cylinder(r, h);
- OUTPUT:
- RETVAL
- Clone<TriangleMesh>
- sphere(double rho)
- CODE:
- RETVAL = make_sphere(rho);
- OUTPUT:
- RETVAL
- %}
- };
|