From fa8c319721f5b796f9ef2284655107fff377b2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Mon, 3 May 2021 21:06:46 +0200 Subject: [PATCH] Fixed MMU segmentation for cases when a contour was whole colored by one color and a hole was whole colored by a different color. --- src/libslic3r/MultiMaterialSegmentation.cpp | 30 ++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/MultiMaterialSegmentation.cpp b/src/libslic3r/MultiMaterialSegmentation.cpp index cccb67f37..64f25dad1 100644 --- a/src/libslic3r/MultiMaterialSegmentation.cpp +++ b/src/libslic3r/MultiMaterialSegmentation.cpp @@ -694,6 +694,24 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vector force_edge_adding(color_poly.size()); + + // For each polygon, check if it is all colored with the same color. If it is, we need to force adding one edge to it. + for (const std::vector &c_poly : color_poly) { + bool force_edge = true; + for (const ColoredLine &c_line : c_poly) + if (c_line.color != c_poly.front().color) { + force_edge = false; + break; + } + force_edge_adding[&c_poly - &color_poly.front()] = force_edge; + } + boost::polygon::construct_voronoi(lines_colored.begin(), lines_colored.end(), &vd); MMU_Graph graph; for (const Point &point : points) @@ -861,23 +879,27 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vectorvertex0())) { if (is_point_closer_to_beginning_of_line(contour_line, v0)) { - if (!has_same_color(contour_line_prev, colored_line) && points_inside(contour_line_prev.line, contour_line, v1)) { + if ((!has_same_color(contour_line_prev, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, v1)) { graph.append_edge(from_idx, to_idx); + force_edge_adding[colored_line.poly_idx] = false; } } else { - if (!has_same_color(contour_line_next, colored_line) && points_inside(contour_line, contour_line_next.line, v1)) { + if ((!has_same_color(contour_line_next, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, v1)) { graph.append_edge(from_idx, to_idx); + force_edge_adding[colored_line.poly_idx] = false; } } } else { assert(graph.is_vertex_on_contour(edge_it->vertex1())); if (is_point_closer_to_beginning_of_line(contour_line, v1)) { - if (!has_same_color(contour_line_prev, colored_line) && points_inside(contour_line_prev.line, contour_line, v0)) { + if ((!has_same_color(contour_line_prev, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, v0)) { graph.append_edge(from_idx, to_idx); + force_edge_adding[colored_line.poly_idx] = false; } } else { - if (!has_same_color(contour_line_next, colored_line) && points_inside(contour_line, contour_line_next.line, v0)) { + if ((!has_same_color(contour_line_next, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, v0)) { graph.append_edge(from_idx, to_idx); + force_edge_adding[colored_line.poly_idx] = false; } } }