mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	Bed shape dialog refactoring
This commit is contained in:
		
							parent
							
								
									c7ba8c4daa
								
							
						
					
					
						commit
						d07b3fb08b
					
				
					 5 changed files with 57 additions and 82 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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(); | ||||
|                 } | ||||
|             } | ||||
|         })); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri