OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::ImexArranger Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/IMEXArrange.hpp>

Collaboration diagram for Slic3r::ImexArranger:

Classes

struct  Bed
struct  KeepOut

Public Member Functions

 ImexArranger (const ImexArrangeInput &input, const arrangement::ArrangeParams &params, const Points &bed)
bool active () const
Points bed_shape () const
void add_keep_outs (arrangement::ArrangePolygons &fixed) const
void finish (arrangement::ArrangePolygons &items, const arrangement::ArrangePolygons &before, const arrangement::ArrangePolygons &fixed, const arrangement::ArrangeParams &params) const

Private Member Functions

std::optional< BoundingBox > room_in (const BoundingBoxf &zone) const
bool crosses_keep_out (const arrangement::ArrangePolygon &part, int bed_idx) const

Private Attributes

Points m_bed
BoundingBox m_bed_bb
Point m_margin
bool m_adds_plates = false
std::vector< Bed > m_beds
std::optional< BoundingBox > m_shared_room
std::vector< KeepOut > m_keep_outs

Detailed Description


Class Documentation

◆ Slic3r::ImexArranger::Bed

struct Slic3r::ImexArranger::Bed
Collaboration diagram for Slic3r::ImexArranger::Bed:
Class Members
int bed_idx
ImexArrangeZones zones

◆ Slic3r::ImexArranger::KeepOut

struct Slic3r::ImexArranger::KeepOut
Collaboration diagram for Slic3r::ImexArranger::KeepOut:
Class Members
int bed_idx
BoundingBox box
bool fence

Constructor & Destructor Documentation

◆ ImexArranger()

Slic3r::ImexArranger::ImexArranger ( const ImexArrangeInput & input,
const arrangement::ArrangeParams & params,
const Points & bed )
93 : m_bed(bed)
94 , m_bed_bb(bed)
95 , m_margin(scaled(std::max(0.f, params.bed_shrink_x)), scaled(std::max(0.f, params.bed_shrink_y)))
96 , m_adds_plates(input.adds_plates)
97{
98 for (size_t i = 0; i < input.beds.size(); ++i)
99 if (input.beds[i])
100 m_beds.push_back({int(i), *input.beds[i]});
101
102 // The bed shape can be a zone only when every plate being arranged has it, and so does every
103 // plate the arrange may add.
104 const auto& first = input.beds.empty() ? std::nullopt : input.beds.front();
105 if (first &&
106 std::all_of(input.beds.begin(), input.beds.end(),
107 [&](const std::optional<ImexArrangeZones>& b) { return b && same_zone(b->primary_zone, first->primary_zone); }) &&
108 (!input.adds_plates || (input.added_plate && same_zone(input.added_plate->primary_zone, first->primary_zone))))
109 m_shared_room = room_in(first->primary_zone);
110
111 // The beds past the plates being arranged become new plates.
112 if (input.adds_plates && input.added_plate)
113 for (int bed_idx = int(input.beds.size()); bed_idx < MAX_NUM_PLATES; ++bed_idx)
114 m_beds.push_back({bed_idx, *input.added_plate});
115
116 // A zone narrower than its margins leaves no room, and its fences then fill the whole bed.
117 const Point strip_margin = m_margin + Point::Constant(scaled(input.brim));
118 for (const Bed& b : m_beds) {
119 if (!m_shared_room)
120 for (const BoundingBox& box : boxes_around(m_bed_bb, inset(scaled(b.zones.primary_zone), m_margin)))
121 m_keep_outs.push_back({b.bed_idx, box, true});
122 for (const BoundingBoxf& strip : b.zones.collision_zones)
123 m_keep_outs.push_back({b.bed_idx, inset(scaled(strip), -strip_margin), false});
124 }
125}
Points m_bed
Definition IMEXArrange.hpp:92
std::vector< KeepOut > m_keep_outs
Definition IMEXArrange.hpp:98
Point m_margin
Definition IMEXArrange.hpp:94
BoundingBox m_bed_bb
Definition IMEXArrange.hpp:93
std::optional< BoundingBox > room_in(const BoundingBoxf &zone) const
Definition IMEXArrange.cpp:127
bool m_adds_plates
Definition IMEXArrange.hpp:95
std::optional< BoundingBox > m_shared_room
Definition IMEXArrange.hpp:97
std::vector< Bed > m_beds
Definition IMEXArrange.hpp:96
Definition IMEXArrange.hpp:78
std::vector< BoundingBox > boxes_around(const BoundingBox &bed, const BoundingBox &zone)
Definition IMEXArrange.cpp:47
bool same_zone(const BoundingBoxf &a, const BoundingBoxf &b)
Definition IMEXArrange.cpp:33
BoundingBox inset(BoundingBox box, const Point &by)
Definition IMEXArrange.cpp:38
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
BoundingBox scaled(const BoundingBoxf &bb)
Definition BoundingBox.hpp:284

References Slic3r::ImexArrangeInput::added_plate, Slic3r::ImexArrangeInput::adds_plates, Slic3r::ImexArrangeInput::beds, Slic3r::ImexArrangeInput::brim, m_adds_plates, m_bed, m_bed_bb, m_beds, m_keep_outs, m_margin, m_shared_room, room_in(), and Slic3r::scaled().

Here is the call graph for this function:

Member Function Documentation

◆ active()

bool Slic3r::ImexArranger::active ( ) const
inline
61{ return !m_beds.empty(); }

References m_beds.

Referenced by Slic3r::GUI::ArrangeJob::process().

Here is the caller graph for this function:

◆ add_keep_outs()

void Slic3r::ImexArranger::add_keep_outs ( arrangement::ArrangePolygons & fixed) const
140{
141 for (const KeepOut& keep_out : m_keep_outs) {
142 arrangement::ArrangePolygon ap;
143 ap.poly.contour = keep_out.box.polygon();
144 ap.is_virt_object = true;
145 ap.bed_idx = keep_out.bed_idx;
146 ap.height = 1;
147 ap.name = keep_out.fence ? kFenceName : kStripName;
148 fixed.push_back(std::move(ap));
149 }
150}
Definition IMEXArrange.hpp:83
constexpr const char * kStripName
Definition IMEXArrange.cpp:30
constexpr const char * kFenceName
Definition IMEXArrange.cpp:29

References Slic3r::arrangement::ArrangePolygon::bed_idx, Slic3r::ExPolygon::contour, Slic3r::arrangement::ArrangePolygon::height, Slic3r::arrangement::ArrangePolygon::is_virt_object, m_keep_outs, Slic3r::arrangement::ArrangePolygon::name, and Slic3r::arrangement::ArrangePolygon::poly.

Referenced by Slic3r::GUI::ArrangeJob::process().

Here is the caller graph for this function:

◆ bed_shape()

Points Slic3r::ImexArranger::bed_shape ( ) const
137{ return m_shared_room ? m_shared_room->polygon().points : m_bed; }

References m_bed, and m_shared_room.

Referenced by Slic3r::GUI::ArrangeJob::process().

Here is the caller graph for this function:

◆ crosses_keep_out()

bool Slic3r::ImexArranger::crosses_keep_out ( const arrangement::ArrangePolygon & part,
int bed_idx ) const
private
153{
154 const Polygon hull = part.transformed_poly().contour;
155 return std::any_of(m_keep_outs.begin(), m_keep_outs.end(), [&](const KeepOut& keep_out) {
156 return keep_out.bed_idx == bed_idx && !intersection(hull, keep_out.box.polygon()).empty();
157 });
158}
Slic3r::Polygon Polygon
Definition Emboss.cpp:101

References Slic3r::ExPolygon::contour, m_keep_outs, and Slic3r::arrangement::ArrangePolygon::transformed_poly().

Referenced by finish().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ finish()

void Slic3r::ImexArranger::finish ( arrangement::ArrangePolygons & items,
const arrangement::ArrangePolygons & before,
const arrangement::ArrangePolygons & fixed,
const arrangement::ArrangeParams & params ) const
164{
165 for (arrangement::ArrangePolygon& part : items)
166 if (crosses_keep_out(part, part.bed_idx))
167 part.bed_idx = arrangement::UNARRANGED;
168
169 // Only fenced plates need centering, and arranging one plate never fences.
171 return;
172
173 arrangement::ArrangeParams one_plate = params;
174 one_plate.progressind = {};
175 for (const Bed& b : m_beds) {
176 const std::optional<BoundingBox> room = room_in(b.zones.primary_zone);
177 std::vector<size_t> on_bed;
178 for (size_t i = 0; i < items.size(); ++i)
179 if (items[i].bed_idx == b.bed_idx)
180 on_bed.push_back(i);
181 if (on_bed.empty() || !room)
182 continue;
183
184 arrangement::ArrangePolygons parts, bed_fixed;
185 // Bed 0, where the nester takes a part as placeable rather than as one that does not fit.
186 for (size_t i : on_bed) {
187 parts.push_back(before[i]);
188 parts.back().bed_idx = 0;
189 }
190 for (const arrangement::ArrangePolygon& ap : fixed)
191 if (ap.bed_idx == b.bed_idx && ap.name != kFenceName) {
192 bed_fixed.push_back(ap);
193 bed_fixed.back().bed_idx = 0;
194 }
195 arrangement::arrange(parts, bed_fixed, room->polygon().points, one_plate);
196 // A canceled pass leaves parts it never reached on bed 0 with their old ids.
197 if (one_plate.stopcondition && one_plate.stopcondition())
198 return;
199
200 // Keep the first layout when this one does not fit.
201 if (!std::all_of(parts.begin(), parts.end(), [&](const arrangement::ArrangePolygon& part) {
202 return part.bed_idx == 0 && !crosses_keep_out(part, b.bed_idx);
203 }))
204 continue;
205
206 // By-object printing follows the packing order, which this pass numbered 0..n-1: carry
207 // it over onto the ids the first pass gave these parts.
208 std::vector<int> ids;
209 for (size_t i : on_bed)
210 ids.push_back(items[i].itemid);
211 std::sort(ids.begin(), ids.end());
212 for (size_t k = 0; k < on_bed.size(); ++k) {
213 items[on_bed[k]].translation = parts[k].translation;
214 items[on_bed[k]].rotation = parts[k].rotation;
215 items[on_bed[k]].itemid = ids[parts[k].itemid];
216 }
217 }
218}
bool crosses_keep_out(const arrangement::ArrangePolygon &part, int bed_idx) const
Definition IMEXArrange.cpp:152
std::vector< ArrangePolygon > ArrangePolygons
Definition Arrange.hpp:126
void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Points &bed, const ArrangeParams &params)
Definition Arrange.cpp:1280
static const constexpr int UNARRANGED
A logical bed representing an object not being arranged. Either the arrange has not yet successfully ...
Definition Arrange.hpp:47

References Slic3r::arrangement::arrange(), crosses_keep_out(), m_adds_plates, m_beds, m_shared_room, Slic3r::arrangement::ArrangeParams::progressind, room_in(), Slic3r::arrangement::ArrangeParams::stopcondition, and Slic3r::arrangement::UNARRANGED.

Referenced by Slic3r::GUI::ArrangeJob::process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ room_in()

std::optional< BoundingBox > Slic3r::ImexArranger::room_in ( const BoundingBoxf & zone) const
private
128{
129 BoundingBox room = inset(scaled(zone), m_margin);
130 room.min = room.min.cwiseMax(m_bed_bb.min);
131 room.max = room.max.cwiseMin(m_bed_bb.max);
132 if (room.min.x() >= room.max.x() || room.min.y() >= room.max.y())
133 return std::nullopt;
134 return room;
135}

References m_bed_bb, m_margin, Slic3r::BoundingBoxBase< PointType, APointsType >::max, Slic3r::BoundingBoxBase< PointType, APointsType >::min, and Slic3r::scaled().

Referenced by ImexArranger(), and finish().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_adds_plates

bool Slic3r::ImexArranger::m_adds_plates = false
private

Referenced by ImexArranger(), and finish().

◆ m_bed

Points Slic3r::ImexArranger::m_bed
private

Referenced by ImexArranger(), and bed_shape().

◆ m_bed_bb

BoundingBox Slic3r::ImexArranger::m_bed_bb
private

Referenced by ImexArranger(), and room_in().

◆ m_beds

std::vector<Bed> Slic3r::ImexArranger::m_beds
private

Referenced by ImexArranger(), active(), and finish().

◆ m_keep_outs

std::vector<KeepOut> Slic3r::ImexArranger::m_keep_outs
private

◆ m_margin

Point Slic3r::ImexArranger::m_margin
private

Referenced by ImexArranger(), and room_in().

◆ m_shared_room

std::optional<BoundingBox> Slic3r::ImexArranger::m_shared_room
private

Referenced by ImexArranger(), bed_shape(), and finish().


The documentation for this class was generated from the following files: