/* Explores the list of pads and adds to m_PadsConnected member * of each pad pads connected to * Here, connections are due to intersecting pads, not tracks */ void CONNECTIONS::SearchConnectionsPadsToIntersectingPads() { std::vector<CONNECTED_POINT*> candidates; BuildPadsCandidatesList(); for( unsigned ii = 0; ii < m_sortedPads.size(); ii++ ) { D_PAD* pad = m_sortedPads[ii]; pad->m_PadsConnected.clear(); candidates.clear(); CollectItemsNearTo( candidates, pad->ShapePos(), pad->GetBoundingRadius() ); // add pads to pad.m_PadsConnected, if they are connected for( unsigned jj = 0; jj < candidates.size(); jj++ ) { CONNECTED_POINT* item = candidates[jj]; D_PAD* candidate_pad = item->GetPad(); if( pad == candidate_pad ) continue; if( !( pad->GetLayerSet() & candidate_pad->GetLayerSet() ).any() ) continue; if( pad->HitTest( item->GetPoint() ) ) { pad->m_PadsConnected.push_back( candidate_pad ); } } } }
/* Explores the list of pads * Adds to m_PadsConnected member of each track the pad(s) connected to * Adds to m_TracksConnected member of each pad the track(s) connected to * D_PAD::m_TracksConnected is cleared before adding items * TRACK::m_PadsConnected is not cleared */ void CONNECTIONS::SearchTracksConnectedToPads( bool add_to_padlist, bool add_to_tracklist) { std::vector<CONNECTED_POINT*> candidates; for( unsigned ii = 0; ii < m_sortedPads.size(); ii++ ) { D_PAD * pad = m_sortedPads[ii]; pad->m_TracksConnected.clear(); candidates.clear(); CollectItemsNearTo( candidates, pad->GetPosition(), pad->GetBoundingRadius() ); // add this pad to track.m_PadsConnected, if it is connected for( unsigned jj = 0; jj < candidates.size(); jj++ ) { CONNECTED_POINT* cp_item = candidates[jj]; if( !( pad->GetLayerSet() & cp_item->GetTrack()->GetLayerSet() ).any() ) continue; if( pad->HitTest( cp_item->GetPoint() ) ) { if( add_to_padlist ) cp_item->GetTrack()->m_PadsConnected.push_back( pad ); if( add_to_tracklist ) pad->m_TracksConnected.push_back( cp_item->GetTrack() ); } } } }
void DRC::testPad2Pad() { std::vector<D_PAD*> sortedPads; m_pcb->GetSortedPadListByXthenYCoord( sortedPads ); // find the max size of the pads (used to stop the test) int max_size = 0; for( unsigned i = 0; i < sortedPads.size(); ++i ) { D_PAD* pad = sortedPads[i]; // GetBoundingRadius() is the radius of the minimum sized circle fully containing the pad int radius = pad->GetBoundingRadius(); if( radius > max_size ) max_size = radius; } // Test the pads D_PAD** listEnd = &sortedPads[ sortedPads.size() ]; for( unsigned i = 0; i< sortedPads.size(); ++i ) { D_PAD* pad = sortedPads[i]; int x_limit = max_size + pad->GetClearance() + pad->GetBoundingRadius() + pad->GetPosition().x; if( !doPadToPadsDrc( pad, &sortedPads[i], listEnd, x_limit ) ) { wxASSERT( m_currentMarker ); m_pcb->Add( m_currentMarker ); m_mainWindow->GetGalCanvas()->GetView()->Add( m_currentMarker ); m_currentMarker = 0; } } }