25#include <wx/filename.h>
28#include <wx/wupdlock.h>
29#include <wx/clipbrd.h>
30#include <wx/filedlg.h>
35#include "wx/generic/textdlgg.h"
59#if defined( KICAD_USE_3DCONNEXION )
90 const wxString& aTitle,
long style ) :
93 m_mainToolBar(
nullptr ), m_canvas(
nullptr ), m_currentCamera( m_trackBallCamera ),
94 m_viewportsLabel(
nullptr ),
95 m_cbViewports(
nullptr ),
98 wxLogTrace( m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
100 m_disable_ray_tracing =
false;
101 m_aboutTitle =
_HKI(
"KiCad 3D Viewer" );
109 static const int status_dims[4] = { -1, 170, 130, 130 };
111 wxStatusBar *status_bar = CreateStatusBar(
arrayDim( status_dims ) );
112 SetStatusWidths(
arrayDim( status_dims ), status_dims );
119 m_boardAdapter, m_currentCamera,
Prj().Get3DCacheManager() );
122 loadCommonSettings();
124 SetUserViewports(
Prj().GetProjectFile().m_Viewports3D );
132 m_canvas->SetEventDispatcher( m_toolDispatcher );
137 m_toolManager->InitTools();
141 if(
EDA_3D_CONTROLLER* ctrlTool = GetToolManager()->GetTool<EDA_3D_CONTROLLER>() )
145 m_toolManager->InvokeTool(
"3DViewer.Control" );
148 ReCreateMainToolbar();
150 m_infoBar =
new WX_INFOBAR(
this, &m_auimgr );
152 m_auimgr.SetManagedWindow(
this );
154 m_auimgr.AddPane( m_mainToolBar,
EDA_PANE().HToolbar().Name( wxS(
"MainToolbar" ) ).Top().Layer( 6 ) );
155 m_auimgr.AddPane( m_infoBar,
EDA_PANE().InfoBar().Name( wxS(
"InfoBar" ) ).Top().Layer( 1 ) );
156 m_auimgr.AddPane( m_canvas,
EDA_PANE().Canvas().Name( wxS(
"DrawFrame" ) ).
Center() );
163 m_auimgr.GetPane( wxS(
"InfoBar" ) ).Hide();
166 m_canvas->SetInfoBar( m_infoBar );
167 m_canvas->SetStatusBar( status_bar );
169#if defined( KICAD_USE_3DCONNEXION )
174 catch(
const std::system_error& e )
176 wxLogTrace( wxT(
"KI_TRACE_NAVLIB" ), e.what() );
183 m_canvas->SetFocus();
185 m_cbViewports->Connect( wxEVT_COMMAND_CHOICE_SELECTED,
188 m_cbViewports->Connect( wxEVT_UPDATE_UI,
196#if defined( KICAD_USE_3DCONNEXION )
226#define GridSizeCheck( x ) ACTION_CONDITIONS().Check( cond.GridSize( x ) )
248 auto show_NotInPosfile =
293 static bool s_viewportSwitcherShown =
false;
300 if( wxGetKeyState( WXK_TAB ) )
302 if( ( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
303 &&
static_cast<wxKeyEvent&
>( aEvent ).GetKeyCode() == WXK_TAB )
308 if( this->IsActive() )
314 s_viewportSwitcherShown =
true;
315 switcher.ShowModal();
316 s_viewportSwitcherShown =
false;
329 return wxFrame::TryBefore( aEvent );
337#if defined( KICAD_USE_3DCONNEXION )
360 if( aForceImmediateRedraw )
384 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::Exit3DFrame" ) );
392 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnCloseWindow" ) );
404 int id =
event.GetId();
405 bool isChecked =
event.IsChecked();
407 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::Process_Special_Functions id %d "
441 wxFAIL_MSG( wxT(
"Invalid event in EDA_3D_VIEWER_FRAME::Process_Special_Functions()" ) );
449 std::vector<VIEWPORT3D> ret;
451 for(
const std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
452 ret.emplace_back( pair.second );
462 for(
const VIEWPORT3D& viewport : aViewportList )
478 if( idx >= 0 && idx < m_cbViewports->GetCount() - 3 )
509 if( index >= 0 && index < count - 3 )
513 wxCHECK( viewport, );
517 else if( index == count - 2 )
522 wxTextEntryDialog dlg(
this,
_(
"Viewport name:" ),
_(
"Save Viewport" ),
name );
524 if( dlg.ShowModal() != wxID_OK )
534 name = dlg.GetValue();
555 else if( index == count - 1 )
558 wxArrayString headers;
559 std::vector<wxArrayString> items;
561 headers.Add(
_(
"Viewports" ) );
563 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
566 item.Add( pair.first );
567 items.emplace_back( item );
573 if( dlg.ShowModal() == wxID_OK )
578 if( idx != wxNOT_FOUND )
603 if( index >= 0 && index < count - 3 )
607 wxCHECK( viewport, );
625 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnRenderEngineSelection type %s " ),
628 if( old_engine != engine )
635 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ),
645 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::OnActivate" ) );
647 if( aEvent.GetActive() &&
m_canvas )
658#if defined( KICAD_USE_3DCONNEXION )
693 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::LoadSettings" ) );
717 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings" ) );
720 wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings render setting Ray Trace" )
722 wxT(
"EDA_3D_VIEWER_FRAME::SaveSettings render setting OpenGL" ) );
731 cfg->m_Camera.rotation_increment = ctrlTool->GetRotationIncrement();
738 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::CommonSettingsChanged" ) );
755 wxString fullFileName;
756 bool fmt_is_jpeg =
false;
773 wxFileDialog dlg(
this,
_(
"3D Image File Name" ),
776 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
778 if( dlg.ShowModal() == wxID_CANCEL )
788 wxFileName fn = fullFileName;
790 if( !fn.IsDirWritable() )
794 msg.Printf(
_(
"Insufficient permissions to save file '%s'." ), fullFileName );
795 wxMessageBox( msg,
_(
"Error" ), wxOK | wxICON_ERROR,
this );
810 wxWindowUpdateLocker noUpdates(
this );
812 wxImage screenshotImage;
819 wxBitmap bitmap( screenshotImage );
823 if( wxTheClipboard->Open() )
825 wxBitmapDataObject* dobjBmp =
new wxBitmapDataObject( bitmap );
827 if( !wxTheClipboard->SetData( dobjBmp ) )
828 wxMessageBox(
_(
"Failed to copy image to clipboard" ) );
830 wxTheClipboard->Flush();
832 wxTheClipboard->Close();
837 if( !screenshotImage.SaveFile( fullFileName,
838 fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
839 wxMessageBox(
_(
"Can't save file" ) );
841 screenshotImage.Destroy();
848 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_VIEWER_FRAME::RenderEngineChanged()" ) );
857 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...
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
EDA_3D_VIEWER_SETTINGS * m_Cfg
PROJECTION_TYPE GetProjection()
const glm::mat4 & GetViewMatrix() const
void SetViewMatrix(glm::mat4 aViewMatrix)
Set the affine matrix to be applied to a transformation camera.
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 showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION noGrid
static TOOL_ACTION show2_5mmGrid
static TOOL_ACTION show1mmGrid
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 RenderRaytracingRequest()
Request to render the current view in Raytracing mode.
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.
void onViewportChanged(wxCommandEvent &aEvent)
PCB_BASE_FRAME * Parent() const
void SetUserViewports(std::vector< VIEWPORT3D > &aViewportList)
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 onUpdateViewportsCb(wxUpdateUIEvent &aEvent)
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 RenderEngineChanged()
RenderEngineChanged - Update toolbar icon and call canvas RenderEngineChanged.
void Process_Special_Functions(wxCommandEvent &event)
void OnCloseWindow(wxCloseEvent &event)
void ReCreateMainToolbar()
void ReloadRequest()
Request reloading the 3D view.
wxFileName m_defaultSaveScreenshotFileName
VIEWPORT3D * m_lastSelectedViewport
void onRenderEngineSelection(wxCommandEvent &event)
std::map< wxString, VIEWPORT3D > m_viewports
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
NL_3D_VIEWER_PLUGIN * m_spaceMouse
void applyViewport(const wxString &aViewportName)
switch to a given predefined 3D viewport
wxArrayString m_viewportMRU
void loadCommonSettings()
Load configuration from common settings.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification that common settings are updated.
std::vector< VIEWPORT3D > GetUserViewports() const
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
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.
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
Specialization of the wxAuiPaneInfo class for KiCad panels.
void SetScaleFactor(double aFactor)
Set the canvas scale factor, probably for a hi-DPI display.
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)
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual PROJECT_FILE & GetProjectFile() const
T * GetAppSettings(bool aLoadNow=true)
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
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
#define VIEWPORT_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 opengl_show_model_bbox
bool show_footprints_not_in_posfile
bool show_footprints_insert
Definition of file extensions used in Kicad.