ModelArrange.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "ModelArrange.hpp"
  2. #include <libslic3r/Model.hpp>
  3. #include "MTUtils.hpp"
  4. namespace Slic3r {
  5. arrangement::ArrangePolygons get_arrange_polys(const Model &model, ModelInstancePtrs &instances)
  6. {
  7. size_t count = 0;
  8. for (auto obj : model.objects) count += obj->instances.size();
  9. ArrangePolygons input;
  10. input.reserve(count);
  11. instances.clear(); instances.reserve(count);
  12. for (ModelObject *mo : model.objects)
  13. for (ModelInstance *minst : mo->instances) {
  14. input.emplace_back(minst->get_arrange_polygon());
  15. instances.emplace_back(minst);
  16. }
  17. return input;
  18. }
  19. bool apply_arrange_polys(ArrangePolygons &input, ModelInstancePtrs &instances, VirtualBedFn vfn)
  20. {
  21. bool ret = true;
  22. for(size_t i = 0; i < input.size(); ++i) {
  23. if (input[i].bed_idx != 0) { ret = false; if (vfn) vfn(input[i]); }
  24. if (input[i].bed_idx >= 0)
  25. instances[i]->apply_arrange_result(input[i].translation.cast<double>(),
  26. input[i].rotation);
  27. }
  28. return ret;
  29. }
  30. Slic3r::arrangement::ArrangePolygon get_arrange_poly(const Model &model)
  31. {
  32. ArrangePolygon ap;
  33. Points &apts = ap.poly.contour.points;
  34. for (const ModelObject *mo : model.objects)
  35. for (const ModelInstance *minst : mo->instances) {
  36. ArrangePolygon obj_ap = minst->get_arrange_polygon();
  37. ap.poly.contour.rotate(obj_ap.rotation);
  38. ap.poly.contour.translate(obj_ap.translation.x(), obj_ap.translation.y());
  39. const Points &pts = obj_ap.poly.contour.points;
  40. std::copy(pts.begin(), pts.end(), std::back_inserter(apts));
  41. }
  42. apts = std::move(Geometry::convex_hull(apts).points);
  43. return ap;
  44. }
  45. void duplicate(Model &model, Slic3r::arrangement::ArrangePolygons &copies, VirtualBedFn vfn)
  46. {
  47. for (ModelObject *o : model.objects) {
  48. // make a copy of the pointers in order to avoid recursion when appending their copies
  49. ModelInstancePtrs instances = o->instances;
  50. o->instances.clear();
  51. for (const ModelInstance *i : instances) {
  52. for (arrangement::ArrangePolygon &ap : copies) {
  53. if (ap.bed_idx != 0) vfn(ap);
  54. ModelInstance *instance = o->add_instance(*i);
  55. Vec2d pos = unscale(ap.translation);
  56. instance->set_offset(instance->get_offset() + to_3d(pos, 0.));
  57. }
  58. }
  59. o->invalidate_bounding_box();
  60. }
  61. }
  62. void duplicate_objects(Model &model, size_t copies_num)
  63. {
  64. for (ModelObject *o : model.objects) {
  65. // make a copy of the pointers in order to avoid recursion when appending their copies
  66. ModelInstancePtrs instances = o->instances;
  67. for (const ModelInstance *i : instances)
  68. for (size_t k = 2; k <= copies_num; ++ k)
  69. o->add_instance(*i);
  70. }
  71. }
  72. } // namespace Slic3r