26#include <wx/filename.h>
29#include <wx/wupdlock.h>
30#include <wx/clipbrd.h>
31#include <wx/filedlg.h>
90 const wxString& aTitle,
long style ) :
93 m_mainToolBar(
nullptr ),
95 m_currentCamera( m_trackBallCamera ),
97 m_spaceMouse(
nullptr )
99 wxLogTrace( m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
101 m_disable_ray_tracing =
false;
102 m_aboutTitle =
_HKI(
"KiCad 3D Viewer" );
110 static const int status_dims[5] = { -1, 170, 130, 130, 130 };
112 wxStatusBar *status_bar = CreateStatusBar(
arrayDim( status_dims ) );
113 SetStatusWidths(
arrayDim( status_dims ), status_dims );
126 loadCommonSettings();
128 m_appearancePanel->SetUserViewports(
Prj().GetProjectFile().m_Viewports3D );
136 m_canvas->SetEventDispatcher( m_toolDispatcher );
141 m_toolManager->InitTools();
145 if(
EDA_3D_CONTROLLER* ctrlTool = GetToolManager()->GetTool<EDA_3D_CONTROLLER>() )
149 m_toolManager->InvokeTool(
"3DViewer.Control" );
152 ReCreateMainToolbar();
154 m_infoBar =
new WX_INFOBAR(
this, &m_auimgr );
156 m_auimgr.SetManagedWindow(
this );
158 m_auimgr.AddPane( m_mainToolBar,
EDA_PANE().HToolbar().Name( wxS(
"MainToolbar" ) )
160 m_auimgr.AddPane( m_infoBar,
EDA_PANE().InfoBar().Name( wxS(
"InfoBar" ) )
162 m_auimgr.AddPane( m_appearancePanel,
EDA_PANE().Name(
"LayersManager" )
164 .Caption(
_(
"Appearance" ) ).PaneBorder(
false )
165 .MinSize( 180, -1 ).BestSize( 190, -1 ) );
166 m_auimgr.AddPane( m_canvas,
EDA_PANE().Canvas().Name( wxS(
"DrawFrame" ) )
169 wxAuiPaneInfo& layersManager = m_auimgr.GetPane(
"LayersManager" );
181 m_auimgr.GetPane( wxS(
"InfoBar" ) ).Hide();
184 m_canvas->SetInfoBar( m_infoBar );
185 m_canvas->SetStatusBar( status_bar );
191 catch(
const std::system_error& e )
193 wxLogTrace( wxT(
"KI_TRACE_NAVLIB" ), e.what() );
199 m_canvas->SetFocus();
223#define GridSizeCheck( x ) ACTION_CONDITIONS().Check( cond.GridSize( x ) )
245 auto show_NotInPosfile =
303 static bool s_presetSwitcherShown =
false;
304 static bool s_viewportSwitcherShown =
false;
311 if( wxGetKeyState( WXK_TAB ) )
313 if( ( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
314 &&
static_cast<wxKeyEvent&
>( aEvent ).GetKeyCode() == WXK_TAB )
325 for( wxString& str : mru )
328 str =
_(
"Follow PCB Editor" );
330 str =
_(
"Follow PCB Plot Settings" );
335 s_presetSwitcherShown =
true;
336 switcher.ShowModal();
337 s_presetSwitcherShown =
false;
341 if( idx >= 0 && idx < (
int) mru.size() )
353 if( this->IsActive() )
357 if( viewportMRU.size() > 0 )
361 s_viewportSwitcherShown =
true;
362 switcher.ShowModal();
363 s_viewportSwitcherShown =
false;
367 if( idx >= 0 && idx < (
int) viewportMRU.size() )
376 return wxFrame::TryBefore( aEvent );
407 if(
m_canvas && aForceImmediateRedraw )
431 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::Exit3DFrame" ) );
439 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnCloseWindow" ) );
444 if(
m_auimgr.GetPane( wxS(
"LayersManager" ) ).IsShown() )
445 m_auimgr.GetPane( wxS(
"LayersManager" ) ).Show(
false );
457 int id =
event.GetId();
458 bool isChecked =
event.IsChecked();
460 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::Process_Special_Functions id %d "
494 wxFAIL_MSG( wxT(
"Invalid event in EDA_3D_VIEWER_FRAME::Process_Special_Functions()" ) );
505 if( old_engine == RENDER_ENGINE::OPENGL )
506 engine = RENDER_ENGINE::RAYTRACING;
508 engine = RENDER_ENGINE::OPENGL;
510 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnRenderEngineSelection type %s " ),
511 engine == RENDER_ENGINE::RAYTRACING ? wxT(
"raytracing" ) : wxT(
"realtime" ) );
513 if( old_engine != engine )
520 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ),
530 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnActivate" ) );
532 if( aEvent.GetActive() &&
m_canvas )
567 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::LoadSettings" ) );
588 wxString legacyColorsPresetName =
_(
"legacy colors" );
590 if( !cfg->
FindPreset( legacyColorsPresetName ) )
617 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings" ) );
620 wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings render setting Ray Trace" )
622 wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings render setting OpenGL" ) );
633 cfg->m_Camera.rotation_increment = ctrlTool->GetRotationIncrement();
640 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::CommonSettingsChanged" ) );
661 SetTitle(
_(
"3D Viewer" ) );
667 lm_pane_info.Caption(
_(
"Appearance" ) );
672 SetStatusText( wxEmptyString,
ACTIVITY );
681 wxAuiPaneInfo& layersManager =
m_auimgr.GetPane(
"LayersManager" );
709 wxString fullFileName;
710 bool fmt_is_jpeg =
false;
727 wxFileDialog dlg(
this,
_(
"3D Image File Name" ),
730 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
732 if( dlg.ShowModal() == wxID_CANCEL )
742 wxFileName fn = fullFileName;
744 if( !fn.IsDirWritable() )
748 msg.Printf(
_(
"Insufficient permissions to save file '%s'." ), fullFileName );
749 wxMessageBox( msg,
_(
"Error" ), wxOK | wxICON_ERROR,
this );
764 wxWindowUpdateLocker noUpdates(
this );
766 wxImage screenshotImage;
773 wxBitmap bitmap( screenshotImage );
777 if( wxTheClipboard->Open() )
779 wxBitmapDataObject* dobjBmp =
new wxBitmapDataObject( bitmap );
781 if( !wxTheClipboard->SetData( dobjBmp ) )
782 wxMessageBox(
_(
"Failed to copy image to clipboard" ) );
784 wxTheClipboard->Flush();
786 wxTheClipboard->Close();
791 if( !screenshotImage.SaveFile( fullFileName,
792 fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
793 wxMessageBox(
_(
"Can't save file" ) );
795 screenshotImage.Destroy();
802 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::RenderEngineChanged()" ) );
811 wxCHECK_RET(
m_canvas, wxT(
"Cannot load settings to null canvas" ) );
RENDER_ENGINE
Render engine mode.
@ ID_TOOL_SCREENCOPY_TOCLIBBOARD
@ ID_MENU3D_RESET_DEFAULTS
@ ID_MENU_SCREENCOPY_JPEG
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
constexpr EDA_IU_SCALE unityScale
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
#define RANGE_SCALE_3D
This defines the range that all coord will have to be rendered.
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...
void CommonSettingsChanged()
std::vector< VIEWPORT3D > GetUserViewports() const
Update the current viewports from those saved in the project file.
void ApplyViewport(const wxString &aPresetName)
const wxArrayString & GetViewportsMRU()
void ApplyLayerPreset(const wxString &aPresetName)
const wxArrayString & GetLayerPresetsMRU()
Return a list of viewports created by the user.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
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
PROJECTION_TYPE GetProjection()
Handle actions that are shared between different applications.
Class to handle configuration and automatic determination of the DPI scale to use for canvases.
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 show5mmGrid
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION showBBoxes
static TOOL_ACTION showAxis
Implement a canvas based on a wxGLCanvas.
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 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.
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.
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 takeScreenshot(wxCommandEvent &event)
Create a Screenshot of the current 3D view.
BOARD_ADAPTER & GetAdapter() override
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.
bool m_disable_ray_tracing
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
void Exit3DFrame(wxCommandEvent &event)
Called when user press the File->Exit.
BOARD_ADAPTER m_boardAdapter
void ToggleAppearanceManager()
void RenderEngineChanged()
RenderEngineChanged - Update toolbar icon and call canvas RenderEngineChanged.
void Process_Special_Functions(wxCommandEvent &event)
void OnCloseWindow(wxCloseEvent &event)
void ReCreateMainToolbar()
void ShowChangedLanguage() override
void ReloadRequest()
Request reloading the 3D view.
wxFileName m_defaultSaveScreenshotFileName
void onRenderEngineSelection(wxCommandEvent &event)
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
NL_3D_VIEWER_PLUGIN * m_spaceMouse
void loadCommonSettings()
Load configuration from common settings.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification that common settings are updated.
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
APPEARANCE_CONTROLS_3D * m_appearancePanel
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
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
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.
void SetScaleFactor(double aFactor)
Set the canvas scale factor, probably for a hi-DPI display.
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.
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...
The class that implements the public interface to the SpaceMouse plug-in.
void SetFocus(bool aFocus=true)
Set the connection to the 3Dconnexion driver to the focus state so that 3DMouse data is routed here.
static const int * GetAttributesList(ANTIALIASING_MODE aAntiAliasingMode)
Get a list of attributes to pass to wxGLCanvas.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
std::vector< VIEWPORT3D > m_Viewports3D
List of stored viewports (pos + zoom)
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual PROJECT_FILE & GetProjectFile() const
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
A modified version of the wxInfoBar class that allows us to:
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.
#define FOLLOW_PLOT_SETTINGS
#define LEGACY_PRESET_FLAG
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
#define VIEWPORT_SWITCH_KEY
#define PRESET_SWITCH_KEY
const std::string JpegFileExtension
const std::string PngFileExtension
wxString PngFileWildcard()
wxString JpegFileWildcard()
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
Declaration of the NL_3D_VIEWER_PLUGIN class.
ANTIALIASING_MODE
Anti-aliasing options.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
double rotation_increment
int moving_speed_multiplier
bool show_footprints_normal
ANTIALIASING_MODE opengl_AA_mode
bool show_footprints_virtual
bool show_footprints_not_in_posfile
bool show_footprints_insert
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.