* Initial port of organic tree support from PrusaSlicer * Port missing Organic support parameters from PrusaSlicer * Update parameter naming * Reorganize the `raft_first_layer_expansion` and `raft_first_layer_density` parameters as they are not only used by rafts * Reset support style only in simple mode * Sync latest update from PrusaSlicer & copyrights * Fix organic tree support crash with invalid parameters --------- Co-authored-by: Vojtech Bubnik <bubnikv@gmail.com>
101 lines
4.4 KiB
C++
101 lines
4.4 KiB
C++
///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv
|
|
///|/
|
|
///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
|
|
///|/
|
|
#ifndef slic3r_SupportParameters_hpp_
|
|
#define slic3r_SupportParameters_hpp_
|
|
|
|
#include "../libslic3r.h"
|
|
#include "../Flow.hpp"
|
|
|
|
namespace Slic3r {
|
|
|
|
class PrintObject;
|
|
enum InfillPattern : int;
|
|
|
|
namespace FFFSupport {
|
|
|
|
struct SupportParameters {
|
|
SupportParameters(const PrintObject &object);
|
|
|
|
// Both top / bottom contacts and interfaces are soluble.
|
|
bool soluble_interface;
|
|
// Support contact & interface are soluble, but support base is non-soluble.
|
|
bool soluble_interface_non_soluble_base;
|
|
|
|
// Is there at least a top contact layer extruded above support base?
|
|
bool has_top_contacts;
|
|
// Is there at least a bottom contact layer extruded below support base?
|
|
bool has_bottom_contacts;
|
|
// Number of top interface layers without counting the contact layer.
|
|
size_t num_top_interface_layers;
|
|
// Number of bottom interface layers without counting the contact layer.
|
|
size_t num_bottom_interface_layers;
|
|
// Number of top base interface layers. Zero if not soluble_interface_non_soluble_base.
|
|
size_t num_top_base_interface_layers;
|
|
// Number of bottom base interface layers. Zero if not soluble_interface_non_soluble_base.
|
|
size_t num_bottom_base_interface_layers;
|
|
|
|
bool has_contacts() const { return this->has_top_contacts || this->has_bottom_contacts; }
|
|
bool has_interfaces() const { return this->num_top_interface_layers + this->num_bottom_interface_layers > 0; }
|
|
bool has_base_interfaces() const { return this->num_top_base_interface_layers + this->num_bottom_base_interface_layers > 0; }
|
|
size_t num_top_interface_layers_only() const { return this->num_top_interface_layers - this->num_top_base_interface_layers; }
|
|
size_t num_bottom_interface_layers_only() const { return this->num_bottom_interface_layers - this->num_bottom_base_interface_layers; }
|
|
|
|
// Flow at the 1st print layer.
|
|
Flow first_layer_flow;
|
|
// Flow at the support base (neither top, nor bottom interface).
|
|
// Also flow at the raft base with the exception of raft interface and contact layers.
|
|
Flow support_material_flow;
|
|
// Flow at the top interface and contact layers.
|
|
Flow support_material_interface_flow;
|
|
// Flow at the bottom interfaces and contacts.
|
|
Flow support_material_bottom_interface_flow;
|
|
// Flow at raft inteface & contact layers.
|
|
Flow raft_interface_flow;
|
|
// Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder?
|
|
bool can_merge_support_regions;
|
|
|
|
coordf_t support_layer_height_min;
|
|
// coordf_t support_layer_height_max;
|
|
|
|
coordf_t gap_xy;
|
|
|
|
float base_angle;
|
|
float interface_angle;
|
|
|
|
// Density of the top / bottom interface and contact layers.
|
|
coordf_t interface_density;
|
|
// Density of the raft interface and contact layers.
|
|
coordf_t raft_interface_density;
|
|
// Density of the base support layers.
|
|
coordf_t support_density;
|
|
|
|
// Pattern of the sparse infill including sparse raft layers.
|
|
InfillPattern base_fill_pattern;
|
|
// Pattern of the top / bottom interface and contact layers.
|
|
InfillPattern interface_fill_pattern;
|
|
// Pattern of the raft interface and contact layers.
|
|
InfillPattern raft_interface_fill_pattern;
|
|
// Pattern of the contact layers.
|
|
InfillPattern contact_fill_pattern;
|
|
// Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness?
|
|
bool with_sheath;
|
|
// Branches of organic supports with area larger than this threshold will be extruded with double lines.
|
|
double tree_branch_diameter_double_wall_area_scaled;
|
|
|
|
float raft_angle_1st_layer;
|
|
float raft_angle_base;
|
|
float raft_angle_interface;
|
|
|
|
// Produce a raft interface angle for a given SupportLayer::interface_id()
|
|
float raft_interface_angle(size_t interface_id) const
|
|
{ return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); }
|
|
};
|
|
|
|
} // namespace FFFSupport
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif /* slic3r_SupportParameters_hpp_ */
|