Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'xs/src/libslic3r/TriangleMesh.hpp')
-rw-r--r--xs/src/libslic3r/TriangleMesh.hpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/xs/src/libslic3r/TriangleMesh.hpp b/xs/src/libslic3r/TriangleMesh.hpp
new file mode 100644
index 000000000..b16f867eb
--- /dev/null
+++ b/xs/src/libslic3r/TriangleMesh.hpp
@@ -0,0 +1,110 @@
+#ifndef slic3r_TriangleMesh_hpp_
+#define slic3r_TriangleMesh_hpp_
+
+#include <myinit.h>
+#include <admesh/stl.h>
+#include <vector>
+#include "BoundingBox.hpp"
+#include "Point.hpp"
+#include "Polygon.hpp"
+#include "ExPolygon.hpp"
+
+namespace Slic3r {
+
+class TriangleMesh;
+class TriangleMeshSlicer;
+typedef std::vector<TriangleMesh*> TriangleMeshPtrs;
+
+class TriangleMesh
+{
+ public:
+ TriangleMesh();
+ TriangleMesh(const TriangleMesh &other);
+ TriangleMesh& operator= (TriangleMesh other);
+ void swap(TriangleMesh &other);
+ ~TriangleMesh();
+ void ReadSTLFile(char* input_file);
+ void write_ascii(char* output_file);
+ void write_binary(char* output_file);
+ void repair();
+ void WriteOBJFile(char* output_file);
+ void scale(float factor);
+ void scale(std::vector<double> versor);
+ void translate(float x, float y, float z);
+ void rotate_x(float angle);
+ void rotate_y(float angle);
+ void rotate_z(float angle);
+ void flip_x();
+ void flip_y();
+ void flip_z();
+ void align_to_origin();
+ void rotate(double angle, Point* center);
+ TriangleMeshPtrs split() const;
+ void merge(const TriangleMesh* mesh);
+ 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;
+
+ #ifdef SLIC3RXS
+ SV* to_SV();
+ void ReadFromPerl(SV* vertices, SV* facets);
+ #endif
+
+ private:
+ void require_shared_vertices();
+ friend class TriangleMeshSlicer;
+};
+
+enum FacetEdgeType { feNone, feTop, feBottom, feHorizontal };
+
+class IntersectionPoint : public Point
+{
+ public:
+ int point_id;
+ int edge_id;
+ IntersectionPoint() : point_id(-1), edge_id(-1) {};
+};
+
+class IntersectionLine
+{
+ public:
+ Point a;
+ Point b;
+ int a_id;
+ int b_id;
+ int edge_a_id;
+ int edge_b_id;
+ FacetEdgeType edge_type;
+ bool skip;
+ IntersectionLine() : a_id(-1), b_id(-1), edge_a_id(-1), edge_b_id(-1), edge_type(feNone), skip(false) {};
+};
+typedef std::vector<IntersectionLine> IntersectionLines;
+typedef std::vector<IntersectionLine*> IntersectionLinePtrs;
+
+class TriangleMeshSlicer
+{
+ public:
+ TriangleMesh* mesh;
+ TriangleMeshSlicer(TriangleMesh* _mesh);
+ ~TriangleMeshSlicer();
+ void slice(const std::vector<float> &z, std::vector<Polygons>* layers);
+ void slice(const std::vector<float> &z, std::vector<ExPolygons>* layers);
+ void slice_facet(float slice_z, const stl_facet &facet, const int &facet_idx, const float &min_z, const float &max_z, std::vector<IntersectionLine>* lines) const;
+ void cut(float z, TriangleMesh* upper, TriangleMesh* lower);
+
+ private:
+ typedef std::vector< std::vector<int> > t_facets_edges;
+ t_facets_edges facets_edges;
+ stl_vertex* v_scaled_shared;
+ void make_loops(std::vector<IntersectionLine> &lines, Polygons* loops);
+ void make_expolygons(const Polygons &loops, ExPolygons* slices);
+ void make_expolygons_simple(std::vector<IntersectionLine> &lines, ExPolygons* slices);
+ void make_expolygons(std::vector<IntersectionLine> &lines, ExPolygons* slices);
+};
+
+}
+
+#endif