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/PrintObject.cpp')
-rw-r--r--xs/src/libslic3r/PrintObject.cpp254
1 files changed, 254 insertions, 0 deletions
diff --git a/xs/src/libslic3r/PrintObject.cpp b/xs/src/libslic3r/PrintObject.cpp
new file mode 100644
index 000000000..4dac94cf6
--- /dev/null
+++ b/xs/src/libslic3r/PrintObject.cpp
@@ -0,0 +1,254 @@
+#include "Print.hpp"
+#include "BoundingBox.hpp"
+
+namespace Slic3r {
+
+PrintObject::PrintObject(Print* print, ModelObject* model_object, const BoundingBoxf3 &modobj_bbox)
+: _print(print),
+ _model_object(model_object),
+ typed_slices(false)
+{
+ region_volumes.resize(this->_print->regions.size());
+
+ // Compute the translation to be applied to our meshes so that we work with smaller coordinates
+ {
+ // Translate meshes so that our toolpath generation algorithms work with smaller
+ // XY coordinates; this translation is an optimization and not strictly required.
+ // A cloned mesh will be aligned to 0 before slicing in _slice_region() since we
+ // don't assume it's already aligned and we don't alter the original position in model.
+ // We store the XY translation so that we can place copies correctly in the output G-code
+ // (copies are expressed in G-code coordinates and this translation is not publicly exposed).
+ this->_copies_shift = Point(
+ scale_(modobj_bbox.min.x), scale_(modobj_bbox.min.y));
+
+ // TODO: $self->_trigger_copies;
+
+ // Scale the object size and store it
+ Pointf3 size = modobj_bbox.size();
+ this->size = Point3(scale_(size.x), scale_(size.y), scale_(size.z));
+ }
+}
+
+PrintObject::~PrintObject()
+{
+}
+
+Print*
+PrintObject::print()
+{
+ return this->_print;
+}
+
+ModelObject*
+PrintObject::model_object()
+{
+ return this->_model_object;
+}
+
+void
+PrintObject::add_region_volume(int region_id, int volume_id)
+{
+ if (region_id >= region_volumes.size()) {
+ region_volumes.resize(region_id + 1);
+ }
+
+ region_volumes[region_id].push_back(volume_id);
+}
+
+size_t
+PrintObject::layer_count()
+{
+ return this->layers.size();
+}
+
+void
+PrintObject::clear_layers()
+{
+ for (int i = this->layers.size()-1; i >= 0; --i)
+ this->delete_layer(i);
+}
+
+Layer*
+PrintObject::get_layer(int idx)
+{
+ return this->layers.at(idx);
+}
+
+Layer*
+PrintObject::add_layer(int id, coordf_t height, coordf_t print_z, coordf_t slice_z)
+{
+ Layer* layer = new Layer(id, this, height, print_z, slice_z);
+ layers.push_back(layer);
+ return layer;
+}
+
+void
+PrintObject::delete_layer(int idx)
+{
+ LayerPtrs::iterator i = this->layers.begin() + idx;
+ delete *i;
+ this->layers.erase(i);
+}
+
+size_t
+PrintObject::support_layer_count()
+{
+ return this->support_layers.size();
+}
+
+void
+PrintObject::clear_support_layers()
+{
+ for (int i = this->support_layers.size()-1; i >= 0; --i)
+ this->delete_support_layer(i);
+}
+
+SupportLayer*
+PrintObject::get_support_layer(int idx)
+{
+ return this->support_layers.at(idx);
+}
+
+SupportLayer*
+PrintObject::add_support_layer(int id, coordf_t height, coordf_t print_z,
+ coordf_t slice_z)
+{
+ SupportLayer* layer = new SupportLayer(id, this, height, print_z, slice_z);
+ support_layers.push_back(layer);
+ return layer;
+}
+
+void
+PrintObject::delete_support_layer(int idx)
+{
+ SupportLayerPtrs::iterator i = this->support_layers.begin() + idx;
+ delete *i;
+ this->support_layers.erase(i);
+}
+
+bool
+PrintObject::invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys)
+{
+ std::set<PrintObjectStep> steps;
+
+ // this method only accepts PrintObjectConfig and PrintRegionConfig option keys
+ for (std::vector<t_config_option_key>::const_iterator opt_key = opt_keys.begin(); opt_key != opt_keys.end(); ++opt_key) {
+ if (*opt_key == "perimeters"
+ || *opt_key == "extra_perimeters"
+ || *opt_key == "gap_fill_speed"
+ || *opt_key == "overhangs"
+ || *opt_key == "perimeter_extrusion_width"
+ || *opt_key == "thin_walls"
+ || *opt_key == "external_perimeters_first") {
+ steps.insert(posPerimeters);
+ } else if (*opt_key == "resolution"
+ || *opt_key == "layer_height"
+ || *opt_key == "first_layer_height"
+ || *opt_key == "xy_size_compensation"
+ || *opt_key == "raft_layers") {
+ steps.insert(posSlice);
+ } else if (*opt_key == "support_material"
+ || *opt_key == "support_material_angle"
+ || *opt_key == "support_material_extruder"
+ || *opt_key == "support_material_extrusion_width"
+ || *opt_key == "support_material_interface_layers"
+ || *opt_key == "support_material_interface_extruder"
+ || *opt_key == "support_material_interface_spacing"
+ || *opt_key == "support_material_interface_speed"
+ || *opt_key == "support_material_pattern"
+ || *opt_key == "support_material_spacing"
+ || *opt_key == "support_material_threshold"
+ || *opt_key == "dont_support_bridges") {
+ steps.insert(posSupportMaterial);
+ } else if (*opt_key == "interface_shells"
+ || *opt_key == "infill_only_where_needed"
+ || *opt_key == "bottom_solid_layers"
+ || *opt_key == "top_solid_layers"
+ || *opt_key == "infill_extruder"
+ || *opt_key == "infill_extrusion_width") {
+ steps.insert(posPrepareInfill);
+ } else if (*opt_key == "fill_angle"
+ || *opt_key == "fill_pattern"
+ || *opt_key == "solid_fill_pattern"
+ || *opt_key == "infill_every_layers"
+ || *opt_key == "solid_infill_below_area"
+ || *opt_key == "solid_infill_every_layers"
+ || *opt_key == "top_infill_extrusion_width") {
+ steps.insert(posInfill);
+ } else if (*opt_key == "fill_density"
+ || *opt_key == "solid_infill_extrusion_width") {
+ steps.insert(posPerimeters);
+ steps.insert(posPrepareInfill);
+ } else if (*opt_key == "external_perimeter_extrusion_width"
+ || *opt_key == "perimeter_extruder") {
+ steps.insert(posPerimeters);
+ steps.insert(posSupportMaterial);
+ } else if (*opt_key == "bridge_flow_ratio") {
+ steps.insert(posPerimeters);
+ steps.insert(posInfill);
+ } else if (*opt_key == "seam_position"
+ || *opt_key == "support_material_speed"
+ || *opt_key == "bridge_speed"
+ || *opt_key == "external_perimeter_speed"
+ || *opt_key == "infill_speed"
+ || *opt_key == "perimeter_speed"
+ || *opt_key == "small_perimeter_speed"
+ || *opt_key == "solid_infill_speed"
+ || *opt_key == "top_solid_infill_speed") {
+ // these options only affect G-code export, so nothing to invalidate
+ } else {
+ // for legacy, if we can't handle this option let's invalidate all steps
+ return this->invalidate_all_steps();
+ }
+ }
+
+ bool invalidated = false;
+ for (std::set<PrintObjectStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
+ if (this->invalidate_step(*step)) invalidated = true;
+ }
+
+ return invalidated;
+}
+
+bool
+PrintObject::invalidate_step(PrintObjectStep step)
+{
+ bool invalidated = this->state.invalidate(step);
+
+ // propagate to dependent steps
+ if (step == posPerimeters) {
+ this->invalidate_step(posPrepareInfill);
+ this->_print->invalidate_step(psSkirt);
+ this->_print->invalidate_step(psBrim);
+ } else if (step == posPrepareInfill) {
+ this->invalidate_step(posInfill);
+ } else if (step == posInfill) {
+ this->_print->invalidate_step(psSkirt);
+ this->_print->invalidate_step(psBrim);
+ } else if (step == posSlice) {
+ this->invalidate_step(posPerimeters);
+ this->invalidate_step(posSupportMaterial);
+ }
+
+ return invalidated;
+}
+
+bool
+PrintObject::invalidate_all_steps()
+{
+ // make a copy because when invalidating steps the iterators are not working anymore
+ std::set<PrintObjectStep> steps = this->state.started;
+
+ bool invalidated = false;
+ for (std::set<PrintObjectStep>::const_iterator step = steps.begin(); step != steps.end(); ++step) {
+ if (this->invalidate_step(*step)) invalidated = true;
+ }
+ return invalidated;
+}
+
+
+#ifdef SLIC3RXS
+REGISTER_CLASS(PrintObject, "Print::Object");
+#endif
+
+}