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