mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-08-09 23:05:04 -06:00
Refactoring: new Slic3r::Model class to represent files
This commit is contained in:
parent
c0322ec703
commit
f90520ed06
14 changed files with 255 additions and 88 deletions
|
@ -25,15 +25,21 @@ sub read_file {
|
|||
|
||||
close $fh;
|
||||
|
||||
$_ = Slic3r::TriangleMesh->new(vertices => $vertices, facets => $_)
|
||||
for values %$meshes_by_material;
|
||||
|
||||
return $materials, $meshes_by_material;
|
||||
my $model = Slic3r::Model->new;
|
||||
my $object = $model->add_object(vertices => $vertices);
|
||||
foreach my $material (keys %$meshes_by_material) {
|
||||
push @{$model->materials}, $material; # TODO: we should not add duplicate materials
|
||||
$object->add_volume(
|
||||
material_id => $#{$model->materials},
|
||||
facets => $meshes_by_material->{$material},
|
||||
);
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub write_file {
|
||||
my $self = shift;
|
||||
my ($file, $materials, $meshes_by_material) = @_;
|
||||
my ($file, $model, %params) = @_;
|
||||
|
||||
my %vertices_offset = ();
|
||||
|
||||
|
@ -42,20 +48,20 @@ sub write_file {
|
|||
printf $fh qq{<?xml version="1.0" encoding="UTF-8"?>\n};
|
||||
printf $fh qq{<amf unit="millimeter">\n};
|
||||
printf $fh qq{ <metadata type="cad">Slic3r %s</metadata>\n}, $Slic3r::VERSION;
|
||||
foreach my $material_id (keys %$materials) {
|
||||
printf $fh qq{ <material id="%s">\n}, $material_id;
|
||||
for (keys %{$materials->{$material_id}}) {
|
||||
printf $fh qq{ <metadata type=\"%s\">%s</metadata>\n}, $_, $materials->{$material_id}{$_};
|
||||
for my $material_id (0 .. $#{ $model->materials }) {
|
||||
my $material = $model->materials->[$material_id];
|
||||
printf $fh qq{ <material id="%d">\n}, $material_id;
|
||||
for (keys %$material) {
|
||||
printf $fh qq{ <metadata type=\"%s\">%s</metadata>\n}, $_, $material->{$_};
|
||||
}
|
||||
printf $fh qq{ </material>\n};
|
||||
}
|
||||
printf $fh qq{ <object id="0">\n};
|
||||
printf $fh qq{ <mesh>\n};
|
||||
printf $fh qq{ <vertices>\n};
|
||||
my $vertices_count = 0;
|
||||
foreach my $mesh (values %$meshes_by_material) {
|
||||
$vertices_offset{$mesh} = $vertices_count;
|
||||
foreach my $vertex (@{$mesh->vertices}, ) {
|
||||
for my $object_id (0 .. $#{ $model->objects }) {
|
||||
my $object = $model->objects->[$object_id];
|
||||
printf $fh qq{ <object id="%d">\n}, $object_id;
|
||||
printf $fh qq{ <mesh>\n};
|
||||
printf $fh qq{ <vertices>\n};
|
||||
foreach my $vertex (@{$object->vertices}, ) {
|
||||
printf $fh qq{ <vertex>\n};
|
||||
printf $fh qq{ <coordinates>\n};
|
||||
printf $fh qq{ <x>%s</x>\n}, $vertex->[X];
|
||||
|
@ -63,24 +69,21 @@ sub write_file {
|
|||
printf $fh qq{ <z>%s</z>\n}, $vertex->[Z];
|
||||
printf $fh qq{ </coordinates>\n};
|
||||
printf $fh qq{ </vertex>\n};
|
||||
$vertices_count++;
|
||||
}
|
||||
}
|
||||
printf $fh qq{ </vertices>\n};
|
||||
foreach my $material_id (sort keys %$meshes_by_material) {
|
||||
my $mesh = $meshes_by_material->{$material_id};
|
||||
printf $fh qq{ <volume%s>\n},
|
||||
($material_id eq '_') ? '' : " materialid=\"$material_id\"";
|
||||
foreach my $facet (@{$mesh->facets}) {
|
||||
printf $fh qq{ <triangle>\n};
|
||||
printf $fh qq{ <v%d>%d</v%d>\n}, $_, $facet->[$_] + $vertices_offset{$mesh}, $_
|
||||
for -3..-1;
|
||||
printf $fh qq{ </triangle>\n};
|
||||
printf $fh qq{ </vertices>\n};
|
||||
foreach my $volume (@{ $object->volumes }) {
|
||||
printf $fh qq{ <volume%s>\n},
|
||||
(!defined $volume->material_id) ? '' : (sprintf ' materialid="%s"', $volume->material_id);
|
||||
foreach my $facet (@{$volume->facets}) {
|
||||
printf $fh qq{ <triangle>\n};
|
||||
printf $fh qq{ <v%d>%d</v%d>\n}, $_, $facet->[$_], $_ for -3..-1;
|
||||
printf $fh qq{ </triangle>\n};
|
||||
}
|
||||
printf $fh qq{ </volume>\n};
|
||||
}
|
||||
printf $fh qq{ </volume>\n};
|
||||
printf $fh qq{ </mesh>\n};
|
||||
printf $fh qq{ </object>\n};
|
||||
}
|
||||
printf $fh qq{ </mesh>\n};
|
||||
printf $fh qq{ </object>\n};
|
||||
printf $fh qq{</amf>\n};
|
||||
close $fh;
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ sub end_element {
|
|||
} elsif ($data->{LocalName} eq 'triangle') {
|
||||
push @{$self->{_volume}}, $self->{_triangle};
|
||||
$self->{_triangle} = undef;
|
||||
} elsif ($self->{_vertex_idx} && $data->{LocalName} =~ /^v[123]$/) {
|
||||
} elsif (defined $self->{_vertex_idx} && $data->{LocalName} =~ /^v[123]$/) {
|
||||
$self->{_vertex_idx} = undef;
|
||||
} elsif ($data->{LocalName} eq 'material') {
|
||||
$self->{_materials}{ $self->{_material_id} } = $self->{_material};
|
||||
|
|
|
@ -17,7 +17,10 @@ sub read_file {
|
|||
}
|
||||
close $fh;
|
||||
|
||||
return Slic3r::TriangleMesh->new(vertices => $vertices, facets => $facets);
|
||||
my $model = Slic3r::Model->new;
|
||||
my $object = $model->add_object(vertices => $vertices);
|
||||
my $volume = $object->add_volume(facets => $facets);
|
||||
return $model;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
@ -117,7 +117,10 @@ sub read_file {
|
|||
}
|
||||
}
|
||||
|
||||
return Slic3r::TriangleMesh->new(vertices => $vertices, facets => $facets);
|
||||
my $model = Slic3r::Model->new;
|
||||
my $object = $model->add_object(vertices => $vertices);
|
||||
my $volume = $object->add_volume(facets => $facets);
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub _read_ascii {
|
||||
|
@ -161,13 +164,13 @@ sub _read_binary {
|
|||
|
||||
sub write_file {
|
||||
my $self = shift;
|
||||
my ($file, $mesh, $binary) = @_;
|
||||
my ($file, $model, %params) = @_;
|
||||
|
||||
open my $fh, '>', $file;
|
||||
|
||||
$binary
|
||||
? _write_binary($fh, $mesh)
|
||||
: _write_ascii($fh, $mesh);
|
||||
$params{binary}
|
||||
? _write_binary($fh, $model->mesh)
|
||||
: _write_ascii($fh, $model->mesh);
|
||||
|
||||
close $fh;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue