将镜像模式与型号绑定

This commit is contained in:
于肖辉 2025-05-23 11:17:38 +08:00
parent 03185729d7
commit 31761a157c
11 changed files with 110 additions and 24 deletions

View File

@ -129,7 +129,7 @@
"0" "0"
], ],
"machine_pause_gcode": "PAUSE", "machine_pause_gcode": "PAUSE",
"machine_start_gcode": "ACTIVATE_MIRROR_MODE\nSTART_PRINT EXTRUDER={nozzle_temperature_initial_layer[0]} EXTRUDER1={nozzle_temperature_initial_layer[1]} BED=[first_layer_bed_temperature]", "machine_start_gcode": "START_PRINT EXTRUDER={nozzle_temperature_initial_layer[0]} EXTRUDER1={nozzle_temperature_initial_layer[1]} BED=[first_layer_bed_temperature]",
"machine_tool_change_time": "0", "machine_tool_change_time": "0",
"machine_unload_filament_time": "0", "machine_unload_filament_time": "0",
"manual_filament_change": "0", "manual_filament_change": "0",

View File

@ -130,7 +130,7 @@
"0" "0"
], ],
"machine_pause_gcode": "PAUSE", "machine_pause_gcode": "PAUSE",
"machine_start_gcode": "ACTIVATE_MIRROR_MODE\nSTART_PRINT EXTRUDER={nozzle_temperature_initial_layer[0]} EXTRUDER1={nozzle_temperature_initial_layer[1]} BED=[first_layer_bed_temperature]", "machine_start_gcode": "START_PRINT EXTRUDER={nozzle_temperature_initial_layer[0]} EXTRUDER1={nozzle_temperature_initial_layer[1]} BED=[first_layer_bed_temperature]",
"machine_tool_change_time": "0", "machine_tool_change_time": "0",
"machine_unload_filament_time": "0", "machine_unload_filament_time": "0",
"manual_filament_change": "0", "manual_filament_change": "0",

View File

@ -2366,7 +2366,16 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
this->placeholder_parser().set("scan_first_layer", new ConfigOptionBool(false)); this->placeholder_parser().set("scan_first_layer", new ConfigOptionBool(false));
} }
} }
std::string machine_start_gcode = this->placeholder_parser_process("machine_start_gcode", print.config().machine_start_gcode.value, initial_extruder_id); std::string machine_start_gcode = "";
auto print_mode = print.config().print_mode;
if (print_mode == PrintMode::ptMirrored)
{
machine_start_gcode = "ACTIVATE_MIRROR_MODE\n";
}else if (print_mode == PrintMode::ptDuplication)
{
machine_start_gcode = "ACTIVATE_COPY_MODE\n";
}
machine_start_gcode += this->placeholder_parser_process("machine_start_gcode", print.config().machine_start_gcode.value, initial_extruder_id);
if (print.config().gcode_flavor != gcfKlipper) { if (print.config().gcode_flavor != gcfKlipper) {
// Set bed temperature if the start G-code does not contain any bed temp control G-codes. // Set bed temperature if the start G-code does not contain any bed temp control G-codes.
this->_print_first_layer_bed_temperature(file, print, machine_start_gcode, initial_extruder_id, true); this->_print_first_layer_bed_temperature(file, print, machine_start_gcode, initial_extruder_id, true);

View File

@ -880,7 +880,7 @@ static std::vector<std::string> s_Preset_machine_limits_options {
static std::vector<std::string> s_Preset_printer_options { static std::vector<std::string> s_Preset_printer_options {
"printer_technology", "printer_technology",
"printable_area", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor", "printable_area", "bed_exclude_area","bed_custom_texture", "print_mode", "bed_custom_model", "gcode_flavor",
"fan_kickstart", "fan_speedup_time", "fan_speedup_overhangs", "fan_kickstart", "fan_speedup_time", "fan_speedup_overhangs",
"single_extruder_multi_material", "manual_filament_change", "machine_start_gcode", "machine_end_gcode", "before_layer_change_gcode", "printing_by_object_gcode", "layer_change_gcode", "time_lapse_gcode", "change_filament_gcode", "change_extrusion_role_gcode", "single_extruder_multi_material", "manual_filament_change", "machine_start_gcode", "machine_end_gcode", "before_layer_change_gcode", "printing_by_object_gcode", "layer_change_gcode", "time_lapse_gcode", "change_filament_gcode", "change_extrusion_role_gcode",
"printer_model", "printer_variant", "printable_height", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", "printer_model", "printer_variant", "printable_height", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod",

View File

@ -173,6 +173,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
// BBS // BBS
"wipe_distance", "wipe_distance",
"curr_bed_type", "curr_bed_type",
"print_mode",
"nozzle_volume", "nozzle_volume",
"nozzle_hrc", "nozzle_hrc",
"required_nozzle_HRC", "required_nozzle_HRC",

View File

@ -418,6 +418,13 @@ static const t_config_enum_values s_keys_map_ZHopType = {
}; };
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ZHopType) CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ZHopType)
static const t_config_enum_values s_keys_map_PrintMode = {
{ "Normal mode", ptNorma },
{ "Duplication mode", ptDuplication },
{ "Mirrored mode", ptMirrored }
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PrintMode)
static const t_config_enum_values s_keys_map_RetractLiftEnforceType = { static const t_config_enum_values s_keys_map_RetractLiftEnforceType = {
{"All Surfaces", rletAllSurfaces}, {"All Surfaces", rletAllSurfaces},
{"Top Only", rletTopOnly}, {"Top Only", rletTopOnly},
@ -4019,6 +4026,14 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced; def->mode = comAdvanced;
def->set_default_value(new ConfigOptionEnumsGeneric{ ZHopType::zhtSlope }); def->set_default_value(new ConfigOptionEnumsGeneric{ ZHopType::zhtSlope });
def = this->add("print_mode", coEnum);
def->enum_keys_map = &ConfigOptionEnum<NozzleType>::get_enum_values();
def->enum_values.push_back("Normal mode");
def->enum_values.push_back("Duplication mode");
def->enum_values.push_back("Mirrored mode");
def->mode = comSimple;
def->set_default_value(new ConfigOptionEnum<PrintMode>(ptNorma));
def = this->add("travel_slope", coFloats); def = this->add("travel_slope", coFloats);
def->label = L("Traveling angle"); def->label = L("Traveling angle");
def->tooltip = L("Traveling angle for Slope and Spiral Z hop type. Setting it to 90° results in Normal Lift"); def->tooltip = L("Traveling angle for Slope and Spiral Z hop type. Setting it to 90° results in Normal Lift");

View File

@ -291,7 +291,11 @@ enum NozzleType {
ntBrass, ntBrass,
ntCount ntCount
}; };
enum PrintMode {
ptNorma = 0,
ptDuplication,
ptMirrored
};
static std::unordered_map<NozzleType, std::string>NozzleTypeEumnToStr = { static std::unordered_map<NozzleType, std::string>NozzleTypeEumnToStr = {
{NozzleType::ntUndefine, "undefine"}, {NozzleType::ntUndefine, "undefine"},
{NozzleType::ntHardenedSteel, "hardened_steel"}, {NozzleType::ntHardenedSteel, "hardened_steel"},
@ -1216,6 +1220,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
//BBS: add bed_exclude_area //BBS: add bed_exclude_area
((ConfigOptionPoints, bed_exclude_area)) ((ConfigOptionPoints, bed_exclude_area))
((ConfigOptionPoints, head_wrap_detect_zone)) ((ConfigOptionPoints, head_wrap_detect_zone))
((ConfigOptionEnum<PrintMode>, print_mode))
// BBS // BBS
((ConfigOptionString, bed_custom_texture)) ((ConfigOptionString, bed_custom_texture))
((ConfigOptionString, bed_custom_model)) ((ConfigOptionString, bed_custom_model))

View File

@ -789,19 +789,49 @@ Sidebar::Sidebar(Plater *parent)
// Bed type selection // Bed type selection
wxBoxSizer* bed_type_sizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* bed_type_sizer = new wxBoxSizer(wxHORIZONTAL);
wxStaticText* bed_type_title = new wxStaticText(p->m_panel_printer_content, wxID_ANY, _L("Bed type")); bed_type_title = new wxStaticText(p->m_panel_printer_content, wxID_ANY, _L("Print mode"));
//bed_type_title->SetBackgroundColour(); //bed_type_title->SetBackgroundColour();
bed_type_title->Wrap(-1); bed_type_title->Wrap(-1);
bed_type_title->SetFont(Label::Body_14); bed_type_title->SetFont(Label::Body_14);
m_bed_type_list = new ComboBox(p->m_panel_printer_content, wxID_ANY, wxString(""), wxDefaultPosition, {-1, FromDIP(30)}, 0, nullptr, wxCB_READONLY); m_bed_type_list = new ComboBox(p->m_panel_printer_content, wxID_ANY, wxString(""), wxDefaultPosition, {-1, FromDIP(30)}, 0, nullptr, wxCB_READONLY);
const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type");
if (bed_type_def && bed_type_def->enum_keys_map) { /*if (bed_type_def && bed_type_def->enum_keys_map) {
for (auto item : bed_type_def->enum_labels) { for (auto item : bed_type_def->enum_labels) {
m_bed_type_list->AppendString(_L(item)); m_bed_type_list->AppendString(_L(item));
} }
}*/
m_bed_type_list->AppendString(_L("Normal mode"));
m_bed_type_list->AppendString(_L("Duplication mode"));
m_bed_type_list->AppendString(_L("Mirrored mode"));
m_bed_type_list->Select(0);
auto printer_model = wxGetApp().preset_bundle->full_config().opt_string("printer_model");
if (printer_model != "CreatBot F430NX HS") {
m_bed_type_list->Hide();
bed_type_title->Hide();
m_bed_type_list->Select(0);
} }
bed_type_title->Bind(wxEVT_ENTER_WINDOW, [bed_type_title, this](wxMouseEvent &e) { m_bed_type_list->Bind(wxEVT_COMBOBOX, [=](wxCommandEvent& e) {
const wxString value = m_bed_type_list->GetValue();
PrintMode bed_type;
if (value == _L("Normal mode")) {
bed_type = PrintMode::ptNorma;
}
else if (value == _L("Duplication mode")) {
bed_type = PrintMode::ptDuplication;
}
else {
bed_type = PrintMode::ptMirrored;
}
auto& project_config = wxGetApp().preset_bundle->project_config;
project_config.set_key_value("print_mode", new ConfigOptionEnum<PrintMode>(bed_type));
TabPrinter* tab_printer = dynamic_cast<TabPrinter*>(wxGetApp().get_tab(Preset::TYPE_PRINTER));
tab_printer->update_dirty();
tab_printer->update_print_mode();
// e.Skip();
});
/*bed_type_title->Bind(wxEVT_ENTER_WINDOW, [bed_type_title, this](wxMouseEvent &e) {
e.Skip(); e.Skip();
auto font = bed_type_title->GetFont(); auto font = bed_type_title->GetFont();
font.SetUnderlined(true); font.SetUnderlined(true);
@ -817,7 +847,7 @@ Sidebar::Sidebar(Plater *parent)
}); });
bed_type_title->Bind(wxEVT_LEFT_UP, [bed_type_title, this](wxMouseEvent &e) { bed_type_title->Bind(wxEVT_LEFT_UP, [bed_type_title, this](wxMouseEvent &e) {
wxLaunchDefaultBrowser("https://github.com/SoftFever/OrcaSlicer/wiki/bed-types"); wxLaunchDefaultBrowser("https://github.com/SoftFever/OrcaSlicer/wiki/bed-types");
}); });*/
AppConfig *app_config = wxGetApp().app_config; AppConfig *app_config = wxGetApp().app_config;
std::string str_bed_type = app_config->get("curr_bed_type"); std::string str_bed_type = app_config->get("curr_bed_type");
@ -828,23 +858,22 @@ Sidebar::Sidebar(Plater *parent)
bed_type_value = 1; bed_type_value = 1;
} }
int bed_type_idx = bed_type_value - 1; int bed_type_idx = 1;
m_bed_type_list->Select(bed_type_idx); //;
bed_type_sizer->Add(bed_type_title, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::ContentMargin())); bed_type_sizer->Add(bed_type_title, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::ContentMargin()));
bed_type_sizer->Add(m_bed_type_list, 1, wxLEFT | wxEXPAND, FromDIP(SidebarProps::ElementSpacing())); bed_type_sizer->Add(m_bed_type_list, 1, wxLEFT | wxEXPAND, FromDIP(SidebarProps::ElementSpacing()));
bed_type_sizer->AddSpacer(FromDIP(SidebarProps::ContentMargin())); bed_type_sizer->AddSpacer(FromDIP(SidebarProps::ContentMargin()));
vsizer_printer->Add(bed_type_sizer, 0, wxEXPAND | wxTOP, FromDIP(5)); vsizer_printer->Add(bed_type_sizer, 0, wxEXPAND | wxTOP, FromDIP(5));
vsizer_printer->AddSpacer(FromDIP(16)); vsizer_printer->AddSpacer(FromDIP(16));
auto& project_config = wxGetApp().preset_bundle->project_config;
/*const t_config_enum_values* keys_map = print_config_def.get("curr_bed_type")->enum_keys_map; /*const t_config_enum_values* keys_map = print_config_def.get("curr_bed_type")->enum_keys_map;
BedType bed_type = btCount; BedType bed_type = btCount;
for (auto item : *keys_map) { for (auto item : *keys_map) {
if (item.first == str_bed_type) if (item.first == str_bed_type)
bed_type = (BedType)item.second; bed_type = (BedType)item.second;
}*/ }*/
BedType bed_type = (BedType)bed_type_value;
project_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(bed_type));
p->m_panel_printer_content->SetSizer(vsizer_printer); p->m_panel_printer_content->SetSizer(vsizer_printer);
p->m_panel_printer_content->Layout(); p->m_panel_printer_content->Layout();
@ -1299,7 +1328,7 @@ void Sidebar::update_all_preset_comboboxes()
//p->m_staticText_filament_settings->Update(); //p->m_staticText_filament_settings->Update();
if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types")) { if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types")) {
m_bed_type_list->Enable(); // m_bed_type_list->Enable();
// Orca: don't update bed type if loading project // Orca: don't update bed type if loading project
if (!p->plater->is_loading_project()) { if (!p->plater->is_loading_project()) {
auto str_bed_type = wxGetApp().app_config->get_printer_setting(wxGetApp().preset_bundle->printers.get_selected_preset_name(), auto str_bed_type = wxGetApp().app_config->get_printer_setting(wxGetApp().preset_bundle->printers.get_selected_preset_name(),
@ -1310,17 +1339,17 @@ void Sidebar::update_all_preset_comboboxes()
bed_type_value = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); bed_type_value = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
} }
m_bed_type_list->SelectAndNotify(bed_type_value - 1); //m_bed_type_list->SelectAndNotify(bed_type_value - 1);
} else { } else {
BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
m_bed_type_list->SelectAndNotify((int) bed_type - 1); // m_bed_type_list->SelectAndNotify((int) bed_type - 1);
} }
} }
} else { } else {
// m_bed_type_list->SelectAndNotify(btPEI - 1); // m_bed_type_list->SelectAndNotify(btPEI - 1);
BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); /* BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
m_bed_type_list->SelectAndNotify((int) bed_type - 1); m_bed_type_list->SelectAndNotify((int) bed_type - 1);
m_bed_type_list->Disable(); m_bed_type_list->Disable();*/
} }
// Update the print choosers to only contain the compatible presets, update the dirty flags. // Update the print choosers to only contain the compatible presets, update the dirty flags.
@ -1459,6 +1488,20 @@ void Sidebar::update_presets_from_to(Slic3r::Preset::Type preset_type, std::stri
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": exit!"); BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": exit!");
} }
void Sidebar::showModeSet(bool show)
{
if (show) {
m_bed_type_list->Show();
bed_type_title->Show();
}
else {
m_bed_type_list->Hide();
bed_type_title->Hide();
}
m_bed_type_list->Select(0);
}
void Sidebar::change_top_border_for_mode_sizer(bool increase_border) void Sidebar::change_top_border_for_mode_sizer(bool increase_border)
{ {
// BBS // BBS
@ -1704,8 +1747,8 @@ void Sidebar::on_bed_type_change(BedType bed_type)
{ {
// btDefault option is not included in global bed type setting // btDefault option is not included in global bed type setting
int sel_idx = (int)bed_type - 1; int sel_idx = (int)bed_type - 1;
if (m_bed_type_list != nullptr) //if (m_bed_type_list != nullptr)
m_bed_type_list->SetSelection(sel_idx); //m_bed_type_list->SetSelection(sel_idx);
} }
std::map<int, DynamicPrintConfig> Sidebar::build_filament_ams_list(MachineObject* obj) std::map<int, DynamicPrintConfig> Sidebar::build_filament_ams_list(MachineObject* obj)
@ -2796,7 +2839,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
, main_frame(main_frame) , main_frame(main_frame)
//BBS: add bed_exclude_area //BBS: add bed_exclude_area
, config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({
"printable_area", "bed_exclude_area", "bed_custom_texture", "bed_custom_model", "print_sequence", "printable_area", "bed_exclude_area", "bed_custom_texture", "bed_custom_model", "print_sequence","print_mode",
"extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod",
"nozzle_height", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "nozzle_height", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle",
"brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation", "brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation",
@ -13136,6 +13179,8 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
else if (opt_key == "printer_model") { else if (opt_key == "printer_model") {
p->reset_gcode_toolpaths(); p->reset_gcode_toolpaths();
// update to force bed selection(for texturing) // update to force bed selection(for texturing)
auto printer_model = wxGetApp().preset_bundle->full_config().opt_string("printer_model");
sidebar().showModeSet(printer_model == "CreatBot F430NX HS");
bed_shape_changed = true; bed_shape_changed = true;
update_scheduled = true; update_scheduled = true;
} }

View File

@ -140,7 +140,7 @@ public:
void update_presets(Slic3r::Preset::Type preset_type); void update_presets(Slic3r::Preset::Type preset_type);
//BBS //BBS
void update_presets_from_to(Slic3r::Preset::Type preset_type, std::string from, std::string to); void update_presets_from_to(Slic3r::Preset::Type preset_type, std::string from, std::string to);
void showModeSet(bool show);
void change_top_border_for_mode_sizer(bool increase_border); void change_top_border_for_mode_sizer(bool increase_border);
void msw_rescale(); void msw_rescale();
void sys_color_changed(); void sys_color_changed();
@ -205,6 +205,7 @@ private:
wxBoxSizer* m_scrolled_sizer = nullptr; wxBoxSizer* m_scrolled_sizer = nullptr;
ComboBox* m_bed_type_list = nullptr; ComboBox* m_bed_type_list = nullptr;
wxStaticText* bed_type_title = nullptr;
ScalableButton* connection_btn = nullptr; ScalableButton* connection_btn = nullptr;
ScalableButton* ams_btn = nullptr; ScalableButton* ams_btn = nullptr;
}; };

View File

@ -1121,6 +1121,15 @@ void Tab::update_dirty()
update_changed_ui(); update_changed_ui();
} }
void Tab::update_print_mode()
{
auto print_mode = m_config->option<ConfigOptionEnum<PrintMode>>("print_mode");
if (print_mode) {
const bool is_normal = print_mode->value == PrintMode::ptNorma;
on_value_change("print_mode", print_mode->value);
}
}
void Tab::update_tab_ui(bool update_plater_presets) void Tab::update_tab_ui(bool update_plater_presets)
{ {
if (m_presets_choice) { if (m_presets_choice) {

View File

@ -368,6 +368,7 @@ public:
virtual void update_custom_dirty() {} virtual void update_custom_dirty() {}
void load_initial_data(); void load_initial_data();
void update_dirty(); void update_dirty();
void update_print_mode();
//BBS update plater presets if update_plater_presets = true //BBS update plater presets if update_plater_presets = true
void update_tab_ui(bool update_plater_presets = false); void update_tab_ui(bool update_plater_presets = false);
void load_config(const DynamicPrintConfig& config); void load_config(const DynamicPrintConfig& config);