ENH: check wethether filaments print on first layer

Jira: none

Signed-off-by: qing.zhang <qing.zhang@bambulab.com>
Change-Id: I1cc7cd9e9bbbcdf72112c0949196c09ef414cf91
(cherry picked from commit 67039a6f4d51482fe689a2aad0a900f3339a5c62)
This commit is contained in:
qing.zhang
2024-10-25 09:37:56 +08:00
committed by Noisyfox
parent c77be9cf3b
commit 1b70bd38f2
7 changed files with 28 additions and 28 deletions

View File

@@ -1609,23 +1609,16 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
m_processor.result().long_retraction_when_cut = activate_long_retraction_when_cut;
{ //BBS:check bed and filament compatible
const ConfigOptionDef *bed_type_def = print_config_def.get("curr_bed_type");
assert(bed_type_def != nullptr);
const t_config_enum_values *bed_type_keys_map = bed_type_def->enum_keys_map;
const ConfigOptionInts *bed_temp_opt = m_config.option<ConfigOptionInts>(get_bed_temp_key(m_config.curr_bed_type));
const ConfigOptionInts *bed_temp_opt = m_config.option<ConfigOptionInts>(get_bed_temp_1st_layer_key(m_config.curr_bed_type));
std::vector<int> conflict_filament;
for(auto extruder_id : m_initial_layer_extruders){
int cur_bed_temp = bed_temp_opt->get_at(extruder_id);
if (cur_bed_temp == 0 && bed_type_keys_map != nullptr) {
for (auto item : *bed_type_keys_map) {
if (item.second == m_config.curr_bed_type) {
m_processor.result().bed_match_result = BedMatchResult(false, item.first, extruder_id);
break;
}
}
if (cur_bed_temp == 0) {
conflict_filament.push_back(extruder_id);
}
if (m_processor.result().bed_match_result.match == false)
break;
}
m_processor.result().filament_printable_reuslt = FilamentPrintableResult(conflict_filament, bed_type_to_gcode_string(m_config.curr_bed_type));
}
// check gcode is valid in multi_extruder printabele area
int extruder_size = m_print->config().nozzle_diameter.values.size();

View File

@@ -605,7 +605,6 @@ void GCodeProcessorResult::reset() {
filament_costs = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST);
custom_gcode_per_print_z = std::vector<CustomGCode::Item>();
spiral_vase_layers = std::vector<std::pair<float, std::pair<size_t, size_t>>>();
bed_match_result = BedMatchResult(true);
warnings.clear();
//BBS: add mutex for protection of gcode result

View File

@@ -120,19 +120,19 @@ class Print;
ConflictResult() = default;
};
struct BedMatchResult
{
bool match;
std::string bed_type_name;
int extruder_id;
BedMatchResult():match(true),bed_type_name(""),extruder_id(-1) {}
BedMatchResult(bool _match,const std::string& _bed_type_name="",int _extruder_id=-1)
:match(_match),bed_type_name(_bed_type_name),extruder_id(_extruder_id)
{}
};
using ConflictResultOpt = std::optional<ConflictResult>;
struct FilamentPrintableResult
{
std::vector<int> conflict_filament;
std::string plate_name;
FilamentPrintableResult(){};
FilamentPrintableResult(std::vector<int> &conflict_filament, std::string plate_name) : conflict_filament(conflict_filament), plate_name(plate_name) {}
bool has_value(){
return !conflict_filament.empty();
};
};
struct GCodeCheckResult
{
int error_code = 0; // 0 means succeed
@@ -148,7 +148,7 @@ class Print;
{
ConflictResultOpt conflict_result;
GCodeCheckResult gcode_check_result;
BedMatchResult bed_match_result;
FilamentPrintableResult filament_printable_reuslt;
struct SettingsIds
{
@@ -273,7 +273,7 @@ class Print;
warnings = other.warnings;
bed_type = other.bed_type;
gcode_check_result = other.gcode_check_result;
bed_match_result = other.bed_match_result;
filament_printable_reuslt = other.filament_printable_reuslt;
#if ENABLE_GCODE_VIEWER_STATISTICS
time = other.time;
#endif

View File

@@ -1096,6 +1096,7 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr
m_gcode_check_result = gcode_result.gcode_check_result;
filament_printable_reuslt = gcode_result.filament_printable_reuslt;
//BBS: add mutex for protection of gcode result
gcode_result.unlock();
//BBS: add logs

View File

@@ -737,6 +737,8 @@ public:
//BBS
ConflictResultOpt m_conflict_result;
GCodeCheckResult m_gcode_check_result;
FilamentPrintableResult filament_printable_reuslt;
private:
std::vector<int> m_plater_extruder;
bool m_gl_data_initialized{ false };

View File

@@ -2917,6 +2917,7 @@ void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, co
_set_warning_notification_if_needed(EWarning::ToolpathOutside);
_set_warning_notification_if_needed(EWarning::GCodeConflict);
_set_warning_notification_if_needed(EWarning::MultiExtruderPrintableError);
_set_warning_notification_if_needed(EWarning::FilamentUnPrintableOnFirstLayer);
}
m_gcode_viewer.refresh(gcode_result, str_tool_colors);
@@ -9649,7 +9650,7 @@ void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning)
if (wxGetApp().is_editor()) {
if (current_printer_technology() != ptSLA) {
unsigned int max_z_layer = m_gcode_viewer.get_layers_z_range().back();
if (warning == EWarning::ToolHeightOutside) // check if max z_layer height exceed max print height
if (warning == EWarning::ToolHeightOutside) // check if max z_layer height exceed max print height
show = m_gcode_viewer.has_data() && (m_gcode_viewer.get_layers_zs()[max_z_layer] - m_gcode_viewer.get_max_print_height() >= 1e-6);
else if (warning == EWarning::ToolpathOutside) { // check if max x,y coords exceed bed area
show = m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed() &&
@@ -9659,6 +9660,8 @@ void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning)
show = m_gcode_viewer.has_data() && m_gcode_viewer.is_contained_in_bed() && m_gcode_viewer.m_conflict_result.has_value();
else if (warning == EWarning::MultiExtruderPrintableError)
show = m_gcode_viewer.has_data() && m_gcode_viewer.m_gcode_check_result.error_code != 0;
else if (warning == EWarning::FilamentUnPrintableOnFirstLayer)
show = m_gcode_viewer.has_data() && m_gcode_viewer.filament_printable_reuslt.has_value();
}
}
}
@@ -9744,6 +9747,7 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
error = ErrorType::SLICING_ERROR;
break;
}
}
//BBS: this may happened when exit the app, plater is null
if (!wxGetApp().plater())
return;

View File

@@ -384,6 +384,7 @@ class GLCanvas3D
GCodeConflict,
ToolHeightOutside,
MultiExtruderPrintableError, // after slice
FilamentUnPrintableOnFirstLayer
};
class RenderStats