mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -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::AboutDialog; | ||||
| use Slic3r::GUI::BedShapeDialog; | ||||
| use Slic3r::GUI::BonjourBrowser; | ||||
| use Slic3r::GUI::ConfigWizard; | ||||
| use Slic3r::GUI::Controller; | ||||
| 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 { | ||||
|                 THIS->do_export(print, path); | ||||
|             } 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) | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ | |||
|             try { | ||||
|                 RETVAL = THIS->process(str, 0); | ||||
|             } catch (std::exception& e) { | ||||
|                 croak(e.what()); | ||||
|                 croak("%s\n", e.what()); | ||||
|             } | ||||
|         %}; | ||||
| 
 | ||||
|  | @ -27,7 +27,7 @@ | |||
|             try { | ||||
|                 RETVAL = THIS->evaluate_boolean_expression(str, THIS->config()); | ||||
|             } catch (std::exception& e) { | ||||
|                 croak(e.what()); | ||||
|                 croak("%s\n", e.what()); | ||||
|             } | ||||
|         %};         | ||||
| }; | ||||
|  |  | |||
|  | @ -212,7 +212,7 @@ _constant() | |||
|             try { | ||||
|                 RETVAL = THIS->output_filepath(path); | ||||
|             } 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