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:
authorbubnikv <bubnikv@gmail.com>2016-11-09 17:39:12 +0300
committerbubnikv <bubnikv@gmail.com>2016-11-09 17:39:12 +0300
commit317e9131e89782c98201849a21c0e2e91c8fc142 (patch)
tree1a889265c9d11c9e8574a29216af703b59d54568
parenteb0ab3861872a8cf1ab08b0d02a16942acdabaac (diff)
New sparse infill: "stars" - David's star shaped infill.
This is very similar to a "triangles" infill, but maximum two lines intersect at a single point. added utility function get_extents_vector()
-rw-r--r--xs/src/libslic3r/ExPolygon.cpp9
-rw-r--r--xs/src/libslic3r/ExPolygon.hpp1
-rw-r--r--xs/src/libslic3r/Fill/FillBase.cpp1
-rw-r--r--xs/src/libslic3r/Fill/FillBase.hpp2
-rw-r--r--xs/src/libslic3r/Fill/FillRectilinear2.cpp16
-rw-r--r--xs/src/libslic3r/Fill/FillRectilinear2.hpp11
-rw-r--r--xs/src/libslic3r/Polygon.cpp9
-rw-r--r--xs/src/libslic3r/Polygon.hpp1
-rw-r--r--xs/src/libslic3r/PrintConfig.cpp2
-rw-r--r--xs/src/libslic3r/PrintConfig.hpp3
10 files changed, 52 insertions, 3 deletions
diff --git a/xs/src/libslic3r/ExPolygon.cpp b/xs/src/libslic3r/ExPolygon.cpp
index f37e2e701..fbb616ebb 100644
--- a/xs/src/libslic3r/ExPolygon.cpp
+++ b/xs/src/libslic3r/ExPolygon.cpp
@@ -587,6 +587,15 @@ BoundingBox get_extents_rotated(const ExPolygons &expolygons, double angle)
return bbox;
}
+extern std::vector<BoundingBox> get_extents_vector(const ExPolygons &polygons)
+{
+ std::vector<BoundingBox> out;
+ out.reserve(polygons.size());
+ for (ExPolygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
+ out.push_back(get_extents(*it));
+ return out;
+}
+
bool remove_sticks(ExPolygon &poly)
{
return remove_sticks(poly.contour) || remove_sticks(poly.holes);
diff --git a/xs/src/libslic3r/ExPolygon.hpp b/xs/src/libslic3r/ExPolygon.hpp
index c1204a953..0a212668f 100644
--- a/xs/src/libslic3r/ExPolygon.hpp
+++ b/xs/src/libslic3r/ExPolygon.hpp
@@ -271,6 +271,7 @@ extern BoundingBox get_extents(const ExPolygon &expolygon);
extern BoundingBox get_extents(const ExPolygons &expolygons);
extern BoundingBox get_extents_rotated(const ExPolygon &poly, double angle);
extern BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle);
+extern std::vector<BoundingBox> get_extents_vector(const ExPolygons &polygons);
extern bool remove_sticks(ExPolygon &poly);
diff --git a/xs/src/libslic3r/Fill/FillBase.cpp b/xs/src/libslic3r/Fill/FillBase.cpp
index f471d539c..6cd508acb 100644
--- a/xs/src/libslic3r/Fill/FillBase.cpp
+++ b/xs/src/libslic3r/Fill/FillBase.cpp
@@ -25,6 +25,7 @@ Fill* Fill::new_from_type(const InfillPattern type)
case ipLine: return new FillLine();
case ipGrid: return new FillGrid2();
case ipTriangles: return new FillTriangles();
+ case ipStars: return new FillStars();
case ipCubic: return new FillCubic();
// case ipGrid: return new FillGrid();
case ipArchimedeanChords: return new FillArchimedeanChords();
diff --git a/xs/src/libslic3r/Fill/FillBase.hpp b/xs/src/libslic3r/Fill/FillBase.hpp
index b628ab31b..5f83e6b9c 100644
--- a/xs/src/libslic3r/Fill/FillBase.hpp
+++ b/xs/src/libslic3r/Fill/FillBase.hpp
@@ -49,7 +49,7 @@ public:
// in radians, ccw, 0 = East
float angle;
// In scaled coordinates. Maximum lenght of a perimeter segment connecting two infill lines.
- // Used by the FillRectilinear2, FillGrid2, FillTriangles and FillCubic.
+ // Used by the FillRectilinear2, FillGrid2, FillTriangles, FillStars and FillCubic.
// If left to zero, the links will not be limited.
coord_t link_max_length;
// In scaled coordinates. Used by the concentric infill pattern to clip the loops to create extrusion paths.
diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.cpp b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
index 3d32f164e..20709cbde 100644
--- a/xs/src/libslic3r/Fill/FillRectilinear2.cpp
+++ b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
@@ -1517,12 +1517,26 @@ Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &
Polylines polylines_out;
if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(2. * M_PI / 3.), 0., polylines_out)) {
+ ! fill_surface_by_lines(surface, params2, float(2. * M_PI / 3.), 0.5 * this->spacing / params2.density, polylines_out)) {
printf("FillTriangles::fill_surface() failed to fill a region.\n");
}
return polylines_out;
}
+Polylines FillStars::fill_surface(const Surface *surface, const FillParams &params)
+{
+ // Each linear fill covers 1/3 of the target coverage.
+ FillParams params2 = params;
+ params2.density *= 0.333333333f;
+ Polylines polylines_out;
+ if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
+ ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
+ ! fill_surface_by_lines(surface, params2, float(2. * M_PI / 3.), 0., polylines_out)) {
+ printf("FillStars::fill_surface() failed to fill a region.\n");
+ }
+ return polylines_out;
+}
+
Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &params)
{
// Each linear fill covers 1/3 of the target coverage.
diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.hpp b/xs/src/libslic3r/Fill/FillRectilinear2.hpp
index d8afc76ad..b8e56f90c 100644
--- a/xs/src/libslic3r/Fill/FillRectilinear2.hpp
+++ b/xs/src/libslic3r/Fill/FillRectilinear2.hpp
@@ -41,6 +41,17 @@ protected:
virtual float _layer_angle(size_t idx) const { return 0.f; }
};
+class FillStars : public FillRectilinear2
+{
+public:
+ virtual ~FillStars() {}
+ virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
+
+protected:
+ // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
+ virtual float _layer_angle(size_t idx) const { return 0.f; }
+};
+
class FillCubic : public FillRectilinear2
{
public:
diff --git a/xs/src/libslic3r/Polygon.cpp b/xs/src/libslic3r/Polygon.cpp
index 9338f2ec7..056c285ec 100644
--- a/xs/src/libslic3r/Polygon.cpp
+++ b/xs/src/libslic3r/Polygon.cpp
@@ -328,6 +328,15 @@ BoundingBox get_extents_rotated(const Polygons &polygons, double angle)
return bb;
}
+extern std::vector<BoundingBox> get_extents_vector(const Polygons &polygons)
+{
+ std::vector<BoundingBox> out;
+ out.reserve(polygons.size());
+ for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
+ out.push_back(get_extents(*it));
+ return out;
+}
+
static inline bool is_stick(const Point &p1, const Point &p2, const Point &p3)
{
Point v1 = p2 - p1;
diff --git a/xs/src/libslic3r/Polygon.hpp b/xs/src/libslic3r/Polygon.hpp
index 3ccd7154b..966264fb2 100644
--- a/xs/src/libslic3r/Polygon.hpp
+++ b/xs/src/libslic3r/Polygon.hpp
@@ -52,6 +52,7 @@ extern BoundingBox get_extents(const Polygon &poly);
extern BoundingBox get_extents(const Polygons &polygons);
extern BoundingBox get_extents_rotated(const Polygon &poly, double angle);
extern BoundingBox get_extents_rotated(const Polygons &polygons, double angle);
+extern std::vector<BoundingBox> get_extents_vector(const Polygons &polygons);
// Remove sticks (tentacles with zero area) from the polygon.
extern bool remove_sticks(Polygon &poly);
diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp
index 78b79d77d..59dcea879 100644
--- a/xs/src/libslic3r/PrintConfig.cpp
+++ b/xs/src/libslic3r/PrintConfig.cpp
@@ -397,6 +397,7 @@ PrintConfigDef::PrintConfigDef()
def->enum_values.push_back("rectilinear");
def->enum_values.push_back("grid");
def->enum_values.push_back("triangles");
+ def->enum_values.push_back("stars");
def->enum_values.push_back("cubic");
def->enum_values.push_back("line");
def->enum_values.push_back("concentric");
@@ -408,6 +409,7 @@ PrintConfigDef::PrintConfigDef()
def->enum_labels.push_back("Rectilinear");
def->enum_labels.push_back("Grid");
def->enum_labels.push_back("Triangles");
+ def->enum_labels.push_back("Stars");
def->enum_labels.push_back("Cubic");
def->enum_labels.push_back("Line");
def->enum_labels.push_back("Concentric");
diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp
index 4efdd4173..f4e6cb8c4 100644
--- a/xs/src/libslic3r/PrintConfig.hpp
+++ b/xs/src/libslic3r/PrintConfig.hpp
@@ -30,7 +30,7 @@ enum GCodeFlavor {
};
enum InfillPattern {
- ipRectilinear, ipGrid, ipTriangles, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
+ ipRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral,
};
@@ -59,6 +59,7 @@ template<> inline t_config_enum_values ConfigOptionEnum<InfillPattern>::get_enum
keys_map["rectilinear"] = ipRectilinear;
keys_map["grid"] = ipGrid;
keys_map["triangles"] = ipTriangles;
+ keys_map["stars"] = ipStars;
keys_map["cubic"] = ipCubic;
keys_map["line"] = ipLine;
keys_map["concentric"] = ipConcentric;