Pcbnew: fix segfault after deleting a pad from a footprint then performing a DRC action such as a via drag.

This commit is contained in:
Dick Hollenbeck 2015-09-23 19:02:40 -04:00 committed by Wayne Stambaugh
parent 49cad0de95
commit b27176f230
7 changed files with 51 additions and 15 deletions

View File

@ -537,29 +537,27 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
*/ */
void DeleteMarkedItems( MODULE* module ) void DeleteMarkedItems( MODULE* module )
{ {
BOARD_ITEM* item;
BOARD_ITEM* next_item; BOARD_ITEM* next_item;
D_PAD* pad;
D_PAD* next_pad; D_PAD* next_pad;
BOARD* board = module->GetBoard();
if( module == NULL ) if( module == NULL )
return; return;
pad = module->Pads(); for( D_PAD* pad = module->Pads(); pad; pad = next_pad )
for( ; pad != NULL; pad = next_pad )
{ {
next_pad = pad->Next(); next_pad = pad->Next();
if( !pad->IsSelected() ) if( !pad->IsSelected() )
continue; continue;
if( board )
board->PadDelete( pad );
else
pad->DeleteStructure(); pad->DeleteStructure();
} }
item = module->GraphicalItems(); for( BOARD_ITEM* item = module->GraphicalItems(); item; item = next_item )
for( ; item != NULL; item = next_item )
{ {
next_item = item->Next(); next_item = item->Next();

View File

@ -1666,6 +1666,14 @@ void BOARD::GetSortedPadListByXthenYCoord( std::vector<D_PAD*>& aVector, int aNe
} }
void BOARD::PadDelete( D_PAD* aPad )
{
m_NetInfo.DeletePad( aPad );
aPad->DeleteStructure();
}
TRACK* BOARD::GetTrack( TRACK* aTrace, const wxPoint& aPosition, TRACK* BOARD::GetTrack( TRACK* aTrace, const wxPoint& aPosition,
LSET aLayerMask ) const LSET aLayerMask ) const
{ {

View File

@ -1274,6 +1274,14 @@ public:
*/ */
D_PAD* GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, LSET aLayerMask ); D_PAD* GetPad( std::vector<D_PAD*>& aPadList, const wxPoint& aPosition, LSET aLayerMask );
/**
* Function PadDelete
* deletes a given bad from the BOARD by removing it from its module and
* from the m_NetInfo. Makes no UI calls.
* @param aPad is the pad to delete.
*/
void PadDelete( D_PAD* aPad );
/** /**
* Function GetSortedPadListByXthenYCoord * Function GetSortedPadListByXthenYCoord
* first empties then fills the vector with all pads and sorts them by * first empties then fills the vector with all pads and sorts them by

View File

@ -304,9 +304,8 @@ public:
/** /**
* Function GetPads * Function GetPads
* returns a list of all the pads. The returned list is not * returns a list of all the pads (so long as buildPadsFullList() has
* sorted and contains pointers to PADS, but those pointers do not convey * been recently called). Returned list contains non-owning pointers.
* ownership of the respective PADs.
* @return std::vector<D_PAD*>& - a full list of pads * @return std::vector<D_PAD*>& - a full list of pads
std::vector<D_PAD*>& GetPads() std::vector<D_PAD*>& GetPads()
{ {
@ -326,6 +325,22 @@ public:
return NULL; return NULL;
} }
bool DeletePad( D_PAD* aPad )
{
std::vector<D_PAD*>::iterator it = m_PadsFullList.begin();
std::vector<D_PAD*>::iterator end = m_PadsFullList.end();
for( ; it != end; ++it )
{
if( *it == aPad )
{
m_PadsFullList.erase( it );
return true;
}
}
return false;
}
///> Constant that holds the "unconnected net" number (typically 0) ///> Constant that holds the "unconnected net" number (typically 0)
///> all items "connected" to this net are actually not connected items ///> all items "connected" to this net are actually not connected items
static const int UNCONNECTED; static const int UNCONNECTED;
@ -409,7 +424,7 @@ public:
private: private:
/** /**
* Function DeleteData * Function clear
* deletes the list of nets (and free memory) * deletes the list of nets (and free memory)
*/ */
void clear(); void clear();

View File

@ -144,6 +144,7 @@ void NETINFO_LIST::buildListOfNets()
// Add pad to the appropriate list of pads // Add pad to the appropriate list of pads
NETINFO_ITEM* net = pad->GetNet(); NETINFO_ITEM* net = pad->GetNet();
// it should not be possible for BOARD_CONNECTED_ITEM to return NULL as a result of GetNet() // it should not be possible for BOARD_CONNECTED_ITEM to return NULL as a result of GetNet()
wxASSERT( net ); wxASSERT( net );
@ -162,6 +163,7 @@ void NETINFO_LIST::buildListOfNets()
m_Parent->SetAreasNetCodesFromNetNames(); m_Parent->SetAreasNetCodesFromNetNames();
} }
#if defined(DEBUG) #if defined(DEBUG)
void NETINFO_LIST::Show() const void NETINFO_LIST::Show() const
{ {
@ -176,6 +178,7 @@ void NETINFO_LIST::Show() const
} }
#endif #endif
void NETINFO_LIST::buildPadsFullList() void NETINFO_LIST::buildPadsFullList()
{ {
/* /*

View File

@ -272,7 +272,9 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
// Compute the min distance to pads // Compute the min distance to pads
if( testPads ) if( testPads )
{ {
for( unsigned ii = 0; ii<m_pcb->GetPadCount(); ++ii ) unsigned pad_count = m_pcb->GetPadCount();
for( unsigned ii = 0; ii<pad_count; ++ii )
{ {
D_PAD* pad = m_pcb->GetPad( ii ); D_PAD* pad = m_pcb->GetPad( ii );

View File

@ -220,7 +220,9 @@ void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery )
EDA_RECT bbox = module->GetBoundingBox(); EDA_RECT bbox = module->GetBoundingBox();
m_Pcb->m_Status_Pcb = 0; m_Pcb->m_Status_Pcb = 0;
aPad->DeleteStructure();
GetBoard()->PadDelete( aPad );
// Update the bounding box // Update the bounding box
module->CalculateBoundingBox(); module->CalculateBoundingBox();