KiCad PCB EDA Suite
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) 2020 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <tool/actions.h>
25 #include <tool/tool_manager.h>
26 #include <eda_3d_canvas.h>
27 #include <eda_3d_viewer_frame.h>
28 #include <id.h>
29 #include <kiface_base.h>
31 #include "eda_3d_actions.h"
34 
35 
37 {
38  CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
39 
42 
43  ctxMenu.AddSeparator();
46 
47  ctxMenu.AddSeparator();
50 
51  ctxMenu.AddSeparator();
54 
55  ctxMenu.AddSeparator();
57 
58  ctxMenu.AddSeparator();
63 
64  return true;
65 }
66 
67 
69 {
71 
72  wxASSERT( holder );
73 
74  m_canvas = nullptr;
75  m_boardAdapter = nullptr;
76  m_camera = nullptr;
77 
78  if( holder )
79  {
80  m_canvas = dynamic_cast<EDA_3D_CANVAS*>( holder->GetToolCanvas() );
81 
82  EDA_3D_BOARD_HOLDER* holder3d =
83  dynamic_cast<EDA_3D_BOARD_HOLDER*>( holder );
84 
85  wxASSERT( holder3d );
86 
87  if( holder3d )
88  {
89  m_boardAdapter = &holder3d->GetAdapter();
90  m_camera = &holder3d->GetCurrentCamera();
91  }
92  }
93 }
94 
95 
97 {
98  ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>();
99  CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( actionMenu );
100  SELECTION dummySel;
101 
102  if( conditionalMenu )
103  conditionalMenu->Evaluate( dummySel );
104 
105  if( actionMenu )
106  actionMenu->UpdateAll();
107 
108  return 0;
109 }
110 
111 
113 {
114  // Main loop: keep receiving events
115  while( TOOL_EVENT* evt = Wait() )
116  {
117  if( evt->IsCancelInteractive() )
118  {
119  wxWindow* canvas = m_toolMgr->GetToolHolder()->GetToolCanvas();
120  wxWindow* topLevelParent = canvas->GetParent();
121 
122  while( topLevelParent && !topLevelParent->IsTopLevel() )
123  topLevelParent = topLevelParent->GetParent();
124 
125  if( topLevelParent && dynamic_cast<DIALOG_SHIM*>( topLevelParent ) )
126  {
127  DIALOG_SHIM* dialog = static_cast<DIALOG_SHIM*>( topLevelParent );
128 
129  if( dialog->IsQuasiModal() )
130  dialog->EndQuasiModal( wxID_CANCEL );
131  else
132  dialog->EndModal( wxID_CANCEL );
133  }
134  else
135  {
136  evt->SetPassEvent();
137  }
138  }
139  else if( evt->IsClick( BUT_RIGHT ) )
140  {
142  }
143  else
144  {
145  evt->SetPassEvent();
146  }
147  }
148 
149  return 0;
150 }
151 
152 
154 {
155  m_canvas->SetView3D( aEvent.Parameter<intptr_t>() );
156 
157  return 0;
158 }
159 
160 
162 {
163  switch( aEvent.Parameter<intptr_t>() )
164  {
165  case ACTIONS::CURSOR_UP: m_canvas->SetView3D( WXK_UP ); break;
166  case ACTIONS::CURSOR_DOWN: m_canvas->SetView3D( WXK_DOWN ); break;
167  case ACTIONS::CURSOR_LEFT: m_canvas->SetView3D( WXK_LEFT ); break;
168  case ACTIONS::CURSOR_RIGHT: m_canvas->SetView3D( WXK_RIGHT ); break;
169  default: wxFAIL; break;
170  }
171 
172  return 0;
173 }
174 
175 
177 {
178  double rotIncrement = glm::radians( m_rotationIncrement );
179 
180  switch( aEvent.Parameter<ROTATION_DIR>() )
181  {
182  case ROTATION_DIR::X_CW: m_camera->RotateX( -rotIncrement ); break;
183  case ROTATION_DIR::X_CCW: m_camera->RotateX( rotIncrement ); break;
185  case ROTATION_DIR::Y_CW: m_camera->RotateY( rotIncrement ); break;
186  case ROTATION_DIR::Y_CCW: m_camera->RotateY( -rotIncrement ); break;
187  case ROTATION_DIR::Z_CW: m_camera->RotateZ( -rotIncrement ); break;
188  case ROTATION_DIR::Z_CCW: m_camera->RotateZ( rotIncrement ); break;
189  default: wxFAIL; break;
190  }
191 
194  else
196 
197  return 0;
198 }
199 
200 
202 {
203  MATERIAL_MODE mode = aEvent.Parameter<MATERIAL_MODE>();
204 
206 
207  if( auto* viewer = dynamic_cast<EDA_3D_VIEWER_FRAME*>( m_toolMgr->GetToolHolder() ) )
208  viewer->NewDisplay( true );
209  else
211 
212  return 0;
213 }
214 
215 
217 {
219 
222  else
224 
225  return 0;
226 }
227 
228 
230 {
232 
234 
235  switch( flag )
236  {
237  // These commands do not request a 3D scene rebuild (and do not exist in raytracing):
239  case FL_AXIS:
241  break;
242 
243  // These commands do not request a 3D scene rebuild and exist in raytracing:
250  else
252 
253  break;
254 
258  // Loading 3D shapes can be needed if not yet loaded
260  {
261  RENDER_3D_OPENGL* render = static_cast<RENDER_3D_OPENGL*>( m_canvas->GetCurrentRender() );
262  render->Load3dModelsIfNeeded();
264  }
265  else
267 
268  break;
269 
270  default:
271  {
272  if( auto viewer = dynamic_cast<EDA_3D_VIEWER_FRAME*>( m_toolMgr->GetToolHolder() ) )
273  viewer->NewDisplay( true );
274  else
276  break;
277  }
278  }
279 
280  return 0;
281 }
282 
283 
285 {
288 
289  if( m_canvas )
291 
292  return 0;
293 }
294 
295 
297 {
299  return 0;
300 }
301 
302 
304 {
305  bool direction = aEvent.IsAction( &ACTIONS::zoomIn );
306  return doZoomInOut( direction, true );
307 }
308 
309 
311 {
312  bool direction = aEvent.IsAction( &ACTIONS::zoomInCenter );
313  return doZoomInOut( direction, false );
314 }
315 
316 
317 int EDA_3D_CONTROLLER::doZoomInOut( bool aDirection, bool aCenterOnCursor )
318 {
319  if( m_canvas )
320  {
321  m_canvas->SetView3D( aDirection ? WXK_F1 : WXK_F2 );
323  }
324 
325  return 0;
326 }
327 
328 
330 {
331  if( m_canvas )
332  {
333  m_canvas->SetView3D( WXK_HOME );
335  }
336 
337  return 0;
338 }
339 
340 
342 {
345 
346  // Pan control
355 
356  // View rotation
373 
374  // Zoom control
379  // zoom in/out at cursor does not exist in 3D viewer but because F1 and F2 keys generate
380  // a zoomIn/zoomOut event, these events must be captured to use these hot keys. The actual
381  // zoom is the same as ZoomInOutCenter
384 
385  // Grid
391 
392  // Material
396 
397  // Visibility
413 }
414 
415 
static TOOL_ACTION rotateXCW
int ZoomFitScreen(const TOOL_EVENT &aEvent)
void RotateX(float aAngleInRadians)
Definition: camera.cpp:519
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
bool GetFlag(DISPLAY3D_FLG aFlag) const
Get a configuration status of a flag.
TOOL_MENU m_menu
The functions below are not yet implemented - their interface may change.
Object to render the board using openGL.
static TOOL_ACTION homeView
int ToggleOrtho(const TOOL_EVENT &aEvent)
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.
static TOOL_ACTION zoomInCenter
Definition: actions.h:93
void Load3dModelsIfNeeded()
Load footprint models if they are not already loaded, i.e.
static TOOL_ACTION show10mmGrid
double m_rotationIncrement
Rotation increment for the rotate actions (degrees)
int ZoomInOutCenter(const TOOL_EVENT &aEvent)
static TOOL_ACTION materialCAD
static TOOL_ACTION pivotCenter
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:48
void SetFlag(DISPLAY3D_FLG aFlag, bool aState)
Set the status of a flag.
static TOOL_ACTION toggleAdhesive
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:46
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
int SetMaterial(const TOOL_EVENT &aEvent)
static TOOL_ACTION zoomFitScreen
Definition: actions.h:96
static TOOL_ACTION toggleSilk
bool IsQuasiModal() const
Definition: dialog_shim.h:106
bool Init() override
Init() is called once upon a registration of the tool.
static TOOL_ACTION toggleSolderMask
void UpdateAll()
Run update handlers for the menu and its submenus.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:82
void SetGridType(GRID3D_TYPE aGridType) noexcept
Set the current grid.
int ZoomRedraw(const TOOL_EVENT &aEvent)
int UpdateMenu(const TOOL_EVENT &aEvent)
void DisplayStatus()
Update the status bar with the position information.
static TOOL_ACTION panLeft
Definition: actions.h:129
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
int On3DGridSelection(const TOOL_EVENT &aEvent)
static TOOL_ACTION resetView
int doZoomInOut(bool aDirection, bool aCenterOnCursor)
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).
static TOOL_ACTION controlActivate
static TOOL_ACTION showBBoxes
static TOOL_ACTION zoomOutCenter
Definition: actions.h:94
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:88
static TOOL_ACTION flipView
static TOOL_ACTION toggleZones
static TOOL_ACTION viewRight
static TOOL_ACTION viewLeft
static TOOL_ACTION toggleECO
RENDER_ENGINE GetRenderEngine() const noexcept
void setTransitions() override
< Sets up handlers for various events.
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION moveLeft
void RenderRaytracingRequest()
Request to render the current view in Raytracing mode.
static TOOL_ACTION toggleComments
static TOOL_ACTION show5mmGrid
int ViewControl(const TOOL_EVENT &aEvent)
static TOOL_ACTION showTHT
static TOOL_ACTION panDown
Definition: actions.h:128
virtual wxWindow * GetToolCanvas() const =0
Canvas access.
static TOOL_ACTION toggleSolderPaste
T Parameter() const
Return a non-standard parameter assigned to the event.
Definition: tool_event.h:432
static TOOL_ACTION rotateYCW
Generic, UI-independent tool event.
Definition: tool_event.h:152
static TOOL_ACTION panRight
Definition: actions.h:130
void RotateY(float aAngleInRadians)
Definition: camera.cpp:526
int ZoomInOut(const TOOL_EVENT &aEvent)
void SetMaterialMode(MATERIAL_MODE aMaterialMode) noexcept
int PanControl(const TOOL_EVENT &aEvent)
static TOOL_ACTION rotateXCCW
static TOOL_ACTION materialNormal
static TOOL_ACTION viewBottom
static TOOL_ACTION rotateZCCW
EDA_3D_CANVAS * m_canvas
static TOOL_ACTION updateMenu
Definition: actions.h:167
static TOOL_ACTION showAxis
MATERIAL_MODE
Render 3d model shape materials mode.
Definition: 3d_enums.h:118
int ToggleVisibility(const TOOL_EVENT &aEvent)
static TOOL_ACTION rotateZCW
ROTATION_DIR
Rotation direction for the 3d canvas.
Definition: 3d_enums.h:80
static TOOL_ACTION viewTop
GRID3D_TYPE
Grid types.
Definition: 3d_enums.h:99
static TOOL_ACTION viewBack
void AddSeparator(int aOrder=ANY_ORDER)
Add a separator to the menu.
static TOOL_ACTION materialDiffuse
static TOOL_ACTION toggleRealisticMode
DISPLAY3D_FLG
Flags used in rendering options.
Definition: 3d_enums.h:34
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:294
static TOOL_ACTION moveDown
void EndQuasiModal(int retCode)
int Main(const TOOL_EVENT &aEvent)
static TOOL_ACTION show2_5mmGrid
static TOOL_ACTION show1mmGrid
static TOOL_ACTION viewFront
int RotateView(const TOOL_EVENT &aEvent)
static TOOL_ACTION rotateYCCW
static TOOL_ACTION zoomRedraw
Definition: actions.h:90
BOARD_ADAPTER * m_boardAdapter
bool SetView3D(int aKeycode)
Helper function to call view commands.
RENDER_3D_BASE * GetCurrentRender() const
static TOOL_ACTION moveUp
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:77
void RotateZ(float aAngleInRadians)
Definition: camera.cpp:533
static TOOL_ACTION noGrid
void ToggleProjection()
Definition: camera.cpp:445
static TOOL_ACTION panUp
Definition: actions.h:127
static TOOL_ACTION zoomIn
Definition: actions.h:91
static TOOL_ACTION zoomOut
Definition: actions.h:92
static TOOL_ACTION toggleOrtho
static TOOL_ACTION moveRight
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 ShowContextMenu(SELECTION &aSelection)
Helper function to set and immediately show a CONDITIONAL_MENU in concert with the given SELECTION.
Definition: tool_menu.cpp:59
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
static TOOL_ACTION toggleBoardBody