mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-13 18:35:52 +08:00
A bunch of fixes for the new gcode visualization
This commit is contained in:
parent
0764d9ffda
commit
39c39798a8
@ -742,6 +742,17 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s
|
||||
break;
|
||||
}
|
||||
}
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#if ENABLE_NEW_GCODE_VIEWER
|
||||
size_t last_block_id = first_block_id;
|
||||
for (size_t i = last_block_id; i < cumulative_lines_counts.size(); ++i) {
|
||||
if (*m_cache_range.max <= cumulative_lines_counts[i]) {
|
||||
last_block_id = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
size_t last_block_id = 0;
|
||||
for (size_t i = 0; i < cumulative_lines_counts.size(); ++i) {
|
||||
if (*m_cache_range.max <= cumulative_lines_counts[i]) {
|
||||
@ -749,6 +760,9 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s
|
||||
break;
|
||||
}
|
||||
}
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#endif // ENABLE_NEW_GCODE_VIEWER
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
assert(last_block_id >= first_block_id);
|
||||
|
||||
FilePtr file(boost::nowide::fopen(m_filename.c_str(), "rb"));
|
||||
@ -785,11 +799,23 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s
|
||||
}
|
||||
|
||||
const size_t ref_id = (i == 0) ? 0 : i - 1;
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#if ENABLE_NEW_GCODE_VIEWER
|
||||
const size_t first_line_id = (i == 0) ? *m_cache_range.min :
|
||||
(*m_cache_range.min > cumulative_lines_counts[ref_id]) ? *m_cache_range.min - cumulative_lines_counts[ref_id] : 1;
|
||||
const size_t last_line_id = (*m_cache_range.max <= cumulative_lines_counts[i]) ?
|
||||
(i == 0) ? *m_cache_range.max : *m_cache_range.max - cumulative_lines_counts[ref_id] : m_lines_ends[i].size();
|
||||
assert(last_line_id >= first_line_id);
|
||||
#else
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
const size_t first_line_id = (i == 0) ? *m_cache_range.min :
|
||||
(*m_cache_range.min > cumulative_lines_counts[ref_id]) ? *m_cache_range.min - cumulative_lines_counts[ref_id] : 1;
|
||||
const size_t last_line_id = (*m_cache_range.max <= cumulative_lines_counts[i]) ?
|
||||
(i == 0) ? *m_cache_range.max : *m_cache_range.max - cumulative_lines_counts[ref_id] : m_lines_ends[i].size();
|
||||
assert(last_line_id >= first_line_id);
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#endif // ENABLE_NEW_GCODE_VIEWER
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
for (size_t j = first_line_id; j <= last_line_id; ++j) {
|
||||
const size_t begin = (j == 1) ? 0 : m_lines_ends[i][j - 2];
|
||||
@ -811,14 +837,19 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s
|
||||
}
|
||||
}
|
||||
}
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#if ENABLE_NEW_GCODE_VIEWER
|
||||
assert(m_lines_cache.size() == m_cache_range.size());
|
||||
#endif // ENABLE_NEW_GCODE_VIEWER
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
};
|
||||
|
||||
static const ImVec4 LINE_NUMBER_COLOR = ImGuiWrapper::COL_ORANGE_LIGHT;
|
||||
static const ImVec4 SELECTION_RECT_COLOR = ImGuiWrapper::COL_ORANGE_DARK;
|
||||
static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f };
|
||||
static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f };
|
||||
static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f };
|
||||
static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f };
|
||||
static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f };
|
||||
static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f };
|
||||
|
||||
if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0)
|
||||
return;
|
||||
@ -1178,7 +1209,7 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr
|
||||
{
|
||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
#if ENABLE_NEW_GCODE_VIEWER
|
||||
m_new_viewer.set_top_layer_only_view(get_app_config()->get_bool("seq_top_layer_only"));
|
||||
m_new_viewer.set_top_layer_only_view_range(get_app_config()->get_bool("seq_top_layer_only"));
|
||||
|
||||
std::vector<ColorRGBA> tool_colors;
|
||||
if (m_new_viewer.get_view_type() == libvgcode::EViewType::Tool && !gcode_result.extruder_colors.empty())
|
||||
|
@ -23,7 +23,7 @@ struct Settings
|
||||
bool update_colors{ true };
|
||||
EViewType view_type{ EViewType::FeatureType };
|
||||
ETimeMode time_mode{ ETimeMode::Normal };
|
||||
bool top_layer_only_view{ false };
|
||||
bool top_layer_only_view_range{ false };
|
||||
|
||||
std::map<EOptionType, bool> options_visibility{ {
|
||||
{ EOptionType::Travels, false },
|
||||
|
@ -67,8 +67,8 @@ void ViewRange::set_global_range(uint32_t min, uint32_t max)
|
||||
|
||||
void ViewRange::reset()
|
||||
{
|
||||
m_global.reset();
|
||||
m_current.reset();
|
||||
m_global.reset();
|
||||
}
|
||||
|
||||
} // namespace libvgcode
|
||||
|
@ -73,14 +73,14 @@ void Viewer::set_layers_range(uint32_t min, uint32_t max)
|
||||
m_impl.set_layers_range(min, max);
|
||||
}
|
||||
|
||||
bool Viewer::is_top_layer_only_view() const
|
||||
bool Viewer::is_top_layer_only_view_range() const
|
||||
{
|
||||
return m_impl.is_top_layer_only_view();
|
||||
return m_impl.is_top_layer_only_view_range();
|
||||
}
|
||||
|
||||
void Viewer::set_top_layer_only_view(bool top_layer_only_view)
|
||||
void Viewer::set_top_layer_only_view_range(bool top_layer_only_view_range)
|
||||
{
|
||||
m_impl.set_top_layer_only_view(top_layer_only_view);
|
||||
m_impl.set_top_layer_only_view_range(top_layer_only_view_range);
|
||||
}
|
||||
|
||||
bool Viewer::is_option_visible(EOptionType type) const
|
||||
|
@ -49,8 +49,8 @@ public:
|
||||
void set_layers_range(const std::array<uint32_t, 2>& range);
|
||||
void set_layers_range(uint32_t min, uint32_t max);
|
||||
|
||||
bool is_top_layer_only_view() const;
|
||||
void set_top_layer_only_view(bool top_layer_only_view);
|
||||
bool is_top_layer_only_view_range() const;
|
||||
void set_top_layer_only_view_range(bool top_layer_only_view_range);
|
||||
|
||||
bool is_option_visible(EOptionType type) const;
|
||||
void toggle_option_visibility(EOptionType type);
|
||||
|
@ -752,11 +752,11 @@ void ViewerImpl::update_enabled_entities()
|
||||
// when top layer only visualization is enabled, we need to render
|
||||
// all the toolpaths in the other layers as grayed, so extend the range
|
||||
// to contain them
|
||||
if (m_settings.top_layer_only_view)
|
||||
if (m_settings.top_layer_only_view_range)
|
||||
range[0] = m_view_range.get_global_range()[0];
|
||||
|
||||
// to show the options at the current tool marker position we need to extend the range by one extra step
|
||||
if (m_vertices[range[1]].is_option())
|
||||
if (m_vertices[range[1]].is_option() && range[1] < static_cast<uint32_t>(m_vertices.size()) - 1)
|
||||
++range[1];
|
||||
|
||||
for (uint32_t i = range[0]; i < range[1]; ++i) {
|
||||
@ -830,10 +830,11 @@ void ViewerImpl::update_colors()
|
||||
{
|
||||
update_color_ranges();
|
||||
|
||||
const uint32_t top_layer_id = m_settings.top_layer_only_view ? m_layers_range.get()[1] : 0;
|
||||
const uint32_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers_range.get()[1] : 0;
|
||||
const bool color_top_layer_only = m_view_range.get_global_range()[1] != m_view_range.get_current_range()[1];
|
||||
std::vector<float> colors(m_vertices.size());
|
||||
for (size_t i = 0; i < m_vertices.size(); i++) {
|
||||
colors[i] = (m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i]));
|
||||
colors[i] = (color_top_layer_only && m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i]));
|
||||
}
|
||||
|
||||
// update gpu buffer for colors
|
||||
@ -892,9 +893,9 @@ const std::array<uint32_t, 2>& ViewerImpl::get_layers_range() const
|
||||
return m_layers_range.get();
|
||||
}
|
||||
|
||||
bool ViewerImpl::is_top_layer_only_view() const
|
||||
bool ViewerImpl::is_top_layer_only_view_range() const
|
||||
{
|
||||
return m_settings.top_layer_only_view;
|
||||
return m_settings.top_layer_only_view_range;
|
||||
}
|
||||
|
||||
bool ViewerImpl::is_option_visible(EOptionType type) const
|
||||
@ -946,9 +947,9 @@ void ViewerImpl::set_layers_range(uint32_t min, uint32_t max)
|
||||
m_settings.update_colors = true;
|
||||
}
|
||||
|
||||
void ViewerImpl::set_top_layer_only_view(bool top_layer_only_view)
|
||||
void ViewerImpl::set_top_layer_only_view_range(bool top_layer_only_view_range)
|
||||
{
|
||||
m_settings.top_layer_only_view = top_layer_only_view;
|
||||
m_settings.top_layer_only_view_range = top_layer_only_view_range;
|
||||
m_settings.update_colors = true;
|
||||
}
|
||||
|
||||
@ -1030,9 +1031,16 @@ void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max)
|
||||
new_range.set(min_id, max_id);
|
||||
|
||||
if (m_old_current_range != new_range) {
|
||||
if (m_settings.update_view_global_range) {
|
||||
// force update of global range, if required, to avoid clamping the current range with global old values
|
||||
// when calling set_current_range()
|
||||
update_view_global_range();
|
||||
m_settings.update_view_global_range = false;
|
||||
}
|
||||
m_view_range.set_current_range(new_range);
|
||||
m_old_current_range = new_range;
|
||||
m_settings.update_enabled_entities = true;
|
||||
m_settings.update_colors = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1186,16 +1194,34 @@ void ViewerImpl::set_tool_marker_alpha(float alpha)
|
||||
}
|
||||
#endif // !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS
|
||||
|
||||
static bool is_visible(EMoveType type, const Settings& settings)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ((type == EMoveType::Travel && !settings.options_visibility.at(EOptionType::Travels)) ||
|
||||
(type == EMoveType::Wipe && !settings.options_visibility.at(EOptionType::Wipes)) ||
|
||||
(type == EMoveType::Retract && !settings.options_visibility.at(EOptionType::Retractions)) ||
|
||||
(type == EMoveType::Unretract && !settings.options_visibility.at(EOptionType::Unretractions)) ||
|
||||
(type == EMoveType::Seam && !settings.options_visibility.at(EOptionType::Seams)) ||
|
||||
(type == EMoveType::ToolChange && !settings.options_visibility.at(EOptionType::ToolChanges)) ||
|
||||
(type == EMoveType::ColorChange && !settings.options_visibility.at(EOptionType::ColorChanges)) ||
|
||||
(type == EMoveType::PausePrint && !settings.options_visibility.at(EOptionType::PausePrints)) ||
|
||||
(type == EMoveType::CustomGCode && !settings.options_visibility.at(EOptionType::CustomGCodes))) ? false : true;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void ViewerImpl::update_view_global_range()
|
||||
{
|
||||
const std::array<uint32_t, 2>& layers_range = m_layers_range.get();
|
||||
const bool travels_visible = m_settings.options_visibility.at(EOptionType::Travels);
|
||||
|
||||
auto first_it = m_vertices.begin();
|
||||
while (first_it != m_vertices.end() && (
|
||||
first_it->layer_id < layers_range[0] ||
|
||||
first_it->is_option() ||
|
||||
(first_it->is_travel() && !travels_visible))) {
|
||||
while (first_it != m_vertices.end() &&
|
||||
(first_it->layer_id < layers_range[0] || !is_visible(first_it->type, m_settings))) {
|
||||
++first_it;
|
||||
}
|
||||
|
||||
@ -1213,18 +1239,29 @@ void ViewerImpl::update_view_global_range()
|
||||
while (last_it != m_vertices.end() && last_it->layer_id <= layers_range[1]) {
|
||||
++last_it;
|
||||
}
|
||||
if (last_it != first_it)
|
||||
--last_it;
|
||||
|
||||
// remove trailing options, if any
|
||||
// remove disabled trailing options, if any
|
||||
auto rev_first_it = std::make_reverse_iterator(first_it);
|
||||
if (rev_first_it != m_vertices.rbegin())
|
||||
--rev_first_it;
|
||||
auto rev_last_it = std::make_reverse_iterator(last_it);
|
||||
while (rev_last_it != rev_first_it && rev_last_it->is_option()) {
|
||||
if (rev_last_it != m_vertices.rbegin())
|
||||
--rev_last_it;
|
||||
|
||||
bool reduced = false;
|
||||
while (rev_last_it != rev_first_it && !is_visible(rev_last_it->type, m_settings)) {
|
||||
++rev_last_it;
|
||||
reduced = true;
|
||||
}
|
||||
|
||||
last_it = rev_last_it.base();
|
||||
if (reduced && rev_last_it != m_vertices.rend())
|
||||
last_it = rev_last_it.base() - 1;
|
||||
|
||||
if (travels_visible) {
|
||||
// if the global range ends with a travel move, extend it to the travel end
|
||||
while (last_it != m_vertices.end() && last_it->is_travel()) {
|
||||
while (last_it != m_vertices.end() && last_it + 1 != m_vertices.end() && last_it->is_travel()) {
|
||||
++last_it;
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ public:
|
||||
EViewType get_view_type() const;
|
||||
ETimeMode get_time_mode() const;
|
||||
const std::array<uint32_t, 2>& get_layers_range() const;
|
||||
bool is_top_layer_only_view() const;
|
||||
bool is_top_layer_only_view_range() const;
|
||||
bool is_option_visible(EOptionType type) const;
|
||||
bool is_extrusion_role_visible(EGCodeExtrusionRole role) const;
|
||||
|
||||
@ -93,7 +93,7 @@ public:
|
||||
void set_time_mode(ETimeMode mode);
|
||||
void set_layers_range(const std::array<uint32_t, 2>& range);
|
||||
void set_layers_range(uint32_t min, uint32_t max);
|
||||
void set_top_layer_only_view(bool top_layer_only_view);
|
||||
void set_top_layer_only_view_range(bool top_layer_only_view_range);
|
||||
void toggle_option_visibility(EOptionType type);
|
||||
void toggle_extrusion_role_visibility(EGCodeExtrusionRole role);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user