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/libslic3r/Print.hpp')
-rw-r--r--src/libslic3r/Print.hpp84
1 files changed, 67 insertions, 17 deletions
diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp
index 281ce35bc..819cbab8c 100644
--- a/src/libslic3r/Print.hpp
+++ b/src/libslic3r/Print.hpp
@@ -73,7 +73,7 @@ public:
// Collect 0-based extruder indices used to print this region's object.
void collect_object_printing_extruders(std::vector<unsigned int> &object_extruders) const;
- static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig &region_config, std::vector<unsigned int> &object_extruders);
+ static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig &region_config, const bool has_brim, std::vector<unsigned int> &object_extruders);
// Methods modifying the PrintRegion's state:
public:
@@ -95,9 +95,39 @@ private:
~PrintRegion() = default;
};
+template<typename T>
+class ConstVectorOfPtrsAdaptor {
+public:
+ // Returning a non-const pointer to const pointers to T.
+ T * const * begin() const { return m_data->data(); }
+ T * const * end() const { return m_data->data() + m_data->size(); }
+ const T* front() const { return m_data->front(); }
+ const T* back() const { return m_data->front(); }
+ size_t size() const { return m_data->size(); }
+ bool empty() const { return m_data->empty(); }
+ const T* operator[](size_t i) const { return (*m_data)[i]; }
+ const T* at(size_t i) const { return m_data->at(i); }
+ std::vector<const T*> vector() const { return std::vector<const T*>(this->begin(), this->end()); }
+protected:
+ ConstVectorOfPtrsAdaptor(const std::vector<T*> *data) : m_data(data) {}
+private:
+ const std::vector<T*> *m_data;
+};
+
+typedef std::vector<Layer*> LayerPtrs;
+typedef std::vector<const Layer*> ConstLayerPtrs;
+class ConstLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor<Layer> {
+ friend PrintObject;
+ ConstLayerPtrsAdaptor(const LayerPtrs *data) : ConstVectorOfPtrsAdaptor<Layer>(data) {}
+};
+
+typedef std::vector<SupportLayer*> SupportLayerPtrs;
+typedef std::vector<const SupportLayer*> ConstSupportLayerPtrs;
+class ConstSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor<SupportLayer> {
+ friend PrintObject;
+ ConstSupportLayerPtrsAdaptor(const SupportLayerPtrs *data) : ConstVectorOfPtrsAdaptor<SupportLayer>(data) {}
+};
-typedef std::vector<Layer*> LayerPtrs;
-typedef std::vector<SupportLayer*> SupportLayerPtrs;
class BoundingBoxf3; // TODO: for temporary constructor parameter
// Single instance of a PrintObject.
@@ -125,12 +155,16 @@ public:
std::vector<std::vector<std::pair<t_layer_height_range, int>>> region_volumes;
// Size of an object: XYZ in scaled coordinates. The size might not be quite snug in XY plane.
- const Vec3crd& size() const { return m_size; }
- const PrintObjectConfig& config() const { return m_config; }
- const LayerPtrs& layers() const { return m_layers; }
- const SupportLayerPtrs& support_layers() const { return m_support_layers; }
- const Transform3d& trafo() const { return m_trafo; }
- const PrintInstances& instances() const { return m_instances; }
+ const Vec3crd& size() const { return m_size; }
+ const PrintObjectConfig& config() const { return m_config; }
+ ConstLayerPtrsAdaptor layers() const { return ConstLayerPtrsAdaptor(&m_layers); }
+ ConstSupportLayerPtrsAdaptor support_layers() const { return ConstSupportLayerPtrsAdaptor(&m_support_layers); }
+ const Transform3d& trafo() const { return m_trafo; }
+ const PrintInstances& instances() const { return m_instances; }
+
+ // Whoever will get a non-const pointer to PrintObject will be able to modify its layers.
+ LayerPtrs& layers() { return m_layers; }
+ SupportLayerPtrs& support_layers() { return m_support_layers; }
// Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam.
// The bounding box may not be quite snug.
@@ -171,7 +205,7 @@ public:
void clear_support_layers();
SupportLayer* get_support_layer(int idx) { return m_support_layers[idx]; }
SupportLayer* add_support_layer(int id, coordf_t height, coordf_t print_z);
- SupportLayerPtrs::const_iterator insert_support_layer(SupportLayerPtrs::const_iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z);
+ SupportLayerPtrs::iterator insert_support_layer(SupportLayerPtrs::iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z);
void delete_support_layer(int idx);
// Initialize the layer_height_profile from the model_object's layer_height_profile, from model_object's layer height table, or from slicing parameters.
@@ -344,14 +378,27 @@ struct PrintStatistics
}
};
-typedef std::vector<PrintObject*> PrintObjectPtrs;
-typedef std::vector<PrintRegion*> PrintRegionPtrs;
+typedef std::vector<PrintObject*> PrintObjectPtrs;
+typedef std::vector<const PrintObject*> ConstPrintObjectPtrs;
+class ConstPrintObjectPtrsAdaptor : public ConstVectorOfPtrsAdaptor<PrintObject> {
+ friend Print;
+ ConstPrintObjectPtrsAdaptor(const PrintObjectPtrs *data) : ConstVectorOfPtrsAdaptor<PrintObject>(data) {}
+};
+
+typedef std::vector<PrintRegion*> PrintRegionPtrs;
+typedef std::vector<const PrintRegion*> ConstPrintRegionPtrs;
+class ConstPrintRegionPtrsAdaptor : public ConstVectorOfPtrsAdaptor<PrintRegion> {
+ friend Print;
+ ConstPrintRegionPtrsAdaptor(const PrintRegionPtrs *data) : ConstVectorOfPtrsAdaptor<PrintRegion>(data) {}
+};
// The complete print tray with possibly multiple objects.
class Print : public PrintBaseWithState<PrintStep, psCount>
{
private: // Prevents erroneous use by other classes.
typedef PrintBaseWithState<PrintStep, psCount> Inherited;
+ // Bool indicates if supports of PrintObject are top-level contour.
+ typedef std::pair<PrintObject *, bool> PrintObjectInfo;
public:
Print() = default;
@@ -385,6 +432,7 @@ public:
bool has_infinite_skirt() const;
bool has_skirt() const;
+ bool has_brim() const;
// Returns an empty string if valid, otherwise returns an error message.
std::string validate() const override;
@@ -403,9 +451,8 @@ public:
const PrintConfig& config() const { return m_config; }
const PrintObjectConfig& default_object_config() const { return m_default_object_config; }
const PrintRegionConfig& default_region_config() const { return m_default_region_config; }
- //FIXME returning const vector to non-const PrintObject*, caller could modify PrintObjects!
- const PrintObjectPtrs& objects() const { return m_objects; }
- PrintObject* get_object(size_t idx) { return m_objects[idx]; }
+ ConstPrintObjectPtrsAdaptor objects() const { return ConstPrintObjectPtrsAdaptor(&m_objects); }
+ PrintObject* get_object(size_t idx) { return const_cast<PrintObject*>(m_objects[idx]); }
const PrintObject* get_object(size_t idx) const { return m_objects[idx]; }
// PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects
// in the notification center.
@@ -414,11 +461,15 @@ public:
[object_id](const PrintObject *obj) { return obj->id() == object_id; });
return (it == m_objects.end()) ? nullptr : *it;
}
- const PrintRegionPtrs& regions() const { return m_regions; }
+ ConstPrintRegionPtrsAdaptor regions() const { return ConstPrintRegionPtrsAdaptor(&m_regions); }
// How many of PrintObject::copies() over all print objects are there?
// If zero, then the print is empty and the print shall not be executed.
unsigned int num_object_instances() const;
+ // For Perl bindings.
+ PrintObjectPtrs& objects_mutable() { return m_objects; }
+ PrintRegionPtrs& regions_mutable() { return m_regions; }
+
const ExtrusionEntityCollection& skirt() const { return m_skirt; }
const ExtrusionEntityCollection& brim() const { return m_brim; }
// Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line.
@@ -461,7 +512,6 @@ private:
bool invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys);
void _make_skirt();
- void _make_brim();
void _make_wipe_tower();
void finalize_first_layer_convex_hull();