1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2016 Mario Luzeiro <mrluzeiro@ua.pt>
5  * Copyright (C) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com>
6  * Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
24  */
25 
26 /**
27  * @file panel_prev_model.h
28  * @brief Defines a panel which is to be added to a wxFileDialog via
29  * SetExtraControl();
30  * The panel shows a preview of the footprint being edited and provides controls
31  * to set the offset/rotation/scale of each model 3d shape as per KiCad's
32  * current behavior. The panel may also be used in the 3D configuration dialog
33  * to tune the positioning of the models without invoking a file selector dialog.
34  */
35 
36 #ifndef PANEL_PREVIEW_3D_MODEL_H
37 #define PANEL_PREVIEW_3D_MODEL_H
38 
39 #include "panel_preview_3d_model_base.h"
40 
41 #include <vector>
42 #include <tool/tools_holder.h>
43 #include <3d_canvas/eda_3d_canvas.h>
44 #include <3d_viewer_id.h>
45 #include <3d_rendering/track_ball.h>
46 
47 // Define min and max parameter values
48 #define MAX_SCALE          10000.0
49 #define MAX_ROTATION       180.0
50 #define MAX_OFFSET         1000.0
51 
52 #define SCALE_INCREMENT_FINE       0.02
53 #define SCALE_INCREMENT            0.1
54 
55 #define ROTATION_INCREMENT 90            // in degrees, for spin button command
56 #define ROTATION_INCREMENT_WHEEL 90      // in degrees, for mouse wheel command
57 #define ROTATION_INCREMENT_WHEEL_FINE 1  // in degrees, for mouse wheel command
58 
59 #define OFFSET_INCREMENT_MM        0.5
60 #define OFFSET_INCREMENT_MM_FINE   0.1
61 
62 #define OFFSET_INCREMENT_MIL       25.0
63 #define OFFSET_INCREMENT_MIL_FINE  5.0
64 
65 
66 // Declared classes to create pointers
67 class WX_INFOBAR;
68 class S3D_CACHE;
69 class FILENAME_RESOLVER;
70 class BOARD;
71 class BOARD_ADAPTER;
72 class FOOTPRINT;
73 
74 class PANEL_PREVIEW_3D_MODEL: public EDA_3D_BOARD_HOLDER, public TOOLS_HOLDER, public PANEL_PREVIEW_3D_MODEL_BASE
75 {
76 public:
77     PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAME* aFrame, FOOTPRINT* aFootprint,
78                             std::vector<FP_3DMODEL>* aParentModelList );
79 
80     ~PANEL_PREVIEW_3D_MODEL();
81 
82     /**
83      * The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu
84      * events aren't captured by the menus themselves.
85      */
86     void OnMenuEvent( wxMenuEvent& aEvent );
87 
GetToolCanvas()88     wxWindow* GetToolCanvas() const override { return m_previewPane; }
89 
GetAdapter()90     BOARD_ADAPTER& GetAdapter() override { return m_boardAdapter; }
GetCurrentCamera()91     CAMERA& GetCurrentCamera() override { return m_currentCamera; }
92 
93     /**
94      * Set the currently selected index in the model list so that the scale/rotation/offset
95      * controls can be updated.
96      */
97     void SetSelectedModel( int idx );
98 
99     /**
100      * Copy shapes from the current shape list which are flagged for preview to the copy of
101      * footprint that is on the preview dummy board.
102      */
103     void UpdateDummyFootprint( bool aRelaodRequired = true );
104 
105 private:
106     /**
107      * Load 3D relevant settings from the user configuration
108      */
109     void loadSettings();
110 
111     /**
112      * It will receive the events from editing the fields.
113      */
114     void updateOrientation( wxCommandEvent& event ) override;
115 
116 	void onMouseWheelScale( wxMouseEvent& event ) override;
117 	void onMouseWheelRot( wxMouseEvent& event ) override;
118 	void onMouseWheelOffset( wxMouseEvent& event ) override;
119 
onIncrementRot(wxSpinEvent & event)120 	void onIncrementRot( wxSpinEvent& event ) override
121     {
122         doIncrementRotation( event, 1.0 );
123     }
onDecrementRot(wxSpinEvent & event)124 	void onDecrementRot( wxSpinEvent& event ) override
125     {
126         doIncrementRotation( event, -1.0 );
127     }
onIncrementScale(wxSpinEvent & event)128 	void onIncrementScale( wxSpinEvent& event ) override
129     {
130         doIncrementScale( event, 1.0 );
131     }
onDecrementScale(wxSpinEvent & event)132 	void onDecrementScale( wxSpinEvent& event ) override
133     {
134         doIncrementScale( event, -1.0 );
135     }
onIncrementOffset(wxSpinEvent & event)136 	void onIncrementOffset( wxSpinEvent& event ) override
137     {
138         doIncrementOffset( event, 1.0 );
139     }
onDecrementOffset(wxSpinEvent & event)140 	void onDecrementOffset( wxSpinEvent& event ) override
141     {
142         doIncrementOffset( event, -1.0 );
143     }
144 
145     void onOpacitySlider( wxCommandEvent& event ) override;
146 
147     void doIncrementScale( wxSpinEvent& aEvent, double aSign );
148     void doIncrementRotation( wxSpinEvent& aEvent, double aSign );
149     void doIncrementOffset( wxSpinEvent& aEvent, double aSign );
150 
151     wxString formatScaleValue( double aValue );
152     wxString formatRotationValue( double aValue );
153     wxString formatOffsetValue( double aValue );
154 
View3DISO(wxCommandEvent & event)155 	void View3DISO( wxCommandEvent& event ) override
156     {
157 	    m_currentCamera.ToggleProjection();
158         m_previewPane->Refresh();
159     }
160 
View3DLeft(wxCommandEvent & event)161 	void View3DLeft( wxCommandEvent& event ) override
162     {
163         m_previewPane->SetView3D( ID_VIEW3D_LEFT );
164     }
165 
View3DFront(wxCommandEvent & event)166 	void View3DFront( wxCommandEvent& event ) override
167     {
168         m_previewPane->SetView3D( ID_VIEW3D_FRONT );
169     }
170 
View3DTop(wxCommandEvent & event)171 	void View3DTop( wxCommandEvent& event ) override
172     {
173         m_previewPane->SetView3D( ID_VIEW3D_TOP );
174     }
175 
View3DUpdate(wxCommandEvent & event)176 	void View3DUpdate( wxCommandEvent& event ) override
177     {
178         m_previewPane->ReloadRequest();
179         m_previewPane->Refresh();
180     }
181 
View3DRight(wxCommandEvent & event)182 	void View3DRight( wxCommandEvent& event ) override
183     {
184         m_previewPane->SetView3D( ID_VIEW3D_RIGHT );
185     }
186 
View3DBack(wxCommandEvent & event)187 	void View3DBack( wxCommandEvent& event ) override
188     {
189         m_previewPane->SetView3D( ID_VIEW3D_BACK );
190     }
191 
View3DBottom(wxCommandEvent & event)192 	void View3DBottom( wxCommandEvent& event ) override
193     {
194         m_previewPane->SetView3D( ID_VIEW3D_BOTTOM );
195     }
196 
197 private:
198     EDA_3D_CANVAS*           m_previewPane;
199     WX_INFOBAR*              m_infobar;
200     BOARD_ADAPTER            m_boardAdapter;
201     CAMERA&                  m_currentCamera;
202     TRACK_BALL               m_trackBallCamera;
203 
204     BOARD*                   m_dummyBoard;
205     FOOTPRINT*               m_dummyFootprint;
206 
207     std::vector<FP_3DMODEL>* m_parentModelList;
208     int                      m_selected;   /// Index into m_parentInfoList
209 
210     EDA_UNITS m_userUnits;
211 };
212 
213 #endif  // PANEL_PREVIEW_3D_MODEL_H
214