OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT > Class Template Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/PrintBase.hpp>

Inheritance diagram for Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >:
Collaboration diagram for Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >:

Public Types

typedef PrintState< PrintObjectStepEnum, COUNT > PrintObjectState
using Timestamp = uint64_t

Public Member Functions

PrintType * print ()
const PrintType * print () const
bool is_step_done (PrintObjectStepEnum step) const
PrintStateBase::StateWithTimeStamp step_state_with_timestamp (PrintObjectStepEnum step) const
PrintStateBase::StateWithWarnings step_state_with_warnings (PrintObjectStepEnum step) const
const ModelObject * model_object () const
ModelObject * model_object ()
ObjectID id () const
virtual Timestamp timestamp () const

Protected Member Functions

 PrintObjectBaseWithState (PrintType *print, ModelObject *model_object)
bool set_started (PrintObjectStepEnum step)
PrintStateBase::TimeStamp set_done (PrintObjectStepEnum step)
bool invalidate_step (PrintObjectStepEnum step)
template<typename StepTypeIterator>
bool invalidate_steps (StepTypeIterator step_begin, StepTypeIterator step_end)
bool invalidate_steps (std::initializer_list< PrintObjectStepEnum > il)
bool invalidate_all_steps ()
bool invalidate_all_steps_without_cancel ()
bool is_step_started_unguarded (PrintObjectStepEnum step) const
bool is_step_done_unguarded (PrintObjectStepEnum step) const
void active_step_add_warning (PrintStateBase::WarningLevel warning_level, const std::string &message, PrintStateBase::SlicingNotificationType message_id=PrintStateBase::SlicingDefaultNotification)
void throw_if_canceled ()
void status_update_warnings (PrintBase *print, int step, PrintStateBase::WarningLevel warning_level, const std::string &message, PrintStateBase::SlicingNotificationType message_id=PrintStateBase::SlicingDefaultNotification)
void emptylayer_update_msg (PrintBase *print, int type, const std::string &message, bool overwrite)
void set_new_unique_id ()
void set_invalid_id ()
void copy_id (const ObjectBase &rhs)
virtual void assign_new_unique_ids_recursive ()

Static Protected Member Functions

static std::mutex & state_mutex (PrintBase *print)
static std::function< void()> cancel_callback (PrintBase *print)

Protected Attributes

friend PrintType
PrintType * m_print
ModelObject * m_model_object

Private Member Functions

template<class Archive>
void serialize (Archive &ar)

Static Private Member Functions

static ObjectID generate_new_id ()
template<class Archive>
static void load_and_construct (Archive &ar, cereal::construct< ObjectBase > &construct)

Private Attributes

PrintState< PrintObjectStepEnum, COUNT > m_state
ObjectID m_id

Static Private Attributes

static size_t s_last_id = 0

Detailed Description

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
class Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >

Member Typedef Documentation

◆ PrintObjectState

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
typedef PrintState<PrintObjectStepEnum, COUNT> Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::PrintObjectState

◆ Timestamp

using Slic3r::ObjectBase::Timestamp = uint64_t
inherited

Constructor & Destructor Documentation

◆ PrintObjectBaseWithState()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::PrintObjectBaseWithState ( PrintType * print,
ModelObject * model_object )
inlineprotected
PrintType * m_print
Definition PrintBase.hpp:687
PrintType * print()
Definition PrintBase.hpp:637
const ModelObject * model_object() const
Definition PrintBase.hpp:346
PrintObjectBase(ModelObject *model_object)
Definition PrintBase.hpp:350

Member Function Documentation

◆ active_step_add_warning()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
void Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::active_step_add_warning ( PrintStateBase::WarningLevel warning_level,
const std::string & message,
PrintStateBase::SlicingNotificationType message_id = PrintStateBase::SlicingDefaultNotification )
inlineprotected
675 {
677 if (active_step.second)
679 }
Definition PrintBase.hpp:635
PrintState< PrintObjectStepEnum, COUNT > m_state
Definition PrintBase.hpp:690
void status_update_warnings(PrintBase *print, int step, PrintStateBase::WarningLevel warning_level, const std::string &message, PrintStateBase::SlicingNotificationType message_id=PrintStateBase::SlicingDefaultNotification)
Definition PrintBase.cpp:165

◆ assign_new_unique_ids_recursive()

virtual void Slic3r::ObjectBase::assign_new_unique_ids_recursive ( )
inlineprotectedvirtualinherited

Reimplemented in Slic3r::Model, Slic3r::ModelObject, and Slic3r::ModelVolume.

95{ this->set_new_unique_id(); }
void set_new_unique_id()
Definition ObjectID.hpp:89

References set_new_unique_id().

Here is the call graph for this function:

◆ cancel_callback()

std::function< void()> Slic3r::PrintObjectBase::cancel_callback ( PrintBase * print)
staticprotectedinherited
161{
162 return print->cancel_callback();
163}

References Slic3r::PrintBase::cancel_callback().

Referenced by Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::invalidate_all_steps(), Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::invalidate_step(), Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::invalidate_steps(), and Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::invalidate_steps().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ copy_id()

void Slic3r::ObjectBase::copy_id ( const ObjectBase & rhs)
inlineprotectedinherited
92{ m_id = rhs.id(); }
ObjectID m_id
Definition ObjectID.hpp:98

References ObjectBase(), id(), and m_id.

Referenced by Slic3r::CutObjectBase::copy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ emptylayer_update_msg()

void Slic3r::PrintObjectBase::emptylayer_update_msg ( PrintBase * print,
int type,
const std::string & message,
bool overwrite )
protectedinherited

◆ generate_new_id()

ObjectID Slic3r::ObjectBase::generate_new_id ( )
inlinestaticprivateinherited
100{ return ObjectID(++ s_last_id); }
static size_t s_last_id
Definition ObjectID.hpp:101

References s_last_id.

Referenced by ObjectBase(), and set_new_unique_id().

Here is the caller graph for this function:

◆ id()

ObjectID Slic3r::ObjectBase::id ( ) const
inlineinherited
69{ return m_id; }

References m_id.

Referenced by Slic3r::CutObjectBase::CutObjectBase(), Slic3r::Model::Model(), Slic3r::ModelInstance::ModelInstance(), Slic3r::ModelMaterial::ModelMaterial(), Slic3r::ModelObject::ModelObject(), Slic3r::ModelObject::ModelObject(), Slic3r::ModelObject::ModelObject(), Slic3r::ModelObject::ModelObject(), Slic3r::ModelObject::ModelObject(), Slic3r::ModelVolume::ModelVolume(), Slic3r::ModelVolume::ModelVolume(), Slic3r::ModelVolume::ModelVolume(), Slic3r::ModelVolume::ModelVolume(), Slic3r::ModelVolume::ModelVolume(), Slic3r::ModelVolume::ModelVolume(), ObjectBase(), Slic3r::PrintBase::SlicingStatus::SlicingStatus(), Slic3r::PrintBase::SlicingStatus::SlicingStatus(), Slic3r::_BBS_3MF_Exporter::_add_cut_information_file_to_archive(), Slic3r::_BBS_3MF_Exporter::_add_model_config_file_to_archive(), Slic3r::_BBS_3MF_Exporter::_add_slice_info_config_file_to_archive(), Slic3r::GUI::Plater::priv::actualize_slicing_warnings(), Slic3r::ModelObjectStatusDB::add(), Slic3r::ModelObjectStatusDB::add_if_new(), Slic3r::Model::add_object(), Slic3r::append_and_translate(), Slic3r::SLAPrint::apply(), Slic3r::GUI::calc_distance(), Slic3r::GUI::calc_surface_offset(), Slic3r::check_model_ids_equal(), Slic3r::check_model_ids_validity(), Slic3r::GUI::GLGizmoTextureDisplacement::close_image_adjust(), Slic3r::Model::collect_reusable_objects(), Slic3r::ModelObject::convert_units(), copy_id(), Slic3r::PrintObjectStatusDB::count(), anonymous_namespace{RaycastManager.cpp}::create_key(), Slic3r::GUI::create_meshes(), anonymous_namespace{EmbossJob.cpp}::create_volume(), Slic3r::GUI::Emboss::create_volume_sources(), Slic3r::GUI::GLGizmoPainterBase::data_changed(), Slic3r::GCode::do_export(), Slic3r::GUI::PartPlate::duplicate_all_instance(), Slic3r::GUI::PartPlateList::duplicate_plate(), Slic3r::GUI::PartPlate::estimate_wipe_tower_footprint(), Slic3r::Print::export_cached_data(), Slic3r::GUI::Plater::export_stl(), Slic3r::find_volume_extents(), Slic3r::PreciseSeam::detail::fragment_location(), Slic3r::GUI::Plater::priv::generate_first_layer_bbox(), Slic3r::ModelObjectStatusDB::get(), Slic3r::Model::get_backup_path(), Slic3r::GUI::GLCanvas3D::get_empty_cells(), Slic3r::ModelInstance::get_labeled_id(), Slic3r::GUI::get_model_volume(), Slic3r::PrintObjectStatusDB::get_range(), Slic3r::GUI::get_selected_volume(), Slic3r::GUI::get_volume(), Slic3r::CutObjectBase::has_same_id(), Slic3r::UndoRedo::StackImpl::immutable_object_id_impl(), Slic3r::GUI::GLGizmoFdmSupports::init_print_instance(), Slic3r::CutObjectBase::is_equal(), Slic3r::GUI::GLGizmoSVG::is_svg_object(), Slic3r::ModelVolume::is_the_only_one_part(), Slic3r::GUI::IMSlider::IsNewPrint(), Slic3r::ModelObject::load(), load_and_construct(), Slic3r::Print::load_cached_data(), Slic3r::GLVolumeCollection::load_object_auxiliary(), Slic3r::GLVolumeCollection::load_object_volume(), Slic3r::GUI::GCodeViewer::load_shells(), Slic3r::UndoRedo::StackImpl::load_snapshot(), Slic3r::GUI::GLCanvas3D::CenterOfMass::model_markers(), Slic3r::model_property_changed(), Slic3r::model_volume_list_changed(), Slic3r::model_volume_list_copy_configs(), Slic3r::ModelConfigObject::object_id_and_timestamp_match(), Slic3r::ObjectWithTimestamp::object_id_and_timestamp_match(), Slic3r::GUI::GLGizmoEmboss::on_mouse_change_selection(), Slic3r::GUI::GLGizmoSimplify::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::open_image_adjust(), Slic3r::CutObjectBase::operator<(), Slic3r::Model::operator=(), Slic3r::ModelObject::operator=(), Slic3r::ModelObject::operator=(), Slic3r::CutObjectBase::operator==(), Slic3r::outer_inner_brim_area(), Slic3r::GUI::GLGizmoTextureDisplacement::painted_area_mm2(), Slic3r::GUI::GLGizmoCut3D::perform_cut(), anonymous_namespace{GLGizmoEmboss.cpp}::prepare_volumes_to_slice(), Slic3r::GUI::GLGizmoTextureDisplacement::preview_part(), Slic3r::GCode::process_layer(), Slic3r::GUI::NotificationManager::push_slicing_warning_notification(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_preview_job(), Slic3r::GUI::queue_texture_displacement_debug(), Slic3r::GUI::GLGizmoEmboss::re_emboss(), Slic3r::GUI::GLGizmoTextureDisplacement::rebuild_other_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::rebuild_painted_colors(), Slic3r::GUI::GLCanvas3D::reload_scene(), Slic3r::_BBS_Backup_Manager::remove_backup(), Slic3r::Model::remove_backup_path_if_exist(), Slic3r::GUI::GLGizmoTextureDisplacement::render_image_adjust_window(), Slic3r::CLI::run(), Slic3r::GUI::GLCanvas3D::LayersEditing::select_object(), Slic3r::ModelMaterial::serialize(), Slic3r::Model::set_backup_path(), Slic3r::GUI::GLGizmoBrimEars::set_brim_data(), Slic3r::GUI::PartPlate::set_hover_id(), Slic3r::GUI::GLGizmoEmboss::set_volume_by_selection(), Slic3r::GUI::GLGizmoSVG::set_volume_by_selection(), Slic3r::sla_instances(), Slic3r::slices_to_regions(), Slic3r::ModelObject::split(), anonymous_namespace{EmbossJob.cpp}::start_create_volume_on_surface_job(), anonymous_namespace{SurfaceDrag.cpp}::start_dragging(), Slic3r::GUI::Emboss::start_update_volume(), Slic3r::UndoRedo::StackImpl::take_snapshot(), Slic3r::GUI::texture_displacement_bake_volume(), Slic3r::GUI::GLGizmoPainterBase::update_contours(), anonymous_namespace{EmbossJob.cpp}::update_name_in_list(), Slic3r::GUI::ObjectList::update_name_in_model(), Slic3r::GUI::update_object_cut_id(), Slic3r::GUI::GLGizmoTextureDisplacement::v2_recommendation(), Slic3r::verify_update_print_object_regions(), wipe_tower_instance_id, and wipe_tower_object_id.

◆ invalidate_all_steps()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::invalidate_all_steps ( )
inlineprotected
665 { return m_state.invalidate_all(PrintObjectBase::cancel_callback(m_print)); }

◆ invalidate_all_steps_without_cancel()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::invalidate_all_steps_without_cancel ( )
inlineprotected
667 { return m_state.invalidate_all([](){}); }

◆ invalidate_step()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::invalidate_step ( PrintObjectStepEnum step)
inlineprotected
658 { return m_state.invalidate(step, PrintObjectBase::cancel_callback(m_print)); }

◆ invalidate_steps() [1/2]

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::invalidate_steps ( std::initializer_list< PrintObjectStepEnum > il)
inlineprotected
663 { return m_state.invalidate_multiple(il.begin(), il.end(), PrintObjectBase::cancel_callback(m_print)); }

◆ invalidate_steps() [2/2]

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
template<typename StepTypeIterator>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::invalidate_steps ( StepTypeIterator step_begin,
StepTypeIterator step_end )
inlineprotected
661 { return m_state.invalidate_multiple(step_begin, step_end, PrintObjectBase::cancel_callback(m_print)); }

◆ is_step_done()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::is_step_done ( PrintObjectStepEnum step) const
inline

Referenced by Slic3r::GUI::GLCanvas3D::_render_sla_slices(), Slic3r::GLVolumeCollection::load_object_auxiliary(), and Slic3r::Print::process().

Here is the caller graph for this function:

◆ is_step_done_unguarded()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::is_step_done_unguarded ( PrintObjectStepEnum step) const
inlineprotected
670{ return m_state.is_done_unguarded(step); }

◆ is_step_started_unguarded()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::is_step_started_unguarded ( PrintObjectStepEnum step) const
inlineprotected
669{ return m_state.is_started_unguarded(step); }

Referenced by Slic3r::SLAPrint::set_task().

Here is the caller graph for this function:

◆ load_and_construct()

template<class Archive>
void Slic3r::ObjectBase::load_and_construct ( Archive & ar,
cereal::construct< ObjectBase > & construct )
inlinestaticprivateinherited
109{ ObjectID id; ar(id); construct(id); }
ObjectID id() const
Definition ObjectID.hpp:69

References id().

Here is the call graph for this function:

◆ model_object() [1/2]

ModelObject * Slic3r::PrintObjectBase::model_object ( )
inlineinherited
347{ return m_model_object; }
ModelObject * m_model_object
Definition PrintBase.hpp:362

References m_model_object.

◆ model_object() [2/2]

◆ print() [1/2]

◆ print() [2/2]

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
const PrintType * Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::print ( ) const
inline
638{ return m_print; }

◆ serialize()

template<class Archive>
void Slic3r::ObjectBase::serialize ( Archive & ar)
inlineprivateinherited
108{ ar(m_id); }

References m_id.

◆ set_done()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
PrintStateBase::TimeStamp Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::set_done ( PrintObjectStepEnum step)
inlineprotected
650 {
652 if (status.second)
654 return status.first;
655 }
void throw_if_canceled()
Definition PrintBase.hpp:684

Referenced by Slic3r::Print::process().

Here is the caller graph for this function:

◆ set_invalid_id()

void Slic3r::ObjectBase::set_invalid_id ( )
inlineprotectedinherited
90{ m_id = 0; }

References m_id.

Referenced by Slic3r::CutObjectBase::invalidate().

Here is the caller graph for this function:

◆ set_new_unique_id()

void Slic3r::ObjectBase::set_new_unique_id ( )
inlineprotectedinherited
89{ m_id = generate_new_id(); }
static ObjectID generate_new_id()
Definition ObjectID.hpp:100

References generate_new_id(), and m_id.

Referenced by Slic3r::ModelVolume::ModelVolume(), Slic3r::Model::assign_new_unique_ids_recursive(), Slic3r::ModelVolume::assign_new_unique_ids_recursive(), assign_new_unique_ids_recursive(), Slic3r::CutObjectBase::init(), Slic3r::ModelMaterial::set_new_unique_id(), Slic3r::ModelObject::set_new_unique_id(), and Slic3r::ModelVolume::set_new_unique_id().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_started()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
bool Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::set_started ( PrintObjectStepEnum step)
inlineprotected
649 { return m_state.set_started(step, PrintObjectBase::state_mutex(m_print), [this](){ this->throw_if_canceled(); }); }

Referenced by Slic3r::Print::process().

Here is the caller graph for this function:

◆ state_mutex()

std::mutex & Slic3r::PrintObjectBase::state_mutex ( PrintBase * print)
staticprotectedinherited

◆ status_update_warnings()

void Slic3r::PrintObjectBase::status_update_warnings ( PrintBase * print,
int step,
PrintStateBase::WarningLevel warning_level,
const std::string & message,
PrintStateBase::SlicingNotificationType message_id = PrintStateBase::SlicingDefaultNotification )
protectedinherited
167{
168 print->status_update_warnings(step, warning_level, message, this, message_id);
169}

References Slic3r::PrintBase::status_update_warnings().

Referenced by Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::active_step_add_warning(), and Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::set_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ step_state_with_timestamp()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
PrintStateBase::StateWithTimeStamp Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::step_state_with_timestamp ( PrintObjectStepEnum step) const
inline
642{ return m_state.state_with_timestamp(step, PrintObjectBase::state_mutex(m_print)); }

◆ step_state_with_warnings()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
PrintStateBase::StateWithWarnings Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::step_state_with_warnings ( PrintObjectStepEnum step) const
inline
643{ return m_state.state_with_warnings(step, PrintObjectBase::state_mutex(m_print)); }

Referenced by Slic3r::GUI::Plater::priv::on_slicing_update().

Here is the caller graph for this function:

◆ throw_if_canceled()

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
void Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::throw_if_canceled ( )
inlineprotected
684{ if (m_print->canceled()) throw CanceledException(); }

Referenced by Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::set_done(), and Slic3r::PrintObjectBaseWithState< Print, PrintObjectStep, posCount >::set_started().

Here is the caller graph for this function:

◆ timestamp()

virtual Timestamp Slic3r::ObjectBase::timestamp ( ) const
inlinevirtualinherited

Reimplemented in Slic3r::ModelConfigObject, and Slic3r::ObjectWithTimestamp.

74{ return 0; }

Member Data Documentation

◆ m_id

ObjectID Slic3r::ObjectBase::m_id
privateinherited

◆ m_model_object

ModelObject* Slic3r::PrintObjectBase::m_model_object
protectedinherited

◆ m_print

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
PrintType* Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::m_print
protected

◆ m_state

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
PrintState<PrintObjectStepEnum, COUNT> Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::m_state
private

◆ PrintType

template<typename PrintType, typename PrintObjectStepEnum, const size_t COUNT>
friend Slic3r::PrintObjectBaseWithState< PrintType, PrintObjectStepEnum, COUNT >::PrintType
protected

◆ s_last_id

size_t Slic3r::ObjectBase::s_last_id = 0
staticprivateinherited

Referenced by generate_new_id().


The documentation for this class was generated from the following file:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/PrintBase.hpp