2013-12-20 00:36:42 +00:00
# ifndef slic3r_Print_hpp_
# define slic3r_Print_hpp_
2018-11-08 13:23:17 +00:00
# include "PrintBase.hpp"
2014-11-30 20:58:41 +00:00
# include "BoundingBox.hpp"
2014-08-03 17:17:23 +00:00
# include "Flow.hpp"
2014-05-06 08:07:18 +00:00
# include "Point.hpp"
# include "Layer.hpp"
2014-11-09 11:25:59 +00:00
# include "Model.hpp"
2016-12-12 16:53:38 +00:00
# include "Slicing.hpp"
2017-05-25 20:27:53 +00:00
# include "GCode/ToolOrdering.hpp"
# include "GCode/WipeTower.hpp"
2019-11-22 11:39:03 +00:00
# if ENABLE_THUMBNAIL_GENERATOR
# include "GCode/ThumbnailData.hpp"
# endif // ENABLE_THUMBNAIL_GENERATOR
2013-12-20 00:36:42 +00:00
2020-01-10 10:26:52 +00:00
# include "libslic3r.h"
2013-12-20 00:36:42 +00:00
namespace Slic3r {
2014-05-06 08:07:18 +00:00
class Print ;
2014-08-03 17:17:23 +00:00
class PrintObject ;
2014-05-06 08:07:18 +00:00
class ModelObject ;
2018-03-28 15:05:31 +00:00
class GCode ;
2018-03-23 10:41:20 +00:00
class GCodePreviewData ;
2014-05-06 08:07:18 +00:00
2016-09-13 11:30:00 +00:00
// Print step IDs for keeping track of the print state.
2013-12-20 00:36:42 +00:00
enum PrintStep {
2020-01-15 15:20:16 +00:00
psSkirt ,
psBrim ,
// Synonym for the last step before the Wipe Tower / Tool Ordering, for the G-code preview slider to understand that
// all the extrusions are there for the layer slider to add color changes etc.
psExtrusionPaths = psBrim ,
psWipeTower ,
// psToolOrdering is a synonym to psWipeTower, as the Wipe Tower calculates and modifies the ToolOrdering,
// while if printing without the Wipe Tower, the ToolOrdering is calculated as well.
psToolOrdering = psWipeTower ,
psGCodeExport ,
psCount ,
2014-06-10 22:15:02 +00:00
} ;
2020-01-15 15:20:16 +00:00
2014-06-10 22:15:02 +00:00
enum PrintObjectStep {
posSlice , posPerimeters , posPrepareInfill ,
2017-05-30 15:17:26 +00:00
posInfill , posSupportMaterial , posCount ,
2013-12-20 00:36:42 +00:00
} ;
2014-05-06 08:07:18 +00:00
// A PrintRegion object represents a group of volumes to print
// sharing the same config (including the same assigned extruder(s))
class PrintRegion
{
friend class Print ;
2018-09-11 12:04:47 +00:00
// Methods NOT modifying the PrintRegion's state:
2017-03-28 11:25:10 +00:00
public :
2018-09-11 12:04:47 +00:00
const Print * print ( ) const { return m_print ; }
const PrintRegionConfig & config ( ) const { return m_config ; }
2019-09-04 14:11:16 +00:00
// 1-based extruder identifier for this region and role.
unsigned int extruder ( FlowRole role ) const ;
2018-09-11 12:04:47 +00:00
Flow flow ( FlowRole role , double layer_height , bool bridge , bool first_layer , double width , const PrintObject & object ) const ;
2018-09-17 13:12:13 +00:00
// Average diameter of nozzles participating on extruding this region.
2018-09-11 12:04:47 +00:00
coordf_t nozzle_dmr_avg ( const PrintConfig & print_config ) const ;
2018-09-17 13:12:13 +00:00
// Average diameter of nozzles participating on extruding this region.
2018-10-18 12:36:46 +00:00
coordf_t bridging_height_avg ( const PrintConfig & print_config ) const ;
2014-05-06 08:07:18 +00:00
2020-01-14 14:12:45 +00:00
// Collect 0-based extruder indices used to print this region's object.
2019-01-21 09:06:51 +00:00
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 ) ;
2018-09-11 12:04:47 +00:00
// Methods modifying the PrintRegion's state:
public :
Print * print ( ) { return m_print ; }
2018-10-18 12:36:46 +00:00
void set_config ( const PrintRegionConfig & config ) { m_config = config ; }
void set_config ( PrintRegionConfig & & config ) { m_config = std : : move ( config ) ; }
void config_apply_only ( const ConfigBase & other , const t_config_option_keys & keys , bool ignore_nonexistent = false )
{ this - > m_config . apply_only ( other , keys , ignore_nonexistent ) ; }
protected :
size_t m_refcnt ;
2014-05-06 08:07:18 +00:00
2017-03-28 11:25:10 +00:00
private :
2018-09-11 12:04:47 +00:00
Print * m_print ;
PrintRegionConfig m_config ;
2015-05-31 20:04:32 +00:00
2018-10-18 12:36:46 +00:00
PrintRegion ( Print * print ) : m_refcnt ( 0 ) , m_print ( print ) { }
PrintRegion ( Print * print , const PrintRegionConfig & config ) : m_refcnt ( 0 ) , m_print ( print ) , m_config ( config ) { }
2017-03-28 11:25:10 +00:00
~ PrintRegion ( ) { }
2014-05-06 08:07:18 +00:00
} ;
typedef std : : vector < Layer * > LayerPtrs ;
typedef std : : vector < SupportLayer * > SupportLayerPtrs ;
class BoundingBoxf3 ; // TODO: for temporary constructor parameter
2020-01-23 08:53:06 +00:00
// Single instance of a PrintObject.
// As multiple PrintObjects may be generated for a single ModelObject (their instances differ in rotation around Z),
// ModelObject's instancess will be distributed among these multiple PrintObjects.
struct PrintInstance
{
// Parent PrintObject
PrintObject * print_object ;
// Source ModelInstance of a ModelObject, for which this print_object was created.
const ModelInstance * model_instance ;
// Shift of this instance towards its PrintObject
Point shift ;
} ;
typedef std : : vector < PrintInstance > PrintInstances ;
2018-11-08 13:23:17 +00:00
class PrintObject : public PrintObjectBaseWithState < Print , PrintObjectStep , posCount >
2014-05-06 08:07:18 +00:00
{
2018-11-08 13:23:17 +00:00
private : // Prevents erroneous use by other classes.
typedef PrintObjectBaseWithState < Print , PrintObjectStep , posCount > Inherited ;
2014-05-06 08:07:18 +00:00
2016-10-13 14:00:22 +00:00
public :
2019-06-20 14:15:09 +00:00
// vector of (layer height ranges and vectors of volume ids), indexed by region_id
std : : vector < std : : vector < std : : pair < t_layer_height_range , int > > > region_volumes ;
2016-12-12 16:53:38 +00:00
2014-07-15 17:07:38 +00:00
// this is set to true when LayerRegion->slices is split in top/internal/bottom
// so that next call to make_perimeters() performs a union() before computing loops
2018-09-12 09:59:02 +00:00
bool typed_slices ;
2014-05-06 08:07:18 +00:00
2018-09-12 09:59:02 +00:00
Vec3crd size ; // XYZ in scaled coordinates
2014-05-06 08:07:18 +00:00
2018-09-11 12:04:47 +00:00
const PrintObjectConfig & config ( ) const { return m_config ; }
const LayerPtrs & layers ( ) const { return m_layers ; }
const SupportLayerPtrs & support_layers ( ) const { return m_support_layers ; }
2018-10-17 09:12:38 +00:00
const Transform3d & trafo ( ) const { return m_trafo ; }
2020-01-23 08:53:06 +00:00
const PrintInstances & instances ( ) const { return m_instances ; }
const Point instance_center ( size_t idx ) const { return m_instances [ idx ] . shift + m_copies_shift + Point ( this - > size . x ( ) / 2 , this - > size . y ( ) / 2 ) ; }
2018-10-18 12:36:46 +00:00
2017-05-30 15:24:50 +00:00
// since the object is aligned to origin, bounding box coincides with size
2018-08-21 15:43:05 +00:00
BoundingBox bounding_box ( ) const { return BoundingBox ( Point ( 0 , 0 ) , to_2d ( this - > size ) ) ; }
2014-05-06 08:07:18 +00:00
2017-05-30 15:24:50 +00:00
// adds region_id, too, if necessary
2019-06-20 14:15:09 +00:00
void add_region_volume ( unsigned int region_id , int volume_id , const t_layer_height_range & layer_range ) {
2017-05-31 10:55:59 +00:00
if ( region_id > = region_volumes . size ( ) )
2018-12-17 18:46:36 +00:00
region_volumes . resize ( region_id + 1 ) ;
2019-06-20 14:15:09 +00:00
region_volumes [ region_id ] . emplace_back ( layer_range , volume_id ) ;
2017-05-31 10:55:59 +00:00
}
2017-05-30 15:24:50 +00:00
// This is the *total* layer count (including support layers)
// this value is not supposed to be compared with Layer::id
// since they have different semantics.
2020-01-23 08:53:06 +00:00
size_t total_layer_count ( ) const { return this - > layer_count ( ) + this - > support_layer_count ( ) ; }
size_t layer_count ( ) const { return m_layers . size ( ) ; }
void clear_layers ( ) ;
2020-01-10 10:26:52 +00:00
const Layer * get_layer ( int idx ) const { return m_layers [ idx ] ; }
Layer * get_layer ( int idx ) { return m_layers [ idx ] ; }
// Get a layer exactly at print_z.
const Layer * get_layer_at_printz ( coordf_t print_z ) const {
auto it = Slic3r : : lower_bound_by_predicate ( m_layers . begin ( ) , m_layers . end ( ) , [ print_z ] ( const Layer * layer ) { return layer - > print_z < print_z ; } ) ;
return ( it = = m_layers . end ( ) | | ( * it ) - > print_z ! = print_z ) ? nullptr : * it ;
}
Layer * get_layer_at_printz ( coordf_t print_z ) { return const_cast < Layer * > ( std : : as_const ( * this ) . get_layer_at_printz ( print_z ) ) ; }
// Get a layer approximately at print_z.
const Layer * get_layer_at_printz ( coordf_t print_z , coordf_t epsilon ) const {
coordf_t limit = print_z + epsilon ;
auto it = Slic3r : : lower_bound_by_predicate ( m_layers . begin ( ) , m_layers . end ( ) , [ limit ] ( const Layer * layer ) { return layer - > print_z < limit ; } ) ;
return ( it = = m_layers . end ( ) | | ( * it ) - > print_z < print_z - epsilon ) ? nullptr : * it ;
}
Layer * get_layer_at_printz ( coordf_t print_z , coordf_t epsilon ) { return const_cast < Layer * > ( std : : as_const ( * this ) . get_layer_at_printz ( print_z , epsilon ) ) ; }
2016-10-16 14:30:56 +00:00
2016-09-13 11:30:00 +00:00
// print_z: top of the layer; slice_z: center of the layer.
2014-06-10 14:01:57 +00:00
Layer * add_layer ( int id , coordf_t height , coordf_t print_z , coordf_t slice_z ) ;
2014-05-06 08:07:18 +00:00
2018-09-11 12:04:47 +00:00
size_t support_layer_count ( ) const { return m_support_layers . size ( ) ; }
2014-05-06 08:07:18 +00:00
void clear_support_layers ( ) ;
2018-09-11 12:04:47 +00:00
SupportLayer * get_support_layer ( int idx ) { return m_support_layers [ idx ] ; }
2015-01-30 17:45:30 +00:00
SupportLayer * add_support_layer ( int id , coordf_t height , coordf_t print_z ) ;
2019-06-25 11:06:04 +00:00
SupportLayerPtrs : : const_iterator insert_support_layer ( SupportLayerPtrs : : const_iterator pos , size_t id , coordf_t height , coordf_t print_z , coordf_t slice_z ) ;
2014-05-06 08:07:18 +00:00
void delete_support_layer ( int idx ) ;
2014-06-10 22:15:02 +00:00
2019-01-21 09:06:51 +00:00
// Initialize the layer_height_profile from the model_object's layer_height_profile, from model_object's layer height table, or from slicing parameters.
// Returns true, if the layer_height_profile was changed.
static bool update_layer_height_profile ( const ModelObject & model_object , const SlicingParameters & slicing_parameters , std : : vector < coordf_t > & layer_height_profile ) ;
2018-05-30 13:18:45 +00:00
2016-12-12 16:53:38 +00:00
// Collect the slicing parameters, to be used by variable layer thickness algorithm,
// by the interactive layer height editor and by the printing process itself.
// The slicing parameters are dependent on various configuration values
// (layer height, first layer height, raft settings, print nozzle diameter etc).
2019-03-05 13:05:58 +00:00
const SlicingParameters & slicing_parameters ( ) const { return m_slicing_params ; }
2019-04-13 12:15:54 +00:00
static SlicingParameters slicing_parameters ( const DynamicPrintConfig & full_config , const ModelObject & model_object , float object_max_z ) ;
2019-01-21 09:06:51 +00:00
// returns 0-based indices of extruders used to print the object (without brim, support and other helper extrusions)
std : : vector < unsigned int > object_extruders ( ) const ;
2016-12-12 16:53:38 +00:00
2018-03-23 15:00:00 +00:00
// Called when slicing to SVG (see Print.pm sub export_svg), and used by perimeters.t
2018-03-23 10:41:20 +00:00
void slice ( ) ;
2018-03-23 15:00:00 +00:00
2018-09-17 13:12:13 +00:00
// Helpers to slice support enforcer / blocker meshes by the support generator.
2019-06-20 14:15:09 +00:00
std : : vector < ExPolygons > slice_support_volumes ( const ModelVolumeType & model_volume_type ) const ;
std : : vector < ExPolygons > slice_support_blockers ( ) const { return this - > slice_support_volumes ( ModelVolumeType : : SUPPORT_BLOCKER ) ; }
std : : vector < ExPolygons > slice_support_enforcers ( ) const { return this - > slice_support_volumes ( ModelVolumeType : : SUPPORT_ENFORCER ) ; }
2018-09-17 13:12:13 +00:00
2020-01-23 08:53:06 +00:00
private :
2018-11-08 13:23:17 +00:00
// to be called from Print only.
friend class Print ;
2018-12-07 10:21:05 +00:00
PrintObject ( Print * print , ModelObject * model_object , bool add_instances = true ) ;
2018-11-08 13:23:17 +00:00
~ PrintObject ( ) { }
void config_apply ( const ConfigBase & other , bool ignore_nonexistent = false ) { this - > m_config . apply ( other , ignore_nonexistent ) ; }
void config_apply_only ( const ConfigBase & other , const t_config_option_keys & keys , bool ignore_nonexistent = false ) { this - > m_config . apply_only ( other , keys , ignore_nonexistent ) ; }
void set_trafo ( const Transform3d & trafo ) { m_trafo = trafo ; }
2020-01-23 08:53:06 +00:00
PrintBase : : ApplyStatus set_instances ( PrintInstances & & instances ) ;
void set_trafo_and_instances ( const Transform3d & trafo , PrintInstances & & instances ) { this - > set_trafo ( trafo ) ; this - > set_instances ( std : : move ( instances ) ) ; }
2018-11-08 13:23:17 +00:00
// Invalidates the step, and its depending steps in PrintObject and Print.
bool invalidate_step ( PrintObjectStep step ) ;
2018-11-12 15:28:27 +00:00
// Invalidates all PrintObject and Print steps.
bool invalidate_all_steps ( ) ;
2018-11-21 16:35:35 +00:00
// Invalidate steps based on a set of parameters changed.
bool invalidate_state_by_config_options ( const std : : vector < t_config_option_key > & opt_keys ) ;
2019-03-05 13:05:58 +00:00
// If ! m_slicing_params.valid, recalculate.
void update_slicing_parameters ( ) ;
2018-11-08 13:23:17 +00:00
2019-01-21 09:06:51 +00:00
static PrintObjectConfig object_config_from_model_object ( const PrintObjectConfig & default_object_config , const ModelObject & object , size_t num_extruders ) ;
2019-06-20 14:15:09 +00:00
static PrintRegionConfig region_config_from_model_volume ( const PrintRegionConfig & default_region_config , const DynamicPrintConfig * layer_range_config , const ModelVolume & volume , size_t num_extruders ) ;
2019-01-21 09:06:51 +00:00
2018-03-23 15:00:00 +00:00
private :
2018-03-23 10:41:20 +00:00
void make_perimeters ( ) ;
void prepare_infill ( ) ;
void infill ( ) ;
void generate_support_material ( ) ;
2019-01-23 13:00:03 +00:00
void _slice ( const std : : vector < coordf_t > & layer_height_profile ) ;
2017-03-08 10:56:42 +00:00
std : : string _fix_slicing_errors ( ) ;
2020-01-03 13:05:56 +00:00
void simplify_slices ( double distance ) ;
2015-03-06 08:56:58 +00:00
bool has_support_material ( ) const ;
2016-11-10 18:23:01 +00:00
void detect_surfaces_type ( ) ;
2015-10-26 22:23:03 +00:00
void process_external_surfaces ( ) ;
2016-09-26 11:56:24 +00:00
void discover_vertical_shells ( ) ;
2014-12-24 09:20:55 +00:00
void bridge_over_infill ( ) ;
2017-08-02 12:24:32 +00:00
void clip_fill_surfaces ( ) ;
void discover_horizontal_shells ( ) ;
void combine_infill ( ) ;
2016-12-20 11:19:13 +00:00
void _generate_support_material ( ) ;
2016-12-12 16:53:38 +00:00
2018-09-11 12:04:47 +00:00
PrintObjectConfig m_config ;
2018-10-17 09:12:38 +00:00
// Translation in Z + Rotation + Scaling / Mirroring.
Transform3d m_trafo = Transform3d : : Identity ( ) ;
2018-09-11 12:04:47 +00:00
// Slic3r::Point objects in scaled G-code coordinates
2020-01-23 08:53:06 +00:00
std : : vector < PrintInstance > m_instances ;
2018-09-12 09:59:02 +00:00
// scaled coordinates to add to copies (to compensate for the alignment
// operated when creating the object but still preserving a coherent API
// for external callers)
Point m_copies_shift ;
2018-09-11 12:04:47 +00:00
2019-03-04 14:28:04 +00:00
SlicingParameters m_slicing_params ;
2018-09-11 12:04:47 +00:00
LayerPtrs m_layers ;
SupportLayerPtrs m_support_layers ;
2014-05-19 20:38:10 +00:00
2019-06-20 14:15:09 +00:00
std : : vector < ExPolygons > slice_region ( size_t region_id , const std : : vector < float > & z ) const ;
std : : vector < ExPolygons > slice_modifiers ( size_t region_id , const std : : vector < float > & z ) const ;
std : : vector < ExPolygons > slice_volumes ( const std : : vector < float > & z , const std : : vector < const ModelVolume * > & volumes ) const ;
std : : vector < ExPolygons > slice_volume ( const std : : vector < float > & z , const ModelVolume & volume ) const ;
std : : vector < ExPolygons > slice_volume ( const std : : vector < float > & z , const std : : vector < t_layer_height_range > & ranges , const ModelVolume & volume ) const ;
2014-05-06 08:07:18 +00:00
} ;
2018-09-11 12:04:47 +00:00
struct WipeTowerData
{
// Following section will be consumed by the GCodeGenerator.
// Tool ordering of a non-sequential print has to be known to calculate the wipe tower.
// Cache it here, so it does not need to be recalculated during the G-code generation.
2020-01-16 13:59:16 +00:00
ToolOrdering & tool_ordering ;
2018-09-11 12:04:47 +00:00
// Cache of tool changes per print layer.
2019-06-14 10:28:24 +00:00
std : : unique_ptr < std : : vector < WipeTower : : ToolChangeResult > > priming ;
2018-09-11 12:04:47 +00:00
std : : vector < std : : vector < WipeTower : : ToolChangeResult > > tool_changes ;
std : : unique_ptr < WipeTower : : ToolChangeResult > final_purge ;
2018-09-17 13:12:13 +00:00
std : : vector < float > used_filament ;
int number_of_toolchanges ;
2018-09-11 12:04:47 +00:00
2018-09-12 09:59:02 +00:00
// Depth of the wipe tower to pass to GLCanvas3D for exact bounding box:
float depth ;
2019-10-08 11:50:51 +00:00
float brim_width ;
2018-09-12 09:59:02 +00:00
2018-09-11 12:04:47 +00:00
void clear ( ) {
priming . reset ( nullptr ) ;
tool_changes . clear ( ) ;
final_purge . reset ( nullptr ) ;
2018-09-17 13:12:13 +00:00
used_filament . clear ( ) ;
number_of_toolchanges = - 1 ;
2018-09-12 09:59:02 +00:00
depth = 0.f ;
2019-10-08 11:50:51 +00:00
brim_width = 0.f ;
2018-09-11 12:04:47 +00:00
}
2020-01-16 13:59:16 +00:00
private :
// Only allow the WipeTowerData to be instantiated internally by Print,
// as this WipeTowerData shares reference to Print::m_tool_ordering.
friend class Print ;
WipeTowerData ( ToolOrdering & tool_ordering ) : tool_ordering ( tool_ordering ) { clear ( ) ; }
WipeTowerData ( const WipeTowerData & /* rhs */ ) = delete ;
WipeTowerData & operator = ( const WipeTowerData & /* rhs */ ) = delete ;
2018-09-11 12:04:47 +00:00
} ;
struct PrintStatistics
{
PrintStatistics ( ) { clear ( ) ; }
2018-06-27 13:35:47 +00:00
std : : string estimated_normal_print_time ;
2018-05-30 10:08:03 +00:00
std : : string estimated_silent_print_time ;
2019-07-08 06:40:20 +00:00
std : : vector < std : : string > estimated_normal_color_print_times ;
std : : vector < std : : string > estimated_silent_color_print_times ;
2018-09-11 12:04:47 +00:00
double total_used_filament ;
double total_extruded_volume ;
double total_cost ;
2019-02-04 23:55:06 +00:00
int total_toolchanges ;
2018-09-11 12:04:47 +00:00
double total_weight ;
2018-09-17 13:12:13 +00:00
double total_wipe_tower_cost ;
double total_wipe_tower_filament ;
2018-09-11 12:04:47 +00:00
std : : map < size_t , float > filament_stats ;
2018-12-12 14:09:20 +00:00
// Config with the filled in print statistics.
DynamicConfig config ( ) const ;
// Config with the statistics keys populated with placeholder strings.
static DynamicConfig placeholders ( ) ;
// Replace the print statistics placeholders in the path.
std : : string finalize_output_path ( const std : : string & path_in ) const ;
2018-09-11 12:04:47 +00:00
void clear ( ) {
2018-09-12 09:59:02 +00:00
estimated_normal_print_time . clear ( ) ;
estimated_silent_print_time . clear ( ) ;
2019-07-08 06:40:20 +00:00
estimated_normal_color_print_times . clear ( ) ;
estimated_silent_color_print_times . clear ( ) ;
2018-09-11 12:04:47 +00:00
total_used_filament = 0. ;
total_extruded_volume = 0. ;
total_cost = 0. ;
2019-02-04 23:55:06 +00:00
total_toolchanges = 0 ;
2018-09-12 09:59:02 +00:00
total_weight = 0. ;
2018-09-17 13:12:13 +00:00
total_wipe_tower_cost = 0. ;
total_wipe_tower_filament = 0. ;
2018-09-11 12:04:47 +00:00
filament_stats . clear ( ) ;
}
} ;
2014-05-06 08:07:18 +00:00
typedef std : : vector < PrintObject * > PrintObjectPtrs ;
typedef std : : vector < PrintRegion * > PrintRegionPtrs ;
2016-09-13 11:30:00 +00:00
// The complete print tray with possibly multiple objects.
2018-11-08 13:23:17 +00:00
class Print : public PrintBaseWithState < PrintStep , psCount >
2014-05-06 08:07:18 +00:00
{
2018-11-08 13:23:17 +00:00
private : // Prevents erroneous use by other classes.
typedef PrintBaseWithState < PrintStep , psCount > Inherited ;
2017-03-13 15:03:11 +00:00
public :
2018-11-08 13:23:17 +00:00
Print ( ) { }
virtual ~ Print ( ) { this - > clear ( ) ; }
PrinterTechnology technology ( ) const noexcept { return ptFFF ; }
2014-06-10 14:01:57 +00:00
2018-09-11 12:04:47 +00:00
// Methods, which change the state of Print / PrintObject / PrintRegion.
// The following methods are synchronized with process() and export_gcode(),
// so that process() and export_gcode() may be called from a background thread.
// In case the following methods need to modify data processed by process() or export_gcode(),
// a cancellation callback is executed to stop the background processing before the operation.
2018-11-08 13:23:17 +00:00
void clear ( ) override ;
2018-11-08 19:18:40 +00:00
bool empty ( ) const override { return m_objects . empty ( ) ; }
2018-11-08 13:23:17 +00:00
2019-07-25 12:39:19 +00:00
ApplyStatus apply ( const Model & model , DynamicPrintConfig config ) override ;
2018-11-08 13:23:17 +00:00
2018-11-08 19:18:40 +00:00
void process ( ) override ;
2019-03-13 14:44:50 +00:00
// Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file.
// If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r).
2019-10-23 11:31:24 +00:00
# if ENABLE_THUMBNAIL_GENERATOR
2019-11-22 11:39:03 +00:00
std : : string export_gcode ( const std : : string & path_template , GCodePreviewData * preview_data , ThumbnailsGeneratorCallback thumbnail_cb = nullptr ) ;
2019-10-23 11:31:24 +00:00
# else
2019-03-13 14:44:50 +00:00
std : : string export_gcode ( const std : : string & path_template , GCodePreviewData * preview_data ) ;
2019-10-23 11:31:24 +00:00
# endif // ENABLE_THUMBNAIL_GENERATOR
2014-06-10 14:01:57 +00:00
2014-06-10 22:15:02 +00:00
// methods for handling state
2018-11-08 13:23:17 +00:00
bool is_step_done ( PrintStep step ) const { return Inherited : : is_step_done ( step ) ; }
2018-12-11 16:49:31 +00:00
// Returns true if an object step is done on all objects and there's at least one object.
2018-09-11 12:04:47 +00:00
bool is_step_done ( PrintObjectStep step ) const ;
2018-12-11 16:49:31 +00:00
// Returns true if the last step was finished with success.
bool finished ( ) const override { return this - > is_step_done ( psGCodeExport ) ; }
2018-09-11 12:04:47 +00:00
bool has_infinite_skirt ( ) const ;
bool has_skirt ( ) const ;
2018-09-12 09:59:02 +00:00
2016-11-05 01:23:46 +00:00
// Returns an empty string if valid, otherwise returns an error message.
2018-11-08 19:18:40 +00:00
std : : string validate ( ) const override ;
2018-09-11 12:04:47 +00:00
BoundingBox bounding_box ( ) const ;
BoundingBox total_bounding_box ( ) const ;
double skirt_first_layer_height ( ) const ;
Flow brim_flow ( ) const ;
Flow skirt_flow ( ) const ;
2014-08-03 16:41:09 +00:00
2017-05-03 16:28:22 +00:00
std : : vector < unsigned int > object_extruders ( ) const ;
std : : vector < unsigned int > support_material_extruders ( ) const ;
std : : vector < unsigned int > extruders ( ) const ;
2018-09-11 12:04:47 +00:00
double max_allowed_layer_height ( ) const ;
bool has_support_material ( ) const ;
// Make sure the background processing has no access to this model_object during this call!
void auto_assign_extruders ( ModelObject * model_object ) const ;
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 ; }
2020-01-10 10:26:52 +00:00
//FIXME returning const vector to non-const PrintObject*, caller could modify PrintObjects!
2018-09-11 12:04:47 +00:00
const PrintObjectPtrs & objects ( ) const { return m_objects ; }
2018-10-11 08:03:38 +00:00
PrintObject * get_object ( size_t idx ) { return m_objects [ idx ] ; }
const PrintObject * get_object ( size_t idx ) const { return m_objects [ idx ] ; }
2018-09-11 12:04:47 +00:00
const PrintRegionPtrs & regions ( ) const { return m_regions ; }
2018-10-23 20:53:43 +00:00
// 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 ;
2018-09-11 12:04:47 +00:00
const ExtrusionEntityCollection & skirt ( ) const { return m_skirt ; }
const ExtrusionEntityCollection & brim ( ) const { return m_brim ; }
2017-02-15 10:05:52 +00:00
2018-09-11 12:04:47 +00:00
const PrintStatistics & print_statistics ( ) const { return m_print_statistics ; }
2017-05-25 20:27:53 +00:00
// Wipe tower support.
2018-09-11 12:04:47 +00:00
bool has_wipe_tower ( ) const ;
2019-10-08 11:50:51 +00:00
const WipeTowerData & wipe_tower_data ( size_t extruders_cnt = 0 , double first_layer_height = 0. , double nozzle_diameter = 0. ) const ;
2020-01-15 15:20:16 +00:00
const ToolOrdering & tool_ordering ( ) const { return m_tool_ordering ; }
2017-05-25 20:27:53 +00:00
2019-05-17 14:27:00 +00:00
std : : string output_filename ( const std : : string & filename_base = std : : string ( ) ) const override ;
2017-09-01 15:30:18 +00:00
2018-09-11 12:04:47 +00:00
// Accessed by SupportMaterial
const PrintRegion * get_region ( size_t idx ) const { return m_regions [ idx ] ; }
2020-01-15 14:35:56 +00:00
const ToolOrdering & get_tool_ordering ( ) const { return m_wipe_tower_data . tool_ordering ; } // #ys_FIXME just for testing
2018-03-28 15:05:31 +00:00
protected :
2018-09-11 12:04:47 +00:00
// methods for handling regions
PrintRegion * get_region ( size_t idx ) { return m_regions [ idx ] ; }
PrintRegion * add_region ( ) ;
PrintRegion * add_region ( const PrintRegionConfig & config ) ;
2018-03-28 15:05:31 +00:00
2018-11-08 13:23:17 +00:00
// Invalidates the step, and its depending steps in Print.
bool invalidate_step ( PrintStep step ) ;
2017-03-13 15:03:11 +00:00
private :
2019-07-25 12:39:19 +00:00
void config_diffs (
const DynamicPrintConfig & new_full_config ,
t_config_option_keys & print_diff , t_config_option_keys & object_diff , t_config_option_keys & region_diff ,
t_config_option_keys & full_config_diff ,
DynamicPrintConfig & placeholder_parser_overrides ,
DynamicPrintConfig & filament_overrides ) const ;
2018-09-11 12:04:47 +00:00
bool invalidate_state_by_config_options ( const std : : vector < t_config_option_key > & opt_keys ) ;
2017-09-01 15:30:18 +00:00
2018-09-11 12:04:47 +00:00
void _make_skirt ( ) ;
void _make_brim ( ) ;
void _make_wipe_tower ( ) ;
2018-03-23 10:41:20 +00:00
2018-11-02 19:41:49 +00:00
// Declared here to have access to Model / ModelObject / ModelInstance
static void model_volume_list_update_supports ( ModelObject & model_object_dst , const ModelObject & model_object_src ) ;
2018-09-11 12:04:47 +00:00
PrintConfig m_config ;
PrintObjectConfig m_default_object_config ;
PrintRegionConfig m_default_region_config ;
PrintObjectPtrs m_objects ;
PrintRegionPtrs m_regions ;
// Ordered collections of extrusion paths to build skirt loops and brim.
ExtrusionEntityCollection m_skirt ;
ExtrusionEntityCollection m_brim ;
// Following section will be consumed by the GCodeGenerator.
2020-01-15 15:20:16 +00:00
ToolOrdering m_tool_ordering ;
WipeTowerData m_wipe_tower_data { m_tool_ordering } ;
2018-09-11 12:04:47 +00:00
// Estimated print time, filament consumed.
PrintStatistics m_print_statistics ;
2018-03-28 15:05:31 +00:00
// To allow GCode to set the Print's GCodeExport step status.
friend class GCode ;
2018-09-11 12:04:47 +00:00
// Allow PrintObject to access m_mutex and m_cancel_callback.
friend class PrintObject ;
2014-05-06 08:07:18 +00:00
} ;
2018-11-08 13:23:17 +00:00
} /* slic3r_Print_hpp_ */
2013-12-20 00:36:42 +00:00
# endif