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:
parent
300a60e88e
commit
493828cc6b
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(), "" );
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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" );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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() );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 ) );
|
||||||
|
|
Loading…
Reference in New Issue