mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 09:17:52 -06:00
Fix of soluble interface / non-soluble support:
The non-soluble support with "don't care" extruder will preferably be printed with a non-soluble extruder, if possible without a tool change.
This commit is contained in:
parent
abcd746774
commit
434f538919
3 changed files with 34 additions and 27 deletions
|
@ -883,28 +883,45 @@ void GCode::process_layer(
|
||||||
if (layer_to_print.support_layer != nullptr) {
|
if (layer_to_print.support_layer != nullptr) {
|
||||||
const SupportLayer &support_layer = *layer_to_print.support_layer;
|
const SupportLayer &support_layer = *layer_to_print.support_layer;
|
||||||
const PrintObject &object = *support_layer.object();
|
const PrintObject &object = *support_layer.object();
|
||||||
if (support_layer.support_fills.entities.size() > 0) {
|
if (! support_layer.support_fills.entities.empty()) {
|
||||||
|
ExtrusionRole role = support_layer.support_fills.role();
|
||||||
|
bool has_support = role == erMixed || role == erSupportMaterial;
|
||||||
|
bool has_interface = role == erMixed || role == erSupportMaterialInterface;
|
||||||
|
// Extruder ID of the support base. -1 if "don't care".
|
||||||
|
unsigned int support_extruder = object.config.support_material_extruder.value - 1;
|
||||||
|
// Shall the support be printed with the active extruder, preferably with non-soluble, to avoid tool changes?
|
||||||
|
bool support_dontcare = support_extruder == (unsigned int)-1;
|
||||||
|
// Extruder ID of the support interface. -1 if "don't care".
|
||||||
|
unsigned int interface_extruder = object.config.support_material_interface_extruder.value - 1;
|
||||||
|
// Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes?
|
||||||
|
bool interface_dontcare = interface_extruder == (unsigned int)-1;
|
||||||
|
if (support_dontcare || interface_dontcare) {
|
||||||
|
// Some support will be printed with "don't care" material, preferably non-soluble.
|
||||||
|
// Is the current extruder assigned a soluble filament?
|
||||||
|
unsigned int dontcare_extruder = first_extruder_id;
|
||||||
|
if (print.config.filament_soluble.get_at(dontcare_extruder)) {
|
||||||
|
// The last extruder printed on the previous layer extrudes soluble filament.
|
||||||
|
// Try to find a non-soluble extruder on the same layer.
|
||||||
|
for (unsigned int extruder_id : layer_tools.extruders)
|
||||||
|
if (! print.config.filament_soluble.get_at(extruder_id)) {
|
||||||
|
dontcare_extruder = extruder_id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (support_dontcare)
|
||||||
|
support_extruder = dontcare_extruder;
|
||||||
|
if (interface_dontcare)
|
||||||
|
interface_extruder = dontcare_extruder;
|
||||||
|
}
|
||||||
// Both the support and the support interface are printed with the same extruder, therefore
|
// Both the support and the support interface are printed with the same extruder, therefore
|
||||||
// the interface may be interleaved with the support base.
|
// the interface may be interleaved with the support base.
|
||||||
// Don't change extruder if the extruder is set to 0. Use the current extruder instead.
|
bool single_extruder = ! has_support || support_extruder == interface_extruder;
|
||||||
bool single_extruder =
|
|
||||||
(object.config.support_material_extruder.value == object.config.support_material_interface_extruder.value ||
|
|
||||||
(object.config.support_material_extruder.value == int(first_extruder_id) && object.config.support_material_interface_extruder.value == 0) ||
|
|
||||||
(object.config.support_material_interface_extruder.value == int(first_extruder_id) && object.config.support_material_extruder.value == 0));
|
|
||||||
// Assign an extruder to the base.
|
// Assign an extruder to the base.
|
||||||
ObjectByExtruder &obj = object_by_extruder(
|
ObjectByExtruder &obj = object_by_extruder(by_extruder, support_extruder, &layer_to_print - layers.data(), layers.size());
|
||||||
by_extruder,
|
|
||||||
(object.config.support_material_extruder == 0) ? first_extruder_id : (object.config.support_material_extruder - 1),
|
|
||||||
&layer_to_print - layers.data(),
|
|
||||||
layers.size());
|
|
||||||
obj.support = &support_layer.support_fills;
|
obj.support = &support_layer.support_fills;
|
||||||
obj.support_extrusion_role = single_extruder ? erMixed : erSupportMaterial;
|
obj.support_extrusion_role = single_extruder ? erMixed : erSupportMaterial;
|
||||||
if (! single_extruder) {
|
if (! single_extruder && has_interface) {
|
||||||
ObjectByExtruder &obj_interface = object_by_extruder(
|
ObjectByExtruder &obj_interface = object_by_extruder(by_extruder, interface_extruder, &layer_to_print - layers.data(), layers.size());
|
||||||
by_extruder,
|
|
||||||
(object.config.support_material_interface_extruder == 0) ? first_extruder_id : (object.config.support_material_interface_extruder - 1),
|
|
||||||
&layer_to_print - layers.data(),
|
|
||||||
layers.size());
|
|
||||||
obj_interface.support = &support_layer.support_fills;
|
obj_interface.support = &support_layer.support_fills;
|
||||||
obj_interface.support_extrusion_role = erSupportMaterialInterface;
|
obj_interface.support_extrusion_role = erSupportMaterialInterface;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,14 +121,6 @@ void ToolOrdering::collect_extruders(const PrintObject &object)
|
||||||
bool has_interface = role == erMixed || role == erSupportMaterialInterface;
|
bool has_interface = role == erMixed || role == erSupportMaterialInterface;
|
||||||
unsigned int extruder_support = object.config.support_material_extruder.value;
|
unsigned int extruder_support = object.config.support_material_extruder.value;
|
||||||
unsigned int extruder_interface = object.config.support_material_interface_extruder.value;
|
unsigned int extruder_interface = object.config.support_material_interface_extruder.value;
|
||||||
if (has_support && has_interface) {
|
|
||||||
// If both base and interface supports are to be extruded and one of them will be extruded with a "don't care" extruder,
|
|
||||||
// print both with the same extruder to minimize extruder switches.
|
|
||||||
if (extruder_support == 0)
|
|
||||||
extruder_support = extruder_interface;
|
|
||||||
else if (extruder_interface == 0)
|
|
||||||
extruder_interface = extruder_support;
|
|
||||||
}
|
|
||||||
if (has_support)
|
if (has_support)
|
||||||
layer_tools.extruders.push_back(extruder_support);
|
layer_tools.extruders.push_back(extruder_support);
|
||||||
if (has_interface)
|
if (has_interface)
|
||||||
|
|
|
@ -660,7 +660,6 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
|
||||||
|
|
||||||
// Build support on a build plate only? If so, then collect and union all the surfaces below the current layer.
|
// Build support on a build plate only? If so, then collect and union all the surfaces below the current layer.
|
||||||
// Unfortunately this is an inherently serial process.
|
// Unfortunately this is an inherently serial process.
|
||||||
//FIXME this may be parallelized to some extent by summing the polygons by multiples of layers, but it may be counter-productive.
|
|
||||||
const bool buildplate_only = this->build_plate_only();
|
const bool buildplate_only = this->build_plate_only();
|
||||||
std::vector<Polygons> buildplate_covered;
|
std::vector<Polygons> buildplate_covered;
|
||||||
if (buildplate_only) {
|
if (buildplate_only) {
|
||||||
|
@ -2530,7 +2529,6 @@ void PrintObjectSupportMaterial::generate_toolpaths(
|
||||||
assert(m_slicing_params.raft_layers() == 0 && raft_layers.size() == 0);
|
assert(m_slicing_params.raft_layers() == 0 && raft_layers.size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME Parallelize the support generator.
|
|
||||||
// Insert the raft base layers.
|
// Insert the raft base layers.
|
||||||
size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1));
|
size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1));
|
||||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, n_raft_layers),
|
tbb::parallel_for(tbb::blocked_range<size_t>(0, n_raft_layers),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue