diff --git a/src/libslic3r/SupportableIssuesSearch.cpp b/src/libslic3r/SupportableIssuesSearch.cpp index ea2ba41063..e60f859302 100644 --- a/src/libslic3r/SupportableIssuesSearch.cpp +++ b/src/libslic3r/SupportableIssuesSearch.cpp @@ -125,9 +125,29 @@ EdgeGridWrapper compute_layer_edge_grid(const Layer *layer) { return EdgeGridWrapper(scale_(min_region_flow_width), ex_polygons); } -coordf_t get_max_allowed_distance(ExtrusionRole role, coord_t flow_width, const Params ¶ms) { // <= distance / flow_width (can be larger for perimeter, if not external perimeter first) - if (!params.external_perimeter_first - && (role == ExtrusionRole::erExternalPerimeter || role == ExtrusionRole::erOverhangPerimeter)) { +//TODO needs revision +coordf_t get_flow_width(const LayerRegion *region, ExtrusionRole role) { + switch (role) { + case ExtrusionRole::erBridgeInfill: + return region->flow(FlowRole::frExternalPerimeter).scaled_width(); + case ExtrusionRole::erExternalPerimeter: + return region->flow(FlowRole::frExternalPerimeter).scaled_width(); + case ExtrusionRole::erGapFill: + return region->flow(FlowRole::frInfill).scaled_width(); + case ExtrusionRole::erPerimeter: + return region->flow(FlowRole::frPerimeter).scaled_width(); + case ExtrusionRole::erSolidInfill: + return region->flow(FlowRole::frSolidInfill).scaled_width(); + default: + return region->flow(FlowRole::frPerimeter).scaled_width(); + } +} + +coordf_t get_max_allowed_distance(ExtrusionRole role, coord_t flow_width, bool external_perimeters_first, + const Params ¶ms) { // <= distance / flow_width (can be larger for perimeter, if not external perimeter first) + if ((role == ExtrusionRole::erExternalPerimeter || role == ExtrusionRole::erOverhangPerimeter) + && !(external_perimeters_first) + ) { return params.max_ex_perim_unsupported_distance_factor * flow_width; } else { return params.max_unsupported_distance_factor * flow_width; @@ -136,16 +156,17 @@ coordf_t get_max_allowed_distance(ExtrusionRole role, coord_t flow_width, const Issues check_extrusion_entity_stability(const ExtrusionEntity *entity, float slice_z, - coordf_t flow_width, + const LayerRegion *layer_region, const EdgeGridWrapper &supported_grid, const Params ¶ms) { Issues issues { }; if (entity->is_collection()) { for (const auto *e : static_cast(entity)->entities) { - issues.add(check_extrusion_entity_stability(e, slice_z, flow_width, supported_grid, params)); + issues.add(check_extrusion_entity_stability(e, slice_z, layer_region, supported_grid, params)); } } else { //single extrusion path, with possible varying parameters + std::stack points { }; for (const auto &p : entity->as_polyline().points) { points.push(p); @@ -157,8 +178,10 @@ Issues check_extrusion_entity_stability(const ExtrusionEntity *entity, Vec2f tmp = unscale(points.top()).cast(); Vec3f prev_fpoint = Vec3f(tmp.x(), tmp.y(), slice_z); + coordf_t flow_width = get_flow_width(layer_region, entity->role()); + bool external_perimters_first = layer_region->region().config().external_perimeters_first; const coordf_t max_allowed_dist_from_prev_layer = get_max_allowed_distance(entity->role(), flow_width, - params); + external_perimters_first, params); while (!points.empty()) { Point point = points.top(); @@ -229,24 +252,6 @@ Issues check_extrusion_entity_stability(const ExtrusionEntity *entity, return issues; } -//TODO needs revision -coordf_t get_flow_width(const LayerRegion *region, ExtrusionRole role) { - switch (role) { - case ExtrusionRole::erBridgeInfill: - return region->flow(FlowRole::frExternalPerimeter).scaled_width(); - case ExtrusionRole::erExternalPerimeter: - return region->flow(FlowRole::frExternalPerimeter).scaled_width(); - case ExtrusionRole::erGapFill: - return region->flow(FlowRole::frInfill).scaled_width(); - case ExtrusionRole::erPerimeter: - return region->flow(FlowRole::frPerimeter).scaled_width(); - case ExtrusionRole::erSolidInfill: - return region->flow(FlowRole::frSolidInfill).scaled_width(); - default: - return region->flow(FlowRole::frPerimeter).scaled_width(); - } -} - Issues check_layer_stability(const PrintObject *po, size_t layer_idx, bool full_check, const Params ¶ms) { std::cout << "Checking: " << layer_idx << std::endl; if (layer_idx == 0) { @@ -262,7 +267,7 @@ Issues check_layer_stability(const PrintObject *po, size_t layer_idx, bool full_ for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { issues.add(check_extrusion_entity_stability(perimeter, - layer->slice_z, get_flow_width(layer_region, perimeter->role()), + layer->slice_z, layer_region, supported_grid, params)); } // perimeter } // ex_entity @@ -270,12 +275,13 @@ Issues check_layer_stability(const PrintObject *po, size_t layer_idx, bool full_ for (const ExtrusionEntity *fill : static_cast(ex_entity)->entities) { if (fill->role() == ExtrusionRole::erGapFill || fill->role() == ExtrusionRole::erBridgeInfill) { issues.add(check_extrusion_entity_stability(fill, - layer->slice_z, get_flow_width(layer_region, fill->role()), + layer->slice_z, layer_region, supported_grid, params)); } } // fill } // ex_entity } // region + } else { //check only external perimeters for (const LayerRegion *layer_region : layer->regions()) { for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { @@ -283,7 +289,7 @@ Issues check_layer_stability(const PrintObject *po, size_t layer_idx, bool full_ if (perimeter->role() == ExtrusionRole::erExternalPerimeter || perimeter->role() == ExtrusionRole::erOverhangPerimeter) { issues.add(check_extrusion_entity_stability(perimeter, - layer->slice_z, get_flow_width(layer_region, perimeter->role()), + layer->slice_z, layer_region, supported_grid, params)); }; // ex_perimeter } // perimeter diff --git a/src/libslic3r/SupportableIssuesSearch.hpp b/src/libslic3r/SupportableIssuesSearch.hpp index 4ff0e32faa..80127520af 100644 --- a/src/libslic3r/SupportableIssuesSearch.hpp +++ b/src/libslic3r/SupportableIssuesSearch.hpp @@ -11,7 +11,6 @@ struct Params { float bridge_distance = 10.0f; float limit_curvature = 0.3f; - bool external_perimeter_first = false; float max_unsupported_distance_factor = 0.0f; float max_ex_perim_unsupported_distance_factor = 1.0f; float bridge_distance_decrease_by_curvature_factor = 5.0f;