Refactoring.

This commit is contained in:
Samir55 2018-07-12 04:18:47 +02:00
parent b555fff86f
commit 4d1e4eb252
2 changed files with 213 additions and 208 deletions

View File

@ -2,75 +2,6 @@
namespace Slic3r
{
Polygon
SupportMaterial::create_circle(coordf_t radius)
{
Points points;
coordf_t positions[] = {5 * PI / 3,
4 * PI / 3,
PI,
2 * PI / 3,
PI / 3,
0};
for (auto pos : positions) {
points.emplace_back(radius * cos(pos), (radius * sin(pos)));
}
return Polygon(points);
}
Polygons
SupportMaterial::p(SurfacesPtr &surfaces)
{
Polygons ret;
for (auto surface : surfaces) {
ret.push_back(surface->expolygon.contour);
for (const auto &hole_polygon : surface->expolygon.holes) {
ret.push_back(hole_polygon);
}
}
return ret;
}
void
SupportMaterial::append_polygons(Polygons &dst, Polygons &src)
{
for (const auto polygon : src) {
dst.push_back(polygon);
}
}
coordf_t
SupportMaterial::contact_distance(coordf_t layer_height, coordf_t nozzle_diameter)
{
coordf_t extra = static_cast<float>(object_config->support_material_contact_distance.value);
if (extra == 0) {
return layer_height;
}
else {
return nozzle_diameter + extra;
}
}
vector<coordf_t>
SupportMaterial::get_keys_sorted(map<coordf_t, Polygons> _map)
{
vector<coordf_t> ret;
for (auto el : _map)
ret.push_back(el.first);
sort(ret.begin(), ret.end());
return ret;
}
coordf_t
SupportMaterial::get_max_layer_height(PrintObject *object)
{
coordf_t ret = -1;
for (auto layer : object->layers)
ret = max(ret, layer->height);
return ret;
}
void
SupportMaterial::generate_toolpaths(PrintObject *object,
map<coordf_t, Polygons> overhang,
@ -638,6 +569,93 @@ SupportMaterial::object_top(PrintObject *object, map<coordf_t, Polygons> *contac
return top;
}
void
SupportMaterial::generate_pillars_shape(const map<coordf_t, Polygons> &contact,
const vector<coordf_t> &support_z,
map<int, Polygons> &shape)
{
// This prevents supplying an empty point set to BoundingBox constructor.
if (contact.empty()) return;
coord_t pillar_size = scale_(object_config->support_material_pillar_size.value);
coord_t pillar_spacing = scale_(object_config->support_material_pillar_spacing.value);
Polygons grid;
{
auto pillar = Polygon({
Point(0, 0),
Point(pillar_size, coord_t(0)),
Point(pillar_size, pillar_size),
Point(coord_t(0), pillar_size)
});
Polygons pillars;
BoundingBox bb;
{
Points bb_points;
for (auto contact_el : contact) {
append_to(bb_points, to_points(contact_el.second));
}
bb = BoundingBox(bb_points);
}
for (auto x = bb.min.x; x <= bb.max.x - pillar_size; x += pillar_spacing) {
for (auto y = bb.min.y; y <= bb.max.y - pillar_size; y += pillar_spacing) {
pillars.push_back(pillar);
pillar.translate(x, y);
}
}
grid = union_(pillars);
}
// Add pillars to every layer.
for (auto i = 0; i < support_z.size(); i++) {
shape[i] = grid;
}
// Build capitals.
for (auto i = 0; i < support_z.size(); i++) {
coordf_t z = support_z[i];
auto capitals = intersection(
grid,
contact.at(z)
);
// Work on one pillar at time (if any) to prevent the capitals from being merged
// but store the contact area supported by the capital because we need to make
// sure nothing is left.
Polygons contact_supported_by_capitals;
for (auto capital : capitals) {
// Enlarge capital tops.
auto capital_polygons = offset(Polygons({capital}), +(pillar_spacing - pillar_size) / 2);
append_to(contact_supported_by_capitals, capital_polygons);
for (int j = i - 1; j >= 0; j--) {
auto jz = support_z[j];
capital_polygons = offset(Polygons{capital}, -interface_flow->scaled_width() / 2);
if (capitals.empty()) break;
append_to(shape[i], capital_polygons);
}
}
// Work on one pillar at time (if any) to prevent the capitals from being merged
// but store the contact area supported by the capital because we need to make
// sure nothing is left.
auto contact_not_supported_by_capitals = diff(
contact.at(z),
contact_supported_by_capitals
);
if (!contact_not_supported_by_capitals.empty()) {
for (int j = i - 1; j >= 0; j--) {
append_to(shape[j], contact_not_supported_by_capitals);
}
}
}
}
map<int, Polygons>
SupportMaterial::generate_base_layers(vector<coordf_t> support_z,
map<coordf_t, Polygons> contact,
@ -794,6 +812,18 @@ SupportMaterial::generate_bottom_interface_layers(const vector<coordf_t> &suppor
}
}
coordf_t
SupportMaterial::contact_distance(coordf_t layer_height, coordf_t nozzle_diameter)
{
coordf_t extra = static_cast<float>(object_config->support_material_contact_distance.value);
if (extra == 0) {
return layer_height;
}
else {
return nozzle_diameter + extra;
}
}
vector<int>
SupportMaterial::overlapping_layers(int layer_idx, const vector<coordf_t> &support_z)
{
@ -868,4 +898,61 @@ SupportMaterial::clip_with_object(map<int, Polygons> &support, vector<coordf_t>
*/
}
Polygons
SupportMaterial::p(SurfacesPtr &surfaces)
{
Polygons ret;
for (auto surface : surfaces) {
ret.push_back(surface->expolygon.contour);
for (const auto &hole_polygon : surface->expolygon.holes) {
ret.push_back(hole_polygon);
}
}
return ret;
}
void
SupportMaterial::append_polygons(Polygons &dst, Polygons &src)
{
for (const auto polygon : src) {
dst.push_back(polygon);
}
}
vector<coordf_t>
SupportMaterial::get_keys_sorted(map<coordf_t, Polygons> _map)
{
vector<coordf_t> ret;
for (auto el : _map)
ret.push_back(el.first);
sort(ret.begin(), ret.end());
return ret;
}
coordf_t
SupportMaterial::get_max_layer_height(PrintObject *object)
{
coordf_t ret = -1;
for (auto layer : object->layers)
ret = max(ret, layer->height);
return ret;
}
Polygon
SupportMaterial::create_circle(coordf_t radius)
{
Points points;
coordf_t positions[] = {5 * PI / 3,
4 * PI / 3,
PI,
2 * PI / 3,
PI / 3,
0};
for (auto pos : positions) {
points.emplace_back(radius * cos(pos), (radius * sin(pos)));
}
return Polygon(points);
}
}

View File

@ -50,145 +50,6 @@ public:
object(nullptr)
{}
void generate_pillars_shape(const map<coordf_t, Polygons> &contact,
const vector<coordf_t> &support_z,
map<int, Polygons> &shape)
{
// This prevents supplying an empty point set to BoundingBox constructor.
if (contact.empty()) return;
coord_t pillar_size = scale_(object_config->support_material_pillar_size.value);
coord_t pillar_spacing = scale_(object_config->support_material_pillar_spacing.value);
Polygons grid;
{
auto pillar = Polygon({
Point(0, 0),
Point(pillar_size, coord_t(0)),
Point(pillar_size, pillar_size),
Point(coord_t(0), pillar_size)
});
Polygons pillars;
BoundingBox bb;
{
Points bb_points;
for (auto contact_el : contact) {
append_to(bb_points, to_points(contact_el.second));
}
bb = BoundingBox(bb_points);
}
for (auto x = bb.min.x; x <= bb.max.x - pillar_size; x += pillar_spacing) {
for (auto y = bb.min.y; y <= bb.max.y - pillar_size; y += pillar_spacing) {
pillars.push_back(pillar);
pillar.translate(x, y);
}
}
grid = union_(pillars);
}
// Add pillars to every layer.
for (auto i = 0; i < support_z.size(); i++) {
shape[i] = grid;
}
// Build capitals.
for (auto i = 0; i < support_z.size(); i++) {
coordf_t z = support_z[i];
auto capitals = intersection(
grid,
contact.at(z)
);
// Work on one pillar at time (if any) to prevent the capitals from being merged
// but store the contact area supported by the capital because we need to make
// sure nothing is left.
Polygons contact_supported_by_capitals;
for (auto capital : capitals) {
// Enlarge capital tops.
auto capital_polygons = offset(Polygons({capital}), +(pillar_spacing - pillar_size) / 2);
append_to(contact_supported_by_capitals, capital_polygons);
for (int j = i - 1; j >= 0; j--) {
auto jz = support_z[j];
capital_polygons = offset(Polygons{capital}, -interface_flow->scaled_width() / 2);
if (capitals.empty()) break;
append_to(shape[i], capital_polygons);
}
}
// Work on one pillar at time (if any) to prevent the capitals from being merged
// but store the contact area supported by the capital because we need to make
// sure nothing is left.
auto contact_not_supported_by_capitals = diff(
contact.at(z),
contact_supported_by_capitals
);
if (!contact_not_supported_by_capitals.empty()) {
for (int j = i - 1; j >= 0; j--) {
append_to(shape[j], contact_not_supported_by_capitals);
}
}
}
}
void generate_bottom_interface_layers(const vector<coordf_t> &support_z,
map<int, Polygons> &base,
map<coordf_t, Polygons> &top,
map<int, Polygons> &interface);
map<int, Polygons> generate_base_layers(vector<coordf_t> support_z,
map<coordf_t, Polygons> contact,
map<int, Polygons> interface,
map<coordf_t, Polygons> top);
map<int, Polygons> generate_interface_layers(vector<coordf_t> support_z,
map<coordf_t, Polygons> contact,
map<coordf_t, Polygons> top);
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_area(PrintObject *object);
void generate(PrintObject *object);
void generate_toolpaths(PrintObject *object,
map<coordf_t, Polygons> overhang,
map<coordf_t, Polygons> contact,
map<int, Polygons> interface,
map<int, Polygons> base);
// Is this expolygons or polygons?
map<coordf_t, Polygons> object_top(PrintObject *object, map<coordf_t, Polygons> *contact);
// This method removes object silhouette from support material
// (it's used with interface and base only). It removes a bit more,
// leaving a thin gap between object and support in the XY plane.
void clip_with_object(map<int, Polygons> &support, vector<coordf_t> support_z, PrintObject &object);
void clip_with_shape(map<int, Polygons> &support, map<int, Polygons> &shape);
/// This method returns the indices of the layers overlapping with the given one.
vector<int> overlapping_layers(int layer_idx, const vector<coordf_t> &support_z);
vector<coordf_t> support_layers_z(vector<coordf_t> contact_z,
vector<coordf_t> top_z,
coordf_t max_object_layer_height);
coordf_t contact_distance(coordf_t layer_height, coordf_t nozzle_diameter);
Polygons p(SurfacesPtr &surfaces);
Polygon create_circle(coordf_t radius);
void append_polygons(Polygons &dst, Polygons &src);
vector<coordf_t> get_keys_sorted(map<coordf_t, Polygons> _map);
coordf_t get_max_layer_height(PrintObject *object);
void process_layer(int layer_id)
{
SupportLayer *layer = this->object->support_layers[layer_id];
@ -212,7 +73,64 @@ public:
}
void generate_toolpaths(PrintObject *object,
map<coordf_t, Polygons> overhang,
map<coordf_t, Polygons> contact,
map<int, Polygons> interface,
map<int, Polygons> base);
void generate(PrintObject *object);
vector<coordf_t> support_layers_z(vector<coordf_t> contact_z,
vector<coordf_t> top_z,
coordf_t max_object_layer_height);
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_area(PrintObject *object);
// Is this expolygons or polygons?
map<coordf_t, Polygons> object_top(PrintObject *object, map<coordf_t, Polygons> *contact);
void generate_pillars_shape(const map<coordf_t, Polygons> &contact,
const vector<coordf_t> &support_z,
map<int, Polygons> &shape);
map<int, Polygons> generate_base_layers(vector<coordf_t> support_z,
map<coordf_t, Polygons> contact,
map<int, Polygons> interface,
map<coordf_t, Polygons> top);
map<int, Polygons> generate_interface_layers(vector<coordf_t> support_z,
map<coordf_t, Polygons> contact,
map<coordf_t, Polygons> top);
void generate_bottom_interface_layers(const vector<coordf_t> &support_z,
map<int, Polygons> &base,
map<coordf_t, Polygons> &top,
map<int, Polygons> &interface);
coordf_t contact_distance(coordf_t layer_height, coordf_t nozzle_diameter);
/// This method returns the indices of the layers overlapping with the given one.
vector<int> overlapping_layers(int layer_idx, const vector<coordf_t> &support_z);
void clip_with_shape(map<int, Polygons> &support, map<int, Polygons> &shape);
// This method removes object silhouette from support material
// (it's used with interface and base only). It removes a bit more,
// leaving a thin gap between object and support in the XY plane.
void clip_with_object(map<int, Polygons> &support, vector<coordf_t> support_z, PrintObject &object);
private:
coordf_t get_max_layer_height(PrintObject *object);
void append_polygons(Polygons &dst, Polygons &src);
Polygons p(SurfacesPtr &surfaces);
vector<coordf_t> get_keys_sorted(map<coordf_t, Polygons> _map);
Polygon create_circle(coordf_t radius);
// Used during generate_toolpaths function.
PrintObject *object;
map<coordf_t, Polygons> overhang;