diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index 431bcdacc..f16cb5617 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -22,6 +22,7 @@ static const unsigned int DEFAULT_COLOR_PRINT_ID = 0; static const Slic3r::Vec3d DEFAULT_START_POSITION = Slic3r::Vec3d(0.0f, 0.0f, 0.0f); static const float DEFAULT_START_EXTRUSION = 0.0f; static const float DEFAULT_FAN_SPEED = 0.0f; +static const float DEFAULT_EXTRUDER_TEMP = 0.0f; static const float DEFAULT_LAYER_DURATION = 0.0f; static const float DEFAULT_LAYER_ELAPSED_TIME = 0.0f; @@ -48,13 +49,15 @@ GCodeAnalyzer::Metadata::Metadata() , height(GCodeAnalyzer::Default_Height) , feedrate(DEFAULT_FEEDRATE) , fan_speed(DEFAULT_FAN_SPEED) + , extruder_temp(DEFAULT_EXTRUDER_TEMP) , layer_duration(DEFAULT_LAYER_DURATION) , layer_elapsed_time(DEFAULT_LAYER_ELAPSED_TIME) , cp_color_id(DEFAULT_COLOR_PRINT_ID) { } -GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, float fan_speed, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) +GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, + float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) : extrusion_role(extrusion_role) , extruder_id(extruder_id) , mm3_per_mm(mm3_per_mm) @@ -62,6 +65,7 @@ GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int ext , height(height) , feedrate(feedrate) , fan_speed(fan_speed) + , extruder_temp(extruder_temp) , layer_duration(layer_duration) , layer_elapsed_time(layer_elapsed_time) , cp_color_id(cp_color_id) @@ -91,6 +95,9 @@ bool GCodeAnalyzer::Metadata::operator != (const GCodeAnalyzer::Metadata& other) if (fan_speed != other.fan_speed) return true; + if (extruder_temp != other.extruder_temp) + return true; + if (layer_duration != other.layer_duration) return true; @@ -102,9 +109,9 @@ bool GCodeAnalyzer::Metadata::operator != (const GCodeAnalyzer::Metadata& other) GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, - float fan_speed, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) + float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) : type(type) - , data(extrusion_role, extruder_id, mm3_per_mm, width, height, feedrate, fan_speed, layer_duration, layer_elapsed_time, cp_color_id) + , data(extrusion_role, extruder_id, mm3_per_mm, width, height, feedrate, fan_speed, extruder_temp, layer_duration, layer_elapsed_time, cp_color_id) , start_position(start_position) , end_position(end_position) , delta_extruder(delta_extruder) @@ -142,6 +149,7 @@ void GCodeAnalyzer::reset() _set_start_position(DEFAULT_START_POSITION); _set_start_extrusion(DEFAULT_START_EXTRUSION); _set_fan_speed(DEFAULT_FAN_SPEED); + _set_extruder_temp(DEFAULT_EXTRUDER_TEMP); _set_layer_duration(DEFAULT_LAYER_DURATION); _reset_axes_position(); _reset_axes_origin(); @@ -271,6 +279,12 @@ void GCodeAnalyzer::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLi _processM83(line); break; } + case 104: //set extruder temp + case 109: + { + _processM104orM109(line); + break; + } case 106: // Set fan speed { _processM106(line); @@ -491,6 +505,15 @@ void GCodeAnalyzer::_processM83(const GCodeReader::GCodeLine& line) _set_e_local_positioning_type(Relative); } +void GCodeAnalyzer::_processM104orM109(const GCodeReader::GCodeLine& line) +{ + float new_temp; + if (line.has_value('S', new_temp)) + { + _set_extruder_temp(new_temp); + } +} + void GCodeAnalyzer::_processM106(const GCodeReader::GCodeLine& line) { if (!line.has('P')) @@ -850,6 +873,16 @@ float GCodeAnalyzer::_get_feedrate() const return m_state.data.feedrate; } +void GCodeAnalyzer::_set_extruder_temp(float new_temperature) +{ + m_state.data.extruder_temp = new_temperature; +} + +float GCodeAnalyzer::_get_extruder_temp() const +{ + return m_state.data.extruder_temp; +} + void GCodeAnalyzer::_set_fan_speed(float fan_speed_percentage) { m_state.data.fan_speed = fan_speed_percentage; @@ -959,7 +992,7 @@ void GCodeAnalyzer::_store_move(GCodeAnalyzer::GCodeMove::EType type) Vec3d end_position = _get_end_position() + extruder_offset; it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), - _get_fan_speed(), _get_layer_duration(), m_state.data.layer_elapsed_time, _get_cp_color_id()); + _get_fan_speed(), _get_extruder_temp(), _get_layer_duration(), m_state.data.layer_elapsed_time, _get_cp_color_id()); } bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const @@ -1003,6 +1036,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ path.extruder_id = data.extruder_id; path.cp_color_id = data.cp_color_id; path.fan_speed = data.fan_speed; + path.extruder_temp = data.extruder_temp; path.layer_duration = data.layer_duration; path.elapsed_time = data.layer_elapsed_time; } @@ -1023,6 +1057,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ GCodePreviewData::MultiRange feedrate_range; GCodePreviewData::Range volumetric_rate_range; GCodePreviewData::Range fan_speed_range; + GCodePreviewData::Range extruder_temp_range; GCodePreviewData::Range layer_duration_range; GCodePreviewData::Range elapsed_time_range; @@ -1069,6 +1104,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::EXTRUSION); volumetric_rate_range.update_from(volumetric_rate); fan_speed_range.update_from(move.data.fan_speed); + extruder_temp_range.update_from(move.data.extruder_temp); layer_duration_range.update_from(move.data.layer_duration); elapsed_time_range.update_from(move.data.layer_elapsed_time); } @@ -1090,6 +1126,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ preview_data.ranges.feedrate.update_from(feedrate_range); preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range); preview_data.ranges.fan_speed.update_from(fan_speed_range); + preview_data.ranges.extruder_temp.update_from(extruder_temp_range); preview_data.ranges.layer_duration.update_from(layer_duration_range); preview_data.ranges.elapsed_time.update_from(elapsed_time_range); diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp index 54fede8b9..270cd939b 100644 --- a/src/libslic3r/GCode/Analyzer.hpp +++ b/src/libslic3r/GCode/Analyzer.hpp @@ -60,13 +60,15 @@ public: float height; // mm float feedrate; // mm/s float fan_speed; // percentage + float extruder_temp; //oC float layer_duration; //s float layer_elapsed_time; //s unsigned int cp_color_id; Metadata(); Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, - float width, float height, float feedrate, float fan_speed, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); + float width, float height, float feedrate, float fan_speed, float extruder_temp, + float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); bool operator != (const Metadata& other) const; }; @@ -92,7 +94,7 @@ public: GCodeMove(EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, - float fan_speed, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); + float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); GCodeMove(EType type, const Metadata& data, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder); }; @@ -188,6 +190,9 @@ private: // Set extruder to relative mode void _processM83(const GCodeReader::GCodeLine& line); + // Extruder temperature change + void _processM104orM109(const GCodeReader::GCodeLine& line); + // Set fan speed void _processM106(const GCodeReader::GCodeLine& line); @@ -264,6 +269,9 @@ private: void _set_feedrate(float feedrate_mm_sec); float _get_feedrate() const; + + void _set_extruder_temp(float new_temperature); + float _get_extruder_temp() const; void _set_fan_speed(float fan_speed_percentage); float _get_fan_speed() const; diff --git a/src/libslic3r/GCode/PreviewData.cpp b/src/libslic3r/GCode/PreviewData.cpp index 4298219f8..cac70b4a1 100644 --- a/src/libslic3r/GCode/PreviewData.cpp +++ b/src/libslic3r/GCode/PreviewData.cpp @@ -263,6 +263,7 @@ void GCodePreviewData::reset() ranges.fan_speed.reset(); ranges.volumetric_rate.reset(); ranges.fan_speed.reset(); + ranges.extruder_temp.reset(); ranges.layer_duration.reset(); ranges.elapsed_time.reset(); extrusion.layers.clear(); @@ -301,6 +302,11 @@ Color GCodePreviewData::get_fan_speed_color(float fan_speed) const return ranges.fan_speed.get_color_at(fan_speed); } +Color GCodePreviewData::get_extruder_temp_color(float temp) const +{ + return ranges.extruder_temp.get_color_at(temp); +} + Color GCodePreviewData::get_layer_duration_color(float layer_time) const { return ranges.layer_duration.get_color_at(layer_time); @@ -501,21 +507,26 @@ GCodePreviewData::LegendItemsList GCodePreviewData::get_legend_items(const std:: Helper::FillListFromRange(items, ranges.fan_speed, 0, 1.0f); break; } + case Extrusion::ExtruderTemp: + { + Helper::FillListFromRange(items, ranges.extruder_temp, 0, 1.0f); + break; + } case Extrusion::LayerTime: - { - Helper::FillListFromRange(items, ranges.layer_duration, 1, 1.0f, true); - break; - } + { + Helper::FillListFromRange(items, ranges.layer_duration, 1, 1.0f, true); + break; + } case Extrusion::LayerTimeLog: - { - Helper::FillListFromRange(items, ranges.layer_duration, 1, 1.0f, true, true); - break; - } + { + Helper::FillListFromRange(items, ranges.layer_duration, 1, 1.0f, true, true); + break; + } case Extrusion::Chronology: - { - Helper::FillListFromRange(items, ranges.elapsed_time, 1, 1.0f, true); - break; - } + { + Helper::FillListFromRange(items, ranges.elapsed_time, 1, 1.0f, true); + break; + } case Extrusion::VolumetricRate: { Helper::FillListFromRange(items, ranges.volumetric_rate, 3, 1.0f); diff --git a/src/libslic3r/GCode/PreviewData.hpp b/src/libslic3r/GCode/PreviewData.hpp index c97229f55..024f0184e 100644 --- a/src/libslic3r/GCode/PreviewData.hpp +++ b/src/libslic3r/GCode/PreviewData.hpp @@ -201,6 +201,8 @@ public: MultiRange feedrate; // Color mapping by fan speed. Range fan_speed; + // Color mapping by fan speed. + Range extruder_temp; // Color mapping by layer time. Range layer_duration; // Color mapping by time. @@ -235,6 +237,7 @@ public: Tool, Filament, ColorPrint, + ExtruderTemp, Num_View_Types }; @@ -259,8 +262,10 @@ public: uint32_t extruder_id; // Id of the color, used for visualization purposes in the color printing case. uint32_t cp_color_id; - // Fan speed for the extrusion, used for visualization purposes. - float fan_speed; + // Fan speed for the extrusion, used for visualization purposes. + float fan_speed; + // Temperature of the extuder + float extruder_temp; // Layer time for the extrusion, used for visualization purposes. float layer_duration; // time since print start, used for visualization purposes. @@ -390,6 +395,7 @@ public: Color get_width_color(float width) const; Color get_feedrate_color(float feedrate) const; Color get_fan_speed_color(float fan_speed) const; + Color get_extruder_temp_color(float temp) const; Color get_layer_duration_color(float layer_time) const; Color get_layer_duration_log_color(float layer_time) const; Color get_elapsed_time_color(float elapsed_time) const; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a05e832ca..2dc83a8af 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6207,6 +6207,8 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat return path.feedrate; case GCodePreviewData::Extrusion::FanSpeed: return path.fan_speed; + case GCodePreviewData::Extrusion::ExtruderTemp: + return path.extruder_temp; case GCodePreviewData::Extrusion::LayerTime: return path.layer_duration; case GCodePreviewData::Extrusion::LayerTimeLog: @@ -6241,6 +6243,8 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat return data.get_feedrate_color(value); case GCodePreviewData::Extrusion::FanSpeed: return data.get_fan_speed_color(value); + case GCodePreviewData::Extrusion::ExtruderTemp: + return data.get_extruder_temp_color(value); case GCodePreviewData::Extrusion::LayerTime: return data.get_layer_duration_color(value); case GCodePreviewData::Extrusion::LayerTimeLog: diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 322402417..ebe5bcca3 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -252,6 +252,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view m_choice_view_type->Append(_(L("Tool"))); m_choice_view_type->Append(_(L("Filament"))); m_choice_view_type->Append(_(L(width_screen == tiny ? "Color":"Color Print"))); + m_choice_view_type->Append(_(L((width_screen == tiny ? "Temp" : "Temperature")))); m_choice_view_type->SetSelection(0); m_label_show_features = new wxStaticText(this, wxID_ANY, _(L("Show")));