From 0673389009ff1b9fccaf765170afe6990aa363a1 Mon Sep 17 00:00:00 2001 From: Joseph Lenox Date: Thu, 23 Jun 2016 19:10:36 -0500 Subject: [PATCH] Adds Smoothieware flavor to Gcode, to avoid some weirdness in the new motion controls. Avoids resetting extrusion axis after firmware retract (still resets after unretract) with smoothieware. --- README.md | 2 +- lib/Slic3r/Config.pm | 2 +- slic3r.pl | 2 +- xs/src/libslic3r/GCode.cpp | 6 ++++-- xs/src/libslic3r/GCodeWriter.cpp | 4 ++-- xs/src/libslic3r/PrintConfig.cpp | 2 ++ xs/src/libslic3r/PrintConfig.hpp | 3 ++- 7 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7747bbd63..0d29eec56 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ The author of the Silk icon set is Mark James. (default: 100,100) --z-offset Additional height in mm to add to vertical coordinates (+/-, default: 0) - --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/no-extrusion, + --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/smoothie/no-extrusion, default: reprap) --use-relative-e-distances Enable this to get relative E values (default: no) --use-firmware-retraction Enable firmware-controlled retraction using G10/G11 (default: no) diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index a98565b83..559833987 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -236,7 +236,7 @@ sub validate { if !first { $_ eq $self->gcode_flavor } @{$Options->{gcode_flavor}{values}}; die "--use-firmware-retraction is only supported by Marlin firmware\n" - if $self->use_firmware_retraction && $self->gcode_flavor ne 'reprap' && $self->gcode_flavor ne 'machinekit'; + if $self->use_firmware_retraction && $self->gcode_flavor ne 'smoothie' && $self->gcode_flavor ne 'reprap' && $self->gcode_flavor ne 'machinekit'; die "--use-firmware-retraction is not compatible with --wipe\n" if $self->use_firmware_retraction && first {$_} @{$self->wipe}; diff --git a/slic3r.pl b/slic3r.pl index cc6192641..c634e7272 100755 --- a/slic3r.pl +++ b/slic3r.pl @@ -296,7 +296,7 @@ $j (default: 100,100) --z-offset Additional height in mm to add to vertical coordinates (+/-, default: $config->{z_offset}) - --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/no-extrusion, + --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/machinekit/smoothie/no-extrusion, default: $config->{gcode_flavor}) --use-relative-e-distances Enable this to get relative E values (default: no) --use-firmware-retraction Enable firmware-controlled retraction using G10/G11 (default: no) diff --git a/xs/src/libslic3r/GCode.cpp b/xs/src/libslic3r/GCode.cpp index 0b62382b3..32787d765 100644 --- a/xs/src/libslic3r/GCode.cpp +++ b/xs/src/libslic3r/GCode.cpp @@ -4,6 +4,8 @@ #include #include +#define FLAVOR_IS(val) this->config.gcode_flavor == val + namespace Slic3r { AvoidCrossingPerimeters::AvoidCrossingPerimeters() @@ -700,8 +702,8 @@ GCode::retract(bool toolchange) methods even if we performed wipe, since this will ensure the entire retraction length is honored in case wipe path was too short. */ gcode += toolchange ? this->writer.retract_for_toolchange() : this->writer.retract(); - - gcode += this->writer.reset_e(); + if (!(FLAVOR_IS(gcfSmoothie) && this->config.use_firmware_retraction)) + gcode += this->writer.reset_e(); if (this->writer.extruder()->retract_length() > 0 || this->config.use_firmware_retraction) gcode += this->writer.lift(); diff --git a/xs/src/libslic3r/GCodeWriter.cpp b/xs/src/libslic3r/GCodeWriter.cpp index bb5221877..d256ab2af 100644 --- a/xs/src/libslic3r/GCodeWriter.cpp +++ b/xs/src/libslic3r/GCodeWriter.cpp @@ -54,7 +54,7 @@ GCodeWriter::preamble() gcode << "G21 ; set units to millimeters\n"; gcode << "G90 ; use absolute coordinates\n"; } - if (FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfTeacup)) { + if (FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfSmoothie)) { if (this->config.use_relative_e_distances) { gcode << "M83 ; use relative distances for extrusion\n"; } else { @@ -441,7 +441,7 @@ GCodeWriter::_retract(double length, double restart_extra, const std::string &co length = length * area; restart_extra = restart_extra * area; } - + double dE = this->_extruder->retract(length, restart_extra); if (dE != 0) { if (this->config.use_firmware_retraction) { diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index 47609aaff..ea745fc18 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -468,6 +468,7 @@ PrintConfigDef::PrintConfigDef() def->enum_values.push_back("sailfish"); def->enum_values.push_back("mach3"); def->enum_values.push_back("machinekit"); + def->enum_values.push_back("smoothie"); def->enum_values.push_back("no-extrusion"); def->enum_labels.push_back("RepRap (Marlin/Sprinter/Repetier)"); def->enum_labels.push_back("Teacup"); @@ -475,6 +476,7 @@ PrintConfigDef::PrintConfigDef() def->enum_labels.push_back("Sailfish (MakerBot)"); def->enum_labels.push_back("Mach3/LinuxCNC"); def->enum_labels.push_back("Machinekit"); + def->enum_labels.push_back("Smoothieware"); def->enum_labels.push_back("No extrusion"); def->default_value = new ConfigOptionEnum(gcfRepRap); diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index 1492e61e8..63a8f5329 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -9,7 +9,7 @@ namespace Slic3r { enum GCodeFlavor { - gcfRepRap, gcfTeacup, gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, gcfNoExtrusion, + gcfRepRap, gcfTeacup, gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, gcfNoExtrusion, gcfSmoothie, }; enum InfillPattern { @@ -34,6 +34,7 @@ template<> inline t_config_enum_values ConfigOptionEnum::get_enum_v keys_map["mach3"] = gcfMach3; keys_map["machinekit"] = gcfMachinekit; keys_map["no-extrusion"] = gcfNoExtrusion; + keys_map["smoothie"] = gcfSmoothie; return keys_map; }