26#include <wx/filename.h> 
   29#include <wx/wupdlock.h> 
   30#include <wx/clipbrd.h> 
   31#include <wx/filedlg.h> 
   97                                          const wxString& aTitle, 
long style ) :
 
  101        m_currentCamera( m_trackBallCamera ),
 
  104    wxLogTrace( m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
 
  106    m_disable_ray_tracing = 
false;
 
  107    m_aboutTitle = 
_HKI( 
"KiCad 3D Viewer" );
 
  115    static const int status_dims[5] = { -1, 170, 130, 130, 130 };
 
  117    wxStatusBar *status_bar = CreateStatusBar( 
arrayDim( status_dims ) );
 
  118    SetStatusWidths( 
arrayDim( status_dims ), status_dims );
 
  132    loadCommonSettings();
 
  134    m_appearancePanel->SetUserViewports( 
Prj().GetProjectFile().m_Viewports3D );
 
  143    m_canvas->SetEventDispatcher( m_toolDispatcher );
 
  148    m_toolManager->InitTools();
 
  152    if( 
EDA_3D_CONTROLLER* ctrlTool = GetToolManager()->GetTool<EDA_3D_CONTROLLER>() )
 
  156    m_toolManager->InvokeTool( 
"3DViewer.Control" );
 
  164    m_infoBar = 
new WX_INFOBAR( 
this, &m_auimgr );
 
  166    m_auimgr.SetManagedWindow( 
this );
 
  168    m_auimgr.AddPane( m_tbTopMain, 
EDA_PANE().HToolbar().Name( wxS( 
"TopMainToolbar" ) )
 
  170    m_auimgr.AddPane( m_infoBar, 
EDA_PANE().InfoBar().Name( wxS( 
"InfoBar" ) )
 
  172    m_auimgr.AddPane( m_appearancePanel, 
EDA_PANE().Name( 
"LayersManager" )
 
  174                      .Caption( 
_( 
"Appearance" ) ).PaneBorder( 
false )
 
  175                      .MinSize( 180, -1 ).BestSize( 190, -1 ) );
 
  176    m_auimgr.AddPane( m_canvas, 
EDA_PANE().Canvas().Name( wxS( 
"DrawFrame" ) )
 
  179    wxAuiPaneInfo& layersManager = m_auimgr.GetPane( 
"LayersManager" );
 
  192    m_auimgr.GetPane( wxS( 
"InfoBar" ) ).Hide();
 
  195    m_canvas->SetInfoBar( m_infoBar );
 
  196    m_canvas->SetStatusBar( status_bar );
 
  201        m_spaceMouse = std::make_unique<SPNAV_VIEWER_PLUGIN>( m_canvas );
 
  203        m_spaceMouse = std::make_unique<NL_3D_VIEWER_PLUGIN>( m_canvas );
 
  206    catch( 
const std::system_error& e )
 
  208        wxLogTrace( wxT( 
"KI_TRACE_NAVLIB" ), e.what() );
 
  214    m_canvas->SetFocus();
 
 
  222    m_canvas->SetEventDispatcher( 
nullptr );
 
 
  236#define GridSizeCheck( x ) ACTION_CONDITIONS().Check( cond.GridSize( x ) ) 
  258    auto show_NotInPosfile =
 
  261                return m_boardAdapter.m_Cfg->m_Render.show_footprints_not_in_posfile;
 
 
  318    static bool s_presetSwitcherShown = 
false;
 
  319    static bool s_viewportSwitcherShown = 
false;
 
  326    if( wxGetKeyState( WXK_TAB ) )
 
  328    if( ( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
 
  329            && 
static_cast<wxKeyEvent&
>( aEvent ).GetKeyCode() == WXK_TAB )
 
  340                    for( wxString& str : mru )
 
  343                            str = 
_( 
"Follow PCB Editor" );
 
  345                            str = 
_( 
"Follow PCB Plot Settings" );
 
  350                    s_presetSwitcherShown = 
true;
 
  352                    s_presetSwitcherShown = 
false;
 
  356                    if( idx >= 0 && idx < (
int) mru.size() )
 
  368            if( this->IsActive() )
 
  372                if( viewportMRU.size() > 0 )
 
  376                    s_viewportSwitcherShown = 
true;
 
  378                    s_viewportSwitcherShown = 
false;
 
  382                    if( idx >= 0 && idx < (
int) viewportMRU.size() )
 
  391    return wxFrame::TryBefore( aEvent );
 
 
  423    if( 
m_canvas && aForceImmediateRedraw )
 
 
  447    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::Exit3DFrame" ) );
 
 
  455    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::OnCloseWindow" ) );
 
  459    if( 
m_auimgr.GetPane( wxS( 
"LayersManager" ) ).IsShown() )
 
  460        m_auimgr.GetPane( wxS( 
"LayersManager" ) ).Show( 
false );
 
 
  475    switch( event.GetId() )
 
  482            cfg->ResetToDefaults();
 
  493        wxFAIL_MSG( wxT( 
"Invalid event in EDA_3D_VIEWER_FRAME::Process_Special_Functions()" ) );
 
 
  501    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ), __WXFUNCTION__ );
 
 
  510    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::OnActivate" ) );
 
  512    if( aEvent.GetActive() && 
m_canvas )
 
  516        if( 
m_canvas->IsReloadRequestPending() )
 
 
  547    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::LoadSettings" ) );
 
  562            wxString legacyColorsPresetName = 
_( 
"legacy colors" );
 
  566            if( !cfg->
FindPreset( legacyColorsPresetName ) )
 
 
  592        cfg->m_Camera.animation_enabled       = 
m_canvas->GetAnimationEnabled();
 
  593        cfg->m_Camera.moving_speed_multiplier = 
m_canvas->GetMovingSpeedMultiplier();
 
  594        cfg->m_Camera.projection_mode         = 
m_canvas->GetProjectionMode();
 
  597            cfg->m_Camera.rotation_increment = ctrlTool->GetRotationIncrement();
 
 
  604    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::CommonSettingsChanged" ) );
 
 
  622    SetTitle( 
_( 
"3D Viewer" ) );
 
  628        lm_pane_info.Caption( 
_( 
"Appearance" ) );
 
  631    SetStatusText( wxEmptyString, 
ACTIVITY );
 
 
  638    wxAuiPaneInfo& layersManager = 
m_auimgr.GetPane( 
"LayersManager" );
 
  643        cfg->m_AuiPanels.show_layer_manager = !cfg->m_AuiPanels.show_layer_manager;
 
  645        layersManager.Show( cfg->m_AuiPanels.show_layer_manager );
 
  647        if( cfg->m_AuiPanels.show_layer_manager )
 
 
  669    wxString fullFileName;
 
  679    if( screenshotImage.IsOk() )
 
 
  697    wxImage screenshotImage;
 
  702        wxWindowUpdateLocker noUpdates( 
this );
 
  703        m_canvas->GetScreenshot( screenshotImage );
 
  709    return screenshotImage;
 
 
  715    wxString fullFileName;
 
  725    if( screenshotImage.IsOk() )
 
 
  745    wxFileDialog dlg( 
this, 
_( 
"3D Image File Name" ),
 
  748                      wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
  753    if( dlg.ShowModal() == wxID_CANCEL )
 
  761    bool formatDetected = 
false;
 
  763    if( fileExt == wxT(
"jpg") || fileExt == wxT(
"jpeg") )
 
  766        formatDetected = 
true;
 
  768    else if( fileExt == wxT(
"png") )
 
  771        formatDetected = 
true;
 
  775    if( !formatDetected )
 
  777        int filterIndex = dlg.GetFilterIndex();
 
  788    aFormat = detectedFormat;
 
  793    if( !fn.IsDirWritable() )
 
  796        msg.Printf( 
_( 
"Insufficient permissions to save file '%s'." ),
 
  798        wxMessageBox( msg, 
_( 
"Error" ), wxOK | wxICON_ERROR, 
this );
 
 
  815    auto configRestorer = std::unique_ptr<void, std::function<void(
void*)>>(
 
  816        reinterpret_cast<void*
>(1),
 
 
  835        aAdapter.
m_Cfg = cfg;
 
 
  850    while( raytrace.
Redraw( 
false, 
nullptr, 
nullptr ) );
 
  852    uint8_t* rgbaBuffer = raytrace.
GetBuffer();
 
 
  864    const unsigned int wxh = aRealSize.x * aRealSize.y;
 
  866    unsigned char* rgbBuffer   = (
unsigned char*) malloc( wxh * 3 );
 
  867    unsigned char* alphaBuffer = (
unsigned char*) malloc( wxh );
 
  869    unsigned char* rgbaPtr  = aRGBABuffer;
 
  870    unsigned char* rgbPtr   = rgbBuffer;
 
  871    unsigned char* alphaPtr = alphaBuffer;
 
  873    for( 
int y = 0; y < aRealSize.y; y++ )
 
  875        for( 
int x = 0; x < aRealSize.x; x++ )
 
  877            rgbPtr[0]   = rgbaPtr[0];
 
  878            rgbPtr[1]   = rgbaPtr[1];
 
  879            rgbPtr[2]   = rgbaPtr[2];
 
  880            alphaPtr[0] = rgbaPtr[3];
 
  888    wxImage screenshotImage;
 
  889    screenshotImage.Create( aRealSize );
 
  890    screenshotImage.SetData( rgbBuffer );
 
  891    screenshotImage.SetAlpha( alphaBuffer );
 
  892    return screenshotImage.Mirror( 
false );
 
 
  902    wxFrame temp( 
this, wxID_ANY, wxEmptyString, wxDefaultPosition, aSize, wxFRAME_NO_TASKBAR );
 
  910    auto canvas = std::make_unique<EDA_3D_CANVAS>( &temp,
 
  912                                               tempadapter, aCamera,
 
  915    canvas->SetSize( aSize );
 
  917    wxWindowUpdateLocker noUpdates( 
this );
 
  926    std::vector<unsigned char> buffer(aSize.x * aSize.y * 4); 
 
  927    canvas->RenderToFrameBuffer( buffer.data(), aSize.x, aSize.y );
 
 
  966    wxBitmap bitmap( aScreenshotImage );
 
  969    if( wxTheClipboard->Open() )
 
  971        wxBitmapDataObject* dobjBmp = 
new wxBitmapDataObject( bitmap );
 
  973        if( !wxTheClipboard->SetData( dobjBmp ) )
 
  974            wxMessageBox( 
_( 
"Failed to copy image to clipboard" ) );
 
  976        wxTheClipboard->Flush();
 
  977        wxTheClipboard->Close();
 
 
  986    if( !aScreenshotImage.SaveFile( aFullFileName, fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
 
  988        wxMessageBox( 
_( 
"Can't save file" ) );
 
 
  995    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_VIEWER_FRAME::RenderEngineChanged()" ) );
 
 
 1004    wxCHECK_RET( 
m_canvas, wxT( 
"Cannot load settings to null canvas" ) );
 
 
@ ID_MENU3D_RESET_DEFAULTS
 
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...
 
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
 
Helper class to handle information needed to display 3D board.
 
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
 
void Set3dCacheManager(S3D_CACHE *aCacheMgr) noexcept
Update the cache manager pointer.
 
S3D_CACHE * Get3dCacheManager() const noexcept
 
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
 
Handle actions that are shared between different applications.
 
static TOOL_ACTION showNavigator
 
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
 
Implement a canvas based on a wxGLCanvas.
 
Handle view actions for various 3D canvases.
 
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
 
void saveOrCopyImage(const wxImage &screenshotImage, EDA_3D_VIEWER_EXPORT_FORMAT aFormat, const wxString &fullFileName)
Save image to file or copy to clipboard based on format.
 
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 configureCanvas(std::unique_ptr< EDA_3D_CANVAS > &canvas, EDA_3D_VIEWER_SETTINGS *cfg)
Configure canvas settings for screenshot capture.
 
bool m_disable_ray_tracing
 
wxImage captureOpenGLScreenshot(BOARD_ADAPTER &adapter, TRACK_BALL &camera, const wxSize &aSize)
Capture screenshot using OpenGL renderer.
 
bool getExportFileName(EDA_3D_VIEWER_EXPORT_FORMAT &aFormat, wxString &fullFileName)
Get export filename through file dialog.
 
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()
 
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)
 
wxImage captureCurrentViewScreenshot()
Capture screenshot of the current view using the configured renderer.
 
void OnCloseWindow(wxCloseEvent &event)
 
void ShowChangedLanguage() override
 
wxImage captureScreenshot(const wxSize &aSize)
Capture screenshot using appropriate rendering method.
 
void setupRenderingConfig(BOARD_ADAPTER &adapter)
Setup rendering configuration for screenshot capture.
 
void ReloadRequest()
Request reloading the 3D view.
 
wxFileName m_defaultSaveScreenshotFileName
 
wxImage convertRGBAToImage(uint8_t *rgbaBuffer, const wxSize &realSize)
Convert RGBA buffer to wxImage format.
 
TRACK_BALL m_trackBallCamera
 
BOARD_ADAPTER & GetAdapter()
 
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
 
void saveImageToFile(const wxImage &screenshotImage, EDA_3D_VIEWER_EXPORT_FORMAT aFormat, const wxString &fullFileName)
Save image to file.
 
void copyImageToClipboard(const wxImage &screenshotImage)
Copy image to system clipboard.
 
void loadCommonSettings()
Load configuration from common settings.
 
void ExportImage(EDA_3D_VIEWER_EXPORT_FORMAT aFormat, const wxSize &aSize)
Export 3D viewer image to file or clipboard.
 
wxImage captureRaytracingScreenshot(BOARD_ADAPTER &adapter, TRACK_BALL &camera, const wxSize &aSize)
Capture screenshot using raytracing renderer.
 
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
 
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.
 
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.
 
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...
 
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
 
virtual SETTINGS_MANAGER & GetSettingsManager() const
 
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
 
bool Redraw(bool aIsMoving, REPORTER *aStatusReporter, REPORTER *aWarningReporter) override
Redraw the view.
 
wxSize GetRealBufferSize()
 
void SetCurWindowSize(const wxSize &aSize) override
Before each render, the canvas will tell the render what is the size of its windows,...
 
T * GetToolbarSettings(const wxString &aFilename)
Return a handle to the given toolbar settings.
 
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.
 
EDA_3D_VIEWER_EXPORT_FORMAT
 
#define FOLLOW_PLOT_SETTINGS
 
#define LEGACY_PRESET_FLAG
 
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
 
#define VIEWPORT_SWITCH_KEY
 
#define PRESET_SWITCH_KEY
 
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.
 
Declaration of the NL_3D_VIEWER_PLUGIN class.
 
ANTIALIASING_MODE
Anti-aliasing options.
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
T * GetAppSettings(const char *aFilename)
 
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
 
ANTIALIASING_MODE opengl_AA_mode
 
bool highlight_on_rollover
 
wxString result
Test unit parsing edge cases and error handling.
 
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.