diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 54e4815a6..842e27eac 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -7590,7 +7590,7 @@ static Points to_points(const std::vector &dpts) return pts; } -static Polygon get_shared_poly(const std::vector& extruder_polys) +Polygon get_shared_poly(const std::vector& extruder_polys) { Polygon result; for (int index = 0; index < extruder_polys.size(); index++) diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 664b58232..2e2d36d56 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1529,6 +1529,7 @@ private: static PrintAndCLIConfigDef s_def; }; +Polygon get_shared_poly(const std::vector& extruder_polys); Points get_bed_shape(const DynamicPrintConfig &cfg, bool use_share = true); Points get_bed_shape(const PrintConfig &cfg, bool use_share = false); Points get_bed_shape(const SLAPrinterConfig &cfg); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 2d1898f69..a13934d4a 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2479,6 +2479,32 @@ const BoundingBox PartPlate::get_bounding_box_crd() return plate_shape.bounding_box(); } +BoundingBoxf3 PartPlate::get_build_volume(bool use_share) +{ + auto eps=Slic3r::BuildVolume::SceneEpsilon; + Vec3d up_point; + Vec3d low_point; + if (use_share && !m_extruder_areas.empty()) { + Polygon bed_poly = get_shared_poly(m_extruder_areas); + BoundingBox bbox = bed_poly.bounding_box(); + + up_point = Vec3d(unscale_(bbox.max.x()) + eps, unscale_(bbox.max.y()) + eps, m_origin.z() + m_height + eps); + low_point = Vec3d(unscale_(bbox.min.x()) - eps, unscale_(bbox.min.y()) - eps, m_origin.z() - eps); + } + else { + up_point = Vec3d(m_origin.x() + m_width + eps, m_origin.y() + m_depth + eps, m_origin.z() + m_height + eps); + low_point = Vec3d(m_origin.x() - eps, m_origin.y() - eps, m_origin.z() - eps); + if (m_raw_shape.size() > 0) { + up_point.x() += m_raw_shape[0].x(); + up_point.y() += m_raw_shape[0].y(); + low_point.x() += m_raw_shape[0].x(); + low_point.y() += m_raw_shape[0].y(); + } + } + BoundingBoxf3 plate_box(low_point, up_point); + return plate_box; +} + bool PartPlate::contains(const Vec3d& point) const { return m_bounding_box.contains(point); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 7f6162b03..b8c490adb 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -383,20 +383,7 @@ public: const BoundingBoxf3& get_bounding_box(bool extended = false) { return extended ? m_extended_bounding_box : m_bounding_box; } const BoundingBox get_bounding_box_crd(); BoundingBoxf3 get_plate_box() {return get_build_volume();} - BoundingBoxf3 get_build_volume() - { - auto eps=Slic3r::BuildVolume::SceneEpsilon; - Vec3d up_point = Vec3d(m_origin.x() + m_width + eps, m_origin.y() + m_depth + eps, m_origin.z() + m_height + eps); - Vec3d low_point = Vec3d(m_origin.x() - eps, m_origin.y() - eps, m_origin.z() - eps); - if (m_raw_shape.size() > 0) { - up_point.x() += m_raw_shape[0].x(); - up_point.y() += m_raw_shape[0].y(); - low_point.x() += m_raw_shape[0].x(); - low_point.y() += m_raw_shape[0].y(); - } - BoundingBoxf3 plate_box(low_point, up_point); - return plate_box; - } + BoundingBoxf3 get_build_volume(bool use_share = false); const std::vector& get_exclude_areas() { return m_exclude_bounding_box; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 50bc133fb..4fafe0868 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -15052,7 +15052,7 @@ void Plater::clone_selection() std::vector Plater::get_empty_cells(const Vec2f step) { PartPlate* plate = wxGetApp().plater()->get_partplate_list().get_curr_plate(); - BoundingBoxf3 build_volume = plate->get_build_volume(); + BoundingBoxf3 build_volume = plate->get_build_volume(true); Vec2d vmin(build_volume.min.x(), build_volume.min.y()), vmax(build_volume.max.x(), build_volume.max.y()); BoundingBoxf bbox(vmin, vmax); std::vector cells;