mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Refactoring: moved Slic3r::STL and Slic3r::AMF to Slic3r::Format::*
This commit is contained in:
		
							parent
							
								
									2a86932cfe
								
							
						
					
					
						commit
						959230b099
					
				
					 9 changed files with 18 additions and 18 deletions
				
			
		
							
								
								
									
										89
									
								
								lib/Slic3r/Format/AMF.pm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								lib/Slic3r/Format/AMF.pm
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,89 @@
 | 
			
		|||
package Slic3r::Format::AMF;
 | 
			
		||||
use Moo;
 | 
			
		||||
 | 
			
		||||
use Slic3r::Geometry qw(X Y Z);
 | 
			
		||||
use XXX;
 | 
			
		||||
 | 
			
		||||
sub read_file {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my ($file) = @_;
 | 
			
		||||
    
 | 
			
		||||
    eval "require Slic3r::Format::AMF::Parser; 1"
 | 
			
		||||
        or die "AMF parsing requires XML::SAX::ExpatXS\n";
 | 
			
		||||
    
 | 
			
		||||
    open my $fh, '<', $file or die "Failed to open $file\n";
 | 
			
		||||
    
 | 
			
		||||
    my $vertices = [];
 | 
			
		||||
    my $materials = {};
 | 
			
		||||
    my $meshes_by_material = {};
 | 
			
		||||
    XML::SAX::ExpatXS
 | 
			
		||||
        ->new(Handler => Slic3r::Format::AMF::Parser->new(
 | 
			
		||||
            _vertices           => $vertices,
 | 
			
		||||
            _materials          => $materials,
 | 
			
		||||
            _meshes_by_material => $meshes_by_material,
 | 
			
		||||
         ))
 | 
			
		||||
        ->parse_file($fh);
 | 
			
		||||
    
 | 
			
		||||
    close $fh;
 | 
			
		||||
    
 | 
			
		||||
    $_ = Slic3r::TriangleMesh->new(vertices => $vertices, facets => $_)
 | 
			
		||||
        for values %$meshes_by_material;
 | 
			
		||||
    
 | 
			
		||||
    return $materials, $meshes_by_material;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub write_file {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my ($file, $materials, $meshes_by_material) = @_;
 | 
			
		||||
    
 | 
			
		||||
    my %vertices_offset = ();
 | 
			
		||||
    
 | 
			
		||||
    open my $fh, '>', $file;
 | 
			
		||||
    binmode $fh, ':utf8';
 | 
			
		||||
    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}{$_};
 | 
			
		||||
        }
 | 
			
		||||
        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}, ) {
 | 
			
		||||
            printf $fh qq{        <vertex>\n};
 | 
			
		||||
            printf $fh qq{          <coordinates>\n};
 | 
			
		||||
            printf $fh qq{            <x>%s</x>\n}, $vertex->[X];
 | 
			
		||||
            printf $fh qq{            <y>%s</y>\n}, $vertex->[Y];
 | 
			
		||||
            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 1..3;
 | 
			
		||||
            printf $fh qq{        </triangle>\n};
 | 
			
		||||
        }
 | 
			
		||||
        printf $fh qq{      </volume>\n};
 | 
			
		||||
    }
 | 
			
		||||
    printf $fh qq{    </mesh>\n};
 | 
			
		||||
    printf $fh qq{  </object>\n};
 | 
			
		||||
    printf $fh qq{</amf>\n};
 | 
			
		||||
    close $fh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue