3D viewer: fix some issues when opened from a frame and changes are made in a other frame:
* Refresh the view only when changes are made in the caller frame. * Allows recreate a new instances when try to open the 3D view from a frame taht is not the initial caller * Remove duplicate code in kicad frames.
This commit is contained in:
parent
d41e64b0ff
commit
e339007d22
|
@ -141,24 +141,17 @@ BEGIN_EVENT_TABLE( EDA_3D_VIEWER, EDA_BASE_FRAME )
|
|||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
EDA_3D_VIEWER::EDA_3D_VIEWER( KIWAY *aKiway,
|
||||
PCB_BASE_FRAME *aParent,
|
||||
const wxString &aTitle,
|
||||
long style ) :
|
||||
EDA_3D_VIEWER::EDA_3D_VIEWER( KIWAY *aKiway, PCB_BASE_FRAME *aParent,
|
||||
const wxString &aTitle, long style ) :
|
||||
|
||||
KIWAY_PLAYER( aKiway,
|
||||
aParent,
|
||||
FRAME_PCB_DISPLAY3D,
|
||||
aTitle,
|
||||
wxDefaultPosition,
|
||||
wxDefaultSize,
|
||||
style,
|
||||
VIEWER3D_FRAMENAME )
|
||||
KIWAY_PLAYER( aKiway, aParent,
|
||||
FRAME_PCB_DISPLAY3D, aTitle,
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
style, VIEWER3D_FRAMENAME )
|
||||
{
|
||||
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER::EDA_3D_VIEWER %s" ), aTitle );
|
||||
|
||||
m_canvas = NULL;
|
||||
m_defaultFileName = "";
|
||||
|
||||
// Give it an icon
|
||||
wxIcon icon;
|
||||
|
@ -946,7 +939,7 @@ void EDA_3D_VIEWER::takeScreenshot( wxCommandEvent& event )
|
|||
fn.SetExt( file_ext );
|
||||
|
||||
fullFileName = EDA_FILE_SELECTOR( _( "3D Image File Name:" ), fn.GetPath(),
|
||||
m_defaultFileName, file_ext, mask, this,
|
||||
m_defaultSaveScreenshotFileName, file_ext, mask, this,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT, true );
|
||||
|
||||
if( fullFileName.IsEmpty() )
|
||||
|
|
|
@ -52,8 +52,7 @@ class EDA_3D_VIEWER : public KIWAY_PLAYER
|
|||
|
||||
public:
|
||||
|
||||
EDA_3D_VIEWER( KIWAY *aKiway,
|
||||
PCB_BASE_FRAME *aParent,
|
||||
EDA_3D_VIEWER( KIWAY *aKiway, PCB_BASE_FRAME *aParent,
|
||||
const wxString &aTitle,
|
||||
long style = KICAD_DEFAULT_3D_DRAWFRAME_STYLE );
|
||||
|
||||
|
@ -93,14 +92,14 @@ class EDA_3D_VIEWER : public KIWAY_PLAYER
|
|||
void SetDefaultFileName( const wxString &aFn )
|
||||
{
|
||||
wxFileName fn( aFn );
|
||||
m_defaultFileName = fn.GetName();
|
||||
m_defaultSaveScreenshotFileName = fn.GetName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function GetDefaultFileName
|
||||
* @return the default suggested file name
|
||||
*/
|
||||
const wxString &GetDefaultFileName() const { return m_defaultFileName; }
|
||||
const wxString &GetDefaultFileName() const { return m_defaultSaveScreenshotFileName; }
|
||||
|
||||
/**
|
||||
* Function GetSettings
|
||||
|
@ -226,7 +225,7 @@ class EDA_3D_VIEWER : public KIWAY_PLAYER
|
|||
/**
|
||||
* Filename to propose for save a screenshot
|
||||
*/
|
||||
wxString m_defaultFileName;
|
||||
wxString m_defaultSaveScreenshotFileName;
|
||||
|
||||
/**
|
||||
* The canvas where the openGL context will be rendered
|
||||
|
|
|
@ -142,10 +142,10 @@ set_target_properties( cvpcb_kiface PROPERTIES
|
|||
SUFFIX ${KIFACE_SUFFIX}
|
||||
)
|
||||
target_link_libraries( cvpcb_kiface
|
||||
3d-viewer
|
||||
pcbcommon
|
||||
pcad2kicadpcb
|
||||
common
|
||||
3d-viewer
|
||||
bitmaps
|
||||
polygon
|
||||
gal
|
||||
|
|
|
@ -149,12 +149,6 @@ DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME()
|
|||
|
||||
void DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow( wxCloseEvent& event )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->Close( true );
|
||||
|
||||
Destroy();
|
||||
}
|
||||
|
||||
|
||||
|
@ -392,27 +386,8 @@ bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPositi
|
|||
|
||||
void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
{
|
||||
// Raising the window does not show the window on Windows if iconized.
|
||||
// This should work on any platform.
|
||||
if( draw3DFrame->IsIconized() )
|
||||
draw3DFrame->Iconize( false );
|
||||
|
||||
draw3DFrame->Raise();
|
||||
|
||||
// Raising the window does not set the focus on Linux. This should work on any platform.
|
||||
if( wxWindow::FindFocus() != draw3DFrame )
|
||||
draw3DFrame->SetFocus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
draw3DFrame = new EDA_3D_VIEWER( &Kiway(), this, _( "3D Viewer" ) );
|
||||
draw3DFrame->Raise(); // Needed with some Window Managers
|
||||
draw3DFrame->Show( true );
|
||||
bool forceRecreateIfNotOwner = true;
|
||||
CreateAndShow3D_Frame( forceRecreateIfNotOwner );
|
||||
}
|
||||
|
||||
|
||||
|
@ -543,10 +518,7 @@ void DISPLAY_FOOTPRINTS_FRAME::InitDisplay()
|
|||
|
||||
GetCanvas()->Refresh();
|
||||
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->NewDisplay( true );
|
||||
Update3DView();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -106,6 +106,15 @@ public:
|
|||
*/
|
||||
EDA_3D_VIEWER* Get3DViewerFrame();
|
||||
|
||||
/**
|
||||
* Update the 3D view, if the viewer is opened by this frame
|
||||
* @param aTitle = the new title of the 3D frame, or nullptr
|
||||
* to do not change the frame title
|
||||
* @return false if the 3D view cannot be updated (because the
|
||||
* owner of the viewer is not this frame)
|
||||
*/
|
||||
bool Update3DView( const wxString* aTitle = nullptr );
|
||||
|
||||
/**
|
||||
* Function LoadFootprint
|
||||
* attempts to load \a aFootprintId from the footprint library table.
|
||||
|
@ -218,8 +227,23 @@ public:
|
|||
*/
|
||||
const wxString GetZoomLevelIndicator() const override;
|
||||
|
||||
/**
|
||||
* Shows the 3D view frame.
|
||||
* If it does not exist, it is created.
|
||||
* If it exists, and if I am the owner, it is bring to the foreground
|
||||
*/
|
||||
virtual void Show3D_Frame( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Shows the 3D view frame.
|
||||
* If it does not exist, it is created.
|
||||
* If it exists, it is bring to the foreground
|
||||
* @param aForceRecreateIfNotOwner = true to recreate the 3D frame viewer,
|
||||
* when the owner is not me
|
||||
* @return true if it is shown with me as owner
|
||||
*/
|
||||
virtual bool CreateAndShow3D_Frame( bool aForceRecreateIfNotOwner );
|
||||
|
||||
// Read/write functions:
|
||||
EDA_ITEM* ReadDrawSegmentDescr( LINE_READER* aReader );
|
||||
int ReadListeSegmentDescr( LINE_READER* aReader,
|
||||
|
|
|
@ -686,27 +686,8 @@ void FOOTPRINT_EDIT_FRAME::OnUpdateSelectCurrentLib( wxUpdateUIEvent& aEvent )
|
|||
|
||||
void FOOTPRINT_EDIT_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
{
|
||||
// Raising the window does not show the window on Windows if iconized.
|
||||
// This should work on any platform.
|
||||
if( draw3DFrame->IsIconized() )
|
||||
draw3DFrame->Iconize( false );
|
||||
|
||||
draw3DFrame->Raise();
|
||||
|
||||
// Raising the window does not set the focus on Linux. This should work on any platform.
|
||||
if( wxWindow::FindFocus() != draw3DFrame )
|
||||
draw3DFrame->SetFocus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
draw3DFrame = new EDA_3D_VIEWER( &Kiway(), this, _( "3D Viewer" ) );
|
||||
draw3DFrame->Raise(); // Needed with some Window Managers
|
||||
draw3DFrame->Show( true );
|
||||
bool forceRecreateIfNotOwner = true;
|
||||
CreateAndShow3D_Frame( forceRecreateIfNotOwner );
|
||||
}
|
||||
|
||||
|
||||
|
@ -748,13 +729,7 @@ bool FOOTPRINT_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition,
|
|||
void FOOTPRINT_EDIT_FRAME::OnModify()
|
||||
{
|
||||
PCB_BASE_FRAME::OnModify();
|
||||
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
{
|
||||
draw3DFrame->NewDisplay( true );
|
||||
}
|
||||
Update3DView();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -186,10 +186,7 @@ void FOOTPRINT_EDIT_FRAME::LoadModuleFromBoard( wxCommandEvent& event )
|
|||
GetScreen()->ClearUndoRedoList();
|
||||
GetScreen()->ClrModify();
|
||||
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->NewDisplay( true );
|
||||
Update3DView();
|
||||
}
|
||||
|
||||
|
||||
|
@ -372,10 +369,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
updateView();
|
||||
m_canvas->Refresh();
|
||||
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->NewDisplay( true );
|
||||
Update3DView();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
}
|
||||
|
@ -495,12 +489,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
GetScreen()->ClrModify();
|
||||
Zoom_Automatique( false );
|
||||
m_canvas->Refresh();
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->NewDisplay( true );
|
||||
}
|
||||
Update3DView();
|
||||
|
||||
break;
|
||||
|
||||
|
@ -567,12 +556,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
|
||||
Zoom_Automatique( false );
|
||||
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->NewDisplay( true );
|
||||
}
|
||||
Update3DView();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
|
||||
|
|
|
@ -314,14 +314,9 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent
|
|||
|
||||
FOOTPRINT_VIEWER_FRAME::~FOOTPRINT_VIEWER_FRAME()
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->Destroy();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void FOOTPRINT_VIEWER_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
||||
{
|
||||
DBG(printf( "%s:\n", __func__ );)
|
||||
|
@ -706,21 +701,10 @@ void FOOTPRINT_VIEWER_FRAME::Show3D_Frame( wxCommandEvent& event )
|
|||
|
||||
void FOOTPRINT_VIEWER_FRAME::Update3D_Frame( bool aForceReloadFootprint )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame == NULL )
|
||||
return;
|
||||
|
||||
wxString title = wxString::Format( _( "3D Viewer" ) + wxT( " \u2014 %s" ),
|
||||
getCurFootprintName() );
|
||||
|
||||
draw3DFrame->SetTitle( title );
|
||||
|
||||
if( aForceReloadFootprint )
|
||||
{
|
||||
// Force 3D screen refresh immediately
|
||||
draw3DFrame->NewDisplay( true );
|
||||
}
|
||||
Update3DView( &title );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -137,6 +137,30 @@ EDA_3D_VIEWER* PCB_BASE_FRAME::Get3DViewerFrame()
|
|||
}
|
||||
|
||||
|
||||
bool PCB_BASE_FRAME::Update3DView( const wxString* aTitle )
|
||||
{
|
||||
// Update the 3D view only if the viewer is opened by this frame
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame == NULL )
|
||||
return false;
|
||||
|
||||
// Ensure the viewer was created by me, and not by an other editor:
|
||||
PCB_BASE_FRAME* owner = draw3DFrame->Parent();
|
||||
|
||||
// if I am not the owner, do not use the current viewer instance
|
||||
if( this != owner )
|
||||
return false;
|
||||
|
||||
if( aTitle )
|
||||
draw3DFrame->SetTitle( *aTitle );
|
||||
|
||||
draw3DFrame->NewDisplay( true );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
FP_LIB_TABLE* PROJECT::PcbFootprintLibs()
|
||||
{
|
||||
// This is a lazy loading function, it loads the project specific table when
|
||||
|
@ -406,6 +430,48 @@ void PCB_BASE_FRAME::Show3D_Frame( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
bool PCB_BASE_FRAME::CreateAndShow3D_Frame( bool aForceRecreateIfNotOwner )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
// Ensure the viewer was created by me, and not by an other editor:
|
||||
PCB_BASE_FRAME* owner = draw3DFrame ? draw3DFrame->Parent() : nullptr;
|
||||
|
||||
// if I am not the owner, do not use the current viewer instance
|
||||
if( draw3DFrame && this != owner )
|
||||
{
|
||||
if( aForceRecreateIfNotOwner )
|
||||
{
|
||||
draw3DFrame->Destroy();
|
||||
draw3DFrame = nullptr;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
if( !draw3DFrame )
|
||||
{
|
||||
draw3DFrame = new EDA_3D_VIEWER( &Kiway(), this, _( "3D Viewer" ) );
|
||||
draw3DFrame->Raise(); // Needed with some Window Managers
|
||||
draw3DFrame->Show( true );
|
||||
return true;
|
||||
}
|
||||
|
||||
// Raising the window does not show the window on Windows if iconized.
|
||||
// This should work on any platform.
|
||||
if( draw3DFrame->IsIconized() )
|
||||
draw3DFrame->Iconize( false );
|
||||
|
||||
draw3DFrame->Raise();
|
||||
|
||||
// Raising the window does not set the focus on Linux. This should work on any platform.
|
||||
if( wxWindow::FindFocus() != draw3DFrame )
|
||||
draw3DFrame->SetFocus();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Note: virtual, overridden in PCB_EDIT_FRAME;
|
||||
void PCB_BASE_FRAME::SwitchLayer( wxDC* DC, PCB_LAYER_ID layer )
|
||||
{
|
||||
|
|
|
@ -723,28 +723,8 @@ void PCB_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
|||
|
||||
void PCB_EDIT_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||
{
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
{
|
||||
// Raising the window does not show the window on Windows if iconized.
|
||||
// This should work on any platform.
|
||||
if( draw3DFrame->IsIconized() )
|
||||
draw3DFrame->Iconize( false );
|
||||
|
||||
draw3DFrame->Raise();
|
||||
|
||||
// Raising the window does not set the focus on Linux. This should work on any platform.
|
||||
if( wxWindow::FindFocus() != draw3DFrame )
|
||||
draw3DFrame->SetFocus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
draw3DFrame = new EDA_3D_VIEWER( &Kiway(), this, _( "3D Viewer" ) );
|
||||
draw3DFrame->SetDefaultFileName( GetBoard()->GetFileName() );
|
||||
draw3DFrame->Raise(); // Needed with some Window Managers
|
||||
draw3DFrame->Show( true );
|
||||
bool forceRecreateIfNotOwner = true;
|
||||
CreateAndShow3D_Frame( forceRecreateIfNotOwner );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1087,10 +1067,7 @@ void PCB_EDIT_FRAME::OnModify( )
|
|||
{
|
||||
PCB_BASE_FRAME::OnModify();
|
||||
|
||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||
|
||||
if( draw3DFrame )
|
||||
draw3DFrame->ReloadRequest();
|
||||
Update3DView();
|
||||
|
||||
m_ZoneFillsDirty = true;
|
||||
}
|
||||
|
|
|
@ -82,6 +82,7 @@ target_link_libraries( test_window
|
|||
pnsrouter
|
||||
common
|
||||
pcbcommon
|
||||
3d-viewer
|
||||
bitmaps
|
||||
gal
|
||||
pcad2kicadpcb
|
||||
|
|
Loading…
Reference in New Issue