dynamic.t 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use Test::More;
  2. use strict;
  3. use warnings;
  4. plan tests => 20;
  5. BEGIN {
  6. use FindBin;
  7. use lib "$FindBin::Bin/../lib";
  8. }
  9. use List::Util qw(first);
  10. use Slic3r;
  11. use Slic3r::Geometry qw(X Y scale epsilon);
  12. use Slic3r::Surface ':types';
  13. sub scale_points (@) { map [scale $_->[X], scale $_->[Y]], @_ }
  14. {
  15. my $square = Slic3r::ExPolygon->new([
  16. scale_points [0,0], [10,0], [10,10], [0,10],
  17. ]);
  18. my @offsets = $square->noncollapsing_offset_ex(- scale 5);
  19. is scalar @offsets, 1, 'non-collapsing offset';
  20. }
  21. {
  22. my $w = 0.7;
  23. local $Slic3r::perimeter_flow = Slic3r::Flow->new(
  24. nozzle_diameter => 0.5,
  25. layer_height => 0.4,
  26. width => $w,
  27. );
  28. local $Slic3r::Config = Slic3r::Config->new(
  29. perimeters => 3,
  30. );
  31. my $make_layer = sub {
  32. my ($width) = @_;
  33. my $layer = Slic3r::Layer->new(
  34. id => 1,
  35. slices => [
  36. Slic3r::Surface->new(
  37. surface_type => S_TYPE_INTERNAL,
  38. expolygon => Slic3r::ExPolygon->new([ scale_points [0,0], [50,0], [50,$width], [0,$width] ]),
  39. ),
  40. ],
  41. thin_walls => [],
  42. );
  43. $layer->make_perimeters;
  44. return $layer;
  45. };
  46. my %widths = (
  47. 1 * $w => { perimeters => 1, gaps => 0 },
  48. 1.3 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $Slic3r::perimeter_flow->clone(width => 0.2 * $w)->spacing },
  49. 1.5 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $Slic3r::perimeter_flow->clone(width => 0.5 * $w)->spacing },
  50. 2 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $Slic3r::perimeter_flow->spacing },
  51. 2.5 * $w => { perimeters => 1, gaps => 1, gap_flow_spacing => $Slic3r::perimeter_flow->clone(width => 1.5 * $w)->spacing },
  52. 3 * $w => { perimeters => 2, gaps => 0 },
  53. 4 * $w => { perimeters => 2, gaps => 1, gap_flow_spacing => $Slic3r::perimeter_flow->spacing },
  54. );
  55. foreach my $width (sort keys %widths) {
  56. my $layer = $make_layer->($width);
  57. is scalar @{$layer->perimeters}, $widths{$width}{perimeters}, 'right number of perimeters';
  58. is scalar @{$layer->thin_fills} ? 1 : 0, $widths{$width}{gaps},
  59. ($widths{$width}{gaps} ? 'gaps were filled' : 'no gaps detected'); # TODO: we should check the exact number of gaps, but we need a better medial axis algorithm
  60. my @gaps = map $_->unpack, @{$layer->thin_fills};
  61. if (@gaps) {
  62. ok +(!first { abs($_->flow_spacing - $widths{$width}{gap_flow_spacing}) > epsilon } @gaps),
  63. 'flow spacing was dynamically adjusted';
  64. }
  65. }
  66. }
  67. __END__