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:
parent
49cad0de95
commit
b27176f230
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue