From 3846d9e73496361cf70fd27dd5fcb7f783f022a7 Mon Sep 17 00:00:00 2001 From: Joseph Lenox Date: Sun, 15 Jan 2017 23:56:01 -0600 Subject: [PATCH] Add weight/cost output to gcode. On the way to #647 --- lib/Slic3r/GUI/Tab.pm | 4 +++- lib/Slic3r/Print/GCode.pm | 16 ++++++++++++++++ xs/src/libslic3r/Extruder.cpp | 12 ++++++++++++ xs/src/libslic3r/Extruder.hpp | 2 ++ xs/src/libslic3r/PrintConfig.cpp | 24 ++++++++++++++++++++++++ xs/src/libslic3r/PrintConfig.hpp | 4 ++++ xs/xsp/Extruder.xsp | 2 ++ 7 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm index 68b623cda..8857660ea 100644 --- a/lib/Slic3r/GUI/Tab.pm +++ b/lib/Slic3r/GUI/Tab.pm @@ -962,7 +962,7 @@ sub build { my $self = shift; $self->init_config_options(qw( - filament_colour filament_diameter filament_notes filament_max_volumetric_speed extrusion_multiplier + filament_colour filament_diameter filament_notes filament_max_volumetric_speed extrusion_multiplier filament_density filament_cost temperature first_layer_temperature bed_temperature first_layer_bed_temperature fan_always_on cooling min_fan_speed max_fan_speed bridge_fan_speed disable_fan_first_layers @@ -977,6 +977,8 @@ sub build { $optgroup->append_single_option_line('filament_colour', 0); $optgroup->append_single_option_line('filament_diameter', 0); $optgroup->append_single_option_line('extrusion_multiplier', 0); + $optgroup->append_single_option_line('filament_density', 0); + $optgroup->append_single_option_line('filament_cost', 0); } { diff --git a/lib/Slic3r/Print/GCode.pm b/lib/Slic3r/Print/GCode.pm index a5bbbd556..512ce05b7 100644 --- a/lib/Slic3r/Print/GCode.pm +++ b/lib/Slic3r/Print/GCode.pm @@ -321,17 +321,33 @@ sub export { $self->print->clear_filament_stats; $self->print->total_used_filament(0); $self->print->total_extruded_volume(0); + my $total_filament_weight = 0.0; + my $total_filament_cost = 0.0; foreach my $extruder (@{$gcodegen->writer->extruders}) { my $used_filament = $extruder->used_filament; my $extruded_volume = $extruder->extruded_volume; + my $filament_weight = $extruded_volume * $extruder->filament_density; + my $filament_cost = $filament_weight * ($extruder->filament_cost / 1000); $self->print->set_filament_stats($extruder->id, $used_filament); printf $fh "; filament used = %.1fmm (%.1fcm3)\n", $used_filament, $extruded_volume/1000; + if ($filament_weight > 0) { + $total_filament_weight += $filament_weight; + printf $fh "; filament used = %.1fg\n", + $filament_weight; + if ($filament_cost > 0) { + $total_filament_cost += $filament_cost; + printf $fh "; filament cost = %.1f\n", + $filament_cost; + } + } $self->print->total_used_filament($self->print->total_used_filament + $used_filament); $self->print->total_extruded_volume($self->print->total_extruded_volume + $extruded_volume); } + printf $fh "; total filament cost = %.1f\n", + $total_filament_cost; # append full config print $fh "\n"; diff --git a/xs/src/libslic3r/Extruder.cpp b/xs/src/libslic3r/Extruder.cpp index b9be14661..8cf3e8b0a 100644 --- a/xs/src/libslic3r/Extruder.cpp +++ b/xs/src/libslic3r/Extruder.cpp @@ -111,6 +111,18 @@ Extruder::filament_diameter() const return this->config->filament_diameter.get_at(this->id); } +double +Extruder::filament_density() const +{ + return this->config->filament_density.get_at(this->id); +} + +double +Extruder::filament_cost() const +{ + return this->config->filament_cost.get_at(this->id); +} + double Extruder::extrusion_multiplier() const { diff --git a/xs/src/libslic3r/Extruder.hpp b/xs/src/libslic3r/Extruder.hpp index 76b70df63..729996cd1 100644 --- a/xs/src/libslic3r/Extruder.hpp +++ b/xs/src/libslic3r/Extruder.hpp @@ -29,6 +29,8 @@ class Extruder double used_filament() const; double filament_diameter() const; + double filament_density() const; + double filament_cost() const; double extrusion_multiplier() const; double retract_length() const; double retract_lift() const; diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index 9a8915db0..336fff382 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -335,6 +335,30 @@ PrintConfigDef::PrintConfigDef() opt->values.push_back(3); def->default_value = opt; } + + def = this->add("filament_density", coFloats); + def->label = "Density"; + def->tooltip = "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume."; + def->sidetext = "g/mm^3"; + def->cli = "filament-density=f@"; + def->min = 0; + { + ConfigOptionFloats* opt = new ConfigOptionFloats(); + opt->values.push_back(0); + def->default_value = opt; + } + + def = this->add("filament_cost", coFloats); + def->label = "Cost"; + def->tooltip = "Enter your filament cost per kg here. This is only for statistical information."; + def->sidetext = "money/kg"; + def->cli = "filament-cost=f@"; + def->min = 0; + { + ConfigOptionFloats* opt = new ConfigOptionFloats(); + opt->values.push_back(0); + def->default_value = opt; + } def = this->add("filament_settings_id", coString); def->default_value = new ConfigOptionString(""); diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index 53a211f5d..9964d6f28 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -299,6 +299,8 @@ class GCodeConfig : public virtual StaticPrintConfig ConfigOptionString extrusion_axis; ConfigOptionFloats extrusion_multiplier; ConfigOptionFloats filament_diameter; + ConfigOptionFloats filament_density; + ConfigOptionFloats filament_cost; ConfigOptionFloats filament_max_volumetric_speed; ConfigOptionBool gcode_comments; ConfigOptionEnum gcode_flavor; @@ -334,6 +336,8 @@ class GCodeConfig : public virtual StaticPrintConfig OPT_PTR(extrusion_axis); OPT_PTR(extrusion_multiplier); OPT_PTR(filament_diameter); + OPT_PTR(filament_density); + OPT_PTR(filament_cost); OPT_PTR(filament_max_volumetric_speed); OPT_PTR(gcode_comments); OPT_PTR(gcode_flavor); diff --git a/xs/xsp/Extruder.xsp b/xs/xsp/Extruder.xsp index 2a315858e..36f5427c7 100644 --- a/xs/xsp/Extruder.xsp +++ b/xs/xsp/Extruder.xsp @@ -42,6 +42,8 @@ %code%{ RETVAL = THIS->retract_speed_mm_min; %}; double filament_diameter(); + double filament_density(); + double filament_cost(); double extrusion_multiplier(); double retract_length(); double retract_lift();