KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
eda_3d_viewer_frame.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) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
5 * Copyright (C) 2023 CERN
6 * Copyright The 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#include <wx/filename.h>
27#include <wx/msgdlg.h>
28#include <wx/string.h>
29#include <wx/wupdlock.h>
30#include <wx/clipbrd.h>
31#include <wx/filedlg.h>
32#include <wx/dialog.h>
33#include "eda_3d_viewer_frame.h"
37#include <3d_viewer_id.h>
41#include <board.h>
42#include <advanced_config.h>
43#include <bitmaps.h>
45#include <core/arraydim.h>
46#include <dpi_scaling_common.h>
47#include <pgm_base.h>
48#include <project.h>
52#include <tool/action_manager.h>
53#include <tool/common_control.h>
54#include <tool/tool_manager.h>
56#include <tool/action_toolbar.h>
57#include <widgets/wx_infobar.h>
60#include <project_pcb.h>
61#include <toolbars_3d.h>
62
64
72const wxChar* EDA_3D_VIEWER_FRAME::m_logTrace = wxT( "KI_TRACE_EDA_3D_VIEWER" );
73
74
75BEGIN_EVENT_TABLE( EDA_3D_VIEWER_FRAME, KIWAY_PLAYER )
76
78 EVT_SET_FOCUS( EDA_3D_VIEWER_FRAME::OnSetFocus )
79
81 EDA_3D_VIEWER_FRAME::Process_Special_Functions )
82
83 EVT_MENU( wxID_CLOSE, EDA_3D_VIEWER_FRAME::Exit3DFrame )
84 EVT_MENU( ID_DISABLE_RAY_TRACING, EDA_3D_VIEWER_FRAME::onDisableRayTracing )
85
86 EVT_CLOSE( EDA_3D_VIEWER_FRAME::OnCloseWindow )
87END_EVENT_TABLE()
88
89
91 const wxString& aTitle, long style ) :
92 KIWAY_PLAYER( aKiway, aParent, FRAME_PCB_DISPLAY3D, aTitle, wxDefaultPosition,
93 wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ), unityScale ),
94 m_canvas( nullptr ),
95 m_currentCamera( m_trackBallCamera ),
96 m_trackBallCamera( 2 * RANGE_SCALE_3D )
97{
98 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
99
100 m_disable_ray_tracing = false;
101 m_aboutTitle = _HKI( "KiCad 3D Viewer" );
102
103 // Give it an icon
104 wxIcon icon;
105 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_3d ) );
106 SetIcon( icon );
107
108 // Create the status line
109 static const int status_dims[5] = { -1, 170, 130, 130, 130 };
110
111 wxStatusBar *status_bar = CreateStatusBar( arrayDim( status_dims ) );
112 SetStatusWidths( arrayDim( status_dims ), status_dims );
113
116 ANTIALIASING_MODE aaMode = static_cast<ANTIALIASING_MODE>( cfg->m_Render.opengl_AA_mode );
117
118 m_canvas = new EDA_3D_CANVAS( this, OGL_ATT_LIST::GetAttributesList( aaMode, true ),
119 m_boardAdapter, m_currentCamera,
121
122 m_appearancePanel = new APPEARANCE_CONTROLS_3D( this, GetCanvas() );
123
124 LoadSettings( cfg );
125 loadCommonSettings();
126
127 m_appearancePanel->SetUserViewports( Prj().GetProjectFile().m_Viewports3D );
128
129 // Create the manager
130 m_toolManager = new TOOL_MANAGER;
131 m_toolManager->SetEnvironment( GetBoard(), nullptr, nullptr, cfg, this );
132
133 m_actions = new EDA_3D_ACTIONS();
134 m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager );
135 m_canvas->SetEventDispatcher( m_toolDispatcher );
136
137 // Register tools
138 m_toolManager->RegisterTool( new COMMON_CONTROL );
139 m_toolManager->RegisterTool( new EDA_3D_CONTROLLER );
140 m_toolManager->InitTools();
141
142 setupUIConditions();
143
144 if( EDA_3D_CONTROLLER* ctrlTool = GetToolManager()->GetTool<EDA_3D_CONTROLLER>() )
145 ctrlTool->SetRotationIncrement( cfg->m_Camera.rotation_increment );
146
147 // Run the viewer control tool, it is supposed to be always active
148 m_toolManager->InvokeTool( "3DViewer.Control" );
149
150 ReCreateMenuBar();
151
152 m_toolbarSettings = Pgm().GetSettingsManager().GetToolbarSettings<EDA_3D_VIEWER_TOOLBAR_SETTINGS>( "3d_viewer-toolbars" );
153 configureToolbars();
154 RecreateToolbars();
155
156 m_infoBar = new WX_INFOBAR( this, &m_auimgr );
157
158 m_auimgr.SetManagedWindow( this );
159
160 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
161 .Top().Layer( 6 ) );
162 m_auimgr.AddPane( m_infoBar, EDA_PANE().InfoBar().Name( wxS( "InfoBar" ) )
163 .Top().Layer( 1 ) );
164 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( "LayersManager" )
165 .Right().Layer( 3 )
166 .Caption( _( "Appearance" ) ).PaneBorder( false )
167 .MinSize( 180, -1 ).BestSize( 190, -1 ) );
168 m_auimgr.AddPane( m_canvas, EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
169 .Center() );
170
171 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( "LayersManager" );
172
173 if( cfg->m_AuiPanels.right_panel_width > 0 )
174 SetAuiPaneSize( m_auimgr, layersManager, cfg->m_AuiPanels.right_panel_width, -1 );
175
176 layersManager.Show( cfg->m_AuiPanels.show_layer_manager );
177
178 // Call Update() to fix all pane default sizes, especially the "InfoBar" pane before
179 // hiding it.
180 m_auimgr.Update();
181
182 // We don't want the infobar displayed right away
183 m_auimgr.GetPane( wxS( "InfoBar" ) ).Hide();
184 m_auimgr.Update();
185
186 m_canvas->SetInfoBar( m_infoBar );
187 m_canvas->SetStatusBar( status_bar );
188
189 try
190 {
191 m_spaceMouse = std::make_unique<NL_3D_VIEWER_PLUGIN>( m_canvas );
192 }
193 catch( const std::system_error& e )
194 {
195 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
196 }
197
198 // Fixes bug in Windows (XP and possibly others) where the canvas requires the focus
199 // in order to receive mouse events. Otherwise, the user has to click somewhere on
200 // the canvas before it will respond to mouse wheel events.
201 m_canvas->SetFocus();
202}
203
204
206{
208
209 m_canvas->SetEventDispatcher( nullptr );
210
211 m_auimgr.UnInit();
212}
213
214
216{
218
221
222// Helper to define check conditions
223#define GridSizeCheck( x ) ACTION_CONDITIONS().Check( cond.GridSize( x ) )
224
225 auto raytracing =
226 [this]( const SELECTION& aSel )
227 {
228 return m_boardAdapter.m_Cfg->m_Render.engine != RENDER_ENGINE::OPENGL;
229 };
230 auto showTH =
231 [this]( const SELECTION& aSel )
232 {
234 };
235 auto showSMD =
236 [this]( const SELECTION& aSel )
237 {
239 };
240 auto showVirtual =
241 [this]( const SELECTION& aSel )
242 {
244 };
245 auto show_NotInPosfile =
246 [this]( const SELECTION& aSel )
247 {
249 };
250 auto show_DNP =
251 [this]( const SELECTION& aSel )
252 {
254 };
255 auto showBBoxes =
256 [this]( const SELECTION& aSel )
257 {
259 };
260 auto showAxes =
261 [this]( const SELECTION& aSel )
262 {
264 };
265 auto ortho =
266 [this]( const SELECTION& )
267 {
268 return m_currentCamera.GetProjection() == PROJECTION_TYPE::ORTHO;
269 };
270
271 auto appearances =
272 [this]( const SELECTION& aSel )
273 {
275 };
276
278
283 ACTION_CONDITIONS().Check( show_NotInPosfile ) );
285
288
289 mgr->SetConditions( EDA_3D_ACTIONS::noGrid, GridSizeCheck( GRID3D_TYPE::NONE ) );
290 mgr->SetConditions( EDA_3D_ACTIONS::show10mmGrid, GridSizeCheck( GRID3D_TYPE::GRID_10MM ) );
291 mgr->SetConditions( EDA_3D_ACTIONS::show5mmGrid, GridSizeCheck( GRID3D_TYPE::GRID_5MM ) );
292 mgr->SetConditions( EDA_3D_ACTIONS::show2_5mmGrid, GridSizeCheck( GRID3D_TYPE::GRID_2P5MM ) );
293 mgr->SetConditions( EDA_3D_ACTIONS::show1mmGrid, GridSizeCheck( GRID3D_TYPE::GRID_1MM ) );
295
297 ACTION_CONDITIONS().Check( appearances ) );
298
299#undef GridSizeCheck
300}
301
302
303bool EDA_3D_VIEWER_FRAME::TryBefore( wxEvent& aEvent )
304{
305 static bool s_presetSwitcherShown = false;
306 static bool s_viewportSwitcherShown = false;
307
308 // wxWidgets generates no key events for the tab key when the ctrl key is held down. One
309 // way around this is to look at all events and inspect the keyboard state of the tab key.
310 // However, this runs into issues on some linux VMs where querying the keyboard state is
311 // very slow. Fortunately we only use ctrl-tab on Mac, so we implement this lovely hack:
312#ifdef __WXMAC__
313 if( wxGetKeyState( WXK_TAB ) )
314#else
315 if( ( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
316 && static_cast<wxKeyEvent&>( aEvent ).GetKeyCode() == WXK_TAB )
317#endif
318 {
319 if( !s_presetSwitcherShown && wxGetKeyState( PRESET_SWITCH_KEY ) )
320 {
321 if( m_appearancePanel && this->IsActive() )
322 {
323 wxArrayString mru = m_appearancePanel->GetLayerPresetsMRU();
324
325 if( mru.size() > 0 )
326 {
327 for( wxString& str : mru )
328 {
329 if( str == FOLLOW_PCB )
330 str = _( "Follow PCB Editor" );
331 else if( str == FOLLOW_PLOT_SETTINGS )
332 str = _( "Follow PCB Plot Settings" );
333 }
334
335 EDA_VIEW_SWITCHER switcher( this, mru, PRESET_SWITCH_KEY );
336
337 s_presetSwitcherShown = true;
338 switcher.ShowModal();
339 s_presetSwitcherShown = false;
340
341 int idx = switcher.GetSelection();
342
343 if( idx >= 0 && idx < (int) mru.size() )
344 {
345 wxString internalName = m_appearancePanel->GetLayerPresetsMRU()[idx];
346 m_appearancePanel->ApplyLayerPreset( internalName );
347 }
348
349 return true;
350 }
351 }
352 }
353 else if( !s_viewportSwitcherShown && wxGetKeyState( VIEWPORT_SWITCH_KEY ) )
354 {
355 if( this->IsActive() )
356 {
357 const wxArrayString& viewportMRU = m_appearancePanel->GetViewportsMRU();
358
359 if( viewportMRU.size() > 0 )
360 {
361 EDA_VIEW_SWITCHER switcher( this, viewportMRU, VIEWPORT_SWITCH_KEY );
362
363 s_viewportSwitcherShown = true;
364 switcher.ShowModal();
365 s_viewportSwitcherShown = false;
366
367 int idx = switcher.GetSelection();
368
369 if( idx >= 0 && idx < (int) viewportMRU.size() )
370 m_appearancePanel->ApplyViewport( viewportMRU[idx] );
371
372 return true;
373 }
374 }
375 }
376 }
377
378 return wxFrame::TryBefore( aEvent );
379}
380
381
382void EDA_3D_VIEWER_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
383{
385
386 if( m_spaceMouse && aEvent.IsIconized() )
387 m_spaceMouse->SetFocus( false );
388}
389
390
392{
393 // This will schedule a request to load later
394 // ReloadRequest also updates the board pointer so always call it first
395 if( m_canvas )
397
400}
401
402
403void EDA_3D_VIEWER_FRAME::NewDisplay( bool aForceImmediateRedraw )
404{
405 if( m_canvas )
407
408 // After the ReloadRequest call, the refresh often takes a bit of time,
409 // and it is made here only on request.
410 if( m_canvas && aForceImmediateRedraw )
411 m_canvas->Refresh();
412}
413
414
416{
417 // Only update in OpenGL for an interactive interaction
418 if( m_boardAdapter.m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
419 m_canvas->Request_refresh( true );
420}
421
422
424{
425 if( m_boardAdapter.m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
427 else
428 NewDisplay( true );
429}
430
431
432void EDA_3D_VIEWER_FRAME::Exit3DFrame( wxCommandEvent &event )
433{
434 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::Exit3DFrame" ) );
435
436 Close( true );
437}
438
439
440void EDA_3D_VIEWER_FRAME::OnCloseWindow( wxCloseEvent &event )
441{
442 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::OnCloseWindow" ) );
443
444 // Do not show the layer manager during closing to avoid flicker on some platforms (Windows)
445 // that generate useless redraw of items in the Layer Manager
446 if( m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown() )
447 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
448
449 if( m_canvas )
450 m_canvas->Close();
451
452 Destroy();
453 event.Skip( true );
454}
455
456
458{
459 int id = event.GetId();
460 bool isChecked = event.IsChecked();
461
462 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::Process_Special_Functions id %d "
463 "isChecked %d" ),
464 id,
465 isChecked );
466
467 if( m_canvas == nullptr )
468 return;
469
470 switch( id )
471 {
473 {
476
477 cfg->ResetToDefaults();
478 LoadSettings( cfg );
479
480 // Tell canvas that we (may have) changed the render engine
482
483 NewDisplay( true );
484 }
485 return;
486
487 default:
488 wxFAIL_MSG( wxT( "Invalid event in EDA_3D_VIEWER_FRAME::Process_Special_Functions()" ) );
489 return;
490 }
491}
492
493
494void EDA_3D_VIEWER_FRAME::onDisableRayTracing( wxCommandEvent& aEvent )
495{
496 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ),
497 __WXFUNCTION__ );
498
500 m_boardAdapter.m_Cfg->m_Render.engine = RENDER_ENGINE::OPENGL;
501}
502
503
504void EDA_3D_VIEWER_FRAME::OnActivate( wxActivateEvent &aEvent )
505{
506 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::OnActivate" ) );
507
508 if( aEvent.GetActive() && m_canvas )
509 {
510 // Reload data if 3D frame shows a board,
511 // because it can be changed since last frame activation
514
515 // Activates again the focus of the canvas so it will catch mouse and key events
516 m_canvas->SetFocus();
517 }
518
519 if( m_spaceMouse )
520 m_spaceMouse->SetFocus( aEvent.GetActive() );
521
522 aEvent.Skip(); // required under wxMAC
523}
524
525
526void EDA_3D_VIEWER_FRAME::OnSetFocus( wxFocusEvent& aEvent )
527{
528 // Activates again the focus of the canvas so it will catch mouse and key events
529 if( m_canvas )
530 m_canvas->SetFocus();
531
532 aEvent.Skip();
533}
534
535
537{
539
540 // Dynamic_cast here will fail on Mac when called from CvPCB.
541 EDA_3D_VIEWER_SETTINGS* cfg = static_cast<EDA_3D_VIEWER_SETTINGS*>( aCfg );
542
543 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::LoadSettings" ) );
544
545 if( cfg )
546 {
547 applySettings( cfg );
548
549 if( !GetBoard()->GetProject() )
550 GetBoard()->SetProject( &Prj() );
551
553
554 // When opening the 3D viewer, we use the OpenGL mode, never the ray tracing engine
555 // because the ray tracing is very time consuming, and can be seen as not working
556 // (freeze window) with large boards.
557 m_boardAdapter.m_Cfg->m_Render.engine = RENDER_ENGINE::OPENGL;
558
560 {
561 wxString legacyColorsPresetName = _( "legacy colors" );
562
563 cfg->m_UseStackupColors = false;
564
565 if( !cfg->FindPreset( legacyColorsPresetName ) )
566 {
567 cfg->m_LayerPresets.emplace_back( legacyColorsPresetName,
568 GetAdapter().GetDefaultVisibleLayers(),
569 GetAdapter().GetDefaultColors() );
570 }
571
573 }
574
575 m_boardAdapter.InitSettings( nullptr, nullptr );
576
579 }
580}
581
582
584{
587
589
590 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::SaveSettings" ) );
591
592 wxLogTrace( m_logTrace, m_boardAdapter.m_Cfg->m_Render.engine == RENDER_ENGINE::RAYTRACING ?
593 wxT( "EDA_3D_VIEWER_FRAME::SaveSettings render setting Ray Trace" )
594 :
595 wxT( "EDA_3D_VIEWER_FRAME::SaveSettings render setting OpenGL" ) );
596
597 if( cfg )
598 {
600
604
605 if( EDA_3D_CONTROLLER* ctrlTool = GetToolManager()->GetTool<EDA_3D_CONTROLLER>() )
606 cfg->m_Camera.rotation_increment = ctrlTool->GetRotationIncrement();
607 }
608}
609
610
612{
613 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::CommonSettingsChanged" ) );
614
615 // Regen menu bars, etc
617
620 Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" ) );
621
623
624 NewDisplay( true );
625}
626
627
629{
631
632 SetTitle( _( "3D Viewer" ) );
634
636 {
637 wxAuiPaneInfo& lm_pane_info = m_auimgr.GetPane( m_appearancePanel );
638 lm_pane_info.Caption( _( "Appearance" ) );
639 }
640
641 SetStatusText( wxEmptyString, ACTIVITY );
642 SetStatusText( wxEmptyString, HOVERED_ITEM );
643}
644
645
647{
650 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( "LayersManager" );
651
652 // show auxiliary Vertical layers and visibility manager toolbar
654
655 layersManager.Show( cfg->m_AuiPanels.show_layer_manager );
656
658 {
659 SetAuiPaneSize( m_auimgr, layersManager, cfg->m_AuiPanels.right_panel_width, -1 );
660 }
661 else
662 {
664 m_auimgr.Update();
665 }
666}
667
668
670{
673}
674
675
677{
678 wxString fullFileName;
679 bool fmt_is_jpeg = false;
680
681 if( aFormat == EDA_3D_VIEWER_EXPORT_FORMAT::JPEG )
682 fmt_is_jpeg = true;
683
684 if( aFormat != EDA_3D_VIEWER_EXPORT_FORMAT::CLIPBOARD )
685 {
686 // Remember path between saves during this session only.
687 const wxString wildcard =
689 const wxString ext = fmt_is_jpeg ? FILEEXT::JpegFileExtension : FILEEXT::PngFileExtension;
690
691 // First time path is set to the project path.
694
696
697 wxFileDialog dlg( this, _( "3D Image File Name" ),
699 m_defaultSaveScreenshotFileName.GetFullName(), wildcard,
700 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
701
702 if( dlg.ShowModal() == wxID_CANCEL )
703 return;
704
705 m_defaultSaveScreenshotFileName = dlg.GetPath();
706
707 if( m_defaultSaveScreenshotFileName.GetExt().IsEmpty() )
709
710 fullFileName = m_defaultSaveScreenshotFileName.GetFullPath();
711
712 wxFileName fn = fullFileName;
713
714 if( !fn.IsDirWritable() )
715 {
716 wxString msg;
717
718 msg.Printf( _( "Insufficient permissions to save file '%s'." ), fullFileName );
719 wxMessageBox( msg, _( "Error" ), wxOK | wxICON_ERROR, this );
720 return;
721 }
722
723 // Be sure the screen area destroyed by the file dialog is redrawn
724 // before making a screen copy.
725 // Without this call, under Linux the screen refresh is made to late.
726 wxYield();
727 }
728
729 // Be sure we have the latest 3D view (remember 3D view is buffered)
730 // Also ensure any highlighted item is not highlighted when creating screen shot
732 bool allow_highlight = cfg.highlight_on_rollover;
733 cfg.highlight_on_rollover = false;
734
735 m_canvas->DoRePaint(); // init first buffer
736 m_canvas->DoRePaint(); // init second buffer
737
738 // Build image from the 3D buffer
739 wxWindowUpdateLocker noUpdates( this );
740
741 wxImage screenshotImage;
742
743 if( m_canvas )
744 m_canvas->GetScreenshot( screenshotImage );
745
746 cfg.highlight_on_rollover = allow_highlight;
747
748 if( aFormat == EDA_3D_VIEWER_EXPORT_FORMAT::CLIPBOARD )
749 {
750 wxBitmap bitmap( screenshotImage );
751
752 wxLogNull doNotLog; // disable logging of failed clipboard actions
753
754 if( wxTheClipboard->Open() )
755 {
756 wxBitmapDataObject* dobjBmp = new wxBitmapDataObject( bitmap );
757
758 if( !wxTheClipboard->SetData( dobjBmp ) )
759 wxMessageBox( _( "Failed to copy image to clipboard" ) );
760
761 wxTheClipboard->Flush(); /* the data in clipboard will stay
762 * available after the application exits */
763 wxTheClipboard->Close();
764 }
765 }
766 else
767 {
768 if( !screenshotImage.SaveFile( fullFileName,
769 fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
770 wxMessageBox( _( "Can't save file" ) );
771
772 screenshotImage.Destroy();
773 }
774}
775
776
778{
779 wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::RenderEngineChanged()" ) );
780
781 if( m_canvas )
783}
784
785
787{
788 wxCHECK_RET( m_canvas, wxT( "Cannot load settings to null canvas" ) );
789
790 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
791
792 // TODO(JE) use all control options
794}
795
796
798{
799 m_boardAdapter.m_Cfg = cfg;
800
804
806}
@ ID_DISABLE_RAY_TRACING
Definition: 3d_viewer_id.h:43
@ ID_START_COMMAND_3D
Definition: 3d_viewer_id.h:36
@ ID_MENU_COMMAND_END
Definition: 3d_viewer_id.h:41
@ ID_MENU3D_RESET_DEFAULTS
Definition: 3d_viewer_id.h:38
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
#define RANGE_SCALE_3D
This defines the range that all coord will have to be rendered.
Definition: board_adapter.h:66
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
std::vector< VIEWPORT3D > GetUserViewports() const
Return a list of viewports created by the user.
void ApplyViewport(const wxString &aPresetName)
const wxArrayString & GetViewportsMRU()
void ApplyLayerPreset(const wxString &aPresetName)
const wxArrayString & GetLayerPresetsMRU()
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
void InitSettings(REPORTER *aStatusReporter, REPORTER *aWarningReporter)
Function to be called by the render when it need to reload the settings for the board.
void SetBoard(BOARD *aBoard) noexcept
Set current board to be rendered.
EDA_3D_VIEWER_SETTINGS * m_Cfg
bool m_MousewheelPanning
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition: board.cpp:195
PROJECTION_TYPE GetProjection()
Definition: camera.h:205
Handle actions that are shared between different applications.
int ShowModal() override
EDA_3D_ACTIONS.
static TOOL_ACTION showLayersManager
static TOOL_ACTION showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION noGrid
static TOOL_ACTION show2_5mmGrid
static TOOL_ACTION show1mmGrid
static TOOL_ACTION showDNP
static TOOL_ACTION toggleOrtho
static TOOL_ACTION show10mmGrid
static TOOL_ACTION toggleRaytacing
static TOOL_ACTION show5mmGrid
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION showBBoxes
static TOOL_ACTION showAxis
Implement a canvas based on a wxGLCanvas.
Definition: eda_3d_canvas.h:51
int GetMovingSpeedMultiplier() const
void SetProjectionMode(int aMode)
void SetAnimationEnabled(bool aEnable)
Enable or disable camera animation when switching to a pre-defined view.
int GetProjectionMode() const
void DoRePaint()
The actual function to repaint the canvas.
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
bool IsReloadRequestPending() const
Query if there is a pending reload request.
Definition: eda_3d_canvas.h:93
bool GetAnimationEnabled() const
void ReloadRequest(BOARD *aBoard=nullptr, S3D_CACHE *aCachePointer=nullptr)
void GetScreenshot(wxImage &aDstImage)
Request a screenshot and output it to the aDstImage.
void SetMovingSpeedMultiplier(int aMultiplier)
Set the camera animation moving speed multiplier option.
void RenderEngineChanged()
Notify that the render engine was changed.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
Handle view actions for various 3D canvases.
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void OnSetFocus(wxFocusEvent &event)
void onDisableRayTracing(wxCommandEvent &aEvent)
void CommonSettingsChanged(int aFlags) override
Notification that common settings are updated.
void applySettings(EDA_3D_VIEWER_SETTINGS *aSettings)
PCB_BASE_FRAME * Parent() const
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void NewDisplay(bool aForceImmediateRedraw=false)
Reload and refresh (rebuild) the 3D scene.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void OnActivate(wxActivateEvent &event)
bool TryBefore(wxEvent &aEvent) override
EDA_3D_CANVAS * m_canvas
void Exit3DFrame(wxCommandEvent &event)
Called when user press the File->Exit.
BOARD_ADAPTER m_boardAdapter
std::unique_ptr< NL_3D_VIEWER_PLUGIN > m_spaceMouse
void RenderEngineChanged()
RenderEngineChanged - Update toolbar icon and call canvas RenderEngineChanged.
void Process_Special_Functions(wxCommandEvent &event)
void OnCloseWindow(wxCloseEvent &event)
void ShowChangedLanguage() override
void ReloadRequest()
Request reloading the 3D view.
wxFileName m_defaultSaveScreenshotFileName
BOARD_ADAPTER & GetAdapter()
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void loadCommonSettings()
Load configuration from common settings.
void TakeScreenshot(EDA_3D_VIEWER_EXPORT_FORMAT aFormat)
Create a Screenshot of the current 3D view.
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
Toolbar configuration for the 3D viewer.
Definition: toolbars_3d.h:29
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
APPEARANCE_CONTROLS_3D * m_appearancePanel
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
SETTINGS_MANAGER * GetSettingsManager() const
wxAuiManager m_auimgr
virtual void RecreateToolbars()
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
static KIGFX::VC_SETTINGS GetVcSettings()
Gets a populated View Controls settings object dervived from our program settings.
Specialization of the wxAuiPaneInfo class for KiCad panels.
int GetSelection() const
void SetVcSettings(const KIGFX::VC_SETTINGS &aVcSettings)
void ResetToDefaults()
Resets all parameters to default values.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:285
static const wxGLAttributes GetAttributesList(ANTIALIASING_MODE aAntiAliasingMode, bool aAlpha=false)
Get a list of attributes to pass to wxGLCanvas.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:687
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
std::vector< VIEWPORT3D > m_Viewports3D
List of stored viewports (pos + zoom)
Definition: project_file.h:198
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
Definition: project_pcb.cpp:77
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition: project.cpp:140
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:203
T * GetToolbarSettings(const wxString &aFilename)
Return a handle to the given toolbar settings.
T * GetAppSettings(const wxString &aFilename)
Return a handle to the a given settings by type.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:171
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
Master controller class:
Definition: tool_manager.h:62
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:306
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:76
#define _HKI(x)
#define _(s)
#define GridSizeCheck(x)
EVT_TOOL_RANGE(ID_START_COMMAND_3D, ID_MENU_COMMAND_END, EDA_3D_VIEWER_FRAME::Process_Special_Functions) EDA_3D_VIEWER_FRAME
Declaration of the eda_3d_viewer class.
EDA_3D_VIEWER_EXPORT_FORMAT
@ ACTIVITY
@ HOVERED_ITEM
#define FOLLOW_PLOT_SETTINGS
#define LEGACY_PRESET_FLAG
#define FOLLOW_PCB
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
#define VIEWPORT_SWITCH_KEY
#define PRESET_SWITCH_KEY
@ FRAME_PCB_DISPLAY3D
Definition: frame_type.h:47
static const std::string JpegFileExtension
static const std::string PngFileExtension
static wxString PngFileWildcard()
static wxString JpegFileWildcard()
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
PROJECT & Prj()
Definition: kicad.cpp:597
Declaration of the NL_3D_VIEWER_PLUGIN class.
ANTIALIASING_MODE
Anti-aliasing options.
Definition: ogl_attr_list.h:37
BOARD * GetBoard()
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
ACTION_CONDITIONS & Check(const SELECTION_CONDITION &aCondition)
Definition of file extensions used in Kicad.
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.