diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f2b4e8480b..dd62029769 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2340,9 +2340,8 @@ void GCodeGenerator::process_layer_single_object( const bool print_wipe_extrusions) { bool first = true; - int object_id = 0; // Delay layer initialization as many layers may not print with all extruders. - auto init_layer_delayed = [this, &print_instance, &layer_to_print, &first, &object_id, &gcode]() { + auto init_layer_delayed = [this, &print_instance, &layer_to_print, &first, &gcode]() { if (first) { first = false; const PrintObject &print_object = print_instance.print_object; @@ -2358,14 +2357,7 @@ void GCodeGenerator::process_layer_single_object( m_avoid_crossing_perimeters.use_external_mp_once(); m_last_obj_copy = this_object_copy; this->set_origin(unscale(offset)); - if (this->config().gcode_label_objects != LabelObjectsStyle::Disabled) { - for (const PrintObject* po : print_object.print()->objects()) { - if (po == &print_object) - break; - ++object_id; - } - gcode += m_label_objects.start_object(print_instance.print_object.instances()[print_instance.instance_id], GCode::LabelObjects::IncludeName::No); - } + gcode += m_label_objects.start_object(print_instance.print_object.instances()[print_instance.instance_id], GCode::LabelObjects::IncludeName::No); } }; diff --git a/src/libslic3r/GCode/LabelObjects.cpp b/src/libslic3r/GCode/LabelObjects.cpp index 2104f77e52..4c32122ad2 100644 --- a/src/libslic3r/GCode/LabelObjects.cpp +++ b/src/libslic3r/GCode/LabelObjects.cpp @@ -1,9 +1,43 @@ #include "LabelObjects.hpp" +#include "ClipperUtils.hpp" +#include "Model.hpp" +#include "Print.hpp" +#include "TriangleMeshSlicer.hpp" + namespace Slic3r::GCode { +namespace { + +Polygon instance_outline(const PrintInstance* pi) +{ + ExPolygons outline; + const ModelObject* mo = pi->model_instance->get_object(); + const ModelInstance* mi = pi->model_instance; + for (const ModelVolume *v : mo->volumes) { + Polygons vol_outline; + vol_outline = project_mesh(v->mesh().its, + mi->get_matrix() * v->get_matrix(), + [] {}); + switch (v->type()) { + case ModelVolumeType::MODEL_PART: outline = union_ex(outline, vol_outline); break; + case ModelVolumeType::NEGATIVE_VOLUME: outline = diff_ex(outline, vol_outline); break; + default:; + } + } + + // The projection may contain multiple polygons, which is not supported by Klipper. + // When that happens, calculate and use a 2d convex hull instead. + if (outline.size() == 1u) + return outline.front().contour; + else + return pi->model_instance->get_object()->convex_hull_2d(pi->model_instance->get_matrix()); +} + +}; // anonymous namespace + void LabelObjects::init(const Print& print) { @@ -78,7 +112,7 @@ std::string LabelObjects::all_objects_header() const if (m_flavor == gcfKlipper) { char buffer[64]; out += "EXCLUDE_OBJECT_DEFINE NAME=" + label.name; - Polygon outline = print_instance->model_instance->get_object()->convex_hull_2d(print_instance->model_instance->get_matrix()); + Polygon outline = instance_outline(print_instance); assert(! outline.empty()); outline.douglas_peucker(50000.f); Point center = outline.centroid(); @@ -139,7 +173,7 @@ std::string LabelObjects::stop_object(const PrintInstance& print_instance) const std::string out; if (m_label_objects_style == LabelObjectsStyle::Octoprint) out += std::string("; stop printing object ") + label.name + "\n"; - else if (m_label_objects_style == LabelObjectsStyle::Firmware) + else if (m_label_objects_style == LabelObjectsStyle::Firmware) { if (m_flavor == GCodeFlavor::gcfMarlinFirmware || m_flavor == GCodeFlavor::gcfMarlinLegacy || m_flavor == GCodeFlavor::gcfRepRapFirmware) out += std::string("M486 S-1\n"); else if (m_flavor ==gcfKlipper) @@ -147,6 +181,7 @@ std::string LabelObjects::stop_object(const PrintInstance& print_instance) const else { // Not supported by / implemented for the other firmware flavors. } + } return out; } diff --git a/src/libslic3r/GCode/LabelObjects.hpp b/src/libslic3r/GCode/LabelObjects.hpp index a62090530d..78add73009 100644 --- a/src/libslic3r/GCode/LabelObjects.hpp +++ b/src/libslic3r/GCode/LabelObjects.hpp @@ -1,12 +1,12 @@ #ifndef slic3r_GCode_LabelObjects_hpp_ #define slic3r_GCode_LabelObjects_hpp_ -#include "Print.hpp" - namespace Slic3r { enum GCodeFlavor : unsigned char; enum class LabelObjectsStyle; +struct PrintInstance; +class Print; namespace GCode {