mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-17 02:22:17 +00:00
FIX: error of the mixed material printing is lost when by-object
In print.cpp, logic was added to skip checking for mixed prints when using the byobject mode. This prevented false positives for single-filament objects, but it also failed to detect mixed prints. This detection has been restored, but separate logic for byobject mode has been added to the detection function: StringObjectException Print::check_multi_filament_valid(const Print& print). This will only prompt a warning when a single object contains high- and low-temperature filaments. jira: STUDIO-13667 Change-Id: I37622e49b76581ea4a2d78c97ebcd655bb7199e6 (cherry picked from commit 7128758056f1fe11bdd953e7f3d91284b15535a9)
This commit is contained in:
@@ -1097,6 +1097,53 @@ int Print::get_compatible_filament_type(const std::set<int>& filament_types)
|
||||
StringObjectException Print::check_multi_filament_valid(const Print& print)
|
||||
{
|
||||
auto print_config = print.config();
|
||||
if(print_config.print_sequence == PrintSequence::ByObject) {// use ByObject valid under ByObject print sequence
|
||||
std::set<FilamentCompatibilityType> Compatibility_each_obj;
|
||||
bool enable_mix_printing = !print.need_check_multi_filaments_compatibility();
|
||||
|
||||
for (const auto &objectID_t : print.print_object_ids()) {
|
||||
std::set<int> obj_used_extruder_ids;
|
||||
auto print_object = print.get_object(objectID_t);// current object
|
||||
if (print_object){
|
||||
auto object_extruders_t = print_object->object_extruders(); // object used extruder
|
||||
for (int extruder : object_extruders_t) {
|
||||
assert(extruder > 0);
|
||||
obj_used_extruder_ids.insert(extruder);
|
||||
}
|
||||
}
|
||||
|
||||
if (print_object->has_support_material()) { // extruder used by supports
|
||||
auto num_extruders = (unsigned int) print_config.filament_diameter.size();
|
||||
assert(print_object->config().support_filament >= 0);
|
||||
if (print_object->config().support_filament >= 1 && (unsigned int)print_object->config().support_filament < num_extruders + 1)
|
||||
obj_used_extruder_ids.insert((unsigned int) print_object->config().support_filament - 1);//0-based extruder id
|
||||
assert(print_object->config().support_interface_filament >= 0);
|
||||
if (print_object->config().support_interface_filament >= 1 && (unsigned int)print_object->config().support_interface_filament < num_extruders + 1)
|
||||
obj_used_extruder_ids.insert((unsigned int) print_object->config().support_interface_filament - 1);
|
||||
}
|
||||
std::vector<std::string> filament_types;
|
||||
filament_types.reserve(obj_used_extruder_ids.size());
|
||||
for (const auto &extruder_idx : obj_used_extruder_ids) filament_types.push_back(print_config.filament_type.get_at(extruder_idx));
|
||||
|
||||
auto compatibility = check_multi_filaments_compatibility(filament_types);// check for each object
|
||||
Compatibility_each_obj.insert(compatibility);
|
||||
}
|
||||
StringObjectException ret;
|
||||
std::string hypertext = "filament_mix_print";
|
||||
if (Compatibility_each_obj.count(FilamentCompatibilityType::HighLowMixed)){// at least one object has HighLowMixed
|
||||
if (enable_mix_printing) {
|
||||
ret.string = L("Printing high-temp and low-temp filaments together may cause nozzle clogging or printer damage.");
|
||||
ret.is_warning = true;
|
||||
// ret.hypetext = hypertext;
|
||||
} else
|
||||
ret.string = L("Printing high-temp and low-temp filaments together may cause nozzle clogging or printer damage. If you still want to print, you can enable the option in Preferences.");
|
||||
}else if (Compatibility_each_obj.count(FilamentCompatibilityType::LowMidMixed) || Compatibility_each_obj.count(FilamentCompatibilityType::HighMidMixed)){// at least one object has other Mixed
|
||||
ret.is_warning = true;
|
||||
// ret.hypetext = hypertext;
|
||||
ret.string = L("Printing different-temp filaments together may cause nozzle clogging or printer damage.");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
std::vector<unsigned int> extruders = print.extruders();
|
||||
std::vector<std::string> filament_types;
|
||||
filament_types.reserve(extruders.size());
|
||||
@@ -1147,7 +1194,7 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons*
|
||||
if (extruders.empty())
|
||||
return { L("No extrusions under current settings.") };
|
||||
|
||||
if (nozzles < 2 && extruders.size() > 1 && m_config.print_sequence != PrintSequence::ByObject) {
|
||||
if (nozzles < 2 && extruders.size() > 1) {
|
||||
auto ret = check_multi_filament_valid(*this);
|
||||
if (!ret.string.empty())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user