diff --git a/src/libslic3r/Support/SupportCommon.cpp b/src/libslic3r/Support/SupportCommon.cpp index 11c76d228..7eafacdb0 100644 --- a/src/libslic3r/Support/SupportCommon.cpp +++ b/src/libslic3r/Support/SupportCommon.cpp @@ -145,9 +145,9 @@ std::pair generate_interfa if (support_params.num_top_base_interface_layers > 0) // Some top base interface layers will be generated. top_inteface_z = support_params.num_top_interface_layers_only() == 0 ? - // Only base interface layers to generate. + // Only base interface layers to generate. - std::numeric_limits::max() : - intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + int(support_params.num_top_interface_layers_only()) - 1)]->print_z; + intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + int(support_params.num_top_interface_layers_only()) - 1)]->print_z; // Move idx_top_contact_first up until above the current print_z. idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const SupportGeneratorLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON // Collect the top contact areas above this intermediate layer, below top_z. @@ -208,6 +208,17 @@ std::pair generate_interfa } }); + tbb::parallel_for(tbb::blocked_range(1, int(base_interface_layers.size())), [&base_interface_layers](const tbb::blocked_range &range) { + for (int layer_id = range.begin(); layer_id < range.end(); ++layer_id) { + auto &base_interface_layer = base_interface_layers[layer_id]; + if (!base_interface_layer) return; + + auto &lower_layer = base_interface_layers[layer_id - 1]; + if (!lower_layer) return; + if (base_interface_layer->polygons == lower_layer->polygons) base_interface_layer->up = true; + } + }); + // Compress contact_out, remove the nullptr items. // The parallel_for above may not have merged all the interface and base_interface layers // generated by the Organic supports code, do it here. @@ -1697,7 +1708,8 @@ void generate_support_toolpaths( // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) assert(! base_interface_layer.layer->bridging); Flow interface_flow = support_params.support_material_flow.with_height(float(base_interface_layer.layer->height)); - filler->angle = interface_angles[(support_layer_id + 1) % interface_angles.size()]; // need to be the same as the interface layer above + filler->angle = base_interface_layer.layer->up ? interface_angles[(support_layer_id + 1) % interface_angles.size()] + M_PI_2 : + (angles[(support_layer_id - 1) % angles.size()] + M_PI_2); filler->spacing = support_params.support_material_interface_flow.spacing(); filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.interface_density)); fill_expolygons_generate_paths( @@ -1709,7 +1721,7 @@ void generate_support_toolpaths( // Filler and its parameters filler, float(support_params.interface_density), // Extrusion parameters - ExtrusionRole::erSupportMaterial, interface_flow); + ExtrusionRole::erSupportTransition, interface_flow); } // Base support or flange. diff --git a/src/libslic3r/Support/SupportLayer.hpp b/src/libslic3r/Support/SupportLayer.hpp index ac820f754..cc2888aea 100644 --- a/src/libslic3r/Support/SupportLayer.hpp +++ b/src/libslic3r/Support/SupportLayer.hpp @@ -110,6 +110,8 @@ namespace Slic3r { size_t idx_object_layer_below{ size_t(-1) }; // Use a bridging flow when printing this support layer. bool bridging{ false }; + //order of the transition layers + bool up{false}; // Polygons to be filled by the support pattern. Polygons polygons; diff --git a/src/libslic3r/Support/SupportParameters.hpp b/src/libslic3r/Support/SupportParameters.hpp index 6c7379622..d874b66bb 100644 --- a/src/libslic3r/Support/SupportParameters.hpp +++ b/src/libslic3r/Support/SupportParameters.hpp @@ -35,7 +35,7 @@ struct SupportParameters { this->has_bottom_contacts = num_bottom_interface_layers > 0; if (this->soluble_interface_non_soluble_base) { // Try to support soluble dense interfaces with non-soluble dense interfaces. - this->num_top_base_interface_layers = size_t(std::min(int(num_top_interface_layers) / 2, 2)); + this->num_top_base_interface_layers = num_top_interface_layers > 0 ? 2 : 0; this->num_bottom_base_interface_layers = size_t(std::min(int(num_bottom_interface_layers) / 2, 2)); } else { // BBS: if support interface and support base do not use the same filament, add a base layer to improve their adhesion @@ -43,7 +43,7 @@ struct SupportParameters { // support_filament==0 bool differnt_support_interface_filament = object_config.support_interface_filament != 0 && object_config.support_interface_filament != object_config.support_filament; - this->num_top_base_interface_layers = differnt_support_interface_filament ? 1 : 0; + this->num_top_base_interface_layers = differnt_support_interface_filament ? 2 : 0; this->num_bottom_base_interface_layers = differnt_support_interface_filament ? 1 : 0; } }