From 302a662a50e9b3547280f38edb73331f3f078a0f Mon Sep 17 00:00:00 2001 From: surynek Date: Fri, 21 Feb 2025 23:10:12 +0100 Subject: [PATCH] SPE-2702: Seq arrange data for HT90, printhead model, extended delta visualization --- .../{geometries.txt => geometries.json} | 49 ++++++++++ .../prusa3d_ht90_actuator.stl | Bin 0 -> 193584 bytes src/libslic3r/ArrangeHelper.cpp | 2 +- src/slic3r/GUI/GCodeViewer.cpp | 92 +++++++++++++++++- src/slic3r/GUI/GCodeViewer.hpp | 11 ++- src/slic3r/GUI/GLCanvas3D.cpp | 17 ++-- src/slic3r/GUI/GLCanvas3D.hpp | 2 +- 7 files changed, 158 insertions(+), 15 deletions(-) rename resources/data/printer_gantries/{geometries.txt => geometries.json} (85%) create mode 100644 resources/data/printer_gantries/prusa3d_ht90_actuator.stl diff --git a/resources/data/printer_gantries/geometries.txt b/resources/data/printer_gantries/geometries.json similarity index 85% rename from resources/data/printer_gantries/geometries.txt rename to resources/data/printer_gantries/geometries.json index dabf55f65b..592a0d117e 100644 --- a/resources/data/printer_gantries/geometries.txt +++ b/resources/data/printer_gantries/geometries.json @@ -281,6 +281,55 @@ ] } ] + }, + { + "printer_notes_regex": ".*PRINTER_MODEL_HT90.*", + "gantry_model_filename": "prusa3d_ht90_actuator.stl", + "slices": [ + { + "height": "0", + "type": "convex", + "polygons": [ + "-5,-5; 5,-5; 5,5; -5,5" + ] + }, + { + "height": "1", + "type": "convex", + "polygons": [ + "-33,-2; 33,-2; 33,48; -33,48", + "-46,-37; 46,-37; 46,2; -46,2" + ] + }, + { + "height": "20", + "type": "convex", + "polygons": [ + "-55,-55; 55,-55; 55,55; -55,55" + ] + }, + { + "height": "28", + "type": "convex", + "polygons": [ + "-76,-68; 76,-68; 76,65; -76,65" + ] + }, + { + "height": "40", + "type": "convex", + "polygons": [ + "-120,-118; 120,-118; 120,94; -120,94" + ] + }, + { + "height": "60", + "type": "box", + "polygons": [ + "-200,-200; 200,-200; 200,200; -200,200" + ] + } + ] } ] } diff --git a/resources/data/printer_gantries/prusa3d_ht90_actuator.stl b/resources/data/printer_gantries/prusa3d_ht90_actuator.stl new file mode 100644 index 0000000000000000000000000000000000000000..05b7fb75e29f53ff3965734f5b7f62cccdf94e03 GIT binary patch literal 193584 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

$e?|T9 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

S1*vDBqY*0 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 Qy_5L{4Yn|WcIqJh58Pr5#Q*>R literal 0 HcmV?d00001 diff --git a/src/libslic3r/ArrangeHelper.cpp b/src/libslic3r/ArrangeHelper.cpp index b34c7924ca..ac22083dd6 100644 --- a/src/libslic3r/ArrangeHelper.cpp +++ b/src/libslic3r/ArrangeHelper.cpp @@ -71,7 +71,7 @@ static Sequential::PrinterGeometry get_printer_geometry(const ConfigBase& config { if (! printer_notes.empty()) { try { - boost::nowide::ifstream in(resources_dir() + "/data/printer_gantries/geometries.txt"); + boost::nowide::ifstream in(resources_dir() + "/data/printer_gantries/geometries.json"); boost::property_tree::ptree pt; boost::property_tree::read_json(in, pt); for (const auto& printer : pt.get_child("printers")) { diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 86796dff5f..d425012ed1 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -217,12 +217,13 @@ int GCodeViewer::SequentialView::ActualSpeedImguiWidget::plot(const char* label, } #endif // ENABLE_ACTUAL_SPEED_DEBUG -void GCodeViewer::SequentialView::Marker::init(std::optional>& model_opt) +void GCodeViewer::SequentialView::Marker::init(std::optional>& model_opt, bool is_ht90) { if (! model_opt.has_value()) return; m_model.reset(); + m_is_ht90 = is_ht90; m_generic_marker = (model_opt->get() == nullptr); if (m_generic_marker) @@ -233,6 +234,85 @@ void GCodeViewer::SequentialView::Marker::init(std::optional(0,0); + transform.translation() = p1; + return transform; +} + +static void render_ht90_rods(const Vec3d& pos, GLShaderProgram* shader, const Transform3d& view_matrix, const Vec3d& bed_offset, GLModel& model) +{ + Vec3d start(30.06, 27.70, 35); // Position of the back-right ball bearing, on the extruder head. + Vec3d end(32.33, 212.92, 338.8); // The other ball bearing, on the printer. + double r=4.725; // Diameter of the rod. + double rods_spacing = 60.; + double height = (end-start).norm(); + + + if (!model.is_initialized()) { + auto t0 = its_make_sphere(r, 0.5); + auto t1 = its_make_sphere(r, 0.5); + auto t2 = its_make_cylinder(r, height); + its_translate(t1, Vec3f(0., 0., height)); + its_merge(t2, t0); + its_merge(t2, t1); + model.init_from(t2); + model.set_color({ 1.0f, 1.0f, 1.0f, 0.5f }); + } + + + // trans transforms extruder to world coord system of the first bed + Transform3d trans = Geometry::translation_transform(pos); + + Vec3d p1 = trans * start; + Vec3d p2 = end; // already in world coords + + for (int j=0; j<6; ++j) { + if (j == 3) { + p1.x() = p1.x() - rods_spacing; + p2.x() = p2.x() - rods_spacing; + } + + p1 = trans * Geometry::rotation_transform(Vec3d(0,0,2*M_PI/3)) * trans.inverse() * p1; + p2 = Geometry::rotation_transform(Vec3d(0,0,2*M_PI/3)) * p2; + + double dx = p2.x() - p1.x(); + double dy = p2.y() - p1.y(); + double dz = std::sqrt(height * height - dx * dx - dy * dy); + p2.z() = p1.z() + dz; + + Transform3d wm = align_cylinder(p1, p2, r); + shader->set_uniform("view_model_matrix", view_matrix * wm); + shader->set_uniform("volume_world_matrix", Geometry::translation_transform(bed_offset) * wm); + model.render(); + } + +} + + + + + + void GCodeViewer::SequentialView::Marker::render() { if (!m_visible) @@ -263,7 +343,7 @@ void GCodeViewer::SequentialView::Marker::render() BoundingBoxf box = s_multiple_beds.get_build_volume_box(); box.translate(to_2d(bed_inst_offset)); // add a bit on both sides - box = box.inflated(40.0f); + box = box.inflated(m_is_ht90 ? 60.f : 40.f); clip_planes = {{ { 1.0f, 0.0f, 0.0f, -box.min.cast().x() } , { -1.0f, 0.0f, 0.0f, box.max.cast().x() }}}; } @@ -287,8 +367,12 @@ void GCodeViewer::SequentialView::Marker::render() shader->set_uniform("clipping_planes[0]", clip_planes[0]); shader->set_uniform("clipping_planes[1]", clip_planes[1]); + shader->set_uniform("volume_world_matrix", volume_world_matrix); m_model.render(); + if (m_is_ht90) + render_ht90_rods(m_world_position.cast(), shader, view_matrix, bed_inst_offset, m_model_ht90_rod); + shader->stop_using(); if (curr_cull_face) @@ -1204,8 +1288,8 @@ void GCodeViewer::render() m_sequential_view.marker.set_z_offset(m_z_offset); // Following just makes sure that the shown marker is correct. - auto marker_model_opt = wxGetApp().plater()->get_current_canvas3D()->get_current_marker_model(); - m_sequential_view.marker.init(marker_model_opt); + auto [marker_model_opt, is_ht90] = wxGetApp().plater()->get_current_canvas3D()->get_current_marker_model(); + m_sequential_view.marker.init(marker_model_opt, is_ht90); if (marker_model_opt.has_value()) m_max_bounding_box.reset(); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index f37cd8c70d..26efe7a59e 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -115,6 +115,7 @@ public: class Marker { GLModel m_model; + GLModel m_model_ht90_rod; Vec3f m_world_position; // For seams, the position of the marker is on the last endpoint of the toolpath containing it. // This offset is used to show the correct value of tool position in the "ToolPosition" window. @@ -128,14 +129,20 @@ public: bool m_fixed_screen_size{ false }; float m_scale_factor{ 1.0f }; bool m_generic_marker{ true }; + bool m_is_ht90{false}; #if ENABLE_ACTUAL_SPEED_DEBUG ActualSpeedImguiWidget m_actual_speed_imgui_widget; #endif // ENABLE_ACTUAL_SPEED_DEBUG public: - void init(std::optional>& model_opt); + void init(std::optional>& model_opt, bool is_ht90); - const BoundingBoxf3& get_bounding_box() const { return m_model.get_bounding_box(); } + BoundingBoxf3 get_bounding_box() const { + auto bb = m_model.get_bounding_box(); + if (m_is_ht90) + bb.max.z() += scale_(400); + return bb; + } void set_world_position(const Vec3f& position) { m_world_position = position; } void set_world_offset(const Vec3f& offset) { m_world_offset = offset; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9e91642cd0..3776e41f77 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -162,9 +162,10 @@ void GLCanvas3D::select_bed(int i, bool triggered_by_user) // - nullopt = same as before // - nullptr = none available, use generic // - GLModel = the model to use -std::optional> GLCanvas3D::get_current_marker_model() const +// The other field is whether the printer is HT90. +std::pair>, bool> GLCanvas3D::get_current_marker_model() const { - std::optional> out; + auto out = std::make_pair>, bool>(std::nullopt, false); static std::string last_printer_notes; static double old_r = 0.; @@ -182,11 +183,13 @@ std::optional> GLCanvas3D::get_current_marker_model() c old_h = h; old_seq = seq; - out = std::make_optional(nullptr); + out.second = (printer_notes.find("PRINTER_MODEL_HT90") != std::string::npos); + + out.first = std::make_optional(nullptr); if (! seq) return out; try { - boost::nowide::ifstream in(resources_dir() + "/data/printer_gantries/geometries.txt"); + boost::nowide::ifstream in(resources_dir() + "/data/printer_gantries/geometries.json"); boost::property_tree::ptree pt; boost::property_tree::read_json(in, pt); for (const auto& printer : pt.get_child("printers")) { @@ -197,7 +200,7 @@ std::optional> GLCanvas3D::get_current_marker_model() c if (boost::filesystem::exists(filename)) { std::unique_ptr m = std::make_unique(); if (m->init_from_file(filename)) - out = std::make_optional(std::move(m)); + out.first = std::make_optional(std::move(m)); } break; } @@ -205,7 +208,7 @@ std::optional> GLCanvas3D::get_current_marker_model() c } catch (...) { // Whatever happened, ignore it. We will return nullptr. } - if (*out == nullptr && seq) { + if (*(out.first) == nullptr && seq) { // Generic sequential extruder model. double gantry_height = 10; auto mesh = its_make_cylinder(r, h + gantry_height - 0.001); @@ -215,7 +218,7 @@ std::optional> GLCanvas3D::get_current_marker_model() c its_merge(mesh, mesh2); std::unique_ptr m = std::make_unique(); m->init_from(mesh); - out = std::make_optional(std::move(m)); + out.first = std::make_optional(std::move(m)); } } return out; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 0a75e241bb..dbaacc3666 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -729,7 +729,7 @@ public: const libvgcode::Interval& get_gcode_view_visible_range() const { return m_gcode_viewer.get_gcode_view_visible_range(); } const libvgcode::PathVertex& get_gcode_vertex_at(size_t id) const { return m_gcode_viewer.get_gcode_vertex_at(id); } - std::optional> get_current_marker_model() const; + std::pair>, bool> get_current_marker_model() const; void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1, const ModelVolume* mv = nullptr);