mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-10 03:27:35 +00:00
feat: forward plateindex for index-coded .gcode.3mf uploads Gcode inside a .gcode.3mf is index-coded (Metadata/plate_<N>.gcode) and a bundle may carry several, so the upload must name which plate to print — even a single-plate bundle, since its entry is still indexed. A 1-based plate index is stored in PrintHostUpload::extended_info when use_3mf is set; the OctoPrint and Moonraker hosts forward it as a `plateindex` form field. Servers that don't use it ignore the unknown field, so the plain G-code path is unchanged.
163 lines
5.1 KiB
C++
163 lines
5.1 KiB
C++
#ifndef slic3r_PrintHost_hpp_
|
|
#define slic3r_PrintHost_hpp_
|
|
|
|
#include <memory>
|
|
#include <set>
|
|
#include <string>
|
|
#include <functional>
|
|
#include <boost/filesystem/path.hpp>
|
|
|
|
#include <wx/string.h>
|
|
|
|
#include <libslic3r/enum_bitmask.hpp>
|
|
#include "Http.hpp"
|
|
#include <map>
|
|
class wxArrayString;
|
|
|
|
namespace Slic3r {
|
|
|
|
class DynamicPrintConfig;
|
|
|
|
enum class PrintHostPostUploadAction {
|
|
None,
|
|
StartPrint,
|
|
StartSimulation,
|
|
QueuePrint
|
|
};
|
|
using PrintHostPostUploadActions = enum_bitmask<PrintHostPostUploadAction>;
|
|
ENABLE_ENUM_BITMASK_OPERATORS(PrintHostPostUploadAction);
|
|
|
|
struct PrintHostUpload
|
|
{
|
|
bool use_3mf { false };
|
|
boost::filesystem::path source_path;
|
|
boost::filesystem::path upload_path;
|
|
|
|
std::string group;
|
|
std::string storage;
|
|
|
|
PrintHostPostUploadAction post_action { PrintHostPostUploadAction::None };
|
|
|
|
// Some extended parameters for different upload methods.
|
|
std::map<std::string, std::string> extended_info;
|
|
|
|
// Safe accessor for an extended_info entry; returns `def` when the key is absent.
|
|
std::string extended(const std::string &key, const std::string &def = {}) const
|
|
{
|
|
auto it = extended_info.find(key);
|
|
return it != extended_info.end() ? it->second : def;
|
|
}
|
|
};
|
|
|
|
class PrintHost
|
|
{
|
|
public:
|
|
virtual ~PrintHost();
|
|
|
|
typedef Http::ProgressFn ProgressFn;
|
|
typedef std::function<void(wxString /* error */)> ErrorFn;
|
|
typedef std::function<void(wxString /* tag */, wxString /* status */)> InfoFn;
|
|
|
|
virtual const char* get_name() const = 0;
|
|
|
|
virtual bool test(wxString &curl_msg) const = 0;
|
|
virtual wxString get_test_ok_msg () const = 0;
|
|
virtual wxString get_test_failed_msg (wxString &msg) const = 0;
|
|
virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const = 0;
|
|
virtual bool has_auto_discovery() const = 0;
|
|
virtual bool can_test() const = 0;
|
|
virtual PrintHostPostUploadActions get_post_upload_actions() const = 0;
|
|
// A print host usually does not support multiple printers, with the exception of Repetier server.
|
|
virtual bool supports_multiple_printers() const { return false; }
|
|
virtual std::string get_host() const = 0;
|
|
/**
|
|
* Get the serial number for connecting to the printer.
|
|
* For Elegoo CC2, the device details connection to the printer requires the serial number.
|
|
* Other print hosts do not need to implement this interface, and it returns an empty string by default.
|
|
*/
|
|
virtual std::string get_sn() const { return ""; }
|
|
|
|
// Support for Repetier server multiple groups & printers. Not supported by other print hosts.
|
|
// Returns false if not supported. May throw HostNetworkError.
|
|
virtual bool get_groups(wxArrayString & /* groups */) const { return false; }
|
|
virtual bool get_printers(wxArrayString & /* printers */) const { return false; }
|
|
// Support for PrusaLink uploading to different storage. Not supported by other print hosts.
|
|
// Returns false if not supported or fail.
|
|
virtual bool get_storage(wxArrayString& /*storage_path*/, wxArrayString& /*storage_name*/) const { return false; }
|
|
|
|
static PrintHost* get_print_host(DynamicPrintConfig *config);
|
|
static std::string get_print_host_webui(DynamicPrintConfig *config);
|
|
|
|
//Support for cloud webui login
|
|
virtual bool is_cloud() const { return false; }
|
|
virtual bool is_logged_in() const { return false; }
|
|
virtual void log_out() const {}
|
|
virtual bool get_login_url(wxString& auth_url) const { return false; }
|
|
|
|
protected:
|
|
virtual wxString format_error(const std::string &body, const std::string &error, unsigned status) const;
|
|
};
|
|
|
|
|
|
struct PrintHostJob
|
|
{
|
|
PrintHostUpload upload_data;
|
|
std::unique_ptr<PrintHost> printhost;
|
|
bool switch_to_device_tab{false};
|
|
bool cancelled = false;
|
|
|
|
PrintHostJob() {}
|
|
PrintHostJob(const PrintHostJob&) = delete;
|
|
PrintHostJob(PrintHostJob &&other)
|
|
: upload_data(std::move(other.upload_data))
|
|
, printhost(std::move(other.printhost))
|
|
, switch_to_device_tab(other.switch_to_device_tab)
|
|
, cancelled(other.cancelled)
|
|
{}
|
|
|
|
PrintHostJob(DynamicPrintConfig *config)
|
|
: printhost(PrintHost::get_print_host(config))
|
|
{}
|
|
|
|
PrintHostJob& operator=(const PrintHostJob&) = delete;
|
|
PrintHostJob& operator=(PrintHostJob &&other)
|
|
{
|
|
upload_data = std::move(other.upload_data);
|
|
printhost = std::move(other.printhost);
|
|
switch_to_device_tab = other.switch_to_device_tab;
|
|
cancelled = other.cancelled;
|
|
return *this;
|
|
}
|
|
|
|
bool empty() const { return !printhost; }
|
|
operator bool() const { return !!printhost; }
|
|
};
|
|
|
|
|
|
namespace GUI { class PrintHostQueueDialog; }
|
|
|
|
class PrintHostJobQueue
|
|
{
|
|
public:
|
|
PrintHostJobQueue(GUI::PrintHostQueueDialog *queue_dialog);
|
|
PrintHostJobQueue(const PrintHostJobQueue &) = delete;
|
|
PrintHostJobQueue(PrintHostJobQueue &&other) = delete;
|
|
~PrintHostJobQueue();
|
|
|
|
PrintHostJobQueue& operator=(const PrintHostJobQueue &) = delete;
|
|
PrintHostJobQueue& operator=(PrintHostJobQueue &&other) = delete;
|
|
|
|
void enqueue(PrintHostJob job);
|
|
void cancel(size_t id);
|
|
|
|
private:
|
|
struct priv;
|
|
std::shared_ptr<priv> p;
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|