mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-29 12:58:03 +00:00
Add Flashforge Adventurer 5 series local send workflow with IFS mapping (#12991)
* Add Flashforge AD5X local send dialog, IFS mapping, and LAN discovery * Refine Flashforge AD5X IFS dialog behavior * Refine Flashforge IFS slot selection dialog * Fix Flashforge printer selection and print mapping * Use 3MF for Flashforge local uploads * Generalize Flashforge local API handling * Handle Flashforge local API IFS support more robustly * Use selected plate filament info for Flashforge IFS mapping * Fix Flashforge current-plate mapping and widget sizing * Improve Flashforge IFS contrast and color matching * Fix Flashforge legacy plate export and upload naming Resolve PLATE_CURRENT_IDX before the legacy send-to-printhost path calls send_gcode so single-plate Flashforge 3MF exports target the selected plate instead of leaking the sentinel into export_3mf. Sanitize Flashforge upload names in one shared utility reused by both the dialog and the backend client. This keeps the UI-visible filename and the actual uploaded filename consistent and replaces printer-problematic characters such as '=' without scattering Flashforge-specific logic through the generic Plater flow. * Keep Flashforge upload filename sanitization in the backend only Drop the PrintHostSendDialog API changes and keep filename sanitization inside the Flashforge backend paths that actually talk to the printer. This keeps the generic send dialog flow untouched while still normalizing problematic upload names for both serial and local API uploads. * Only use the Flashforge IFS dialog for local API uploads * Use reported Flashforge IFS support without model fallback * Remove unused Flashforge slot uniqueness tracking * Include <array> for Flashforge discovery message
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#ifndef slic3r_PrintHostSendDialog_hpp_
|
||||
#define slic3r_PrintHostSendDialog_hpp_
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include <wx/string.h>
|
||||
@@ -12,12 +12,18 @@
|
||||
#include "GUI_Utils.hpp"
|
||||
#include "MsgDialog.hpp"
|
||||
#include "../Utils/PrintHost.hpp"
|
||||
#include "../Utils/Flashforge.hpp"
|
||||
#include "libslic3r/PrintConfig.hpp"
|
||||
#include "libslic3r/ProjectTask.hpp"
|
||||
class wxButton;
|
||||
class wxTextCtrl;
|
||||
class wxChoice;
|
||||
class wxComboBox;
|
||||
class ComboBox;
|
||||
class wxDataViewListCtrl;
|
||||
class wxFlexGridSizer;
|
||||
class wxStaticText;
|
||||
class wxWrapSizer;
|
||||
class CheckBox;
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
@@ -180,6 +186,66 @@ private:
|
||||
BedType m_BedType;
|
||||
};
|
||||
|
||||
class FlashforgePrintHostSendDialog : public PrintHostSendDialog
|
||||
{
|
||||
public:
|
||||
FlashforgePrintHostSendDialog(const boost::filesystem::path& path,
|
||||
PrintHostPostUploadActions post_actions,
|
||||
const wxArrayString& groups,
|
||||
const wxArrayString& storage_paths,
|
||||
const wxArrayString& storage_names,
|
||||
bool switch_to_device_tab,
|
||||
const Slic3r::Flashforge* host,
|
||||
bool supports_material_station,
|
||||
std::vector<Slic3r::FlashforgeMaterialSlot> slots,
|
||||
const std::vector<FilamentInfo>& project_filaments);
|
||||
|
||||
virtual void init() override;
|
||||
virtual void EndModal(int ret) override;
|
||||
virtual std::map<std::string, std::string> extendedInfo() const override;
|
||||
|
||||
private:
|
||||
struct MappingRow {
|
||||
int tool_id {-1};
|
||||
wxWindow* card {nullptr};
|
||||
};
|
||||
|
||||
void load_slots();
|
||||
bool ensure_slots_loaded(bool force_reload = false);
|
||||
void rebuild_mapping_rows();
|
||||
void auto_assign_mappings();
|
||||
void refresh_mapping_card(MappingRow& row);
|
||||
void sync_mapping_section_visibility();
|
||||
const Slic3r::FlashforgeMaterialSlot* find_slot_by_id(const std::string& slot_id_text) const;
|
||||
const FilamentInfo* find_filament_by_tool_id(int tool_id) const;
|
||||
bool slot_matches_filament(const Slic3r::FlashforgeMaterialSlot& slot, const FilamentInfo& filament) const;
|
||||
bool validate_before_close();
|
||||
std::string normalize_material(const std::string& material) const;
|
||||
wxColour to_wx_colour(const std::string& color) const;
|
||||
|
||||
private:
|
||||
const Slic3r::Flashforge* m_host {nullptr};
|
||||
std::vector<FilamentInfo> m_project_filaments;
|
||||
std::vector<Slic3r::FlashforgeMaterialSlot> m_slots;
|
||||
std::vector<MappingRow> m_mapping_rows;
|
||||
wxBoxSizer* m_flashforge_options_sizer {nullptr};
|
||||
wxBoxSizer* m_mapping_section_sizer {nullptr};
|
||||
wxWrapSizer* m_mapping_wrap_sizer {nullptr};
|
||||
wxStaticText* m_status_text {nullptr};
|
||||
::CheckBox* m_checkbox_leveling {nullptr};
|
||||
::CheckBox* m_checkbox_timelapse {nullptr};
|
||||
::CheckBox* m_checkbox_ifs {nullptr};
|
||||
bool m_leveling_before_print {true};
|
||||
bool m_time_lapse_video {false};
|
||||
bool m_use_material_station {false};
|
||||
bool m_supports_material_station {false};
|
||||
bool m_slots_loaded {false};
|
||||
|
||||
const char* CONFIG_KEY_LEVELING = "flashforge_leveling_before_print";
|
||||
const char* CONFIG_KEY_TIMELAPSE = "flashforge_timelapse_video";
|
||||
const char* CONFIG_KEY_IFS = "flashforge_use_material_station";
|
||||
};
|
||||
|
||||
wxDECLARE_EVENT(EVT_PRINTHOST_PROGRESS, PrintHostQueueDialog::Event);
|
||||
wxDECLARE_EVENT(EVT_PRINTHOST_ERROR, PrintHostQueueDialog::Event);
|
||||
wxDECLARE_EVENT(EVT_PRINTHOST_CANCEL, PrintHostQueueDialog::Event);
|
||||
|
||||
Reference in New Issue
Block a user