Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/slic3r/GUI/Jobs/ArrangeJob.hpp')
-rw-r--r--src/slic3r/GUI/Jobs/ArrangeJob.hpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp
new file mode 100644
index 000000000..73540c230
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp
@@ -0,0 +1,97 @@
+#ifndef ARRANGEJOB_HPP
+#define ARRANGEJOB_HPP
+
+#include "Job.hpp"
+#include "libslic3r/Arrange.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class Plater;
+
+class ArrangeJob : public Job
+{
+ Plater *m_plater;
+
+ using ArrangePolygon = arrangement::ArrangePolygon;
+ using ArrangePolygons = arrangement::ArrangePolygons;
+
+ ArrangePolygons m_selected, m_unselected, m_unprintable;
+
+ // clear m_selected and m_unselected, reserve space for next usage
+ void clear_input();
+
+ // Prepare all objects on the bed regardless of the selection
+ void prepare_all();
+
+ // Prepare the selected and unselected items separately. If nothing is
+ // selected, behaves as if everything would be selected.
+ void prepare_selected();
+
+protected:
+
+ void prepare() override;
+
+public:
+ ArrangeJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater)
+ : Job{std::move(pri)}, m_plater{plater}
+ {}
+
+ int status_range() const override
+ {
+ return int(m_selected.size() + m_unprintable.size());
+ }
+
+ void process() override;
+
+ void finalize() override;
+};
+
+std::optional<arrangement::ArrangePolygon> get_wipe_tower_arrangepoly(const Plater &);
+
+// The gap between logical beds in the x axis expressed in ratio of
+// the current bed width.
+static const constexpr double LOGICAL_BED_GAP = 1. / 5.;
+
+// Stride between logical beds
+double bed_stride(const Plater *plater);
+
+template<class T> struct PtrWrapper
+{
+ T *ptr;
+
+ explicit PtrWrapper(T *p) : ptr{p} {}
+
+ arrangement::ArrangePolygon get_arrange_polygon() const
+ {
+ return ptr->get_arrange_polygon();
+ }
+
+ void apply_arrange_result(const Vec2d &t, double rot)
+ {
+ ptr->apply_arrange_result(t, rot);
+ }
+};
+
+// Set up arrange polygon for a ModelInstance and Wipe tower
+template<class T>
+arrangement::ArrangePolygon get_arrange_poly(T obj, const Plater *plater)
+{
+ using ArrangePolygon = arrangement::ArrangePolygon;
+
+ ArrangePolygon ap = obj.get_arrange_polygon();
+ ap.bed_idx = ap.translation.x() / bed_stride(plater);
+ ap.setter = [obj, plater](const ArrangePolygon &p) {
+ if (p.is_arranged()) {
+ Vec2d t = p.translation.cast<double>();
+ t.x() += p.bed_idx * bed_stride(plater);
+ T{obj}.apply_arrange_result(t, p.rotation);
+ }
+ };
+
+ return ap;
+}
+
+
+}} // namespace Slic3r::GUI
+
+#endif // ARRANGEJOB_HPP