diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 606009064..8cfbd8b12 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1636,11 +1636,13 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector arches; - arches.reserve(graph.map_infill_end_point_to_boundary.size()); - for (ContourIntersectionPoint &cp : graph.map_infill_end_point_to_boundary) - if (cp.contour_idx != boundary_idx_unconnected && cp.next_on_contour != &cp && cp.could_connect_next()) - arches.push_back({ &cp, path_length_along_contour_ccw(&cp, cp.next_on_contour, graph.boundary_params[cp.contour_idx].back()) }); - std::sort(arches.begin(), arches.end(), [](const auto &l, const auto &r) { return l.arc_length < r.arc_length; }); + if (!params.dont_sort) { + arches.reserve(graph.map_infill_end_point_to_boundary.size()); + for (ContourIntersectionPoint& cp : graph.map_infill_end_point_to_boundary) + if (cp.contour_idx != boundary_idx_unconnected && cp.next_on_contour != &cp && cp.could_connect_next()) + arches.push_back({ &cp, path_length_along_contour_ccw(&cp, cp.next_on_contour, graph.boundary_params[cp.contour_idx].back()) }); + std::sort(arches.begin(), arches.end(), [](const auto& l, const auto& r) { return l.arc_length < r.arc_length; }); + } //FIXME improve the Traveling Salesman problem with 2-opt and 3-opt local optimization. for (Arc &arc : arches) diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index 78a8d5b14..4e0927077 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -76,6 +76,7 @@ struct FillParams bool using_internal_flow{ false }; //BBS: only used for new top surface pattern float no_extrusion_overlap{ 0.0 }; + bool dont_sort{ false }; // do not sort the lines, just simply connect them }; static_assert(IsTriviallyCopyable::value, "FillParams class is not POD (and it should be - see constructor)."); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 2d6d39e6c..abf67980d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -190,7 +190,9 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialStyle) static t_config_enum_values s_keys_map_SupportMaterialInterfacePattern { { "auto", smipAuto }, { "rectilinear", smipRectilinear }, - { "concentric", smipConcentric } + { "concentric", smipConcentric }, + { "rectilinear_interlaced", smipRectilinearInterlaced}, + { "grid", smipGrid } }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialInterfacePattern) @@ -2634,9 +2636,13 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("auto"); def->enum_values.push_back("rectilinear"); def->enum_values.push_back("concentric"); + def->enum_values.push_back("rectilinear_interlaced"); + def->enum_values.push_back("grid"); def->enum_labels.push_back(L("Default")); def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Concentric")); + def->enum_labels.push_back(L("Rectilinear Interlaced")); + def->enum_labels.push_back(L("Grid")); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(smipRectilinear)); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 52f4643c5..746d3c3c1 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -104,7 +104,7 @@ enum SupportMaterialStyle { }; enum SupportMaterialInterfacePattern { - smipAuto, smipRectilinear, smipConcentric, + smipAuto, smipRectilinear, smipConcentric, smipRectilinearInterlaced, smipGrid }; // BBS diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 21b59f3c9..68cfcf3eb 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -412,7 +412,12 @@ PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object support_pattern == smpHoneycomb ? ipHoneycomb : m_support_params.support_density > 0.95 || m_support_params.with_sheath ? ipRectilinear : ipSupportBase; m_support_params.interface_fill_pattern = (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); - m_support_params.contact_fill_pattern = + if (m_object_config->support_interface_pattern == smipGrid) + m_support_params.contact_fill_pattern = ipGrid; + else if (m_object_config->support_interface_pattern == smipRectilinearInterlaced) + m_support_params.contact_fill_pattern = ipRectilinear; + else + m_support_params.contact_fill_pattern = (m_object_config->support_interface_pattern == smipAuto && m_slicing_params.soluble_interface) || m_object_config->support_interface_pattern == smipConcentric ? ipConcentric : @@ -3642,7 +3647,6 @@ static inline void fill_expolygon_generate_paths( ExPolygon &&expolygon, Fill *filler, const FillParams &fill_params, - float density, ExtrusionRole role, const Flow &flow) { @@ -3664,12 +3668,11 @@ static inline void fill_expolygons_generate_paths( ExPolygons &&expolygons, Fill *filler, const FillParams &fill_params, - float density, ExtrusionRole role, const Flow &flow) { for (ExPolygon &expoly : expolygons) - fill_expolygon_generate_paths(dst, std::move(expoly), filler, fill_params, density, role, flow); + fill_expolygon_generate_paths(dst, std::move(expoly), filler, fill_params, role, flow); } static inline void fill_expolygons_generate_paths( @@ -3683,7 +3686,7 @@ static inline void fill_expolygons_generate_paths( FillParams fill_params; fill_params.density = density; fill_params.dont_adjust = true; - fill_expolygons_generate_paths(dst, std::move(expolygons), filler, fill_params, density, role, flow); + fill_expolygons_generate_paths(dst, std::move(expolygons), filler, fill_params, role, flow); } static inline void fill_expolygons_with_sheath_generate_paths( @@ -3731,7 +3734,7 @@ static inline void fill_expolygons_with_sheath_generate_paths( } extrusion_entities_append_paths(out, polylines, erSupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height()); // Fill in the rest. - fill_expolygons_generate_paths(out, offset_ex(expoly, float(-0.4 * spacing)), filler, fill_params, density, role, flow); + fill_expolygons_generate_paths(out, offset_ex(expoly, float(-0.4 * spacing)), filler, fill_params, role, flow); if (no_sort && ! eec->empty()) dst.emplace_back(eec.release()); } @@ -4581,13 +4584,23 @@ void PrintObjectSupportMaterial::generate_toolpaths( double density = interface_as_base ? m_support_params.support_density : m_support_params.interface_density; filler_interface->spacing = interface_as_base ? m_support_params.support_material_flow.spacing() : m_support_params.support_material_interface_flow.spacing(); filler_interface->link_max_length = coord_t(scale_(filler_interface->spacing * link_max_length_factor / density)); + // BBS support more interface patterns + FillParams fill_params; + fill_params.density = density; + fill_params.dont_adjust = true; + if (m_object_config->support_interface_pattern == smipGrid) { + filler_interface->angle = Geometry::deg2rad(m_support_params.base_angle); + fill_params.dont_sort = true; + } + if (m_object_config->support_interface_pattern == smipRectilinearInterlaced) + filler_interface->layer_id = support_layer.interface_id(); fill_expolygons_generate_paths( // Destination layer_ex.extrusions, // Regions to fill union_safety_offset_ex(layer_ex.polygons_to_extrude()), // Filler and its parameters - filler_interface.get(), float(density), + filler_interface.get(), fill_params, // Extrusion parameters erSupportMaterialInterface, interface_flow); } diff --git a/src/libslic3r/TreeSupport.cpp b/src/libslic3r/TreeSupport.cpp index 919e63bec..5c69ea1e5 100644 --- a/src/libslic3r/TreeSupport.cpp +++ b/src/libslic3r/TreeSupport.cpp @@ -698,10 +698,15 @@ TreeSupport::TreeSupport(PrintObject& object, const SlicingParameters &slicing_p ipSupportBase; m_support_params.interface_fill_pattern = (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); - m_support_params.contact_fill_pattern = (m_object_config->support_interface_pattern == smipAuto && m_slicing_params.soluble_interface) || - m_object_config->support_interface_pattern == smipConcentric ? - ipConcentric : - (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); + if (m_object_config->support_interface_pattern == smipGrid) + m_support_params.contact_fill_pattern = ipGrid; + else if (m_object_config->support_interface_pattern == smipRectilinearInterlaced) + m_support_params.contact_fill_pattern = ipRectilinear; + else + m_support_params.contact_fill_pattern = (m_object_config->support_interface_pattern == smipAuto && m_slicing_params.soluble_interface) || + m_object_config->support_interface_pattern == smipConcentric ? + ipConcentric : + (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); m_support_params.support_extrusion_width = m_object_config->support_line_width.value > 0 ? m_object_config->support_line_width : m_object_config->line_width; is_slim = is_tree_slim(support_type, support_style); MAX_BRANCH_RADIUS = 10.0; @@ -1573,6 +1578,12 @@ void TreeSupport::generate_toolpaths() // roof_areas fill_params.density = interface_density; filler_interface->spacing = m_support_material_interface_flow.spacing(); + if (m_object_config->support_interface_pattern == smipGrid) { + filler_interface->angle = Geometry::deg2rad(object_config.support_angle.value); + fill_params.dont_sort = true; + } + if (m_object_config->support_interface_pattern == smipRectilinearInterlaced) + filler_interface->layer_id = round(area_group.dist_to_top / ts_layer->height); fill_expolygons_generate_paths(ts_layer->support_fills.entities, std::move(polys), filler_interface.get(), fill_params, erSupportMaterialInterface, m_support_material_interface_flow); }