XS.pm 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package Slic3r::XS;
  2. use warnings;
  3. use strict;
  4. our $VERSION = '0.01';
  5. use Carp qw();
  6. use XSLoader;
  7. XSLoader::load(__PACKAGE__, $VERSION);
  8. package Slic3r::Line;
  9. use overload
  10. '@{}' => sub { $_[0]->arrayref },
  11. 'fallback' => 1;
  12. package Slic3r::Point;
  13. use overload
  14. '@{}' => sub { $_[0]->arrayref },
  15. 'fallback' => 1;
  16. package Slic3r::Point3;
  17. use overload
  18. '@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
  19. 'fallback' => 1;
  20. package Slic3r::Pointf;
  21. use overload
  22. '@{}' => sub { $_[0]->arrayref },
  23. 'fallback' => 1;
  24. package Slic3r::Pointf3;
  25. use overload
  26. '@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
  27. 'fallback' => 1;
  28. package Slic3r::ExPolygon;
  29. use overload
  30. '@{}' => sub { $_[0]->arrayref },
  31. 'fallback' => 1;
  32. package Slic3r::Polyline;
  33. use overload
  34. '@{}' => sub { $_[0]->arrayref },
  35. 'fallback' => 1;
  36. package Slic3r::Polyline::Collection;
  37. use overload
  38. '@{}' => sub { $_[0]->arrayref },
  39. 'fallback' => 1;
  40. package Slic3r::Polygon;
  41. use overload
  42. '@{}' => sub { $_[0]->arrayref },
  43. 'fallback' => 1;
  44. package Slic3r::ExPolygon::Collection;
  45. use overload
  46. '@{}' => sub { $_[0]->arrayref },
  47. 'fallback' => 1;
  48. package Slic3r::ExtrusionPath::Collection;
  49. use overload
  50. '@{}' => sub { $_[0]->arrayref },
  51. 'fallback' => 1;
  52. sub new {
  53. my ($class, @paths) = @_;
  54. my $self = $class->_new;
  55. $self->append(@paths);
  56. return $self;
  57. }
  58. package Slic3r::ExtrusionLoop;
  59. use overload
  60. '@{}' => sub { $_[0]->arrayref },
  61. 'fallback' => 1;
  62. sub new_from_paths {
  63. my ($class, @paths) = @_;
  64. my $loop = $class->new;
  65. $loop->append($_) for @paths;
  66. return $loop;
  67. }
  68. package Slic3r::ExtrusionPath;
  69. use overload
  70. '@{}' => sub { $_[0]->arrayref },
  71. 'fallback' => 1;
  72. sub new {
  73. my ($class, %args) = @_;
  74. return $class->_new(
  75. $args{polyline}, # required
  76. $args{role}, # required
  77. $args{mm3_per_mm} // die("Missing required mm3_per_mm in ExtrusionPath constructor"),
  78. $args{width} // -1,
  79. $args{height} // -1,
  80. );
  81. }
  82. sub clone {
  83. my ($self, %args) = @_;
  84. return __PACKAGE__->_new(
  85. $args{polyline} // $self->polyline,
  86. $args{role} // $self->role,
  87. $args{mm3_per_mm} // $self->mm3_per_mm,
  88. $args{width} // $self->width,
  89. $args{height} // $self->height,
  90. );
  91. }
  92. package Slic3r::Flow;
  93. sub new {
  94. my ($class, %args) = @_;
  95. my $self = $class->_new(
  96. @args{qw(width height nozzle_diameter)},
  97. );
  98. $self->set_bridge($args{bridge} // 0);
  99. return $self;
  100. }
  101. sub new_from_width {
  102. my ($class, %args) = @_;
  103. return $class->_new_from_width(
  104. @args{qw(role width nozzle_diameter layer_height bridge_flow_ratio)},
  105. );
  106. }
  107. sub new_from_spacing {
  108. my ($class, %args) = @_;
  109. return $class->_new_from_spacing(
  110. @args{qw(spacing nozzle_diameter layer_height bridge)},
  111. );
  112. }
  113. package Slic3r::Surface;
  114. sub new {
  115. my ($class, %args) = @_;
  116. # defensive programming: make sure no negative bridge_angle is supplied
  117. die "Error: invalid negative bridge_angle\n"
  118. if defined $args{bridge_angle} && $args{bridge_angle} < 0;
  119. return $class->_new(
  120. $args{expolygon} // (die "Missing required expolygon\n"),
  121. $args{surface_type} // (die "Missing required surface_type\n"),
  122. $args{thickness} // -1,
  123. $args{thickness_layers} // 1,
  124. $args{bridge_angle} // -1,
  125. $args{extra_perimeters} // 0,
  126. );
  127. }
  128. sub clone {
  129. my ($self, %args) = @_;
  130. return (ref $self)->_new(
  131. delete $args{expolygon} // $self->expolygon,
  132. delete $args{surface_type} // $self->surface_type,
  133. delete $args{thickness} // $self->thickness,
  134. delete $args{thickness_layers} // $self->thickness_layers,
  135. delete $args{bridge_angle} // $self->bridge_angle,
  136. delete $args{extra_perimeters} // $self->extra_perimeters,
  137. );
  138. }
  139. package Slic3r::Surface::Collection;
  140. use overload
  141. '@{}' => sub { $_[0]->arrayref },
  142. 'fallback' => 1;
  143. sub new {
  144. my ($class, @surfaces) = @_;
  145. my $self = $class->_new;
  146. $self->append($_) for @surfaces;
  147. return $self;
  148. }
  149. package main;
  150. for my $class (qw(
  151. Slic3r::BridgeDetector
  152. Slic3r::Config
  153. Slic3r::Config::Full
  154. Slic3r::Config::GCode
  155. Slic3r::Config::Print
  156. Slic3r::Config::PrintObject
  157. Slic3r::Config::PrintRegion
  158. Slic3r::ExPolygon
  159. Slic3r::ExPolygon::Collection
  160. Slic3r::Extruder
  161. Slic3r::ExtrusionLoop
  162. Slic3r::ExtrusionPath
  163. Slic3r::ExtrusionPath::Collection
  164. Slic3r::Flow
  165. Slic3r::GCode::PlaceholderParser
  166. Slic3r::Geometry::BoundingBox
  167. Slic3r::Geometry::BoundingBoxf
  168. Slic3r::Geometry::BoundingBoxf3
  169. Slic3r::Layer
  170. Slic3r::Layer::Region
  171. Slic3r::Layer::Support
  172. Slic3r::Line
  173. Slic3r::Linef3
  174. Slic3r::Model
  175. Slic3r::Model::Instance
  176. Slic3r::Model::Material
  177. Slic3r::Model::Object
  178. Slic3r::Model::Volume
  179. Slic3r::Point
  180. Slic3r::Point3
  181. Slic3r::Pointf
  182. Slic3r::Pointf3
  183. Slic3r::Polygon
  184. Slic3r::Polyline
  185. Slic3r::Polyline::Collection
  186. Slic3r::Print
  187. Slic3r::Print::Object
  188. Slic3r::Print::Region
  189. Slic3r::Print::State
  190. Slic3r::Surface
  191. Slic3r::Surface::Collection
  192. Slic3r::TriangleMesh
  193. ))
  194. {
  195. no strict 'refs';
  196. my $ref_class = $class . "::Ref";
  197. eval "package $ref_class; our \@ISA = '$class'; sub DESTROY {};";
  198. }
  199. 1;