mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Port PrintRegion::flow() and LayerRegion.flow() to XS
This commit is contained in:
		
							parent
							
								
									380dd8adfc
								
							
						
					
					
						commit
						7ff13c063f
					
				
					 11 changed files with 80 additions and 85 deletions
				
			
		|  | @ -68,7 +68,6 @@ use Slic3r::Polygon; | |||
| use Slic3r::Polyline; | ||||
| use Slic3r::Print; | ||||
| use Slic3r::Print::Object; | ||||
| use Slic3r::Print::Region; | ||||
| use Slic3r::Print::Simple; | ||||
| use Slic3r::Print::SupportMaterial; | ||||
| use Slic3r::Surface; | ||||
|  |  | |||
|  | @ -209,7 +209,7 @@ sub make_fill { | |||
|             $h, | ||||
|             $is_bridge, | ||||
|             $layerm->id == 0, | ||||
|             undef, | ||||
|             -1, | ||||
|             $layerm->object, | ||||
|         ); | ||||
|          | ||||
|  |  | |||
|  | @ -28,18 +28,6 @@ sub print   { return $_[0]->layer->print; } | |||
| 
 | ||||
| sub config  { return $_[0]->region->config; } | ||||
| 
 | ||||
| sub flow { | ||||
|     my ($self, $role, $bridge, $width) = @_; | ||||
|     return $self->region->flow( | ||||
|         $role, | ||||
|         $self->layer->height, | ||||
|         $bridge // 0, | ||||
|         $self->layer->id == 0, | ||||
|         $width, | ||||
|         $self->object, | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| sub merge_slices { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|  | @ -67,7 +55,7 @@ sub make_perimeters { | |||
|     my $ext_pspacing        = scale($ext_perimeter_flow->spacing_to($perimeter_flow)); | ||||
|      | ||||
|     # overhang perimeters | ||||
|     my $overhang_flow       = $self->region->flow(FLOW_ROLE_PERIMETER, -1, 1, 0, undef, $self->layer->object); | ||||
|     my $overhang_flow       = $self->region->flow(FLOW_ROLE_PERIMETER, -1, 1, 0, -1, $self->layer->object); | ||||
|     my $mm3_per_mm_overhang = $overhang_flow->mm3_per_mm; | ||||
|      | ||||
|     # solid infill | ||||
|  |  | |||
|  | @ -737,20 +737,20 @@ sub write_gcode { | |||
|     my $layer_height = $first_object->config->layer_height; | ||||
|     for my $region_id (0..$#{$self->regions}) { | ||||
|         printf $fh "; external perimeters extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_EXTERNAL_PERIMETER, $layer_height, 0, 0, undef, $first_object)->width; | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_EXTERNAL_PERIMETER, $layer_height, 0, 0, -1, $first_object)->width; | ||||
|         printf $fh "; perimeters extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 0, undef, $first_object)->width; | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 0, -1, $first_object)->width; | ||||
|         printf $fh "; infill extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_INFILL, $layer_height, 0, 0, undef, $first_object)->width; | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_INFILL, $layer_height, 0, 0, -1, $first_object)->width; | ||||
|         printf $fh "; solid infill extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_SOLID_INFILL, $layer_height, 0, 0, undef, $first_object)->width; | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_SOLID_INFILL, $layer_height, 0, 0, -1, $first_object)->width; | ||||
|         printf $fh "; top infill extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_TOP_SOLID_INFILL, $layer_height, 0, 0, undef, $first_object)->width; | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_TOP_SOLID_INFILL, $layer_height, 0, 0, -1, $first_object)->width; | ||||
|         printf $fh "; support material extrusion width = %.2fmm\n", | ||||
|             $self->objects->[0]->support_material_flow->width | ||||
|             if $self->has_support_material; | ||||
|         printf $fh "; first layer extrusion width = %.2fmm\n", | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 1, undef, $self->objects->[0])->width | ||||
|             $self->regions->[$region_id]->flow(FLOW_ROLE_PERIMETER, $layer_height, 0, 1, -1, $self->objects->[0])->width | ||||
|             if $self->regions->[$region_id]->config->first_layer_extrusion_width; | ||||
|         print  $fh "\n"; | ||||
|     } | ||||
|  |  | |||
|  | @ -1,63 +0,0 @@ | |||
| package Slic3r::Print::Region; | ||||
| use strict; | ||||
| use warnings; | ||||
| 
 | ||||
| use Slic3r::Extruder ':roles'; | ||||
| use Slic3r::Flow ':roles'; | ||||
| 
 | ||||
| # A Print::Region object represents a group of volumes to print | ||||
| # sharing the same config (including the same assigned extruder(s)) | ||||
| 
 | ||||
| sub flow { | ||||
|     my ($self, $role, $layer_height, $bridge, $first_layer, $width, $object) = @_; | ||||
|      | ||||
|     $bridge         //= 0; | ||||
|     $first_layer    //= 0; | ||||
|      | ||||
|     # use the supplied custom width, if any | ||||
|     my $config_width = $width; | ||||
|     if (!defined $config_width) { | ||||
|         # get extrusion width from configuration | ||||
|         # (might be an absolute value, or a percent value, or zero for auto) | ||||
|         if ($first_layer && $self->print->config->first_layer_extrusion_width) { | ||||
|             $config_width = $self->print->config->first_layer_extrusion_width; | ||||
|         } elsif ($role == FLOW_ROLE_EXTERNAL_PERIMETER) { | ||||
|             $config_width = $self->config->external_perimeter_extrusion_width; | ||||
|         } elsif ($role == FLOW_ROLE_PERIMETER) { | ||||
|             $config_width = $self->config->perimeter_extrusion_width; | ||||
|         } elsif ($role == FLOW_ROLE_INFILL) { | ||||
|             $config_width = $self->config->infill_extrusion_width; | ||||
|         } elsif ($role == FLOW_ROLE_SOLID_INFILL) { | ||||
|             $config_width = $self->config->solid_infill_extrusion_width; | ||||
|         } elsif ($role == FLOW_ROLE_TOP_SOLID_INFILL) { | ||||
|             $config_width = $self->config->top_infill_extrusion_width; | ||||
|         } else { | ||||
|             die "Unknown role $role"; | ||||
|         } | ||||
|     } | ||||
|     if ($config_width eq '0') { | ||||
|         $config_width = $object->config->extrusion_width; | ||||
|     } | ||||
|      | ||||
|     # get the configured nozzle_diameter for the extruder associated | ||||
|     # to the flow role requested | ||||
|     my $extruder;  # 1-based | ||||
|     if ($role == FLOW_ROLE_PERIMETER || $role == FLOW_ROLE_EXTERNAL_PERIMETER) { | ||||
|         $extruder = $self->config->perimeter_extruder; | ||||
|     } elsif ($role == FLOW_ROLE_INFILL || $role == FLOW_ROLE_SOLID_INFILL || $role == FLOW_ROLE_TOP_SOLID_INFILL) { | ||||
|         $extruder = $self->config->infill_extruder; | ||||
|     } else { | ||||
|         die "Unknown role $role"; | ||||
|     } | ||||
|     my $nozzle_diameter = $self->print->config->get_at('nozzle_diameter', $extruder-1); | ||||
|      | ||||
|     return Slic3r::Flow->new_from_width( | ||||
|         width               => $config_width, | ||||
|         role                => $role, | ||||
|         nozzle_diameter     => $nozzle_diameter, | ||||
|         layer_height        => $layer_height, | ||||
|         bridge_flow_ratio   => ($bridge ? $self->config->bridge_flow_ratio : 0), | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
|  | @ -28,6 +28,19 @@ LayerRegion::region() | |||
|     return this->_region; | ||||
| } | ||||
| 
 | ||||
| Flow | ||||
| LayerRegion::flow(FlowRole role, bool bridge, double width) const | ||||
| { | ||||
|     return this->_region->flow( | ||||
|         role, | ||||
|         this->_layer->height, | ||||
|         bridge, | ||||
|         this->_layer->id() == 0, | ||||
|         width, | ||||
|         *this->_layer->object() | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| #ifdef SLIC3RXS | ||||
| REGISTER_CLASS(LayerRegion, "Layer::Region"); | ||||
| #endif | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| #define slic3r_Layer_hpp_ | ||||
| 
 | ||||
| #include <myinit.h> | ||||
| #include "Flow.hpp" | ||||
| #include "SurfaceCollection.hpp" | ||||
| #include "ExtrusionEntityCollection.hpp" | ||||
| #include "ExPolygonCollection.hpp" | ||||
|  | @ -50,6 +51,8 @@ class LayerRegion | |||
|     // ordered collection of extrusion paths to fill surfaces
 | ||||
|     ExtrusionEntityCollection fills; | ||||
|      | ||||
|     Flow flow(FlowRole role, bool bridge = false, double width = -1) const; | ||||
|      | ||||
|     private: | ||||
|     Layer *_layer; | ||||
|     PrintRegion *_region; | ||||
|  |  | |||
|  | @ -60,6 +60,52 @@ PrintRegion::print() | |||
|     return this->_print; | ||||
| } | ||||
| 
 | ||||
| Flow | ||||
| PrintRegion::flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, const PrintObject &object) const | ||||
| { | ||||
|     ConfigOptionFloatOrPercent config_width; | ||||
|     if (width != -1) { | ||||
|         // use the supplied custom width, if any
 | ||||
|         config_width.value = width; | ||||
|         config_width.percent = false; | ||||
|     } else { | ||||
|         // otherwise, get extrusion width from configuration
 | ||||
|         // (might be an absolute value, or a percent value, or zero for auto)
 | ||||
|         if (first_layer && this->_print->config.first_layer_extrusion_width.value > 0) { | ||||
|             config_width = this->_print->config.first_layer_extrusion_width; | ||||
|         } else if (role == frExternalPerimeter) { | ||||
|             config_width = this->config.external_perimeter_extrusion_width; | ||||
|         } else if (role == frPerimeter) { | ||||
|             config_width = this->config.perimeter_extrusion_width; | ||||
|         } else if (role == frInfill) { | ||||
|             config_width = this->config.infill_extrusion_width; | ||||
|         } else if (role == frSolidInfill) { | ||||
|             config_width = this->config.solid_infill_extrusion_width; | ||||
|         } else if (role == frTopSolidInfill) { | ||||
|             config_width = this->config.top_infill_extrusion_width; | ||||
|         } else { | ||||
|             CONFESS("Unknown role"); | ||||
|         } | ||||
|     } | ||||
|     if (config_width.value == 0) { | ||||
|         config_width = object.config.extrusion_width; | ||||
|     } | ||||
|      | ||||
|     // get the configured nozzle_diameter for the extruder associated
 | ||||
|     // to the flow role requested
 | ||||
|     size_t extruder;  // 1-based
 | ||||
|     if (role == frPerimeter || role == frExternalPerimeter) { | ||||
|         extruder = this->config.perimeter_extruder; | ||||
|     } else if (role == frInfill || role == frSolidInfill || role == frTopSolidInfill) { | ||||
|         extruder = this->config.infill_extruder; | ||||
|     } else { | ||||
|         CONFESS("Unknown role $role"); | ||||
|     } | ||||
|     double nozzle_diameter = this->_print->config.nozzle_diameter.get_at(extruder-1); | ||||
|      | ||||
|     return Flow::new_from_config_width(role, config_width, nozzle_diameter, layer_height, bridge ? this->config.bridge_flow_ratio : 0); | ||||
| } | ||||
| 
 | ||||
| #ifdef SLIC3RXS | ||||
| REGISTER_CLASS(PrintRegion, "Print::Region"); | ||||
| #endif | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| #include <myinit.h> | ||||
| #include <set> | ||||
| #include <vector> | ||||
| #include "Flow.hpp" | ||||
| #include "PrintConfig.hpp" | ||||
| #include "Point.hpp" | ||||
| #include "Layer.hpp" | ||||
|  | @ -13,6 +14,7 @@ | |||
| namespace Slic3r { | ||||
| 
 | ||||
| class Print; | ||||
| class PrintObject; | ||||
| class ModelObject; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -47,6 +49,7 @@ class PrintRegion | |||
|     PrintRegionConfig config; | ||||
| 
 | ||||
|     Print* print(); | ||||
|     Flow flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, const PrintObject &object) const; | ||||
| 
 | ||||
|     private: | ||||
|     Print* _print; | ||||
|  |  | |||
|  | @ -26,6 +26,9 @@ | |||
|         %code%{ RETVAL = &THIS->perimeters; %}; | ||||
|     Ref<ExtrusionEntityCollection> fills() | ||||
|         %code%{ RETVAL = &THIS->fills; %}; | ||||
|      | ||||
|     Flow* flow(FlowRole role, bool bridge = false, double width = -1) | ||||
|         %code%{ RETVAL = new Flow(THIS->flow(role, bridge, width)); %}; | ||||
| }; | ||||
| 
 | ||||
| %name{Slic3r::Layer} class Layer { | ||||
|  |  | |||
|  | @ -34,6 +34,9 @@ _constant() | |||
|     Ref<PrintRegionConfig> config() | ||||
|         %code%{ RETVAL = &THIS->config; %}; | ||||
|     Ref<Print> print(); | ||||
|      | ||||
|     Flow* flow(FlowRole role, double layer_height, bool bridge, bool first_layer, double width, PrintObject* object) | ||||
|         %code%{ RETVAL = new Flow(THIS->flow(role, layer_height, bridge, first_layer, width, *object)); %}; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci