Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/CuraEngine.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelle Spijker <j.spijker@ultimaker.com>2022-04-20 18:01:41 +0300
committerGitHub <noreply@github.com>2022-04-20 18:01:41 +0300
commit2906bc3bfe0ae98cb0e5a9bf10d6fe08110394e5 (patch)
treee577d0cbd745520309ce38a1c34b7a6467b45268
parent715f13cb69aab736aaffc4cbaff19a652c64131d (diff)
parent5b35ee7ca5797a542541d2c67e492c1dad861c15 (diff)
Merge pull request #1644 from Ultimaker/CURA-9096_Tree_Support_branches_not_being_generated_
[Cura] 9096 - Tree Support branches not being generated
-rw-r--r--src/TreeSupport.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/TreeSupport.cpp b/src/TreeSupport.cpp
index 278cd3e16..fd6b1f47f 100644
--- a/src/TreeSupport.cpp
+++ b/src/TreeSupport.cpp
@@ -318,12 +318,12 @@ void TreeSupport::dropNodes(std::vector<std::vector<Node*>>& contact_nodes)
return branch_radius * (node.distance_to_top + 1) / tip_layers;
}
}();
- if (group_index == 0)
- {
- //Avoid collisions.
- const coord_t maximum_move_between_samples = maximum_move_distance + radius_sample_resolution + 100; //100 micron extra for rounding errors.
- PolygonUtils::moveOutside(volumes_.getAvoidance(branch_radius_node, layer_nr - 1), next_position, radius_sample_resolution + 100, maximum_move_between_samples * maximum_move_between_samples); //Some extra offset to prevent rounding errors with the sample resolution.
- }
+
+ //Avoid collisions.
+ constexpr size_t rounding_compensation = 100;
+ const coord_t maximum_move_between_samples = maximum_move_distance + radius_sample_resolution + rounding_compensation;
+ const Polygons avoidance = group_index == 0 ? volumes_.getAvoidance(branch_radius_node, layer_nr - 1) : volumes_.getCollision(branch_radius_node, layer_nr - 1);
+ PolygonUtils::moveOutside(avoidance, next_position, radius_sample_resolution + rounding_compensation, maximum_move_between_samples * maximum_move_between_samples);
Node* neighbour = nodes_per_part[group_index][neighbours[0]];
size_t new_distance_to_top = std::max(node.distance_to_top, neighbour->distance_to_top) + 1;
@@ -365,7 +365,9 @@ void TreeSupport::dropNodes(std::vector<std::vector<Node*>>& contact_nodes)
continue;
}
//If the branch falls completely inside a collision area (the entire branch would be removed by the X/Y offset), delete it.
- if (group_index > 0 && volumes_.getCollision(0, layer_nr).inside(node.position))
+
+ const Polygons collision = volumes_.getCollision(0, layer_nr);
+ if (group_index > 0 && collision.inside(node.position))
{
const coord_t branch_radius_node = [&]() -> coord_t
{
@@ -378,8 +380,15 @@ void TreeSupport::dropNodes(std::vector<std::vector<Node*>>& contact_nodes)
return branch_radius * node.distance_to_top / tip_layers;
}
}();
- const ClosestPolygonPoint to_outside = PolygonUtils::findClosest(node.position, volumes_.getCollision(0, layer_nr));
- if (vSize2(node.position - to_outside.location) >= branch_radius_node * branch_radius_node) //Too far inside.
+
+ const ClosestPolygonPoint to_outside = PolygonUtils::findClosest(node.position, collision);
+ const bool node_is_tip = node.distance_to_top <= tip_layers;
+ coord_t max_inside_dist = branch_radius_node;
+ if (node_is_tip) {
+ // if the node is part of the tip allow the branch to travel through the support xy distance
+ max_inside_dist += (tip_layers - node.distance_to_top) * maximum_move_distance;
+ }
+ if (vSize2(node.position - to_outside.location) >= max_inside_dist * max_inside_dist) // Too far inside.
{
if (! support_rests_on_model)
{
@@ -419,12 +428,12 @@ void TreeSupport::dropNodes(std::vector<std::vector<Node*>>& contact_nodes)
return branch_radius * (node.distance_to_top + 1) / tip_layers;
}
}();
- if (group_index == 0)
- {
- //Avoid collisions.
- const coord_t maximum_move_between_samples = maximum_move_distance + radius_sample_resolution + 100; //100 micron extra for rounding errors.
- PolygonUtils::moveOutside(volumes_.getAvoidance(branch_radius_node, layer_nr - 1), next_layer_vertex, radius_sample_resolution + 100, maximum_move_between_samples * maximum_move_between_samples); //Some extra offset to prevent rounding errors with the sample resolution.
- }
+
+ //Avoid collisions.
+ constexpr size_t rounding_compensation = 100;
+ const coord_t maximum_move_between_samples = maximum_move_distance + radius_sample_resolution + rounding_compensation;
+ const Polygons avoidance = group_index == 0 ? volumes_.getAvoidance(branch_radius_node, layer_nr - 1) : volumes_.getCollision(branch_radius_node, layer_nr - 1);
+ PolygonUtils::moveOutside(avoidance, next_layer_vertex, radius_sample_resolution + rounding_compensation, maximum_move_between_samples * maximum_move_between_samples);
const bool to_buildplate = !volumes_.getAvoidance(branch_radius_node, layer_nr - 1).inside(next_layer_vertex);
Node* next_node = new Node(next_layer_vertex, node.distance_to_top + 1, node.skin_direction, node.support_roof_layers_below - 1, to_buildplate, p_node);