Take filament flow ratio into account when displaying flow in gcode legend

This commit is contained in:
SoftFever 2024-06-08 10:17:30 +08:00
parent 06ef58ab3e
commit ff53f401be
2 changed files with 19 additions and 2 deletions

View file

@ -45,6 +45,7 @@ static const float DEFAULT_FILAMENT_DIAMETER = 1.75f;
static const int DEFAULT_FILAMENT_HRC = 0; static const int DEFAULT_FILAMENT_HRC = 0;
static const float DEFAULT_FILAMENT_DENSITY = 1.245f; static const float DEFAULT_FILAMENT_DENSITY = 1.245f;
static const float DEFAULT_FILAMENT_COST = 29.99f; static const float DEFAULT_FILAMENT_COST = 29.99f;
static const float DEFAULT_FILAMENT_FLOW_RATIOS = 1.0f;
static const int DEFAULT_FILAMENT_VITRIFICATION_TEMPERATURE = 0; static const int DEFAULT_FILAMENT_VITRIFICATION_TEMPERATURE = 0;
static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero(); static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero();
@ -945,6 +946,7 @@ void GCodeProcessorResult::reset() {
required_nozzle_HRC = std::vector<int>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_HRC); required_nozzle_HRC = std::vector<int>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_HRC);
filament_densities = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); filament_densities = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY);
filament_costs = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST); filament_costs = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST);
filament_flow_ratios = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_FLOW_RATIOS);
custom_gcode_per_print_z = std::vector<CustomGCode::Item>(); custom_gcode_per_print_z = std::vector<CustomGCode::Item>();
spiral_vase_layers = std::vector<std::pair<float, std::pair<size_t, size_t>>>(); spiral_vase_layers = std::vector<std::pair<float, std::pair<size_t, size_t>>>();
bed_match_result = BedMatchResult(true); bed_match_result = BedMatchResult(true);
@ -1057,6 +1059,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config)
m_result.filament_densities.resize(extruders_count); m_result.filament_densities.resize(extruders_count);
m_result.filament_vitrification_temperature.resize(extruders_count); m_result.filament_vitrification_temperature.resize(extruders_count);
m_result.filament_costs.resize(extruders_count); m_result.filament_costs.resize(extruders_count);
m_result.filament_flow_ratios.resize(extruders_count);
m_extruder_temps.resize(extruders_count); m_extruder_temps.resize(extruders_count);
m_result.nozzle_hrc = static_cast<int>(config.nozzle_hrc.getInt()); m_result.nozzle_hrc = static_cast<int>(config.nozzle_hrc.getInt());
m_result.nozzle_type = config.nozzle_type; m_result.nozzle_type = config.nozzle_type;
@ -1068,6 +1071,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config)
m_result.filament_densities[i] = static_cast<float>(config.filament_density.get_at(i)); m_result.filament_densities[i] = static_cast<float>(config.filament_density.get_at(i));
m_result.filament_vitrification_temperature[i] = static_cast<float>(config.temperature_vitrification.get_at(i)); m_result.filament_vitrification_temperature[i] = static_cast<float>(config.temperature_vitrification.get_at(i));
m_result.filament_costs[i] = static_cast<float>(config.filament_cost.get_at(i)); m_result.filament_costs[i] = static_cast<float>(config.filament_cost.get_at(i));
m_result.filament_flow_ratios[i] = static_cast<float>(config.filament_flow_ratio.get_at(i));
} }
if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfKlipper || m_flavor == gcfRepRapFirmware) { if (m_flavor == gcfMarlinLegacy || m_flavor == gcfMarlinFirmware || m_flavor == gcfKlipper || m_flavor == gcfRepRapFirmware) {
@ -1245,6 +1249,15 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
m_result.filament_costs.emplace_back(DEFAULT_FILAMENT_COST); m_result.filament_costs.emplace_back(DEFAULT_FILAMENT_COST);
} }
// Orca: filament flow ratio
const ConfigOptionFloats* filament_flow_ratios = config.option<ConfigOptionFloats>("filament_flow_ratio");
if (filament_flow_ratios != nullptr) {
m_result.filament_flow_ratios.clear();
m_result.filament_flow_ratios.resize(filament_flow_ratios->values.size());
for (size_t i = 0; i < filament_flow_ratios->values.size(); ++i)
m_result.filament_flow_ratios[i]=static_cast<float>(filament_flow_ratios->values[i]);
}
//BBS //BBS
const ConfigOptionInts* filament_vitrification_temperature = config.option<ConfigOptionInts>("temperature_vitrification"); const ConfigOptionInts* filament_vitrification_temperature = config.option<ConfigOptionInts>("temperature_vitrification");
if (filament_vitrification_temperature != nullptr) { if (filament_vitrification_temperature != nullptr) {
@ -2917,6 +2930,7 @@ void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line)
void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
{ {
float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back();
float filament_flowratio = (static_cast<size_t>(m_extruder_id) < m_result.filament_flow_ratios.size()) ? m_result.filament_flow_ratios[m_extruder_id] : m_result.filament_flow_ratios.back();
float filament_radius = 0.5f * filament_diameter; float filament_radius = 0.5f * filament_diameter;
float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius); float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG1) { auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG1) {
@ -2994,7 +3008,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
m_used_filaments.increase_model_caches(volume_extruded_filament); m_used_filaments.increase_model_caches(volume_extruded_filament);
} }
// volume extruded filament / tool displacement = area toolpath cross section // volume extruded filament / tool displacement = area toolpath cross section
m_mm3_per_mm = area_toolpath_cross_section; m_mm3_per_mm = area_toolpath_cross_section * filament_flowratio;
#if ENABLE_GCODE_VIEWER_DATA_CHECKING #if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role); m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
@ -3344,6 +3358,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line)
{ {
float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back();
float filament_flowratio = (static_cast<size_t>(m_extruder_id) < m_result.filament_flow_ratios.size()) ? m_result.filament_flow_ratios[m_extruder_id] : m_result.filament_flow_ratios.back();
float filament_radius = 0.5f * filament_diameter; float filament_radius = 0.5f * filament_diameter;
float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius); float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG2_3) { auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG2_3) {
@ -3472,7 +3487,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line)
m_used_filaments.increase_model_caches(volume_extruded_filament); m_used_filaments.increase_model_caches(volume_extruded_filament);
} }
//BBS: volume extruded filament / tool displacement = area toolpath cross section //BBS: volume extruded filament / tool displacement = area toolpath cross section
m_mm3_per_mm = area_toolpath_cross_section; m_mm3_per_mm = area_toolpath_cross_section * filament_flowratio;
#if ENABLE_GCODE_VIEWER_DATA_CHECKING #if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role); m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING

View file

@ -212,6 +212,7 @@ namespace Slic3r {
std::vector<int> required_nozzle_HRC; std::vector<int> required_nozzle_HRC;
std::vector<float> filament_densities; std::vector<float> filament_densities;
std::vector<float> filament_costs; std::vector<float> filament_costs;
std::vector<float> filament_flow_ratios;
std::vector<int> filament_vitrification_temperature; std::vector<int> filament_vitrification_temperature;
PrintEstimatedStatistics print_statistics; PrintEstimatedStatistics print_statistics;
std::vector<CustomGCode::Item> custom_gcode_per_print_z; std::vector<CustomGCode::Item> custom_gcode_per_print_z;
@ -247,6 +248,7 @@ namespace Slic3r {
filament_diameters = other.filament_diameters; filament_diameters = other.filament_diameters;
filament_densities = other.filament_densities; filament_densities = other.filament_densities;
filament_costs = other.filament_costs; filament_costs = other.filament_costs;
filament_flow_ratios = other.filament_flow_ratios;
print_statistics = other.print_statistics; print_statistics = other.print_statistics;
custom_gcode_per_print_z = other.custom_gcode_per_print_z; custom_gcode_per_print_z = other.custom_gcode_per_print_z;
spiral_vase_layers = other.spiral_vase_layers; spiral_vase_layers = other.spiral_vase_layers;