diff options
Diffstat (limited to 'src/libslic3r/Print.hpp')
-rw-r--r-- | src/libslic3r/Print.hpp | 84 |
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 ®ion_config, std::vector<unsigned int> &object_extruders); + static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_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(); |