kicad/include/pcb_base_frame.h

460 lines
16 KiB
C
Raw Normal View History

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008-2016 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2023 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
*/
#ifndef PCB_BASE_FRAME_H
#define PCB_BASE_FRAME_H
2009-07-30 11:04:07 +00:00
#include <eda_item.h>
#include <board.h>
#include <eda_draw_frame.h>
2020-10-15 23:33:18 +00:00
#include <outline_mode.h>
#include <lib_id.h>
#include <pcb_display_options.h>
#include <pcb_draw_panel_gal.h>
#include <pcb_origin_transforms.h>
#include <pcb_screen.h>
#include <vector>
#include <wx/fswatcher.h>
#include <wx/datetime.h>
#include <wx/timer.h>
/* Forward declarations of classes. */
class APP_SETTINGS_BASE;
2009-07-30 11:04:07 +00:00
class BOARD;
class BOARD_CONNECTED_ITEM;
class COLOR_SETTINGS;
2020-11-13 15:15:52 +00:00
class FOOTPRINT;
2020-11-12 22:30:02 +00:00
class PAD;
2021-06-19 17:28:45 +00:00
class EDA_3D_VIEWER_FRAME;
2009-07-30 11:04:07 +00:00
class GENERAL_COLLECTOR;
class GENERAL_COLLECTORS_GUIDE;
++PCBNew * Removed Pcb_Frame argument from BOARD() constructor, since it precludes having a BOARD being edited by more than one editor, it was a bad design. And this meant removing m_PcbFrame from BOARD. * removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame * Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp * added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance * a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed, such as dialog_mask_clearance, dialog_drc, etc. * Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it with build_version.h's #define BOARD_FILE_VERSION, although there may be a better place for this constant. * Made the public functions in PARAM_CFG_ARRAY be type const. void SaveParam(..) const and void ReadParam(..) const * PARAM_CFG_BASE now has virtual destructor since we have various way of destroying the derived class and boost::ptr_vector must be told about this. * Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use an automatic PARAM_CFG_ARRAY which is on the stack.\ * PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array, since it has to access the current BOARD and the BOARD can change. Remember BOARD_DESIGN_SETTINGS are now in the BOARD. * Made the m_BoundingBox member private, this was a brutally hard task, and indicative of the lack of commitment to accessors and object oriented design on the part of KiCad developers. We must do better. Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox(). * Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
class BOARD_DESIGN_SETTINGS;
2012-02-06 05:44:19 +00:00
class ZONE_SETTINGS;
class PCB_PLOT_PARAMS;
class FP_LIB_TABLE;
class PCB_VIEWERS_SETTINGS_BASE;
class PCBNEW_SETTINGS;
class FOOTPRINT_EDITOR_SETTINGS;
struct MAGNETIC_SETTINGS;
class NL_PCBNEW_PLUGIN;
class PROGRESS_REPORTER;
2009-07-30 11:04:07 +00:00
wxDECLARE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
/**
2020-12-19 23:29:10 +00:00
* Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
*/
class PCB_BASE_FRAME : public EDA_DRAW_FRAME
2009-07-30 11:04:07 +00:00
{
public:
PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
2020-12-19 23:29:10 +00:00
const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
long aStyle, const wxString& aFrameName );
2009-07-30 11:04:07 +00:00
~PCB_BASE_FRAME();
2009-07-30 11:04:07 +00:00
/**
* @return a reference to the child 3D viewer frame, when exists, or NULL
*/
2021-06-19 17:28:45 +00:00
EDA_3D_VIEWER_FRAME* Get3DViewerFrame();
/**
2020-12-19 23:29:10 +00:00
* Update the 3D view, if the viewer is opened by this frame.
*
* @param aMarkDirty alerts the 3D view that data is stale (it may not refresh instantly)
* @param aRefresh will tell the 3D view to refresh immediately
2022-08-30 23:28:18 +00:00
* @param aTitle is the new title of the 3D frame, or nullptr to do not change the frame title
*/
2022-08-30 23:28:18 +00:00
virtual void Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle = nullptr );
/**
2020-12-19 23:29:10 +00:00
* Attempt to load \a aFootprintId from the footprint library table.
*
* @param aFootprintId is the #LIB_ID of component footprint to load.
2020-11-13 15:15:52 +00:00
* @return the #FOOTPRINT if found or NULL if \a aFootprintId not found in any of the
* libraries in table returned from #Prj().PcbFootprintLibs().
*/
2020-11-13 15:15:52 +00:00
FOOTPRINT* LoadFootprint( const LIB_ID& aFootprintId );
++PCBNew * Removed Pcb_Frame argument from BOARD() constructor, since it precludes having a BOARD being edited by more than one editor, it was a bad design. And this meant removing m_PcbFrame from BOARD. * removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame * Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp * added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance * a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed, such as dialog_mask_clearance, dialog_drc, etc. * Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it with build_version.h's #define BOARD_FILE_VERSION, although there may be a better place for this constant. * Made the public functions in PARAM_CFG_ARRAY be type const. void SaveParam(..) const and void ReadParam(..) const * PARAM_CFG_BASE now has virtual destructor since we have various way of destroying the derived class and boost::ptr_vector must be told about this. * Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use an automatic PARAM_CFG_ARRAY which is on the stack.\ * PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array, since it has to access the current BOARD and the BOARD can change. Remember BOARD_DESIGN_SETTINGS are now in the BOARD. * Made the m_BoundingBox member private, this was a brutally hard task, and indicative of the lack of commitment to accessors and object oriented design on the part of KiCad developers. We must do better. Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox(). * Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
/**
2020-12-19 23:29:10 +00:00
* Calculate the bounding box containing all board items (or board edge segments).
*
++PCBNew * Removed Pcb_Frame argument from BOARD() constructor, since it precludes having a BOARD being edited by more than one editor, it was a bad design. And this meant removing m_PcbFrame from BOARD. * removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame * Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp * added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance * a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed, such as dialog_mask_clearance, dialog_drc, etc. * Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it with build_version.h's #define BOARD_FILE_VERSION, although there may be a better place for this constant. * Made the public functions in PARAM_CFG_ARRAY be type const. void SaveParam(..) const and void ReadParam(..) const * PARAM_CFG_BASE now has virtual destructor since we have various way of destroying the derived class and boost::ptr_vector must be told about this. * Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use an automatic PARAM_CFG_ARRAY which is on the stack.\ * PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array, since it has to access the current BOARD and the BOARD can change. Remember BOARD_DESIGN_SETTINGS are now in the BOARD. * Made the m_BoundingBox member private, this was a brutally hard task, and indicative of the lack of commitment to accessors and object oriented design on the part of KiCad developers. We must do better. Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox(). * Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
* @param aBoardEdgesOnly is true if we are interested in board edge segments only.
2020-12-19 23:29:10 +00:00
* @return the board's bounding box.
++PCBNew * Removed Pcb_Frame argument from BOARD() constructor, since it precludes having a BOARD being edited by more than one editor, it was a bad design. And this meant removing m_PcbFrame from BOARD. * removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame * Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp * added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance * a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed, such as dialog_mask_clearance, dialog_drc, etc. * Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it with build_version.h's #define BOARD_FILE_VERSION, although there may be a better place for this constant. * Made the public functions in PARAM_CFG_ARRAY be type const. void SaveParam(..) const and void ReadParam(..) const * PARAM_CFG_BASE now has virtual destructor since we have various way of destroying the derived class and boost::ptr_vector must be told about this. * Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use an automatic PARAM_CFG_ARRAY which is on the stack.\ * PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array, since it has to access the current BOARD and the BOARD can change. Remember BOARD_DESIGN_SETTINGS are now in the BOARD. * Made the m_BoundingBox member private, this was a brutally hard task, and indicative of the lack of commitment to accessors and object oriented design on the part of KiCad developers. We must do better. Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox(). * Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
*/
2022-08-30 23:28:18 +00:00
BOX2I GetBoardBoundingBox( bool aBoardEdgesOnly = false ) const;
++PCBNew * Removed Pcb_Frame argument from BOARD() constructor, since it precludes having a BOARD being edited by more than one editor, it was a bad design. And this meant removing m_PcbFrame from BOARD. * removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame * Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp * added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance * a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed, such as dialog_mask_clearance, dialog_drc, etc. * Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it with build_version.h's #define BOARD_FILE_VERSION, although there may be a better place for this constant. * Made the public functions in PARAM_CFG_ARRAY be type const. void SaveParam(..) const and void ReadParam(..) const * PARAM_CFG_BASE now has virtual destructor since we have various way of destroying the derived class and boost::ptr_vector must be told about this. * Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use an automatic PARAM_CFG_ARRAY which is on the stack.\ * PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array, since it has to access the current BOARD and the BOARD can change. Remember BOARD_DESIGN_SETTINGS are now in the BOARD. * Made the m_BoundingBox member private, this was a brutally hard task, and indicative of the lack of commitment to accessors and object oriented design on the part of KiCad developers. We must do better. Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox(). * Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override
{
/* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
* always ignored the page and border, this function returns a bbox without them
* as well when passed true. This technically is not all things visible, but it
* keeps behavior consistent.
*
* When passed false, this function returns a bbox of just the board edge. This
* allows things like fabrication text or anything else outside the board edge to
* be ignored, and just zooms up to the board itself.
*
* Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
* the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
*/
if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
return GetBoardBoundingBox( false );
else
return GetBoardBoundingBox( true );
}
2016-09-24 18:53:15 +00:00
virtual void SetPageSettings( const PAGE_INFO& aPageSettings ) override;
const PAGE_INFO& GetPageSettings() const override;
const VECTOR2I GetPageSizeIU() const override;
const VECTOR2I& GetGridOrigin() const override;
void SetGridOrigin( const VECTOR2I& aPoint ) override;
const VECTOR2I& GetAuxOrigin() const;
const VECTOR2I GetUserOrigin() const;
/**
* Return a reference to the default ORIGIN_TRANSFORMS object
*/
ORIGIN_TRANSFORMS& GetOriginTransforms() override;
2016-09-24 18:53:15 +00:00
const TITLE_BLOCK& GetTitleBlock() const override;
void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) override;
/**
2020-12-19 23:29:10 +00:00
* Returns the BOARD_DESIGN_SETTINGS for the open project.
*/
virtual BOARD_DESIGN_SETTINGS& GetDesignSettings() const;
2012-02-06 05:44:19 +00:00
/**
2020-12-19 23:29:10 +00:00
* Helper to retrieve the current color settings.
*/
2021-09-07 20:34:10 +00:00
virtual COLOR_SETTINGS* GetColorSettings( bool aForceRefresh = false ) const override
{
2022-02-09 11:14:08 +00:00
wxFAIL_MSG( wxT( "Color settings requested for a PCB_BASE_FRAME that does not override!" ) );
return nullptr;
}
void SetDrawBgColor( const COLOR4D& aColor ) override;
/**
* Display options control the way tracks, vias, outlines and other things are shown
2020-12-19 23:29:10 +00:00
* (for instance solid or sketch mode).
*/
2020-09-30 22:02:05 +00:00
const PCB_DISPLAY_OPTIONS& GetDisplayOptions() const { return m_displayOptions; }
/**
* Updates the current display options from the given options struct
* @param aOptions is the options struct to apply
* @param aRefresh will refresh the view after updating
*/
void SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh = true );
2012-02-06 05:44:19 +00:00
const ZONE_SETTINGS& GetZoneSettings() const;
void SetZoneSettings( const ZONE_SETTINGS& aSettings );
/**
2020-12-19 23:29:10 +00:00
* Return the #PCB_PLOT_PARAMS for the BOARD owned by this frame.
*/
virtual const PCB_PLOT_PARAMS& GetPlotSettings() const;
virtual void SetPlotSettings( const PCB_PLOT_PARAMS& aSettings );
/**
* Reload the footprint from the library.
* @param aFootprint is the footprint to reload.
*/
virtual void ReloadFootprint( FOOTPRINT* aFootprint )
{
wxFAIL_MSG( wxT( "Attempted to reload a footprint for PCB_BASE_FRAME that does not override!" ) );
}
2009-07-30 11:04:07 +00:00
/**
2020-12-19 23:29:10 +00:00
* Set the #m_Pcb member in such as way as to ensure deleting any previous #BOARD.
2009-07-30 11:04:07 +00:00
*/
virtual void SetBoard( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr );
2009-07-30 11:04:07 +00:00
BOARD* GetBoard() const
2009-07-30 11:04:07 +00:00
{
2020-09-30 22:02:05 +00:00
wxASSERT( m_pcb );
return m_pcb;
2009-07-30 11:04:07 +00:00
}
/**
* @return the primary data model.
*/
virtual BOARD_ITEM_CONTAINER* GetModel() const = 0;
EDA_ITEM* GetItem( const KIID& aId ) const override;
void FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer = UNDEFINED_LAYER );
void FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer = UNDEFINED_LAYER );
void HideSolderMask();
void ShowSolderMask();
2009-07-30 11:04:07 +00:00
// General
virtual void ReCreateOptToolbar() override { }
virtual void ShowChangedLanguage() override;
2016-09-24 18:53:15 +00:00
virtual void UpdateStatusBar() override;
2009-11-23 20:18:47 +00:00
2016-09-25 17:06:49 +00:00
PCB_SCREEN* GetScreen() const override { return (PCB_SCREEN*) EDA_DRAW_FRAME::GetScreen(); }
2009-07-30 11:04:07 +00:00
/**
* Shows the 3D view frame.
2020-12-19 23:29:10 +00:00
*
* If it does not exist, it is created. If it exists, it is brought to the foreground.
*/
2021-06-19 17:28:45 +00:00
EDA_3D_VIEWER_FRAME* CreateAndShow3D_Frame();
2009-07-30 11:04:07 +00:00
/**
2020-12-19 23:29:10 +00:00
* @return global configuration options.
2009-07-30 11:04:07 +00:00
*/
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide();
/**
2020-12-19 23:29:10 +00:00
* Put up a dialog and allows the user to pick a library, for unspecified use.
*
2020-12-19 23:29:10 +00:00
* @param aNicknameExisting is the current choice to highlight.
* @return the library or wxEmptyString on abort.
*/
wxString SelectLibrary( const wxString& aNicknameExisting );
/**
2020-12-19 23:29:10 +00:00
* @return a reference to the footprint found by its reference on the current board. The
* reference is entered by the user from a dialog (by awxTextCtlr, or a list of
* available references)
*/
2020-11-13 15:15:52 +00:00
FOOTPRINT* GetFootprintFromBoardByReference();
2009-07-30 11:04:07 +00:00
2010-11-12 15:17:10 +00:00
/**
* Must be called after a change in order to set the "modify" flag and update other data
* structures and GUI elements.
*/
void OnModify() override;
2010-11-12 15:17:10 +00:00
/**
2020-12-19 23:29:10 +00:00
* Creates a new footprint, at position 0,0.
*
2020-11-08 21:29:04 +00:00
* The new footprint contains only 2 texts: a reference and a value:
* Reference = REF**
* Value = "VAL**" or Footprint name in lib
2020-12-19 23:29:10 +00:00
*
* @note They are dummy texts, which will be replaced by the actual texts when the
* footprint is placed on a board and a netlist is read.
*
* @param aFootprintName is the name of the new footprint in library.
* @param aLibName optional, if specified is the library for the new footprint
2021-09-24 20:47:57 +00:00
* @param aQuiet prevents user dialogs from being shown
2010-07-20 18:11:34 +00:00
*/
FOOTPRINT* CreateNewFootprint( const wxString& aFootprintName, const wxString& aLibName,
bool aQuiet );
/**
2020-12-19 23:29:10 +00:00
* Places \a aFootprint at the current cursor position and updates footprint coordinates
* with the new position.
*
2020-11-13 11:17:15 +00:00
* @param aRecreateRatsnest A bool true redraws the footprint ratsnest.
*/
2020-11-13 15:15:52 +00:00
void PlaceFootprint( FOOTPRINT* aFootprint, bool aRecreateRatsnest = true );
2009-07-30 11:04:07 +00:00
2020-11-12 22:30:02 +00:00
void ShowPadPropertiesDialog( PAD* aPad );
2009-11-23 20:18:47 +00:00
/**
2020-12-19 23:29:10 +00:00
* Open a dialog to select a footprint.
*
2020-12-19 23:29:10 +00:00
* @param aPreslect if valid, the #LIB_ID to select (otherwise the global history is used).
*/
2020-11-13 15:15:52 +00:00
FOOTPRINT* SelectFootprintFromLibTree( LIB_ID aPreselect = LIB_ID() );
/**
2020-12-19 23:29:10 +00:00
* Add the given footprint to the board.
*
* @param aDC is the current Device Context, to draw the new footprint (can be NULL ).
*/
2020-11-13 15:15:52 +00:00
virtual void AddFootprintToBoard( FOOTPRINT* aFootprint );
/**
2020-12-19 23:29:10 +00:00
* Launch the footprint viewer to select the name of a footprint to load.
*
* @return the selected footprint name or an empty string if no selection was made.
*/
wxString SelectFootprintFromLibBrowser();
2010-12-29 17:47:32 +00:00
/**
2020-12-19 23:29:10 +00:00
* Create the entire board ratsnest.
*
* This must be called after a board change (changes for pads, footprints or a read
* netlist ).
*
* @param aDisplayStatus if true, display the computation results.
2010-12-29 17:47:32 +00:00
*/
2019-05-30 15:11:17 +00:00
void Compile_Ratsnest( bool aDisplayStatus );
2010-12-29 17:47:32 +00:00
2010-11-12 15:17:10 +00:00
/**
2020-12-19 23:29:10 +00:00
* Create a new entry in undo list of commands.
*
* @param aItemToCopy is the board item modified by the command to undo.
* @param aTypeCommand is the command type (see enum #UNDO_REDO).
2009-07-30 11:04:07 +00:00
*/
virtual void SaveCopyInUndoList( EDA_ITEM* aItemToCopy, UNDO_REDO aTypeCommand ) = 0;
2009-07-30 11:04:07 +00:00
2010-11-12 15:17:10 +00:00
/**
* Creates a new entry in undo list of commands.
2020-12-19 23:29:10 +00:00
*
* @param aItemsList is the list of items modified by the command to undo.
* @param aTypeCommand is the command type (see enum #UNDO_REDO)
*/
virtual void SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList,
UNDO_REDO aTypeCommand ) = 0;
2022-02-25 13:05:25 +00:00
/**
* As SaveCopyInUndoList, but appends the changes to the last undo item on the stack.
*/
virtual void AppendCopyToUndoList( const PICKED_ITEMS_LIST& aItemsList,
UNDO_REDO aTypeCommand ) = 0;
2009-07-30 11:04:07 +00:00
2020-12-19 23:29:10 +00:00
/**
* Show the dialog box for a layer selection.
2020-12-19 23:29:10 +00:00
*
* @param aDefaultLayer is the default layer to select. Use UNDEFINED_LAYER if no selection
2020-12-19 23:29:10 +00:00
* is desired.
* @param aNotAllowedLayersMask is a layer mask for not allowed layers. Use 0 to show all
* layers in use.
* @param aDlgPosition is the position of dialog (default is centered).
* @return the selected layer id.
*/
PCB_LAYER_ID SelectOneLayer( PCB_LAYER_ID aDefaultLayer, LSET aNotAllowedLayersMask = LSET(),
wxPoint aDlgPosition = wxDefaultPosition );
/**
* Change the active layer in the frame
*
* @param aLayer New layer to make active
*/
virtual void SwitchLayer( PCB_LAYER_ID aLayer );
2009-07-30 11:04:07 +00:00
virtual void SetActiveLayer( PCB_LAYER_ID aLayer ) { GetScreen()->m_Active_Layer = aLayer; }
virtual PCB_LAYER_ID GetActiveLayer() const { return GetScreen()->m_Active_Layer; }
SEVERITY GetSeverity( int aErrorCode ) const override;
virtual void OnDisplayOptionsChanged() {}
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
PCBNEW_SETTINGS* GetPcbNewSettings() const;
FOOTPRINT_EDITOR_SETTINGS* GetFootprintEditorSettings() const;
virtual PCB_VIEWERS_SETTINGS_BASE* GetViewerSettingsBase() const;
virtual MAGNETIC_SETTINGS* GetMagneticItemsSettings();
void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
PCB_DRAW_PANEL_GAL* GetCanvas() const override;
virtual void ActivateGalCanvas() override;
/**
* Add \a aListener to post #EDA_EVT_BOARD_CHANGED command events to.
*
* @warning The caller is reponsible for removing any listeners that are no long valid.
*
* @note This only gets called when the board editor is in stand alone mode. Changing
* projects in the project manager closes the board editor when a new project is
* loaded.
*/
void AddBoardChangeListener( wxEvtHandler* aListener );
/**
* Remove \a aListener to from the board changed listener list.
*/
void RemoveBoardChangeListener( wxEvtHandler* aListener );
/**
* Handler for FP change events. Responds to the filesystem watcher set in #setFPWatcher.
*/
void OnFPChange( wxFileSystemWatcherEvent& aEvent );
/**
* Handler for the filesystem watcher debounce timer.
*/
void OnFpChangeDebounceTimer( wxTimerEvent& aEvent );
2020-12-19 23:29:10 +00:00
protected:
bool canCloseWindow( wxCloseEvent& aCloseEvent ) override;
2020-12-19 23:29:10 +00:00
void handleActivateEvent( wxActivateEvent& aEvent ) override;
void handleIconizeEvent( wxIconizeEvent& aEvent ) override;
virtual void doReCreateMenuBar() override;
2020-12-19 23:29:10 +00:00
/**
* Attempts to load \a aFootprintId from the footprint library table.
*
* @param aFootprintId is the #LIB_ID of component footprint to load.
* @return the #FOOTPRINT if found or NULL if \a aFootprintId not found in any of the
* libraries in the table returned from #Prj().PcbFootprintLibs().
* @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error
* occurs while reading footprint library files.
*/
FOOTPRINT* loadFootprint( const LIB_ID& aFootprintId );
virtual void unitsChangeRefresh() override;
void rebuildConnectivity();
/**
* Creates (or removes) a watcher on the specified footprint
* @param aFootprint If nullptr, the watcher is removed. Otherwise, set a change watcher
*/
void setFPWatcher( FOOTPRINT* aFootprint );
protected:
2020-12-19 23:29:10 +00:00
BOARD* m_pcb;
PCB_DISPLAY_OPTIONS m_displayOptions;
PCB_ORIGIN_TRANSFORMS m_originTransforms;
private:
2022-08-30 23:28:18 +00:00
NL_PCBNEW_PLUGIN* m_spaceMouse;
std::unique_ptr<wxFileSystemWatcher> m_watcher;
wxFileName m_watcherFileName;
wxDateTime m_watcherLastModified;
wxTimer m_watcherDebounceTimer;
std::vector<wxEvtHandler*> m_boardChangeListeners;
2009-07-30 11:04:07 +00:00
};
#endif // PCB_BASE_FRAME_H