From d7216b5d68766f5ba9aee838deaa60929027c26b Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Thu, 23 Sep 2021 11:51:30 +0200 Subject: [PATCH] Follow-up of f71cf324b9770fc9d9cc26510d1bbaac43cdbbd7 - Fixed shown tool position --- src/slic3r/GUI/GCodeViewer.cpp | 34 +++++++++++++++++++++++++++++++++- src/slic3r/GUI/GCodeViewer.hpp | 19 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 397e9aa03..e8a737957 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -267,7 +267,12 @@ void GCodeViewer::SequentialView::Marker::render() const imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Tool position") + ":"); ImGui::SameLine(); char buf[1024]; - sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", m_world_position(0), m_world_position(1), m_world_position(2)); +#if ENABLE_FIX_SEAMS_SYNCH + const Vec3f position = m_world_position + m_world_offset; + sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", position.x(), position.y(), position.z()); +#else + sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", m_world_position.x(), m_world_position.y(), m_world_position.z()); +#endif // ENABLE_FIX_SEAMS_SYNCH imgui.text(std::string(buf)); // force extra frame to automatically update window size @@ -862,6 +867,9 @@ void GCodeViewer::render() render_legend(legend_height); if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { m_sequential_view.marker.set_world_position(m_sequential_view.current_position); +#if ENABLE_FIX_SEAMS_SYNCH + m_sequential_view.marker.set_world_offset(m_sequential_view.current_offset); +#endif // ENABLE_FIX_SEAMS_SYNCH m_sequential_view.render(legend_height); } #if ENABLE_GCODE_VIEWER_STATISTICS @@ -1519,6 +1527,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) std::vector<InstanceBuffer> instances(m_buffers.size()); std::vector<InstanceIdBuffer> instances_ids(m_buffers.size()); #endif // ENABLE_SEAMS_USING_MODELS +#if ENABLE_FIX_SEAMS_SYNCH + std::vector<InstancesOffsets> instances_offsets(m_buffers.size()); +#endif // ENABLE_FIX_SEAMS_SYNCH std::vector<float> options_zs; #if ENABLE_FIX_SEAMS_SYNCH @@ -1559,6 +1570,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) #if ENABLE_SEAMS_USING_MODELS InstanceBuffer& inst_buffer = instances[id]; InstanceIdBuffer& inst_id_buffer = instances_ids[id]; +#if ENABLE_FIX_SEAMS_SYNCH + InstancesOffsets& inst_offsets = instances_offsets[id]; +#endif // ENABLE_FIX_SEAMS_SYNCH #endif // ENABLE_SEAMS_USING_MODELS // ensure there is at least one vertex buffer @@ -1602,6 +1616,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { #if ENABLE_FIX_SEAMS_SYNCH add_model_instance(curr, inst_buffer, inst_id_buffer, move_id); + inst_offsets.push_back(prev.position - curr.position); #else add_model_instance(curr, inst_buffer, inst_id_buffer, i); #endif // ENABLE_FIX_SEAMS_SYNCH @@ -1614,6 +1629,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { #if ENABLE_FIX_SEAMS_SYNCH add_vertices_as_model_batch(curr, t_buffer.model.data, v_buffer, inst_buffer, inst_id_buffer, move_id); + inst_offsets.push_back(prev.position - curr.position); #else add_vertices_as_model_batch(curr, t_buffer.model.data, v_buffer, inst_buffer, inst_id_buffer, i); #endif // ENABLE_FIX_SEAMS_SYNCH @@ -1851,6 +1867,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (!inst_buffer.empty()) { t_buffer.model.instances.buffer = inst_buffer; t_buffer.model.instances.s_ids = instances_ids[i]; +#if ENABLE_FIX_SEAMS_SYNCH + t_buffer.model.instances.offsets = instances_offsets[i]; +#endif // ENABLE_FIX_SEAMS_SYNCH } } else { @@ -1859,6 +1878,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (!inst_buffer.empty()) { t_buffer.model.instances.buffer = inst_buffer; t_buffer.model.instances.s_ids = instances_ids[i]; +#if ENABLE_FIX_SEAMS_SYNCH + t_buffer.model.instances.offsets = instances_offsets[i]; +#endif // ENABLE_FIX_SEAMS_SYNCH } } #else @@ -1867,6 +1889,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (!inst_buffer.empty()) { t_buffer.model.instances.buffer = inst_buffer; t_buffer.model.instances.s_ids = instances_ids[i]; +#if ENABLE_FIX_SEAMS_SYNCH + t_buffer.model.instances.offsets = instances_offsets[i]; +#endif // ENABLE_FIX_SEAMS_SYNCH } } else { @@ -2464,6 +2489,9 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool sequential_view->current_position.x() = buffer.model.instances.buffer[offset + 0]; sequential_view->current_position.y() = buffer.model.instances.buffer[offset + 1]; sequential_view->current_position.z() = buffer.model.instances.buffer[offset + 2]; +#if ENABLE_FIX_SEAMS_SYNCH + sequential_view->current_offset = buffer.model.instances.offsets[i]; +#endif // ENABLE_FIX_SEAMS_SYNCH found = true; break; @@ -2503,6 +2531,10 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast<GLintptr>(index * buffer.vertices.vertex_size_bytes()), static_cast<GLsizeiptr>(3 * sizeof(float)), static_cast<void*>(sequential_view->current_position.data()))); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_FIX_SEAMS_SYNCH + sequential_view->current_offset = Vec3f::Zero(); +#endif // ENABLE_FIX_SEAMS_SYNCH + found = true; break; } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 0d5552d67..6c164f5e8 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -31,6 +31,9 @@ class GCodeViewer using InstanceBuffer = std::vector<float>; using InstanceIdBuffer = std::vector<size_t>; #endif // ENABLE_SEAMS_USING_MODELS +#if ENABLE_FIX_SEAMS_SYNCH + using InstancesOffsets = std::vector<Vec3f>; +#endif // ENABLE_FIX_SEAMS_SYNCH static const std::vector<Color> Extrusion_Role_Colors; static const std::vector<Color> Options_Colors; @@ -151,6 +154,10 @@ class GCodeViewer InstanceBuffer buffer; // indices of the moves for all instances std::vector<size_t> s_ids; +#if ENABLE_FIX_SEAMS_SYNCH + // position offsets, used to show the correct value of the tool position + InstancesOffsets offsets; +#endif // ENABLE_FIX_SEAMS_SYNCH Ranges render_ranges; size_t data_size_bytes() const { return s_ids.size() * instance_size_bytes(); } @@ -665,6 +672,12 @@ public: GLModel m_model; Vec3f m_world_position; Transform3f m_world_transform; +#if ENABLE_FIX_SEAMS_SYNCH + // for seams, the position of the marker is on the last endpoint of the toolpath containing it + // the offset is used to show the correct value of tool position in the "ToolPosition" window + // see implementation of render() method + Vec3f m_world_offset; +#endif // ENABLE_FIX_SEAMS_SYNCH float m_z_offset{ 0.5f }; bool m_visible{ true }; @@ -674,6 +687,9 @@ public: const BoundingBoxf3& get_bounding_box() const { return m_model.get_bounding_box(); } void set_world_position(const Vec3f& position); +#if ENABLE_FIX_SEAMS_SYNCH + void set_world_offset(const Vec3f& offset) { m_world_offset = offset; } +#endif // ENABLE_FIX_SEAMS_SYNCH bool is_visible() const { return m_visible; } void set_visible(bool visible) { m_visible = visible; } @@ -731,6 +747,9 @@ public: Endpoints global; #endif // ENABLE_SEAMS_USING_MODELS Vec3f current_position{ Vec3f::Zero() }; +#if ENABLE_FIX_SEAMS_SYNCH + Vec3f current_offset{ Vec3f::Zero() }; +#endif // ENABLE_FIX_SEAMS_SYNCH Marker marker; GCodeWindow gcode_window; std::vector<unsigned int> gcode_ids;