diff options
Diffstat (limited to 'cvpcb/class_DisplayFootprintsFrame.cpp')
-rw-r--r-- | cvpcb/class_DisplayFootprintsFrame.cpp | 569 |
1 files changed, 569 insertions, 0 deletions
diff --git a/cvpcb/class_DisplayFootprintsFrame.cpp b/cvpcb/class_DisplayFootprintsFrame.cpp new file mode 100644 index 0000000..0b3a76a --- /dev/null +++ b/cvpcb/class_DisplayFootprintsFrame.cpp @@ -0,0 +1,569 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2015 Wayne Stambaugh <stambaughw@verizon.net> + * Copyright (C) 2007-2015 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file class_DisplayFootprintsFrame.cpp + */ + +#include <fctsys.h> +#include <pgm_base.h> +#include <common.h> +#include <class_drawpanel.h> +#include <class_draw_panel_gal.h> +#include <confirm.h> +#include <macros.h> +#include <bitmaps.h> +#include <msgpanel.h> +#include <wildcards_and_files_ext.h> +#include <fpid.h> +#include <fp_lib_table.h> +#include <pcbcommon.h> + +#include <io_mgr.h> +#include <class_module.h> +#include <class_board.h> + +#include <cvpcb_mainframe.h> +#include <class_DisplayFootprintsFrame.h> +#include <cvpcb_id.h> +#include <cvstruct.h> + +#include <3d_viewer.h> + + +BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME ) + EVT_CLOSE( DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow ) + EVT_SIZE( DISPLAY_FOOTPRINTS_FRAME::OnSize ) + EVT_TOOL( ID_OPTIONS_SETUP, DISPLAY_FOOTPRINTS_FRAME::InstallOptionsDisplay ) + EVT_TOOL( ID_CVPCB_SHOW3D_FRAME, DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame ) + + EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, + DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar) + EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, + DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar) + + EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, + DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode ) + EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, + DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode ) +END_EVENT_TABLE() + + +DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, CVPCB_MAINFRAME* aParent ) : + PCB_BASE_FRAME( aKiway, aParent, FRAME_CVPCB_DISPLAY, _( "Footprint Viewer" ), + wxDefaultPosition, wxDefaultSize, + KICAD_DEFAULT_DRAWFRAME_STYLE, FOOTPRINTVIEWER_FRAME_NAME ) +{ + m_showAxis = true; // true to draw axis. + + // Give an icon + wxIcon icon; + + icon.CopyFromBitmap( KiBitmap( icon_cvpcb_xpm ) ); + SetIcon( icon ); + + SetBoard( new BOARD() ); + SetScreen( new PCB_SCREEN( GetPageSizeIU() ) ); + + LoadSettings( config() ); + + // Initialize grid id to a default value if not found in config or incorrect: + if( !( GetScreen()->GridExists( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 ) ) ) + m_LastGridSizeId = ID_POPUP_GRID_LEVEL_500 - ID_POPUP_GRID_LEVEL_1000; + + GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 ); + + // Initialize some display options + DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions(); + displ_opts->m_DisplayPadIsol = false; // Pad clearance has no meaning here + + // Track and via clearance has no meaning here. + displ_opts->m_ShowTrackClearanceMode = DO_NOT_SHOW_CLEARANCE; + + SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); + ReCreateHToolbar(); + ReCreateVToolbar(); + ReCreateOptToolbar(); + + m_auimgr.SetManagedWindow( this ); + + EDA_PANEINFO horiz; + horiz.HorizontalToolbarPane(); + + EDA_PANEINFO vert; + vert.VerticalToolbarPane(); + + EDA_PANEINFO mesg; + mesg.MessageToolbarPane(); + + m_auimgr.AddPane( m_mainToolBar, + wxAuiPaneInfo( horiz ).Name( wxT( "m_mainToolBar" ) ).Top(). Row( 0 ) ); + + if( m_drawToolBar ) // Currently, no vertical right toolbar. + m_auimgr.AddPane( m_drawToolBar, + wxAuiPaneInfo( vert ).Name( wxT( "m_drawToolBar" ) ).Right() ); + + m_auimgr.AddPane( m_canvas, + wxAuiPaneInfo().Name( wxT( "DisplayFrame" ) ).CentrePane() ); + + m_auimgr.AddPane( m_messagePanel, + wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom().Layer(10) ); + + m_auimgr.AddPane( m_optionsToolBar, + wxAuiPaneInfo( vert ).Name( wxT( "m_optionsToolBar" ) ).Left() ); + + m_auimgr.Update(); + + Show( true ); +} + + +DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME() +{ + delete GetScreen(); + SetScreen( NULL ); // Be sure there is no double deletion +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow( wxCloseEvent& event ) +{ + if( m_Draw3DFrame ) + m_Draw3DFrame->Close( true ); + + Destroy(); +} + + +void DISPLAY_FOOTPRINTS_FRAME::ReCreateVToolbar() +{ + // Currently, no vertical right toolbar. + // So do nothing +} + + +void DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar() +{ + if( m_optionsToolBar ) + return; + + // Create options tool bar. + m_optionsToolBar = new wxAuiToolBar( this, ID_OPT_TOOLBAR, wxDefaultPosition, wxDefaultSize, + wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_VERTICAL ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_GRID, wxEmptyString, KiBitmap( grid_xpm ), + _( "Hide grid" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_POLAR_COORD, wxEmptyString, + KiBitmap( polar_coord_xpm ), + _( "Display polar coordinates" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, + KiBitmap( unit_inch_xpm ), + _( "Units in inches" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, + KiBitmap( unit_mm_xpm ), + _( "Units in millimeters" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString, + KiBitmap( cursor_shape_xpm ), + _( "Change cursor shape" ), wxITEM_CHECK ); + + m_optionsToolBar->AddSeparator(); + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_PADS_SKETCH, wxEmptyString, + KiBitmap( pad_sketch_xpm ), + _( "Show pads in outline mode" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, wxEmptyString, + KiBitmap( text_sketch_xpm ), + _( "Show texts in line mode" ), wxITEM_CHECK ); + + m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, wxEmptyString, + KiBitmap( show_mod_edge_xpm ), + _( "Show outlines in line mode" ), wxITEM_CHECK ); + + m_optionsToolBar->Realize(); +} + + +void DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar() +{ + if( m_mainToolBar != NULL ) + return; + + m_mainToolBar = new wxAuiToolBar( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, + wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_HORZ_LAYOUT ); + + m_mainToolBar->AddTool( ID_OPTIONS_SETUP, wxEmptyString, KiBitmap( display_options_xpm ), + _( "Display options" ) ); + + m_mainToolBar->AddSeparator(); + + m_mainToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, KiBitmap( zoom_in_xpm ), + _( "Zoom in (F1)" ) ); + + m_mainToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString, KiBitmap( zoom_out_xpm ), + _( "Zoom out (F2)" ) ); + + m_mainToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString, KiBitmap( zoom_redraw_xpm ), + _( "Redraw view (F3)" ) ); + + m_mainToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString, KiBitmap( zoom_fit_in_page_xpm ), + _( "Zoom auto (Home)" ) ); + + m_mainToolBar->AddSeparator(); + m_mainToolBar->AddTool( ID_CVPCB_SHOW3D_FRAME, wxEmptyString, KiBitmap( three_d_xpm ), + _( "3D Display (Alt+3)" ) ); + + // after adding the buttons to the toolbar, must call Realize() to reflect + // the changes + m_mainToolBar->Realize(); +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode( wxUpdateUIEvent& aEvent ) +{ + DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions(); + + wxString msgTextsFill[2] = { _( "Show texts in filled mode" ), + _( "Show texts in sketch mode" ) }; + + unsigned i = displ_opts->m_DisplayModTextFill == SKETCH ? 0 : 1; + + aEvent.Check( displ_opts->m_DisplayModTextFill == SKETCH ); + m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, msgTextsFill[i] ); + +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode( wxUpdateUIEvent& aEvent ) +{ + DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions(); + + wxString msgEdgesFill[2] = { _( "Show outlines in filled mode" ), + _( "Show outlines in sketch mode" ) }; + + int i = displ_opts->m_DisplayModEdgeFill == SKETCH ? 0 : 1; + + aEvent.Check( displ_opts->m_DisplayModEdgeFill == SKETCH ); + m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, msgEdgesFill[i] ); +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) +{ +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) +{ +} + + +bool DISPLAY_FOOTPRINTS_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ) +{ + return true; +} + + +void DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) +{ + int id = event.GetId(); + DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions(); + + switch( id ) + { + case ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH: + displ_opts->m_DisplayModTextFill = displ_opts->m_DisplayModTextFill == FILLED ? SKETCH : FILLED; + m_canvas->Refresh( ); + break; + + case ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH: + displ_opts->m_DisplayModEdgeFill = displ_opts->m_DisplayModEdgeFill == FILLED ? SKETCH : FILLED; + m_canvas->Refresh(); + break; + + default: + DisplayError( this, + wxT( "DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar error" ) ); + break; + } +} + + +bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey ) +{ + bool eventHandled = true; + + // Filter out the 'fake' mouse motion after a keyboard movement + if( !aHotKey && m_movingCursorWithKeyboard ) + { + m_movingCursorWithKeyboard = false; + return false; + } + + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + cmd.SetEventObject( this ); + + wxPoint pos = aPosition; + wxPoint oldpos = GetCrossHairPosition(); + GeneralControlKeyMovement( aHotKey, &pos, true ); + + switch( aHotKey ) + { + case WXK_F1: + cmd.SetId( ID_POPUP_ZOOM_IN ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case WXK_F2: + cmd.SetId( ID_POPUP_ZOOM_OUT ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case WXK_F3: + cmd.SetId( ID_ZOOM_REDRAW ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case WXK_F4: + cmd.SetId( ID_POPUP_ZOOM_CENTER ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case WXK_HOME: + cmd.SetId( ID_ZOOM_PAGE ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case ' ': + GetScreen()->m_O_Curseur = GetCrossHairPosition(); + break; + + case GR_KB_ALT + '3': + cmd.SetId( ID_CVPCB_SHOW3D_FRAME ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + default: + eventHandled = false; + } + + SetCrossHairPosition( pos ); + RefreshCrossHair( oldpos, aPosition, aDC ); + + UpdateStatusBar(); /* Display new cursor coordinates */ + + return eventHandled; +} + + +void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event ) +{ + if( m_Draw3DFrame ) + { + // Raising the window does not show the window on Windows if iconized. + // This should work on any platform. + if( m_Draw3DFrame->IsIconized() ) + m_Draw3DFrame->Iconize( false ); + + m_Draw3DFrame->Raise(); + + // Raising the window does not set the focus on Linux. This should work on any platform. + if( wxWindow::FindFocus() != m_Draw3DFrame ) + m_Draw3DFrame->SetFocus(); + + return; + } + + m_Draw3DFrame = new EDA_3D_FRAME( &Kiway(), this, _( "3D Viewer" ) ); + m_Draw3DFrame->Raise(); // Needed with some Window Managers + m_Draw3DFrame->Show( true ); +} + + +/** + * Virtual function needed by the PCB_SCREEN class derived from BASE_SCREEN + * this is a virtual pure function in BASE_SCREEN + * do nothing in Cvpcb + * could be removed later + */ +void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int ) +{ +} + + +bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const +{ + return m_drawGrid; +} + + +void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible) +{ + m_drawGrid = aVisible; +} + + +EDA_COLOR_T DISPLAY_FOOTPRINTS_FRAME::GetGridColor() const +{ + return DARKGRAY; +} + + +MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) +{ + MODULE* footprint = NULL; + + try + { + FPID fpid; + + if( fpid.Parse( aFootprintName ) >= 0 ) + { + DisplayInfoMessage( this, wxString::Format( wxT( "Footprint ID <%s> is not valid." ), + GetChars( aFootprintName ) ) ); + return NULL; + } + + std::string nickname = fpid.GetLibNickname(); + std::string fpname = fpid.GetFootprintName(); + + wxLogDebug( wxT( "Load footprint <%s> from library <%s>." ), + fpname.c_str(), nickname.c_str() ); + + footprint = Prj().PcbFootprintLibs()->FootprintLoad( + FROM_UTF8( nickname.c_str() ), FROM_UTF8( fpname.c_str() ) ); + } + catch( const IO_ERROR& ioe ) + { + DisplayError( this, ioe.errorText ); + return NULL; + } + + if( footprint ) + { + footprint->SetParent( (EDA_ITEM*) GetBoard() ); + footprint->SetPosition( wxPoint( 0, 0 ) ); + return footprint; + } + + wxString msg = wxString::Format( _( "Footprint '%s' not found" ), aFootprintName.GetData() ); + DisplayError( this, msg ); + return NULL; +} + + +void DISPLAY_FOOTPRINTS_FRAME::InitDisplay() +{ + wxString msg; + + CVPCB_MAINFRAME* parentframe = (CVPCB_MAINFRAME *) GetParent(); + + wxString footprintName = parentframe->m_footprintListBox->GetSelectedFootprint(); + + if( !footprintName.IsEmpty() ) + { + msg.Printf( _( "Footprint: %s" ), GetChars( footprintName ) ); + + SetTitle( msg ); + const FOOTPRINT_INFO* module_info = parentframe->m_footprints.GetModuleInfo( footprintName ); + + const wxChar* libname; + + if( module_info ) + libname = GetChars( module_info->GetNickname() ); + else + libname = GetChars( wxT( "???" ) ); + + msg.Printf( _( "Lib: %s" ), libname ); + + SetStatusText( msg, 0 ); + + if( GetBoard()->m_Modules.GetCount() ) + { + // there is only one module in the list + GetBoard()->m_Modules.DeleteAll(); + } + + MODULE* module = Get_Module( footprintName ); + + if( module ) + GetBoard()->m_Modules.PushBack( module ); + + Zoom_Automatique( false ); + } + else // No footprint to display. Erase old footprint, if any + { + if( GetBoard()->m_Modules.GetCount() ) + { + GetBoard()->m_Modules.DeleteAll(); + Zoom_Automatique( false ); + SetStatusText( wxEmptyString, 0 ); + } + } + + // Display new cursor coordinates and zoom value: + UpdateStatusBar(); + + GetCanvas()->Refresh(); + + if( m_Draw3DFrame ) + m_Draw3DFrame->NewDisplay(); +} + + +void DISPLAY_FOOTPRINTS_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) +{ + if( !GetBoard() ) + return; + + m_canvas->DrawBackGround( DC ); + GetBoard()->Draw( m_canvas, DC, GR_COPY ); + + MODULE* Module = GetBoard()->m_Modules; + + if ( Module ) + { + MSG_PANEL_ITEMS items; + Module->GetMsgPanelInfo( items ); + SetMsgPanel( items ); + } + + m_canvas->DrawCrossHair( DC ); +} + + +/* + * Redraw the BOARD items but not cursors, axis or grid. + */ +void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, + GR_DRAWMODE aDrawMode, const wxPoint& aOffset ) +{ + if( m_Modules ) + { + m_Modules->Draw( aPanel, aDC, GR_COPY ); + } +} |