TriangleMesh.xsp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. %module{Slic3r::XS};
  2. %{
  3. #include <myinit.h>
  4. #include "libslic3r/TriangleMesh.hpp"
  5. %}
  6. %name{Slic3r::TriangleMesh} class TriangleMesh {
  7. TriangleMesh();
  8. ~TriangleMesh();
  9. Clone<TriangleMesh> clone()
  10. %code{% RETVAL = THIS; %};
  11. void ReadSTLFile(char* input_file);
  12. void write_ascii(char* output_file);
  13. void write_binary(char* output_file);
  14. void ReadFromPerl(SV* vertices, SV* facets);
  15. void repair();
  16. void WriteOBJFile(char* output_file);
  17. void scale(float factor);
  18. void scale_xyz(Pointf3* versor)
  19. %code{% THIS->scale(*versor); %};
  20. void translate(float x, float y, float z);
  21. void rotate_x(float angle);
  22. void rotate_y(float angle);
  23. void rotate_z(float angle);
  24. void flip_x();
  25. void flip_y();
  26. void flip_z();
  27. void align_to_origin();
  28. void rotate(double angle, Point* center);
  29. TriangleMeshPtrs split();
  30. void merge(TriangleMesh* mesh)
  31. %code{% THIS->merge(*mesh); %};
  32. ExPolygons horizontal_projection()
  33. %code{% THIS->horizontal_projection(RETVAL); %};
  34. BoundingBoxf3* bounding_box()
  35. %code{%
  36. RETVAL = new BoundingBoxf3();
  37. THIS->bounding_box(RETVAL);
  38. %};
  39. Pointf3* center()
  40. %code{%
  41. BoundingBoxf3 bb;
  42. THIS->bounding_box(&bb);
  43. RETVAL = new Pointf3(bb.center());
  44. %};
  45. int facets_count();
  46. void reset_repair_stats();
  47. %{
  48. SV*
  49. TriangleMesh::stats()
  50. CODE:
  51. HV* hv = newHV();
  52. (void)hv_stores( hv, "number_of_facets", newSViv(THIS->stl.stats.number_of_facets) );
  53. (void)hv_stores( hv, "number_of_parts", newSViv(THIS->stl.stats.number_of_parts) );
  54. (void)hv_stores( hv, "volume", newSVnv(THIS->stl.stats.volume) );
  55. (void)hv_stores( hv, "degenerate_facets", newSViv(THIS->stl.stats.degenerate_facets) );
  56. (void)hv_stores( hv, "edges_fixed", newSViv(THIS->stl.stats.edges_fixed) );
  57. (void)hv_stores( hv, "facets_removed", newSViv(THIS->stl.stats.facets_removed) );
  58. (void)hv_stores( hv, "facets_added", newSViv(THIS->stl.stats.facets_added) );
  59. (void)hv_stores( hv, "facets_reversed", newSViv(THIS->stl.stats.facets_reversed) );
  60. (void)hv_stores( hv, "backwards_edges", newSViv(THIS->stl.stats.backwards_edges) );
  61. (void)hv_stores( hv, "normals_fixed", newSViv(THIS->stl.stats.normals_fixed) );
  62. RETVAL = (SV*)newRV_noinc((SV*)hv);
  63. OUTPUT:
  64. RETVAL
  65. SV*
  66. TriangleMesh::vertices()
  67. CODE:
  68. if (!THIS->repaired) CONFESS("vertices() requires repair()");
  69. if (THIS->stl.v_shared == NULL)
  70. stl_generate_shared_vertices(&(THIS->stl));
  71. // vertices
  72. AV* vertices = newAV();
  73. av_extend(vertices, THIS->stl.stats.shared_vertices);
  74. for (int i = 0; i < THIS->stl.stats.shared_vertices; i++) {
  75. AV* vertex = newAV();
  76. av_store(vertices, i, newRV_noinc((SV*)vertex));
  77. av_extend(vertex, 2);
  78. av_store(vertex, 0, newSVnv(THIS->stl.v_shared[i].x));
  79. av_store(vertex, 1, newSVnv(THIS->stl.v_shared[i].y));
  80. av_store(vertex, 2, newSVnv(THIS->stl.v_shared[i].z));
  81. }
  82. RETVAL = newRV_noinc((SV*)vertices);
  83. OUTPUT:
  84. RETVAL
  85. SV*
  86. TriangleMesh::facets()
  87. CODE:
  88. if (!THIS->repaired) CONFESS("facets() requires repair()");
  89. if (THIS->stl.v_shared == NULL)
  90. stl_generate_shared_vertices(&(THIS->stl));
  91. // facets
  92. AV* facets = newAV();
  93. av_extend(facets, THIS->stl.stats.number_of_facets);
  94. for (int i = 0; i < THIS->stl.stats.number_of_facets; i++) {
  95. AV* facet = newAV();
  96. av_store(facets, i, newRV_noinc((SV*)facet));
  97. av_extend(facet, 2);
  98. av_store(facet, 0, newSVnv(THIS->stl.v_indices[i].vertex[0]));
  99. av_store(facet, 1, newSVnv(THIS->stl.v_indices[i].vertex[1]));
  100. av_store(facet, 2, newSVnv(THIS->stl.v_indices[i].vertex[2]));
  101. }
  102. RETVAL = newRV_noinc((SV*)facets);
  103. OUTPUT:
  104. RETVAL
  105. SV*
  106. TriangleMesh::normals()
  107. CODE:
  108. if (!THIS->repaired) CONFESS("normals() requires repair()");
  109. // normals
  110. AV* normals = newAV();
  111. av_extend(normals, THIS->stl.stats.number_of_facets);
  112. for (int i = 0; i < THIS->stl.stats.number_of_facets; i++) {
  113. AV* facet = newAV();
  114. av_store(normals, i, newRV_noinc((SV*)facet));
  115. av_extend(facet, 2);
  116. av_store(facet, 0, newSVnv(THIS->stl.facet_start[i].normal.x));
  117. av_store(facet, 1, newSVnv(THIS->stl.facet_start[i].normal.y));
  118. av_store(facet, 2, newSVnv(THIS->stl.facet_start[i].normal.z));
  119. }
  120. RETVAL = newRV_noinc((SV*)normals);
  121. OUTPUT:
  122. RETVAL
  123. SV*
  124. TriangleMesh::size()
  125. CODE:
  126. AV* size = newAV();
  127. av_extend(size, 2);
  128. av_store(size, 0, newSVnv(THIS->stl.stats.size.x));
  129. av_store(size, 1, newSVnv(THIS->stl.stats.size.y));
  130. av_store(size, 2, newSVnv(THIS->stl.stats.size.z));
  131. RETVAL = newRV_noinc((SV*)size);
  132. OUTPUT:
  133. RETVAL
  134. SV*
  135. TriangleMesh::slice(z)
  136. std::vector<double> z
  137. CODE:
  138. // convert doubles to floats
  139. std::vector<float> z_f(z.begin(), z.end());
  140. std::vector<ExPolygons> layers;
  141. TriangleMeshSlicer mslicer(THIS);
  142. mslicer.slice(z_f, &layers);
  143. AV* layers_av = newAV();
  144. size_t len = layers.size();
  145. if (len > 0) av_extend(layers_av, len-1);
  146. for (unsigned int i = 0; i < layers.size(); i++) {
  147. AV* expolygons_av = newAV();
  148. len = layers[i].size();
  149. if (len > 0) av_extend(expolygons_av, len-1);
  150. unsigned int j = 0;
  151. for (ExPolygons::iterator it = layers[i].begin(); it != layers[i].end(); ++it) {
  152. av_store(expolygons_av, j++, perl_to_SV_clone_ref(*it));
  153. }
  154. av_store(layers_av, i, newRV_noinc((SV*)expolygons_av));
  155. }
  156. RETVAL = (SV*)newRV_noinc((SV*)layers_av);
  157. OUTPUT:
  158. RETVAL
  159. void
  160. TriangleMesh::cut(z, upper, lower)
  161. float z;
  162. TriangleMesh* upper;
  163. TriangleMesh* lower;
  164. CODE:
  165. TriangleMeshSlicer mslicer(THIS);
  166. mslicer.cut(z, upper, lower);
  167. std::vector<double>
  168. TriangleMesh::bb3()
  169. CODE:
  170. RETVAL.push_back(THIS->stl.stats.min.x);
  171. RETVAL.push_back(THIS->stl.stats.min.y);
  172. RETVAL.push_back(THIS->stl.stats.max.x);
  173. RETVAL.push_back(THIS->stl.stats.max.y);
  174. RETVAL.push_back(THIS->stl.stats.min.z);
  175. RETVAL.push_back(THIS->stl.stats.max.z);
  176. OUTPUT:
  177. RETVAL
  178. Polygon*
  179. TriangleMesh::convex_hull()
  180. CODE:
  181. RETVAL = new Polygon ();
  182. THIS->convex_hull(RETVAL);
  183. OUTPUT:
  184. RETVAL
  185. %}
  186. };
  187. %package{Slic3r::TriangleMesh};
  188. %{
  189. PROTOTYPES: DISABLE
  190. std::string
  191. hello_world()
  192. CODE:
  193. RETVAL = "Hello world!";
  194. OUTPUT:
  195. RETVAL
  196. %}