From e064fdf17017fc4a51e7e029dc2a8464a4e6d6f2 Mon Sep 17 00:00:00 2001 From: Joseph Lenox Date: Sat, 3 Jun 2017 19:26:58 -0500 Subject: [PATCH] Added notes to beginning of output gcode. Order is Print -> Filament -> Printer. Empty fields should not produce any output. Also a bugfix - Printer notes were implemented as Strings when should have been String. --- lib/Slic3r/Print/GCode.pm | 5 ++-- xs/src/libslic3r/GCode.cpp | 6 +++++ xs/src/libslic3r/GCode.hpp | 1 + xs/src/libslic3r/GCodeWriter.cpp | 46 ++++++++++++++++++++++++++++++-- xs/src/libslic3r/GCodeWriter.hpp | 1 + xs/src/libslic3r/PrintConfig.cpp | 8 ++---- xs/src/libslic3r/PrintConfig.hpp | 12 ++++----- xs/src/libslic3r/utils.cpp | 12 +++++++++ xs/src/libslic3r/utils.hpp | 13 +++++++++ xs/xsp/GCode.xsp | 1 + xs/xsp/GCodeWriter.xsp | 1 + 11 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 xs/src/libslic3r/utils.hpp diff --git a/lib/Slic3r/Print/GCode.pm b/lib/Slic3r/Print/GCode.pm index ea4e9c2f83..63ee242827 100644 --- a/lib/Slic3r/Print/GCode.pm +++ b/lib/Slic3r/Print/GCode.pm @@ -72,9 +72,8 @@ sub export { my @lt = localtime; printf $fh "; generated by Slic3r $Slic3r::VERSION on %04d-%02d-%02d at %02d:%02d:%02d\n\n", $lt[5] + 1900, $lt[4]+1, $lt[3], $lt[2], $lt[1], $lt[0]; - # Write notes (content of the Print Settings tab -> Notes) - print $fh "; $_\n" foreach split /\R/, $self->config->notes; - print $fh "\n" if $self->config->notes; + # Write notes (content of all Settings tabs -> Notes) + print $fh $gcodegen->notes; # Write some terse information on the slicing parameters. my $first_object = $self->objects->[0]; my $layer_height = $first_object->config->layer_height; diff --git a/xs/src/libslic3r/GCode.cpp b/xs/src/libslic3r/GCode.cpp index f55ab59ec2..78c40afa2c 100644 --- a/xs/src/libslic3r/GCode.cpp +++ b/xs/src/libslic3r/GCode.cpp @@ -262,6 +262,12 @@ GCode::set_origin(const Pointf &pointf) this->origin = pointf; } +std::string +GCode::notes() +{ + return this->writer.notes(); +} + std::string GCode::preamble() { diff --git a/xs/src/libslic3r/GCode.hpp b/xs/src/libslic3r/GCode.hpp index 715af4d4c5..adf81ed0bf 100644 --- a/xs/src/libslic3r/GCode.hpp +++ b/xs/src/libslic3r/GCode.hpp @@ -100,6 +100,7 @@ class GCode { void set_extruders(const std::vector &extruder_ids); void set_origin(const Pointf &pointf); std::string preamble(); + std::string notes(); std::string change_layer(const Layer &layer); std::string extrude(const ExtrusionEntity &entity, std::string description = "", double speed = -1); std::string extrude(ExtrusionLoop loop, std::string description = "", double speed = -1); diff --git a/xs/src/libslic3r/GCodeWriter.cpp b/xs/src/libslic3r/GCodeWriter.cpp index e37be81816..de199c5a4c 100644 --- a/xs/src/libslic3r/GCodeWriter.cpp +++ b/xs/src/libslic3r/GCodeWriter.cpp @@ -1,4 +1,5 @@ #include "GCodeWriter.hpp" +#include "utils.hpp" #include #include #include @@ -32,11 +33,51 @@ GCodeWriter::set_extruders(const std::vector &extruder_ids) this->multiple_extruders = (*std::max_element(extruder_ids.begin(), extruder_ids.end())) > 0; } +std::string +GCodeWriter::notes() +{ + std::ostringstream gcode; + + // Write the contents of the three notes sections + // a semicolon at the beginning of each line. + if (this->config.notes.getString().size() > 0) { + gcode << "; Print Config Notes: \n"; + std::vector temp_line = split_at_regex(this->config.notes.getString(),"\n"); + for (auto j = temp_line.cbegin(); j != temp_line.cend(); j++) { + gcode << "; " << *j << "\n"; + } + gcode << "; \n"; + } + + for (auto i = this->config.filament_notes.values.cbegin(); i != this->config.filament_notes.values.cend(); i++) { + if (i->size() > 0) { + gcode << "; Filament notes: \n"; + std::vector temp_line = split_at_regex(*i,"\n"); + for (auto j = temp_line.cbegin(); j != temp_line.cend(); j++) { + gcode << "; " << *j << "\n"; + } + gcode << "; \n"; + } + } + + if (this->config.printer_notes.getString().size() > 0) { + gcode << "; Printer Config Notes: \n"; + std::vector temp_line = split_at_regex(this->config.printer_notes.getString(),"\n"); + for (auto j = temp_line.cbegin(); j != temp_line.cend(); j++) { + gcode << "; " << *j << "\n"; + } + gcode << "; \n"; + } + + return gcode.str(); +} + + std::string GCodeWriter::preamble() { std::ostringstream gcode; - + if (FLAVOR_IS_NOT(gcfMakerWare)) { gcode << "G21 ; set units to millimeters\n"; gcode << "G90 ; use absolute coordinates\n"; @@ -49,7 +90,8 @@ GCodeWriter::preamble() } gcode << this->reset_e(true); } - + + return gcode.str(); } diff --git a/xs/src/libslic3r/GCodeWriter.hpp b/xs/src/libslic3r/GCodeWriter.hpp index cd1eab008e..e9eff2e05a 100644 --- a/xs/src/libslic3r/GCodeWriter.hpp +++ b/xs/src/libslic3r/GCodeWriter.hpp @@ -23,6 +23,7 @@ public: std::string extrusion_axis() const { return this->_extrusion_axis; } void apply_print_config(const PrintConfig &print_config); void set_extruders(const std::vector &extruder_ids); + std::string notes(); std::string preamble(); std::string postamble() const; std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1) const; diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index ce149a8fcd..2b4f220c8a 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -924,18 +924,14 @@ PrintConfigDef::PrintConfigDef() def->height = 60; def->default_value = new ConfigOptionStrings(); - def = this->add("printer_notes", coStrings); + def = this->add("printer_notes", coString); def->label = "Printer notes"; def->tooltip = "You can put your notes regarding the printer here."; def->cli = "printer-notes=s@"; def->multiline = true; def->full_width = true; def->height = 130; - { - ConfigOptionStrings* opt = new ConfigOptionStrings(); - opt->values.push_back(""); - def->default_value = opt; - } + def->default_value = new ConfigOptionString(""); def = this->add("print_settings_id", coString); def->default_value = new ConfigOptionString(""); diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index 856e5def19..ae4a46fbff 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -301,12 +301,15 @@ class GCodeConfig : public virtual StaticPrintConfig ConfigOptionFloats filament_density; ConfigOptionFloats filament_cost; ConfigOptionFloats filament_max_volumetric_speed; + ConfigOptionStrings filament_notes; ConfigOptionBool gcode_comments; ConfigOptionEnum gcode_flavor; ConfigOptionString layer_gcode; ConfigOptionFloat max_print_speed; ConfigOptionFloat max_volumetric_speed; + ConfigOptionString notes; ConfigOptionFloat pressure_advance; + ConfigOptionString printer_notes; ConfigOptionFloats retract_length; ConfigOptionFloats retract_length_toolchange; ConfigOptionFloats retract_lift; @@ -339,12 +342,15 @@ class GCodeConfig : public virtual StaticPrintConfig OPT_PTR(filament_density); OPT_PTR(filament_cost); OPT_PTR(filament_max_volumetric_speed); + OPT_PTR(filament_notes); OPT_PTR(gcode_comments); OPT_PTR(gcode_flavor); OPT_PTR(layer_gcode); OPT_PTR(max_print_speed); OPT_PTR(max_volumetric_speed); + OPT_PTR(notes); OPT_PTR(pressure_advance); + OPT_PTR(printer_notes); OPT_PTR(retract_length); OPT_PTR(retract_length_toolchange); OPT_PTR(retract_lift); @@ -399,7 +405,6 @@ class PrintConfig : public GCodeConfig ConfigOptionBool fan_always_on; ConfigOptionInt fan_below_layer_time; ConfigOptionStrings filament_colour; - ConfigOptionStrings filament_notes; ConfigOptionFloat first_layer_acceleration; ConfigOptionInt first_layer_bed_temperature; ConfigOptionFloatOrPercent first_layer_extrusion_width; @@ -413,14 +418,12 @@ class PrintConfig : public GCodeConfig ConfigOptionInt min_fan_speed; ConfigOptionFloat min_print_speed; ConfigOptionFloat min_skirt_length; - ConfigOptionString notes; ConfigOptionFloats nozzle_diameter; ConfigOptionBool only_retract_when_crossing_perimeters; ConfigOptionBool ooze_prevention; ConfigOptionString output_filename_format; ConfigOptionFloat perimeter_acceleration; ConfigOptionStrings post_process; - ConfigOptionStrings printer_notes; ConfigOptionFloat resolution; ConfigOptionFloats retract_before_travel; ConfigOptionBools retract_layer_change; @@ -462,7 +465,6 @@ class PrintConfig : public GCodeConfig OPT_PTR(fan_always_on); OPT_PTR(fan_below_layer_time); OPT_PTR(filament_colour); - OPT_PTR(filament_notes); OPT_PTR(first_layer_acceleration); OPT_PTR(first_layer_bed_temperature); OPT_PTR(first_layer_extrusion_width); @@ -476,14 +478,12 @@ class PrintConfig : public GCodeConfig OPT_PTR(min_fan_speed); OPT_PTR(min_print_speed); OPT_PTR(min_skirt_length); - OPT_PTR(notes); OPT_PTR(nozzle_diameter); OPT_PTR(only_retract_when_crossing_perimeters); OPT_PTR(ooze_prevention); OPT_PTR(output_filename_format); OPT_PTR(perimeter_acceleration); OPT_PTR(post_process); - OPT_PTR(printer_notes); OPT_PTR(resolution); OPT_PTR(retract_before_travel); OPT_PTR(retract_layer_change); diff --git a/xs/src/libslic3r/utils.cpp b/xs/src/libslic3r/utils.cpp index 3f3ed326b5..4c20f7654b 100644 --- a/xs/src/libslic3r/utils.cpp +++ b/xs/src/libslic3r/utils.cpp @@ -1,4 +1,6 @@ #include +#include "utils.hpp" +#include void confess_at(const char *file, int line, const char *func, @@ -26,3 +28,13 @@ confess_at(const char *file, int line, const char *func, LEAVE; #endif } + +std::vector +split_at_regex(const std::string& input, const std::string& regex) { + // passing -1 as the submatch index parameter performs splitting + std::regex re(regex); + std::sregex_token_iterator + first{input.begin(), input.end(), re, -1}, + last; + return {first, last}; +} diff --git a/xs/src/libslic3r/utils.hpp b/xs/src/libslic3r/utils.hpp new file mode 100644 index 0000000000..382ca53b24 --- /dev/null +++ b/xs/src/libslic3r/utils.hpp @@ -0,0 +1,13 @@ +#ifndef UTILS_HPP +#define UTILS_HPP + +#include +#include + +/// Utility functions that aren't necessarily part of libslic3r but are used by it. + +/// Separate a string based on some regular expression string. +std::vector +split_at_regex(const std::string& input, const std::string& regex); + +#endif // UTILS_HPP diff --git a/xs/xsp/GCode.xsp b/xs/xsp/GCode.xsp index f73ca44426..47101b7c0b 100644 --- a/xs/xsp/GCode.xsp +++ b/xs/xsp/GCode.xsp @@ -181,6 +181,7 @@ void set_origin(Pointf* pointf) %code{% THIS->set_origin(*pointf); %}; std::string preamble(); + std::string notes(); std::string change_layer(Layer* layer) %code{% RETVAL = THIS->change_layer(*layer); %}; %name{extrude_loop} std::string extrude(ExtrusionLoop* loop, std::string description = "", double speed = -1) diff --git a/xs/xsp/GCodeWriter.xsp b/xs/xsp/GCodeWriter.xsp index a51e3a44b9..1cd8ab7fdc 100644 --- a/xs/xsp/GCodeWriter.xsp +++ b/xs/xsp/GCodeWriter.xsp @@ -18,6 +18,7 @@ void apply_print_config(PrintConfig* print_config) %code{% THIS->apply_print_config(*print_config); %}; void set_extruders(std::vector extruder_ids); + std::string notes(); std::string preamble(); std::string postamble(); std::string set_temperature(unsigned int temperature, bool wait = false, int tool = -1);