164{
165 for (arrangement::ArrangePolygon& part : items)
168
169
171 return;
172
173 arrangement::ArrangeParams one_plate = params;
174 one_plate.progressind = {};
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
185
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 }
196
197 if (one_plate.stopcondition && one_plate.stopcondition())
198 return;
199
200
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
207
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 ¶ms)
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