#ifndef SEGMENTEDRECTANGLEBED_HPP #define SEGMENTEDRECTANGLEBED_HPP #include "libslic3r/Arrange/Core/Beds.hpp" namespace Slic3r { namespace arr2 { enum class RectPivots { Center, BottomLeft, BottomRight, TopLeft, TopRight }; template struct IsSegmentedBed_ : public std::false_type {}; template constexpr bool IsSegmentedBed = IsSegmentedBed_>::value; template struct SegmentedRectangleBed { Vec<2, size_t> segments = Vec<2, size_t>::Ones(); BoundingBox bb; RectPivots pivot = RectPivots::Center; SegmentedRectangleBed() = default; SegmentedRectangleBed(const BoundingBox &bb, size_t segments_x, size_t segments_y, const RectPivots pivot = RectPivots::Center) : segments{segments_x, segments_y}, bb{bb}, pivot{pivot} {} size_t segments_x() const noexcept { return segments.x(); } size_t segments_y() const noexcept { return segments.y(); } auto alignment() const noexcept { return pivot; } }; template struct SegmentedRectangleBed, std::integral_constant> { BoundingBox bb; RectPivots pivot = RectPivots::Center; SegmentedRectangleBed() = default; explicit SegmentedRectangleBed(const BoundingBox &b, const RectPivots pivot = RectPivots::Center) : bb{b} {} size_t segments_x() const noexcept { return SegX; } size_t segments_y() const noexcept { return SegY; } auto alignment() const noexcept { return pivot; } }; template struct SegmentedRectangleBed, std::integral_constant, std::integral_constant> { BoundingBox bb; SegmentedRectangleBed() = default; explicit SegmentedRectangleBed(const BoundingBox &b) : bb{b} {} size_t segments_x() const noexcept { return SegX; } size_t segments_y() const noexcept { return SegY; } auto alignment() const noexcept { return pivot; } }; template struct IsSegmentedBed_> : public std::true_type {}; template auto offset(const SegmentedRectangleBed &bed, coord_t val_scaled) { auto cpy = bed; cpy.bb.offset(val_scaled); return cpy; } template auto bounding_box(const SegmentedRectangleBed &bed) { return bed.bb; } template auto area(const SegmentedRectangleBed &bed) { return arr2::area(bed.bb); } template ExPolygons to_expolygons(const SegmentedRectangleBed &bed) { return to_expolygons(RectangleBed{bed.bb}); } template struct IsRectangular_, void>> : public std::true_type {}; }} // namespace Slic3r::arr2 #endif // SEGMENTEDRECTANGLEBED_HPP