/* Used after a track change (delete a track ou add a track) * Connections to pads are recalculated * Note also aFirstTrack (and aLastTrack ) can be NULL */ void CONNECTIONS::Build_CurrNet_SubNets_Connections( TRACK* aFirstTrack, TRACK* aLastTrack, int aNetcode ) { m_firstTrack = aFirstTrack; // The first track used to build m_Candidates m_lastTrack = aLastTrack; // The last track used to build m_Candidates // Pads subnets are expected already cleared, because this function // does not know the full list of pads BuildTracksCandidatesList( aFirstTrack, aLastTrack ); TRACK* curr_track; for( curr_track = aFirstTrack; curr_track != NULL; curr_track = curr_track->Next() ) { // Clear track subnet id (Pads subnets are cleared outside this function) curr_track->SetSubNet( 0 ); curr_track->m_TracksConnected.clear(); curr_track->m_PadsConnected.clear(); // Update connections between tracks: SearchConnectedTracks( curr_track ); curr_track->m_TracksConnected = m_connected; if( curr_track == aLastTrack ) break; } // Update connections between tracks and pads BuildPadsList( aNetcode ); SearchTracksConnectedToPads(); // Update connections between intersecting pads (no tracks) SearchConnectionsPadsToIntersectingPads(); // Creates sub nets (clusters) for the current net: Propagate_SubNets(); }
void TRACKS_CLEANER::buildTrackConnectionInfo() { BuildTracksCandidatesList( m_Brd->m_Track, NULL); // clear flags and variables used in cleanup for( TRACK * track = m_Brd->m_Track; track; track = track->Next() ) { track->start = NULL; track->end = NULL; track->m_PadsConnected.clear(); track->SetState( START_ON_PAD|END_ON_PAD|BUSY, false ); } // Build connections info tracks to pads SearchTracksConnectedToPads(); for( TRACK * track = m_Brd->m_Track; track; track = track->Next() ) { // Mark track if connected to pads for( unsigned jj = 0; jj < track->m_PadsConnected.size(); jj++ ) { D_PAD * pad = track->m_PadsConnected[jj]; if( pad->HitTest( track->GetStart() ) ) { track->start = pad; track->SetState( START_ON_PAD, true ); } if( pad->HitTest( track->GetEnd() ) ) { track->end = pad; track->SetState( END_ON_PAD, true ); } } } }