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

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/libslic3r/Surface.cpp')
-rw-r--r--src/libslic3r/Surface.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/libslic3r/Surface.cpp b/src/libslic3r/Surface.cpp
new file mode 100644
index 000000000..0e9eca7fd
--- /dev/null
+++ b/src/libslic3r/Surface.cpp
@@ -0,0 +1,147 @@
+#include "BoundingBox.hpp"
+#include "Surface.hpp"
+#include "SVG.hpp"
+
+namespace Slic3r {
+
+Surface::operator Polygons() const
+{
+ return this->expolygon;
+}
+
+double
+Surface::area() const
+{
+ return this->expolygon.area();
+}
+
+bool
+Surface::is_solid() const
+{
+ return this->surface_type == stTop
+ || this->surface_type == stBottom
+ || this->surface_type == stBottomBridge
+ || this->surface_type == stInternalSolid
+ || this->surface_type == stInternalBridge;
+}
+
+bool
+Surface::is_external() const
+{
+ return this->surface_type == stTop
+ || this->surface_type == stBottom
+ || this->surface_type == stBottomBridge;
+}
+
+bool
+Surface::is_internal() const
+{
+ return this->surface_type == stInternal
+ || this->surface_type == stInternalBridge
+ || this->surface_type == stInternalSolid
+ || this->surface_type == stInternalVoid;
+}
+
+bool
+Surface::is_bottom() const
+{
+ return this->surface_type == stBottom
+ || this->surface_type == stBottomBridge;
+}
+
+bool
+Surface::is_bridge() const
+{
+ return this->surface_type == stBottomBridge
+ || this->surface_type == stInternalBridge;
+}
+
+BoundingBox get_extents(const Surface &surface)
+{
+ return get_extents(surface.expolygon.contour);
+}
+
+BoundingBox get_extents(const Surfaces &surfaces)
+{
+ BoundingBox bbox;
+ if (! surfaces.empty()) {
+ bbox = get_extents(surfaces.front());
+ for (size_t i = 1; i < surfaces.size(); ++ i)
+ bbox.merge(get_extents(surfaces[i]));
+ }
+ return bbox;
+}
+
+BoundingBox get_extents(const SurfacesPtr &surfaces)
+{
+ BoundingBox bbox;
+ if (! surfaces.empty()) {
+ bbox = get_extents(*surfaces.front());
+ for (size_t i = 1; i < surfaces.size(); ++ i)
+ bbox.merge(get_extents(*surfaces[i]));
+ }
+ return bbox;
+}
+
+const char* surface_type_to_color_name(const SurfaceType surface_type)
+{
+ switch (surface_type) {
+ case stTop: return "rgb(255,0,0)"; // "red";
+ case stBottom: return "rgb(0,255,0)"; // "green";
+ case stBottomBridge: return "rgb(0,0,255)"; // "blue";
+ case stInternal: return "rgb(255,255,128)"; // yellow
+ case stInternalSolid: return "rgb(255,0,255)"; // magenta
+ case stInternalBridge: return "rgb(0,255,255)";
+ case stInternalVoid: return "rgb(128,128,128)";
+ case stPerimeter: return "rgb(128,0,0)"; // maroon
+ default: return "rgb(64,64,64)";
+ };
+}
+
+Point export_surface_type_legend_to_svg_box_size()
+{
+ return Point(scale_(1.+10.*8.), scale_(3.));
+}
+
+void export_surface_type_legend_to_svg(SVG &svg, const Point &pos)
+{
+ // 1st row
+ coord_t pos_x0 = pos(0) + scale_(1.);
+ coord_t pos_x = pos_x0;
+ coord_t pos_y = pos(1) + scale_(1.5);
+ coord_t step_x = scale_(10.);
+ svg.draw_legend(Point(pos_x, pos_y), "perimeter" , surface_type_to_color_name(stPerimeter));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "top" , surface_type_to_color_name(stTop));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "bottom" , surface_type_to_color_name(stBottom));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "bottom bridge" , surface_type_to_color_name(stBottomBridge));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "invalid" , surface_type_to_color_name(SurfaceType(-1)));
+ // 2nd row
+ pos_x = pos_x0;
+ pos_y = pos(1)+scale_(2.8);
+ svg.draw_legend(Point(pos_x, pos_y), "internal" , surface_type_to_color_name(stInternal));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "internal solid" , surface_type_to_color_name(stInternalSolid));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "internal bridge", surface_type_to_color_name(stInternalBridge));
+ pos_x += step_x;
+ svg.draw_legend(Point(pos_x, pos_y), "internal void" , surface_type_to_color_name(stInternalVoid));
+}
+
+bool export_to_svg(const char *path, const Surfaces &surfaces, const float transparency)
+{
+ BoundingBox bbox;
+ for (Surfaces::const_iterator surface = surfaces.begin(); surface != surfaces.end(); ++surface)
+ bbox.merge(get_extents(surface->expolygon));
+
+ SVG svg(path, bbox);
+ for (Surfaces::const_iterator surface = surfaces.begin(); surface != surfaces.end(); ++surface)
+ svg.draw(surface->expolygon, surface_type_to_color_name(surface->surface_type), transparency);
+ svg.Close();
+ return true;
+}
+
+}