From a6cf309020acc571b50468f3c58d50979a624e1f Mon Sep 17 00:00:00 2001 From: PavelMikus Date: Wed, 27 Jul 2022 14:29:30 +0200 Subject: [PATCH] updated weakest connection strength estimation, fixed various issues --- src/libslic3r/PrintObject.cpp | 4 +- src/libslic3r/SupportSpotsGenerator.cpp | 44 ++++++++++---------- src/libslic3r/SupportSpotsGenerator.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 2 - 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 0f85891ee2..b085c7a07a 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -422,7 +422,7 @@ void PrintObject::generate_support_spots() SupportSpotsGenerator::Issues issues = SupportSpotsGenerator::full_search(this); auto obj_transform = this->trafo_centered(); for (ModelVolume *model_volume : this->model_object()->volumes) { - if (model_volume->type() == ModelVolumeType::MODEL_PART) { + if (model_volume->is_model_part()) { Transform3d model_transformation = model_volume->get_matrix(); Transform3f inv_transform = (obj_transform * model_transformation).inverse().cast(); TriangleSelectorWrapper selector { model_volume->mesh() }; @@ -439,7 +439,7 @@ void PrintObject::generate_support_spots() indexed_triangle_set copy = model_volume->mesh().its; its_transform(copy, obj_transform * model_transformation); its_write_obj(copy, - debug_out_path("model.obj").c_str()); + debug_out_path(("model"+std::to_string(model_volume->id().id)+".obj").c_str()).c_str()); #endif } } diff --git a/src/libslic3r/SupportSpotsGenerator.cpp b/src/libslic3r/SupportSpotsGenerator.cpp index def0217e52..2669ac5434 100644 --- a/src/libslic3r/SupportSpotsGenerator.cpp +++ b/src/libslic3r/SupportSpotsGenerator.cpp @@ -313,7 +313,7 @@ float get_flow_width(const LayerRegion *region, ExtrusionRole role) { } } -// Accumulator of current extruion path properties +// Accumulator of current extrusion path properties // It remembers unsuported distance and maximum accumulated curvature over that distance. // Used to determine local stability issues (too long bridges, extrusion curves into air) struct ExtrusionPropertiesAccumulator { @@ -417,7 +417,7 @@ void check_extrusion_entity_stability(const ExtrusionEntity *entity, } if (dist_from_prev_layer > flow_width * 0.3) { malformation_acc.add_distance(current_line.len); - current_line.malformation += 0.15f + current_line.malformation += 0.3f * layer_region->layer()->height * (0.8f + 0.2f * malformation_acc.max_curvature / (1.0f + 0.5f * malformation_acc.distance)); } else { malformation_acc.reset(); @@ -704,10 +704,6 @@ public: float movement_force = params.max_acceleration * mass; - Vec3f extruder_pressure_direction = to_3d(line_dir, 0.0f); - extruder_pressure_direction.z() = -extruded_line.malformation * 0.5f; - extruder_pressure_direction.normalize(); - Vec3d endpoint = (to_3d(extruded_line.b, layer_z)).cast(); float extruder_conflict_force = params.standard_extruder_conflict_force + std::min(extruded_line.malformation, 1.0f) * params.malformations_additive_conflict_extruder_force; @@ -731,9 +727,7 @@ public: float bed_movement_arm = std::max(0.0f, mass_centroid.z() - bed_centroid.z()); float bed_movement_torque = movement_force * bed_movement_arm; - float bed_conflict_torque_arm = line_alg::distance_to( - Linef3(endpoint, endpoint + extruder_pressure_direction.cast()), - bed_centroid.cast()); + float bed_conflict_torque_arm = layer_z - bed_centroid.z(); float bed_extruder_conflict_torque = extruder_conflict_force * bed_conflict_torque_arm; float bed_total_torque = bed_movement_torque + bed_extruder_conflict_torque + bed_weight_torque @@ -783,9 +777,7 @@ public: float conn_movement_arm = std::max(0.0f, mass_centroid.z() - conn_centroid.z()); float conn_movement_torque = movement_force * conn_movement_arm; - float conn_conflict_torque_arm = line_alg::distance_to( - Linef3(endpoint, endpoint + extruder_pressure_direction.cast()), - conn_centroid.cast()); + float conn_conflict_torque_arm = layer_z - conn_centroid.z(); float conn_extruder_conflict_torque = extruder_conflict_force * conn_conflict_torque_arm; float conn_total_torque = conn_movement_torque + conn_extruder_conflict_torque + conn_weight_torque @@ -817,6 +809,7 @@ public: } }; +#ifdef DETAILED_DEBUG_LOGS void debug_print_graph(const std::vector &islands_graph) { std::cout << "BUILT ISLANDS GRAPH:" << std::endl; for (size_t layer_idx = 0; layer_idx < islands_graph.size(); ++layer_idx) { @@ -832,8 +825,8 @@ void debug_print_graph(const std::vector &islands_graph) { } } std::cout << "END OF GRAPH" << std::endl; - } +#endif class ActiveObjectParts { size_t next_part_idx = 0; @@ -876,7 +869,10 @@ public: Issues check_global_stability(SupportGridFilter supports_presence_grid, const std::vector &islands_graph, const Params ¶ms) { +#ifdef DETAILED_DEBUG_LOGS debug_print_graph(islands_graph); +#endif + Issues issues { }; ActiveObjectParts active_object_parts { }; std::unordered_map prev_island_to_object_part_mapping; @@ -887,11 +883,13 @@ Issues check_global_stability(SupportGridFilter supports_presence_grid, for (size_t layer_idx = 0; layer_idx < islands_graph.size(); ++layer_idx) { float layer_z = islands_graph[layer_idx].layer_z; - std::cout << "at layer: " << layer_idx << " the following island to object mapping is used:" << std::endl; + +#ifdef DETAILED_DEBUG_LOGS for (const auto &m : prev_island_to_object_part_mapping) { std::cout << "island " << m.first << " maps to part " << m.second << std::endl; prev_island_weakest_connection[m.first].print_info("connection info:"); } +#endif for (size_t island_idx = 0; island_idx < islands_graph[layer_idx].islands.size(); ++island_idx) { const Island &island = islands_graph[layer_idx].islands[island_idx]; @@ -917,24 +915,25 @@ Issues check_global_stability(SupportGridFilter supports_presence_grid, final_part_id = *parts_ids.begin(); for (size_t part_id : parts_ids) { if (final_part_id != part_id) { - std::cout << "at layer: " << layer_idx << " merging object part: " << part_id - << " into final part: " << final_part_id << std::endl; active_object_parts.merge(part_id, final_part_id); } } } - auto estimate_strength = [layer_z](const IslandConnection &conn) { + auto estimate_conn_strength = [layer_z](const IslandConnection &conn) { Vec3f centroid = conn.centroid_accumulator / conn.area; - float min_variance = (conn.second_moment_of_area_accumulator / conn.area - - centroid.head<2>().cwiseProduct(centroid.head<2>())).minCoeff(); + Vec2f variance = (conn.second_moment_of_area_accumulator / conn.area + - centroid.head<2>().cwiseProduct(centroid.head<2>())); + float xy_variance = variance.x() + variance.y(); float arm_len_estimate = std::max(1.1f, layer_z - (conn.centroid_accumulator.z() / conn.area)); - return min_variance / arm_len_estimate; + return conn.area * sqrt(xy_variance) / arm_len_estimate; }; +#ifdef DETAILED_DEBUG_LOGS new_weakest_connection.print_info("new_weakest_connection"); transfered_weakest_connection.print_info("transfered_weakest_connection"); +#endif - if (estimate_strength(transfered_weakest_connection) < estimate_strength(new_weakest_connection)) { + if (estimate_conn_strength(transfered_weakest_connection) < estimate_conn_strength(new_weakest_connection)) { new_weakest_connection = transfered_weakest_connection; } next_island_weakest_connection.emplace(island_idx, new_weakest_connection); @@ -957,8 +956,9 @@ Issues check_global_stability(SupportGridFilter supports_presence_grid, const Island &island = islands_graph[layer_idx].islands[island_idx]; ObjectPart &part = active_object_parts.access(prev_island_to_object_part_mapping[island_idx]); IslandConnection &weakest_conn = prev_island_weakest_connection[island_idx]; +#ifdef DETAILED_DEBUG_LOGS weakest_conn.print_info("weakest connection info: "); - +#endif std::vector dummy { }; LinesDistancer island_lines_dist(dummy); float unchecked_dist = params.min_distance_between_support_points + 1.0f; diff --git a/src/libslic3r/SupportSpotsGenerator.hpp b/src/libslic3r/SupportSpotsGenerator.hpp index cc11c27c7e..6b94ceeaa2 100644 --- a/src/libslic3r/SupportSpotsGenerator.hpp +++ b/src/libslic3r/SupportSpotsGenerator.hpp @@ -21,7 +21,7 @@ struct Params { const float bed_adhesion_yield_strength = 0.128f * 1e6f; //MPa * 1e^6 = (g*mm/s^2)/mm^2 = g/(mm*s^2); yield strength of the bed surface const float 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 = 150.0f * gravity_constant; // for areas with possible high layered curled filaments }; struct SupportPoint { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 36f48d0087..7e8f0954e0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -405,7 +405,6 @@ void GLGizmoFdmSupports::get_data_from_backend() mvs.emplace(mv->id().id, mv); } } - // NOTE: Copying the data into ModelVolumes stops the background processing. int mesh_id = -1.0f; for (ModelVolume* mv : mo->volumes){ if (mv->is_model_part()){ @@ -418,7 +417,6 @@ void GLGizmoFdmSupports::get_data_from_backend() this->waiting_for_autogenerated_supports = false; m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); m_parent.set_as_dirty(); - } } }