mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-30 04:11:00 +00:00
FIX: fix flow ratio calib bug for single extruder printer
2. modify the filament_flow_ratio to nullable jira:none Change-Id: I3f0569ee643cfe9473c6029ca0e04f4b80c8332e (cherry picked from commit ed61d1d31bdc79f064567deacf35e05bd123880d)
This commit is contained in:
@@ -619,8 +619,10 @@ std::string AppConfig::load()
|
|||||||
for (auto cali_it = calis_j["presets"].begin(); cali_it != calis_j["presets"].end(); cali_it++) {
|
for (auto cali_it = calis_j["presets"].begin(); cali_it != calis_j["presets"].end(); cali_it++) {
|
||||||
CaliPresetInfo preset_info;
|
CaliPresetInfo preset_info;
|
||||||
preset_info.tray_id = cali_it.value()["tray_id"].get<int>();
|
preset_info.tray_id = cali_it.value()["tray_id"].get<int>();
|
||||||
preset_info.extruder_id = cali_it.value()["extruder_id"].get<int>();
|
if (cali_it.value().contains("extruder_id"))
|
||||||
preset_info.nozzle_volume_type = NozzleVolumeType(cali_it.value()["nozzle_volume_type"].get<int>());
|
preset_info.extruder_id = cali_it.value()["extruder_id"].get<int>();
|
||||||
|
if (cali_it.value().contains("nozzle_volume_type"))
|
||||||
|
preset_info.nozzle_volume_type = NozzleVolumeType(cali_it.value()["nozzle_volume_type"].get<int>());
|
||||||
preset_info.nozzle_diameter = cali_it.value()["nozzle_diameter"].get<float>();
|
preset_info.nozzle_diameter = cali_it.value()["nozzle_diameter"].get<float>();
|
||||||
preset_info.filament_id = cali_it.value()["filament_id"].get<std::string>();
|
preset_info.filament_id = cali_it.value()["filament_id"].get<std::string>();
|
||||||
preset_info.setting_id = cali_it.value()["setting_id"].get<std::string>();
|
preset_info.setting_id = cali_it.value()["setting_id"].get<std::string>();
|
||||||
|
|||||||
@@ -1961,7 +1961,8 @@ void PrintConfigDef::init_fff_params()
|
|||||||
"You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.");
|
"You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.");
|
||||||
def->max = 2;
|
def->max = 2;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionFloats { 1. });
|
def->nullable = true;
|
||||||
|
def->set_default_value(new ConfigOptionFloatsNullable { 1. });
|
||||||
|
|
||||||
def = this->add("print_flow_ratio", coFloat);
|
def = this->add("print_flow_ratio", coFloat);
|
||||||
def->label = L("Flow ratio");
|
def->label = L("Flow ratio");
|
||||||
@@ -7214,6 +7215,7 @@ std::set<std::string> print_options_with_variant = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::set<std::string> filament_options_with_variant = {
|
std::set<std::string> filament_options_with_variant = {
|
||||||
|
"filament_flow_ratio",
|
||||||
"filament_max_volumetric_speed",
|
"filament_max_volumetric_speed",
|
||||||
//"filament_extruder_id",
|
//"filament_extruder_id",
|
||||||
"filament_extruder_variant",
|
"filament_extruder_variant",
|
||||||
|
|||||||
@@ -1184,7 +1184,7 @@ PRINT_CONFIG_CLASS_DEFINE(
|
|||||||
((ConfigOptionBool, enable_arc_fitting))
|
((ConfigOptionBool, enable_arc_fitting))
|
||||||
((ConfigOptionString, machine_end_gcode))
|
((ConfigOptionString, machine_end_gcode))
|
||||||
((ConfigOptionStrings, filament_end_gcode))
|
((ConfigOptionStrings, filament_end_gcode))
|
||||||
((ConfigOptionFloats, filament_flow_ratio))
|
((ConfigOptionFloatsNullable, filament_flow_ratio))
|
||||||
((ConfigOptionBools, enable_pressure_advance))
|
((ConfigOptionBools, enable_pressure_advance))
|
||||||
((ConfigOptionFloats, pressure_advance))
|
((ConfigOptionFloats, pressure_advance))
|
||||||
// Orca: adaptive pressure advance and calibration model
|
// Orca: adaptive pressure advance and calibration model
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ std::string CalibPressureAdvance::draw_line(
|
|||||||
const double e_per_mm = CalibPressureAdvance::e_per_mm(line_width, layer_height,
|
const double e_per_mm = CalibPressureAdvance::e_per_mm(line_width, layer_height,
|
||||||
m_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0),
|
m_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0),
|
||||||
m_config.option<ConfigOptionFloats>("filament_diameter")->get_at(0),
|
m_config.option<ConfigOptionFloats>("filament_diameter")->get_at(0),
|
||||||
m_config.option<ConfigOptionFloats>("filament_flow_ratio")->get_at(0));
|
m_config.option<ConfigOptionFloatsNullable>("filament_flow_ratio")->get_at(0));
|
||||||
|
|
||||||
const double length = get_distance(Vec2d(m_last_pos.x(), m_last_pos.y()), to_pt);
|
const double length = get_distance(Vec2d(m_last_pos.x(), m_last_pos.y()), to_pt);
|
||||||
auto dE = e_per_mm * length;
|
auto dE = e_per_mm * length;
|
||||||
|
|||||||
@@ -352,10 +352,13 @@ bool CalibrationWizard::save_preset_with_index(const std::string &old_preset_nam
|
|||||||
|
|
||||||
for (auto item : key_values) {
|
for (auto item : key_values) {
|
||||||
auto config_opt = new_preset->config.option<ConfigOptionFloatsNullable>(item.first);
|
auto config_opt = new_preset->config.option<ConfigOptionFloatsNullable>(item.first);
|
||||||
if (!config_opt) {
|
if (config_opt) {
|
||||||
auto& config_value = config_opt->values;
|
auto& config_value = config_opt->values;
|
||||||
config_value[item.second.index] = item.second.value;
|
config_value[item.second.index] = item.second.value;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
message = wxString::Format(_L("Could not find parameter: %s."), item.first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
|
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
|
||||||
@@ -415,6 +418,10 @@ void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia)
|
|||||||
result.extruder_id = preset_page->get_extruder_id(ams_id);
|
result.extruder_id = preset_page->get_extruder_id(ams_id);
|
||||||
result.nozzle_volume_type = preset_page->get_nozzle_volume_type(ams_id);
|
result.nozzle_volume_type = preset_page->get_nozzle_volume_type(ams_id);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
result.extruder_id = 0;
|
||||||
|
result.nozzle_volume_type = NozzleVolumeType::nvtNormal;
|
||||||
|
}
|
||||||
|
|
||||||
obj->selected_cali_preset.push_back(result);
|
obj->selected_cali_preset.push_back(result);
|
||||||
}
|
}
|
||||||
@@ -663,7 +670,7 @@ static bool get_preset_info(const DynamicConfig& config, const BedType plate_typ
|
|||||||
|
|
||||||
static bool get_flow_ratio(const DynamicConfig& config, float& flow_ratio)
|
static bool get_flow_ratio(const DynamicConfig& config, float& flow_ratio)
|
||||||
{
|
{
|
||||||
const ConfigOptionFloats *flow_ratio_opt = config.option<ConfigOptionFloats>("filament_flow_ratio");
|
const ConfigOptionFloatsNullable *flow_ratio_opt = config.option<ConfigOptionFloatsNullable>("filament_flow_ratio");
|
||||||
if (flow_ratio_opt) {
|
if (flow_ratio_opt) {
|
||||||
flow_ratio = flow_ratio_opt->get_at(0);
|
flow_ratio = flow_ratio_opt->get_at(0);
|
||||||
if (flow_ratio > 0)
|
if (flow_ratio > 0)
|
||||||
@@ -1209,7 +1216,13 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow
|
|||||||
}
|
}
|
||||||
else if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) {
|
else if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) {
|
||||||
cali_stage = 2;
|
cali_stage = 2;
|
||||||
temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ cali_value });
|
auto flow_ratio_values = temp_filament_preset->config.option<ConfigOptionFloatsNullable>("filament_flow_ratio")->values;
|
||||||
|
std::map<std::string, ConfigIndexValue> key_value_map = generate_index_key_value(curr_obj, "filament_flow_ratio", cali_value);
|
||||||
|
if (!key_value_map.empty()) {
|
||||||
|
flow_ratio_values[key_value_map.begin()->second.index] = key_value_map.begin()->second.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloatsNullable{flow_ratio_values});
|
||||||
if (from_page == FlowRatioCaliSource::FROM_PRESET_PAGE) {
|
if (from_page == FlowRatioCaliSource::FROM_PRESET_PAGE) {
|
||||||
calib_info.process_bar = preset_page->get_sending_progress_bar();
|
calib_info.process_bar = preset_page->get_sending_progress_bar();
|
||||||
}
|
}
|
||||||
@@ -1287,7 +1300,7 @@ void FlowRateWizard::on_cali_save()
|
|||||||
}
|
}
|
||||||
for (int i = 0; i < new_results.size(); i++) {
|
for (int i = 0; i < new_results.size(); i++) {
|
||||||
std::map<std::string, ConfigOption*> key_value_map;
|
std::map<std::string, ConfigOption*> key_value_map;
|
||||||
key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_results[i].second }));
|
key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloatsNullable{ new_results[i].second }));
|
||||||
wxString message;
|
wxString message;
|
||||||
if (!save_preset(old_preset_name, into_u8(new_results[i].first), key_value_map, message)) {
|
if (!save_preset(old_preset_name, into_u8(new_results[i].first), key_value_map, message)) {
|
||||||
MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
|
MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
|
||||||
@@ -1329,21 +1342,10 @@ void FlowRateWizard::on_cali_save()
|
|||||||
std::string old_preset_name;
|
std::string old_preset_name;
|
||||||
CalibrationPresetPage* preset_page = (static_cast<CalibrationPresetPage*>(preset_step->page));
|
CalibrationPresetPage* preset_page = (static_cast<CalibrationPresetPage*>(preset_step->page));
|
||||||
std::map<int, TrayInfo> selected_filaments = get_cached_selected_filament_for_multi_extruder(curr_obj);
|
std::map<int, TrayInfo> selected_filaments = get_cached_selected_filament_for_multi_extruder(curr_obj);
|
||||||
|
std::map<std::string, ConfigIndexValue> key_value_map = generate_index_key_value(curr_obj, "filament_flow_ratio", new_flow_ratio);
|
||||||
|
|
||||||
|
|
||||||
std::map<std::string, ConfigIndexValue> key_value_map;
|
|
||||||
int index = 0;
|
|
||||||
if (!selected_filaments.empty()) {
|
if (!selected_filaments.empty()) {
|
||||||
TrayInfo tray_info = selected_filaments.begin()->second;
|
old_preset_name = selected_filaments.begin()->second.preset->name;
|
||||||
old_preset_name = tray_info.preset->name;
|
|
||||||
|
|
||||||
// todo multi_extruder: get_extruder_type from obj
|
|
||||||
ExtruderType extruder_type = ExtruderType::etDirectDrive;
|
|
||||||
index = get_index_for_extruder_parameter(tray_info.preset->config, "filament_flow_ratio", tray_info.extruder_id, extruder_type, tray_info.nozzle_volume_type);
|
|
||||||
ConfigIndexValue config_value;
|
|
||||||
config_value.index = index;
|
|
||||||
config_value.value = new_flow_ratio;
|
|
||||||
key_value_map.insert(std::make_pair("filament_flow_ratio", config_value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString message;
|
wxString message;
|
||||||
@@ -1404,6 +1406,28 @@ void FlowRateWizard::on_device_connected(MachineObject* obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<std::string, ConfigIndexValue> FlowRateWizard::generate_index_key_value(MachineObject *obj, const std::string &key, float value)
|
||||||
|
{
|
||||||
|
std::map<std::string, ConfigIndexValue> key_value_map;
|
||||||
|
if (!obj)
|
||||||
|
return key_value_map;
|
||||||
|
|
||||||
|
std::map<int, TrayInfo> selected_filaments = get_cached_selected_filament_for_multi_extruder(obj);
|
||||||
|
int index = 0;
|
||||||
|
if (!selected_filaments.empty()) {
|
||||||
|
TrayInfo tray_info = selected_filaments.begin()->second;
|
||||||
|
// todo multi_extruder: get_extruder_type from obj
|
||||||
|
ExtruderType extruder_type = ExtruderType::etDirectDrive;
|
||||||
|
index = get_index_for_extruder_parameter(tray_info.preset->config, "filament_flow_ratio", tray_info.extruder_id, extruder_type, tray_info.nozzle_volume_type);
|
||||||
|
ConfigIndexValue config_value;
|
||||||
|
config_value.index = index;
|
||||||
|
config_value.value = value;
|
||||||
|
key_value_map.insert(std::make_pair("filament_flow_ratio", config_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
return key_value_map;
|
||||||
|
}
|
||||||
|
|
||||||
void FlowRateWizard::set_cali_method(CalibrationMethod method)
|
void FlowRateWizard::set_cali_method(CalibrationMethod method)
|
||||||
{
|
{
|
||||||
m_cali_method = method;
|
m_cali_method = method;
|
||||||
|
|||||||
@@ -157,6 +157,8 @@ protected:
|
|||||||
void update(MachineObject* obj) override;
|
void update(MachineObject* obj) override;
|
||||||
|
|
||||||
void on_device_connected(MachineObject* obj) override;
|
void on_device_connected(MachineObject* obj) override;
|
||||||
|
|
||||||
|
std::map<std::string, ConfigIndexValue> generate_index_key_value(MachineObject *obj, const std::string &key, float value);
|
||||||
};
|
};
|
||||||
|
|
||||||
class MaxVolumetricSpeedWizard : public CalibrationWizard {
|
class MaxVolumetricSpeedWizard : public CalibrationWizard {
|
||||||
|
|||||||
@@ -514,9 +514,8 @@ int CalibrationPresetPage::get_extruder_id(int ams_id)
|
|||||||
if (m_ams_id_to_extruder_id_map.find(ams_id) != m_ams_id_to_extruder_id_map.end()) {
|
if (m_ams_id_to_extruder_id_map.find(ams_id) != m_ams_id_to_extruder_id_map.end()) {
|
||||||
return m_ams_id_to_extruder_id_map[ams_id];
|
return m_ams_id_to_extruder_id_map[ams_id];
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return -1;
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CalibrationPresetPage::create_selection_panel(wxWindow* parent)
|
void CalibrationPresetPage::create_selection_panel(wxWindow* parent)
|
||||||
@@ -662,7 +661,7 @@ void CalibrationPresetPage::init_selection_values()
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||||
m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtBigTraffic));
|
m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtNormal)); // default for single extruder printer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1176,7 +1175,7 @@ void CalibrationPresetPage::on_recommend_input_value()
|
|||||||
else if (m_cali_mode == CalibMode::Calib_Flow_Rate && m_cali_stage_panel) {
|
else if (m_cali_mode == CalibMode::Calib_Flow_Rate && m_cali_stage_panel) {
|
||||||
Preset *selected_filament_preset = selected_filaments.begin()->second;
|
Preset *selected_filament_preset = selected_filaments.begin()->second;
|
||||||
if (selected_filament_preset) {
|
if (selected_filament_preset) {
|
||||||
const ConfigOptionFloats* flow_ratio_opt = selected_filament_preset->config.option<ConfigOptionFloats>("filament_flow_ratio");
|
const ConfigOptionFloatsNullable* flow_ratio_opt = selected_filament_preset->config.option<ConfigOptionFloatsNullable>("filament_flow_ratio");
|
||||||
if (flow_ratio_opt) {
|
if (flow_ratio_opt) {
|
||||||
m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0));
|
m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0));
|
||||||
}
|
}
|
||||||
@@ -2011,7 +2010,6 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
|
|||||||
info.parse_ext_info(obj, vt_tray);
|
info.parse_ext_info(obj, vt_tray);
|
||||||
info.ams_type = AMSModel::EXT_AMS;
|
info.ams_type = AMSModel::EXT_AMS;
|
||||||
|
|
||||||
assert(m_main_ams_preview_list.size() == 4);
|
|
||||||
AMSPreview *vt_item = m_main_ams_preview_list[4];
|
AMSPreview *vt_item = m_main_ams_preview_list[4];
|
||||||
vt_item->Update(info);
|
vt_item->Update(info);
|
||||||
vt_item->Open();
|
vt_item->Open();
|
||||||
@@ -2021,7 +2019,6 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
|
|||||||
info.parse_ext_info(obj, vt_tray);
|
info.parse_ext_info(obj, vt_tray);
|
||||||
info.ams_type = AMSModel::EXT_AMS;
|
info.ams_type = AMSModel::EXT_AMS;
|
||||||
|
|
||||||
assert(m_deputy_ams_preview_list.size() == 4);
|
|
||||||
AMSPreview *vt_item = m_deputy_ams_preview_list[4];
|
AMSPreview *vt_item = m_deputy_ams_preview_list[4];
|
||||||
vt_item->Update(info);
|
vt_item->Update(info);
|
||||||
vt_item->Open();
|
vt_item->Open();
|
||||||
@@ -2203,7 +2200,7 @@ void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value)
|
|||||||
if (stage != CaliPresetStage::CALI_MANUAL_STAGE_2) {
|
if (stage != CaliPresetStage::CALI_MANUAL_STAGE_2) {
|
||||||
std::map<int, Preset*> selected_filaments = get_selected_filaments();
|
std::map<int, Preset*> selected_filaments = get_selected_filaments();
|
||||||
if (!selected_filaments.empty()) {
|
if (!selected_filaments.empty()) {
|
||||||
const ConfigOptionFloats* flow_ratio_opt = selected_filaments.begin()->second->config.option<ConfigOptionFloats>("filament_flow_ratio");
|
const ConfigOptionFloatsNullable* flow_ratio_opt = selected_filaments.begin()->second->config.option<ConfigOptionFloatsNullable>("filament_flow_ratio");
|
||||||
if (flow_ratio_opt) {
|
if (flow_ratio_opt) {
|
||||||
m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0));
|
m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0));
|
||||||
value = flow_ratio_opt->get_at(0);
|
value = flow_ratio_opt->get_at(0);
|
||||||
|
|||||||
@@ -10357,13 +10357,11 @@ void Plater::calib_max_vol_speed(const Calib_Params& params)
|
|||||||
cut_horizontal(0, 0, height, ModelObjectCutAttribute::KeepLower);
|
cut_horizontal(0, 0, height, ModelObjectCutAttribute::KeepLower);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto new_params = params;
|
auto new_params = params;
|
||||||
auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() *
|
auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config->option<ConfigOptionFloatsNullable>("filament_flow_ratio")->get_at(0);
|
||||||
filament_config->option<ConfigOptionFloats>("filament_flow_ratio")->get_at(0);
|
new_params.end = params.end / mm3_per_mm;
|
||||||
new_params.end = params.end / mm3_per_mm;
|
|
||||||
new_params.start = params.start / mm3_per_mm;
|
new_params.start = params.start / mm3_per_mm;
|
||||||
new_params.step = params.step / mm3_per_mm;
|
new_params.step = params.step / mm3_per_mm;
|
||||||
|
|
||||||
|
|
||||||
p->background_process.fff_print()->set_calib_params(new_params);
|
p->background_process.fff_print()->set_calib_params(new_params);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3527,7 +3527,7 @@ void TabFilament::build()
|
|||||||
// Orca: New section to focus on flow rate and PA to declutter general section
|
// Orca: New section to focus on flow rate and PA to declutter general section
|
||||||
optgroup = page->new_optgroup(L("Flow ratio and Pressure Advance"), L"param_flow_ratio_and_pressure_advance");
|
optgroup = page->new_optgroup(L("Flow ratio and Pressure Advance"), L"param_flow_ratio_and_pressure_advance");
|
||||||
optgroup->append_single_option_line("pellet_flow_coefficient", "pellet-flow-coefficient");
|
optgroup->append_single_option_line("pellet_flow_coefficient", "pellet-flow-coefficient");
|
||||||
optgroup->append_single_option_line("filament_flow_ratio");
|
optgroup->append_single_option_line("filament_flow_ratio", "", 0);
|
||||||
|
|
||||||
optgroup->append_single_option_line("enable_pressure_advance");
|
optgroup->append_single_option_line("enable_pressure_advance");
|
||||||
optgroup->append_single_option_line("pressure_advance");
|
optgroup->append_single_option_line("pressure_advance");
|
||||||
|
|||||||
@@ -836,7 +836,7 @@ void CalibUtils::calib_max_vol_speed(const CalibInfo &calib_info, wxString &erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto new_params = params;
|
auto new_params = params;
|
||||||
auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config.option<ConfigOptionFloats>("filament_flow_ratio")->get_at(0);
|
auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config.option<ConfigOptionFloatsNullable>("filament_flow_ratio")->get_at(0);
|
||||||
new_params.end = params.end / mm3_per_mm;
|
new_params.end = params.end / mm3_per_mm;
|
||||||
new_params.start = params.start / mm3_per_mm;
|
new_params.start = params.start / mm3_per_mm;
|
||||||
new_params.step = params.step / mm3_per_mm;
|
new_params.step = params.step / mm3_per_mm;
|
||||||
|
|||||||
Reference in New Issue
Block a user