From a57680ea67869960d0e1f5fb33bbf0ecb94c5cab Mon Sep 17 00:00:00 2001 From: Pavel Mikus Date: Mon, 9 Jan 2023 20:27:33 +0100 Subject: [PATCH] BUGFIX in aabb intersections, additional debug info --- src/libslic3r/AABBTreeLines.hpp | 2 +- src/libslic3r/SupportSpotsGenerator.cpp | 34 +++++++++++++++++-------- src/libslic3r/SupportSpotsGenerator.hpp | 4 +-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/AABBTreeLines.hpp b/src/libslic3r/AABBTreeLines.hpp index 7938337d83..21678bfcdf 100644 --- a/src/libslic3r/AABBTreeLines.hpp +++ b/src/libslic3r/AABBTreeLines.hpp @@ -128,7 +128,7 @@ inline std::vector> get_intersections_with_line(si if (node.is_leaf()) { VectorType intersection_pt; if (line_alg::intersection(line, lines[node.idx], &intersection_pt)) { - return {std::pair(intersection_pt, node_idx)}; + return {std::pair(intersection_pt, node.idx)}; } else { return {}; } diff --git a/src/libslic3r/SupportSpotsGenerator.cpp b/src/libslic3r/SupportSpotsGenerator.cpp index 023c3b50ea..38f0876d25 100644 --- a/src/libslic3r/SupportSpotsGenerator.cpp +++ b/src/libslic3r/SupportSpotsGenerator.cpp @@ -45,7 +45,7 @@ namespace Slic3r { class ExtrusionLine { public: - ExtrusionLine() : a(Vec2f::Zero()), b(Vec2f::Zero()), origin_entity(nullptr) {} + ExtrusionLine() : a(Vec2f::Zero()), b(Vec2f::Zero()), len(0.0), origin_entity(nullptr) {} ExtrusionLine(const Vec2f &a, const Vec2f &b, float len, const ExtrusionEntity *origin_entity) : a(a), b(b), len(len), origin_entity(origin_entity) {} @@ -213,12 +213,13 @@ float estimate_curled_up_height( } if (point.distance > params.malformation_distance_factors.first * flow_width && point.distance < params.malformation_distance_factors.second * flow_width && point.curvature > -0.1f) { - float dist_factor = (point.distance - params.malformation_distance_factors.first * flow_width) / + float dist_factor = std::max(point.distance - params.malformation_distance_factors.first * flow_width, 0.01f) / ((params.malformation_distance_factors.second - params.malformation_distance_factors.first) * flow_width); curled_up_height = layer_height * 2.0f * sqrt(sqrt(dist_factor)) * std::clamp(6.0f * point.curvature, 1.0f, 6.0f); - curled_up_height = std::min(curled_up_height, params.max_malformation_factor * layer_height); + curled_up_height = std::min(curled_up_height, params.max_curled_height_factor * layer_height); } + return curled_up_height; } @@ -507,7 +508,8 @@ public: BOOST_LOG_TRIVIAL(debug) << "SSG: bed_movement_arm: " << bed_movement_arm; BOOST_LOG_TRIVIAL(debug) << "SSG: bed_movement_torque: " << bed_movement_torque; BOOST_LOG_TRIVIAL(debug) << "SSG: bed_conflict_torque_arm: " << bed_conflict_torque_arm; - BOOST_LOG_TRIVIAL(debug) << "SSG: extruded_line.malformation: " << extruded_line.malformation; + BOOST_LOG_TRIVIAL(debug) << "SSG: extruded_line.curled_up_height: " << extruded_line.curled_up_height; + BOOST_LOG_TRIVIAL(debug) << "SSG: extruded_line.form_quality: " << extruded_line.form_quality; BOOST_LOG_TRIVIAL(debug) << "SSG: extruder_conflict_force: " << extruder_conflict_force; BOOST_LOG_TRIVIAL(debug) << "SSG: bed_extruder_conflict_torque: " << bed_extruder_conflict_torque; BOOST_LOG_TRIVIAL(debug) << "SSG: total_torque: " << bed_total_torque << " layer_z: " << layer_z; @@ -541,7 +543,7 @@ public: float conn_total_torque = conn_movement_torque + conn_extruder_conflict_torque + conn_weight_torque - conn_yield_torque; #ifdef DETAILED_DEBUG_LOGS - BOOST_LOG_TRIVIAL(debug) << "bed_centroid: " << conn_centroid.x() << " " << conn_centroid.y() << " " << conn_centroid.z(); + BOOST_LOG_TRIVIAL(debug) << "conn_centroid: " << conn_centroid.x() << " " << conn_centroid.y() << " " << conn_centroid.z(); BOOST_LOG_TRIVIAL(debug) << "SSG: conn_yield_torque: " << conn_yield_torque; BOOST_LOG_TRIVIAL(debug) << "SSG: conn_weight_arm: " << conn_weight_arm; BOOST_LOG_TRIVIAL(debug) << "SSG: conn_weight_torque: " << conn_weight_torque; @@ -575,7 +577,7 @@ std::tuple build_object_part_from_slice(const LayerSlice &sli new_object_part.volume += volume; new_object_part.volume_centroid_accumulator += to_3d(Vec2f((line.a + line.b) / 2.0f), slice_z) * volume; - if (l->id() == 0) { // first layer + if (l->bottom_z() < EPSILON) { // layer attached on bed float sticking_area = line.len * flow_width; new_object_part.sticking_area += sticking_area; Vec2f middle = Vec2f((line.a + line.b) / 2.0f); @@ -822,7 +824,7 @@ SupportPoints check_stability(const PrintObject *po, const Params ¶ms) float unchecked_dist = params.min_distance_between_support_points + 1.0f; for (const ExtrusionLine &line : current_slice_ext_perims_lines) { - if ((unchecked_dist + line.len < params.min_distance_between_support_points && line.curled_up_height < 0.3f) || line.len == 0) { + if ((unchecked_dist + line.len < params.min_distance_between_support_points && line.curled_up_height < 0.3f) || line.len < EPSILON) { unchecked_dist += line.len; } else { unchecked_dist = line.len; @@ -885,6 +887,7 @@ void estimate_supports_malformations(SupportLayerPtrs &layers, float flow_width, { #ifdef DEBUG_FILES FILE *debug_file = boost::nowide::fopen(debug_out_path("supports_malformations.obj").c_str(), "w"); + FILE *full_file = boost::nowide::fopen(debug_out_path("supports_full.obj").c_str(), "w"); #endif AABBTreeLines::LinesDistancer prev_layer_lines{}; @@ -905,7 +908,7 @@ void estimate_supports_malformations(SupportLayerPtrs &layers, float flow_width, ExtrusionLine line_out{i > 0 ? annotated_points[i - 1].position.cast() : curr_point.position.cast(), curr_point.position.cast(), line_len, extrusion}; - const ExtrusionLine nearest_prev_layer_line = prev_layer_lines.get_lines().size() > curr_point.nearest_prev_layer_line ? + const ExtrusionLine nearest_prev_layer_line = prev_layer_lines.get_lines().size() > 0 ? prev_layer_lines.get_line(curr_point.nearest_prev_layer_line) : ExtrusionLine{}; @@ -932,10 +935,14 @@ void estimate_supports_malformations(SupportLayerPtrs &layers, float flow_width, #ifdef DEBUG_FILES for (const ExtrusionLine &line : current_layer_lines) { if (line.curled_up_height > 0.3f) { - Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_malformation_factor, line.curled_up_height); + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); } } + for (const ExtrusionLine &line : current_layer_lines) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } #endif prev_layer_lines = LD{current_layer_lines}; @@ -943,6 +950,7 @@ void estimate_supports_malformations(SupportLayerPtrs &layers, float flow_width, #ifdef DEBUG_FILES fclose(debug_file); + fclose(full_file); #endif } @@ -950,6 +958,7 @@ void estimate_malformations(LayerPtrs &layers, const Params ¶ms) { #ifdef DEBUG_FILES FILE *debug_file = boost::nowide::fopen(debug_out_path("object_malformations.obj").c_str(), "w"); + FILE *full_file = boost::nowide::fopen(debug_out_path("object_full.obj").c_str(), "w"); #endif LD prev_layer_lines{}; @@ -996,10 +1005,14 @@ void estimate_malformations(LayerPtrs &layers, const Params ¶ms) #ifdef DEBUG_FILES for (const ExtrusionLine &line : current_layer_lines) { if (line.curled_up_height > 0.3f) { - Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_malformation_factor, line.curled_up_height); + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); } } + for (const ExtrusionLine &line : current_layer_lines) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } #endif prev_layer_lines = LD{current_layer_lines}; @@ -1007,6 +1020,7 @@ void estimate_malformations(LayerPtrs &layers, const Params ¶ms) #ifdef DEBUG_FILES fclose(debug_file); + fclose(full_file); #endif } diff --git a/src/libslic3r/SupportSpotsGenerator.hpp b/src/libslic3r/SupportSpotsGenerator.hpp index 3515ec57fc..e1b0c8cd04 100644 --- a/src/libslic3r/SupportSpotsGenerator.hpp +++ b/src/libslic3r/SupportSpotsGenerator.hpp @@ -29,7 +29,7 @@ struct Params { const float bridge_distance = 12.0f; //mm const float bridge_distance_decrease_by_curvature_factor = 10.0f; // allowed bridge distance = bridge_distance / (1 + this factor * curvature ) const std::pair malformation_distance_factors = std::pair { 0.4, 1.2 }; - const float max_malformation_factor = 10.0f; + const float max_curled_height_factor = 10.0f; const float min_distance_between_support_points = 3.0f; //mm const float support_points_interface_radius = 1.5f; // mm @@ -42,7 +42,7 @@ struct Params { const double filament_density = 1.25e-3f; // g/mm^3 ; Common filaments are very lightweight, so precise number is not that important const double material_yield_strength = 33.0f * 1e6f; // (g*mm/s^2)/mm^2; 33 MPa is yield strength of ABS, which has the lowest yield strength from common materials. const float standard_extruder_conflict_force = 20.0f * gravity_constant; // force that can occasionally push the model due to various factors (filament leaks, small curling, ... ); - const float malformations_additive_conflict_extruder_force = 300.0f * gravity_constant; // for areas with possible high layered curled filaments + const float malformations_additive_conflict_extruder_force = 100.0f * gravity_constant; // for areas with possible high layered curled filaments // MPa * 1e^6 = (g*mm/s^2)/mm^2 = g/(mm*s^2); yield strength of the bed surface double get_bed_adhesion_yield_strength() const {