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

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'xs/src/libslic3r/Layer.cpp')
-rw-r--r--xs/src/libslic3r/Layer.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/xs/src/libslic3r/Layer.cpp b/xs/src/libslic3r/Layer.cpp
new file mode 100644
index 000000000..689077d46
--- /dev/null
+++ b/xs/src/libslic3r/Layer.cpp
@@ -0,0 +1,144 @@
+#include "Layer.hpp"
+#include "ClipperUtils.hpp"
+#include "Geometry.hpp"
+#include "Print.hpp"
+
+
+namespace Slic3r {
+
+Layer::Layer(int id, PrintObject *object, coordf_t height, coordf_t print_z,
+ coordf_t slice_z)
+: _id(id),
+ _object(object),
+ upper_layer(NULL),
+ lower_layer(NULL),
+ regions(),
+ slicing_errors(false),
+ slice_z(slice_z),
+ print_z(print_z),
+ height(height),
+ slices()
+{
+}
+
+Layer::~Layer()
+{
+ // remove references to self
+ if (NULL != this->upper_layer) {
+ this->upper_layer->lower_layer = NULL;
+ }
+
+ if (NULL != this->lower_layer) {
+ this->lower_layer->upper_layer = NULL;
+ }
+
+ this->clear_regions();
+}
+
+int
+Layer::id()
+{
+ return this->_id;
+}
+
+PrintObject*
+Layer::object()
+{
+ return this->_object;
+}
+
+
+size_t
+Layer::region_count()
+{
+ return this->regions.size();
+}
+
+void
+Layer::clear_regions()
+{
+ for (int i = this->regions.size()-1; i >= 0; --i)
+ this->delete_region(i);
+}
+
+LayerRegion*
+Layer::get_region(int idx)
+{
+ return this->regions.at(idx);
+}
+
+LayerRegion*
+Layer::add_region(PrintRegion* print_region)
+{
+ LayerRegion* region = new LayerRegion(this, print_region);
+ this->regions.push_back(region);
+ return region;
+}
+
+void
+Layer::delete_region(int idx)
+{
+ LayerRegionPtrs::iterator i = this->regions.begin() + idx;
+ LayerRegion* item = *i;
+ this->regions.erase(i);
+ delete item;
+}
+
+// merge all regions' slices to get islands
+void
+Layer::make_slices()
+{
+ ExPolygons slices;
+ if (this->regions.size() == 1) {
+ // optimization: if we only have one region, take its slices
+ slices = this->regions.front()->slices;
+ } else {
+ Polygons slices_p;
+ FOREACH_LAYERREGION(this, layerm) {
+ Polygons region_slices_p = (*layerm)->slices;
+ slices_p.insert(slices_p.end(), region_slices_p.begin(), region_slices_p.end());
+ }
+ union_(slices_p, slices);
+ }
+
+ this->slices.expolygons.clear();
+ this->slices.expolygons.reserve(slices.size());
+
+ // prepare ordering points
+ Points ordering_points;
+ ordering_points.reserve(slices.size());
+ for (ExPolygons::const_iterator ex = slices.begin(); ex != slices.end(); ++ex)
+ ordering_points.push_back(ex->contour.first_point());
+
+ // sort slices
+ std::vector<Points::size_type> order;
+ Slic3r::Geometry::chained_path(ordering_points, order);
+
+ // populate slices vector
+ for (std::vector<Points::size_type>::const_iterator it = order.begin(); it != order.end(); ++it) {
+ this->slices.expolygons.push_back(slices[*it]);
+ }
+}
+
+
+#ifdef SLIC3RXS
+REGISTER_CLASS(Layer, "Layer");
+#endif
+
+
+SupportLayer::SupportLayer(int id, PrintObject *object, coordf_t height,
+ coordf_t print_z, coordf_t slice_z)
+: Layer(id, object, height, print_z, slice_z)
+{
+}
+
+SupportLayer::~SupportLayer()
+{
+}
+
+#ifdef SLIC3RXS
+REGISTER_CLASS(SupportLayer, "Layer::Support");
+#endif
+
+
+}