You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
13 KiB

  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. #include <tool/actions.h>
  24. #include <tool/tool_manager.h>
  25. #include <eda_3d_canvas.h>
  26. #include <eda_3d_viewer.h>
  27. #include <id.h>
  28. #include <kiface_i.h>
  29. #include <3d_viewer_id.h>
  30. #include <tools/3d_controller.h>
  31. #include "3d_actions.h"
  32. bool EDA_3D_CONTROLLER::Init()
  33. {
  34. CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
  35. ctxMenu.AddItem( ACTIONS::zoomIn, SELECTION_CONDITIONS::ShowAlways );
  36. ctxMenu.AddItem( ACTIONS::zoomOut, SELECTION_CONDITIONS::ShowAlways );
  37. ctxMenu.AddSeparator();
  38. ctxMenu.AddItem( EDA_3D_ACTIONS::viewTop, SELECTION_CONDITIONS::ShowAlways );
  39. ctxMenu.AddItem( EDA_3D_ACTIONS::viewBottom, SELECTION_CONDITIONS::ShowAlways );
  40. ctxMenu.AddSeparator();
  41. ctxMenu.AddItem( EDA_3D_ACTIONS::viewRight, SELECTION_CONDITIONS::ShowAlways );
  42. ctxMenu.AddItem( EDA_3D_ACTIONS::viewLeft, SELECTION_CONDITIONS::ShowAlways );
  43. ctxMenu.AddSeparator();
  44. ctxMenu.AddItem( EDA_3D_ACTIONS::viewFront, SELECTION_CONDITIONS::ShowAlways );
  45. ctxMenu.AddItem( EDA_3D_ACTIONS::viewBack, SELECTION_CONDITIONS::ShowAlways );
  46. ctxMenu.AddSeparator();
  47. ctxMenu.AddItem( EDA_3D_ACTIONS::flipView, SELECTION_CONDITIONS::ShowAlways );
  48. ctxMenu.AddSeparator();
  49. ctxMenu.AddItem( EDA_3D_ACTIONS::moveLeft, SELECTION_CONDITIONS::ShowAlways );
  50. ctxMenu.AddItem( EDA_3D_ACTIONS::moveRight, SELECTION_CONDITIONS::ShowAlways );
  51. ctxMenu.AddItem( EDA_3D_ACTIONS::moveUp, SELECTION_CONDITIONS::ShowAlways );
  52. ctxMenu.AddItem( EDA_3D_ACTIONS::moveDown, SELECTION_CONDITIONS::ShowAlways );
  53. return true;
  54. }
  55. void EDA_3D_CONTROLLER::Reset( RESET_REASON aReason )
  56. {
  57. TOOLS_HOLDER* holder = m_toolMgr->GetToolHolder();
  58. wxASSERT( holder );
  59. m_canvas = nullptr;
  60. m_boardAdapter = nullptr;
  61. m_camera = nullptr;
  62. if( holder )
  63. {
  64. m_canvas = dynamic_cast<EDA_3D_CANVAS*>( holder->GetToolCanvas() );
  65. EDA_3D_BOARD_HOLDER* holder3d =
  66. dynamic_cast<EDA_3D_BOARD_HOLDER*>( holder );
  67. wxASSERT( holder3d );
  68. if( holder3d )
  69. {
  70. m_boardAdapter = &holder3d->GetAdapter();
  71. m_camera = &holder3d->GetCurrentCamera();
  72. }
  73. }
  74. }
  75. int EDA_3D_CONTROLLER::UpdateMenu( const TOOL_EVENT& aEvent )
  76. {
  77. ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>();
  78. CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( actionMenu );
  79. SELECTION dummySel;
  80. if( conditionalMenu )
  81. conditionalMenu->Evaluate( dummySel );
  82. if( actionMenu )
  83. actionMenu->UpdateAll();
  84. return 0;
  85. }
  86. int EDA_3D_CONTROLLER::Main( const TOOL_EVENT& aEvent )
  87. {
  88. // Main loop: keep receiving events
  89. while( TOOL_EVENT* evt = Wait() )
  90. {
  91. if( evt->IsClick( BUT_RIGHT ) )
  92. m_menu.ShowContextMenu();
  93. else
  94. evt->SetPassEvent();
  95. }
  96. return 0;
  97. }
  98. int EDA_3D_CONTROLLER::ViewControl( const TOOL_EVENT& aEvent )
  99. {
  100. m_canvas->SetView3D( aEvent.Parameter<intptr_t>() );
  101. return 0;
  102. }
  103. int EDA_3D_CONTROLLER::PanControl( const TOOL_EVENT& aEvent )
  104. {
  105. switch( aEvent.Parameter<intptr_t>() )
  106. {
  107. case ACTIONS::CURSOR_UP: m_canvas->SetView3D( WXK_UP ); break;
  108. case ACTIONS::CURSOR_DOWN: m_canvas->SetView3D( WXK_DOWN ); break;
  109. case ACTIONS::CURSOR_LEFT: m_canvas->SetView3D( WXK_LEFT ); break;
  110. case ACTIONS::CURSOR_RIGHT: m_canvas->SetView3D( WXK_RIGHT ); break;
  111. default: wxFAIL; break;
  112. }
  113. return 0;
  114. }
  115. int EDA_3D_CONTROLLER::RotateView( const TOOL_EVENT& aEvent )
  116. {
  117. double rotIncrement = glm::radians( m_rotationIncrement );
  118. switch( aEvent.Parameter<ROTATION_DIR>() )
  119. {
  120. case ROTATION_DIR::X_CW: m_camera->RotateX( -rotIncrement ); break;
  121. case ROTATION_DIR::X_CCW: m_camera->RotateX( rotIncrement ); break;
  122. /// Y rotations are backward b/c the RHR has Y pointing into the screen
  123. case ROTATION_DIR::Y_CW: m_camera->RotateY( rotIncrement ); break;
  124. case ROTATION_DIR::Y_CCW: m_camera->RotateY( -rotIncrement ); break;
  125. case ROTATION_DIR::Z_CW: m_camera->RotateZ( -rotIncrement ); break;
  126. case ROTATION_DIR::Z_CCW: m_camera->RotateZ( rotIncrement ); break;
  127. default: wxFAIL; break;
  128. }
  129. if( m_boardAdapter->GetRenderEngine() == RENDER_ENGINE::OPENGL_LEGACY )
  130. m_canvas->Request_refresh();
  131. else
  132. m_canvas->RenderRaytracingRequest();
  133. return 0;
  134. }
  135. int EDA_3D_CONTROLLER::SetMaterial( const TOOL_EVENT& aEvent )
  136. {
  137. MATERIAL_MODE mode = aEvent.Parameter<MATERIAL_MODE>();
  138. m_boardAdapter->SetMaterialMode( mode );
  139. if( EDA_3D_VIEWER* viewer = dynamic_cast<EDA_3D_VIEWER*>( m_toolMgr->GetToolHolder() ) )
  140. viewer->NewDisplay( true );
  141. else
  142. m_canvas->Request_refresh();
  143. return 0;
  144. }
  145. int EDA_3D_CONTROLLER::ToggleOrtho( const TOOL_EVENT& aEvent )
  146. {
  147. m_camera->ToggleProjection();
  148. if( m_boardAdapter->GetRenderEngine() == RENDER_ENGINE::OPENGL_LEGACY )
  149. m_canvas->Request_refresh();
  150. else
  151. m_canvas->RenderRaytracingRequest();
  152. return 0;
  153. }
  154. int EDA_3D_CONTROLLER::ToggleVisibility( const TOOL_EVENT& aEvent )
  155. {
  156. DISPLAY3D_FLG flag = aEvent.Parameter<DISPLAY3D_FLG>();
  157. m_boardAdapter->SetFlag( flag, !m_boardAdapter->GetFlag( flag ) );
  158. switch( flag )
  159. {
  160. case FL_RENDER_OPENGL_SHOW_MODEL_BBOX:
  161. case FL_RENDER_RAYTRACING_SHADOWS:
  162. case FL_RENDER_RAYTRACING_REFRACTIONS:
  163. case FL_RENDER_RAYTRACING_REFLECTIONS:
  164. case FL_RENDER_RAYTRACING_ANTI_ALIASING:
  165. case FL_AXIS:
  166. m_canvas->Request_refresh();
  167. break;
  168. default:
  169. {
  170. EDA_3D_VIEWER* viewer = dynamic_cast<EDA_3D_VIEWER*>( m_toolMgr->GetToolHolder() );
  171. if( viewer )
  172. viewer->NewDisplay( true );
  173. else
  174. m_canvas->Request_refresh();
  175. break;
  176. }
  177. }
  178. return 0;
  179. }
  180. int EDA_3D_CONTROLLER::On3DGridSelection( const TOOL_EVENT& aEvent )
  181. {
  182. GRID3D_TYPE grid = aEvent.Parameter<GRID3D_TYPE>();
  183. m_boardAdapter->SetGridType( grid );
  184. if( m_canvas )
  185. m_canvas->Request_refresh();
  186. return 0;
  187. }
  188. int EDA_3D_CONTROLLER::ZoomRedraw( const TOOL_EVENT& aEvent )
  189. {
  190. m_canvas->Request_refresh();
  191. return 0;
  192. }
  193. int EDA_3D_CONTROLLER::ZoomInOut( const TOOL_EVENT& aEvent )
  194. {
  195. bool direction = aEvent.IsAction( &ACTIONS::zoomIn );
  196. return doZoomInOut( direction, true );
  197. }
  198. int EDA_3D_CONTROLLER::ZoomInOutCenter( const TOOL_EVENT& aEvent )
  199. {
  200. bool direction = aEvent.IsAction( &ACTIONS::zoomInCenter );
  201. return doZoomInOut( direction, false );
  202. }
  203. int EDA_3D_CONTROLLER::doZoomInOut( bool aDirection, bool aCenterOnCursor )
  204. {
  205. if( m_canvas )
  206. {
  207. m_canvas->SetView3D( aDirection ? WXK_F1 : WXK_F2 );
  208. m_canvas->DisplayStatus();
  209. }
  210. return 0;
  211. }
  212. int EDA_3D_CONTROLLER::ZoomFitScreen( const TOOL_EVENT& aEvent )
  213. {
  214. if( m_canvas )
  215. {
  216. m_canvas->SetView3D( WXK_HOME );
  217. m_canvas->DisplayStatus();
  218. }
  219. return 0;
  220. }
  221. void EDA_3D_CONTROLLER::setTransitions()
  222. {
  223. Go( &EDA_3D_CONTROLLER::Main, EDA_3D_ACTIONS::controlActivate.MakeEvent() );
  224. Go( &EDA_3D_CONTROLLER::UpdateMenu, ACTIONS::updateMenu.MakeEvent() );
  225. // Pan control
  226. Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panUp.MakeEvent() );
  227. Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panDown.MakeEvent() );
  228. Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panLeft.MakeEvent() );
  229. Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panRight.MakeEvent() );
  230. Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveUp.MakeEvent() );
  231. Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveDown.MakeEvent() );
  232. Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveLeft.MakeEvent() );
  233. Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveRight.MakeEvent() );
  234. // View rotation
  235. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewTop.MakeEvent() );
  236. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewBottom.MakeEvent() );
  237. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewLeft.MakeEvent() );
  238. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewRight.MakeEvent() );
  239. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewFront.MakeEvent() );
  240. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewBack.MakeEvent() );
  241. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::pivotCenter.MakeEvent() );
  242. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::homeView.MakeEvent() );
  243. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::resetView.MakeEvent() );
  244. Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::flipView.MakeEvent() );
  245. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateXCW.MakeEvent() );
  246. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateXCCW.MakeEvent() );
  247. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateYCW.MakeEvent() );
  248. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateYCCW.MakeEvent() );
  249. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateZCW.MakeEvent() );
  250. Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateZCCW.MakeEvent() );
  251. // Zoom control
  252. Go( &EDA_3D_CONTROLLER::ZoomRedraw, ACTIONS::zoomRedraw.MakeEvent() );
  253. Go( &EDA_3D_CONTROLLER::ZoomInOut, ACTIONS::zoomIn.MakeEvent() );
  254. Go( &EDA_3D_CONTROLLER::ZoomInOut, ACTIONS::zoomOut.MakeEvent() );
  255. Go( &EDA_3D_CONTROLLER::ZoomInOutCenter, ACTIONS::zoomInCenter.MakeEvent() );
  256. Go( &EDA_3D_CONTROLLER::ZoomInOutCenter, ACTIONS::zoomOutCenter.MakeEvent() );
  257. Go( &EDA_3D_CONTROLLER::ZoomFitScreen, ACTIONS::zoomFitScreen.MakeEvent() );
  258. // Grid
  259. Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::noGrid.MakeEvent() );
  260. Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show10mmGrid.MakeEvent() );
  261. Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show5mmGrid.MakeEvent() );
  262. Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show2_5mmGrid.MakeEvent() );
  263. Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show1mmGrid.MakeEvent() );
  264. // Material
  265. Go( &EDA_3D_CONTROLLER::SetMaterial, EDA_3D_ACTIONS::materialNormal.MakeEvent() );
  266. Go( &EDA_3D_CONTROLLER::SetMaterial, EDA_3D_ACTIONS::materialDiffuse.MakeEvent() );
  267. Go( &EDA_3D_CONTROLLER::SetMaterial, EDA_3D_ACTIONS::materialCAD.MakeEvent() );
  268. // Visibility
  269. Go( &EDA_3D_CONTROLLER::ToggleOrtho, EDA_3D_ACTIONS::toggleOrtho.MakeEvent() );
  270. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesTHT.MakeEvent() );
  271. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesSMD.MakeEvent() );
  272. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesVirtual.MakeEvent() );
  273. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showBoundingBoxes.MakeEvent() );
  274. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleRealisticMode.MakeEvent() );
  275. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleBoardBody.MakeEvent() );
  276. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showAxis.MakeEvent() );
  277. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleZones.MakeEvent() );
  278. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleAdhesive.MakeEvent() );
  279. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSilk.MakeEvent() );
  280. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderMask.MakeEvent() );
  281. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderPaste.MakeEvent() );
  282. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleComments.MakeEvent() );
  283. Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleECO.MakeEvent() );
  284. }