mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-28 02:52:00 +08:00
411 lines
13 KiB
C++
411 lines
13 KiB
C++
///|/ Copyright (c) Prusa Research 2023 Enrico Turri @enricoturri1966, Pavel Mikuš @Godrak
|
|
///|/
|
|
///|/ libvgcode is released under the terms of the AGPLv3 or higher
|
|
///|/
|
|
#ifndef VGCODE_VIEWER_HPP
|
|
#define VGCODE_VIEWER_HPP
|
|
|
|
#include "Types.hpp"
|
|
|
|
#include <string>
|
|
|
|
namespace libvgcode {
|
|
|
|
class ViewerImpl;
|
|
struct GCodeInputData;
|
|
struct PathVertex;
|
|
class ColorRange;
|
|
struct ColorPrint;
|
|
|
|
class Viewer
|
|
{
|
|
public:
|
|
Viewer();
|
|
~Viewer();
|
|
Viewer(const Viewer& other) = delete;
|
|
Viewer(Viewer&& other) = delete;
|
|
Viewer& operator = (const Viewer& other) = delete;
|
|
Viewer& operator = (Viewer&& other) = delete;
|
|
|
|
//
|
|
// Initialize the viewer.
|
|
// Param opengl_context_version must be the string returned by glGetString(GL_VERSION).
|
|
// This method must be called after a valid OpenGL context has been already created
|
|
// and before calling any other method of the viewer.
|
|
// Throws an std::runtime_error exception if:
|
|
// * the method is called before creating an OpenGL context
|
|
// * the created OpenGL context does not support OpenGL 3.2 or greater
|
|
// * when using OpenGL ES, the created OpenGL ES context does not support OpenGL ES 2.0 or greater
|
|
// * any of the shaders fails to compile
|
|
//
|
|
void init(const std::string& opengl_context_version);
|
|
//
|
|
// Release the resources used by the viewer.
|
|
// This method must be called before releasing the OpenGL context if the viewer
|
|
// goes out of scope after releasing it.
|
|
//
|
|
void shutdown();
|
|
//
|
|
// Reset the contents of the viewer.
|
|
// Automatically called by load() method.
|
|
//
|
|
void reset();
|
|
//
|
|
// Setup the viewer content from the given data.
|
|
// See: GCodeInputData
|
|
//
|
|
void load(GCodeInputData&& gcode_data);
|
|
//
|
|
// Render the toolpaths according to the current settings and
|
|
// using the given camera matrices.
|
|
//
|
|
void render(const Mat4x4& view_matrix, const Mat4x4& projection_matrix);
|
|
|
|
//
|
|
// ************************************************************************
|
|
// Settings
|
|
// The following methods can be used to query/customize the parameters
|
|
// used to render the toolpaths.
|
|
// ************************************************************************
|
|
//
|
|
|
|
//
|
|
// View type
|
|
// See: EViewType
|
|
//
|
|
EViewType get_view_type() const;
|
|
void set_view_type(EViewType type);
|
|
//
|
|
// Time mode
|
|
// See: ETimeMode
|
|
//
|
|
ETimeMode get_time_mode() const;
|
|
void set_time_mode(ETimeMode mode);
|
|
//
|
|
// Top layer only
|
|
// Whether or not the visible range is limited to the current top layer only.
|
|
//
|
|
bool is_top_layer_only_view_range() const;
|
|
//
|
|
// Toggle the top layer only state.
|
|
//
|
|
void toggle_top_layer_only_view_range();
|
|
//
|
|
// Returns true if the given option is visible.
|
|
//
|
|
bool is_option_visible(EOptionType type) const;
|
|
//
|
|
// Toggle the visibility state of the given option.
|
|
//
|
|
void toggle_option_visibility(EOptionType type);
|
|
//
|
|
// Returns true if the given extrusion role is visible.
|
|
//
|
|
bool is_extrusion_role_visible(EGCodeExtrusionRole role) const;
|
|
//
|
|
// Toggle the visibility state of the given extrusion role.
|
|
//
|
|
void toggle_extrusion_role_visibility(EGCodeExtrusionRole role);
|
|
//
|
|
// Return the color used to render the given extrusion rols.
|
|
//
|
|
const Color& get_extrusion_role_color(EGCodeExtrusionRole role) const;
|
|
//
|
|
// Set the color used to render the given extrusion role.
|
|
//
|
|
void set_extrusion_role_color(EGCodeExtrusionRole role, const Color& color);
|
|
//
|
|
// Reset the colors used to render the extrusion roles to the default value.
|
|
//
|
|
void reset_default_extrusion_roles_colors();
|
|
//
|
|
// Return the color used to render the given option.
|
|
//
|
|
const Color& get_option_color(EOptionType type) const;
|
|
//
|
|
// Set the color used to render the given option.
|
|
//
|
|
void set_option_color(EOptionType type, const Color& color);
|
|
//
|
|
// Reset the colors used to render the options to the default value.
|
|
//
|
|
void reset_default_options_colors();
|
|
//
|
|
// Return the count of colors in the palette used to render
|
|
// the toolpaths when the view type is EViewType::Tool.
|
|
//
|
|
size_t get_tool_colors_count() const;
|
|
//
|
|
// Return the palette used to render the toolpaths when
|
|
// the view type is EViewType::Tool.
|
|
//
|
|
const Palette& get_tool_colors() const;
|
|
//
|
|
// Set the palette used to render the toolpaths when
|
|
// the view type is EViewType::Tool with the given one.
|
|
//
|
|
void set_tool_colors(const Palette& colors);
|
|
//
|
|
// Return the count of colors in the palette used to render
|
|
// the toolpaths when the view type is EViewType::ColorPrint.
|
|
//
|
|
size_t get_color_print_colors_count() const;
|
|
//
|
|
// Return the palette used to render the toolpaths when
|
|
// the view type is EViewType::ColorPrint.
|
|
//
|
|
const Palette& get_color_print_colors() const;
|
|
//
|
|
// Set the palette used to render the toolpaths when
|
|
// the view type is EViewType::ColorPrint with the given one.
|
|
//
|
|
void set_color_print_colors(const Palette& colors);
|
|
//
|
|
// Get the color range for the given view type.
|
|
// Valid view types are:
|
|
// EViewType::Height
|
|
// EViewType::Width
|
|
// EViewType::Speed
|
|
// EViewType::FanSpeed
|
|
// EViewType::Temperature
|
|
// EViewType::VolumetricFlowRate
|
|
// EViewType::LayerTimeLinear
|
|
// EViewType::LayerTimeLogarithmic
|
|
//
|
|
const ColorRange& get_color_range(EViewType type) const;
|
|
//
|
|
// Set the palette for the color range corresponding to the given view type
|
|
// with the given value.
|
|
// Valid view types are:
|
|
// EViewType::Height
|
|
// EViewType::Width
|
|
// EViewType::Speed
|
|
// EViewType::FanSpeed
|
|
// EViewType::Temperature
|
|
// EViewType::VolumetricFlowRate
|
|
// EViewType::LayerTimeLinear
|
|
// EViewType::LayerTimeLogarithmic
|
|
//
|
|
void set_color_range_palette(EViewType type, const Palette& palette);
|
|
//
|
|
// Get the radius, in mm, of the cylinders used to render the travel moves.
|
|
//
|
|
float get_travels_radius() const;
|
|
//
|
|
// Set the radius, in mm, of the cylinders used to render the travel moves.
|
|
// Radius is clamped to [MIN_TRAVELS_RADIUS_MM..MAX_TRAVELS_RADIUS_MM]
|
|
//
|
|
void set_travels_radius(float radius);
|
|
//
|
|
// Get the radius, in mm, of the cylinders used to render the wipe moves.
|
|
//
|
|
float get_wipes_radius() const;
|
|
//
|
|
// Set the radius, in mm, of the cylinders used to render the wipe moves.
|
|
// Radius is clamped to [MIN_WIPES_RADIUS_MM..MAX_WIPES_RADIUS_MM]
|
|
//
|
|
void set_wipes_radius(float radius);
|
|
//
|
|
// Return the count of detected layers.
|
|
//
|
|
size_t get_layers_count() const;
|
|
//
|
|
// Return the current visible layers range.
|
|
//
|
|
const Interval& get_layers_view_range() const;
|
|
//
|
|
// Set the current visible layers range with the given interval.
|
|
// Values are clamped to [0..get_layers_count() - 1].
|
|
//
|
|
void set_layers_view_range(const Interval& range);
|
|
//
|
|
// Set the current visible layers range with the given min and max values.
|
|
// Values are clamped to [0..get_layers_count() - 1].
|
|
//
|
|
void set_layers_view_range(Interval::value_type min, Interval::value_type max);
|
|
//
|
|
// Return the current visible range.
|
|
// Three ranges are defined: full, enabled and visible.
|
|
// For all of them the range endpoints represent:
|
|
// [0] -> min vertex id
|
|
// [1] -> max vertex id
|
|
// Full is the range of vertices that could potentially be visualized accordingly to the current settings.
|
|
// Enabled is the part of the full range that is selected for visualization accordingly to the current settings.
|
|
// Visible is the part of the enabled range that is actually visualized accordingly to the current settings.
|
|
//
|
|
const Interval& get_view_visible_range() const;
|
|
//
|
|
// Set the current visible range.
|
|
// Values are clamped to the current view enabled range;
|
|
//
|
|
void set_view_visible_range(Interval::value_type min, Interval::value_type max);
|
|
//
|
|
// Return the current full range.
|
|
//
|
|
const Interval& get_view_full_range() const;
|
|
//
|
|
// Return the current enabled range.
|
|
//
|
|
const Interval& get_view_enabled_range() const;
|
|
|
|
//
|
|
// ************************************************************************
|
|
// Property getters
|
|
// The following methods can be used to query detected properties.
|
|
// ************************************************************************
|
|
//
|
|
|
|
//
|
|
// Spiral vase mode
|
|
// Whether or not the gcode was generated with spiral vase mode enabled.
|
|
// See: GCodeInputData
|
|
//
|
|
bool is_spiral_vase_mode() const;
|
|
//
|
|
// Return the z of the layer with the given id
|
|
// or 0.0f if the id does not belong to [0..get_layers_count() - 1].
|
|
//
|
|
float get_layer_z(size_t layer_id) const;
|
|
//
|
|
// Return the list of zs of the detected layers.
|
|
//
|
|
std::vector<float> get_layers_zs() const;
|
|
//
|
|
// Return the id of the layer closest to the given z.
|
|
//
|
|
size_t get_layer_id_at(float z) const;
|
|
//
|
|
// Return the count of detected used extruders.
|
|
//
|
|
size_t get_used_extruders_count() const;
|
|
//
|
|
// Return the list of ids of the detected used extruders.
|
|
//
|
|
std::vector<uint8_t> get_used_extruders_ids() const;
|
|
//
|
|
// Return the list of detected time modes.
|
|
//
|
|
std::vector<ETimeMode> get_time_modes() const;
|
|
//
|
|
// Return the count of vertices used to render the toolpaths
|
|
//
|
|
size_t get_vertices_count() const;
|
|
//
|
|
// Return the vertex pointed by the max value of the view visible range
|
|
//
|
|
const PathVertex& get_current_vertex() const;
|
|
//
|
|
// Return the index of vertex pointed by the max value of the view visible range
|
|
//
|
|
size_t get_current_vertex_id() const;
|
|
//
|
|
// Return the vertex at the given index
|
|
//
|
|
const PathVertex& get_vertex_at(size_t id) const;
|
|
//
|
|
// Return the estimated time, in seconds, at the vertex with the given index
|
|
// using the current time mode.
|
|
//
|
|
float get_estimated_time_at(size_t id) const;
|
|
//
|
|
// Return the color used to render the given vertex with the current settings.
|
|
//
|
|
Color get_vertex_color(const PathVertex& vertex) const;
|
|
//
|
|
// Return the count of detected extrusion roles
|
|
//
|
|
size_t get_extrusion_roles_count() const;
|
|
//
|
|
// Return the list of detected extrusion roles
|
|
//
|
|
std::vector<EGCodeExtrusionRole> get_extrusion_roles() const;
|
|
//
|
|
// Return the count of detected options.
|
|
//
|
|
size_t get_options_count() const;
|
|
//
|
|
// Return the list of detected options.
|
|
//
|
|
const std::vector<EOptionType>& get_options() const;
|
|
//
|
|
// Return the count of detected color prints.
|
|
//
|
|
size_t get_color_prints_count(uint8_t extruder_id) const;
|
|
//
|
|
// Return the list of detected color prints.
|
|
//
|
|
std::vector<ColorPrint> get_color_prints(uint8_t extruder_id) const;
|
|
//
|
|
// Return the estimated time for the given role and the current time mode.
|
|
//
|
|
float get_extrusion_role_time(EGCodeExtrusionRole role) const;
|
|
//
|
|
// Return the estimated time for the travel moves and the current time mode.
|
|
//
|
|
float get_travels_time() const;
|
|
//
|
|
// Return the list of layers time for the current time mode.
|
|
//
|
|
std::vector<float> get_layers_times() const;
|
|
//
|
|
// Return the axes aligned bounding box of the toolpaths.
|
|
//
|
|
AABox get_bounding_box(EBBoxType type) const;
|
|
//
|
|
// Return the size of the used cpu memory, in bytes
|
|
//
|
|
size_t get_used_cpu_memory() const;
|
|
//
|
|
// Return the size of the used gpu memory, in bytes
|
|
//
|
|
size_t get_used_gpu_memory() const;
|
|
|
|
#if VGCODE_ENABLE_DEBUG_CODE
|
|
size_t get_enabled_segments_count() const;
|
|
const Interval& get_enabled_segments_range() const;
|
|
size_t get_enabled_options_count() const;
|
|
const Interval& get_enabled_options_range() const;
|
|
#endif // VGCODE_ENABLE_DEBUG_CODE
|
|
|
|
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
|
|
//
|
|
// Returns the position of the center of gravity of the toolpaths.
|
|
// It does not take in account extrusions of type:
|
|
// Skirt
|
|
// Support Material
|
|
// Support Material Interface
|
|
// WipeTower
|
|
// Custom
|
|
//
|
|
Vec3 get_cog_position() const;
|
|
|
|
float get_cog_marker_scale_factor() const;
|
|
void set_cog_marker_scale_factor(float factor);
|
|
|
|
bool is_tool_marker_enabled() const;
|
|
void enable_tool_marker(bool value);
|
|
|
|
const Vec3& get_tool_marker_position() const;
|
|
void set_tool_marker_position(const Vec3& position);
|
|
|
|
float get_tool_marker_offset_z() const;
|
|
void set_tool_marker_offset_z(float offset_z);
|
|
|
|
float get_tool_marker_scale_factor() const;
|
|
void set_tool_marker_scale_factor(float factor);
|
|
|
|
const Color& get_tool_marker_color() const;
|
|
void set_tool_marker_color(const Color& color);
|
|
|
|
float get_tool_marker_alpha() const;
|
|
void set_tool_marker_alpha(float alpha);
|
|
#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS
|
|
|
|
private:
|
|
ViewerImpl* m_impl{ nullptr };
|
|
};
|
|
|
|
} // namespace libvgcode
|
|
|
|
#endif // VGCODE_VIEWER_HPP
|