mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-14 13:45:59 +08:00
Allow any layer height and limit it to the smallest nozzle diameter. #2706
This commit is contained in:
parent
949fda3abb
commit
49a9492ad2
@ -325,7 +325,7 @@ sub validate {
|
|||||||
my $max_nozzle_diameter = max(@{ $self->nozzle_diameter });
|
my $max_nozzle_diameter = max(@{ $self->nozzle_diameter });
|
||||||
die "Invalid extrusion width (too large)\n"
|
die "Invalid extrusion width (too large)\n"
|
||||||
if defined first { $_ > 10 * $max_nozzle_diameter }
|
if defined first { $_ > 10 * $max_nozzle_diameter }
|
||||||
map $self->get_abs_value_over("${_}_extrusion_width", $self->layer_height),
|
map $self->get_abs_value_over("${_}_extrusion_width", $max_nozzle_diameter),
|
||||||
qw(perimeter infill solid_infill top_infill support_material first_layer);
|
qw(perimeter infill solid_infill top_infill support_material first_layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,13 @@ sub slice {
|
|||||||
$self->set_step_started(STEP_SLICE);
|
$self->set_step_started(STEP_SLICE);
|
||||||
$self->print->status_cb->(10, "Processing triangulated mesh");
|
$self->print->status_cb->(10, "Processing triangulated mesh");
|
||||||
|
|
||||||
|
{
|
||||||
|
my @nozzle_diameters = map $self->print->config->get_at('nozzle_diameter', $_),
|
||||||
|
@{$self->print->object_extruders};
|
||||||
|
|
||||||
|
$self->config->set('layer_height', min(@nozzle_diameters, $self->config->layer_height));
|
||||||
|
}
|
||||||
|
|
||||||
# init layers
|
# init layers
|
||||||
{
|
{
|
||||||
$self->clear_layers;
|
$self->clear_layers;
|
||||||
@ -73,8 +80,7 @@ sub slice {
|
|||||||
{
|
{
|
||||||
my @nozzle_diameters = (
|
my @nozzle_diameters = (
|
||||||
map $self->print->config->get_at('nozzle_diameter', $_),
|
map $self->print->config->get_at('nozzle_diameter', $_),
|
||||||
$self->config->support_material_extruder-1,
|
@{$self->support_material_extruders},
|
||||||
$self->config->support_material_interface_extruder-1,
|
|
||||||
);
|
);
|
||||||
$support_material_layer_height = 0.75 * min(@nozzle_diameters);
|
$support_material_layer_height = 0.75 * min(@nozzle_diameters);
|
||||||
}
|
}
|
||||||
|
@ -667,42 +667,9 @@ Print::validate() const
|
|||||||
return "The Spiral Vase option can only be used when printing single material objects.";
|
return "The Spiral Vase option can only be used when printing single material objects.";
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (this->extruders().empty())
|
||||||
// find the smallest nozzle diameter
|
return "The supplied settings will cause an empty print.";
|
||||||
std::set<size_t> extruders = this->extruders();
|
|
||||||
if (extruders.empty())
|
|
||||||
return "The supplied settings will cause an empty print.";
|
|
||||||
|
|
||||||
std::set<double> nozzle_diameters;
|
|
||||||
for (std::set<size_t>::iterator it = extruders.begin(); it != extruders.end(); ++it)
|
|
||||||
nozzle_diameters.insert(this->config.nozzle_diameter.get_at(*it));
|
|
||||||
double min_nozzle_diameter = *std::min_element(nozzle_diameters.begin(), nozzle_diameters.end());
|
|
||||||
|
|
||||||
FOREACH_OBJECT(this, i_object) {
|
|
||||||
PrintObject* object = *i_object;
|
|
||||||
|
|
||||||
// validate first_layer_height
|
|
||||||
double first_layer_height = object->config.get_abs_value("first_layer_height");
|
|
||||||
double first_layer_min_nozzle_diameter;
|
|
||||||
if (object->config.raft_layers > 0) {
|
|
||||||
// if we have raft layers, only support material extruder is used on first layer
|
|
||||||
size_t first_layer_extruder = object->config.raft_layers == 1
|
|
||||||
? object->config.support_material_interface_extruder-1
|
|
||||||
: object->config.support_material_extruder-1;
|
|
||||||
first_layer_min_nozzle_diameter = this->config.nozzle_diameter.get_at(first_layer_extruder);
|
|
||||||
} else {
|
|
||||||
// if we don't have raft layers, any nozzle diameter is potentially used in first layer
|
|
||||||
first_layer_min_nozzle_diameter = min_nozzle_diameter;
|
|
||||||
}
|
|
||||||
if (first_layer_height > first_layer_min_nozzle_diameter)
|
|
||||||
return "First layer height can't be greater than nozzle diameter";
|
|
||||||
|
|
||||||
// validate layer_height
|
|
||||||
if (object->config.layer_height.value > min_nozzle_diameter)
|
|
||||||
return "Layer height can't be greater than nozzle diameter";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -917,7 +884,7 @@ Print::_make_brim()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::auto_ptr<Fill> filler(Fill::new_from_type(ipRectilinear));
|
std::auto_ptr<Fill> filler(Fill::new_from_type(ipRectilinear));
|
||||||
filler->spacing = flow.spacing();
|
filler->min_spacing = flow.spacing();
|
||||||
filler->dont_adjust = true;
|
filler->dont_adjust = true;
|
||||||
filler->density = 1;
|
filler->density = 1;
|
||||||
|
|
||||||
|
@ -109,6 +109,8 @@ class PrintObject
|
|||||||
bool set_copies(const Points &points);
|
bool set_copies(const Points &points);
|
||||||
bool reload_model_instances();
|
bool reload_model_instances();
|
||||||
BoundingBox bounding_box() const;
|
BoundingBox bounding_box() const;
|
||||||
|
std::set<size_t> extruders() const;
|
||||||
|
std::set<size_t> support_material_extruders() const;
|
||||||
|
|
||||||
// adds region_id, too, if necessary
|
// adds region_id, too, if necessary
|
||||||
void add_region_volume(int region_id, int volume_id);
|
void add_region_volume(int region_id, int volume_id);
|
||||||
|
@ -115,6 +115,28 @@ PrintObject::bounding_box() const
|
|||||||
return BoundingBox(pp);
|
return BoundingBox(pp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns 0-based indices of used extruders
|
||||||
|
std::set<size_t>
|
||||||
|
PrintObject::extruders() const
|
||||||
|
{
|
||||||
|
std::set<size_t> extruders = this->_print->extruders();
|
||||||
|
std::set<size_t> sm_extruders = this->support_material_extruders();
|
||||||
|
extruders.insert(sm_extruders.begin(), sm_extruders.end());
|
||||||
|
return extruders;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns 0-based indices of used extruders
|
||||||
|
std::set<size_t>
|
||||||
|
PrintObject::support_material_extruders() const
|
||||||
|
{
|
||||||
|
std::set<size_t> extruders;
|
||||||
|
if (this->has_support_material()) {
|
||||||
|
extruders.insert(this->config.support_material_extruder - 1);
|
||||||
|
extruders.insert(this->config.support_material_interface_extruder - 1);
|
||||||
|
}
|
||||||
|
return extruders;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PrintObject::add_region_volume(int region_id, int volume_id)
|
PrintObject::add_region_volume(int region_id, int volume_id)
|
||||||
{
|
{
|
||||||
|
@ -63,6 +63,22 @@ _constant()
|
|||||||
Clone<BoundingBox> bounding_box();
|
Clone<BoundingBox> bounding_box();
|
||||||
Ref<Point> _copies_shift()
|
Ref<Point> _copies_shift()
|
||||||
%code%{ RETVAL = &THIS->_copies_shift; %};
|
%code%{ RETVAL = &THIS->_copies_shift; %};
|
||||||
|
std::vector<int> support_material_extruders()
|
||||||
|
%code%{
|
||||||
|
std::set<size_t> extruders = THIS->support_material_extruders();
|
||||||
|
RETVAL.reserve(extruders.size());
|
||||||
|
for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
|
||||||
|
RETVAL.push_back(*e);
|
||||||
|
}
|
||||||
|
%};
|
||||||
|
std::vector<int> extruders()
|
||||||
|
%code%{
|
||||||
|
std::set<size_t> extruders = THIS->extruders();
|
||||||
|
RETVAL.reserve(extruders.size());
|
||||||
|
for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
|
||||||
|
RETVAL.push_back(*e);
|
||||||
|
}
|
||||||
|
%};
|
||||||
|
|
||||||
bool typed_slices()
|
bool typed_slices()
|
||||||
%code%{ RETVAL = THIS->typed_slices; %};
|
%code%{ RETVAL = THIS->typed_slices; %};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user