ExtrusionPath.pm 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package Slic3r::ExtrusionPath;
  2. use strict;
  3. use warnings;
  4. use parent qw(Exporter);
  5. our @EXPORT_OK = qw(EXTR_ROLE_PERIMETER EXTR_ROLE_EXTERNAL_PERIMETER
  6. EXTR_ROLE_CONTOUR_INTERNAL_PERIMETER EXTR_ROLE_OVERHANG_PERIMETER
  7. EXTR_ROLE_FILL EXTR_ROLE_SOLIDFILL EXTR_ROLE_TOPSOLIDFILL EXTR_ROLE_BRIDGE
  8. EXTR_ROLE_INTERNALBRIDGE EXTR_ROLE_SKIRT EXTR_ROLE_SUPPORTMATERIAL EXTR_ROLE_GAPFILL);
  9. our %EXPORT_TAGS = (roles => \@EXPORT_OK);
  10. use Slic3r::Geometry qw(PI X Y epsilon deg2rad rotate_points);
  11. sub clip_with_polygon {
  12. my $self = shift;
  13. my ($polygon) = @_;
  14. return $self->clip_with_expolygon(Slic3r::ExPolygon->new($polygon));
  15. }
  16. sub clip_with_expolygon {
  17. my $self = shift;
  18. my ($expolygon) = @_;
  19. return map $self->clone(polyline => $_),
  20. $self->polyline->clip_with_expolygon($expolygon);
  21. }
  22. sub intersect_expolygons {
  23. my $self = shift;
  24. my ($expolygons_pp) = @_;
  25. return map $self->clone(polyline => Slic3r::Polyline->new(@$_)),
  26. @{Boost::Geometry::Utils::multi_polygon_multi_linestring_intersection($expolygons_pp, [$self->pp])};
  27. }
  28. sub subtract_expolygons {
  29. my $self = shift;
  30. my ($expolygons_pp) = @_;
  31. return map $self->clone(polyline => Slic3r::Polyline->new(@$_)),
  32. @{Boost::Geometry::Utils::multi_linestring_multi_polygon_difference([$self->pp], $expolygons_pp)};
  33. }
  34. sub simplify {
  35. my $self = shift;
  36. $self->polyline($self->polyline->simplify(@_));
  37. }
  38. sub clip_end {
  39. my $self = shift;
  40. my $polyline = $self->polyline;
  41. $polyline->clip_end(@_);
  42. $self->polyline($polyline);
  43. }
  44. sub length {
  45. my $self = shift;
  46. return $self->polyline->length;
  47. }
  48. sub points {
  49. my $self = shift;
  50. return $self->polyline;
  51. }
  52. sub is_perimeter {
  53. my $self = shift;
  54. return $self->role == EXTR_ROLE_PERIMETER
  55. || $self->role == EXTR_ROLE_EXTERNAL_PERIMETER
  56. || $self->role == EXTR_ROLE_OVERHANG_PERIMETER
  57. || $self->role == EXTR_ROLE_CONTOUR_INTERNAL_PERIMETER;
  58. }
  59. sub is_fill {
  60. my $self = shift;
  61. return $self->role == EXTR_ROLE_FILL
  62. || $self->role == EXTR_ROLE_SOLIDFILL
  63. || $self->role == EXTR_ROLE_TOPSOLIDFILL;
  64. }
  65. sub is_bridge {
  66. my $self = shift;
  67. return $self->role == EXTR_ROLE_BRIDGE
  68. || $self->role == EXTR_ROLE_INTERNALBRIDGE
  69. || $self->role == EXTR_ROLE_OVERHANG_PERIMETER;
  70. }
  71. 1;