pcbnew: multiple fixes concerning track->pad net propagation used by Track/Via properties dialog:
- Added ignore netcode option to CONNECTIVITY_DATA::GetConnectedItems() - PlaceModule() now ensures the module added to the board (and thus to the connectivity database) has correct bounding box necessary for R-trees to work - Use recursive connected pad search so that the new net is propagated to all pads Fixes: lp:1787961 * https://bugs.launchpad.net/kicad/+bug/1787961
This commit is contained in:
parent
7bec707160
commit
9657039af2
|
@ -650,7 +650,10 @@ int D_PAD::GetSolderMaskMargin() const
|
||||||
if( margin == 0 )
|
if( margin == 0 )
|
||||||
{
|
{
|
||||||
BOARD* brd = GetBoard();
|
BOARD* brd = GetBoard();
|
||||||
margin = brd->GetDesignSettings().m_SolderMaskMargin;
|
if( brd )
|
||||||
|
{
|
||||||
|
margin = brd->GetDesignSettings().m_SolderMaskMargin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,11 +353,14 @@ void CONNECTIVITY_DATA::Clear()
|
||||||
|
|
||||||
const std::vector<BOARD_CONNECTED_ITEM*> CONNECTIVITY_DATA::GetConnectedItems(
|
const std::vector<BOARD_CONNECTED_ITEM*> CONNECTIVITY_DATA::GetConnectedItems(
|
||||||
const BOARD_CONNECTED_ITEM* aItem,
|
const BOARD_CONNECTED_ITEM* aItem,
|
||||||
const KICAD_T aTypes[] ) const
|
const KICAD_T aTypes[],
|
||||||
|
bool aIgnoreNetcodes ) const
|
||||||
{
|
{
|
||||||
std::vector<BOARD_CONNECTED_ITEM*> rv;
|
std::vector<BOARD_CONNECTED_ITEM*> rv;
|
||||||
const auto clusters = m_connAlgo->SearchClusters( CN_CONNECTIVITY_ALGO::CSM_CONNECTIVITY_CHECK,
|
const auto clusters = m_connAlgo->SearchClusters(
|
||||||
aTypes, aItem->GetNetCode() );
|
aIgnoreNetcodes ? CN_CONNECTIVITY_ALGO::CSM_PROPAGATE : CN_CONNECTIVITY_ALGO::CSM_CONNECTIVITY_CHECK,
|
||||||
|
aTypes,
|
||||||
|
aIgnoreNetcodes ? -1 : aItem->GetNetCode() );
|
||||||
|
|
||||||
for( auto cl : clusters )
|
for( auto cl : clusters )
|
||||||
{
|
{
|
||||||
|
|
|
@ -175,7 +175,7 @@ public:
|
||||||
|
|
||||||
const std::vector<D_PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
|
const std::vector<D_PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
|
||||||
|
|
||||||
const void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<D_PAD*>* pads ) const;
|
const void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<D_PAD*>* pads) const;
|
||||||
|
|
||||||
const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor, KICAD_T aTypes[] );
|
const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor, KICAD_T aTypes[] );
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ public:
|
||||||
* @param aTypes allows one to filter by item types.
|
* @param aTypes allows one to filter by item types.
|
||||||
*/
|
*/
|
||||||
const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem,
|
const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem,
|
||||||
const KICAD_T aTypes[] ) const;
|
const KICAD_T aTypes[], bool aIgnoreNetcodes = false ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetNetItems()
|
* Function GetNetItems()
|
||||||
|
|
|
@ -344,8 +344,15 @@ bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
|
||||||
|
|
||||||
for( auto& item : m_items )
|
for( auto& item : m_items )
|
||||||
{
|
{
|
||||||
auto boardItem = static_cast<BOARD_CONNECTED_ITEM*>( item );
|
const KICAD_T ourTypes[] = { PCB_TRACE_T, PCB_PAD_T, PCB_VIA_T, PCB_MODULE_T, EOT };
|
||||||
connectivity->GetConnectedPads( boardItem, &connectedPads );
|
auto connectedItems = connectivity->GetConnectedItems( static_cast<BOARD_CONNECTED_ITEM*>( item ), ourTypes, true );
|
||||||
|
for ( auto citem : connectedItems )
|
||||||
|
{
|
||||||
|
if( citem->Type() == PCB_PAD_T )
|
||||||
|
{
|
||||||
|
connectedPads.insert( static_cast<D_PAD*>( citem ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for( D_PAD* pad : connectedPads )
|
for( D_PAD* pad : connectedPads )
|
||||||
|
|
|
@ -483,9 +483,19 @@ int PCB_EDITOR_CONTROL::PlaceModule( const TOOL_EVENT& aEvent )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
module->SetLink( 0 );
|
module->SetLink( 0 );
|
||||||
m_frame->AddModuleToBoard( module );
|
|
||||||
commit.Added( module );
|
module->SetFlags( IS_NEW ); // whatever
|
||||||
|
module->SetTimeStamp( GetNewTimeStamp() );
|
||||||
|
|
||||||
|
// Put it on FRONT layer,
|
||||||
|
// (Can be stored flipped if the lib is an archive built from a board)
|
||||||
|
if( module->IsFlipped() )
|
||||||
|
module->Flip( module->GetPosition() );
|
||||||
|
|
||||||
|
module->SetOrientation( 0 );
|
||||||
module->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
|
module->SetPosition( wxPoint( cursorPos.x, cursorPos.y ) );
|
||||||
|
|
||||||
|
commit.Add( module );
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, module );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, module );
|
||||||
controls->SetCursorPosition( cursorPos, false );
|
controls->SetCursorPosition( cursorPos, false );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue