Fill.pm 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package Slic3r::Fill;
  2. use Moo;
  3. use Slic3r::Fill::ArchimedeanChords;
  4. use Slic3r::Fill::Base;
  5. use Slic3r::Fill::Flowsnake;
  6. use Slic3r::Fill::HilbertCurve;
  7. use Slic3r::Fill::OctagramSpiral;
  8. use Slic3r::Fill::Rectilinear;
  9. use Slic3r::Fill::Rectilinear2;
  10. use XXX;
  11. has 'print' => (is => 'ro', required => 1);
  12. has 'fillers' => (is => 'rw', default => sub { {} });
  13. our %FillTypes = (
  14. archimedeanchords => 'Slic3r::Fill::ArchimedeanChords',
  15. rectilinear => 'Slic3r::Fill::Rectilinear',
  16. rectilinear2 => 'Slic3r::Fill::Rectilinear2',
  17. flowsnake => 'Slic3r::Fill::Flowsnake',
  18. octagramspiral => 'Slic3r::Fill::OctagramSpiral',
  19. hilbertcurve => 'Slic3r::Fill::HilbertCurve',
  20. );
  21. sub BUILD {
  22. my $self = shift;
  23. $self->fillers->{$_} ||= $FillTypes{$_}->new(print => $self->print)
  24. for ('rectilinear', $Slic3r::fill_pattern, $Slic3r::solid_fill_pattern);
  25. }
  26. sub make_fill {
  27. my $self = shift;
  28. my ($layer) = @_;
  29. my $max_print_dimension = $self->print->max_length * sqrt(2);
  30. for (values %{$self->fillers}) {
  31. $_->layer($layer);
  32. $_->max_print_dimension($max_print_dimension);
  33. }
  34. printf "Filling layer %d:\n", $layer->id;
  35. foreach my $surfaces (@{ $layer->fill_surfaces }) {
  36. my @path_collection = ();
  37. SURFACE: foreach my $surface (@$surfaces) {
  38. Slic3r::debugf " Processing surface %s:\n", $surface->id;
  39. my $filler = $Slic3r::fill_pattern;
  40. my $density = $Slic3r::fill_density;
  41. # force 100% density and rectilinear fill for external surfaces
  42. if ($surface->surface_type ne 'internal') {
  43. $density = 1;
  44. $filler = $surface->isa('Slic3r::Surface::Bridge')
  45. ? 'rectilinear'
  46. : $Slic3r::solid_fill_pattern;
  47. } else {
  48. next SURFACE unless $density > 0;
  49. }
  50. my @paths = $self->fillers->{$filler}->fill_surface(
  51. $surface,
  52. density => $density,
  53. );
  54. push @path_collection, map Slic3r::ExtrusionPath->cast(
  55. [ @$_ ],
  56. depth_layers => $surface->depth_layers,
  57. ), @paths;
  58. }
  59. # save into layer
  60. push @{ $layer->fills }, Slic3r::ExtrusionPath::Collection->new(
  61. paths => [ @path_collection ],
  62. );
  63. $layer->fills->[-1]->cleanup;
  64. }
  65. }
  66. 1;