Fix of Enforce support for first N layers has no effect #470

This commit is contained in:
Vojtech Bubnik 2021-02-23 15:31:08 +01:00
parent 055d2321e7
commit d2c46025c7
9 changed files with 18 additions and 20 deletions

View File

@ -486,7 +486,7 @@ std::vector<GCode::LayerToPrint> GCode::collect_layers_to_print(const PrintObjec
//FIXME should we use the printing extruders instead? //FIXME should we use the printing extruders instead?
double gap_over_supports = object.config().support_material_contact_distance; double gap_over_supports = object.config().support_material_contact_distance;
// FIXME should we test object.config().support_material_synchronize_layers ? Currently the support layers are synchronized with object layers iff soluble supports. // FIXME should we test object.config().support_material_synchronize_layers ? Currently the support layers are synchronized with object layers iff soluble supports.
assert(!object.config().support_material || gap_over_supports != 0. || object.config().support_material_synchronize_layers); assert(!object.has_support() || gap_over_supports != 0. || object.config().support_material_synchronize_layers);
if (gap_over_supports != 0.) { if (gap_over_supports != 0.) {
gap_over_supports = std::max(0., gap_over_supports); gap_over_supports = std::max(0., gap_over_supports);
// Not a soluble support, // Not a soluble support,

View File

@ -277,7 +277,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
double custom_angle = Geometry::deg2rad(this->region()->config().bridge_angle.value); double custom_angle = Geometry::deg2rad(this->region()->config().bridge_angle.value);
if (bd.detect_angle(custom_angle)) { if (bd.detect_angle(custom_angle)) {
bridges[idx_last].bridge_angle = bd.angle; bridges[idx_last].bridge_angle = bd.angle;
if (this->layer()->object()->config().support_material) { if (this->layer()->object()->has_support()) {
// polygons_append(this->bridged, bd.coverage()); // polygons_append(this->bridged, bd.coverage());
append(this->unsupported_bridge_edges, bd.unsupported_edges()); append(this->unsupported_bridge_edges, bd.unsupported_edges());
} }

View File

@ -198,7 +198,8 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime
fuzzy_polygon(fuzzified, scaled<float>(perimeter_generator.config->fuzzy_skin_thickness.value), scaled<float>(perimeter_generator.config->fuzzy_skin_point_dist.value)); fuzzy_polygon(fuzzified, scaled<float>(perimeter_generator.config->fuzzy_skin_thickness.value), scaled<float>(perimeter_generator.config->fuzzy_skin_point_dist.value));
} }
if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > 0 if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > 0
&& !(perimeter_generator.object_config->support_material && perimeter_generator.object_config->support_material_contact_distance.value == 0)) { && ! ((perimeter_generator.object_config->support_material || perimeter_generator.object_config->support_material_enforce_layers > 0) &&
perimeter_generator.object_config->support_material_contact_distance.value == 0)) {
// get non-overhang paths by intersecting this loop with the grown lower slices // get non-overhang paths by intersecting this loop with the grown lower slices
extrusion_paths_append( extrusion_paths_append(
paths, paths,

View File

@ -1418,7 +1418,7 @@ std::string Print::validate() const
return true; return true;
}; };
for (PrintObject *object : m_objects) { for (PrintObject *object : m_objects) {
if (object->config().raft_layers > 0 || object->config().support_material.value) { if (object->has_support_material()) {
if ((object->config().support_material_extruder == 0 || object->config().support_material_interface_extruder == 0) && max_nozzle_diameter - min_nozzle_diameter > EPSILON) { if ((object->config().support_material_extruder == 0 || object->config().support_material_interface_extruder == 0) && max_nozzle_diameter - min_nozzle_diameter > EPSILON) {
// The object has some form of support and either support_material_extruder or support_material_interface_extruder // The object has some form of support and either support_material_extruder or support_material_interface_extruder
// will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles // will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles
@ -1444,7 +1444,7 @@ std::string Print::validate() const
// validate first_layer_height // validate first_layer_height
double first_layer_height = object->config().get_abs_value("first_layer_height"); double first_layer_height = object->config().get_abs_value("first_layer_height");
double first_layer_min_nozzle_diameter; double first_layer_min_nozzle_diameter;
if (object->config().raft_layers > 0) { if (object->has_raft()) {
// if we have raft layers, only support material extruder is used on first layer // if we have raft layers, only support material extruder is used on first layer
size_t first_layer_extruder = object->config().raft_layers == 1 size_t first_layer_extruder = object->config().raft_layers == 1
? object->config().support_material_interface_extruder-1 ? object->config().support_material_interface_extruder-1
@ -1468,7 +1468,7 @@ std::string Print::validate() const
std::string err_msg; std::string err_msg;
if (! validate_extrusion_width(object->config(), "extrusion_width", layer_height, err_msg)) if (! validate_extrusion_width(object->config(), "extrusion_width", layer_height, err_msg))
return err_msg; return err_msg;
if ((object->config().support_material || object->config().raft_layers > 0) && ! validate_extrusion_width(object->config(), "support_material_extrusion_width", layer_height, err_msg)) if ((object->has_support() || object->has_raft()) && ! validate_extrusion_width(object->config(), "support_material_extrusion_width", layer_height, err_msg))
return err_msg; return err_msg;
for (const char *opt_key : { "perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width", "top_infill_extrusion_width" }) for (const char *opt_key : { "perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width", "top_infill_extrusion_width" })
for (size_t i = 0; i < object->region_volumes.size(); ++ i) for (size_t i = 0; i < object->region_volumes.size(); ++ i)

View File

@ -222,6 +222,10 @@ public:
const SlicingParameters& slicing_parameters() const { return m_slicing_params; } const SlicingParameters& slicing_parameters() const { return m_slicing_params; }
static SlicingParameters slicing_parameters(const DynamicPrintConfig &full_config, const ModelObject &model_object, float object_max_z); static SlicingParameters slicing_parameters(const DynamicPrintConfig &full_config, const ModelObject &model_object, float object_max_z);
bool has_support() const { return m_config.support_material || m_config.support_material_enforce_layers > 0; }
bool has_raft() const { return m_config.raft_layers > 0; }
bool has_support_material() const { return this->has_support() || this->has_raft(); }
// returns 0-based indices of extruders used to print the object (without brim, support and other helper extrusions) // 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; std::vector<unsigned int> object_extruders() const;
@ -270,7 +274,7 @@ private:
void _slice(const std::vector<coordf_t> &layer_height_profile); void _slice(const std::vector<coordf_t> &layer_height_profile);
std::string _fix_slicing_errors(); std::string _fix_slicing_errors();
void simplify_slices(double distance); void simplify_slices(double distance);
bool has_support_material() const; // Has any support (not counting the raft).
void detect_surfaces_type(); void detect_surfaces_type();
void process_external_surfaces(); void process_external_surfaces();
void discover_vertical_shells(); void discover_vertical_shells();

View File

@ -418,7 +418,7 @@ void PrintObject::generate_support_material()
{ {
if (this->set_started(posSupportMaterial)) { if (this->set_started(posSupportMaterial)) {
this->clear_support_layers(); this->clear_support_layers();
if ((m_config.support_material || m_config.raft_layers > 0) && m_layers.size() > 1) { if (this->has_support_material() && m_layers.size() > 1) {
m_print->set_status(85, L("Generating support material")); m_print->set_status(85, L("Generating support material"));
this->_generate_support_material(); this->_generate_support_material();
m_print->throw_if_canceled(); m_print->throw_if_canceled();
@ -713,13 +713,6 @@ bool PrintObject::invalidate_all_steps()
return result; return result;
} }
bool PrintObject::has_support_material() const
{
return m_config.support_material
|| m_config.raft_layers > 0
|| m_config.support_material_enforce_layers > 0;
}
static const PrintRegion* first_printing_region(const PrintObject &print_object) static const PrintRegion* first_printing_region(const PrintObject &print_object)
{ {
for (size_t idx_region = 0; idx_region < print_object.region_volumes.size(); ++ idx_region) for (size_t idx_region = 0; idx_region < print_object.region_volumes.size(); ++ idx_region)
@ -773,12 +766,12 @@ void PrintObject::detect_surfaces_type()
[this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) { [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) {
// If we have raft layers, consider bottom layer as a bridge just like any other bottom surface lying on the void. // If we have raft layers, consider bottom layer as a bridge just like any other bottom surface lying on the void.
SurfaceType surface_type_bottom_1st = SurfaceType surface_type_bottom_1st =
(m_config.raft_layers.value > 0 && m_config.support_material_contact_distance.value > 0) ? (this->has_raft() && m_config.support_material_contact_distance.value > 0) ?
stBottomBridge : stBottom; stBottomBridge : stBottom;
// If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating // If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating
// the support from the print. // the support from the print.
SurfaceType surface_type_bottom_other = SurfaceType surface_type_bottom_other =
(m_config.support_material.value && m_config.support_material_contact_distance.value == 0) ? (this->has_support() && m_config.support_material_contact_distance.value == 0) ?
stBottom : stBottomBridge; stBottom : stBottomBridge;
for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) {
m_print->throw_if_canceled(); m_print->throw_if_canceled();

View File

@ -88,7 +88,7 @@ SlicingParameters SlicingParameters::create_from_config(
// Miniumum/maximum of the minimum layer height over all extruders. // Miniumum/maximum of the minimum layer height over all extruders.
params.min_layer_height = MIN_LAYER_HEIGHT; params.min_layer_height = MIN_LAYER_HEIGHT;
params.max_layer_height = std::numeric_limits<double>::max(); params.max_layer_height = std::numeric_limits<double>::max();
if (object_config.support_material.value || params.base_raft_layers > 0) { if (object_config.support_material.value || params.base_raft_layers > 0 || object_config.support_material_enforce_layers > 0) {
// Has some form of support. Add the support layers to the minimum / maximum layer height limits. // Has some form of support. Add the support layers to the minimum / maximum layer height limits.
params.min_layer_height = std::max( params.min_layer_height = std::max(
min_layer_height_from_nozzle(print_config, object_config.support_material_extruder), min_layer_height_from_nozzle(print_config, object_config.support_material_extruder),

View File

@ -1282,7 +1282,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
// Output layers, sorted by top Z. // Output layers, sorted by top Z.
MyLayersPtr contact_out; MyLayersPtr contact_out;
const bool support_auto = m_object_config->support_material_auto.value; const bool support_auto = m_object_config->support_material.value && m_object_config->support_material_auto.value;
// If user specified a custom angle threshold, convert it to radians. // If user specified a custom angle threshold, convert it to radians.
// Zero means automatic overhang detection. // Zero means automatic overhang detection.
const double threshold_rad = (m_object_config->support_material_threshold.value > 0) ? const double threshold_rad = (m_object_config->support_material_threshold.value > 0) ?

View File

@ -151,7 +151,7 @@ public:
// Is raft enabled? // Is raft enabled?
bool has_raft() const { return m_slicing_params.has_raft(); } bool has_raft() const { return m_slicing_params.has_raft(); }
// Has any support? // Has any support?
bool has_support() const { return m_object_config->support_material.value; } bool has_support() const { return m_object_config->support_material.value || m_object_config->support_material_enforce_layers; }
bool build_plate_only() const { return this->has_support() && m_object_config->support_material_buildplate_only.value; } bool build_plate_only() const { return this->has_support() && m_object_config->support_material_buildplate_only.value; }
bool synchronize_layers() const { return m_slicing_params.soluble_interface && m_object_config->support_material_synchronize_layers.value; } bool synchronize_layers() const { return m_slicing_params.soluble_interface && m_object_config->support_material_synchronize_layers.value; }