From 0cad88309cfe41db1873e9e8cef68b08ea3b211d Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 26 Jun 2023 11:48:16 +0800 Subject: [PATCH] FIX: fitst layer bbox was wrong for multiple plates brim bounding box is now shifted w.r.t. plate origin, need to modify the no-brim shift the same way. Change-Id: Iefa7287e2848aadbfc4a468bca394ecec48a1e7c --- src/BambuStudio.cpp | 2 -- src/libslic3r/Brim.cpp | 22 +++++++--------------- src/libslic3r/Brim.hpp | 4 ++-- src/libslic3r/Print.cpp | 10 +++++++++- src/libslic3r/Print.hpp | 3 +++ src/slic3r/GUI/Plater.cpp | 2 -- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index d73946874..549cb096e 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -2790,8 +2790,6 @@ int CLI::run(int argc, char **argv) BBoxData data; auto bb_scaled = obj->get_first_layer_bbox(data.area, data.layer_height, data.name); auto bb = unscaled(bb_scaled); - bb.min -= orig2d; - bb.max -= orig2d; bbox_all.merge(bb); data.area *= (SCALING_FACTOR * SCALING_FACTOR); // unscale area data.id = obj->id().id; diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 76bf01baf..34757a442 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -23,19 +23,11 @@ namespace Slic3r { -//BBS: instance_shift is too large because of multi-plate, apply without plate offset. -static Point instance_shift_without_plate_offset(const PrintInstance& instance) -{ - const Print* print = instance.print_object->print(); - const Vec3d plate_offset = print->get_plate_origin(); - return instance.shift - Point(scaled(plate_offset.x()), scaled(plate_offset.y())); -} - static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const PrintInstance &instance) { size_t dst_idx = dst.size(); expolygons_append(dst, src); - Point instance_shift = instance_shift_without_plate_offset(instance); + Point instance_shift = instance.shift_without_plate_offset(); for (; dst_idx < dst.size(); ++dst_idx) dst[dst_idx].translate(instance_shift); } @@ -43,7 +35,7 @@ static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const P static void append_and_translate(ExPolygons& dst, const ExPolygons& src, const PrintInstance& instance, const Print& print, std::map& brimAreaMap) { ExPolygons srcShifted = src; - Point instance_shift = instance_shift_without_plate_offset(instance); + Point instance_shift = instance.shift_without_plate_offset(); for (size_t src_idx = 0; src_idx < srcShifted.size(); ++src_idx) srcShifted[src_idx].translate(instance_shift); srcShifted = diff_ex(srcShifted, dst); @@ -54,7 +46,7 @@ static void append_and_translate(ExPolygons& dst, const ExPolygons& src, static void append_and_translate(Polygons &dst, const Polygons &src, const PrintInstance &instance) { size_t dst_idx = dst.size(); polygons_append(dst, src); - Point instance_shift = instance_shift_without_plate_offset(instance); + Point instance_shift = instance.shift_without_plate_offset(); for (; dst_idx < dst.size(); ++dst_idx) dst[dst_idx].translate(instance_shift); } @@ -102,7 +94,7 @@ static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print, islands.reserve(islands.size() + object->instances().size() * islands_object.size()); for (const PrintInstance& instance : object->instances()) { - Point instance_shift = instance_shift_without_plate_offset(instance); + Point instance_shift = instance.shift_without_plate_offset(); for (Polygon& poly : islands_object) { islands.emplace_back(poly); islands.back().translate(instance_shift); @@ -1236,7 +1228,7 @@ static void make_inner_island_brim(const Print& print, const ConstPrintObjectPtr for (const PrintInstance& instance : object->instances()) { size_t dst_idx = final_loops.size(); final_loops.insert(final_loops.end(), all_loops_object.begin(), all_loops_object.end()); - Point instance_shift = instance_shift_without_plate_offset(instance); + Point instance_shift = instance.shift_without_plate_offset(); for (; dst_idx < final_loops.size(); ++dst_idx) final_loops[dst_idx].translate(instance_shift); @@ -1608,14 +1600,14 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ for (const ExPolygon& ex_poly : object->layers().front()->lslices) for (const PrintInstance& instance : object->instances()) { auto ex_poly_translated = ex_poly; - ex_poly_translated.translate(instance_shift_without_plate_offset(instance)); + ex_poly_translated.translate(instance.shift_without_plate_offset()); bbx.merge(get_extents(ex_poly_translated.contour)); } if (!object->support_layers().empty()) for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) for (const PrintInstance& instance : object->instances()) { auto ex_poly_translated = support_contour; - ex_poly_translated.translate(instance_shift_without_plate_offset(instance)); + ex_poly_translated.translate(instance.shift_without_plate_offset()); bbx.merge(get_extents(ex_poly_translated)); } if (supportBrimAreaMap.find(printObjID) != supportBrimAreaMap.end()) { diff --git a/src/libslic3r/Brim.hpp b/src/libslic3r/Brim.hpp index a9322fe4b..eb2a4e6b5 100644 --- a/src/libslic3r/Brim.hpp +++ b/src/libslic3r/Brim.hpp @@ -23,8 +23,8 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, std::vector& printExtruders); // BBS: automatically make brim -ExtrusionEntityCollection make_brim_auto(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area); - +ExtrusionEntityCollection make_brim_auto(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area); + } // Slic3r #endif // slic3r_Brim_hpp_ diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 7a807fef0..76a5a9390 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1392,7 +1392,7 @@ BoundingBox PrintObject::get_first_layer_bbox(float& a, float& layer_height, std auto layer = get_layer(0); layer_height = layer->height; // only work for object with single instance - auto shift = instances()[0].shift; + auto shift = instances()[0].shift_without_plate_offset(); for (auto bb : layer->lslices_bboxes) { bb.translate(shift.x(), shift.y()); @@ -3520,4 +3520,12 @@ Polygon PrintInstance::get_convex_hull_2d() { return poly; } +//BBS: instance_shift is too large because of multi-plate, apply without plate offset. +Point PrintInstance::shift_without_plate_offset() const +{ + const Print* print = print_object->print(); + const Vec3d plate_offset = print->get_plate_origin(); + return shift - Point(scaled(plate_offset.x()), scaled(plate_offset.y())); +} + } // namespace Slic3r diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 5262665bb..6fbd54b86 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -201,6 +201,9 @@ struct PrintInstance // // instance id size_t id; + + //BBS: instance_shift is too large because of multi-plate, apply without plate offset. + Point shift_without_plate_offset() const; }; typedef std::vector PrintInstances; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 04f7b55c4..a0f50f23d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6658,8 +6658,6 @@ PlateBBoxData Plater::priv::generate_first_layer_bbox() { auto bb_scaled = obj->get_first_layer_bbox(data.area, data.layer_height, data.name); auto bb = unscaled(bb_scaled); - bb.min -= orig2d; - bb.max -= orig2d; bbox_all.merge(bb); data.area *= (SCALING_FACTOR * SCALING_FACTOR); // unscale area data.id = obj->id().id;