2014-01-02 16:54:18 +00:00
|
|
|
package Slic3r::Print::Simple;
|
|
|
|
use Moo;
|
|
|
|
|
|
|
|
use Slic3r::Geometry qw(X Y);
|
|
|
|
|
|
|
|
has '_print' => (
|
|
|
|
is => 'ro',
|
|
|
|
default => sub { Slic3r::Print->new },
|
2014-01-03 19:02:00 +00:00
|
|
|
handles => [qw(apply_config extruders expanded_output_filepath
|
2014-04-19 10:10:15 +00:00
|
|
|
total_used_filament total_extruded_volume
|
|
|
|
placeholder_parser)],
|
2014-01-02 16:54:18 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
has 'duplicate' => (
|
|
|
|
is => 'rw',
|
|
|
|
default => sub { 1 },
|
|
|
|
);
|
|
|
|
|
|
|
|
has 'scale' => (
|
|
|
|
is => 'rw',
|
|
|
|
default => sub { 1 },
|
|
|
|
);
|
|
|
|
|
|
|
|
has 'rotate' => (
|
|
|
|
is => 'rw',
|
|
|
|
default => sub { 0 },
|
|
|
|
);
|
|
|
|
|
|
|
|
has 'duplicate_grid' => (
|
|
|
|
is => 'rw',
|
|
|
|
default => sub { [1,1] },
|
|
|
|
);
|
|
|
|
|
|
|
|
has 'status_cb' => (
|
|
|
|
is => 'rw',
|
|
|
|
default => sub { sub {} },
|
|
|
|
);
|
|
|
|
|
|
|
|
has 'output_file' => (
|
|
|
|
is => 'rw',
|
|
|
|
);
|
|
|
|
|
|
|
|
sub set_model {
|
|
|
|
my ($self, $model) = @_;
|
|
|
|
|
|
|
|
# make method idempotent so that the object is reusable
|
2014-05-06 22:58:29 +00:00
|
|
|
$self->_print->clear_objects;
|
2014-01-02 16:54:18 +00:00
|
|
|
|
2014-04-25 08:20:30 +00:00
|
|
|
# make sure all objects have at least one defined instance
|
|
|
|
my $need_arrange = $model->add_default_instances;
|
2014-01-02 16:54:18 +00:00
|
|
|
|
|
|
|
# apply scaling and rotation supplied from command line if any
|
|
|
|
foreach my $instance (map @{$_->instances}, @{$model->objects}) {
|
2014-04-29 23:04:49 +00:00
|
|
|
$instance->set_scaling_factor($instance->scaling_factor * $self->scale);
|
|
|
|
$instance->set_rotation($instance->rotation + $self->rotate);
|
2014-01-02 16:54:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($self->duplicate_grid->[X] > 1 || $self->duplicate_grid->[Y] > 1) {
|
|
|
|
$model->duplicate_objects_grid($self->duplicate_grid, $self->_print->config->duplicate_distance);
|
|
|
|
} elsif ($need_arrange) {
|
|
|
|
$model->duplicate_objects($self->duplicate, $self->_print->config->min_object_distance);
|
|
|
|
} elsif ($self->duplicate > 1) {
|
|
|
|
# if all input objects have defined position(s) apply duplication to the whole model
|
|
|
|
$model->duplicate($self->duplicate, $self->_print->config->min_object_distance);
|
|
|
|
}
|
|
|
|
$model->center_instances_around_point($self->_print->config->print_center);
|
|
|
|
|
|
|
|
foreach my $model_object (@{$model->objects}) {
|
|
|
|
$self->_print->auto_assign_extruders($model_object);
|
2014-05-06 23:11:49 +00:00
|
|
|
$self->_print->add_model_object($model_object);
|
2014-01-02 16:54:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub _before_export {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
2014-05-06 08:07:18 +00:00
|
|
|
$self->_print->set_status_cb($self->status_cb);
|
2014-01-02 16:54:18 +00:00
|
|
|
$self->_print->validate;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub _after_export {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
2014-05-06 08:07:18 +00:00
|
|
|
$self->_print->set_status_cb(undef);
|
2014-01-02 16:54:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub export_gcode {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
$self->_before_export;
|
|
|
|
$self->_print->export_gcode(output_file => $self->output_file);
|
|
|
|
$self->_after_export;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub export_svg {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
$self->_before_export;
|
|
|
|
|
|
|
|
$self->_print->export_svg(output_file => $self->output_file);
|
|
|
|
|
|
|
|
$self->_after_export;
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|