void Infill::generateConcentric3DInfill(Polygons& result) { int period = line_distance * 2; int shift = int64_t(one_over_sqrt_2 * z) % period; shift = std::min(shift, period - shift); // symmetry due to the fact that we are applying the shift in both directions shift = std::min(shift, period / 2 - infill_line_width / 2); // don't put lines too close to each other shift = std::max(shift, infill_line_width / 2); // don't put lines too close to each other Polygons first_wall; // in contrast to concentric infill we dont do "- infill_line_width / 2" cause this is already handled by the max two lines above first_wall = in_outline.offset(outline_offset - shift); generateConcentricInfill(first_wall, result, period); first_wall = in_outline.offset(outline_offset - period + shift); generateConcentricInfill(first_wall, result, period); }
void Infill::generateConcentricInfill(Polygons& result, int inset_value) { Polygons first_concentric_wall = in_outline.offset(outline_offset - line_distance + infill_line_width / 2); // - infill_line_width / 2 cause generateConcentricInfill expects [outline] to be the outer most polygon instead of the outer outline if (perimeter_gaps) { const Polygons inner = first_concentric_wall.offset(infill_line_width / 2 + perimeter_gaps_extra_offset); const Polygons gaps_here = in_outline.difference(inner); perimeter_gaps->add(gaps_here); } generateConcentricInfill(first_concentric_wall, result, inset_value); }
void Infill::generate(Polygons& result_polygons, Polygons& result_lines, Polygons* in_between) { if (in_outline.size() == 0) return; if (line_distance == 0) return; const Polygons* outline = &in_outline; Polygons outline_offsetted; switch(pattern) { case EFillMethod::GRID: generateGridInfill(in_outline, outlineOffset, result_lines, extrusion_width, line_distance * 2, infill_overlap, fill_angle); break; case EFillMethod::LINES: generateLineInfill(in_outline, outlineOffset, result_lines, extrusion_width, line_distance, infill_overlap, fill_angle); break; case EFillMethod::TRIANGLES: generateTriangleInfill(in_outline, outlineOffset, result_lines, extrusion_width, line_distance * 3, infill_overlap, fill_angle); break; case EFillMethod::CONCENTRIC: if (outlineOffset != 0) { PolygonUtils::offsetSafe(in_outline, outlineOffset, extrusion_width, outline_offsetted, avoidOverlappingPerimeters); outline = &outline_offsetted; } if (abs(extrusion_width - line_distance) < 10) { generateConcentricInfillDense(*outline, result_polygons, in_between, extrusion_width, avoidOverlappingPerimeters); } else { generateConcentricInfill(*outline, result_polygons, line_distance); } break; case EFillMethod::ZIG_ZAG: if (outlineOffset != 0) { PolygonUtils::offsetSafe(in_outline, outlineOffset, extrusion_width, outline_offsetted, avoidOverlappingPerimeters); outline = &outline_offsetted; } generateZigZagInfill(*outline, result_lines, extrusion_width, line_distance, infill_overlap, fill_angle, connect_zigzags, use_endPieces); break; default: logError("Fill pattern has unknown value.\n"); break; } }
void Infill::generate(Polygons& result_polygons, Polygons& result_lines, SliceMeshStorage* mesh) { if (in_outline.size() == 0) return; if (line_distance == 0) return; Polygons outline_offsetted; switch(pattern) { case EFillMethod::GRID: generateGridInfill(result_lines); break; case EFillMethod::LINES: generateLineInfill(result_lines, line_distance, fill_angle, 0); break; case EFillMethod::CUBIC: generateCubicInfill(result_lines); break; case EFillMethod::TETRAHEDRAL: generateTetrahedralInfill(result_lines); break; case EFillMethod::TRIANGLES: generateTriangleInfill(result_lines); break; case EFillMethod::CONCENTRIC: generateConcentricInfill(result_polygons, line_distance); break; case EFillMethod::CONCENTRIC_3D: generateConcentric3DInfill(result_polygons); break; case EFillMethod::ZIG_ZAG: generateZigZagInfill(result_lines, line_distance, fill_angle, connected_zigzags, use_endpieces); break; case EFillMethod::CUBICSUBDIV: if (!mesh) { logError("Cannot generate Cubic Subdivision infill without a mesh!\n"); break; } generateCubicSubDivInfill(result_lines, *mesh); break; default: logError("Fill pattern has unknown value.\n"); break; } }