mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-07-15 05:11:51 +08:00

not merged: fill.cpp, perimeter_generator, because they ahve been reworked and need to be understand fully before adding my extensive modifications. To verify: glcanvas: maybe filament color selection is deleted (or the other one i added?)
147 lines
4.7 KiB
C++
147 lines
4.7 KiB
C++
#include "BoundingBox.hpp"
|
|
#include "Surface.hpp"
|
|
#include "SVG.hpp"
|
|
|
|
namespace Slic3r {
|
|
|
|
bool
|
|
Surface::has_fill_void() const {
|
|
return (this->surface_type & stDensVoid) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_fill_sparse() const {
|
|
return (this->surface_type & stDensSparse) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_fill_solid() const {
|
|
return (this->surface_type & stDensSolid) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_pos_external() const
|
|
{
|
|
return has_pos_top() || has_pos_bottom();
|
|
}
|
|
|
|
bool
|
|
Surface::has_pos_top() const
|
|
{
|
|
return (this->surface_type & stPosTop) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_pos_internal() const
|
|
{
|
|
return (this->surface_type & stPosInternal) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_pos_bottom() const
|
|
{
|
|
return (this->surface_type & stPosBottom) != 0;
|
|
}
|
|
|
|
bool
|
|
Surface::has_mod_bridge() const
|
|
{
|
|
return (this->surface_type & stModBridge) != 0;
|
|
}
|
|
bool
|
|
Surface::has_mod_overBridge() const
|
|
{
|
|
return (this->surface_type & stModOverBridge) != 0;
|
|
}
|
|
|
|
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)
|
|
{
|
|
if ((surface_type & stPosTop) != 0) return "rgb(255,0,0)"; // "red";
|
|
if (surface_type == (stPosBottom | stDensSolid | stModBridge)) return "rgb(0,0,255)"; // "blue";
|
|
if ((surface_type & stPosBottom) != 0) return "rgb(0,255,0)"; // "green";
|
|
if (surface_type == (stPosInternal | stDensSolid | stModBridge)) return "rgb(0,255,255)"; // cyan
|
|
if (surface_type == (stPosInternal | stDensSolid | stModOverBridge)) return "rgb(0,255,128)"; // green-cyan
|
|
if (surface_type == (stPosInternal | stDensSolid)) return "rgb(255,0,255)"; // magenta
|
|
if (surface_type == (stPosInternal | stDensVoid)) return "rgb(128,128,128)"; // gray
|
|
if (surface_type == (stPosInternal | stDensSparse)) return "rgb(255,255,128)"; // yellow
|
|
if ((surface_type & stPosPerimeter) != 0) return "rgb(128,0,0)"; // maroon
|
|
return "rgb(64,64,64)"; //dark gray
|
|
}
|
|
|
|
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(stPosPerimeter));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "top" , surface_type_to_color_name(stPosTop));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "bottom" , surface_type_to_color_name(stPosBottom));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "bottom bridge" , surface_type_to_color_name(stPosBottom | stModBridge));
|
|
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(stPosInternal | stDensSparse));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "internal solid" , surface_type_to_color_name(stPosInternal | stDensSolid));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "internal bridge", surface_type_to_color_name(stPosInternal | stDensSolid | stModBridge));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "internal over bridge", surface_type_to_color_name(stPosInternal| stDensSolid | stModOverBridge));
|
|
pos_x += step_x;
|
|
svg.draw_legend(Point(pos_x, pos_y), "internal void" , surface_type_to_color_name(stPosInternal | stDensVoid));
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
}
|