208{
209 if (objs.empty() || (objs.size() == 1 && objs.front()->instances().size() == 1)) { return {}; }
210
211 LinesBucketQueue conflictQueue;
212 if (wtdptr.has_value()) {
213 std::vector<ExtrusionPaths> wtpaths = (*wtdptr)->getFakeExtrusionPathsFromWipeTower();
214 conflictQueue.emplace_back_bucket(std::move(wtpaths), *wtdptr,
Points{
Point((*wtdptr)->plate_origin)});
215 }
216 for (PrintObject *obj : objs) {
218
220 for (const PrintInstance& inst : obj->instances())
221 instances_shifts.emplace_back(inst.shift);
222
223 conflictQueue.emplace_back_bucket(std::move(layers.first), obj, instances_shifts);
224 conflictQueue.emplace_back_bucket(std::move(layers.second), obj, instances_shifts);
225 }
226 conflictQueue.build_queue();
227
228 std::vector<LineWithIDs> layersLines;
229 std::vector<double> heights;
230 while (conflictQueue.valid()) {
232 double curHeight = conflictQueue.removeLowests();
233 heights.push_back(curHeight);
234 layersLines.push_back(std::move(lines));
235 }
236
238 tbb::concurrent_vector<std::pair<ConflictComputeResult,double>> conflict;
239
240 tbb::parallel_for(tbb::blocked_range<size_t>(0, layersLines.size()), [&](tbb::blocked_range<size_t>
range) {
241 for (size_t i = range.begin(); i < range.end(); i++) {
242 auto interRes = find_inter_of_lines(layersLines[i]);
243 if (interRes.has_value()) {
244 find = true;
245 conflict.emplace_back(*interRes, heights[i]);
246 break;
247 }
248 }
249 });
250
251 if (find) {
252 std::sort(conflict.begin(), conflict.end(), [](const std::pair<ConflictComputeResult, double>& i1, const std::pair<ConflictComputeResult, double>& i2) {
253 return i1.second < i2.second;
254 });
255
256 const void *ptr1 = conflictQueue.idToObjsPtr(conflict[0].first._obj1);
257 const void *ptr2 = conflictQueue.idToObjsPtr(conflict[0].first._obj2);
258 double conflictHeight = conflict[0].second;
259 if (wtdptr.has_value()) {
260 const FakeWipeTower* wtdp = *wtdptr;
261 if (ptr1 == wtdp || ptr2 == wtdp) {
262 if (ptr2 == wtdp) { std::swap(ptr1, ptr2); }
263 const PrintObject *obj2 = reinterpret_cast<const PrintObject *>(ptr2);
264 return std::make_optional<ConflictResult>("WipeTower", obj2->model_object()->name, conflictHeight, nullptr, ptr2);
265 }
266 }
267 const PrintObject *obj1 = reinterpret_cast<const PrintObject *>(ptr1);
268 const PrintObject *obj2 = reinterpret_cast<const PrintObject *>(ptr2);
269 return std::make_optional<ConflictResult>(obj1->model_object()->name, obj2->model_object()->name, conflictHeight, ptr1, ptr2);
270 } else
271 return {};
272}
auto range(Cont &&cont)
Definition libslic3r.h:356
std::pair< std::vector< ExtrusionPaths >, std::vector< ExtrusionPaths > > getAllLayersExtrusionPathsFromObject(PrintObject *obj)
Definition ConflictChecker.cpp:175
std::vector< LineWithID > LineWithIDs
Definition ConflictChecker.hpp:26
std::vector< Point, PointsAllocator< Point > > Points
Definition Point.hpp:58
IGL_INLINE void find(const Eigen::SparseMatrix< T > &X, Eigen::DenseBase< DerivedI > &I, Eigen::DenseBase< DerivedJ > &J, Eigen::DenseBase< DerivedV > &V)
Definition find.cpp:18
Kernel::Point_2 Point
Definition point_areas.cpp:20