From 93d81062afeedc15087d503a03cc37d3fce38ba6 Mon Sep 17 00:00:00 2001 From: Samir55 Date: Thu, 12 Jul 2018 02:14:22 +0200 Subject: [PATCH] Porting generate_base_layers() function. --- xs/src/libslic3r/SupportMaterial.cpp | 31 +++++++------- xs/src/libslic3r/SupportMaterial.hpp | 64 ++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/xs/src/libslic3r/SupportMaterial.cpp b/xs/src/libslic3r/SupportMaterial.cpp index b5418cb3b..6414c444d 100644 --- a/xs/src/libslic3r/SupportMaterial.cpp +++ b/xs/src/libslic3r/SupportMaterial.cpp @@ -147,7 +147,7 @@ SupportMaterial::support_layers_z(vector contact_z, } vector -SupportMaterial::overlapping_layers(int layer_idx, vector support_z) +SupportMaterial::overlapping_layers(int layer_idx, const vector &support_z) { vector ret; @@ -520,9 +520,9 @@ SupportMaterial::contact_area(PrintObject *object) // For bridges we can't assume width is larger than spacing because they // are positioned according to non-bridging perimeters spacing. coord_t widths[] = {bridge_flow.scaled_width(), - bridge_flow.scaled_spacing(), - fw, - layerm->flow(FlowRole::frPerimeter).scaled_width()}; + bridge_flow.scaled_spacing(), + fw, + layerm->flow(FlowRole::frPerimeter).scaled_width()}; auto w = *max_element(widths, widths + 4); @@ -680,7 +680,10 @@ SupportMaterial::generate(PrintObject *object) // object's top surfaces this is the place to detect them. TODO - // Propagate contact layers downwards to generate interface layers. TODO + // Propagate contact layers downwards to generate interface layers. + map interface = generate_interface_layers(support_z, contact, top); + clip_with_object(interface, support_z, *object); +// clip_with_shape(base, shape); // TODO // Propagate contact layers and interface layers downwards to generate // the main support layers. TODO @@ -709,16 +712,16 @@ SupportMaterial::generate(PrintObject *object) } - -map -SupportMaterial::generate_interface_layers(vector support_z, map contact, map top) +map +SupportMaterial::generate_interface_layers(vector support_z, + map contact, + map top) { // let's now generate interface layers below contact areas. - map interface; + map interface; auto interface_layers_num = object_config->support_material_interface_layers.value; - for (int layer_id = 0; layer_id < support_z.size(); layer_id++) - { + for (int layer_id = 0; layer_id < support_z.size(); layer_id++) { // Todo Ask about how to port this line. "my $this = $contact->{$z} // next;" auto z = support_z[layer_id]; if (contact.count(z) <= 0) @@ -726,8 +729,7 @@ SupportMaterial::generate_interface_layers(vector support_z, map= 0 && i > layer_id - interface_layers_num; i--) - { + for (int i = layer_id - 1; i >= 0 && i > layer_id - interface_layers_num; i--) { auto _z = support_z[i]; auto overlapping_layers = this->overlapping_layers(i, support_z); vector overlapping_z; @@ -745,8 +747,7 @@ SupportMaterial::generate_interface_layers(vector support_z, map 0) append_polygons(ps_2, top[el]); // top slices on this layer. if (contact.count(el)) diff --git a/xs/src/libslic3r/SupportMaterial.hpp b/xs/src/libslic3r/SupportMaterial.hpp index 417805ba3..723e9569e 100644 --- a/xs/src/libslic3r/SupportMaterial.hpp +++ b/xs/src/libslic3r/SupportMaterial.hpp @@ -50,21 +50,67 @@ public: object(nullptr) {} - void generate(PrintObject *object); - - map generate_interface_layers(vector support_z, map contact, map top); - void generate_bottom_interface_layers() {} - void generate_base_layers() - {} + map generate_base_layers(vector support_z, + map contact, + map interface, + map top) + { + // Let's now generate support layers under interface layers. + map base; + { + for (int i = static_cast(support_z.size() - 1); i >= 0; i--) { + auto z = support_z[i]; + auto overlapping_layers = this->overlapping_layers(i, support_z); + vector overlapping_z; + for (auto el : overlapping_layers) + overlapping_z.push_back(support_z[el]); + + // In case we have no interface layers, look at upper contact + // (1 interface layer means we only have contact layer, so $interface->{$i+1} is empty). + Polygons upper_contact; + if (object_config->support_material_interface_layers.value <= 1) { + append_polygons(upper_contact, contact[support_z[i + 1]]); + } + + Polygons ps_1; + append_polygons(ps_1, base[i + 1]); // support regions on upper layer. + append_polygons(ps_1, interface[i + 1]); // interface regions on upper layer + append_polygons(ps_1, upper_contact); // contact regions on upper layer + + Polygons ps_2; + for (auto el : overlapping_z) { + if (top.count(el) > 0) + append_polygons(ps_2, top[el]); // top slices on this layer. + if (interface.count(el)) + append_polygons(ps_2, interface[el]); // interface regions on this layer. + if (contact.count(el)) + append_polygons(ps_2, contact[el]); // contact regions on this layer. + } + + base[i] = diff( + ps_1, + ps_2, + 1 + ); + } + } + return base; + } void generate_pillars_shape() {} + map generate_interface_layers(vector support_z, + map contact, + map top); + pair, map> contact_area(PrintObject *object); + void generate(PrintObject *object); + void generate_toolpaths(PrintObject *object, map overhang, map contact, @@ -82,7 +128,7 @@ public: void clip_with_shape(map &support, map &shape); /// This method returns the indices of the layers overlapping with the given one. - vector overlapping_layers(int layer_idx, vector support_z); + vector overlapping_layers(int layer_idx, const vector &support_z); vector support_layers_z(vector contact_z, vector top_z, @@ -160,8 +206,8 @@ public: print.default_object_config.set_deserialize("layer_height", "0.2"); print.config.set_deserialize("first_layer_height", "0.3"); - vector contact_z; - vector top_z; + vector contact_z; + vector top_z; contact_z.push_back(1.9); top_z.push_back(1.9);