diff --git a/src/slic3r/GUI/LibVGCode/Toolpaths.cpp b/src/slic3r/GUI/LibVGCode/Toolpaths.cpp index f7fa0699ea..35109fd2c2 100644 --- a/src/slic3r/GUI/LibVGCode/Toolpaths.cpp +++ b/src/slic3r/GUI/LibVGCode/Toolpaths.cpp @@ -3,7 +3,7 @@ #include "libslic3r/Technologies.hpp" //################################################################################################################################ -///|/ Copyright (c) Prusa Research 2023 Enrico Turri @enricoturri1966, Pavel Mikuš @Godrak, Vojtěch Bubník @bubnikv +///|/ Copyright (c) Prusa Research 2023 Enrico Turri @enricoturri1966, Pavel Mikuš @Godrak, Vojtěch Bubník @bubnikv, Oleksandra Iushchenko @YuSanka ///|/ ///|/ libvgcode is released under the terms of the AGPLv3 or higher ///|/ @@ -23,6 +23,8 @@ #include #include #include +#include +#include namespace libvgcode { @@ -298,6 +300,69 @@ static Mat4x4f inverse(const Mat4x4f& m) return ret; } +static std::string short_time(const std::string& time) +{ + // Parse the dhms time format. + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + if (time.find('d') != std::string::npos) + sscanf(time.c_str(), "%dd %dh %dm %ds", &days, &hours, &minutes, &seconds); + else if (time.find('h') != std::string::npos) + sscanf(time.c_str(), "%dh %dm %ds", &hours, &minutes, &seconds); + else if (time.find('m') != std::string::npos) + sscanf(time.c_str(), "%dm %ds", &minutes, &seconds); + else if (time.find('s') != std::string::npos) + sscanf(time.c_str(), "%ds", &seconds); + + // Round to full minutes. + if (days + hours + minutes > 0 && seconds >= 30) { + if (++minutes == 60) { + minutes = 0; + if (++hours == 24) { + hours = 0; + ++days; + } + } + } + + // Format the dhm time + char buffer[64]; + if (days > 0) + sprintf(buffer, "%dd%dh%dm", days, hours, minutes); + else if (hours > 0) + sprintf(buffer, "%dh%dm", hours, minutes); + else if (minutes > 0) + sprintf(buffer, "%dm", minutes); + else + sprintf(buffer, "%ds", seconds); + return buffer; +} + +// Returns the given time is seconds in format DDd HHh MMm SSs +static std::string get_time_dhms(float time_in_secs) +{ + int days = (int)(time_in_secs / 86400.0f); + time_in_secs -= (float)days * 86400.0f; + int hours = (int)(time_in_secs / 3600.0f); + time_in_secs -= (float)hours * 3600.0f; + int minutes = (int)(time_in_secs / 60.0f); + time_in_secs -= (float)minutes * 60.0f; + + char buffer[64]; + if (days > 0) + sprintf(buffer, "%dd %dh %dm %ds", days, hours, minutes, (int)time_in_secs); + else if (hours > 0) + sprintf(buffer, "%dh %dm %ds", hours, minutes, (int)time_in_secs); + else if (minutes > 0) + sprintf(buffer, "%dm %ds", minutes, (int)time_in_secs); + else + sprintf(buffer, "%ds", (int)std::round(time_in_secs)); + + return buffer; +} + std::string check_shader(GLuint handle) { std::string ret; @@ -472,11 +537,23 @@ void Toolpaths::init() m_tool_marker.init(32, 2.0f, 4.0f, 1.0f, 8.0f); } -void Toolpaths::load(const Slic3r::GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors, - const Settings& settings) +void Toolpaths::load(const Slic3r::GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) { + if (m_settings.time_mode != ETimeMode::Normal) { + const Slic3r::PrintEstimatedStatistics& stats = gcode_result.print_statistics; + bool force_normal_mode = static_cast(m_settings.time_mode) >= stats.modes.size(); + if (!force_normal_mode) { + const float normal_time = stats.modes[static_cast(ETimeMode::Normal)].time; + const float mode_time = stats.modes[static_cast(m_settings.time_mode)].time; + force_normal_mode = mode_time == 0.0f || + short_time(get_time_dhms(mode_time)) == short_time(get_time_dhms(normal_time)); // TO CHECK -> Is this necessary ? + } + if (force_normal_mode) + m_settings.time_mode = ETimeMode::Normal; + } + m_tool_colors.clear(); - if (settings.view_type == EViewType::Tool && !gcode_result.extruder_colors.empty()) + if (m_settings.view_type == EViewType::Tool && !gcode_result.extruder_colors.empty()) // update tool colors from config stored in the gcode decode_colors(gcode_result.extruder_colors, m_tool_colors); else @@ -644,32 +721,35 @@ void Toolpaths::load(const Slic3r::GCodeProcessorResult& gcode_result, const std if (i < gcode_result.print_statistics.modes.size()) m_layers_times[i] = gcode_result.print_statistics.modes[i].layers_times; } + + m_view_range.set_global_range(0, m_vertices.size() - 1); + m_settings.update_colors = true; } -void Toolpaths::update_enabled_entities(const ViewRange& range, const Settings& settings) +void Toolpaths::update_enabled_entities() { std::vector enabled_segments; std::vector enabled_options; - for (uint32_t i = range.get_current_min(); i < range.get_current_max(); i++) { + for (uint32_t i = m_view_range.get_current_min(); i < m_view_range.get_current_max(); i++) { const PathVertex& v = m_vertices[i]; if (!m_valid_lines_bitset[i] && !v.is_option()) continue; if (v.is_travel()) { - if (!settings.options_visibility.at(EOptionType::Travels)) + if (!m_settings.options_visibility.at(EOptionType::Travels)) continue; } else if (v.is_wipe()) { - if (!settings.options_visibility.at(EOptionType::Wipes)) + if (!m_settings.options_visibility.at(EOptionType::Wipes)) continue; } else if (v.is_option()) { - if (!settings.options_visibility.at(type_to_option(v.type))) - continue; + if (!m_settings.options_visibility.at(type_to_option(v.type))) + continue; } else if (v.is_extrusion()) { - if (!settings.extrusion_roles_visibility.at(v.role)) + if (!m_settings.extrusion_roles_visibility.at(v.role)) continue; } else @@ -719,13 +799,13 @@ static float encode_color(const Color& color) { return float(i_color); } -void Toolpaths::update_colors(const Settings& settings) +void Toolpaths::update_colors() { - update_color_ranges(settings); + update_color_ranges(); std::vector colors(m_vertices.size()); for (size_t i = 0; i < m_vertices.size(); i++) { - colors[i] = encode_color(select_color(m_vertices[i], settings)); + colors[i] = encode_color(select_color(m_vertices[i])); } // update gpu buffer for colors @@ -735,19 +815,121 @@ void Toolpaths::update_colors(const Settings& settings) glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0)); } -void Toolpaths::render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix, const Settings& settings) +void Toolpaths::render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix) { + if (m_settings.update_enabled_entities) { + update_enabled_entities(); + m_settings.update_enabled_entities = false; + } + + if (m_settings.update_colors) { + update_colors(); + m_settings.update_colors = false; + } + const Mat4x4f inv_view_matrix = inverse(view_matrix); const Vec3f camera_position = { inv_view_matrix[12], inv_view_matrix[13], inv_view_matrix[14] }; render_segments(view_matrix, projection_matrix, camera_position); render_options(view_matrix, projection_matrix); - if (settings.options_visibility.at(EOptionType::ToolMarker)) + if (m_settings.options_visibility.at(EOptionType::ToolMarker)) render_tool_marker(view_matrix, projection_matrix); - if (settings.options_visibility.at(EOptionType::CenterOfGravity)) + if (m_settings.options_visibility.at(EOptionType::CenterOfGravity)) render_cog_marker(view_matrix, projection_matrix); } +EViewType Toolpaths::get_view_type() const +{ + return m_settings.view_type; +} + +ETimeMode Toolpaths::get_time_mode() const +{ + return m_settings.time_mode; +} + +bool Toolpaths::is_option_visible(EOptionType type) const +{ + try + { + return m_settings.options_visibility.at(type); + } + catch (...) + { + return false; + } +} + +bool Toolpaths::is_extrusion_role_visible(EGCodeExtrusionRole role) const +{ + try + { + return m_settings.extrusion_roles_visibility.at(role); + } + catch (...) + { + return false; + } +} + +void Toolpaths::set_view_type(EViewType type) +{ + m_settings.view_type = type; + m_settings.update_colors = true; +} + +void Toolpaths::set_time_mode(ETimeMode mode) +{ + m_settings.time_mode = mode; + m_settings.update_colors = true; +} + +void Toolpaths::toggle_option_visibility(EOptionType type) +{ + try + { + bool& value = m_settings.options_visibility.at(type); + value = !value; + m_settings.update_enabled_entities = true; + m_settings.update_colors = true; + } + catch (...) + { + // do nothing; + } +} + +void Toolpaths::toggle_extrusion_role_visibility(EGCodeExtrusionRole role) +{ + try + { + bool& value = m_settings.extrusion_roles_visibility.at(role); + value = !value; + m_settings.update_enabled_entities = true; + m_settings.update_colors = true; + } + catch (...) + { + // do nothing; + } +} + +const std::array& Toolpaths::get_view_current_range() const +{ + return m_view_range.get_current_range(); +} + +const std::array& Toolpaths::get_view_global_range() const +{ + return m_view_range.get_global_range(); +} + +void Toolpaths::set_view_current_range(size_t min, size_t max) +{ + m_view_range.set_current_range(min, max); + m_settings.update_enabled_entities = true; +} + const std::array, static_cast(ETimeMode::COUNT)>& Toolpaths::get_layers_times() const { return m_layers_times; @@ -915,7 +1097,7 @@ void Toolpaths::reset() delete_buffers(m_positions_buf_id); } -void Toolpaths::update_color_ranges(const Settings& settings) +void Toolpaths::update_color_ranges() { m_width_range.reset(); m_height_range.reset(); @@ -930,25 +1112,25 @@ void Toolpaths::update_color_ranges(const Settings& settings) const PathVertex& v = m_vertices[i]; if (v.is_extrusion()) { m_height_range.update(round_to_bin(v.height)); - if (!v.is_custom_gcode() || settings.extrusion_roles_visibility.at(EGCodeExtrusionRole::Custom)) { + if (!v.is_custom_gcode() || m_settings.extrusion_roles_visibility.at(EGCodeExtrusionRole::Custom)) { m_width_range.update(round_to_bin(v.width)); m_volumetric_rate_range.update(round_to_bin(v.volumetric_rate)); } m_fan_speed_range.update(v.fan_speed); m_temperature_range.update(v.temperature); } - if ((v.is_travel() && settings.options_visibility.at(EOptionType::Travels)) || v.is_extrusion()) + if ((v.is_travel() && m_settings.options_visibility.at(EOptionType::Travels)) || v.is_extrusion()) m_speed_range.update(v.feedrate); } for (size_t i = 0; i < m_layers_times.size(); ++i) { - for (const float time : m_layers_times[static_cast(settings.time_mode)]) { + for (const float time : m_layers_times[static_cast(m_settings.time_mode)]) { m_layer_time_range[i].update(time); } } } -Color Toolpaths::select_color(const PathVertex& v, const Settings& settings) const +Color Toolpaths::select_color(const PathVertex& v) const { if (v.type == EMoveType::Noop) return Dummy_Color; @@ -960,7 +1142,7 @@ Color Toolpaths::select_color(const PathVertex& v, const Settings& settings) con return Options_Colors.at(v.type); const size_t role = static_cast(v.role); - switch (settings.view_type) + switch (m_settings.view_type) { case EViewType::FeatureType: { @@ -999,12 +1181,12 @@ Color Toolpaths::select_color(const PathVertex& v, const Settings& settings) con case EViewType::LayerTimeLinear: { assert(!v.is_travel() || role < Travels_Colors.size()); - return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers_times[static_cast(settings.time_mode)][v.layer_id]); + return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers_times[static_cast(m_settings.time_mode)][v.layer_id]); } case EViewType::LayerTimeLogarithmic: { assert(!v.is_travel() || role < Travels_Colors.size()); - return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers_times[static_cast(settings.time_mode)][v.layer_id]); + return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers_times[static_cast(m_settings.time_mode)][v.layer_id]); } case EViewType::Tool: { diff --git a/src/slic3r/GUI/LibVGCode/Toolpaths.hpp b/src/slic3r/GUI/LibVGCode/Toolpaths.hpp index c46e92c3b8..d6ff661777 100644 --- a/src/slic3r/GUI/LibVGCode/Toolpaths.hpp +++ b/src/slic3r/GUI/LibVGCode/Toolpaths.hpp @@ -10,6 +10,7 @@ #if ENABLE_NEW_GCODE_VIEWER //################################################################################################################################ +#include "Settings.hpp" #include "SegmentTemplate.hpp" #include "OptionTemplate.hpp" #include "CogMarker.hpp" @@ -17,6 +18,7 @@ #include "PathVertex.hpp" #include "Bitset.hpp" #include "ColorRange.hpp" +#include "ViewRange.hpp" #include #include @@ -31,9 +33,6 @@ class Print; namespace libvgcode { -class ViewRange; -struct Settings; - class Toolpaths { public: @@ -51,25 +50,50 @@ public: // // Setup all the variables used for visualization and coloring of the toolpaths - // from the gcode moves contained in the given gcode_result, according to the setting - // contained in the given config. + // from the gcode moves contained in the given gcode_result. // - void load(const Slic3r::GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors, - const Settings& settings); + void load(const Slic3r::GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); // // Update the visibility property of toolpaths // - void update_enabled_entities(const ViewRange& range, const Settings& settings); + void update_enabled_entities(); // // Update the color of toolpaths // - void update_colors(const Settings& settings); + void update_colors(); // // Render the toolpaths // - void render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix, const Settings& settings); + void render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix); + + // + // Settings getters + // + EViewType get_view_type() const; + ETimeMode get_time_mode() const; + bool is_option_visible(EOptionType type) const; + bool is_extrusion_role_visible(EGCodeExtrusionRole role) const; + + // + // Settings setters + // + void set_view_type(EViewType type); + void set_time_mode(ETimeMode mode); + void toggle_option_visibility(EOptionType type); + void toggle_extrusion_role_visibility(EGCodeExtrusionRole role); + + // + // View range getters + // + const std::array& get_view_current_range() const; + const std::array& get_view_global_range() const; + + // + // View range setters + // + void set_view_current_range(size_t min, size_t max); // // Properties getters @@ -109,6 +133,9 @@ public: //################################################################################################################################ private: + Settings m_settings; + ViewRange m_view_range; + // // The OpenGL element used to represent all toolpath segments // @@ -236,8 +263,8 @@ private: unsigned int m_enabled_options_tex_id{ 0 }; void reset(); - void update_color_ranges(const Settings& settings); - Color select_color(const PathVertex& v, const Settings& settings) const; + void update_color_ranges(); + Color select_color(const PathVertex& v) const; void render_segments(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix, const Vec3f& camera_position); void render_options(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix); void render_cog_marker(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix); diff --git a/src/slic3r/GUI/LibVGCode/Viewer.cpp b/src/slic3r/GUI/LibVGCode/Viewer.cpp index 309b77abf3..7f132ea9f0 100644 --- a/src/slic3r/GUI/LibVGCode/Viewer.cpp +++ b/src/slic3r/GUI/LibVGCode/Viewer.cpp @@ -3,7 +3,7 @@ #include "libslic3r/Technologies.hpp" //################################################################################################################################ -///|/ Copyright (c) Prusa Research 2023 Enrico Turri @enricoturri1966, Pavel Mikuš @Godrak, Oleksandra Iushchenko @YuSanka +///|/ Copyright (c) Prusa Research 2023 Enrico Turri @enricoturri1966, Pavel Mikuš @Godrak ///|/ ///|/ libvgcode is released under the terms of the AGPLv3 or higher ///|/ @@ -18,73 +18,8 @@ #include "slic3r/GUI/ImGuiWrapper.hpp" //################################################################################################################################ -#include - namespace libvgcode { -static std::string short_time(const std::string& time) -{ - // Parse the dhms time format. - int days = 0; - int hours = 0; - int minutes = 0; - int seconds = 0; - if (time.find('d') != std::string::npos) - sscanf(time.c_str(), "%dd %dh %dm %ds", &days, &hours, &minutes, &seconds); - else if (time.find('h') != std::string::npos) - sscanf(time.c_str(), "%dh %dm %ds", &hours, &minutes, &seconds); - else if (time.find('m') != std::string::npos) - sscanf(time.c_str(), "%dm %ds", &minutes, &seconds); - else if (time.find('s') != std::string::npos) - sscanf(time.c_str(), "%ds", &seconds); - - // Round to full minutes. - if (days + hours + minutes > 0 && seconds >= 30) { - if (++minutes == 60) { - minutes = 0; - if (++hours == 24) { - hours = 0; - ++days; - } - } - } - - // Format the dhm time - char buffer[64]; - if (days > 0) - sprintf(buffer, "%dd%dh%dm", days, hours, minutes); - else if (hours > 0) - sprintf(buffer, "%dh%dm", hours, minutes); - else if (minutes > 0) - sprintf(buffer, "%dm", minutes); - else - sprintf(buffer, "%ds", seconds); - return buffer; -} - -// Returns the given time is seconds in format DDd HHh MMm SSs -inline std::string get_time_dhms(float time_in_secs) -{ - int days = (int)(time_in_secs / 86400.0f); - time_in_secs -= (float)days * 86400.0f; - int hours = (int)(time_in_secs / 3600.0f); - time_in_secs -= (float)hours * 3600.0f; - int minutes = (int)(time_in_secs / 60.0f); - time_in_secs -= (float)minutes * 60.0f; - - char buffer[64]; - if (days > 0) - sprintf(buffer, "%dd %dh %dm %ds", days, hours, minutes, (int)time_in_secs); - else if (hours > 0) - sprintf(buffer, "%dh %dm %ds", hours, minutes, (int)time_in_secs); - else if (minutes > 0) - sprintf(buffer, "%dm %ds", minutes, (int)time_in_secs); - else - sprintf(buffer, "%ds", (int)std::round(time_in_secs)); - - return buffer; -} - void Viewer::init() { m_toolpaths.init(); @@ -92,37 +27,12 @@ void Viewer::init() void Viewer::load(const Slic3r::GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) { - if (m_settings.time_mode != ETimeMode::Normal) { - const Slic3r::PrintEstimatedStatistics& stats = gcode_result.print_statistics; - bool force_normal_mode = static_cast(m_settings.time_mode) >= stats.modes.size(); - if (!force_normal_mode) { - const float normal_time = stats.modes[static_cast(ETimeMode::Normal)].time; - const float mode_time = stats.modes[static_cast(m_settings.time_mode)].time; - force_normal_mode = mode_time == 0.0f || - short_time(get_time_dhms(mode_time)) == short_time(get_time_dhms(normal_time)); // TO CHECK -> Is this necessary ? - } - if (force_normal_mode) - m_settings.time_mode = ETimeMode::Normal; - } - - m_toolpaths.load(gcode_result, str_tool_colors, m_settings); - m_view_range.set_global_range(0, m_toolpaths.get_vertices_count() - 1); - m_settings.update_colors = true; + m_toolpaths.load(gcode_result, str_tool_colors); } void Viewer::render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix) { - if (m_settings.update_enabled_entities) { - m_toolpaths.update_enabled_entities(m_view_range, m_settings); - m_settings.update_enabled_entities = false; - } - - if (m_settings.update_colors) { - m_toolpaths.update_colors(m_settings); - m_settings.update_colors = false; - } - - m_toolpaths.render(view_matrix, projection_matrix, m_settings); + m_toolpaths.render(view_matrix, projection_matrix); //################################################################################################################################ // Debug @@ -132,24 +42,22 @@ void Viewer::render(const Mat4x4f& view_matrix, const Mat4x4f& projection_matrix EViewType Viewer::get_view_type() const { - return m_settings.view_type; + return m_toolpaths.get_view_type(); } void Viewer::set_view_type(EViewType type) { - m_settings.view_type = type; - m_settings.update_colors = true; + m_toolpaths.set_view_type(type); } ETimeMode Viewer::get_time_mode() const { - return m_settings.time_mode; + return m_toolpaths.get_time_mode(); } void Viewer::set_time_mode(ETimeMode mode) { - m_settings.time_mode = mode; - m_settings.update_colors = true; + m_toolpaths.set_time_mode(mode); } const std::array, static_cast(ETimeMode::COUNT)>& Viewer::get_layers_times() const @@ -159,72 +67,37 @@ const std::array, static_cast(ETimeMode::COUNT)>& Vie bool Viewer::is_option_visible(EOptionType type) const { - try - { - return m_settings.options_visibility.at(type); - } - catch (...) - { - return false; - } + return m_toolpaths.is_option_visible(type); } void Viewer::toggle_option_visibility(EOptionType type) { - try - { - bool& value = m_settings.options_visibility.at(type); - value = !value; - m_settings.update_enabled_entities = true; - m_settings.update_colors = true; - } - catch (...) - { - // do nothing; - } + m_toolpaths.toggle_option_visibility(type); } bool Viewer::is_extrusion_role_visible(EGCodeExtrusionRole role) const { - try - { - return m_settings.extrusion_roles_visibility.at(role); - } - catch (...) - { - return false; - } + return m_toolpaths.is_extrusion_role_visible(role); } void Viewer::toggle_extrusion_role_visibility(EGCodeExtrusionRole role) { - try - { - bool& value = m_settings.extrusion_roles_visibility.at(role); - value = !value; - m_settings.update_enabled_entities = true; - m_settings.update_colors = true; - } - catch (...) - { - // do nothing; - } + m_toolpaths.toggle_extrusion_role_visibility(role); } const std::array& Viewer::get_view_current_range() const { - return m_view_range.get_current_range(); + return m_toolpaths.get_view_current_range(); } const std::array& Viewer::get_view_global_range() const { - return m_view_range.get_global_range(); + return m_toolpaths.get_view_global_range(); } void Viewer::set_view_current_range(size_t min, size_t max) { - m_view_range.set_current_range(min, max); - m_settings.update_enabled_entities = true; + m_toolpaths.set_view_current_range(min, max); } Vec3f Viewer::get_cog_position() const @@ -317,7 +190,8 @@ void Viewer::render_debug_window() ImGui::TableSetColumnIndex(0); imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "sequential range"); ImGui::TableSetColumnIndex(1); - imgui.text(std::to_string(m_view_range.get_current_min()) + " - " + std::to_string(m_view_range.get_current_max())); + const std::array& current_view_range = m_toolpaths.get_view_current_range(); + imgui.text(std::to_string(current_view_range[0]) + " - " + std::to_string(current_view_range[1])); auto add_range_property_row = [&imgui](const std::string& label, const std::array& range) { ImGui::TableNextRow(); diff --git a/src/slic3r/GUI/LibVGCode/Viewer.hpp b/src/slic3r/GUI/LibVGCode/Viewer.hpp index 403a6b5236..35f98a5d0c 100644 --- a/src/slic3r/GUI/LibVGCode/Viewer.hpp +++ b/src/slic3r/GUI/LibVGCode/Viewer.hpp @@ -10,9 +10,7 @@ #if ENABLE_NEW_GCODE_VIEWER //################################################################################################################################ -#include "Settings.hpp" #include "Toolpaths.hpp" -#include "ViewRange.hpp" //################################################################################################################################ // PrusaSlicer development only -> !!!TO BE REMOVED!!! @@ -87,9 +85,7 @@ public: void set_tool_marker_alpha(float alpha); private: - Settings m_settings; Toolpaths m_toolpaths; - ViewRange m_view_range; //################################################################################################################################ // Debug