mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Read OBJ and AMF
This commit is contained in:
		
							parent
							
								
									a821eb7f3c
								
							
						
					
					
						commit
						4c96a52012
					
				
					 3 changed files with 27 additions and 8 deletions
				
			
		|  | @ -20,6 +20,7 @@ sub start_element { | ||||||
|      |      | ||||||
|     if ($data->{LocalName} eq 'object') { |     if ($data->{LocalName} eq 'object') { | ||||||
|         $self->{_object} = $self->{_model}->add_object; |         $self->{_object} = $self->{_model}->add_object; | ||||||
|  |         $self->{_object_vertices} = []; | ||||||
|         $self->{_objects_map}{ $self->_get_attribute($data, 'id') } = $#{ $self->{_model}->objects }; |         $self->{_objects_map}{ $self->_get_attribute($data, 'id') } = $#{ $self->{_model}->objects }; | ||||||
|     } elsif ($data->{LocalName} eq 'vertex') { |     } elsif ($data->{LocalName} eq 'vertex') { | ||||||
|         $self->{_vertex} = ["", "", ""]; |         $self->{_vertex} = ["", "", ""]; | ||||||
|  | @ -28,7 +29,9 @@ sub start_element { | ||||||
|     } elsif ($data->{LocalName} eq 'volume') { |     } elsif ($data->{LocalName} eq 'volume') { | ||||||
|         $self->{_volume} = $self->{_object}->add_volume( |         $self->{_volume} = $self->{_object}->add_volume( | ||||||
|             material_id => $self->_get_attribute($data, 'materialid') // undef, |             material_id => $self->_get_attribute($data, 'materialid') // undef, | ||||||
|  |             mesh        => Slic3r::TriangleMesh->new, | ||||||
|         ); |         ); | ||||||
|  |         $self->{_volume_facets} = []; | ||||||
|     } elsif ($data->{LocalName} eq 'triangle') { |     } elsif ($data->{LocalName} eq 'triangle') { | ||||||
|         $self->{_triangle} = ["", "", ""]; |         $self->{_triangle} = ["", "", ""]; | ||||||
|     } elsif ($self->{_triangle} && $data->{LocalName} =~ /^v([123])$/ && $self->{_tree}[-1] eq 'triangle') { |     } elsif ($self->{_triangle} && $data->{LocalName} =~ /^v([123])$/ && $self->{_tree}[-1] eq 'triangle') { | ||||||
|  | @ -75,15 +78,19 @@ sub end_element { | ||||||
|      |      | ||||||
|     if ($data->{LocalName} eq 'object') { |     if ($data->{LocalName} eq 'object') { | ||||||
|         $self->{_object} = undef; |         $self->{_object} = undef; | ||||||
|  |         $self->{_object_vertices} = undef; | ||||||
|     } elsif ($data->{LocalName} eq 'vertex') { |     } elsif ($data->{LocalName} eq 'vertex') { | ||||||
|         push @{$self->{_object}->vertices}, $self->{_vertex}; |         push @{$self->{_object_vertices}}, $self->{_vertex}; | ||||||
|         $self->{_vertex} = undef; |         $self->{_vertex} = undef; | ||||||
|     } elsif ($self->{_coordinate} && $data->{LocalName} =~ /^[xyz]$/) { |     } elsif ($self->{_coordinate} && $data->{LocalName} =~ /^[xyz]$/) { | ||||||
|         $self->{_coordinate} = undef; |         $self->{_coordinate} = undef; | ||||||
|     } elsif ($data->{LocalName} eq 'volume') { |     } elsif ($data->{LocalName} eq 'volume') { | ||||||
|  |         $self->{_volume}->mesh->ReadFromPerl($self->{_object_vertices}, $self->{_volume_facets}); | ||||||
|  |         $self->{_volume}->mesh->repair; | ||||||
|         $self->{_volume} = undef; |         $self->{_volume} = undef; | ||||||
|  |         $self->{_volume_facets} = undef; | ||||||
|     } elsif ($data->{LocalName} eq 'triangle') { |     } elsif ($data->{LocalName} eq 'triangle') { | ||||||
|         push @{$self->{_volume}->facets}, $self->{_triangle}; |         push @{$self->{_volume_facets}}, $self->{_triangle}; | ||||||
|         $self->{_triangle} = undef; |         $self->{_triangle} = undef; | ||||||
|     } elsif (defined $self->{_vertex_idx} && $data->{LocalName} =~ /^v[123]$/) { |     } elsif (defined $self->{_vertex_idx} && $data->{LocalName} =~ /^v[123]$/) { | ||||||
|         $self->{_vertex_idx} = undef; |         $self->{_vertex_idx} = undef; | ||||||
|  | @ -113,7 +120,7 @@ sub end_document { | ||||||
|         foreach my $instance (@{ $self->{_instances}{$object_id} }) { |         foreach my $instance (@{ $self->{_instances}{$object_id} }) { | ||||||
|             $self->{_model}->objects->[$new_object_id]->add_instance( |             $self->{_model}->objects->[$new_object_id]->add_instance( | ||||||
|                 rotation => $instance->{rz} || 0, |                 rotation => $instance->{rz} || 0, | ||||||
|                 offset   => [ $instance->{deltax} || 0, $instance->{deltay} || 0 ], |                 offset   => Slic3r::Point->new($instance->{deltax} || 0, $instance->{deltay} || 0), | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -17,9 +17,13 @@ sub read_file { | ||||||
|     } |     } | ||||||
|     close $fh; |     close $fh; | ||||||
|      |      | ||||||
|  |     my $mesh = Slic3r::TriangleMesh->new; | ||||||
|  |     $mesh->ReadFromPerl($vertices, $facets); | ||||||
|  |     $mesh->repair; | ||||||
|  |      | ||||||
|     my $model = Slic3r::Model->new; |     my $model = Slic3r::Model->new; | ||||||
|     my $object = $model->add_object(vertices => $vertices); |     my $object = $model->add_object; | ||||||
|     my $volume = $object->add_volume(facets => $facets); |     my $volume = $object->add_volume(mesh => $mesh); | ||||||
|     return $model; |     return $model; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,7 +25,9 @@ sub merge { | ||||||
|     my $class = shift; |     my $class = shift; | ||||||
|     my @models = @_; |     my @models = @_; | ||||||
|      |      | ||||||
|     my $new_model = $class->new; |     my $new_model = ref($class) | ||||||
|  |         ? $class | ||||||
|  |         : $class->new; | ||||||
|     foreach my $model (@models) { |     foreach my $model (@models) { | ||||||
|         # merge material attributes (should we rename them in case of duplicates?) |         # merge material attributes (should we rename them in case of duplicates?) | ||||||
|         $new_model->set_material($_, { %{$model->materials->{$_}}, %{$model->materials->{$_} || {}} }) |         $new_model->set_material($_, { %{$model->materials->{$_}}, %{$model->materials->{$_} || {}} }) | ||||||
|  | @ -34,14 +36,13 @@ sub merge { | ||||||
|         foreach my $object (@{$model->objects}) { |         foreach my $object (@{$model->objects}) { | ||||||
|             my $new_object = $new_model->add_object( |             my $new_object = $new_model->add_object( | ||||||
|                 input_file          => $object->input_file, |                 input_file          => $object->input_file, | ||||||
|                 vertices            => $object->vertices, |  | ||||||
|                 config              => $object->config, |                 config              => $object->config, | ||||||
|                 layer_height_ranges => $object->layer_height_ranges, |                 layer_height_ranges => $object->layer_height_ranges, | ||||||
|             ); |             ); | ||||||
|              |              | ||||||
|             $new_object->add_volume( |             $new_object->add_volume( | ||||||
|                 material_id         => $_->material_id, |                 material_id         => $_->material_id, | ||||||
|                 facets              => $_->facets, |                 mesh                => $_->mesh->clone, | ||||||
|             ) for @{$object->volumes}; |             ) for @{$object->volumes}; | ||||||
|              |              | ||||||
|             $new_object->add_instance( |             $new_object->add_instance( | ||||||
|  | @ -431,6 +432,13 @@ sub needed_repair { | ||||||
|     return (first { !$_->mesh->needed_repair } @{$self->volumes}) ? 0 : 1; |     return (first { !$_->mesh->needed_repair } @{$self->volumes}) ? 0 : 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | sub mesh_stats { | ||||||
|  |     my $self = shift; | ||||||
|  |      | ||||||
|  |     # TODO: sum values from all volumes | ||||||
|  |     return $self->volumes->[0]->mesh->stats; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| sub print_info { | sub print_info { | ||||||
|     my $self = shift; |     my $self = shift; | ||||||
|      |      | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci