From 2c64c3dd5b4f6d6e135cde1165b246992171d938 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 23 Nov 2014 18:59:18 +0100 Subject: [PATCH] Bugfix: spiral vase was not working when extrusion axis was not E. #2350 --- lib/Slic3r/GCode/Reader.pm | 16 +++++++++++++++- lib/Slic3r/GCode/SpiralVase.pm | 5 +++++ xs/src/libslic3r/GCodeWriter.cpp | 9 +-------- xs/src/libslic3r/PrintConfig.hpp | 11 +++++++++++ xs/xsp/Config.xsp | 3 +++ 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/lib/Slic3r/GCode/Reader.pm b/lib/Slic3r/GCode/Reader.pm index 40d930320..237728d00 100644 --- a/lib/Slic3r/GCode/Reader.pm +++ b/lib/Slic3r/GCode/Reader.pm @@ -1,19 +1,28 @@ package Slic3r::GCode::Reader; use Moo; +has 'config' => (is => 'ro', default => sub { Slic3r::Config::GCode->new }); has 'X' => (is => 'rw', default => sub {0}); has 'Y' => (is => 'rw', default => sub {0}); has 'Z' => (is => 'rw', default => sub {0}); has 'E' => (is => 'rw', default => sub {0}); has 'F' => (is => 'rw', default => sub {0}); +has '_extrusion_axis' => (is => 'rw', default => sub {"E"}); our $Verbose = 0; my @AXES = qw(X Y Z E); +sub apply_print_config { + my ($self, $print_config) = @_; + + $self->config->apply_print_config($print_config); + $self->_extrusion_axis($self->config->get_extrusion_axis); +} + sub clone { my $self = shift; return (ref $self)->new( - map { $_ => $self->$_ } (@AXES, 'F'), + map { $_ => $self->$_ } (@AXES, 'F', '_extrusion_axis'), ); } @@ -32,6 +41,11 @@ sub parse { $command //= ''; my %args = map { /([A-Z])(.*)/; ($1 => $2) } @args; + # convert extrusion axis + if (exists $args{ $self->_extrusion_axis }) { + $args{E} = $args{ $self->_extrusion_axis }; + } + # check motion if ($command =~ /^G[01]$/) { foreach my $axis (@AXES) { diff --git a/lib/Slic3r/GCode/SpiralVase.pm b/lib/Slic3r/GCode/SpiralVase.pm index 4c0f9a467..837e33d16 100644 --- a/lib/Slic3r/GCode/SpiralVase.pm +++ b/lib/Slic3r/GCode/SpiralVase.pm @@ -7,6 +7,11 @@ has 'reader' => (is => 'ro', default => sub { Slic3r::GCode::Reader->new }); use Slic3r::Geometry qw(unscale); +sub BUILD { + my ($self) = @_; + $self->reader->apply_print_config($self->config); +} + sub process_layer { my $self = shift; my ($gcode) = @_; diff --git a/xs/src/libslic3r/GCodeWriter.cpp b/xs/src/libslic3r/GCodeWriter.cpp index 0133c2265..6554de342 100644 --- a/xs/src/libslic3r/GCodeWriter.cpp +++ b/xs/src/libslic3r/GCodeWriter.cpp @@ -29,14 +29,7 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config) { this->config.apply(print_config, true); - - if (FLAVOR_IS(gcfMach3)) { - this->_extrusion_axis = "A"; - } else if (FLAVOR_IS(gcfNoExtrusion)) { - this->_extrusion_axis = ""; - } else { - this->_extrusion_axis = this->config.extrusion_axis; - } + this->_extrusion_axis = this->config.get_extrusion_axis(); } void diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index 058afdc09..9a87ea884 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -372,6 +372,17 @@ class GCodeConfig : public virtual StaticPrintConfig return NULL; }; + + std::string get_extrusion_axis() const + { + if (this->gcode_flavor.value == gcfMach3) { + return "A"; + } else if (this->gcode_flavor.value == gcfNoExtrusion) { + return ""; + } else { + return this->extrusion_axis.value; + } + }; }; class PrintConfig : public GCodeConfig diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp index 1d410062b..d62a3a688 100644 --- a/xs/xsp/Config.xsp +++ b/xs/xsp/Config.xsp @@ -51,6 +51,7 @@ %code{% THIS->apply(*other, true); %}; std::vector get_keys() %code{% THIS->keys(&RETVAL); %}; + std::string get_extrusion_axis(); }; %name{Slic3r::Config::Print} class PrintConfig { @@ -71,6 +72,7 @@ %code{% THIS->apply(*other, true); %}; std::vector get_keys() %code{% THIS->keys(&RETVAL); %}; + std::string get_extrusion_axis(); }; %name{Slic3r::Config::PrintRegion} class PrintRegionConfig { @@ -141,6 +143,7 @@ %code{% THIS->apply(*other, true); %}; std::vector get_keys() %code{% THIS->keys(&RETVAL); %}; + std::string get_extrusion_axis(); }; %package{Slic3r::Config};