GCode Viewer - Fixed color print visualization for gcode containing multiple extruders

This commit is contained in:
enricoturri1966 2020-11-09 13:06:20 +01:00
parent 006630299b
commit bf12c7cb8c
7 changed files with 57 additions and 24 deletions

View file

@ -508,6 +508,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config)
m_flavor = config.gcode_flavor; m_flavor = config.gcode_flavor;
size_t extruders_count = config.nozzle_diameter.values.size(); size_t extruders_count = config.nozzle_diameter.values.size();
m_result.extruders_count = extruders_count;
m_extruder_offsets.resize(extruders_count); m_extruder_offsets.resize(extruders_count);
for (size_t i = 0; i < extruders_count; ++i) { for (size_t i = 0; i < extruders_count; ++i) {
@ -580,6 +581,8 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
} }
} }
m_result.extruders_count = config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
const ConfigOptionPoints* extruder_offset = config.option<ConfigOptionPoints>("extruder_offset"); const ConfigOptionPoints* extruder_offset = config.option<ConfigOptionPoints>("extruder_offset");
if (extruder_offset != nullptr) { if (extruder_offset != nullptr) {
m_extruder_offsets.resize(extruder_offset->values.size()); m_extruder_offsets.resize(extruder_offset->values.size());

View file

@ -283,6 +283,7 @@ namespace Slic3r {
std::vector<MoveVertex> moves; std::vector<MoveVertex> moves;
Pointfs bed_shape; Pointfs bed_shape;
SettingsIds settings_ids; SettingsIds settings_ids;
size_t extruders_count;
std::vector<std::string> extruder_colors; std::vector<std::string> extruder_colors;
PrintEstimatedTimeStatistics time_statistics; PrintEstimatedTimeStatistics time_statistics;
@ -294,6 +295,7 @@ namespace Slic3r {
moves = std::vector<MoveVertex>(); moves = std::vector<MoveVertex>();
bed_shape = Pointfs(); bed_shape = Pointfs();
extruder_colors = std::vector<std::string>(); extruder_colors = std::vector<std::string>();
extruders_count = 0;
settings_ids.reset(); settings_ids.reset();
} }
#else #else
@ -302,6 +304,7 @@ namespace Slic3r {
moves = std::vector<MoveVertex>(); moves = std::vector<MoveVertex>();
bed_shape = Pointfs(); bed_shape = Pointfs();
extruder_colors = std::vector<std::string>(); extruder_colors = std::vector<std::string>();
extruders_count = 0;
settings_ids.reset(); settings_ids.reset();
} }
#endif // ENABLE_GCODE_VIEWER_STATISTICS #endif // ENABLE_GCODE_VIEWER_STATISTICS

View file

@ -420,6 +420,7 @@ void GCodeViewer::reset()
m_paths_bounding_box = BoundingBoxf3(); m_paths_bounding_box = BoundingBoxf3();
m_max_bounding_box = BoundingBoxf3(); m_max_bounding_box = BoundingBoxf3();
m_tool_colors = std::vector<Color>(); m_tool_colors = std::vector<Color>();
m_extruders_count = 0;
m_extruder_ids = std::vector<unsigned char>(); m_extruder_ids = std::vector<unsigned char>();
m_extrusions.reset_role_visibility_flags(); m_extrusions.reset_role_visibility_flags();
m_extrusions.reset_ranges(); m_extrusions.reset_ranges();
@ -967,6 +968,8 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
new wxProgressDialog(_L("Generating toolpaths"), "...", new wxProgressDialog(_L("Generating toolpaths"), "...",
100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr;
m_extruders_count = gcode_result.extruders_count;
for (size_t i = 0; i < m_moves_count; ++i) { for (size_t i = 0; i < m_moves_count; ++i) {
const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; const GCodeProcessor::MoveVertex& move = gcode_result.moves[i];
if (wxGetApp().is_gcode_viewer()) if (wxGetApp().is_gcode_viewer())
@ -2318,8 +2321,7 @@ void GCodeViewer::render_legend() const
case EViewType::ColorPrint: case EViewType::ColorPrint:
{ {
const std::vector<CustomGCode::Item>& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; const std::vector<CustomGCode::Item>& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
const int extruders_count = wxGetApp().extruders_edited_cnt(); if (m_extruders_count == 1) { // single extruder use case
if (extruders_count == 1) { // single extruder use case
std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(0, custom_gcode_per_print_z); std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(0, custom_gcode_per_print_z);
const int items_cnt = static_cast<int>(cp_values.size()); const int items_cnt = static_cast<int>(cp_values.size());
if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode

View file

@ -399,6 +399,7 @@ private:
std::vector<double> m_layers_zs; std::vector<double> m_layers_zs;
std::array<double, 2> m_layers_z_range; std::array<double, 2> m_layers_z_range;
std::vector<ExtrusionRole> m_roles; std::vector<ExtrusionRole> m_roles;
size_t m_extruders_count;
std::vector<unsigned char> m_extruder_ids; std::vector<unsigned char> m_extruder_ids;
mutable Extrusions m_extrusions; mutable Extrusions m_extrusions;
mutable SequentialView m_sequential_view; mutable SequentialView m_sequential_view;

View file

@ -1292,13 +1292,12 @@ void Preview::load_print_as_fff(bool keep_z_range)
// set color print values, if it si selected "ColorPrint" view type // set color print values, if it si selected "ColorPrint" view type
#if ENABLE_GCODE_VIEWER #if ENABLE_GCODE_VIEWER
if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) { if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) {
colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result);
#else #else
if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint) { if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint) {
#endif // ENABLE_GCODE_VIEWER
colors = wxGetApp().plater()->get_colors_for_color_print(); colors = wxGetApp().plater()->get_colors_for_color_print();
#if !ENABLE_GCODE_VIEWER
colors.push_back("#808080"); // gray color for pause print or custom G-code colors.push_back("#808080"); // gray color for pause print or custom G-code
#endif // !ENABLE_GCODE_VIEWER #endif // ENABLE_GCODE_VIEWER
if (!gcode_preview_data_valid) { if (!gcode_preview_data_valid) {
color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
@ -1309,10 +1308,11 @@ void Preview::load_print_as_fff(bool keep_z_range)
} }
#if ENABLE_GCODE_VIEWER #if ENABLE_GCODE_VIEWER
else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) { else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) {
colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result);
#else #else
else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) ) { else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) ) {
#endif // ENABLE_GCODE_VIEWER
colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(); colors = wxGetApp().plater()->get_extruder_colors_from_plater_config();
#endif // ENABLE_GCODE_VIEWER
color_print_values.clear(); color_print_values.clear();
} }

View file

@ -32,11 +32,9 @@
#include "libslic3r/Format/STL.hpp" #include "libslic3r/Format/STL.hpp"
#include "libslic3r/Format/AMF.hpp" #include "libslic3r/Format/AMF.hpp"
#include "libslic3r/Format/3mf.hpp" #include "libslic3r/Format/3mf.hpp"
#if ENABLE_GCODE_VIEWER #if !ENABLE_GCODE_VIEWER
#include "libslic3r/GCode/GCodeProcessor.hpp"
#else
#include "libslic3r/GCode/PreviewData.hpp" #include "libslic3r/GCode/PreviewData.hpp"
#endif // ENABLE_GCODE_VIEWER #endif // !ENABLE_GCODE_VIEWER
#include "libslic3r/GCode/ThumbnailData.hpp" #include "libslic3r/GCode/ThumbnailData.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "libslic3r/SLA/Hollowing.hpp" #include "libslic3r/SLA/Hollowing.hpp"
@ -5632,8 +5630,17 @@ void Plater::on_activate()
} }
// Get vector of extruder colors considering filament color, if extruder color is undefined. // Get vector of extruder colors considering filament color, if extruder color is undefined.
#if ENABLE_GCODE_VIEWER
std::vector<std::string> Plater::get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result) const
#else
std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const
#endif // ENABLE_GCODE_VIEWER
{ {
#if ENABLE_GCODE_VIEWER
if (wxGetApp().is_gcode_viewer() && result != nullptr)
return result->extruder_colors;
else {
#endif // ENABLE_GCODE_VIEWER
const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config;
std::vector<std::string> extruder_colors; std::vector<std::string> extruder_colors;
if (!config->has("extruder_colour")) // in case of a SLA print if (!config->has("extruder_colour")) // in case of a SLA print
@ -5649,14 +5656,23 @@ std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const
extruder_colors[i] = filament_colours[i]; extruder_colors[i] = filament_colours[i];
return extruder_colors; return extruder_colors;
#if ENABLE_GCODE_VIEWER
}
#endif // ENABLE_GCODE_VIEWER
} }
/* Get vector of colors used for rendering of a Preview scene in "Color print" mode /* Get vector of colors used for rendering of a Preview scene in "Color print" mode
* It consists of extruder colors and colors, saved in model.custom_gcode_per_print_z * It consists of extruder colors and colors, saved in model.custom_gcode_per_print_z
*/ */
#if ENABLE_GCODE_VIEWER
std::vector<std::string> Plater::get_colors_for_color_print(const GCodeProcessor::Result* const result) const
{
std::vector<std::string> colors = get_extruder_colors_from_plater_config(result);
#else
std::vector<std::string> Plater::get_colors_for_color_print() const std::vector<std::string> Plater::get_colors_for_color_print() const
{ {
std::vector<std::string> colors = get_extruder_colors_from_plater_config(); std::vector<std::string> colors = get_extruder_colors_from_plater_config();
#endif // ENABLE_GCODE_VIEWER
colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size()); colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size());
for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes) for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes)

View file

@ -11,6 +11,9 @@
#include "libslic3r/Preset.hpp" #include "libslic3r/Preset.hpp"
#include "libslic3r/BoundingBox.hpp" #include "libslic3r/BoundingBox.hpp"
#if ENABLE_GCODE_VIEWER
#include "libslic3r/GCode/GCodeProcessor.hpp"
#endif // ENABLE_GCODE_VIEWER
#include "Jobs/Job.hpp" #include "Jobs/Job.hpp"
#include "Search.hpp" #include "Search.hpp"
@ -233,8 +236,13 @@ public:
void force_print_bed_update(); void force_print_bed_update();
// On activating the parent window. // On activating the parent window.
void on_activate(); void on_activate();
#if ENABLE_GCODE_VIEWER
std::vector<std::string> get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result = nullptr) const;
std::vector<std::string> get_colors_for_color_print(const GCodeProcessor::Result* const result = nullptr) const;
#else
std::vector<std::string> get_extruder_colors_from_plater_config() const; std::vector<std::string> get_extruder_colors_from_plater_config() const;
std::vector<std::string> get_colors_for_color_print() const; std::vector<std::string> get_colors_for_color_print() const;
#endif // ENABLE_GCODE_VIEWER
void update_object_menu(); void update_object_menu();
void show_action_buttons(const bool is_ready_to_slice) const; void show_action_buttons(const bool is_ready_to_slice) const;