mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-14 10:17:55 -06:00
FIX: abnormal color line in multi-color slicing
Signed-off-by: yifan.wu <yifan.wu@bambulab.com> Change-Id: Ie9c7242f2c320a1ece24df4690b74b599e32f7c6
This commit is contained in:
parent
dc9ff8b826
commit
3f5e88b9a1
1 changed files with 28 additions and 54 deletions
|
@ -982,44 +982,6 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vector<std::vector<Col
|
||||||
const ColoredLine colored_line = lines_colored[edge_it->cell()->source_index()];
|
const ColoredLine colored_line = lines_colored[edge_it->cell()->source_index()];
|
||||||
const ColoredLine contour_line_prev = get_prev_contour_line(edge_it);
|
const ColoredLine contour_line_prev = get_prev_contour_line(edge_it);
|
||||||
const ColoredLine contour_line_next = get_next_contour_line(edge_it);
|
const ColoredLine contour_line_next = get_next_contour_line(edge_it);
|
||||||
bool has_color_change = false;
|
|
||||||
{
|
|
||||||
const double tolerance = 15 * SCALED_EPSILON;
|
|
||||||
double acc_len = 0.0;
|
|
||||||
size_t contour_line_local_idx = lines_colored[edge_it->cell()->source_index()].local_line_idx;
|
|
||||||
size_t poly_idx = lines_colored[edge_it->cell()->source_index()].poly_idx;
|
|
||||||
size_t contour_line_size = color_poly[poly_idx].size();
|
|
||||||
size_t contour_prev_local_idx = (contour_line_local_idx > 0) ? contour_line_local_idx - 1 : contour_line_size - 1;
|
|
||||||
while (!has_color_change) {
|
|
||||||
ColoredLine& prev_line = lines_colored[graph.get_global_index(poly_idx, contour_prev_local_idx)];
|
|
||||||
if (!has_same_color(prev_line, colored_line)) {
|
|
||||||
has_color_change = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
acc_len += prev_line.line.length();
|
|
||||||
if (acc_len >= tolerance)
|
|
||||||
break;
|
|
||||||
|
|
||||||
contour_prev_local_idx = (contour_prev_local_idx > 0) ? contour_prev_local_idx - 1 : contour_line_size - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
acc_len = 0.0;
|
|
||||||
size_t contour_next_local_idx = (contour_line_local_idx + 1) % contour_line_size;
|
|
||||||
while (!has_color_change) {
|
|
||||||
ColoredLine& next_line = lines_colored[graph.get_global_index(poly_idx, contour_next_local_idx)];
|
|
||||||
if (!has_same_color(colored_line, next_line)) {
|
|
||||||
has_color_change = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
acc_len += next_line.line.length();
|
|
||||||
if (acc_len >= tolerance)
|
|
||||||
break;
|
|
||||||
|
|
||||||
contour_next_local_idx = (contour_next_local_idx + 1) % contour_line_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edge_it->vertex0()->color() >= graph.nodes_count() || edge_it->vertex1()->color() >= graph.nodes_count()) {
|
if (edge_it->vertex0()->color() >= graph.nodes_count() || edge_it->vertex1()->color() >= graph.nodes_count()) {
|
||||||
enum class Vertex { VERTEX0, VERTEX1 };
|
enum class Vertex { VERTEX0, VERTEX1 };
|
||||||
|
@ -1054,12 +1016,12 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vector<std::vector<Col
|
||||||
const size_t to_idx = edge_it->vertex1()->color();
|
const size_t to_idx = edge_it->vertex1()->color();
|
||||||
if (graph.is_vertex_on_contour(edge_it->vertex0())) {
|
if (graph.is_vertex_on_contour(edge_it->vertex0())) {
|
||||||
if (is_point_closer_to_beginning_of_line(contour_line, edge_line.a)) {
|
if (is_point_closer_to_beginning_of_line(contour_line, edge_line.a)) {
|
||||||
if ((has_color_change || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, edge_line.b)) {
|
if ((!has_same_color(contour_line_prev, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, edge_line.b)) {
|
||||||
graph.append_edge(from_idx, to_idx);
|
graph.append_edge(from_idx, to_idx);
|
||||||
force_edge_adding[colored_line.poly_idx] = false;
|
force_edge_adding[colored_line.poly_idx] = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((has_color_change || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, edge_line.b)) {
|
if ((!has_same_color(contour_line_next, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, edge_line.b)) {
|
||||||
graph.append_edge(from_idx, to_idx);
|
graph.append_edge(from_idx, to_idx);
|
||||||
force_edge_adding[colored_line.poly_idx] = false;
|
force_edge_adding[colored_line.poly_idx] = false;
|
||||||
}
|
}
|
||||||
|
@ -1067,12 +1029,12 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vector<std::vector<Col
|
||||||
} else {
|
} else {
|
||||||
assert(graph.is_vertex_on_contour(edge_it->vertex1()));
|
assert(graph.is_vertex_on_contour(edge_it->vertex1()));
|
||||||
if (is_point_closer_to_beginning_of_line(contour_line, edge_line.b)) {
|
if (is_point_closer_to_beginning_of_line(contour_line, edge_line.b)) {
|
||||||
if ((has_color_change || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, edge_line.a)) {
|
if ((!has_same_color(contour_line_prev, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line_prev.line, contour_line, edge_line.a)) {
|
||||||
graph.append_edge(from_idx, to_idx);
|
graph.append_edge(from_idx, to_idx);
|
||||||
force_edge_adding[colored_line.poly_idx] = false;
|
force_edge_adding[colored_line.poly_idx] = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((has_color_change || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, edge_line.a)) {
|
if ((!has_same_color(contour_line_next, colored_line) || force_edge_adding[colored_line.poly_idx]) && points_inside(contour_line, contour_line_next.line, edge_line.a)) {
|
||||||
graph.append_edge(from_idx, to_idx);
|
graph.append_edge(from_idx, to_idx);
|
||||||
force_edge_adding[colored_line.poly_idx] = false;
|
force_edge_adding[colored_line.poly_idx] = false;
|
||||||
}
|
}
|
||||||
|
@ -1086,22 +1048,30 @@ static MMU_Graph build_graph(size_t layer_idx, const std::vector<std::vector<Col
|
||||||
Point real_v1 = Point(coord_t(real_v1_double.x()), coord_t(real_v1_double.y()));
|
Point real_v1 = Point(coord_t(real_v1_double.x()), coord_t(real_v1_double.y()));
|
||||||
|
|
||||||
if (is_point_closer_to_beginning_of_line(contour_line, intersection)) {
|
if (is_point_closer_to_beginning_of_line(contour_line, intersection)) {
|
||||||
if (has_color_change)
|
Line first_part(intersection, real_v0);
|
||||||
{
|
Line second_part(intersection, real_v1);
|
||||||
if (points_inside(contour_line_prev.line, contour_line, real_v0))
|
|
||||||
|
if (!has_same_color(contour_line_prev, colored_line)) {
|
||||||
|
if (points_inside(contour_line_prev.line, contour_line, first_part.b))
|
||||||
graph.append_edge(edge_it->vertex0()->color(), graph.get_border_arc(edge_it->cell()->source_index()).from_idx);
|
graph.append_edge(edge_it->vertex0()->color(), graph.get_border_arc(edge_it->cell()->source_index()).from_idx);
|
||||||
|
|
||||||
if (points_inside(contour_line_prev.line, contour_line, real_v1))
|
if (points_inside(contour_line_prev.line, contour_line, second_part.b))
|
||||||
graph.append_edge(edge_it->vertex1()->color(), graph.get_border_arc(edge_it->cell()->source_index()).from_idx);
|
graph.append_edge(edge_it->vertex1()->color(), graph.get_border_arc(edge_it->cell()->source_index()).from_idx);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (has_color_change)
|
const size_t int_point_idx = graph.get_border_arc(edge_it->cell()->source_index()).to_idx;
|
||||||
{
|
const Vec2d int_point_double = graph.nodes[int_point_idx].point;
|
||||||
if (points_inside(contour_line, contour_line_next.line, real_v0))
|
const Point int_point = Point(coord_t(int_point_double.x()), coord_t(int_point_double.y()));
|
||||||
graph.append_edge(edge_it->vertex0()->color(), graph.get_border_arc(edge_it->cell()->source_index()).to_idx);
|
|
||||||
|
|
||||||
if (points_inside(contour_line, contour_line_next.line, real_v1))
|
const Line first_part(int_point, real_v0);
|
||||||
graph.append_edge(edge_it->vertex1()->color(), graph.get_border_arc(edge_it->cell()->source_index()).to_idx);
|
const Line second_part(int_point, real_v1);
|
||||||
|
|
||||||
|
if (!has_same_color(contour_line_next, colored_line)) {
|
||||||
|
if (points_inside(contour_line, contour_line_next.line, first_part.b))
|
||||||
|
graph.append_edge(edge_it->vertex0()->color(), int_point_idx);
|
||||||
|
|
||||||
|
if (points_inside(contour_line, contour_line_next.line, second_part.b))
|
||||||
|
graph.append_edge(edge_it->vertex1()->color(), int_point_idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1147,13 +1117,17 @@ static std::vector<ExPolygons> extract_colored_segments(const MMU_Graph &graph,
|
||||||
{
|
{
|
||||||
std::vector<bool> used_arcs(graph.arcs.size(), false);
|
std::vector<bool> used_arcs(graph.arcs.size(), false);
|
||||||
// When there is no next arc, then is returned original_arc or edge with is marked as used
|
// When there is no next arc, then is returned original_arc or edge with is marked as used
|
||||||
auto get_next = [&graph, &used_arcs](const Linef &process_line, const MMU_Graph::Arc &original_arc) -> const MMU_Graph::Arc & {
|
auto get_next = [&graph, &used_arcs](const Linef &process_line, const MMU_Graph::Arc &original_arc, const int color) -> const MMU_Graph::Arc & {
|
||||||
std::vector<std::pair<const MMU_Graph::Arc *, double>> sorted_arcs;
|
std::vector<std::pair<const MMU_Graph::Arc *, double>> sorted_arcs;
|
||||||
for (const size_t &arc_idx : graph.nodes[original_arc.to_idx].arc_idxs) {
|
for (const size_t &arc_idx : graph.nodes[original_arc.to_idx].arc_idxs) {
|
||||||
const MMU_Graph::Arc &arc = graph.arcs[arc_idx];
|
const MMU_Graph::Arc &arc = graph.arcs[arc_idx];
|
||||||
if (graph.nodes[arc.to_idx].point == process_line.a || used_arcs[arc_idx])
|
if (graph.nodes[arc.to_idx].point == process_line.a || used_arcs[arc_idx])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// BBS
|
||||||
|
if (original_arc.type == MMU_Graph::ARC_TYPE::BORDER && original_arc.color != color)
|
||||||
|
continue;
|
||||||
|
|
||||||
assert(original_arc.to_idx == arc.from_idx);
|
assert(original_arc.to_idx == arc.from_idx);
|
||||||
Vec2d process_line_vec_n = (process_line.a - process_line.b).normalized();
|
Vec2d process_line_vec_n = (process_line.a - process_line.b).normalized();
|
||||||
Vec2d neighbour_line_vec_n = (graph.nodes[arc.to_idx].point - graph.nodes[arc.from_idx].point).normalized();
|
Vec2d neighbour_line_vec_n = (graph.nodes[arc.to_idx].point - graph.nodes[arc.from_idx].point).normalized();
|
||||||
|
@ -1202,7 +1176,7 @@ static std::vector<ExPolygons> extract_colored_segments(const MMU_Graph &graph,
|
||||||
Linef p_vec = process_line;
|
Linef p_vec = process_line;
|
||||||
const MMU_Graph::Arc *p_arc = &arc;
|
const MMU_Graph::Arc *p_arc = &arc;
|
||||||
do {
|
do {
|
||||||
const MMU_Graph::Arc &next = get_next(p_vec, *p_arc);
|
const MMU_Graph::Arc& next = get_next(p_vec, *p_arc, arc.color);
|
||||||
size_t next_arc_idx = &next - &graph.arcs.front();
|
size_t next_arc_idx = &next - &graph.arcs.front();
|
||||||
face_lines.emplace_back(graph.nodes[next.from_idx].point, graph.nodes[next.to_idx].point);
|
face_lines.emplace_back(graph.nodes[next.from_idx].point, graph.nodes[next.to_idx].point);
|
||||||
if (used_arcs[next_arc_idx])
|
if (used_arcs[next_arc_idx])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue