Eradicate a bunch of calls to dyn_cast.

Also deletes PAD::GetParent() which fails to look for parent footprint
through groups.
This commit is contained in:
Jeff Young 2023-06-24 19:54:50 +01:00
parent 300a60e88e
commit 493828cc6b
26 changed files with 192 additions and 230 deletions

View File

@ -286,9 +286,7 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
// If we are removing the current sheet, get out first // If we are removing the current sheet, get out first
if( eda_item->Type() == SCH_SHEET_T ) if( eda_item->Type() == SCH_SHEET_T )
{ {
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( eda_item ) ) if( static_cast<SCH_SHEET*>( eda_item )->GetScreen() == GetScreen() )
if( sheet->GetScreen() == GetScreen() )
GetToolManager()->RunAction( EE_ACTIONS::leaveSheet ); GetToolManager()->RunAction( EE_ACTIONS::leaveSheet );
} }

View File

@ -310,9 +310,10 @@ void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, b
break; break;
} }
if( SCH_LINE* line = dyn_cast<SCH_LINE*>( aItem ) ) if( aItem->Type() == SCH_LINE_T )
{ {
VECTOR2I pt = Align( aRefPos ); SCH_LINE* line = static_cast<SCH_LINE*>( aItem );
VECTOR2I pt = Align( aRefPos );
if( line->GetStartPoint().x == line->GetEndPoint().x ) if( line->GetStartPoint().x == line->GetEndPoint().x )
{ {
@ -328,7 +329,6 @@ void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, b
if( TestSegmentHit( possible, line->GetStartPoint(), line->GetEndPoint(), 0 ) ) if( TestSegmentHit( possible, line->GetStartPoint(), line->GetEndPoint(), 0 ) )
addAnchor( possible, SNAPPABLE | HORIZONTAL, aItem ); addAnchor( possible, SNAPPABLE | HORIZONTAL, aItem );
} }
} }
} }

View File

@ -869,25 +869,25 @@ bool CN_VISITOR::operator()( CN_ITEM* aCandidate )
FLASHING flashingA = FLASHING::NEVER_FLASHED; FLASHING flashingA = FLASHING::NEVER_FLASHED;
FLASHING flashingB = FLASHING::NEVER_FLASHED; FLASHING flashingB = FLASHING::NEVER_FLASHED;
if( const PAD* pad = dyn_cast<const PAD*>( parentA ) ) if( parentA->Type() == PCB_PAD_T )
{ {
if( !pad->ConditionallyFlashed( layer ) ) if( !static_cast<const PAD*>( parentA )->ConditionallyFlashed( layer ) )
flashingA = FLASHING::ALWAYS_FLASHED; flashingA = FLASHING::ALWAYS_FLASHED;
} }
else if( const PCB_VIA* via = dyn_cast<const PCB_VIA*>( parentA ) ) else if( parentA->Type() == PCB_VIA_T )
{ {
if( !via->ConditionallyFlashed( layer ) ) if( !static_cast<const PCB_VIA*>( parentA )->ConditionallyFlashed( layer ) )
flashingA = FLASHING::ALWAYS_FLASHED; flashingA = FLASHING::ALWAYS_FLASHED;
} }
if( const PAD* pad = dyn_cast<const PAD*>( parentB ) ) if( parentB->Type() == PCB_PAD_T )
{ {
if( !pad->ConditionallyFlashed( layer ) ) if( !static_cast<const PAD*>( parentB )->ConditionallyFlashed( layer ) )
flashingB = FLASHING::ALWAYS_FLASHED; flashingB = FLASHING::ALWAYS_FLASHED;
} }
else if( const PCB_VIA* via = dyn_cast<const PCB_VIA*>( parentB ) ) else if( parentB->Type() == PCB_VIA_T )
{ {
if( !via->ConditionallyFlashed( layer ) ) if( !static_cast<const PCB_VIA*>( parentB )->ConditionallyFlashed( layer ) )
flashingB = FLASHING::ALWAYS_FLASHED; flashingB = FLASHING::ALWAYS_FLASHED;
} }

View File

@ -909,9 +909,7 @@ CONNECTIVITY_DATA::GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem,
RN_NET* CONNECTIVITY_DATA::GetRatsnestForNet( int aNet ) RN_NET* CONNECTIVITY_DATA::GetRatsnestForNet( int aNet )
{ {
if ( aNet < 0 || aNet >= (int) m_nets.size() ) if ( aNet < 0 || aNet >= (int) m_nets.size() )
{
return nullptr; return nullptr;
}
return m_nets[ aNet ]; return m_nets[ aNet ];
} }
@ -924,10 +922,9 @@ void CONNECTIVITY_DATA::MarkItemNetAsDirty( BOARD_ITEM *aItem )
for( PAD* pad : static_cast<FOOTPRINT*>( aItem )->Pads() ) for( PAD* pad : static_cast<FOOTPRINT*>( aItem )->Pads() )
m_connAlgo->MarkNetAsDirty( pad->GetNetCode() ); m_connAlgo->MarkNetAsDirty( pad->GetNetCode() );
} }
if (aItem->IsConnected() ) if (aItem->IsConnected() )
{
m_connAlgo->MarkNetAsDirty( static_cast<BOARD_CONNECTED_ITEM*>( aItem )->GetNetCode() ); m_connAlgo->MarkNetAsDirty( static_cast<BOARD_CONNECTED_ITEM*>( aItem )->GetNetCode() );
}
} }
@ -938,7 +935,8 @@ void CONNECTIVITY_DATA::SetProgressReporter( PROGRESS_REPORTER* aReporter )
} }
const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForItems( std::vector<BOARD_ITEM*> aItems ) const std::vector<CN_EDGE>
CONNECTIVITY_DATA::GetRatsnestForItems( const std::vector<BOARD_ITEM*>& aItems )
{ {
std::set<int> nets; std::set<int> nets;
std::vector<CN_EDGE> edges; std::vector<CN_EDGE> edges;
@ -956,8 +954,10 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForItems( std::vector<B
item_set.insert( pad ); item_set.insert( pad );
} }
} }
else if( auto conn_item = dyn_cast<BOARD_CONNECTED_ITEM*>( item ) ) else if( item->IsConnected() )
{ {
BOARD_CONNECTED_ITEM* conn_item = static_cast<BOARD_CONNECTED_ITEM*>( item );
item_set.insert( conn_item ); item_set.insert( conn_item );
nets.insert( conn_item->GetNetCode() ); nets.insert( conn_item->GetNetCode() );
} }
@ -1002,7 +1002,8 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForPad( const PAD* aPad
} }
const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForComponent( FOOTPRINT* aComponent, bool aSkipInternalConnections ) const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForComponent( FOOTPRINT* aComponent,
bool aSkipInternalConnections )
{ {
std::set<int> nets; std::set<int> nets;
std::set<const PAD*> pads; std::set<const PAD*> pads;
@ -1014,14 +1015,12 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForComponent( FOOTPRINT
pads.insert( pad ); pads.insert( pad );
} }
for( const auto& netcode : nets ) for( int netcode : nets )
{ {
RN_NET* net = GetRatsnestForNet( netcode ); for( const CN_EDGE& edge : GetRatsnestForNet( netcode )->GetEdges() )
for( const CN_EDGE& edge : net->GetEdges() )
{ {
auto srcNode = edge.GetSourceNode(); const std::shared_ptr<const CN_ANCHOR>& srcNode = edge.GetSourceNode();
auto dstNode = edge.GetTargetNode(); const std::shared_ptr<const CN_ANCHOR>& dstNode = edge.GetTargetNode();
const PAD* srcParent = static_cast<const PAD*>( srcNode->Parent() ); const PAD* srcParent = static_cast<const PAD*>( srcNode->Parent() );
const PAD* dstParent = static_cast<const PAD*>( dstNode->Parent() ); const PAD* dstParent = static_cast<const PAD*>( dstNode->Parent() );
@ -1030,13 +1029,9 @@ const std::vector<CN_EDGE> CONNECTIVITY_DATA::GetRatsnestForComponent( FOOTPRINT
bool dstFound = ( pads.find(dstParent) != pads.end() ); bool dstFound = ( pads.find(dstParent) != pads.end() );
if ( srcFound && dstFound && !aSkipInternalConnections ) if ( srcFound && dstFound && !aSkipInternalConnections )
{
edges.push_back( edge ); edges.push_back( edge );
}
else if ( srcFound || dstFound ) else if ( srcFound || dstFound )
{
edges.push_back( edge ); edges.push_back( edge );
}
} }
} }

View File

@ -271,7 +271,7 @@ public:
const std::map<int, wxString>& GetNetclassMap() const { return m_netclassMap; } const std::map<int, wxString>& GetNetclassMap() const { return m_netclassMap; }
#ifndef SWIG #ifndef SWIG
const std::vector<CN_EDGE> GetRatsnestForItems( const std::vector<BOARD_ITEM*> aItems ); const std::vector<CN_EDGE> GetRatsnestForItems( const std::vector<BOARD_ITEM*>& aItems );
const std::vector<CN_EDGE> GetRatsnestForPad( const PAD* aPad ); const std::vector<CN_EDGE> GetRatsnestForPad( const PAD* aPad );

View File

@ -141,11 +141,12 @@ int FROM_TO_CACHE::cacheFromToPaths( const wxString& aFrom, const wxString& aTo
{ {
int count = 0; int count = 0;
wxString fromName = path.from->GetParent()->GetReference() + wxT( "-" ) wxString fromName = path.from->GetParentFootprint()->GetReference()
+ path.from->GetNumber(); + wxT( "-" ) + path.from->GetNumber();
auto padCandidates = connectivity->GetConnectedItems( path.from, auto padCandidates = connectivity->GetConnectedItems( path.from,
{ PCB_PAD_T, PCB_ARC_T, PCB_VIA_T, PCB_TRACE_T } ); { PCB_PAD_T, PCB_ARC_T, PCB_VIA_T,
PCB_TRACE_T } );
PAD* toPad = nullptr; PAD* toPad = nullptr;
for( BOARD_CONNECTED_ITEM* pitem : padCandidates ) for( BOARD_CONNECTED_ITEM* pitem : padCandidates )
@ -158,8 +159,8 @@ int FROM_TO_CACHE::cacheFromToPaths( const wxString& aFrom, const wxString& aTo
const PAD *pad = static_cast<const PAD*>( pitem ); const PAD *pad = static_cast<const PAD*>( pitem );
wxString toName = pad->GetParent()->GetReference() + wxT( "-" ) + pad->GetNumber(); wxString toName = pad->GetParentFootprint()->GetReference()
+ wxT( "-" ) + pad->GetNumber();
for( const FT_ENDPOINT& endpoint : m_ftEndpoints ) for( const FT_ENDPOINT& endpoint : m_ftEndpoints )
{ {

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2019 Alexander Shuklin, jasuramme@gmail.com * Copyright (C) 2019 Alexander Shuklin, jasuramme@gmail.com
* Copyright (C) 2019-2022 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2019-2023 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -282,8 +282,10 @@ void DIALOG_BOARD_STATISTICS::getDataFromPCB()
// Get via counts // Get via counts
for( PCB_TRACK* track : board->Tracks() ) for( PCB_TRACK* track : board->Tracks() )
{ {
if( PCB_VIA* via = dyn_cast<PCB_VIA*>( track ) ) if( track->Type() == PCB_VIA_T )
{ {
PCB_VIA* via = static_cast<PCB_VIA*>( track );
for( LINE_ITEM<VIATYPE>& line : m_viaTypes ) for( LINE_ITEM<VIATYPE>& line : m_viaTypes )
{ {
if( via->GetViaType() == line.attribute ) if( via->GetViaType() == line.attribute )

View File

@ -490,7 +490,7 @@ void DIALOG_PAD_PROPERTIES::initValues()
if( m_currentPad ) if( m_currentPad )
{ {
if( FOOTPRINT* footprint = m_currentPad->GetParent() ) if( FOOTPRINT* footprint = m_currentPad->GetParentFootprint() )
{ {
VECTOR2I relPos = m_currentPad->GetFPRelativePosition(); VECTOR2I relPos = m_currentPad->GetFPRelativePosition();

View File

@ -37,8 +37,6 @@
#include <board_commit.h> #include <board_commit.h>
#include <macros.h> #include <macros.h>
#include <wx/log.h>
DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent, DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent,
const PCB_SELECTION& aItems, const PCB_SELECTION& aItems,
BOARD_COMMIT& aCommit ) : BOARD_COMMIT& aCommit ) :
@ -502,7 +500,7 @@ bool DIALOG_TRACK_VIA_PROPERTIES::confirmPadChange( const std::vector<PAD*>& cha
{ {
PAD* pad = *changingPads.begin(); PAD* pad = *changingPads.begin();
msg.Printf( _( "Changing the net will also update %s pad %s to %s." ), msg.Printf( _( "Changing the net will also update %s pad %s to %s." ),
pad->GetParent()->GetReference(), pad->GetParentFootprint()->GetReference(),
pad->GetNumber(), pad->GetNumber(),
m_netSelector->GetValue() ); m_netSelector->GetValue() );
} }
@ -511,9 +509,9 @@ bool DIALOG_TRACK_VIA_PROPERTIES::confirmPadChange( const std::vector<PAD*>& cha
PAD* pad1 = *changingPads.begin(); PAD* pad1 = *changingPads.begin();
PAD* pad2 = *( ++changingPads.begin() ); PAD* pad2 = *( ++changingPads.begin() );
msg.Printf( _( "Changing the net will also update %s pad %s and %s pad %s to %s." ), msg.Printf( _( "Changing the net will also update %s pad %s and %s pad %s to %s." ),
pad1->GetParent()->GetReference(), pad1->GetParentFootprint()->GetReference(),
pad1->GetNumber(), pad1->GetNumber(),
pad2->GetParent()->GetReference(), pad2->GetParentFootprint()->GetReference(),
pad2->GetNumber(), pad2->GetNumber(),
m_netSelector->GetValue() ); m_netSelector->GetValue() );
} }

View File

@ -205,8 +205,8 @@ bool padNeedsUpdate( const PAD* a, const PAD* b )
TEST( a->GetProperty(), b->GetProperty(), "" ); TEST( a->GetProperty(), b->GetProperty(), "" );
// The pad orientation, for historical reasons is the pad rotation + parent rotation. // The pad orientation, for historical reasons is the pad rotation + parent rotation.
TEST_D( ( a->GetOrientation() - a->GetParent()->GetOrientation() ).Normalize().AsDegrees(), TEST_D( ( a->GetOrientation() - a->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(),
( b->GetOrientation() - b->GetParent()->GetOrientation() ).Normalize().AsDegrees(), ( b->GetOrientation() - b->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(),
"" ); "" );
TEST( a->GetSize(), b->GetSize(), "" ); TEST( a->GetSize(), b->GetSize(), "" );

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2004-2022 KiCad Developers. * Copyright (C) 2004-2023 KiCad Developers.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -38,12 +38,10 @@ class DRC_TEST_PROVIDER_TRACK_WIDTH : public DRC_TEST_PROVIDER
{ {
public: public:
DRC_TEST_PROVIDER_TRACK_WIDTH() DRC_TEST_PROVIDER_TRACK_WIDTH()
{ {}
}
virtual ~DRC_TEST_PROVIDER_TRACK_WIDTH() virtual ~DRC_TEST_PROVIDER_TRACK_WIDTH()
{ {}
}
virtual bool Run() override; virtual bool Run() override;
@ -82,18 +80,22 @@ bool DRC_TEST_PROVIDER_TRACK_WIDTH::Run()
if( m_drcEngine->IsErrorLimitExceeded( DRCE_TRACK_WIDTH ) ) if( m_drcEngine->IsErrorLimitExceeded( DRCE_TRACK_WIDTH ) )
return false; return false;
int actual; int actual;
VECTOR2I p0; VECTOR2I p0;
if( PCB_ARC* arc = dyn_cast<PCB_ARC*>( item ) ) if( item->Type() == PCB_ARC_T )
{ {
PCB_ARC* arc = static_cast<PCB_ARC*>( item );
actual = arc->GetWidth(); actual = arc->GetWidth();
p0 = arc->GetStart(); p0 = arc->GetStart();
} }
else if( PCB_TRACK* trk = dyn_cast<PCB_TRACK*>( item ) ) else if( item->Type() == PCB_TRACE_T )
{ {
actual = trk->GetWidth(); PCB_TRACK* track = static_cast<PCB_TRACK*>( item );
p0 = ( trk->GetStart() + trk->GetEnd() ) / 2;
actual = track->GetWidth();
p0 = ( track->GetStart() + track->GetEnd() ) / 2;
} }
else else
{ {

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2004-2022 KiCad Developers. * Copyright (C) 2004-2023 KiCad Developers.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -38,12 +38,10 @@ class DRC_TEST_PROVIDER_VIA_DIAMETER : public DRC_TEST_PROVIDER
{ {
public: public:
DRC_TEST_PROVIDER_VIA_DIAMETER() DRC_TEST_PROVIDER_VIA_DIAMETER()
{ {}
}
virtual ~DRC_TEST_PROVIDER_VIA_DIAMETER() virtual ~DRC_TEST_PROVIDER_VIA_DIAMETER()
{ {}
}
virtual bool Run() override; virtual bool Run() override;
@ -82,12 +80,11 @@ bool DRC_TEST_PROVIDER_VIA_DIAMETER::Run()
if( m_drcEngine->IsErrorLimitExceeded( DRCE_VIA_DIAMETER ) ) if( m_drcEngine->IsErrorLimitExceeded( DRCE_VIA_DIAMETER ) )
return false; return false;
PCB_VIA* via = dyn_cast<PCB_VIA*>( item ); if( item->Type() != PCB_VIA_T )
// fixme: move to pad stack check?
if( !via )
return true; return true;
PCB_VIA* via = static_cast<PCB_VIA*>( item );
// TODO: once we have padstacks this will need to run per-layer... // TODO: once we have padstacks this will need to run per-layer...
auto constraint = m_drcEngine->EvalRules( VIA_DIAMETER_CONSTRAINT, item, nullptr, auto constraint = m_drcEngine->EvalRules( VIA_DIAMETER_CONSTRAINT, item, nullptr,
UNDEFINED_LAYER ); UNDEFINED_LAYER );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2019 CERN * Copyright (C) 2019 CERN
* Copyright (C) 2022 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2022-2023 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -37,8 +37,6 @@
#include <ki_exception.h> #include <ki_exception.h>
#include <locale_io.h> #include <locale_io.h>
#include <reporter.h> #include <reporter.h>
#include <wx/log.h>
#include <exporters/board_exporter_base.h> #include <exporters/board_exporter_base.h>
static double iu2hyp( double iu ) static double iu2hyp( double iu )
@ -431,7 +429,7 @@ bool HYPERLYNX_EXPORTER::writeNetObjects( const std::vector<BOARD_ITEM*>& aObjec
if( pstackIter != m_padMap.end() ) if( pstackIter != m_padMap.end() )
{ {
wxString ref = pad->GetParent()->GetReference(); wxString ref = pad->GetParentFootprint()->GetReference();
if( ref.IsEmpty() ) if( ref.IsEmpty() )
ref = wxT( "EMPTY" ); ref = wxT( "EMPTY" );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2017 Jean_Pierre Charras <jp.charras at wanadoo.fr> * Copyright (C) 2017 Jean_Pierre Charras <jp.charras at wanadoo.fr>
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -224,7 +224,7 @@ int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
} }
// Add object attribute: component reference to pads (mainly useful for users) // Add object attribute: component reference to pads (mainly useful for users)
wxString ref = pad->GetParent()->GetReference(); wxString ref = pad->GetParentFootprint()->GetReference();
gbr_metadata.SetCmpReference( ref ); gbr_metadata.SetCmpReference( ref );
gbr_metadata.SetNetAttribType( GBR_NETLIST_METADATA::GBR_NETINFO_CMP ); gbr_metadata.SetNetAttribType( GBR_NETLIST_METADATA::GBR_NETINFO_CMP );

View File

@ -229,7 +229,7 @@ LSET PAD::ApertureMask()
bool PAD::IsFlipped() const bool PAD::IsFlipped() const
{ {
FOOTPRINT* parent = GetParent(); FOOTPRINT* parent = GetParentFootprint();
return ( parent && parent->GetLayer() == B_Cu ); return ( parent && parent->GetLayer() == B_Cu );
} }
@ -805,8 +805,8 @@ int PAD::GetLocalClearanceOverrides( wxString* aSource ) const
return GetLocalClearance( aSource ); return GetLocalClearance( aSource );
// A footprint can have a specific clearance value // A footprint can have a specific clearance value
if( GetParent() && GetParent()->GetLocalClearance() ) if( GetParent() && GetParentFootprint()->GetLocalClearance() )
return GetParent()->GetLocalClearance( aSource ); return GetParentFootprint()->GetLocalClearance( aSource );
return 0; return 0;
} }
@ -857,9 +857,7 @@ int PAD::GetSolderMaskExpansion() const
int margin = m_localSolderMaskMargin; int margin = m_localSolderMaskMargin;
FOOTPRINT* parentFootprint = GetParent(); if( FOOTPRINT* parentFootprint = GetParentFootprint() )
if( parentFootprint )
{ {
if( margin == 0 ) if( margin == 0 )
{ {
@ -900,9 +898,7 @@ VECTOR2I PAD::GetSolderPasteMargin() const
int margin = m_localSolderPasteMargin; int margin = m_localSolderPasteMargin;
double mratio = m_localSolderPasteMarginRatio; double mratio = m_localSolderPasteMarginRatio;
FOOTPRINT* parentFootprint = GetParent(); if( FOOTPRINT* parentFootprint = GetParentFootprint() )
if( parentFootprint )
{ {
if( margin == 0 ) if( margin == 0 )
margin = parentFootprint->GetLocalSolderPasteMargin(); margin = parentFootprint->GetLocalSolderPasteMargin();
@ -1255,18 +1251,18 @@ wxString PAD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const
{ {
return wxString::Format( _( "Pad %s of %s on %s" ), return wxString::Format( _( "Pad %s of %s on %s" ),
GetNetnameMsg(), GetNetnameMsg(),
GetParent()->GetReference(), GetParentFootprint()->GetReference(),
layerMaskDescribe() ); layerMaskDescribe() );
} }
else if( GetAttribute() == PAD_ATTRIB::NPTH ) else if( GetAttribute() == PAD_ATTRIB::NPTH )
{ {
return wxString::Format( _( "NPTH pad of %s" ), GetParent()->GetReference() ); return wxString::Format( _( "NPTH pad of %s" ), GetParentFootprint()->GetReference() );
} }
else else
{ {
return wxString::Format( _( "PTH pad %s of %s" ), return wxString::Format( _( "PTH pad %s of %s" ),
GetNetnameMsg(), GetNetnameMsg(),
GetParent()->GetReference() ); GetParentFootprint()->GetReference() );
} }
} }
else else
@ -1276,19 +1272,19 @@ wxString PAD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const
return wxString::Format( _( "Pad %s %s of %s on %s" ), return wxString::Format( _( "Pad %s %s of %s on %s" ),
GetNumber(), GetNumber(),
GetNetnameMsg(), GetNetnameMsg(),
GetParent()->GetReference(), GetParentFootprint()->GetReference(),
layerMaskDescribe() ); layerMaskDescribe() );
} }
else if( GetAttribute() == PAD_ATTRIB::NPTH ) else if( GetAttribute() == PAD_ATTRIB::NPTH )
{ {
return wxString::Format( _( "NPTH of %s" ), GetParent()->GetReference() ); return wxString::Format( _( "NPTH of %s" ), GetParentFootprint()->GetReference() );
} }
else else
{ {
return wxString::Format( _( "PTH pad %s %s of %s" ), return wxString::Format( _( "PTH pad %s %s of %s" ),
GetNumber(), GetNumber(),
GetNetnameMsg(), GetNetnameMsg(),
GetParent()->GetReference() ); GetParentFootprint()->GetReference() );
} }
} }
} }
@ -1369,17 +1365,6 @@ void PAD::ViewGetLayers( int aLayers[], int& aCount ) const
if( IsOnLayer( each_layer ) ) if( IsOnLayer( each_layer ) )
aLayers[aCount++] = each_layer; aLayers[aCount++] = each_layer;
} }
#ifdef DEBUG
if( aCount == 0 ) // Should not occur
{
wxString msg;
msg.Printf( wxT( "footprint %s, pad %s: could not find valid layer for pad" ),
GetParent() ? GetParent()->GetReference() : wxString( wxT( "<null>" ) ),
GetNumber().IsEmpty() ? wxString(wxT( "(unnumbered)" ) ) : GetNumber() );
wxLogDebug( msg );
}
#endif
} }
@ -1476,12 +1461,6 @@ const BOX2I PAD::ViewBBox() const
} }
FOOTPRINT* PAD::GetParent() const
{
return dyn_cast<FOOTPRINT*>( m_parent );
}
void PAD::ImportSettingsFrom( const PAD& aMasterPad ) void PAD::ImportSettingsFrom( const PAD& aMasterPad )
{ {
SetShape( aMasterPad.GetShape() ); SetShape( aMasterPad.GetShape() );
@ -1499,10 +1478,10 @@ void PAD::ImportSettingsFrom( const PAD& aMasterPad )
EDA_ANGLE pad_rot = aMasterPad.GetOrientation(); EDA_ANGLE pad_rot = aMasterPad.GetOrientation();
if( aMasterPad.GetParent() ) if( aMasterPad.GetParent() )
pad_rot -= aMasterPad.GetParent()->GetOrientation(); pad_rot -= aMasterPad.GetParentFootprint()->GetOrientation();
if( GetParent() ) if( GetParent() )
pad_rot += GetParent()->GetOrientation(); pad_rot += GetParentFootprint()->GetOrientation();
SetOrientation( pad_rot ); SetOrientation( pad_rot );

View File

@ -108,8 +108,6 @@ public:
return GetDrillSizeX() > 0 && GetDrillSizeY() > 0; return GetDrillSizeX() > 0 && GetDrillSizeY() > 0;
} }
FOOTPRINT* GetParent() const;
wxString GetParentAsString() const; wxString GetParentAsString() const;
bool IsLocked() const override; bool IsLocked() const override;

View File

@ -33,7 +33,6 @@
#include <pcb_group.h> #include <pcb_group.h>
#include <geometry/shape_segment.h> #include <geometry/shape_segment.h>
#include <pcb_expr_evaluator.h> #include <pcb_expr_evaluator.h>
#include <connectivity/connectivity_data.h> #include <connectivity/connectivity_data.h>
#include <connectivity/connectivity_algo.h> #include <connectivity/connectivity_algo.h>
#include <connectivity/from_to_cache.h> #include <connectivity/from_to_cache.h>
@ -873,10 +872,11 @@ static void isMicroVia( LIBEVAL::CONTEXT* aCtx, void* self )
result->Set( 0.0 ); result->Set( 0.0 );
aCtx->Push( result ); aCtx->Push( result );
PCB_VIA* via = dyn_cast<PCB_VIA*>( item ); if( item && item->Type() == PCB_VIA_T
&& static_cast<PCB_VIA*>( item )->GetViaType() == VIATYPE::MICROVIA )
if( via && via->GetViaType() == VIATYPE::MICROVIA ) {
result->Set ( 1.0 ); result->Set ( 1.0 );
}
} }
@ -889,10 +889,11 @@ static void isBlindBuriedViaFunc( LIBEVAL::CONTEXT* aCtx, void* self )
result->Set( 0.0 ); result->Set( 0.0 );
aCtx->Push( result ); aCtx->Push( result );
PCB_VIA* via = dyn_cast<PCB_VIA*>( item ); if( item && item->Type() == PCB_VIA_T
&& static_cast<PCB_VIA*>( item )->GetViaType() == VIATYPE::MICROVIA )
if( via && via->GetViaType() == VIATYPE::BLIND_BURIED ) {
result->Set ( 1.0 ); result->Set ( 1.0 );
}
} }

View File

@ -36,18 +36,14 @@
#include <geometry/shape_segment.h> #include <geometry/shape_segment.h>
#include <pcb_base_frame.h> #include <pcb_base_frame.h>
#include <math/util.h> // for KiROUND #include <math/util.h> // for KiROUND
#include <board.h> #include <board.h>
#include <board_design_settings.h>
#include <footprint.h> #include <footprint.h>
#include <pcb_track.h> #include <pcb_track.h>
#include <pcb_text.h>
#include <pad.h> #include <pad.h>
#include <zone.h> #include <zone.h>
#include <pcb_shape.h> #include <pcb_shape.h>
#include <pcb_target.h> #include <pcb_target.h>
#include <pcb_dimension.h> #include <pcb_dimension.h>
#include <pcbplot.h> #include <pcbplot.h>
#include <plotters/plotter_dxf.h> #include <plotters/plotter_dxf.h>
#include <plotters/plotter_hpgl.h> #include <plotters/plotter_hpgl.h>
@ -566,11 +562,11 @@ void PlotStandardLayer( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
for( const PCB_TRACK* track : aBoard->Tracks() ) for( const PCB_TRACK* track : aBoard->Tracks() )
{ {
const PCB_VIA* via = dyn_cast<const PCB_VIA*>( track ); if( track->Type() != PCB_VIA_T )
if( !via )
continue; continue;
const PCB_VIA* via = static_cast<const PCB_VIA*>( track );
// vias are not plotted if not on selected layer, but if layer is SOLDERMASK_LAYER_BACK // vias are not plotted if not on selected layer, but if layer is SOLDERMASK_LAYER_BACK
// or SOLDERMASK_LAYER_FRONT, vias are drawn only if they are on the corresponding // or SOLDERMASK_LAYER_FRONT, vias are drawn only if they are on the corresponding
// external copper layer // external copper layer
@ -782,9 +778,12 @@ void PlotLayerOutlines( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// Plot vias holes // Plot vias holes
for( PCB_TRACK* track : aBoard->Tracks() ) for( PCB_TRACK* track : aBoard->Tracks() )
{ {
const PCB_VIA* via = dyn_cast<const PCB_VIA*>( track ); if( track->Type() != PCB_VIA_T )
continue;
if( via && via->IsOnLayer( layer ) ) // via holes can be not through holes const PCB_VIA* via = static_cast<const PCB_VIA*>( track );
if( via->IsOnLayer( layer ) ) // via holes can be not through holes
aPlotter->Circle( via->GetPosition(), via->GetDrillValue(), FILL_T::NO_FILL ); aPlotter->Circle( via->GetPosition(), via->GetDrillValue(), FILL_T::NO_FILL );
} }
} }
@ -906,10 +905,13 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// Plot (untented) vias // Plot (untented) vias
for( const PCB_TRACK* track : aBoard->Tracks() ) for( const PCB_TRACK* track : aBoard->Tracks() )
{ {
const PCB_VIA* via = dyn_cast<const PCB_VIA*>( track ); if( track->Type() != PCB_VIA_T )
continue;
const PCB_VIA* via = static_cast<const PCB_VIA*>( track );
// Note: IsOnLayer() checks relevant mask layers of untented vias // Note: IsOnLayer() checks relevant mask layers of untented vias
if( !via || !via->IsOnLayer( layer ) ) if( !via->IsOnLayer( layer ) )
continue; continue;
int clearance = via->GetSolderMaskExpansion(); int clearance = via->GetSolderMaskExpansion();

View File

@ -83,7 +83,7 @@ void BRDITEMS_PLOTTER::PlotPad( const PAD* aPad, const COLOR4D& aColor, OUTLINE_
// Not yet in use. // Not yet in use.
// bool isPadOnBoardTechLayers = ( aPad->GetLayerSet() & LSET::AllBoardTechMask() ).any(); // bool isPadOnBoardTechLayers = ( aPad->GetLayerSet() & LSET::AllBoardTechMask() ).any();
metadata.SetCmpReference( aPad->GetParent()->GetReference() ); metadata.SetCmpReference( aPad->GetParentFootprint()->GetReference() );
if( plotOnCopperLayer ) if( plotOnCopperLayer )
{ {
@ -308,7 +308,7 @@ void BRDITEMS_PLOTTER::PlotFootprintTextItems( const FOOTPRINT* aFootprint )
for( BOARD_ITEM* item : aFootprint->GraphicalItems() ) for( BOARD_ITEM* item : aFootprint->GraphicalItems() )
{ {
textItem = dyn_cast<const PCB_TEXT*>( item ); textItem = dynamic_cast<const PCB_TEXT*>( item );
if( textItem ) if( textItem )
texts.push_back( static_cast<PCB_TEXT*>( item ) ); texts.push_back( static_cast<PCB_TEXT*>( item ) );
@ -925,12 +925,12 @@ void BRDITEMS_PLOTTER::PlotDrillMarks()
if( GetPlotMode() == FILLED ) if( GetPlotMode() == FILLED )
m_plotter->SetColor( WHITE ); m_plotter->SetColor( WHITE );
for( PCB_TRACK* tracks : m_board->Tracks() ) for( PCB_TRACK* track : m_board->Tracks() )
{ {
const PCB_VIA* via = dyn_cast<const PCB_VIA*>( tracks ); if( track->Type() == PCB_VIA_T )
if( via )
{ {
const PCB_VIA* via = static_cast<const PCB_VIA*>( track );
plotOneDrillMark( PAD_DRILL_SHAPE_CIRCLE, via->GetStart(), plotOneDrillMark( PAD_DRILL_SHAPE_CIRCLE, via->GetStart(),
VECTOR2I( via->GetDrillValue(), 0 ), VECTOR2I( via->GetWidth(), 0 ), VECTOR2I( via->GetDrillValue(), 0 ), VECTOR2I( via->GetWidth(), 0 ),
ANGLE_0, smallDrill ); ANGLE_0, smallDrill );

View File

@ -2465,7 +2465,7 @@ void EAGLE_PLUGIN::transferPad( const EPAD_COMMON& aEaglePad, PAD* aPad ) const
if( aEaglePad.thermals && !*aEaglePad.thermals ) if( aEaglePad.thermals && !*aEaglePad.thermals )
aPad->SetZoneConnection( ZONE_CONNECTION::FULL ); aPad->SetZoneConnection( ZONE_CONNECTION::FULL );
FOOTPRINT* footprint = aPad->GetParent(); FOOTPRINT* footprint = aPad->GetParentFootprint();
wxCHECK( footprint, /* void */ ); wxCHECK( footprint, /* void */ );
RotatePoint( padPos, footprint->GetOrientation() ); RotatePoint( padPos, footprint->GetOrientation() );
aPad->SetPosition( padPos + footprint->GetPosition() ); aPad->SetPosition( padPos + footprint->GetPosition() );

View File

@ -57,9 +57,7 @@
#include <macros.h> #include <macros.h>
#include "pns_kicad_iface.h" #include "pns_kicad_iface.h"
#include "pns_arc.h" #include "pns_arc.h"
#include "pns_routing_settings.h"
#include "pns_sizes_settings.h" #include "pns_sizes_settings.h"
#include "pns_item.h" #include "pns_item.h"
#include "pns_line.h" #include "pns_line.h"
@ -1950,7 +1948,7 @@ void PNS_KICAD_IFACE::Commit()
for( const auto& [ pad, fpOffset ] : m_fpOffsets ) for( const auto& [ pad, fpOffset ] : m_fpOffsets )
{ {
VECTOR2I offset = fpOffset.p_new - fpOffset.p_old; VECTOR2I offset = fpOffset.p_new - fpOffset.p_old;
FOOTPRINT* footprint = pad->GetParent(); FOOTPRINT* footprint = pad->GetParentFootprint();
VECTOR2I p_orig = footprint->GetPosition(); VECTOR2I p_orig = footprint->GetPosition();
VECTOR2I p_new = p_orig + offset; VECTOR2I p_new = p_orig + offset;

View File

@ -2004,7 +2004,7 @@ bool DRAWING_TOOL::drawShape( const TOOL_EVENT& aTool, PCB_SHAPE** aGraphic,
} }
else else
{ {
PCB_SHAPE* snapItem = dyn_cast<PCB_SHAPE*>( grid.GetSnapped() ); PCB_SHAPE* snapItem = dynamic_cast<PCB_SHAPE*>( grid.GetSnapped() );
if( twoPointManager.GetOrigin() == twoPointManager.GetEnd() if( twoPointManager.GetOrigin() == twoPointManager.GetEnd()
|| ( evt->IsDblClick( BUT_LEFT ) && shape == SHAPE_T::SEGMENT ) || ( evt->IsDblClick( BUT_LEFT ) && shape == SHAPE_T::SEGMENT )
@ -2493,8 +2493,8 @@ bool DRAWING_TOOL::getSourceZoneForAction( ZONE_MODE aMode, ZONE** aZone )
} }
// we want a single zone // we want a single zone
if( selection.Size() == 1 ) if( selection.Size() == 1 && selection[0]->Type() == PCB_ZONE_T )
*aZone = dyn_cast<ZONE*>( selection[0] ); *aZone = static_cast<ZONE*>( selection[0] );
// expected a zone, but didn't get one // expected a zone, but didn't get one
if( !*aZone ) if( !*aZone )
@ -2813,8 +2813,10 @@ int DRAWING_TOOL::DrawVia( const TOOL_EVENT& aEvent )
if( !( item->GetLayerSet() & lset ).any() ) if( !( item->GetLayerSet() & lset ).any() )
continue; continue;
if( PCB_TRACK* track = dyn_cast<PCB_TRACK*>( item ) ) if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T )
{ {
PCB_TRACK* track = static_cast<PCB_TRACK*>( item );
if( TestSegmentHit( position, track->GetStart(), track->GetEnd(), if( TestSegmentHit( position, track->GetStart(), track->GetEnd(),
( track->GetWidth() + aVia->GetWidth() ) / 2 ) ) ( track->GetWidth() + aVia->GetWidth() ) / 2 ) )
{ {

View File

@ -903,59 +903,59 @@ int EDIT_TOOL::FilletTracks( const TOOL_EVENT& aEvent )
bool didOneAttemptFail = false; bool didOneAttemptFail = false;
std::set<PCB_TRACK*> processedTracks; std::set<PCB_TRACK*> processedTracks;
for( EDA_ITEM* item : selection ) auto processFilletOp =
{ [&]( PCB_TRACK* aTrack, bool aStartPoint )
PCB_TRACK* track = dyn_cast<PCB_TRACK*>( item ); {
std::shared_ptr<CONNECTIVITY_DATA> c = board()->GetConnectivity();
VECTOR2I anchor = aStartPoint ? aTrack->GetStart() : aTrack->GetEnd();
std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
if( !track || track->Type() != PCB_TRACE_T || track->GetLength() == 0 ) itemsOnAnchor = c->GetConnectedItemsAtAnchor( aTrack, anchor,
{ { PCB_PAD_T, PCB_VIA_T,
continue; PCB_TRACE_T, PCB_ARC_T } );
}
auto processFilletOp = if( itemsOnAnchor.size() > 0
[&]( bool aStartPoint ) && selection.Contains( itemsOnAnchor.at( 0 ) )
&& itemsOnAnchor.at( 0 )->Type() == PCB_TRACE_T )
{ {
std::shared_ptr<CONNECTIVITY_DATA> c = board()->GetConnectivity(); PCB_TRACK* trackOther = static_cast<PCB_TRACK*>( itemsOnAnchor.at( 0 ) );
VECTOR2I anchor = aStartPoint ? track->GetStart()
: track->GetEnd();
std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
itemsOnAnchor = c->GetConnectedItemsAtAnchor( track, anchor, // Make sure we don't fillet the same pair of tracks twice
{ PCB_PAD_T, PCB_VIA_T, if( processedTracks.find( trackOther ) == processedTracks.end() )
PCB_TRACE_T, PCB_ARC_T } );
if( itemsOnAnchor.size() > 0
&& selection.Contains( itemsOnAnchor.at( 0 ) )
&& itemsOnAnchor.at( 0 )->Type() == PCB_TRACE_T )
{ {
PCB_TRACK* trackOther = dyn_cast<PCB_TRACK*>( itemsOnAnchor.at( 0 ) ); if( itemsOnAnchor.size() == 1 )
// Make sure we don't fillet the same pair of tracks twice
if( processedTracks.find( trackOther ) == processedTracks.end() )
{ {
if( itemsOnAnchor.size() == 1 ) FILLET_OP filletOp;
{ filletOp.t1 = aTrack;
FILLET_OP filletOp; filletOp.t2 = trackOther;
filletOp.t1 = track; filletOp.t1Start = aStartPoint;
filletOp.t2 = trackOther; filletOp.t2Start = aTrack->IsPointOnEnds( filletOp.t2->GetStart() );
filletOp.t1Start = aStartPoint; filletOperations.push_back( filletOp );
filletOp.t2Start = track->IsPointOnEnds( filletOp.t2->GetStart() ); }
filletOperations.push_back( filletOp ); else
} {
else // User requested to fillet these two tracks but not possible as
{ // there are other elements connected at that point
// User requested to fillet these two tracks but not possible as didOneAttemptFail = true;
// there are other elements connected at that point
didOneAttemptFail = true;
}
} }
} }
}; }
};
processFilletOp( true ); // on the start point of track for( EDA_ITEM* item : selection )
processFilletOp( false ); // on the end point of track {
if( item->Type() == PCB_TRACE_T )
{
PCB_TRACK* track = static_cast<PCB_TRACK*>( item );
processedTracks.insert( track ); if( track->GetLength() > 0 )
{
processFilletOp( track, true ); // on the start point of track
processFilletOp( track, false ); // on the end point of track
processedTracks.insert( track );
}
}
} }
std::vector<BOARD_ITEM*> itemsToAddToSelection; std::vector<BOARD_ITEM*> itemsToAddToSelection;
@ -1061,7 +1061,6 @@ int EDIT_TOOL::FilletLines( const TOOL_EVENT& aEvent )
PCB_SELECTION& selection = m_selectionTool->RequestSelection( PCB_SELECTION& selection = m_selectionTool->RequestSelection(
[]( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector, PCB_SELECTION_TOOL* sTool ) []( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector, PCB_SELECTION_TOOL* sTool )
{ {
std::vector<VECTOR2I> pts; std::vector<VECTOR2I> pts;
// Iterate from the back so we don't have to worry about removals. // Iterate from the back so we don't have to worry about removals.

View File

@ -187,13 +187,10 @@ int PAD_TOOL::copyPadSettings( const TOOL_EVENT& aEvent )
static void doPushPadProperties( BOARD& board, const PAD& aSrcPad, BOARD_COMMIT& commit, static void doPushPadProperties( BOARD& board, const PAD& aSrcPad, BOARD_COMMIT& commit,
bool aSameFootprints, bool aSameFootprints, bool aPadShapeFilter, bool aPadOrientFilter,
bool aPadShapeFilter, bool aPadLayerFilter, bool aPadTypeFilter )
bool aPadOrientFilter,
bool aPadLayerFilter,
bool aPadTypeFilter )
{ {
const FOOTPRINT* refFootprint = aSrcPad.GetParent(); const FOOTPRINT* refFootprint = aSrcPad.GetParentFootprint();
EDA_ANGLE srcPadAngle = aSrcPad.GetOrientation() - refFootprint->GetOrientation(); EDA_ANGLE srcPadAngle = aSrcPad.GetOrientation() - refFootprint->GetOrientation();
@ -241,40 +238,37 @@ int PAD_TOOL::pushPadSettings( const TOOL_EVENT& aEvent )
{ {
PCB_SELECTION_TOOL* selTool = m_toolMgr->GetTool<PCB_SELECTION_TOOL>(); PCB_SELECTION_TOOL* selTool = m_toolMgr->GetTool<PCB_SELECTION_TOOL>();
const PCB_SELECTION& selection = selTool->GetSelection(); const PCB_SELECTION& selection = selTool->GetSelection();
PAD* srcPad;
if( selection.Size() == 1 && selection[0]->Type() == PCB_PAD_T ) if( selection.Size() == 1 && selection[0]->Type() == PCB_PAD_T )
srcPad = static_cast<PAD*>( selection[0] ); {
else PAD* srcPad = static_cast<PAD*>( selection[0] );
return 0;
FOOTPRINT* footprint = srcPad->GetParent(); if( FOOTPRINT* footprint = srcPad->GetParentFootprint() )
{
frame()->SetMsgPanel( footprint );
if( !footprint ) DIALOG_PUSH_PAD_PROPERTIES dlg( frame() );
return 0; int dialogRet = dlg.ShowModal();
frame()->SetMsgPanel( footprint ); if( dialogRet == wxID_CANCEL )
return 0;
DIALOG_PUSH_PAD_PROPERTIES dlg( frame() ); const bool edit_Same_Modules = (dialogRet == 1);
int dialogRet = dlg.ShowModal();
if( dialogRet == wxID_CANCEL ) BOARD_COMMIT commit( frame() );
return 0;
const bool edit_Same_Modules = (dialogRet == 1); doPushPadProperties( *getModel<BOARD>(), *srcPad, commit, edit_Same_Modules,
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Shape_Filter,
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Orient_Filter,
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Layer_Filter,
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Type_Filter );
BOARD_COMMIT commit( frame() ); commit.Push( _( "Push Pad Settings" ) );
doPushPadProperties( *getModel<BOARD>(), *srcPad, commit, edit_Same_Modules, m_toolMgr->ProcessEvent( EVENTS::SelectedItemsModified );
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Shape_Filter, frame()->Refresh();
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Orient_Filter, }
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Layer_Filter, }
DIALOG_PUSH_PAD_PROPERTIES::m_Pad_Type_Filter );
commit.Push( _( "Push Pad Settings" ) );
m_toolMgr->ProcessEvent( EVENTS::SelectedItemsModified );
frame()->Refresh();
return 0; return 0;
} }

View File

@ -1536,7 +1536,7 @@ int PCB_SELECTION_TOOL::grabUnconnected( const TOOL_EVENT& aEvent )
if( edge.GetLength() < currentDistance ) if( edge.GetLength() < currentDistance )
{ {
currentDistance = edge.GetLength(); currentDistance = edge.GetLength();
nearest = static_cast<PAD*>( other->Parent() )->GetParent(); nearest = other->Parent()->GetParentFootprint();
} }
} }
@ -2730,26 +2730,24 @@ bool PCB_SELECTION_TOOL::selectionContains( const VECTOR2I& aPoint ) const
bool found = false; bool found = false;
std::function<void( PCB_GROUP* )> checkGroup; std::function<void( PCB_GROUP* )> checkGroup =
checkGroup = [&]( PCB_GROUP* aGroup ) [&]( PCB_GROUP* aGroup )
{ {
aGroup->RunOnChildren( aGroup->RunOnChildren(
[&]( BOARD_ITEM* aItem ) [&]( BOARD_ITEM* aItem )
{ {
if( PCB_GROUP* group = dyn_cast<PCB_GROUP*>( aItem ) ) if( aItem->Type() == PCB_GROUP_T )
checkGroup( group ); checkGroup( static_cast<PCB_GROUP*>( aItem ) );
else if( aItem->HitTest( aPoint, margin ) ) else if( aItem->HitTest( aPoint, margin ) )
found = true; found = true;
} ); } );
}; };
if( PCB_GROUP* group = dyn_cast<PCB_GROUP*>( item ) ) if( item->Type() == PCB_GROUP_T )
{ checkGroup( static_cast<PCB_GROUP*>( item ) );
checkGroup( group );
if( found ) if( found )
return true; return true;
}
} }
} }

View File

@ -80,7 +80,7 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const TOOL_EVENT& aTool,
if( newItem->Type() == PCB_FOOTPRINT_T ) if( newItem->Type() == PCB_FOOTPRINT_T )
{ {
FOOTPRINT* fp = dyn_cast<FOOTPRINT*>( newItem.get() ); FOOTPRINT* fp = static_cast<FOOTPRINT*>( newItem.get() );
// footprints have more drawable parts // footprints have more drawable parts
fp->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) ); fp->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) );