Fix organic support being printed into object top surfaces (#15539)

This commit is contained in:
Kiss Lorand
2026-09-05 17:48:35 +03:00
committed by GitHub
parent 134b9ad96e
commit 0224741105

View File

@@ -1654,28 +1654,32 @@ void generate_support_toolpaths(
if (top_contact_layer.could_merge(interface_layer) && ! raft_layer) if (top_contact_layer.could_merge(interface_layer) && ! raft_layer)
top_contact_layer.merge(std::move(interface_layer)); top_contact_layer.merge(std::move(interface_layer));
} }
if (!bottom_interfaces && support_params.can_merge_support_regions) { // Orca: Organic bottom contacts are projection seeds, not same-layer toolpaths.
if (base_layer.could_merge(bottom_contact_layer)) // Do not merge them into another same-layer support region.
base_layer.merge(std::move(bottom_contact_layer)); if (!organic_tree) {
else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) if (!bottom_interfaces && support_params.can_merge_support_regions) {
base_layer = std::move(bottom_contact_layer); if (base_layer.could_merge(bottom_contact_layer))
} else if (bottom_contact_layer.could_merge(top_contact_layer) && ! raft_layer) { base_layer.merge(std::move(bottom_contact_layer));
if (top_interfaces && bottom_interfaces) { else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging)
top_contact_layer.merge(std::move(bottom_contact_layer)); base_layer = std::move(bottom_contact_layer);
} else if (bottom_interfaces) { } else if (bottom_contact_layer.could_merge(top_contact_layer) && ! raft_layer) {
top_contact_layer.set_polygons_to_extrude( if (top_interfaces && bottom_interfaces) {
diff(top_contact_layer.polygons_to_extrude(), bottom_contact_layer.polygons_to_extrude())); top_contact_layer.merge(std::move(bottom_contact_layer));
} else { } else if (bottom_interfaces) {
bottom_contact_layer.set_polygons_to_extrude( top_contact_layer.set_polygons_to_extrude(
diff(bottom_contact_layer.polygons_to_extrude(), top_contact_layer.polygons_to_extrude())); diff(top_contact_layer.polygons_to_extrude(), bottom_contact_layer.polygons_to_extrude()));
} } else {
} else if (bottom_contact_layer.could_merge(interface_layer) && ! organic_tree) { bottom_contact_layer.set_polygons_to_extrude(
const bool interface_layer_is_bottom = interface_layer.layer->layer_type == SupporLayerType::BottomInterface; diff(bottom_contact_layer.polygons_to_extrude(), top_contact_layer.polygons_to_extrude()));
if (bottom_interfaces && interface_layer_is_bottom) { }
bottom_contact_layer.merge(std::move(interface_layer)); } else if (bottom_contact_layer.could_merge(interface_layer)) {
} else { const bool interface_layer_is_bottom = interface_layer.layer->layer_type == SupporLayerType::BottomInterface;
bottom_contact_layer.set_polygons_to_extrude( if (bottom_interfaces && interface_layer_is_bottom) {
diff(bottom_contact_layer.polygons_to_extrude(), interface_layer.polygons_to_extrude())); bottom_contact_layer.merge(std::move(interface_layer));
} else {
bottom_contact_layer.set_polygons_to_extrude(
diff(bottom_contact_layer.polygons_to_extrude(), interface_layer.polygons_to_extrude()));
}
} }
} }