Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEnrico Turri <enricoturri@seznam.cz>2019-06-12 11:00:51 +0300
committerEnrico Turri <enricoturri@seznam.cz>2019-06-12 11:00:51 +0300
commitd07b3fb08b5f8e81899a4772f8219fde49ef2126 (patch)
treebe66ae56b752eac2388a10eef3c8e6a163654f3f /src
parentc7ba8c4daa5163170a3425874aff43c81071483b (diff)
Bed shape dialog refactoring
Diffstat (limited to 'src')
-rw-r--r--src/slic3r/GUI/2DBed.cpp67
-rw-r--r--src/slic3r/GUI/2DBed.hpp15
-rw-r--r--src/slic3r/GUI/BedShapeDialog.cpp18
-rw-r--r--src/slic3r/GUI/BedShapeDialog.hpp7
-rw-r--r--src/slic3r/GUI/Tab.cpp32
5 files changed, 57 insertions, 82 deletions
diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp
index ce2012461..a339f3e66 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;
- 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);
+ // 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));
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 579ef4445..a61fb313d 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<void(Vec2d)> 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 d471a46c9..cec0f5067 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<Vec2d> 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 72e50a05d..6600a1c84 100644
--- a/src/slic3r/GUI/BedShapeDialog.hpp
+++ b/src/slic3r/GUI/BedShapeDialog.hpp
@@ -16,7 +16,8 @@ namespace GUI {
using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
class BedShapePanel : public wxPanel
{
- Bed_2D* m_canvas;
+ Bed_2D* m_canvas;
+ std::vector<Vec2d> 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 6cd270e5b..6cd32d397 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<ConfigOptionPoints>("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<ConfigOptionPoints>("bed_shape"));
+ if (dlg.ShowModal() == wxID_OK) {
+ std::vector<Vec2d> 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<ConfigOptionPoints>("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<ConfigOptionPoints>("bed_shape"));
+ if (dlg.ShowModal() == wxID_OK) {
+ std::vector<Vec2d> shape = dlg.GetValue();
+ if (!shape.empty())
+ {
+ load_key_value("bed_shape", shape);
+ update_changed_ui();
+ }
}
}));