mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Merge branch 'master' of https://github.com/prusa3d/Slic3r into gcode_preview
This commit is contained in:
		
						commit
						78d1d83583
					
				
					 7 changed files with 4 additions and 364 deletions
				
			
		|  | @ -9,7 +9,6 @@ use List::Util qw(first); | ||||||
| use Slic3r::GUI::2DBed; | use Slic3r::GUI::2DBed; | ||||||
| use Slic3r::GUI::AboutDialog; | use Slic3r::GUI::AboutDialog; | ||||||
| use Slic3r::GUI::BedShapeDialog; | use Slic3r::GUI::BedShapeDialog; | ||||||
| use Slic3r::GUI::BonjourBrowser; |  | ||||||
| use Slic3r::GUI::ConfigWizard; | use Slic3r::GUI::ConfigWizard; | ||||||
| use Slic3r::GUI::Controller; | use Slic3r::GUI::Controller; | ||||||
| use Slic3r::GUI::Controller::ManualControlDialog; | use Slic3r::GUI::Controller::ManualControlDialog; | ||||||
|  |  | ||||||
|  | @ -1,53 +0,0 @@ | ||||||
| # A tiny dialog to select an OctoPrint device to print to. |  | ||||||
| 
 |  | ||||||
| package Slic3r::GUI::BonjourBrowser; |  | ||||||
| use strict; |  | ||||||
| use warnings; |  | ||||||
| use utf8; |  | ||||||
| 
 |  | ||||||
| use Wx qw(:dialog :id :misc :sizer :choicebook wxTAB_TRAVERSAL); |  | ||||||
| use Wx::Event qw(EVT_CLOSE); |  | ||||||
| use base 'Wx::Dialog'; |  | ||||||
| 
 |  | ||||||
| sub new { |  | ||||||
|     my $class = shift; |  | ||||||
|     my ($parent, $devices) = @_; |  | ||||||
|     my $self = $class->SUPER::new($parent, -1, "Device Browser", wxDefaultPosition, [350,700], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); |  | ||||||
|      |  | ||||||
|     $self->{devices} = $devices; |  | ||||||
|      |  | ||||||
|     # label |  | ||||||
|     my $text = Wx::StaticText->new($self, -1, "Choose an OctoPrint device in your network:", wxDefaultPosition, wxDefaultSize); |  | ||||||
|      |  | ||||||
|     # selector |  | ||||||
|     $self->{choice} = my $choice = Wx::Choice->new($self, -1, wxDefaultPosition, wxDefaultSize, |  | ||||||
|         [ map $_->name, @{$self->{devices}} ]); |  | ||||||
|      |  | ||||||
|     my $main_sizer = Wx::BoxSizer->new(wxVERTICAL); |  | ||||||
|     $main_sizer->Add($text, 1, wxEXPAND | wxALL, 10); |  | ||||||
|     $main_sizer->Add($choice, 1, wxEXPAND | wxALL, 10); |  | ||||||
|     $main_sizer->Add($self->CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND); |  | ||||||
|      |  | ||||||
|     $self->SetSizer($main_sizer); |  | ||||||
|     $self->SetMinSize($self->GetSize); |  | ||||||
|     $main_sizer->SetSizeHints($self); |  | ||||||
|      |  | ||||||
|     # needed to actually free memory |  | ||||||
|     EVT_CLOSE($self, sub { |  | ||||||
|         $self->EndModal(wxID_OK); |  | ||||||
|         $self->Destroy; |  | ||||||
|     }); |  | ||||||
|      |  | ||||||
|     return $self; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| sub GetValue { |  | ||||||
|     my ($self) = @_; |  | ||||||
|     return $self->{devices}[ $self->{choice}->GetSelection ]->address; |  | ||||||
| } |  | ||||||
| sub GetPort { |  | ||||||
|     my ($self) = @_; |  | ||||||
|     return $self->{devices}[ $self->{choice}->GetSelection ]->port; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 1; |  | ||||||
|  | @ -1,177 +0,0 @@ | ||||||
| # 2D cut in the XZ plane through the toolpaths. |  | ||||||
| # For debugging purposes. |  | ||||||
| 
 |  | ||||||
| package Slic3r::Test::SectionCut; |  | ||||||
| use Moo; |  | ||||||
| 
 |  | ||||||
| use List::Util qw(first min max); |  | ||||||
| use Slic3r::Geometry qw(unscale); |  | ||||||
| use Slic3r::Geometry::Clipper qw(intersection_pl); |  | ||||||
| use SVG; |  | ||||||
| use Slic3r::SVG; |  | ||||||
| 
 |  | ||||||
| has 'print'         => (is => 'ro', required => 1); |  | ||||||
| has 'scale'         => (is => 'ro', default => sub { 30 }); |  | ||||||
| has 'y_percent'     => (is => 'ro', default => sub { 0.5 });  # Y coord of section line expressed as factor |  | ||||||
| has 'line'          => (is => 'rw'); |  | ||||||
| has '_height'       => (is => 'rw'); |  | ||||||
| has '_svg'          => (is => 'rw'); |  | ||||||
| has '_svg_style'    => (is => 'rw', default => sub { {} }); |  | ||||||
| 
 |  | ||||||
| sub BUILD { |  | ||||||
|     my $self = shift; |  | ||||||
|      |  | ||||||
|     # calculate the Y coordinate of the section line |  | ||||||
|     my $bb = $self->print->bounding_box; |  | ||||||
|     my $y = ($bb->y_min + $bb->y_max) * $self->y_percent; |  | ||||||
|      |  | ||||||
|     # store our section line |  | ||||||
|     $self->line(Slic3r::Line->new([ $bb->x_min, $y ], [ $bb->x_max, $y ])); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| sub export_svg { |  | ||||||
|     my $self = shift; |  | ||||||
|     my ($filename) = @_; |  | ||||||
|      |  | ||||||
|     # get bounding box of print and its height |  | ||||||
|     # (Print should return a BoundingBox3 object instead) |  | ||||||
|     my $bb = $self->print->bounding_box; |  | ||||||
|     my $print_size = $bb->size; |  | ||||||
|     $self->_height(max(map $_->print_z, map @{$_->layers}, @{$self->print->objects})); |  | ||||||
|      |  | ||||||
|     # initialize the SVG canvas |  | ||||||
|     $self->_svg(my $svg = SVG->new( |  | ||||||
|         width  => $self->scale * unscale($print_size->x), |  | ||||||
|         height => $self->scale * $self->_height, |  | ||||||
|     )); |  | ||||||
|      |  | ||||||
|     # set default styles |  | ||||||
|     $self->_svg_style->{'stroke-width'}   = 1; |  | ||||||
|     $self->_svg_style->{'fill-opacity'}   = 0.5; |  | ||||||
|     $self->_svg_style->{'stroke-opacity'} = 0.2; |  | ||||||
|      |  | ||||||
|     # plot perimeters |  | ||||||
|     $self->_svg_style->{'stroke'}   = '#EE0000'; |  | ||||||
|     $self->_svg_style->{'fill'}     = '#FF0000'; |  | ||||||
|     $self->_plot_group(sub { map @{$_->perimeters}, @{$_[0]->regions} }); |  | ||||||
|      |  | ||||||
|     # plot infill |  | ||||||
|     $self->_svg_style->{'stroke'}   = '#444444'; |  | ||||||
|     $self->_svg_style->{'fill'}     = '#454545'; |  | ||||||
|     $self->_plot_group(sub { map @{$_->fills}, @{$_[0]->regions} }); |  | ||||||
|      |  | ||||||
|     # plot support material |  | ||||||
|     $self->_svg_style->{'stroke'}   = '#12EF00'; |  | ||||||
|     $self->_svg_style->{'fill'}     = '#22FF00'; |  | ||||||
|     $self->_plot_group(sub { $_[0]->isa('Slic3r::Layer::Support') ? ($_[0]->support_fills) : () }); |  | ||||||
|      |  | ||||||
|     Slic3r::open(\my $fh, '>', $filename); |  | ||||||
|     print $fh $svg->xmlify; |  | ||||||
|     close $fh; |  | ||||||
|     printf "Section cut SVG written to %s\n", $filename; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| sub _plot_group { |  | ||||||
|     my $self = shift; |  | ||||||
|     my ($filter) = @_; |  | ||||||
|      |  | ||||||
|     my $bb = $self->print->bounding_box; |  | ||||||
|     my $g = $self->_svg->group(style => { %{$self->_svg_style} }); |  | ||||||
|      |  | ||||||
|     foreach my $object (@{$self->print->objects}) { |  | ||||||
|         foreach my $copy (@{$object->_shifted_copies}) { |  | ||||||
|             foreach my $layer (@{$object->layers}, @{$object->support_layers}) { |  | ||||||
|                 # get all ExtrusionPath objects |  | ||||||
|                 my @paths = map $_->clone, |  | ||||||
|                     map { ($_->isa('Slic3r::ExtrusionLoop') || $_->isa('Slic3r::ExtrusionPath::Collection')) ? @$_ : $_ } |  | ||||||
|                     grep defined $_, |  | ||||||
|                     $filter->($layer); |  | ||||||
|                  |  | ||||||
|                 # move paths to location of copy |  | ||||||
|                 $_->polyline->translate(@$copy) for @paths; |  | ||||||
|                  |  | ||||||
|                 if (0) { |  | ||||||
|                     # export plan with section line and exit |  | ||||||
|                     require "Slic3r/SVG.pm"; |  | ||||||
|                     Slic3r::SVG::output( |  | ||||||
|                         "line.svg", |  | ||||||
|                         no_arrows       => 1, |  | ||||||
|                         lines           => [ $self->line ], |  | ||||||
|                         red_polylines   => [ map $_->polyline, @paths ], |  | ||||||
|                     ); |  | ||||||
|                     exit; |  | ||||||
|                 } |  | ||||||
|                  |  | ||||||
|                 foreach my $path (@paths) { |  | ||||||
|                     foreach my $line (@{$path->lines}) { |  | ||||||
|                         my @intersections = @{intersection_pl( |  | ||||||
|                             [ $self->line->as_polyline ], |  | ||||||
|                             $line->grow(Slic3r::Geometry::scale $path->width/2), |  | ||||||
|                         )}; |  | ||||||
|                          |  | ||||||
|                         die "Intersection has more than two points!\n" |  | ||||||
|                             if defined first { @$_ > 2 } @intersections; |  | ||||||
|                          |  | ||||||
|                         # turn intersections to lines |  | ||||||
|                         my @lines = map Slic3r::Line->new(@$_), @intersections; |  | ||||||
|                          |  | ||||||
|                         # align intersections to canvas |  | ||||||
|                         $_->translate(-$bb->x_min, 0) for @lines; |  | ||||||
|                          |  | ||||||
|                         # we want lines oriented from left to right in order to draw |  | ||||||
|                         # rectangles correctly |  | ||||||
|                         foreach my $line (@lines) { |  | ||||||
|                             $line->reverse if $line->a->x > $line->b->x; |  | ||||||
|                         } |  | ||||||
|                          |  | ||||||
|                         if ($path->is_bridge) { |  | ||||||
|                             foreach my $line (@lines) { |  | ||||||
|                                 my $radius = $path->width / 2; |  | ||||||
|                                 my $width = unscale abs($line->b->x - $line->a->x); |  | ||||||
|                                 if ((10 * $radius) < $width) { |  | ||||||
|                                     # we're cutting the path in the longitudinal direction, so we've got a rectangle |  | ||||||
|                                     $g->rectangle( |  | ||||||
|                                         'x'         => $self->scale * unscale($line->a->x), |  | ||||||
|                                         'y'         => $self->scale * $self->_y($layer->print_z), |  | ||||||
|                                         'width'     => $self->scale * $width, |  | ||||||
|                                         'height'    => $self->scale * $radius * 2, |  | ||||||
|                                         'rx'        => $self->scale * $radius * 0.35, |  | ||||||
|                                         'ry'        => $self->scale * $radius * 0.35, |  | ||||||
|                                     ); |  | ||||||
|                                 } else { |  | ||||||
|                                     $g->circle( |  | ||||||
|                                         'cx'        => $self->scale * (unscale($line->a->x) + $radius), |  | ||||||
|                                         'cy'        => $self->scale * $self->_y($layer->print_z - $radius), |  | ||||||
|                                         'r'         => $self->scale * $radius, |  | ||||||
|                                     ); |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } else { |  | ||||||
|                             foreach my $line (@lines) { |  | ||||||
|                                 my $height = $path->height; |  | ||||||
|                                 $height = $layer->height if $height == -1; |  | ||||||
|                                 $g->rectangle( |  | ||||||
|                                     'x'         => $self->scale * unscale($line->a->x), |  | ||||||
|                                     'y'         => $self->scale * $self->_y($layer->print_z), |  | ||||||
|                                     'width'     => $self->scale * unscale($line->b->x - $line->a->x), |  | ||||||
|                                     'height'    => $self->scale * $height, |  | ||||||
|                                     'rx'        => $self->scale * $height * 0.5, |  | ||||||
|                                     'ry'        => $self->scale * $height * 0.5, |  | ||||||
|                                 ); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| sub _y { |  | ||||||
|     my $self = shift; |  | ||||||
|     my ($y) = @_; |  | ||||||
|      |  | ||||||
|     return $self->_height - $y; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 1; |  | ||||||
|  | @ -1,129 +0,0 @@ | ||||||
| #!/usr/bin/perl |  | ||||||
| # This script generates section cuts from a given G-Code file |  | ||||||
| 
 |  | ||||||
| use strict; |  | ||||||
| use warnings; |  | ||||||
| 
 |  | ||||||
| BEGIN { |  | ||||||
|     use FindBin; |  | ||||||
|     use lib "$FindBin::Bin/../lib"; |  | ||||||
|     use local::lib "$FindBin::Bin/../local-lib"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| use Getopt::Long qw(:config no_auto_abbrev); |  | ||||||
| use List::Util qw(max); |  | ||||||
| use Slic3r; |  | ||||||
| use Slic3r::Geometry qw(X Y); |  | ||||||
| use Slic3r::Geometry::Clipper qw(JT_SQUARE); |  | ||||||
| use Slic3r::Test; |  | ||||||
| use SVG; |  | ||||||
| 
 |  | ||||||
| my %opt = ( |  | ||||||
|     layer_height    => 0.2, |  | ||||||
|     extrusion_width => 0.5, |  | ||||||
|     scale           => 30, |  | ||||||
| ); |  | ||||||
| { |  | ||||||
|     my %options = ( |  | ||||||
|         'help'                  => sub { usage() }, |  | ||||||
|         'layer-height|h=f'      => \$opt{layer_height}, |  | ||||||
|         'extrusion-width|w=f'   => \$opt{extrusion_width}, |  | ||||||
|         'scale|s=i'             => \$opt{scale}, |  | ||||||
|     ); |  | ||||||
|     GetOptions(%options) or usage(1); |  | ||||||
|     $ARGV[0] or usage(1); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|     my $input_file = $ARGV[0]; |  | ||||||
|     my $output_file = $input_file; |  | ||||||
|     $output_file =~ s/\.(?:gcode|gco|ngc|g)$/.svg/; |  | ||||||
|      |  | ||||||
|     # read paths |  | ||||||
|     my %paths = ();    # z => [ path, path ... ] |  | ||||||
|     Slic3r::GCode::Reader->new->parse(io($input_file)->all, sub { |  | ||||||
|         my ($self, $cmd, $args, $info) = @_; |  | ||||||
|          |  | ||||||
|         if ($cmd eq 'G1' && $info->{extruding}) { |  | ||||||
|             $paths{ $self->Z } ||= []; |  | ||||||
|             push @{ $paths{ $self->Z } }, Slic3r::Line->new( |  | ||||||
|                 [ $self->X, $self->Y ], |  | ||||||
|                 [ $info->{new_X}, $info->{new_Y} ], |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
|      |  | ||||||
|     # calculate print extents |  | ||||||
|     my $bounding_box = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, values %paths ]); |  | ||||||
|      |  | ||||||
|     # calculate section line |  | ||||||
|     my $section_y = $bounding_box->center->[Y]; |  | ||||||
|     my $section_line = [ |  | ||||||
|         [ $bounding_box->x_min, $section_y ], |  | ||||||
|         [ $bounding_box->x_max, $section_y ], |  | ||||||
|     ]; |  | ||||||
|      |  | ||||||
|     # initialize output |  | ||||||
|     my $max_z = max(keys %paths); |  | ||||||
|     my $svg = SVG->new( |  | ||||||
|         width  => $opt{scale} * $bounding_box->size->[X], |  | ||||||
|         height => $opt{scale} * $max_z, |  | ||||||
|     ); |  | ||||||
|      |  | ||||||
|     # put everything into a group |  | ||||||
|     my $g = $svg->group(style => { |  | ||||||
|         'stroke-width'  => 1, |  | ||||||
|         'stroke'        => '#444444', |  | ||||||
|         'fill'          => 'grey', |  | ||||||
|     }); |  | ||||||
|      |  | ||||||
|     # draw paths |  | ||||||
|     foreach my $z (sort keys %paths) { |  | ||||||
|         foreach my $line (@{ $paths{$z} }) { |  | ||||||
|             my @intersections = @{intersection_pl( |  | ||||||
|                 [ $section_line ], |  | ||||||
|                 [ _grow($line, $opt{extrusion_width}/2) ], |  | ||||||
|             )}; |  | ||||||
|              |  | ||||||
|             $g->rectangle( |  | ||||||
|                 'x'         => $opt{scale} * ($_->[0][X] - $bounding_box->x_min), |  | ||||||
|                 'y'         => $opt{scale} * ($max_z - $z), |  | ||||||
|                 'width'     => $opt{scale} * abs($_->[1][X] - $_->[0][X]), |  | ||||||
|                 'height'    => $opt{scale} * $opt{layer_height}, |  | ||||||
|                 'rx'        => $opt{scale} * $opt{layer_height} * 0.35, |  | ||||||
|                 'ry'        => $opt{scale} * $opt{layer_height} * 0.35, |  | ||||||
|             ) for @intersections; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     # write output |  | ||||||
|     Slic3r::open(\my $fh, '>', $output_file); |  | ||||||
|     print $fh $svg->xmlify; |  | ||||||
|     close $fh; |  | ||||||
|     printf "Section cut SVG written to %s\n", $output_file; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # replace built-in Line->grow method which relies on int_offset() |  | ||||||
| sub _grow { |  | ||||||
|     my ($line, $distance) = @_; |  | ||||||
|      |  | ||||||
|     my $polygon = [ @$line, CORE::reverse @$line[1..($#$line-1)] ]; |  | ||||||
|     return @{Math::Clipper::offset([$polygon], $distance, 100000, JT_SQUARE, 2)}; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| sub usage { |  | ||||||
|     my ($exit_code) = @_; |  | ||||||
|      |  | ||||||
|     print <<"EOF"; |  | ||||||
| Usage: gcode_sectioncut.pl [ OPTIONS ] file.gcode |  | ||||||
| 
 |  | ||||||
|     --help              Output this usage screen and exit |  | ||||||
|     --layer-height, -h  Use the specified layer height |  | ||||||
|     --extrusion-width, -w  Use the specified extrusion width |  | ||||||
|     --scale             Factor for converting G-code units to SVG units |  | ||||||
|      |  | ||||||
| EOF |  | ||||||
|     exit ($exit_code || 0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| __END__ |  | ||||||
|  | @ -23,7 +23,7 @@ | ||||||
|             try { |             try { | ||||||
|                 THIS->do_export(print, path); |                 THIS->do_export(print, path); | ||||||
|             } catch (std::exception& e) { |             } catch (std::exception& e) { | ||||||
|                 croak(e.what()); |                 croak("%s\n", e.what()); | ||||||
|             } |             } | ||||||
|         %}; |         %}; | ||||||
|     void do_export_w_preview(Print *print, const char *path, GCodePreviewData *preview_data) |     void do_export_w_preview(Print *print, const char *path, GCodePreviewData *preview_data) | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ | ||||||
|             try { |             try { | ||||||
|                 RETVAL = THIS->process(str, 0); |                 RETVAL = THIS->process(str, 0); | ||||||
|             } catch (std::exception& e) { |             } catch (std::exception& e) { | ||||||
|                 croak(e.what()); |                 croak("%s\n", e.what()); | ||||||
|             } |             } | ||||||
|         %}; |         %}; | ||||||
| 
 | 
 | ||||||
|  | @ -27,7 +27,7 @@ | ||||||
|             try { |             try { | ||||||
|                 RETVAL = THIS->evaluate_boolean_expression(str, THIS->config()); |                 RETVAL = THIS->evaluate_boolean_expression(str, THIS->config()); | ||||||
|             } catch (std::exception& e) { |             } catch (std::exception& e) { | ||||||
|                 croak(e.what()); |                 croak("%s\n", e.what()); | ||||||
|             } |             } | ||||||
|         %};         |         %};         | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -212,7 +212,7 @@ _constant() | ||||||
|             try { |             try { | ||||||
|                 RETVAL = THIS->output_filepath(path); |                 RETVAL = THIS->output_filepath(path); | ||||||
|             } catch (std::exception& e) { |             } catch (std::exception& e) { | ||||||
|                 croak(e.what()); |                 croak("%s\n", e.what()); | ||||||
|             } |             } | ||||||
|         %}; |         %}; | ||||||
|      |      | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri