75{
76
77 int idx_extruder = 0;
78 int num_extruders = (int)preset_bundle.extruders_filaments.size();
79 for (; idx_extruder < num_extruders; ++ idx_extruder)
80 if (preset_bundle.extruders_filaments[idx_extruder].get_selected_preset_name() == preset_bundle.filaments.get_selected_preset_name())
81 break;
82 if (idx_extruder == num_extruders)
83
84 idx_extruder = -1;
85
86 const DynamicPrintConfig &print_config = preset_bundle.prints .get_edited_preset().config;
87 const DynamicPrintConfig &filament_config = preset_bundle.filaments.get_edited_preset().config;
88 const DynamicPrintConfig &printer_config = preset_bundle.printers .get_edited_preset().config;
89
90
91 float nozzle_diameter = (float)printer_config.opt_float("nozzle_diameter", idx_extruder);
92
93
94 double layer_height = print_config.opt_float(
"layer_height");
95 assert(! print_config.option<ConfigOptionFloatOrPercent>("first_layer_height")->percent);
96 double first_layer_height = print_config.opt_float("first_layer_height");
97 double support_material_speed = print_config.opt_float("support_material_speed");
98 double support_material_interface_speed = print_config.get_abs_value("support_material_interface_speed", support_material_speed);
99 double bridge_speed = print_config.opt_float(
"bridge_speed");
100 double bridge_flow_ratio = print_config.opt_float("bridge_flow_ratio");
103
104 double infill_speed = print_config.opt_float("infill_speed");
106 double solid_infill_speed = print_config.get_abs_value("solid_infill_speed", infill_speed);
108
110
111 double max_volumetric_speed = print_config.opt_float("max_volumetric_speed");
112
113 const auto &extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("extrusion_width");
114 const auto &external_perimeter_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("external_perimeter_extrusion_width");
115 const auto &first_layer_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_extrusion_width");
116 const auto &
infill_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>(
"infill_extrusion_width");
117 const auto &perimeter_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("perimeter_extrusion_width");
118 const auto &solid_infill_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("solid_infill_extrusion_width");
119 const auto &support_material_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("support_material_extrusion_width");
120 const auto &top_infill_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("top_infill_extrusion_width");
121 const auto &first_layer_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_speed");
122
123
124
125 auto feature_extruder_active = [idx_extruder, num_extruders](int i) {
126 return i <= 0 || i > num_extruders || idx_extruder == -1 || idx_extruder == i - 1;
127 };
128 bool perimeter_extruder_active = feature_extruder_active(print_config.opt_int("perimeter_extruder"));
129 bool infill_extruder_active = feature_extruder_active(print_config.opt_int("infill_extruder"));
130 bool solid_infill_extruder_active = feature_extruder_active(print_config.opt_int("solid_infill_extruder"));
131 bool support_material_extruder_active = feature_extruder_active(print_config.opt_int("support_material_extruder"));
132 bool support_material_interface_extruder_active = feature_extruder_active(print_config.opt_int("support_material_interface_extruder"));
133
134
137
138
139
140
141 std::string out;
142 for (size_t idx_type = (first_layer_extrusion_width.value == 0) ? 1 : 0; idx_type < 3; ++ idx_type) {
143
144 bool first_layer = idx_type == 0;
145 bool bridging = idx_type == 2;
146 const ConfigOptionFloatOrPercent *first_layer_extrusion_width_ptr = (first_layer && first_layer_extrusion_width.value > 0) ?
147 &first_layer_extrusion_width : nullptr;
148 const float lh = float(first_layer ? first_layer_height :
layer_height);
149 double max_flow = 0.;
150 std::string max_flow_extrusion_type;
151 auto limit_by_first_layer_speed = [&first_layer_speed, first_layer](double speed_normal, double speed_max) {
152 if (first_layer && first_layer_speed.value > 0)
153
154 speed_normal = first_layer_speed.get_abs_value(speed_normal);
155 return (speed_normal > 0.) ? speed_normal : speed_max;
156 };
157 auto test_flow =
158 [first_layer_extrusion_width_ptr, extrusion_width, nozzle_diameter, lh, bridging,
bridge_speed, bridge_flow_ratio, limit_by_first_layer_speed,
max_print_speed, &max_flow, &max_flow_extrusion_type]
159 (
FlowRole flow_role,
const ConfigOptionFloatOrPercent &this_extrusion_width,
double speed,
const char *err_msg) {
160 Flow flow = bridging ?
162 Flow::bridging_flow(nozzle_diameter * bridge_flow_ratio, nozzle_diameter);
164 if (max_flow < volumetric_flow) {
165 max_flow = volumetric_flow;
167 }
168 };
169 if (perimeter_extruder_active) {
172 }
173 if (! bridging && infill_extruder_active)
175 if (solid_infill_extruder_active) {
176 test_flow(
frInfill, solid_infill_extrusion_width, solid_infill_speed,
L(
"solid infill"));
177 if (! bridging)
179 }
180 if (! bridging && support_material_extruder_active)
181 test_flow(
frSupportMaterial, support_material_extrusion_width, support_material_speed,
L(
"support"));
182 if (support_material_interface_extruder_active)
184
185 if (! out.empty())
186 out += "\n";
187 out += (first_layer ?
_u8L(
"First layer volumetric") : (bridging ?
_u8L(
"Bridging volumetric") :
_u8L(
"Volumetric")));
188 out +=
" " +
_u8L(
"flow rate is maximized") +
" ";
189 bool limited_by_max_volumetric_speed = max_volumetric_speed > 0 && max_volumetric_speed < max_flow;
190 out += (limited_by_max_volumetric_speed ?
191 _u8L(
"by the print profile maximum") :
192 (
_u8L(
"when printing")+
" " + max_flow_extrusion_type))
193 +
" " +
_u8L(
"with a volumetric rate")+
" ";
194 if (limited_by_max_volumetric_speed)
195 max_flow = max_volumetric_speed;
196
197 out +=
format(
_u8L(
"%3.2f mm³/s at filament speed %3.2f mm/s."), max_flow, (max_flow / filament_crossection));
198 }
199
200 return out;
201}
#define M_PI
Definition ExtrusionSimulator.cpp:20
static Flow new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height)
Definition Flow.cpp:115
#define _(msgid)
Definition getopt.c:87
std::string into_u8(const wxString &str)
Definition GUI.cpp:442
small_perimeter_speed((ConfigOptionFloat, solid_infill_below_area))((ConfigOptionInt
filament_diameter((ConfigOptionFloats, filament_density))((ConfigOptionStrings
max_print_speed((ConfigOptionFloat, max_volumetric_speed))((ConfigOptionFloat
infill_extrusion_width((ConfigOptionInt, infill_every_layers))((ConfigOptionFloatOrPercent
layer_height((ConfigOptionInt, faded_layers))((ConfigOptionFloat
FlowRole
Definition Flow.hpp:16
@ frSupportMaterial
Definition Flow.hpp:22
@ frExternalPerimeter
Definition Flow.hpp:17
@ frPerimeter
Definition Flow.hpp:18
@ frSupportMaterialInterface
Definition Flow.hpp:23
@ frInfill
Definition Flow.hpp:19
bridge_speed((ConfigOptionEnum< InfillPattern >, top_fill_pattern))((ConfigOptionEnum< InfillPattern >
external_perimeter_speed((ConfigOptionBool, enable_dynamic_overhang_speeds))((ConfigOptionFloatOrPercent
top_solid_infill_speed((ConfigOptionBool, wipe_into_infill))) PRINT_CONFIG_CLASS_DEFINE(MachineEnvelopeConfig
std::string format(const char *fmt, TArgs &&... args)
Definition format.hpp:44
perimeter_speed((ConfigOptionInt, perimeters))((ConfigOptionFloatOrPercent
static const ConfigOptionFloatOrPercent & first_positive(const ConfigOptionFloatOrPercent *v1, const ConfigOptionFloatOrPercent &v2, const ConfigOptionFloatOrPercent &v3)
Definition PresetHints.cpp:69
#define L(s)
Definition I18N.hpp:18