#ifndef slic3r_GCode_ExtrusionOrder_hpp_ #define slic3r_GCode_ExtrusionOrder_hpp_ #include #include #include #include #include #include #include "libslic3r/GCode/SmoothPath.hpp" #include "libslic3r/GCode/WipeTowerIntegration.hpp" #include "libslic3r/ExtrusionEntity.hpp" #include "libslic3r/GCode/SeamPlacer.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/ShortestPath.hpp" #include "libslic3r/GCode/ToolOrdering.hpp" #include "libslic3r/Layer.hpp" #include "libslic3r/Point.hpp" #include "libslic3r/libslic3r.h" namespace Slic3r { class ExtrusionEntity; class ExtrusionEntityReference; class Print; class PrintObject; class PrintRegion; namespace GCode { class WipeTowerIntegration; } // namespace GCode struct PrintInstance; } // namespace Slic3r namespace Slic3r::GCode { // Object and support extrusions of the same PrintObject at the same print_z. // public, so that it could be accessed by free helper functions from GCode.cpp struct ObjectLayerToPrint { ObjectLayerToPrint() : object_layer(nullptr), support_layer(nullptr) {} const Layer *object_layer; const SupportLayer *support_layer; const Layer *layer() const { return (object_layer != nullptr) ? object_layer : support_layer; } const PrintObject *object() const { return (this->layer() != nullptr) ? this->layer()->object() : nullptr; } coordf_t print_z() const { return (object_layer != nullptr && support_layer != nullptr) ? 0.5 * (object_layer->print_z + support_layer->print_z) : this->layer()->print_z; } }; using ObjectsLayerToPrint = std::vector; struct InstanceToPrint { InstanceToPrint( size_t object_layer_to_print_id, const PrintObject &print_object, size_t instance_id ) : object_layer_to_print_id(object_layer_to_print_id) , print_object(print_object) , instance_id(instance_id) {} // Index into std::vector, which contains Object and Support layers for the // current print_z, collected for a single object, or for possibly multiple objects with // multiple instances. const size_t object_layer_to_print_id; const PrintObject &print_object; // Instance idx of the copy of a print object. const size_t instance_id; }; } // namespace Slic3r::GCode namespace Slic3r::GCode::ExtrusionOrder { struct InfillRange { std::vector items; const PrintRegion *region; }; struct Perimeter { GCode::SmoothPath smooth_path; bool reversed; const ExtrusionEntity *extrusion_entity; std::size_t wipe_offset; }; struct IslandExtrusions { const PrintRegion *region; std::vector perimeters; std::vector infill_ranges; bool infill_first{false}; }; struct SliceExtrusions { std::vector common_extrusions; std::vector ironing_extrusions; }; struct SupportPath { SmoothPath path; bool is_interface; }; struct NormalExtrusions { Point instance_offset; std::vector support_extrusions; std::vector slices_extrusions; }; struct OverridenExtrusions { Point instance_offset; std::vector slices_extrusions; }; /** * Intentionally strong type representing a point in a coordinate system * of an instance. Introduced to avoid confusion between local and * global coordinate systems. */ struct InstancePoint { Point local_point; }; using PathSmoothingResult = std::pair; using PathSmoothingFunction = std::function &previous_position )>; struct BrimPath { SmoothPath path; bool is_loop; }; struct ExtruderExtrusions { unsigned extruder_id; std::vector> skirt; std::vector brim; std::vector overriden_extrusions; std::vector normal_extrusions; std::optional wipe_tower_start; }; static constexpr const double min_gcode_segment_length = 0.002; bool is_empty(const std::vector &extrusions); std::vector get_extrusions( const Print &print, const GCode::WipeTowerIntegration *wipe_tower, const GCode::ObjectsLayerToPrint &layers, const bool is_first_layer, const LayerTools &layer_tools, const std::vector &instances_to_print, const std::map> &skirt_loops_per_extruder, unsigned current_extruder_id, const PathSmoothingFunction &smooth_path, bool get_brim, std::optional previous_position ); std::optional get_first_point(const std::vector &extrusions); const PrintInstance * get_first_instance( const std::vector &extrusions, const std::vector &instances_to_print ); } #endif // slic3r_GCode_ExtrusionOrder_hpp_