Reduce dependency on dynamic_cast.

(Especially where it is no-worky on MacOS.)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17245
This commit is contained in:
Jeff Young 2024-09-04 17:23:31 +01:00
parent 43ea0d0adb
commit 94f995c49e
44 changed files with 389 additions and 246 deletions

View File

@ -230,7 +230,7 @@ void BOARD_ADAPTER::ReloadColorSettings() noexcept
try
{
cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
}
catch( const std::runtime_error& e )
{

View File

@ -1243,8 +1243,6 @@ void RENDER_3D_RAYTRACE_BASE::load3DModels( CONTAINER_3D& aDstContainer, bool aS
fpMatrix, SFVEC3F( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
modelunit_to_3d_units_factor ) );
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( fp );
// Get the list of model files for this model
S3D_CACHE* cacheMgr = m_boardAdapter.Get3dCacheManager();
@ -1299,7 +1297,7 @@ void RENDER_3D_RAYTRACE_BASE::load3DModels( CONTAINER_3D& aDstContainer, bool aS
SFVEC3F( model.m_Scale.x, model.m_Scale.y, model.m_Scale.z ) );
addModels( aDstContainer, modelPtr, modelMatrix, (float) model.m_Opacity,
aSkipMaterialInformation, boardItem );
aSkipMaterialInformation, fp );
}
}
}

View File

@ -114,7 +114,7 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent
SetStatusWidths( arrayDim( status_dims ), status_dims );
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
ANTIALIASING_MODE aaMode = static_cast<ANTIALIASING_MODE>( cfg->m_Render.opengl_AA_mode );
m_canvas = new EDA_3D_CANVAS( this, OGL_ATT_LIST::GetAttributesList( aaMode, true ),
@ -480,7 +480,7 @@ void EDA_3D_VIEWER_FRAME::Process_Special_Functions( wxCommandEvent &event )
case ID_MENU3D_RESET_DEFAULTS:
{
auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
cfg->ResetToDefaults();
LoadSettings( cfg );
@ -562,8 +562,8 @@ void EDA_3D_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE *aCfg )
{
EDA_BASE_FRAME::LoadSettings( aCfg );
EDA_3D_VIEWER_SETTINGS* cfg = dynamic_cast<EDA_3D_VIEWER_SETTINGS*>( aCfg );
wxASSERT( cfg );
// Dynamic_cast here will fail on Mac when called from CvPCB.
EDA_3D_VIEWER_SETTINGS* cfg = static_cast<EDA_3D_VIEWER_SETTINGS*>( aCfg );
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::LoadSettings" ) );
@ -604,7 +604,7 @@ void EDA_3D_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE *aCfg )
void EDA_3D_VIEWER_FRAME::SaveSettings( APP_SETTINGS_BASE *aCfg )
{
auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
EDA_BASE_FRAME::SaveSettings( cfg );
@ -640,7 +640,7 @@ void EDA_3D_VIEWER_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTex
ReCreateMainToolbar();
loadCommonSettings();
applySettings( Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>() );
applySettings( Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" ) );
m_appearancePanel->CommonSettingsChanged();
@ -669,7 +669,7 @@ void EDA_3D_VIEWER_FRAME::ShowChangedLanguage()
void EDA_3D_VIEWER_FRAME::ToggleAppearanceManager()
{
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
wxAuiPaneInfo& layersManager = m_auimgr.GetPane( "LayersManager" );
// show auxiliary Vertical layers and visibility manager toolbar

View File

@ -204,7 +204,7 @@ void PANEL_PREVIEW_3D_MODEL::loadSettings()
// TODO(JE) use all control options
m_boardAdapter.m_MousewheelPanning = settings->m_Input.scroll_modifier_zoom != 0;
EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
auto* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
if( cfg )
{

View File

@ -34,7 +34,8 @@
#include <wx/fdrepdlg.h>
#include <eda_pattern_match.h>
EDA_ITEM::EDA_ITEM( EDA_ITEM* parent, KICAD_T idType ) :
EDA_ITEM::EDA_ITEM( EDA_ITEM* parent, KICAD_T idType, bool isSCH_ITEM, bool isBOARD_ITEM ) :
KIGFX::VIEW_ITEM( isSCH_ITEM, isBOARD_ITEM ),
m_structType( idType ),
m_flags( 0 ),
m_parent( parent ),
@ -42,7 +43,8 @@ EDA_ITEM::EDA_ITEM( EDA_ITEM* parent, KICAD_T idType ) :
{ }
EDA_ITEM::EDA_ITEM( KICAD_T idType ) :
EDA_ITEM::EDA_ITEM( KICAD_T idType, bool isSCH_ITEM, bool isBOARD_ITEM ) :
KIGFX::VIEW_ITEM( isSCH_ITEM, isBOARD_ITEM ),
m_structType( idType ),
m_flags( 0 ),
m_parent( nullptr ),
@ -51,6 +53,7 @@ EDA_ITEM::EDA_ITEM( KICAD_T idType ) :
EDA_ITEM::EDA_ITEM( const EDA_ITEM& base ) :
KIGFX::VIEW_ITEM( base.IsSCH_ITEM(), base.IsBOARD_ITEM() ),
m_Uuid( base.m_Uuid ),
m_structType( base.m_structType ),
m_flags( base.m_flags ),

View File

@ -371,20 +371,20 @@ void DISPLAY_FOOTPRINTS_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
WINDOW_SETTINGS* DISPLAY_FOOTPRINTS_FRAME::GetWindowSettings( APP_SETTINGS_BASE* aCfg )
{
CVPCB_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>();
CVPCB_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>( "cvpcb" );
return &cfg->m_FootprintViewer;
}
PCB_VIEWERS_SETTINGS_BASE* DISPLAY_FOOTPRINTS_FRAME::GetViewerSettingsBase() const
{
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>( "cvpcb" );
}
MAGNETIC_SETTINGS* DISPLAY_FOOTPRINTS_FRAME::GetMagneticItemsSettings()
{
CVPCB_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>();
CVPCB_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>( "cvpcb" );
return &cfg->m_FootprintViewerMagneticSettings;
}
@ -525,6 +525,7 @@ void DISPLAY_FOOTPRINTS_FRAME::InitDisplay()
}
GetBoard()->Add( footprint );
GetCanvas()->GetView()->Update( footprint );
m_currentFootprint = footprintName;
m_currentComp = comp;
setFPWatcher( footprint );
@ -579,10 +580,10 @@ void DISPLAY_FOOTPRINTS_FRAME::UpdateMsgPanel()
COLOR_SETTINGS* DISPLAY_FOOTPRINTS_FRAME::GetColorSettings( bool aForceRefresh ) const
{
auto* settings = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
auto* cfg = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
if( settings )
return Pgm().GetSettingsManager().GetColorSettings( settings->m_ColorTheme );
if( cfg )
return Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
else
return Pgm().GetSettingsManager().GetColorSettings();
}

View File

@ -75,7 +75,7 @@ wxString SCH_ITEM::GetBodyStyleDescription( int aBodyStyle )
/* They are not inline because this creates problems with gcc at linking time in debug mode */
SCH_ITEM::SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType, int aUnit, int aBodyStyle ) :
EDA_ITEM( aParent, aType ),
EDA_ITEM( aParent, aType, true, false ),
m_unit( aUnit ),
m_bodyStyle( aBodyStyle ),
m_private( false )

View File

@ -79,7 +79,7 @@ class BOARD_ITEM : public EDA_ITEM
{
public:
BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype, PCB_LAYER_ID aLayer = F_Cu ) :
EDA_ITEM( aParent, idtype ),
EDA_ITEM( aParent, idtype, false, true ),
m_layer( aLayer ),
m_isKnockout( false ),
m_isLocked( false ),

View File

@ -470,8 +470,8 @@ public:
#endif
protected:
EDA_ITEM( EDA_ITEM* parent, KICAD_T idType );
EDA_ITEM( KICAD_T idType );
EDA_ITEM( EDA_ITEM* parent, KICAD_T idType, bool isSCH_ITEM = false, bool isBOARD_ITEM = false );
EDA_ITEM( KICAD_T idType, bool isSCH_ITEM = false, bool isBOARD_ITEM = false );
EDA_ITEM( const EDA_ITEM& base );
/**

View File

@ -103,7 +103,7 @@ public:
size_t typeHash = typeid( T ).hash_code();
if( m_app_settings_cache.count( typeHash ) )
ret = dynamic_cast<T*>( m_app_settings_cache.at( typeHash ) );
ret = static_cast<T*>( m_app_settings_cache.at( typeHash ) );
if( ret )
return ret;
@ -128,6 +128,42 @@ public:
return ret;
}
template<typename T>
T* GetAppSettings( const wxString& aFilename )
{
#ifndef __WXMAC__
return GetAppSettings<T>();
#endif
T* ret = nullptr;
size_t typeHash = typeid( T ).hash_code();
if( m_app_settings_cache.count( typeHash ) )
ret = static_cast<T*>( m_app_settings_cache.at( typeHash ) );
if( ret )
return ret;
auto it = std::find_if( m_settings.begin(), m_settings.end(),
[&]( const std::unique_ptr<JSON_SETTINGS>& aSettings )
{
return aSettings->GetFilename() == aFilename;
} );
if( it != m_settings.end() )
{
ret = static_cast<T*>( it->get() );
}
else
{
throw std::runtime_error( "Tried to GetAppSettings before registering" );
}
m_app_settings_cache[typeHash] = ret;
return ret;
}
/**
* Retrieves a color settings object that applications can read colors from.
* If the given settings file cannot be found, returns the default settings.

View File

@ -83,7 +83,9 @@ enum VIEW_VISIBILITY_FLAGS {
class GAL_API VIEW_ITEM : public INSPECTABLE
{
public:
VIEW_ITEM() :
VIEW_ITEM( bool isSCH_ITEM = false, bool isBOARD_ITEM = false ) :
m_isSCH_ITEM( isSCH_ITEM ),
m_isBOARD_ITEM( isBOARD_ITEM ),
m_viewPrivData( nullptr ),
m_forcedTransparency( 0.0 )
{
@ -94,6 +96,8 @@ public:
VIEW_ITEM( const VIEW_ITEM& aOther ) = delete;
VIEW_ITEM& operator=( const VIEW_ITEM& aOther ) = delete;
bool IsSCH_ITEM() const { return m_isSCH_ITEM; }
bool IsBOARD_ITEM() const { return m_isBOARD_ITEM; }
/**
* Return the bounding box of the item covering all its layers.
*
@ -162,6 +166,8 @@ public:
private:
friend class VIEW;
bool m_isSCH_ITEM;
bool m_isBOARD_ITEM;
VIEW_ITEM_DATA* m_viewPrivData;
double m_forcedTransparency; ///< Additional transparency for diff'ing items.
};

View File

@ -88,12 +88,12 @@ void ARRAY_CREATOR::Invoke()
for ( int i = 0; i < m_selection.Size(); ++i )
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( m_selection[ i ] );
if( !item )
if( !m_selection[i]->IsBOARD_ITEM() )
continue;
FOOTPRINT* parentFootprint = dynamic_cast<FOOTPRINT*>( item->GetParentFootprint() );
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_selection[ i ] );
FOOTPRINT* parentFootprint = item->GetParentFootprint();
// If it is not the footprint editor, then duplicate the parent footprint instead.
// This check assumes that the footprint child objects are correctly parented, if

View File

@ -502,8 +502,10 @@ void BOARD::Move( const VECTOR2I& aMoveVector ) // overload
INSPECTOR_FUNC inspector =
[&] ( EDA_ITEM* item, void* testData )
{
if( BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item ) )
if( item->IsBOARD_ITEM() )
{
BOARD_ITEM* board_item = static_cast<BOARD_ITEM*>( item );
// aMoveVector was snapshotted, don't need "data".
// Only move the top level group
if( !board_item->GetParentGroup() && !board_item->GetParentFootprint() )
@ -2818,8 +2820,10 @@ BOARD::GroupLegalOpsField BOARD::GroupLegalOps( const PCB_SELECTION& selection )
for( EDA_ITEM* item : selection )
{
if( BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item ) )
if( item->IsBOARD_ITEM() )
{
BOARD_ITEM* board_item = static_cast<BOARD_ITEM*>( item );
if( board_item->Type() == PCB_GROUP_T )
hasGroup = true;

View File

@ -207,9 +207,12 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
for( COMMIT_LINE& ent : m_changes )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( ent.m_item );
if( !ent.m_item || !ent.m_item->IsBOARD_ITEM() )
continue;
if( m_isBoardEditor && boardItem )
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
if( m_isBoardEditor )
{
if( boardItem->Type() == PCB_VIA_T || boardItem->Type() == PCB_FOOTPRINT_T
|| boardItem->IsOnLayer( F_Mask ) || boardItem->IsOnLayer( B_Mask ) )
@ -248,7 +251,7 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
}
}
if( boardItem && boardItem->IsSelected() )
if( boardItem->IsSelected() )
selectedModified = true;
}
@ -258,12 +261,12 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
for( COMMIT_LINE& ent : m_changes )
{
int changeType = ent.m_type & CHT_TYPE;
int changeFlags = ent.m_type & CHT_FLAGS;
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( ent.m_item );
if( !ent.m_item || !ent.m_item->IsBOARD_ITEM() )
continue;
wxASSERT( ent.m_item );
wxCHECK2( boardItem, continue );
BOARD_ITEM* boardItem = boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
int changeType = ent.m_type & CHT_TYPE;
int changeFlags = ent.m_type & CHT_FLAGS;
switch( changeType )
{
@ -422,7 +425,10 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
case CHT_MODIFY:
{
BOARD_ITEM* boardItemCopy = dynamic_cast<BOARD_ITEM*>( ent.m_copy );
BOARD_ITEM* boardItemCopy = nullptr;
if( ent.m_copy && ent.m_copy->IsBOARD_ITEM() )
boardItemCopy = static_cast<BOARD_ITEM*>( ent.m_copy );
if( !( aCommitFlags & SKIP_UNDO ) )
{
@ -510,8 +516,14 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
for( size_t i = num_changes; i < m_changes.size(); ++i )
{
COMMIT_LINE& ent = m_changes[i];
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( ent.m_item );
BOARD_ITEM* boardItemCopy = dynamic_cast<BOARD_ITEM*>( ent.m_copy );
BOARD_ITEM* boardItem = nullptr;
BOARD_ITEM* boardItemCopy = nullptr;
if( ent.m_item && ent.m_item->IsBOARD_ITEM() )
boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
if( ent.m_copy && ent.m_copy->IsBOARD_ITEM() )
boardItemCopy = static_cast<BOARD_ITEM*>( ent.m_copy );
wxCHECK2( boardItem, continue );
@ -600,8 +612,8 @@ EDA_ITEM* BOARD_COMMIT::MakeImage( EDA_ITEM* aItem )
{
EDA_ITEM* clone = aItem->Clone();
if( BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( clone ) )
board_item->SetParentGroup( nullptr );
if( clone->IsBOARD_ITEM() )
static_cast<BOARD_ITEM*>( clone )->SetParentGroup( nullptr );
clone->SetFlags( UR_TRANSIENT );
@ -625,12 +637,14 @@ void BOARD_COMMIT::Revert()
for( auto it = m_changes.rbegin(); it != m_changes.rend(); ++it )
{
COMMIT_LINE& ent = *it;
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( ent.m_item );
if( !ent.m_item || !ent.m_item->IsBOARD_ITEM() )
continue;
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( ent.m_item );
int changeType = ent.m_type & CHT_TYPE;
int changeFlags = ent.m_type & CHT_FLAGS;
wxCHECK2( boardItem, continue );
switch( changeType )
{
case CHT_ADD:
@ -661,15 +675,18 @@ void BOARD_COMMIT::Revert()
break;
case CHT_REMOVE:
{
if( !( changeFlags & CHT_DONE ) )
break;
view->Add( boardItem );
connectivity->Add( boardItem );
if( FOOTPRINT* parentFP = dynamic_cast<FOOTPRINT*>( board->GetItem( ent.m_parent ) ) )
BOARD_ITEM* parent = board->GetItem( ent.m_parent );
if( parent->Type() == PCB_FOOTPRINT_T )
{
parentFP->Add( boardItem, ADD_MODE::INSERT );
static_cast<FOOTPRINT*>( parent )->Add( boardItem, ADD_MODE::INSERT );
}
else
{
@ -678,14 +695,15 @@ void BOARD_COMMIT::Revert()
}
break;
}
case CHT_MODIFY:
{
view->Remove( boardItem );
connectivity->Remove( boardItem );
BOARD_ITEM* boardItemCopy = dynamic_cast<BOARD_ITEM*>( ent.m_copy );
wxASSERT( boardItemCopy );
wxASSERT( ent.m_copy && ent.m_copy->IsBOARD_ITEM() );
BOARD_ITEM* boardItemCopy = static_cast<BOARD_ITEM*>( ent.m_copy );
boardItem->SwapItemData( boardItemCopy );
if( PCB_GROUP* group = dynamic_cast<PCB_GROUP*>( boardItem ) )

View File

@ -267,7 +267,9 @@ INSPECT_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* aTestItem, void* aTestData
break;
default:
boardItem = dynamic_cast<BOARD_ITEM*>( aTestItem );
if( aTestItem->IsBOARD_ITEM() )
boardItem = static_cast<BOARD_ITEM*>( aTestItem );
break;
}

View File

@ -188,7 +188,7 @@ void DIALOG_FOOTPRINT_CHOOSER::build3DCanvas()
// TODO(JE) use all control options
m_boardAdapter.m_MousewheelPanning = settings->m_Input.scroll_modifier_zoom != 0;
EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
auto* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
if( cfg )
{

View File

@ -303,7 +303,10 @@ void DIALOG_POSITION_RELATIVE::OnUseUserOriginClick( wxCommandEvent& event )
void DIALOG_POSITION_RELATIVE::UpdateAnchor( EDA_ITEM* aItem )
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
BOARD_ITEM* item = nullptr;
if( aItem && aItem->IsBOARD_ITEM() )
item = static_cast<BOARD_ITEM*>( aItem );
m_options.anchorType = ANCHOR_ITEM;
updateAnchorInfo( item );

View File

@ -765,8 +765,7 @@ LSEQ PANEL_SETUP_LAYERS::getRemovedLayersWithItems()
{
BOARD_ITEM* item = collector[i];
if( dynamic_cast<FOOTPRINT*>( item )
|| dynamic_cast<FOOTPRINT*>( item->GetParentFootprint() ) )
if( item->Type() == PCB_FOOTPRINT_T || item->GetParentFootprint() )
continue;
removedLayers.push_back( layer_id );

View File

@ -374,10 +374,10 @@ WINDOW_SETTINGS* FOOTPRINT_CHOOSER_FRAME::GetWindowSettings( APP_SETTINGS_BASE*
COLOR_SETTINGS* FOOTPRINT_CHOOSER_FRAME::GetColorSettings( bool aForceRefresh ) const
{
auto* settings = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
auto* cfg = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
if( settings )
return Pgm().GetSettingsManager().GetColorSettings( settings->m_ColorTheme );
if( cfg )
return Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
else
return Pgm().GetSettingsManager().GetColorSettings();
}

View File

@ -246,7 +246,7 @@ wxWindow* FOOTPRINT_PREVIEW_PANEL::GetWindow()
FOOTPRINT_PREVIEW_PANEL* FOOTPRINT_PREVIEW_PANEL::New( KIWAY* aKiway, wxWindow* aParent,
UNITS_PROVIDER* aUnitsProvider )
{
PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
if( cfg->m_Window.grid.grids.empty() )
cfg->m_Window.grid.grids = cfg->DefaultGridSizeList();

View File

@ -811,7 +811,7 @@ void FOOTPRINT_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
PCB_BASE_FRAME::LoadSettings( aCfg );
// Fetch display and grid settings from Footprint Editor
auto fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
auto* fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
m_displayOptions = fpedit->m_Display;
GetGalDisplayOptions().ReadWindowSettings( fpedit->m_Window );
@ -861,10 +861,10 @@ WINDOW_SETTINGS* FOOTPRINT_VIEWER_FRAME::GetWindowSettings( APP_SETTINGS_BASE* a
COLOR_SETTINGS* FOOTPRINT_VIEWER_FRAME::GetColorSettings( bool aForceRefresh ) const
{
auto* settings = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
auto* cfg = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
if( settings )
return Pgm().GetSettingsManager().GetColorSettings( settings->m_ColorTheme );
if( cfg )
return Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
else
return Pgm().GetSettingsManager().GetColorSettings();
}

View File

@ -70,8 +70,8 @@ void GRID_CELL_LAYER_RENDERER::Draw( wxGrid& aGrid, wxGridCellAttr& aAttr, wxDC&
else
{
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
FOOTPRINT_EDITOR_SETTINGS* settings = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
cs = mgr.GetColorSettings( settings->m_ColorTheme );
FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
cs = mgr.GetColorSettings( cfg->m_ColorTheme );
}
// draw the swatch

View File

@ -170,10 +170,11 @@ void CLIPBOARD_IO::SaveSelection( const PCB_SELECTION& aSelected, bool isFootpri
for( EDA_ITEM* item : aSelected )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
BOARD_ITEM* copy = nullptr;
if( !item->IsBOARD_ITEM() )
continue;
wxCHECK2( boardItem, continue );
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
BOARD_ITEM* copy = nullptr;
if( PCB_FIELD* field = dynamic_cast<PCB_FIELD*>( item ) )
{
@ -283,7 +284,10 @@ void CLIPBOARD_IO::SaveSelection( const PCB_SELECTION& aSelected, bool isFootpri
for( EDA_ITEM* item : aSelected )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( !item->IsBOARD_ITEM() )
continue;
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
BOARD_ITEM* copy = nullptr;
wxCHECK2( boardItem, continue );

View File

@ -594,7 +594,10 @@ void PCB_BASE_FRAME::SetPlotSettings( const PCB_PLOT_PARAMS& aSettings )
GetCanvas()->GetView()->UpdateAllItemsConditionally(
[&]( KIGFX::VIEW_ITEM* aItem ) -> int
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
BOARD_ITEM* item = nullptr;
if( aItem->IsBOARD_ITEM() )
item = static_cast<BOARD_ITEM*>( aItem );
// Note: KIGFX::REPAINT isn't enough for things that go from invisible to
// visible as they won't be found in the view layer's itemset for re-painting.
@ -913,13 +916,13 @@ void PCB_BASE_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
PCBNEW_SETTINGS* PCB_BASE_FRAME::GetPcbNewSettings() const
{
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
}
FOOTPRINT_EDITOR_SETTINGS* PCB_BASE_FRAME::GetFootprintEditorSettings() const
{
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
}
@ -930,18 +933,18 @@ PCB_VIEWERS_SETTINGS_BASE* PCB_BASE_FRAME::GetViewerSettingsBase() const
case FRAME_PCB_EDITOR:
case FRAME_PCB_DISPLAY3D:
default:
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
case FRAME_FOOTPRINT_EDITOR:
case FRAME_FOOTPRINT_WIZARD:
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
case FRAME_FOOTPRINT_VIEWER:
case FRAME_FOOTPRINT_CHOOSER:
case FRAME_FOOTPRINT_PREVIEW:
case FRAME_CVPCB:
case FRAME_CVPCB_DISPLAY:
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>( "cvpcb" );
}
}

View File

@ -322,7 +322,7 @@ void PCB_DRAW_PANEL_GAL::UpdateColors()
}
else
{
PCBNEW_SETTINGS* app = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
auto* app = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
if( app )
cs = Pgm().GetSettingsManager().GetColorSettings( app->m_ColorTheme );

View File

@ -1313,12 +1313,13 @@ void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage )
GetCanvas()->GetView()->UpdateAllItemsConditionally(
[&]( KIGFX::VIEW_ITEM* aItem ) -> int
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
int flags = 0;
int flags = 0;
if( !item )
if( !aItem->IsBOARD_ITEM() )
return flags;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
{
// Note: KIGFX::REPAINT isn't enough for things that go from invisible
@ -1468,11 +1469,11 @@ void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer )
GetCanvas()->GetView()->UpdateAllItemsConditionally(
[&]( KIGFX::VIEW_ITEM* aItem ) -> int
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
if( !item )
if( !aItem->IsBOARD_ITEM() )
return 0;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
// Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible
// as they won't be found in the view layer's itemset for re-painting.
if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )

View File

@ -87,18 +87,18 @@ PCB_VIEWERS_SETTINGS_BASE* PCB_PAINTER::viewer_settings()
case FRAME_PCB_EDITOR:
case FRAME_PCB_DISPLAY3D:
default:
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
case FRAME_FOOTPRINT_EDITOR:
case FRAME_FOOTPRINT_WIZARD:
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fp_edit" );
case FRAME_FOOTPRINT_VIEWER:
case FRAME_FOOTPRINT_CHOOSER:
case FRAME_FOOTPRINT_PREVIEW:
case FRAME_CVPCB:
case FRAME_CVPCB_DISPLAY:
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>();
return Pgm().GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>( "cvpcb" );
}
}
@ -544,11 +544,11 @@ int PCB_PAINTER::getViaDrillSize( const PCB_VIA* aVia ) const
bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer )
{
const BOARD_ITEM* item = dynamic_cast<const BOARD_ITEM*>( aItem );
if( !item )
if( !aItem->IsBOARD_ITEM() )
return false;
const BOARD_ITEM* item = static_cast<const BOARD_ITEM*>( aItem );
if( const BOARD* board = item->GetBoard() )
{
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();

View File

@ -56,8 +56,16 @@ PCB_VIEW::~PCB_VIEW()
void PCB_VIEW::Add( KIGFX::VIEW_ITEM* aItem, int aDrawPriority )
{
if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( aItem ) )
footprint->RunOnChildren( std::bind( &PCB_VIEW::Add, this, _1, aDrawPriority ) );
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
if( boardItem->Type() == PCB_FOOTPRINT_T )
{
static_cast<FOOTPRINT*>( boardItem )->RunOnChildren( std::bind( &PCB_VIEW::Add, this,
_1, aDrawPriority ) );
}
}
VIEW::Add( aItem, aDrawPriority );
}
@ -65,8 +73,16 @@ void PCB_VIEW::Add( KIGFX::VIEW_ITEM* aItem, int aDrawPriority )
void PCB_VIEW::Remove( KIGFX::VIEW_ITEM* aItem )
{
if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( aItem ) )
footprint->RunOnChildren( std::bind( &PCB_VIEW::Remove, this, _1 ) );
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
if( boardItem->Type() == PCB_FOOTPRINT_T )
{
static_cast<FOOTPRINT*>( boardItem )->RunOnChildren( std::bind( &PCB_VIEW::Remove,
this, _1 ) );
}
}
VIEW::Remove( aItem );
}
@ -74,8 +90,10 @@ void PCB_VIEW::Remove( KIGFX::VIEW_ITEM* aItem )
void PCB_VIEW::Update( const KIGFX::VIEW_ITEM* aItem, int aUpdateFlags ) const
{
if( const BOARD_ITEM* boardItem = dynamic_cast<const BOARD_ITEM*>( aItem ) )
if( aItem->IsBOARD_ITEM() )
{
const BOARD_ITEM* boardItem = static_cast<const BOARD_ITEM*>( aItem );
if( boardItem->Type() == PCB_TABLECELL_T )
{
VIEW::Update( boardItem->GetParent() );

View File

@ -299,11 +299,8 @@ static bool isEdge( const PNS::ITEM* aItem )
bool PNS_PCBNEW_RULE_RESOLVER::IsDrilledHole( const PNS::ITEM* aItem )
{
if( isHole( aItem ) )
{
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem->Parent() ) )
return item->HasDrilledHole();
}
if( isHole( aItem ) && aItem->Parent() )
return aItem->Parent()->HasDrilledHole();
return false;
}

View File

@ -1246,9 +1246,10 @@ int BOARD_EDITOR_CONTROL::modifyLockSelected( MODIFY_MODE aMode )
for( EDA_ITEM* item : selection )
{
BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item );
if( !item->IsBOARD_ITEM() )
continue;
if( board_item && board_item->IsLocked() )
if( static_cast<BOARD_ITEM*>( item )->IsLocked() )
{
aMode = OFF;
break;
@ -1258,19 +1259,25 @@ int BOARD_EDITOR_CONTROL::modifyLockSelected( MODIFY_MODE aMode )
for( EDA_ITEM* item : selection )
{
BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item );
wxCHECK2( board_item, continue );
if( !item->IsBOARD_ITEM() )
continue;
PCB_GENERATOR* generator = dynamic_cast<PCB_GENERATOR*>( board_item->GetParentGroup() );
BOARD_ITEM* board_item = static_cast<BOARD_ITEM*>( item );
PCB_GROUP* parent_group = board_item->GetParentGroup();
if( generator && commit.GetStatus( generator ) != CHT_MODIFY )
if( parent_group && parent_group->Type() == PCB_GENERATOR_T )
{
commit.Modify( generator );
PCB_GENERATOR* generator = static_cast<PCB_GENERATOR*>( parent_group );
if( aMode == ON )
generator->SetLocked( true );
else
generator->SetLocked( false );
if( generator && commit.GetStatus( generator ) != CHT_MODIFY )
{
commit.Modify( generator );
if( aMode == ON )
generator->SetLocked( true );
else
generator->SetLocked( false );
}
}
commit.Modify( board_item );

View File

@ -685,10 +685,11 @@ int BOARD_INSPECTION_TOOL::InspectClearance( const TOOL_EVENT& aEvent )
return 0;
}
BOARD_ITEM* a = dynamic_cast<BOARD_ITEM*>( selection.GetItem( 0 ) );
BOARD_ITEM* b = dynamic_cast<BOARD_ITEM*>( selection.GetItem( 1 ) );
if( !selection.GetItem( 0 )->IsBOARD_ITEM() || !selection.GetItem( 1 )->IsBOARD_ITEM() )
return 0;
wxCHECK( a && b, 0 );
BOARD_ITEM* a = static_cast<BOARD_ITEM*>( selection.GetItem( 0 ) );
BOARD_ITEM* b = static_cast<BOARD_ITEM*>( selection.GetItem( 1 ) );
if( a->Type() == PCB_GROUP_T )
{
@ -1306,15 +1307,16 @@ int BOARD_INSPECTION_TOOL::InspectConstraints( const TOOL_EVENT& aEvent )
dialog->DeleteAllPages();
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( selection.GetItem( 0 ) );
if( !selection.GetItem( 0 )->IsBOARD_ITEM() )
return 0;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( selection.GetItem( 0 ) );
DRC_CONSTRAINT constraint;
bool compileError = false;
bool courtyardError = false;
std::unique_ptr<DRC_ENGINE> drcEngine = makeDRCEngine( &compileError, &courtyardError );
wxCHECK( item, 0 );
WX_HTML_REPORT_BOX* r = nullptr;
if( item->Type() == PCB_TRACE_T )
@ -1997,7 +1999,10 @@ void BOARD_INSPECTION_TOOL::calculateSelectionRatsnest( const VECTOR2I& aDelta )
for( std::size_t i = 0; i < queued_items.size(); ++i )
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( queued_items[i] );
if( !queued_items[i]->IsBOARD_ITEM() )
continue;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( queued_items[i] );
wxCHECK2( item, continue );

View File

@ -396,8 +396,8 @@ int CONVERT_TOOL::CreatePolys( const TOOL_EVENT& aEvent )
if( !getPolys( preflightSettings ) )
return 0;
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( selection.Front() ) )
parentFootprint = item->GetParentFootprint();
if( selection.Front() && selection.Front()->IsBOARD_ITEM() )
parentFootprint = static_cast<BOARD_ITEM*>( selection.Front() )->GetParentFootprint();
PCB_LAYER_ID layer = m_frame->GetActiveLayer();
BOARD_COMMIT commit( m_frame );
@ -407,7 +407,7 @@ int CONVERT_TOOL::CreatePolys( const TOOL_EVENT& aEvent )
bool showCopyLineWidth = true;
// No copy-line-width option for pads
if( dynamic_cast<PAD*>( selection.Front() ) )
if( selection.Front()->Type() == PCB_PAD_T )
{
if( m_userSettings.m_Strategy == COPY_LINEWIDTH )
m_userSettings.m_Strategy = CENTERLINE;
@ -462,20 +462,22 @@ int CONVERT_TOOL::CreatePolys( const TOOL_EVENT& aEvent )
for( EDA_ITEM* item : selection )
{
if( BOARD_ITEM* candidate = dynamic_cast<BOARD_ITEM*>( item ) )
{
if( candidate->HasLineStroke() )
{
pos = candidate->GetPosition();
if( !item->IsBOARD_ITEM() )
continue;
if( !topLeftItem
|| ( pos.x < topLeftItem->GetPosition().x )
|| ( topLeftItem->GetPosition().x == pos.x
&& pos.y < topLeftItem->GetPosition().y ) )
{
topLeftItem = candidate;
resolvedSettings.m_LineWidth = topLeftItem->GetStroke().GetWidth();
}
BOARD_ITEM* candidate = static_cast<BOARD_ITEM*>( item );
if( candidate->HasLineStroke() )
{
pos = candidate->GetPosition();
if( !topLeftItem
|| ( pos.x < topLeftItem->GetPosition().x )
|| ( topLeftItem->GetPosition().x == pos.x
&& pos.y < topLeftItem->GetPosition().y ) )
{
topLeftItem = candidate;
resolvedSettings.m_LineWidth = topLeftItem->GetStroke().GetWidth();
}
}
}
@ -1162,8 +1164,11 @@ int CONVERT_TOOL::SegmentToArc( const TOOL_EVENT& aEvent )
}
} );
EDA_ITEM* source = selection.Front();
VECTOR2I start, end, mid;
if( !selection.Front()->IsBOARD_ITEM() )
return -1;
BOARD_ITEM* source = static_cast<BOARD_ITEM*>( selection.Front() );
VECTOR2I start, end, mid;
// Offset the midpoint along the normal a little bit so that it's more obviously an arc
const double offsetRatio = 0.1;
@ -1183,16 +1188,8 @@ int CONVERT_TOOL::SegmentToArc( const TOOL_EVENT& aEvent )
PCB_BASE_EDIT_FRAME* frame = getEditFrame<PCB_BASE_EDIT_FRAME>();
BOARD_ITEM_CONTAINER* parent = frame->GetModel();
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( source );
// Don't continue processing if we don't actually have a board item
if( !boardItem )
return 0;
PCB_LAYER_ID layer = boardItem->GetLayer();
BOARD_COMMIT commit( m_frame );
PCB_LAYER_ID layer = source->GetLayer();
BOARD_COMMIT commit( m_frame );
if( source->Type() == PCB_SHAPE_T )
{

View File

@ -1775,24 +1775,28 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent )
for( std::unique_ptr<EDA_ITEM>& ptr : list )
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( ptr.release() );
wxCHECK2( item, continue );
EDA_ITEM* eda_item = ptr.release();
newItems.push_back( item );
if( eda_item->IsBOARD_ITEM() )
{
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( eda_item );
if( group )
{
group->AddItem( item );
groupUndoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) );
}
else
{
selectedItems.push_back( item );
newItems.push_back( item );
if( group )
{
group->AddItem( item );
groupUndoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) );
}
else
{
selectedItems.push_back( item );
}
layer = item->GetLayer();
}
layer = item->GetLayer();
preview.Add( item );
preview.Add( eda_item );
}
// Clear the current selection then select the drawings so that edit tools work on them
@ -3201,11 +3205,11 @@ int DRAWING_TOOL::DrawVia( const TOOL_EVENT& aEvent )
for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
{
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( it.first );
if( !item )
if( !it.first->IsBOARD_ITEM() )
continue;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it.first );
if( item->Type() == PCB_ZONE_T && !static_cast<ZONE*>( item )->GetIsRuleArea() )
{
continue; // stitching vias bind to zones, so ignore them

View File

@ -1777,17 +1777,16 @@ int EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
tableDlg.ShowQuasiModal(); // Scintilla's auto-complete requires quasiModal
}
}
else if( selection.Size() == 1 )
else if( selection.Size() == 1 && selection.Front()->IsBOARD_ITEM() )
{
// Display properties dialog
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( selection.Front() ) )
{
// Do not handle undo buffer, it is done by the properties dialogs
editFrame->OnEditItemRequest( item );
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( selection.Front() );
// Notify other tools of the changes
m_toolMgr->ProcessEvent( EVENTS::SelectedItemsModified );
}
// Do not handle undo buffer, it is done by the properties dialogs
editFrame->OnEditItemRequest( item );
// Notify other tools of the changes
m_toolMgr->ProcessEvent( EVENTS::SelectedItemsModified );
}
else if( selection.Size() == 0 && getView()->IsLayerVisible( LAYER_DRAWINGSHEET ) )
{
@ -1813,11 +1812,13 @@ int EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
for( EDA_ITEM* eda_item : selCopy )
{
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( eda_item ) )
{
if( !( item->GetLayerSet() & visible ).any() )
m_selectionTool->RemoveItemFromSel( item );
}
if( !eda_item->IsBOARD_ITEM() )
continue;
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( eda_item );
if( !( item->GetLayerSet() & visible ).any() )
m_selectionTool->RemoveItemFromSel( item );
}
}
@ -1927,8 +1928,10 @@ int EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
if( !item->IsNew() && !item->IsMoving() )
commit->Modify( item );
if( BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item ) )
if( item->IsBOARD_ITEM() )
{
BOARD_ITEM* board_item = static_cast<BOARD_ITEM*>( item );
board_item->Rotate( refPt, rotateAngle );
board_item->Normalize();
}
@ -2292,14 +2295,16 @@ int EDIT_TOOL::Flip( const TOOL_EVENT& aEvent )
for( EDA_ITEM* item : selection )
{
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
{
if( !boardItem->IsNew() && !boardItem->IsMoving() )
commit->Modify( boardItem );
if( !item->IsBOARD_ITEM() )
continue;
boardItem->Flip( refPt, leftRight );
boardItem->Normalize();
}
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
if( !boardItem->IsNew() && !boardItem->IsMoving() )
commit->Modify( boardItem );
boardItem->Flip( refPt, leftRight );
boardItem->Normalize();
}
if( !localCommit.Empty() )
@ -2347,10 +2352,12 @@ void EDIT_TOOL::removeNonRootItems( std::unordered_set<EDA_ITEM*>& items )
while( itr != items.end() )
{
BOARD_ITEM* curItem = dynamic_cast<BOARD_ITEM*>( *itr );
EDA_ITEM* item = *itr;
if( curItem )
if( item->IsBOARD_ITEM() )
{
BOARD_ITEM* curItem = static_cast<BOARD_ITEM*>( item );
if( curItem->Type() == PCB_GROUP_T || curItem->Type() == PCB_GENERATOR_T )
{
std::unordered_set<BOARD_ITEM*> childItems;
@ -2388,10 +2395,11 @@ void EDIT_TOOL::DeleteItems( const PCB_SELECTION& aItems, bool aIsCut )
for( EDA_ITEM* item : rootItems )
{
BOARD_ITEM* board_item = dynamic_cast<BOARD_ITEM*>( item );
wxCHECK2( board_item, continue );
if( !item->IsBOARD_ITEM() )
continue;
FOOTPRINT* parentFP = board_item->GetParentFootprint();
BOARD_ITEM* board_item = static_cast<BOARD_ITEM*>( item );
FOOTPRINT* parentFP = board_item->GetParentFootprint();
if( board_item->GetParentGroup() )
commit.Stage( board_item, CHT_UNGROUP );
@ -2696,9 +2704,10 @@ int EDIT_TOOL::MoveExact( const TOOL_EVENT& aEvent )
for( EDA_ITEM* item : selection )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( !item->IsBOARD_ITEM() )
continue;
wxCHECK2( boardItem, continue );
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
if( !boardItem->IsNew() )
commit.Modify( boardItem );
@ -2782,10 +2791,11 @@ int EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
// Old selection is cleared, and new items are then selected.
for( EDA_ITEM* item : selection )
{
BOARD_ITEM* dupe_item = nullptr;
BOARD_ITEM* orig_item = dynamic_cast<BOARD_ITEM*>( item );
if( !item->IsBOARD_ITEM() )
continue;
wxCHECK2( orig_item, continue );
BOARD_ITEM* dupe_item = nullptr;
BOARD_ITEM* orig_item = static_cast<BOARD_ITEM*>( item );
if( m_isFootprintEditor )
{
@ -2968,8 +2978,11 @@ bool EDIT_TOOL::updateModificationPoint( PCB_SELECTION& aSelection )
// When there is only one item selected, the reference point is its position...
if( aSelection.Size() == 1 && aSelection.Front()->Type() != PCB_TABLE_T )
{
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aSelection.Front() ) )
if( aSelection.Front()->IsBOARD_ITEM() )
{
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aSelection.Front() );
aSelection.SetReferencePoint( item->GetPosition() );
}
}
// ...otherwise modify items with regard to the grid-snapped center position
else
@ -3124,8 +3137,8 @@ int EDIT_TOOL::copyToClipboard( const TOOL_EVENT& aEvent )
for( EDA_ITEM* item : selection )
{
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
items.push_back( boardItem );
if( item->IsBOARD_ITEM() )
items.push_back( static_cast<BOARD_ITEM*>( item ) );
}
VECTOR2I refPoint;

View File

@ -97,10 +97,14 @@ int EDIT_TOOL::Swap( const TOOL_EVENT& aEvent )
for( size_t i = 0; i < sorted.size() - 1; i++ )
{
BOARD_ITEM* a = dynamic_cast<BOARD_ITEM*>( sorted[i] );
BOARD_ITEM* b = dynamic_cast<BOARD_ITEM*>( sorted[( i + 1 ) % sorted.size()] );
EDA_ITEM* edaItemA = sorted[i];
EDA_ITEM* edaItemB = sorted[( i + 1 ) % sorted.size()];
wxCHECK2( a && b, continue );
if( !edaItemA->IsBOARD_ITEM() || !edaItemB->IsBOARD_ITEM() )
continue;
BOARD_ITEM* a = static_cast<BOARD_ITEM*>( edaItemA );
BOARD_ITEM* b = static_cast<BOARD_ITEM*>( edaItemB );
// Swap X,Y position
VECTOR2I aPos = a->GetPosition(), bPos = b->GetPosition();
@ -358,16 +362,20 @@ bool EDIT_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, BOARD_COMMIT* aCommit
for( EDA_ITEM* item : selection )
{
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
if( item->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
if( !selection.IsHover() )
orig_items.push_back( boardItem );
sel_items.push_back( boardItem );
}
if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( item ) )
if( item->Type() == PCB_FOOTPRINT_T )
{
FOOTPRINT* footprint = static_cast<FOOTPRINT*>( item );
for( PAD* pad : footprint->Pads() )
sel_items.push_back( pad );
@ -395,8 +403,8 @@ bool EDIT_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, BOARD_COMMIT* aCommit
for( EDA_ITEM* item : selection.GetItemsSortedBySelectionOrder() )
{
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
orig_items.push_back( boardItem );
if( item->IsBOARD_ITEM() )
orig_items.push_back( static_cast<BOARD_ITEM*>( item ) );
}
updateStatusPopup( orig_items[ itemIdx ], itemIdx + 1, orig_items.size() );

View File

@ -260,9 +260,9 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent )
for( EDA_ITEM* eda_item : selection )
{
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( eda_item ) )
if( eda_item->IsBOARD_ITEM() )
{
if( item->IsLocked() )
if( static_cast<BOARD_ITEM*>( eda_item )->IsLocked() )
group->SetLocked( true );
}
}
@ -271,8 +271,8 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent )
for( EDA_ITEM* eda_item : selection )
{
if( BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( eda_item ) )
commit.Stage( item, CHT_GROUP );
if( eda_item->IsBOARD_ITEM() )
commit.Stage( static_cast<BOARD_ITEM*>( eda_item ), CHT_GROUP );
}
commit.Push( _( "Group Items" ) );

View File

@ -91,11 +91,13 @@ const std::vector<KIGFX::VIEW_ITEM*> PCB_SELECTION::updateDrawList() const
{
items.push_back( item );
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
if( item->IsBOARD_ITEM() )
{
boardItem->RunOnChildren( [&]( BOARD_ITEM* bitem )
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
boardItem->RunOnChildren( [&]( BOARD_ITEM* childItem )
{
addItem( bitem );
addItem( childItem );
} );
}
};

View File

@ -47,9 +47,7 @@ bool PCB_SELECTION_CONDITIONS::HasLockedItems( const SELECTION& aSelection )
{
for( EDA_ITEM* item : aSelection.Items() )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( boardItem && boardItem->IsLocked() )
if( item->IsBOARD_ITEM() && static_cast<BOARD_ITEM*>( item )->IsLocked() )
return true;
}
@ -61,9 +59,7 @@ bool PCB_SELECTION_CONDITIONS::HasUnlockedItems( const SELECTION& aSelection )
{
for( EDA_ITEM* item : aSelection.Items() )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( boardItem && !boardItem->IsLocked() )
if( item->IsBOARD_ITEM() && !static_cast<BOARD_ITEM*>( item )->IsLocked() )
return true;
}

View File

@ -1713,8 +1713,11 @@ void PCB_SELECTION_TOOL::selectAllConnectedTracks(
// Promote generated members to their PCB_GENERATOR parents
for( EDA_ITEM* item : m_selection )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
PCB_GROUP* parent = boardItem ? boardItem->GetParentGroup() : nullptr;
if( !item->IsBOARD_ITEM() )
continue;
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
PCB_GROUP* parent = boardItem->GetParentGroup();
if( parent && parent->Type() == PCB_GENERATOR_T )
{
@ -3105,8 +3108,9 @@ void PCB_SELECTION_TOOL::highlightInternal( EDA_ITEM* aItem, int aMode, bool aUs
if( aUsingOverlay && aMode != BRIGHTENED )
view()->Hide( aItem, true ); // Hide the original item, so it is shown only on overlay
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( aItem ) )
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
boardItem->RunOnDescendants( std::bind( &PCB_SELECTION_TOOL::highlightInternal, this, _1,
aMode, aUsingOverlay ) );
}
@ -3140,8 +3144,9 @@ void PCB_SELECTION_TOOL::unhighlightInternal( EDA_ITEM* aItem, int aMode, bool a
view()->Update( aItem ); // ... and make sure it's redrawn un-selected
}
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( aItem ) )
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
boardItem->RunOnDescendants( std::bind( &PCB_SELECTION_TOOL::unhighlightInternal, this, _1,
aMode, aUsingOverlay ) );
}

View File

@ -96,13 +96,14 @@ std::vector<std::pair<BOARD_ITEM*, BOX2I>> GetBoundingBoxes( const T& aItems )
for( EDA_ITEM* item : aItems )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( !item->IsBOARD_ITEM() )
continue;
wxCHECK2( boardItem, continue );
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
if( item->Type() == PCB_FOOTPRINT_T )
if( boardItem->Type() == PCB_FOOTPRINT_T )
{
FOOTPRINT* footprint = static_cast<FOOTPRINT*>( item );
FOOTPRINT* footprint = static_cast<FOOTPRINT*>( boardItem );
rects.emplace_back( std::make_pair( footprint,
footprint->GetBoundingBox( false, false ) ) );
}
@ -170,8 +171,10 @@ size_t ALIGN_DISTRIBUTE_TOOL::GetSelections( std::vector<std::pair<BOARD_ITEM*,
for( EDA_ITEM* item : selection )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
wxCHECK2( boardItem, continue );
if( !item->IsBOARD_ITEM() )
continue;
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
// We do not lock items in the footprint editor
if( boardItem->IsLocked() && m_frame->IsType( FRAME_PCB_EDITOR ) )
@ -184,7 +187,9 @@ size_t ALIGN_DISTRIBUTE_TOOL::GetSelections( std::vector<std::pair<BOARD_ITEM*,
lockedItems.push_back( boardItem );
}
else
{
itemsToAlign.push_back( boardItem );
}
}
aItemsToAlign = GetBoundingBoxes( itemsToAlign );

View File

@ -129,19 +129,21 @@ int POSITION_RELATIVE_TOOL::RelativeItemSelectionMove( const VECTOR2I& aPosAncho
for( EDA_ITEM* item : m_selection )
{
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
{
// Don't move a pad by itself unless editing the footprint
if( boardItem->Type() == PCB_PAD_T
&& !frame()->GetPcbNewSettings()->m_AllowFreePads
&& frame()->IsType( FRAME_PCB_EDITOR ) )
{
boardItem = boardItem->GetParent();
}
if( !item->IsBOARD_ITEM() )
continue;
m_commit->Modify( boardItem );
boardItem->Move( aggregateTranslation );
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
// Don't move a pad by itself unless editing the footprint
if( boardItem->Type() == PCB_PAD_T
&& !frame()->GetPcbNewSettings()->m_AllowFreePads
&& frame()->IsType( FRAME_PCB_EDITOR ) )
{
boardItem = boardItem->GetParent();
}
m_commit->Modify( boardItem );
boardItem->Move( aggregateTranslation );
}
m_commit->Push( _( "Position Relative" ) );

View File

@ -506,8 +506,10 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
case UNDO_REDO::REGROUP: /* grouped items are ungrouped */
aList->SetPickedItemStatus( UNDO_REDO::UNGROUP, ii );
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( eda_item ) )
if( eda_item->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( eda_item );
if( PCB_GROUP* group = boardItem->GetParentGroup() )
{
aList->SetPickedItemGroupId( group->m_Uuid, ii );
@ -521,8 +523,10 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
case UNDO_REDO::UNGROUP: /* ungrouped items are re-added to their previuos groups */
aList->SetPickedItemStatus( UNDO_REDO::REGROUP, ii );
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( eda_item ) )
if( eda_item->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( eda_item );
PCB_GROUP* group = dynamic_cast<PCB_GROUP*>(
GetBoard()->GetItem( aList->GetPickedItemGroupId( ii ) ) );
@ -648,8 +652,8 @@ void PCB_BASE_EDIT_FRAME::ClearListAndDeleteItems( PICKED_ITEMS_LIST* aList )
wxASSERT_MSG( item->HasFlag( UR_TRANSIENT ),
"Item on undo/redo list not owned by undo/redo!" );
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item ) )
boardItem->SetParentGroup( nullptr );
if( item->IsBOARD_ITEM() )
static_cast<BOARD_ITEM*>( item )->SetParentGroup( nullptr );
delete item;
} );

View File

@ -228,7 +228,7 @@ PANEL_FOOTPRINT_CHOOSER::~PANEL_FOOTPRINT_CHOOSER()
PCBNEW_SETTINGS* cfg = nullptr;
try
{
cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
}
catch( const std::runtime_error& e )
{
@ -254,7 +254,7 @@ PANEL_FOOTPRINT_CHOOSER::~PANEL_FOOTPRINT_CHOOSER()
void PANEL_FOOTPRINT_CHOOSER::FinishSetup()
{
if( PCBNEW_SETTINGS* settings = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>() )
if( auto* settings = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
{
auto horizPixelsFromDU =
[&]( int x ) -> int

View File

@ -124,8 +124,9 @@ void PCB_TEST_SELECTION_TOOL::highlightInternal( EDA_ITEM* aItem, int aMode, boo
if( aUsingOverlay && aMode != BRIGHTENED )
view()->Hide( aItem, true ); // Hide the original item, so it is shown only on overlay
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( aItem ) )
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
boardItem->RunOnDescendants( std::bind( &PCB_TEST_SELECTION_TOOL::highlightInternal, this,
std::placeholders::_1, aMode, aUsingOverlay ) );
}
@ -159,8 +160,9 @@ void PCB_TEST_SELECTION_TOOL::unhighlightInternal( EDA_ITEM* aItem, int aMode, b
view()->Update( aItem ); // ... and make sure it's redrawn un-selected
}
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( aItem ) )
if( aItem->IsBOARD_ITEM() )
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( aItem );
boardItem->RunOnDescendants( std::bind( &PCB_TEST_SELECTION_TOOL::unhighlightInternal, this,
std::placeholders::_1, aMode, aUsingOverlay ) );
}