220 lines
4.5 KiB
Perl
220 lines
4.5 KiB
Perl
package Slic3r::XS;
|
|
use warnings;
|
|
use strict;
|
|
|
|
our $VERSION = '0.01';
|
|
|
|
use Carp qw();
|
|
use XSLoader;
|
|
XSLoader::load(__PACKAGE__, $VERSION);
|
|
|
|
package Slic3r::Line;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::Line::Ref;
|
|
our @ISA = 'Slic3r::Line';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::Point;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::Point::Ref;
|
|
our @ISA = 'Slic3r::Point';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::ExPolygon;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::ExPolygon::Ref;
|
|
our @ISA = 'Slic3r::ExPolygon';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::Polyline;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::Polyline::Ref;
|
|
our @ISA = 'Slic3r::Polyline';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::Polyline::Collection;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::Polygon;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::Polygon::Ref;
|
|
our @ISA = 'Slic3r::Polygon';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::ExPolygon::Collection;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
package Slic3r::ExtrusionPath::Collection;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
sub new {
|
|
my ($class, @paths) = @_;
|
|
|
|
my $self = $class->_new;
|
|
$self->append(@paths);
|
|
return $self;
|
|
}
|
|
|
|
package Slic3r::ExtrusionPath::Collection::Ref;
|
|
our @ISA = 'Slic3r::ExtrusionPath::Collection';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::ExtrusionLoop;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
sub new {
|
|
my ($class, %args) = @_;
|
|
|
|
return $class->_new(
|
|
$args{polygon}, # required
|
|
$args{role}, # required
|
|
$args{mm3_per_mm} // -1,
|
|
);
|
|
}
|
|
|
|
sub clone {
|
|
my ($self, %args) = @_;
|
|
|
|
return (ref $self)->_new(
|
|
$args{polygon} // $self->polygon,
|
|
$args{role} // $self->role,
|
|
$args{mm3_per_mm} // $self->mm3_per_mm,
|
|
);
|
|
}
|
|
|
|
package Slic3r::ExtrusionLoop::Ref;
|
|
our @ISA = 'Slic3r::ExtrusionLoop';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::ExtrusionPath;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
sub new {
|
|
my ($class, %args) = @_;
|
|
|
|
return $class->_new(
|
|
$args{polyline}, # required
|
|
$args{role}, # required
|
|
$args{mm3_per_mm} // -1,
|
|
);
|
|
}
|
|
|
|
sub clone {
|
|
my ($self, %args) = @_;
|
|
|
|
return (ref $self)->_new(
|
|
$args{polyline} // $self->polyline,
|
|
$args{role} // $self->role,
|
|
$args{mm3_per_mm} // $self->mm3_per_mm,
|
|
);
|
|
}
|
|
|
|
package Slic3r::ExtrusionPath::Ref;
|
|
our @ISA = 'Slic3r::ExtrusionPath';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::Flow;
|
|
|
|
sub new {
|
|
my ($class, %args) = @_;
|
|
|
|
my $self = $class->_new(
|
|
@args{qw(width spacing nozzle_diameter)},
|
|
);
|
|
$self->set_bridge($args{bridge} // 0);
|
|
return $self;
|
|
}
|
|
|
|
sub new_from_width {
|
|
my ($class, %args) = @_;
|
|
|
|
return $class->_new_from_width(
|
|
@args{qw(role width nozzle_diameter layer_height bridge_flow_ratio)},
|
|
);
|
|
}
|
|
|
|
sub new_from_spacing {
|
|
my ($class, %args) = @_;
|
|
|
|
return $class->_new_from_spacing(
|
|
@args{qw(spacing nozzle_diameter layer_height bridge)},
|
|
);
|
|
}
|
|
|
|
package Slic3r::Surface;
|
|
|
|
sub new {
|
|
my ($class, %args) = @_;
|
|
|
|
# defensive programming: make sure no negative bridge_angle is supplied
|
|
die "Error: invalid negative bridge_angle\n"
|
|
if defined $args{bridge_angle} && $args{bridge_angle} < 0;
|
|
|
|
return $class->_new(
|
|
$args{expolygon} // (die "Missing required expolygon\n"),
|
|
$args{surface_type} // (die "Missing required surface_type\n"),
|
|
$args{thickness} // -1,
|
|
$args{thickness_layers} // 1,
|
|
$args{bridge_angle} // -1,
|
|
$args{extra_perimeters} // 0,
|
|
);
|
|
}
|
|
|
|
sub clone {
|
|
my ($self, %args) = @_;
|
|
|
|
return (ref $self)->_new(
|
|
delete $args{expolygon} // $self->expolygon,
|
|
delete $args{surface_type} // $self->surface_type,
|
|
delete $args{thickness} // $self->thickness,
|
|
delete $args{thickness_layers} // $self->thickness_layers,
|
|
delete $args{bridge_angle} // $self->bridge_angle,
|
|
delete $args{extra_perimeters} // $self->extra_perimeters,
|
|
);
|
|
}
|
|
|
|
package Slic3r::Surface::Ref;
|
|
our @ISA = 'Slic3r::Surface';
|
|
|
|
sub DESTROY {}
|
|
|
|
package Slic3r::Surface::Collection;
|
|
use overload
|
|
'@{}' => sub { $_[0]->arrayref },
|
|
'fallback' => 1;
|
|
|
|
1;
|