KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eda_3d_controller.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2023 CERN
5 * Copyright (C) 2020-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <tool/actions.h>
26#include <tool/tool_manager.h>
27#include <eda_3d_canvas.h>
28#include <eda_3d_viewer_frame.h>
29#include <id.h>
30#include <kiface_base.h>
36
37
39{
40 CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
41
44
45 ctxMenu.AddSeparator();
48
49 ctxMenu.AddSeparator();
52
53 ctxMenu.AddSeparator();
56
57 ctxMenu.AddSeparator();
59
60 ctxMenu.AddSeparator();
65
66 return true;
67}
68
69
71{
73
74 wxASSERT( holder );
75
76 m_canvas = nullptr;
77 m_boardAdapter = nullptr;
78 m_camera = nullptr;
79
80 if( holder )
81 {
82 m_canvas = dynamic_cast<EDA_3D_CANVAS*>( holder->GetToolCanvas() );
83
84 EDA_3D_BOARD_HOLDER* holder3d = dynamic_cast<EDA_3D_BOARD_HOLDER*>( holder );
85
86 wxASSERT( holder3d );
87
88 if( holder3d )
89 {
90 m_boardAdapter = &holder3d->GetAdapter();
91 m_camera = &holder3d->GetCurrentCamera();
92 }
93 }
94}
95
96
98{
99 ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>();
100 CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( actionMenu );
101 SELECTION dummySel;
102
103 if( conditionalMenu )
104 conditionalMenu->Evaluate( dummySel );
105
106 if( actionMenu )
107 actionMenu->UpdateAll();
108
109 return 0;
110}
111
112
114{
115 // Main loop: keep receiving events
116 while( TOOL_EVENT* evt = Wait() )
117 {
118 if( evt->IsCancelInteractive() )
119 {
120 wxWindow* canvas = m_toolMgr->GetToolHolder()->GetToolCanvas();
121 wxWindow* topLevelParent = wxGetTopLevelParent( canvas->GetParent() );
122
123 if( topLevelParent && dynamic_cast<DIALOG_SHIM*>( topLevelParent ) )
124 {
125 DIALOG_SHIM* dialog = static_cast<DIALOG_SHIM*>( topLevelParent );
126
127 if( dialog->IsQuasiModal() )
128 dialog->EndQuasiModal( wxID_CANCEL );
129 else
130 dialog->EndModal( wxID_CANCEL );
131 }
132 else
133 {
134 evt->SetPassEvent();
135 }
136 }
137 else if( evt->IsClick( BUT_RIGHT ) )
138 {
140 }
141 else
142 {
143 evt->SetPassEvent();
144 }
145 }
146
147 return 0;
148}
149
150
152{
154
155 return 0;
156}
157
158
160{
161 switch( aEvent.Parameter<ACTIONS::CURSOR_EVENT_TYPE>() )
162 {
163 case ACTIONS::CURSOR_UP: m_canvas->SetView3D( VIEW3D_TYPE::VIEW3D_PAN_UP ); break;
164 case ACTIONS::CURSOR_DOWN: m_canvas->SetView3D( VIEW3D_TYPE::VIEW3D_PAN_DOWN ); break;
165 case ACTIONS::CURSOR_LEFT: m_canvas->SetView3D( VIEW3D_TYPE::VIEW3D_PAN_LEFT ); break;
166 case ACTIONS::CURSOR_RIGHT: m_canvas->SetView3D( VIEW3D_TYPE::VIEW3D_PAN_RIGHT ); break;
167 default: wxFAIL; break;
168 }
169
170 return 0;
171}
172
173
175{
176 double rotIncrement = glm::radians( m_rotationIncrement );
177
178 switch( aEvent.Parameter<ROTATION_DIR>() )
179 {
180 case ROTATION_DIR::X_CW: m_camera->RotateX( -rotIncrement ); break;
181 case ROTATION_DIR::X_CCW: m_camera->RotateX( rotIncrement ); break;
183 case ROTATION_DIR::Y_CW: m_camera->RotateY( rotIncrement ); break;
184 case ROTATION_DIR::Y_CCW: m_camera->RotateY( -rotIncrement ); break;
185 case ROTATION_DIR::Z_CW: m_camera->RotateZ( -rotIncrement ); break;
186 case ROTATION_DIR::Z_CCW: m_camera->RotateZ( rotIncrement ); break;
187 default: wxFAIL; break;
188 }
189
190 if( m_boardAdapter->m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
192 else
194
195 return 0;
196}
197
198
200{
202
203 if( auto* viewer = dynamic_cast<EDA_3D_VIEWER_FRAME*>( m_toolMgr->GetToolHolder() ) )
204 viewer->NewDisplay( true );
205 else
207
208 return 0;
209}
210
211
213{
215
216 if( m_boardAdapter->m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
218 else
220
221 return 0;
222}
223
225{
226 std::bitset<LAYER_3D_END> visibilityFlags = m_boardAdapter->GetVisibleLayers();
227 APPEARANCE_CONTROLS_3D* appearanceManager = nullptr;
228
229 auto flipLayer =
230 [&]( int layer )
231 {
232 appearanceManager->OnLayerVisibilityChanged( layer, !visibilityFlags.test( layer ) );
233 };
234
235 if( auto viewer = dynamic_cast<EDA_3D_VIEWER_FRAME*>( m_toolMgr->GetToolHolder() ) )
236 appearanceManager = viewer->GetAppearanceManager();
237
238 if( appearanceManager )
239 {
240 if( aEvent.IsAction( &EDA_3D_ACTIONS::showTHT ) )
241 flipLayer( LAYER_3D_TH_MODELS );
242 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showSMD ) )
243 flipLayer( LAYER_3D_SMD_MODELS );
244 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showVirtual ) )
245 flipLayer( LAYER_3D_VIRTUAL_MODELS );
246 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showNotInPosFile ) )
247 flipLayer( LAYER_3D_MODELS_NOT_IN_POS );
248 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showDNP ) )
249 flipLayer( LAYER_3D_MODELS_MARKED_DNP );
250 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showAxis ) )
251 flipLayer( LAYER_3D_AXES );
252 else if( aEvent.IsAction( &EDA_3D_ACTIONS::showBBoxes ) )
253 flipLayer( LAYER_3D_BOUNDING_BOXES );
254 }
255
256 return 0;
257}
258
259
261{
262 if( auto* viewer = dynamic_cast<EDA_3D_VIEWER_FRAME*>( m_toolMgr->GetToolHolder() ) )
263 viewer->ToggleAppearanceManager();
264
265 return 0;
266}
267
268
270{
272
273 if( m_canvas )
275
276 return 0;
277}
278
279
281{
283 return 0;
284}
285
286
288{
289 bool direction = aEvent.IsAction( &ACTIONS::zoomIn );
290 return doZoomInOut( direction, true );
291}
292
293
295{
296 bool direction = aEvent.IsAction( &ACTIONS::zoomInCenter );
297 return doZoomInOut( direction, false );
298}
299
300
301int EDA_3D_CONTROLLER::doZoomInOut( bool aDirection, bool aCenterOnCursor )
302{
303 if( m_canvas )
304 {
305 m_canvas->SetView3D( aDirection ? VIEW3D_TYPE::VIEW3D_ZOOM_IN : VIEW3D_TYPE::VIEW3D_ZOOM_OUT );
307 }
308
309 return 0;
310}
311
312
314{
315 if( m_canvas )
316 {
317 m_canvas->SetView3D( VIEW3D_TYPE::VIEW3D_FIT_SCREEN );
319 }
320
321 return 0;
322}
323
324
326{
329
330 // Pan control
339
340 // View rotation
356
357 // Zoom control
362 // zoom in/out at cursor does not exist in 3D viewer but because F1 and F2 keys generate
363 // a zoomIn/zoomOut event, these events must be captured to use these hot keys. The actual
364 // zoom is the same as ZoomInOutCenter
367
368 // Grid
374
375 // Material
379
380 // Visibility
388}
389
390
ROTATION_DIR
Rotation direction for the 3d canvas.
Definition: 3d_enums.h:35
GRID3D_TYPE
Grid types.
Definition: 3d_enums.h:54
MATERIAL_MODE
Render 3d model shape materials mode.
Definition: 3d_enums.h:71
VIEW3D_TYPE
Definition: 3d_enums.h:78
static TOOL_ACTION zoomRedraw
Definition: actions.h:114
static TOOL_ACTION zoomOutCenter
Definition: actions.h:118
static TOOL_ACTION zoomIn
Definition: actions.h:115
static TOOL_ACTION zoomOut
Definition: actions.h:116
static TOOL_ACTION panDown
Definition: actions.h:159
CURSOR_EVENT_TYPE
Definition: actions.h:228
@ CURSOR_RIGHT
Definition: actions.h:236
@ CURSOR_LEFT
Definition: actions.h:234
@ CURSOR_UP
Definition: actions.h:230
@ CURSOR_DOWN
Definition: actions.h:232
static TOOL_ACTION panLeft
Definition: actions.h:160
static TOOL_ACTION updateMenu
Definition: actions.h:204
static TOOL_ACTION zoomFitScreen
Definition: actions.h:124
static TOOL_ACTION panUp
Definition: actions.h:158
static TOOL_ACTION zoomInCenter
Definition: actions.h:117
static TOOL_ACTION panRight
Definition: actions.h:161
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:49
void UpdateAll()
Run update handlers for the menu and its submenus.
void OnLayerVisibilityChanged(int aLayer, bool isVisible)
std::bitset< LAYER_3D_END > GetVisibleLayers() const
EDA_3D_VIEWER_SETTINGS * m_Cfg
void RotateY(float aAngleInRadians)
Definition: camera.cpp:657
void RotateX(float aAngleInRadians)
Definition: camera.cpp:650
void RotateZ(float aAngleInRadians)
Definition: camera.cpp:664
void ToggleProjection()
Definition: camera.cpp:559
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition, int aOrder=ANY_ORDER)
Add a menu entry to run a TOOL_ACTION on selected items.
void AddSeparator(int aOrder=ANY_ORDER)
Add a separator to the menu.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:84
bool IsQuasiModal() const
Definition: dialog_shim.h:107
void EndQuasiModal(int retCode)
static TOOL_ACTION showLayersManager
static TOOL_ACTION rotateXCCW
static TOOL_ACTION showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION noGrid
static TOOL_ACTION show2_5mmGrid
static TOOL_ACTION rotateZCCW
static TOOL_ACTION rotateZCW
static TOOL_ACTION rotateYCCW
static TOOL_ACTION rotateXCW
static TOOL_ACTION viewTop
static TOOL_ACTION show1mmGrid
static TOOL_ACTION showDNP
static TOOL_ACTION toggleOrtho
static TOOL_ACTION moveLeft
static TOOL_ACTION viewLeft
static TOOL_ACTION show10mmGrid
static TOOL_ACTION viewBack
static TOOL_ACTION show5mmGrid
static TOOL_ACTION viewRight
static TOOL_ACTION showSMD
static TOOL_ACTION homeView
static TOOL_ACTION moveUp
static TOOL_ACTION flipView
static TOOL_ACTION moveDown
static TOOL_ACTION viewBottom
static TOOL_ACTION moveRight
static TOOL_ACTION materialDiffuse
static TOOL_ACTION pivotCenter
static TOOL_ACTION controlActivate
static TOOL_ACTION showVirtual
static TOOL_ACTION rotateYCW
static TOOL_ACTION materialCAD
static TOOL_ACTION viewFront
static TOOL_ACTION showBBoxes
static TOOL_ACTION materialNormal
static TOOL_ACTION showAxis
virtual BOARD_ADAPTER & GetAdapter()=0
virtual CAMERA & GetCurrentCamera()=0
Implement a canvas based on a wxGLCanvas.
Definition: eda_3d_canvas.h:49
void DisplayStatus()
Update the status bar with the position information.
void RenderRaytracingRequest()
Request to render the current view in Raytracing mode.
bool SetView3D(VIEW3D_TYPE aRequestedView)
Select a specific 3D view or operation.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
int On3DGridSelection(const TOOL_EVENT &aEvent)
double m_rotationIncrement
Rotation increment for the rotate actions (degrees)
int ZoomFitScreen(const TOOL_EVENT &aEvent)
EDA_3D_CANVAS * m_canvas
int doZoomInOut(bool aDirection, bool aCenterOnCursor)
int ToggleLayersManager(const TOOL_EVENT &aEvent)
int Main(const TOOL_EVENT &aEvent)
BOARD_ADAPTER * m_boardAdapter
int ZoomRedraw(const TOOL_EVENT &aEvent)
int ToggleOrtho(const TOOL_EVENT &aEvent)
int PanControl(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
int ToggleVisibility(const TOOL_EVENT &aEvent)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
void setTransitions() override
< Sets up handlers for various events.
int RotateView(const TOOL_EVENT &aEvent)
int SetMaterial(const TOOL_EVENT &aEvent)
int UpdateMenu(const TOOL_EVENT &aEvent)
int ViewControl(const TOOL_EVENT &aEvent)
int ZoomInOutCenter(const TOOL_EVENT &aEvent)
int ZoomInOut(const TOOL_EVENT &aEvent)
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
virtual wxWindow * GetToolCanvas() const =0
Canvas access.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:216
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
Generic, UI-independent tool event.
Definition: tool_event.h:167
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:82
T Parameter() const
Return a parameter assigned to the event.
Definition: tool_event.h:460
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
TOOL_MENU m_menu
The functions below are not yet implemented - their interface may change.
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:397
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:44
void ShowContextMenu(SELECTION &aSelection)
Helper function to set and immediately show a CONDITIONAL_MENU in concert with the given SELECTION.
Definition: tool_menu.cpp:57
Declaration of the eda_3d_viewer class.
@ LAYER_3D_BOUNDING_BOXES
Definition: layer_ids.h:472
@ LAYER_3D_SMD_MODELS
Definition: layer_ids.h:467
@ LAYER_3D_TH_MODELS
Definition: layer_ids.h:466
@ LAYER_3D_AXES
Definition: layer_ids.h:471
@ LAYER_3D_VIRTUAL_MODELS
Definition: layer_ids.h:468
@ LAYER_3D_MODELS_MARKED_DNP
Definition: layer_ids.h:470
@ LAYER_3D_MODELS_NOT_IN_POS
Definition: layer_ids.h:469
@ BUT_RIGHT
Definition: tool_event.h:132