diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp index ce20124612..a339f3e66a 100644 --- a/src/slic3r/GUI/2DBed.cpp +++ b/src/slic3r/GUI/2DBed.cpp @@ -19,8 +19,6 @@ wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(25 * wxGetApp().em_unit(), - m_user_drawn_background = false; #endif /*__APPLE__*/ Bind(wxEVT_PAINT, ([this](wxPaintEvent &/* e */) { repaint(); })); - Bind(wxEVT_LEFT_DOWN, ([this](wxMouseEvent &event) { mouse_event(event); })); - Bind(wxEVT_MOTION, ([this](wxMouseEvent &event) { mouse_event(event); })); Bind(wxEVT_SIZE, ([this](wxSizeEvent & /* e */) { Refresh(); })); } void Bed_2D::repaint() @@ -43,22 +41,14 @@ void Bed_2D::repaint() dc.DrawRectangle(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight()); } - // turn cw and ch from sizes to max coordinates - cw--; - ch--; + if (m_bed_shape.empty()) + return; + + // reduce size to have some space around the drawn shape + cw -= (2 * Border); + ch -= (2 * Border); auto cbb = BoundingBoxf(Vec2d(0, 0),Vec2d(cw, ch)); - // leave space for origin point - cbb.min(0) += 4; - cbb.max -= Vec2d(4., 4.); - - // leave space for origin label - cbb.max(1) -= 13; - - // read new size - cw = cbb.size()(0); - ch = cbb.size()(1); - auto ccenter = cbb.center(); // get bounding box of bed shape in G - code coordinates @@ -76,17 +66,17 @@ void Bed_2D::repaint() ccenter(0) - bcenter(0) * sfactor, ccenter(1) - bcenter(1) * sfactor ); + m_scale_factor = sfactor; - m_shift = Vec2d(shift(0) + cbb.min(0), - shift(1) - (cbb.max(1) - GetSize().GetHeight())); + m_shift = Vec2d(shift(0) + cbb.min(0), shift(1) - (cbb.max(1) - ch)); // draw bed fill dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxBRUSHSTYLE_SOLID)); wxPointList pt_list; for (auto pt: m_bed_shape) { - Point pt_pix = to_pixels(pt); - pt_list.push_back(new wxPoint(pt_pix(0), pt_pix(1))); + Point pt_pix = to_pixels(pt, ch); + pt_list.push_back(new wxPoint(pt_pix(0), pt_pix(1))); } dc.DrawPolygon(&pt_list, 0, 0); @@ -105,9 +95,9 @@ void Bed_2D::repaint() for (auto pl : polylines) { for (size_t i = 0; i < pl.points.size()-1; i++) { - Point pt1 = to_pixels(unscale(pl.points[i])); - Point pt2 = to_pixels(unscale(pl.points[i+1])); - dc.DrawLine(pt1(0), pt1(1), pt2(0), pt2(1)); + Point pt1 = to_pixels(unscale(pl.points[i]), ch); + Point pt2 = to_pixels(unscale(pl.points[i + 1]), ch); + dc.DrawLine(pt1(0), pt1(1), pt2(0), pt2(1)); } } @@ -116,7 +106,7 @@ void Bed_2D::repaint() dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); dc.DrawPolygon(&pt_list, 0, 0); - auto origin_px = to_pixels(Vec2d(0, 0)); + auto origin_px = to_pixels(Vec2d(0, 0), ch); // draw axes auto axes_len = 50; @@ -153,7 +143,7 @@ void Bed_2D::repaint() // draw current position if (m_pos!= Vec2d(0, 0)) { - auto pos_px = to_pixels(m_pos); + auto pos_px = to_pixels(m_pos, ch); dc.SetPen(wxPen(wxColour(200, 0, 0), 2, wxPENSTYLE_SOLID)); dc.SetBrush(wxBrush(wxColour(200, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); dc.DrawCircle(pos_px(0), pos_px(1), 5); @@ -161,35 +151,14 @@ void Bed_2D::repaint() dc.DrawLine(pos_px(0) - 15, pos_px(1), pos_px(0) + 15, pos_px(1)); dc.DrawLine(pos_px(0), pos_px(1) - 15, pos_px(0), pos_px(1) + 15); } - - m_painted = true; } + // convert G - code coordinates into pixels -Point Bed_2D::to_pixels(Vec2d point) +Point Bed_2D::to_pixels(Vec2d point, int height) { auto p = point * m_scale_factor + m_shift; - return Point(p(0), GetSize().GetHeight() - p(1)); -} - -void Bed_2D::mouse_event(wxMouseEvent event) -{ - if (!m_interactive) return; - if (!m_painted) return; - - auto pos = event.GetPosition(); - auto point = to_units(Point(pos.x, pos.y)); - if (event.LeftDown() || event.Dragging()) { - if (m_on_move) - m_on_move(point) ; - Refresh(); - } -} - -// convert pixels into G - code coordinates -Vec2d Bed_2D::to_units(Point point) -{ - return (Vec2d(point(0), GetSize().GetHeight() - point(1)) - m_shift) * (1. / m_scale_factor); + return Point(p(0) + Border, height - p(1) + Border); } void Bed_2D::set_pos(Vec2d pos) diff --git a/src/slic3r/GUI/2DBed.hpp b/src/slic3r/GUI/2DBed.hpp index 579ef44458..a61fb313d4 100644 --- a/src/slic3r/GUI/2DBed.hpp +++ b/src/slic3r/GUI/2DBed.hpp @@ -9,20 +9,17 @@ namespace GUI { class Bed_2D : public wxPanel { + static const int Border = 10; + bool m_user_drawn_background = true; - bool m_painted = false; - bool m_interactive = false; - double m_scale_factor; + double m_scale_factor; Vec2d m_shift = Vec2d::Zero(); Vec2d m_pos = Vec2d::Zero(); - std::function m_on_move = nullptr; - Point to_pixels(Vec2d point); - Vec2d to_units(Point point); - void repaint(); - void mouse_event(wxMouseEvent event); - void set_pos(Vec2d pos); + Point to_pixels(Vec2d point, int height); + void repaint(); + void set_pos(Vec2d pos); public: Bed_2D(wxWindow* parent); diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp index d471a46c90..cec0f50677 100644 --- a/src/slic3r/GUI/BedShapeDialog.cpp +++ b/src/slic3r/GUI/BedShapeDialog.cpp @@ -30,11 +30,9 @@ void BedShapeDialog::build_dialog(ConfigOptionPoints* default_pt) SetMinSize(GetSize()); main_sizer->SetSizeHints(this); - // needed to actually free memory - this->Bind(wxEVT_CLOSE_WINDOW, ([this](wxCloseEvent e) { - EndModal(wxID_OK); - Destroy(); - })); + this->Bind(wxEVT_CLOSE_WINDOW, ([this](wxCloseEvent& evt) { + EndModal(wxID_CANCEL); + })); } void BedShapeDialog::on_dpi_changed(const wxRect &suggested_rect) @@ -135,7 +133,7 @@ void BedShapePanel::build_panel(ConfigOptionPoints* default_pt) // Called from the constructor. // Create a panel for a rectangular / circular / custom bed shape. -ConfigOptionsGroupShp BedShapePanel::init_shape_options_page(wxString title) +ConfigOptionsGroupShp BedShapePanel::init_shape_options_page(const wxString& title) { auto panel = new wxPanel(m_shape_options_book); @@ -305,8 +303,9 @@ void BedShapePanel::update_shape() } m_canvas->m_bed_shape = points; } + else if (page_idx == SHAPE_CUSTOM) + m_canvas->m_bed_shape = m_loaded_bed_shape; -// $self->{on_change}->(); update_preview(); } @@ -351,8 +350,9 @@ void BedShapePanel::load_stl() std::vector points; for (auto pt : polygon.points) points.push_back(unscale(pt)); - m_canvas->m_bed_shape = points; - update_preview(); + + m_loaded_bed_shape = points; + update_shape(); } } // GUI diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp index 72e50a05d5..6600a1c84d 100644 --- a/src/slic3r/GUI/BedShapeDialog.hpp +++ b/src/slic3r/GUI/BedShapeDialog.hpp @@ -16,7 +16,8 @@ namespace GUI { using ConfigOptionsGroupShp = std::shared_ptr; class BedShapePanel : public wxPanel { - Bed_2D* m_canvas; + Bed_2D* m_canvas; + std::vector m_loaded_bed_shape; public: BedShapePanel(wxWindow* parent) : wxPanel(parent, wxID_ANY) {} @@ -24,8 +25,8 @@ public: void build_panel(ConfigOptionPoints* default_pt); - ConfigOptionsGroupShp init_shape_options_page(wxString title); - void set_shape(ConfigOptionPoints* points); + ConfigOptionsGroupShp init_shape_options_page(const wxString& title); + void set_shape(ConfigOptionPoints* points); void update_preview(); void update_shape(); void load_stl(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 6cd270e5b3..6cd32d3977 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1854,13 +1854,17 @@ void TabPrinter::build_fff() btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { - auto dlg = new BedShapeDialog(this); - dlg->build_dialog(m_config->option("bed_shape")); - if (dlg->ShowModal() == wxID_OK) { - load_key_value("bed_shape", dlg->GetValue()); - update_changed_ui(); - } - })); + BedShapeDialog dlg(this); + dlg.build_dialog(m_config->option("bed_shape")); + if (dlg.ShowModal() == wxID_OK) { + std::vector shape = dlg.GetValue(); + if (!shape.empty()) + { + load_key_value("bed_shape", shape); + update_changed_ui(); + } + } + })); return sizer; }; @@ -2056,11 +2060,15 @@ void TabPrinter::build_sla() btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { - auto dlg = new BedShapeDialog(this); - dlg->build_dialog(m_config->option("bed_shape")); - if (dlg->ShowModal() == wxID_OK) { - load_key_value("bed_shape", dlg->GetValue()); - update_changed_ui(); + BedShapeDialog dlg(this); + dlg.build_dialog(m_config->option("bed_shape")); + if (dlg.ShowModal() == wxID_OK) { + std::vector shape = dlg.GetValue(); + if (!shape.empty()) + { + load_key_value("bed_shape", shape); + update_changed_ui(); + } } }));