Publish 3MF: support mixed filaments and per-extruder slot selection

- Publish mixed-filament slots as whole units: serialize the filament_mixed_* definition into project_config on import, grow the receiver's parallel arrays in lockstep, and report unappliable definitions as skipped instead of dropping them silently

- Per-extruder printer selection: one inner tab per extruder, rows keyed by full "#N" ids; single-extruder receivers collapse variants onto their slot (first applied, rest skipped), multi-extruder receivers override element-wise

- New per-slot "Enable" toggle gating what gets published; enabling a mix auto-enables + Full Publishes its components

- Mixed page previews: fixed-size ratio bar, ternary triangle (3 components) and Material Ratio vs Model Height graph (gradients), always visible regardless of Enable

- Tab strip shows full swatch compositions with adjustable spacing; barycentric helpers shared via FilamentBitmapUtils
This commit is contained in:
Lam Wei Lun
2026-08-27 13:17:19 +08:00
parent ce277ebbf5
commit 76d9b8bac0
12 changed files with 1474 additions and 236 deletions
+25 -25
View File
@@ -3,33 +3,30 @@
#include "Button.hpp"
wxDECLARE_EVENT( wxEVT_TAB_SEL_CHANGING, wxCommandEvent );
wxDECLARE_EVENT( wxEVT_TAB_SEL_CHANGED, wxCommandEvent );
wxDECLARE_EVENT(wxEVT_TAB_SEL_CHANGING, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_TAB_SEL_CHANGED, wxCommandEvent);
class TabCtrl : public StaticBox
{
std::vector<Button*> btns;
wxImageList* images = nullptr;
wxBoxSizer * sizer = nullptr;
wxBoxSizer* sizer = nullptr;
int sel = -1;
wxFont bold;
int item_space = 2; // space around each button, both sides (SetItemSpace)
public:
TabCtrl(wxWindow * parent,
wxWindowID id,
const wxPoint & pos = wxDefaultPosition,
const wxSize & size = wxDefaultSize,
long style = 0);
TabCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0);
~TabCtrl();
public:
virtual bool SetFont(wxFont const & font) override;
virtual bool SetFont(wxFont const& font) override;
public:
int AppendItem(const wxString &item, int image = -1, int selImage = -1, void *clientData = nullptr);
int AppendItem(const wxString &item, const wxBitmap& bitmap, void *clientData = nullptr);
int AppendItem(const wxString& item, int image = -1, int selImage = -1, void* clientData = nullptr);
int AppendItem(const wxString& item, const wxBitmap& bitmap, void* clientData = nullptr);
bool DeleteItem(int item);
@@ -37,7 +34,7 @@ public:
unsigned int GetCount() const;
int GetSelection() const;
int GetSelection() const;
void SelectItem(int item);
@@ -46,16 +43,16 @@ public:
virtual void Rescale();
wxString GetItemText(unsigned int item) const;
void SetItemText(unsigned int item, wxString const &value);
void SetItemBitmap(unsigned int item, const wxBitmap& bitmap);
void SetItemText(unsigned int item, wxString const& value);
void SetItemBitmap(unsigned int item, const wxBitmap& bitmap);
bool GetItemBold(unsigned int item) const;
void SetItemBold(unsigned int item, bool bold);
bool GetItemBold(unsigned int item) const;
void SetItemBold(unsigned int item, bool bold);
void* GetItemData(unsigned int item) const;
void SetItemData(unsigned int item, void *clientData);
void AssignImageList(wxImageList *imageList);
void* GetItemData(unsigned int item) const;
void SetItemData(unsigned int item, void* clientData);
void AssignImageList(wxImageList* imageList);
void SetItemTextColour(unsigned int item, const StateColor& col);
@@ -64,8 +61,11 @@ public:
int GetNextVisible(int item) const;
bool IsVisible(unsigned int item) const;
// Width of the tab strip that keeps every button visible (used to size the Publish dialog).
int buttons_best_width() const;
// Extra space around each tab button (in px on both sides). Defaults to the control-wide
// standard; call before appending items so every button picks it up.
void SetItemSpace(int space);
int GetFullSize() const;
private:
virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO) override;
@@ -76,10 +76,10 @@ private:
void relayout();
void buttonClicked(wxCommandEvent & event);
void keyDown(wxKeyEvent &event);
void buttonClicked(wxCommandEvent& event);
void keyDown(wxKeyEvent& event);
void doRender(wxDC & dc) override;
void doRender(wxDC& dc) override;
// some useful events
bool sendTabCtrlEvent(bool changing = false);