FillRectilinear.hpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. ///|/ Copyright (c) Prusa Research 2016 - 2023 Vojtěch Bubník @bubnikv, Lukáš Hejl @hejllukas, Lukáš Matěna @lukasmatena
  2. ///|/ Copyright (c) Slic3r 2016 Alessandro Ranellucci @alranel
  3. ///|/
  4. ///|/ ported from lib/Slic3r/Fill/Concentric.pm:
  5. ///|/ Copyright (c) Prusa Research 2016 Vojtěch Bubník @bubnikv
  6. ///|/ Copyright (c) Slic3r 2011 - 2015 Alessandro Ranellucci @alranel
  7. ///|/ Copyright (c) 2012 Mark Hindess
  8. ///|/
  9. ///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
  10. ///|/
  11. #ifndef slic3r_FillRectilinear_hpp_
  12. #define slic3r_FillRectilinear_hpp_
  13. #include "../libslic3r.h"
  14. #include "FillBase.hpp"
  15. namespace Slic3r {
  16. class PrintRegionConfig;
  17. class Surface;
  18. struct SegmentedIntersectionLine;
  19. struct ExPolygonWithOffset;
  20. class FillRectilinear : public Fill
  21. {
  22. public:
  23. Fill* clone() const override { return new FillRectilinear(*this); }
  24. ~FillRectilinear() override = default;
  25. virtual void init_spacing(coordf_t spacing, const FillParams& params) override;
  26. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  27. protected:
  28. virtual std::vector<SegmentedIntersectionLine> _vert_lines_for_polygon(const ExPolygonWithOffset& poly_with_offset, const BoundingBox& bounding_box, const FillParams& params, coord_t line_spacing) const;
  29. // Fill by single directional lines, interconnect the lines along perimeters.
  30. bool fill_surface_by_lines(const Surface* surface, const FillParams& params, float angleBase, float pattern_shift, Polylines& polylines_out) const;
  31. // Fill by multiple sweeps of differing directions.
  32. struct SweepParams {
  33. float angle_base;
  34. float pattern_shift;
  35. };
  36. void make_fill_lines(const ExPolygonWithOffset& poly_with_offset, Point refpt, double angle, coord_t x_margin, coord_t line_spacing, coord_t pattern_shift, Polylines& fill_lines, const FillParams& params) const;
  37. bool fill_surface_by_multilines(const Surface* surface, FillParams params, const std::initializer_list<SweepParams>& sweep_params, Polylines& polylines_out) const;
  38. };
  39. class FillAlignedRectilinear : public FillRectilinear
  40. {
  41. public:
  42. Fill* clone() const override { return new FillAlignedRectilinear(*this); }
  43. ~FillAlignedRectilinear() override = default;
  44. protected:
  45. // Always generate infill at the same angle.
  46. virtual float _layer_angle(size_t idx) const override { return 0.f; }
  47. };
  48. class FillMonotonic : public FillRectilinear
  49. {
  50. public:
  51. Fill* clone() const override { return new FillMonotonic(*this); }
  52. ~FillMonotonic() override = default;
  53. //apply monotonic
  54. void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) const override {
  55. FillParams monotonic_params = params;
  56. monotonic_params.monotonic = true;
  57. FillRectilinear::fill_surface_extrusion(surface, monotonic_params, out);
  58. }
  59. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  60. bool no_sort() const override { return true; }
  61. };
  62. class FillMonotonicLines : public FillRectilinear
  63. {
  64. public:
  65. Fill* clone() const override { return new FillMonotonicLines(*this); }
  66. ~FillMonotonicLines() override = default;
  67. Polylines fill_surface(const Surface *surface, const FillParams &params) const override;
  68. bool no_sort() const override { return true; }
  69. };
  70. class FillGrid : public FillRectilinear
  71. {
  72. public:
  73. Fill* clone() const override { return new FillGrid(*this); }
  74. ~FillGrid() override = default;
  75. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  76. protected:
  77. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
  78. float _layer_angle(size_t idx) const override { return 0.f; }
  79. };
  80. class FillTriangles : public FillRectilinear
  81. {
  82. public:
  83. Fill* clone() const override { return new FillTriangles(*this); }
  84. ~FillTriangles() override = default;
  85. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  86. protected:
  87. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
  88. float _layer_angle(size_t idx) const override { return 0.f; }
  89. };
  90. class FillStars : public FillRectilinear
  91. {
  92. public:
  93. Fill* clone() const override { return new FillStars(*this); }
  94. ~FillStars() override = default;
  95. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  96. protected:
  97. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
  98. float _layer_angle(size_t idx) const override { return 0.f; }
  99. };
  100. class FillCubic : public FillRectilinear
  101. {
  102. public:
  103. Fill* clone() const override { return new FillCubic(*this); }
  104. ~FillCubic() override = default;
  105. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  106. protected:
  107. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
  108. float _layer_angle(size_t idx) const override { return 0.f; }
  109. };
  110. class FillSupportBase : public FillRectilinear
  111. {
  112. public:
  113. Fill* clone() const override { return new FillSupportBase(*this); }
  114. ~FillSupportBase() override = default;
  115. Polylines fill_surface(const Surface *surface, const FillParams &params) const override;
  116. protected:
  117. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
  118. float _layer_angle(size_t idx) const override { return 0.f; }
  119. };
  120. class FillScatteredRectilinear : public FillRectilinear
  121. {
  122. public:
  123. Fill* clone() const override { return new FillScatteredRectilinear(*this); };
  124. ~FillScatteredRectilinear() override = default;
  125. Polylines fill_surface(const Surface* surface, const FillParams& params) const override;
  126. protected:
  127. float _layer_angle(size_t idx) const override;
  128. std::vector<SegmentedIntersectionLine> _vert_lines_for_polygon(const ExPolygonWithOffset& poly_with_offset, const BoundingBox& bounding_box, const FillParams& params, coord_t line_spacing) const override;
  129. coord_t _line_spacing_for_density(const FillParams& params) const override;
  130. };
  131. class FillRectilinearSawtooth : public FillRectilinear {
  132. public:
  133. Fill* clone() const override { return new FillRectilinearSawtooth(*this); };
  134. ~FillRectilinearSawtooth() override = default;
  135. void fill_surface_extrusion(const Surface* surface, const FillParams& params, ExtrusionEntitiesPtr& out) const override;
  136. };
  137. class FillRectilinearWGapFill : public FillRectilinear
  138. {
  139. public:
  140. Fill* clone() const override { return new FillRectilinearWGapFill(*this); };
  141. ~FillRectilinearWGapFill() override = default;
  142. void fill_surface_extrusion(const Surface* surface, const FillParams& params, ExtrusionEntitiesPtr& out) const override;
  143. static void split_polygon_gap_fill(const Surface& surface, const FillParams& params, ExPolygons& rectilinear, ExPolygons& gapfill);
  144. protected:
  145. virtual bool is_monotonic() const { return false; }
  146. };
  147. class FillMonotonicWGapFill : public FillRectilinearWGapFill
  148. {
  149. public:
  150. Fill* clone() const override { return new FillMonotonicWGapFill(*this); };
  151. ~FillMonotonicWGapFill() override = default;
  152. protected:
  153. virtual bool is_monotonic() const override { return true; }
  154. };
  155. Points sample_grid_pattern(const ExPolygon &expolygon, coord_t spacing, const BoundingBox &global_bounding_box);
  156. Points sample_grid_pattern(const ExPolygons &expolygons, coord_t spacing, const BoundingBox &global_bounding_box);
  157. Points sample_grid_pattern(const Polygons &polygons, coord_t spacing, const BoundingBox &global_bounding_box);
  158. } // namespace Slic3r
  159. #endif // slic3r_FillRectilinear_hpp_