From 1f1d13e3d98917aa3d4404a9c50d13d7c8d8b6dc Mon Sep 17 00:00:00 2001 From: Clifford Garwood Date: Mon, 21 Sep 2026 17:10:23 -0400 Subject: [PATCH] Describe the estimate's actual blind spots in the tower comments The estimate no longer reports a tower for a single filament whose flush matrix purges, so the comments that justify calling prime_tower_is_printed() instead of reading a depth now cite what still holds: it reads neither enable_prime_tower nor print_sequence. GCodeViewer's comments name render_scene(), the function that replaced the render() they still pointed at, and the pass contract mentions the toolhead boxes it draws. Co-Authored-By: Claude Opus 5 (1M context) --- src/libslic3r/GCode/WipeTowerEstimate.hpp | 4 ++-- src/slic3r/GUI/GCodeViewer.cpp | 2 +- src/slic3r/GUI/GCodeViewer.hpp | 4 ++-- src/slic3r/GUI/PartPlate.cpp | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/GCode/WipeTowerEstimate.hpp b/src/libslic3r/GCode/WipeTowerEstimate.hpp index 7cc1e46ecd..1f0b674a11 100644 --- a/src/libslic3r/GCode/WipeTowerEstimate.hpp +++ b/src/libslic3r/GCode/WipeTowerEstimate.hpp @@ -45,8 +45,8 @@ WipeTowerFootprint estimate_wipe_tower_footprint(const ConfigBase double max_object_height); // Whether a prime tower is PRINTED for a plate. The footprint estimate above answers how big a -// tower is and reports one for a single filament whenever the flush matrix purges, so it cannot -// answer this; the authority is DynamicPrintConfig::normalize_fdm_2(), which clears +// tower is and never reads enable_prime_tower or print_sequence, so it reports a size for a plate +// that prints no tower at all; the authority is DynamicPrintConfig::normalize_fdm_2(), which clears // enable_prime_tower before the plate is sliced. This mirrors that rule so pre-slice consumers can // ask it without mutating a config, and a test pins the two together. // diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index a3557b5bc6..425dda8dab 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1633,7 +1633,7 @@ void GCodeViewer::reset() // IDEX/IQEX: resolve where every secondary carriage marker sits, relative to the primary, // for one (printer preset, active mode, plate bed) triple. This parses the mode string // several times over and rebuilds the zone grid, and every one of its inputs is preset or -// plate state, so render() runs it only when GCodeViewer::ImexMarkerKey changes and replays +// plate state, so render_scene() runs it only when GCodeViewer::ImexMarkerKey changes and replays // the returned plan on all the frames in between. // // `mode` is already resolved (the plate's mode beats the process preset). An empty diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index cf6b10c2f4..7f9ae333c7 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -214,7 +214,7 @@ private: bool m_fold = {false}; std::string m_marker_filename; // cached for lazy secondary marker init - // IDEX/IQEX: everything render() needs to place the secondary carriage markers and the + // IDEX/IQEX: everything render_scene() needs to place the secondary carriage markers and the // toolhead footprint boxes, resolved from the printer preset, the active mode and the // plate bed. Resolving it walks the mode string through compute_imex_zone_layout() // (several string parses plus a zone-grid rebuild), and none of its inputs change @@ -365,7 +365,7 @@ public: //BBS: add all plates filament statistics void render_all_plates_stats(const std::vector& gcode_result_list, bool show = true) const; //BBS: GUI refactor: add canvas width and height - // Shells, toolpaths and the sequential marker, drawn in 3D. + // Shells, toolpaths, the sequential markers and the IDEX/IQEX toolhead boxes, drawn in 3D. void render_scene(int canvas_width, int canvas_height); // Legend, sliders, the marker's position window and the G-code window, all ImGui. void render_overlay(int canvas_width, int canvas_height, int right_margin); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 87aad606b7..6771a6779c 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1122,9 +1122,9 @@ Polygon PartPlate::imex_wipe_tower_hull() const // Whether a tower is PRINTED is normalize_fdm_2's rule, shared with the slicer through // prime_tower_is_printed() rather than re-derived here - re-deriving it is what let this // validate a tower the slicer had already cancelled. Do not substitute the footprint - // estimate: it reports a tower for a single filament whenever the flush matrix purges - // (SEMM + purge_in_prime_tower, the Klipper default), which hard-blocks a plate with - // nothing drawn on screen to move. + // estimate: it never reads enable_prime_tower or print_sequence, so it still sizes a tower + // for a plate that switched the tower off or prints by object, which would hard-block a + // plate with nothing drawn on screen to move. // // Counts are the ones normalize_fdm_2 is handed: filament slots as authored, so a mixed // slot counts once, and distinct objects rather than instances. filament_is_mixed is a