mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 16:57:53 -06:00
Unfinished work for decoupling GUI from the Print object (goal = more speed for manipulation, less memory usage)
This commit is contained in:
parent
f29d455319
commit
191de5d078
5 changed files with 223 additions and 166 deletions
|
@ -6,6 +6,18 @@ use Slic3r::Geometry qw(X Y Z);
|
|||
has 'materials' => (is => 'ro', default => sub { {} });
|
||||
has 'objects' => (is => 'ro', default => sub { [] });
|
||||
|
||||
sub read_from_file {
|
||||
my $class = shift;
|
||||
my ($input_file) = @_;
|
||||
|
||||
my $model = $input_file =~ /\.stl$/i ? Slic3r::Format::STL->read_file($input_file)
|
||||
: $input_file =~ /\.obj$/i ? Slic3r::Format::OBJ->read_file($input_file)
|
||||
: $input_file =~ /\.amf(\.xml)?$/i ? Slic3r::Format::AMF->read_file($input_file)
|
||||
: die "Input file must have .stl, .obj or .amf(.xml) extension\n";
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub add_object {
|
||||
my $self = shift;
|
||||
|
||||
|
@ -21,34 +33,15 @@ sub mesh {
|
|||
my $vertices = [];
|
||||
my $facets = [];
|
||||
foreach my $object (@{$self->objects}) {
|
||||
my @instances = $object->instances ? @{$object->instances} : (undef);
|
||||
foreach my $instance (@instances) {
|
||||
my @vertices = @{$object->vertices};
|
||||
if ($instance) {
|
||||
# save Z coordinates, as rotation and translation discard them
|
||||
my @z = map $_->[Z], @vertices;
|
||||
|
||||
if ($instance->rotation) {
|
||||
# transform vertex coordinates
|
||||
my $rad = Slic3r::Geometry::deg2rad($instance->rotation);
|
||||
@vertices = Slic3r::Geometry::rotate_points($rad, undef, @vertices);
|
||||
}
|
||||
@vertices = Slic3r::Geometry::move_points($instance->offset, @vertices);
|
||||
|
||||
# reapply Z coordinates
|
||||
$vertices[$_][Z] = $z[$_] for 0 .. $#z;
|
||||
}
|
||||
|
||||
my $v_offset = @$vertices;
|
||||
push @$vertices, @vertices;
|
||||
foreach my $volume (@{$object->volumes}) {
|
||||
push @$facets, map {
|
||||
my $f = [@$_];
|
||||
$f->[$_] += $v_offset for -3..-1;
|
||||
$f;
|
||||
} @{$volume->facets};
|
||||
}
|
||||
}
|
||||
my $mesh = $object->mesh;
|
||||
|
||||
my $v_offset = @$vertices;
|
||||
push @$vertices, @{$mesh->vertices};
|
||||
push @$facets, map {
|
||||
my $f = [@$_];
|
||||
$f->[$_] += $v_offset for -3..-1;
|
||||
$f;
|
||||
} @{$mesh->facets};
|
||||
}
|
||||
|
||||
return Slic3r::TriangleMesh->new(
|
||||
|
@ -87,6 +80,47 @@ sub add_instance {
|
|||
return $self->instances->[-1];
|
||||
}
|
||||
|
||||
sub mesh {
|
||||
my $self = shift;
|
||||
|
||||
my $vertices = [];
|
||||
my $facets = [];
|
||||
|
||||
my @instances = $self->instances ? @{$self->instances} : (undef);
|
||||
foreach my $instance (@instances) {
|
||||
my @vertices = @{$self->vertices};
|
||||
if ($instance) {
|
||||
# save Z coordinates, as rotation and translation discard them
|
||||
my @z = map $_->[Z], @vertices;
|
||||
|
||||
if ($instance->rotation) {
|
||||
# transform vertex coordinates
|
||||
my $rad = Slic3r::Geometry::deg2rad($instance->rotation);
|
||||
@vertices = Slic3r::Geometry::rotate_points($rad, undef, @vertices);
|
||||
}
|
||||
@vertices = Slic3r::Geometry::move_points($instance->offset, @vertices);
|
||||
|
||||
# reapply Z coordinates
|
||||
$vertices[$_][Z] = $z[$_] for 0 .. $#z;
|
||||
}
|
||||
|
||||
my $v_offset = @$vertices;
|
||||
push @$vertices, @vertices;
|
||||
foreach my $volume (@{$self->volumes}) {
|
||||
push @$facets, map {
|
||||
my $f = [@$_];
|
||||
$f->[$_] += $v_offset for -3..-1;
|
||||
$f;
|
||||
} @{$volume->facets};
|
||||
}
|
||||
}
|
||||
|
||||
return Slic3r::TriangleMesh->new(
|
||||
vertices => $vertices,
|
||||
facets => $facets,
|
||||
);
|
||||
}
|
||||
|
||||
package Slic3r::Model::Volume;
|
||||
use Moo;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue