Loading common/hotkeys_basic.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -689,7 +689,7 @@ void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( struct EDA_HOTKEY_CONFIG* aDesc mask, mask, this, this, wxFD_OPEN, wxFD_OPEN, TRUE ); true ); if( filename.IsEmpty() ) if( filename.IsEmpty() ) return; return; Loading @@ -710,14 +710,14 @@ void EDA_BASE_FRAME::ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescLi wxString path = wxGetCwd(); wxString path = wxGetCwd(); wxString filename; wxString filename; filename = EDA_FileSelector( _( "Read Hotkey Configuration File:" ), filename = EDA_FileSelector( _( "Write Hotkey Configuration File:" ), path, path, filename, filename, ext, ext, mask, mask, this, this, wxFD_OPEN, wxFD_OPEN | wxFD_SAVE, TRUE ); true ); if( filename.IsEmpty() ) if( filename.IsEmpty() ) return; return; Loading pcbnew/CMakeLists.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -132,7 +132,7 @@ set(PCBNEW_SRCS magnetic_tracks_functions.cpp magnetic_tracks_functions.cpp menubar_modedit.cpp menubar_modedit.cpp menubar_pcbframe.cpp menubar_pcbframe.cpp minumun_spanning_tree.cpp minimun_spanning_tree.cpp mirepcb.cpp mirepcb.cpp modedit.cpp modedit.cpp modedit_onclick.cpp modedit_onclick.cpp Loading pcbnew/minumun_spanning_tree.cpp→pcbnew/minimun_spanning_tree.cpp +2 −2 Original line number Original line Diff line number Diff line /** /** * @file minumun_spanning_tree.cpp * @file minimun_spanning_tree.cpp */ */ /* /* Loading Loading @@ -31,7 +31,7 @@ #include <limits.h> #include <limits.h> #include "minumun_spanning_tree.h" #include "minimun_spanning_tree.h" #include "class_pad.h" #include "class_pad.h" /* /* Loading pcbnew/minumun_spanning_tree.h→pcbnew/minimun_spanning_tree.h +1 −1 Original line number Original line Diff line number Diff line /** /** * @file minumun_spanning_tree.h * @file minimun_spanning_tree.h */ */ #include <vector> #include <vector> Loading pcbnew/ratsnest.cpp +123 −116 Original line number Original line Diff line number Diff line Loading @@ -17,12 +17,7 @@ #include "pcbnew.h" #include "pcbnew.h" #include "minumun_spanning_tree.h" #include "minimun_spanning_tree.h" static std::vector <D_PAD*> s_localPadBuffer; // for local ratsnest // calculations when moving a // footprint: buffer of pads to // consider /** /** * @brief class MIN_SPAN_TREE_PADS (derived from MIN_SPAN_TREE) specialize * @brief class MIN_SPAN_TREE_PADS (derived from MIN_SPAN_TREE) specialize Loading Loading @@ -190,8 +185,7 @@ static bool sortByNetcode( const D_PAD* const & ref, const D_PAD* const & item ) /** /** * Function to compute the full ratsnest * Function to compute the full ratsnest * In the functions tracks are not considered * This is the "basic" ratsnest depending only on pads. * This is only the "basic" ratsnest depending only on pads. * * * Create the sorted pad list (if necessary) * Create the sorted pad list (if necessary) * The active pads (i.e included in a net ) are called nodes * The active pads (i.e included in a net ) are called nodes Loading @@ -201,8 +195,7 @@ static bool sortByNetcode( const D_PAD* const & ref, const D_PAD* const & item ) * Update : * Update : * nb_nodes = Active pads count for the board * nb_nodes = Active pads count for the board * nb_links = link count for the board (logical connection count) * nb_links = link count for the board (logical connection count) * (there are n-1 links for a connection which have n active pads) . * (there are n-1 links in a net which counting n active pads) . * */ */ void PCB_BASE_FRAME::Build_Board_Ratsnest() void PCB_BASE_FRAME::Build_Board_Ratsnest() { { Loading Loading @@ -265,10 +258,10 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest() /** /** * function Displays the general ratsnest * function DrawGeneralRatsnest * Only ratsnest with the status bit CH_VISIBLE is set are displayed * Only ratsnest items with the status bit CH_VISIBLE set are displayed * @param aDC = the current device context (can be NULL) * @param aDC = the current device context (can be NULL) * @param aNetcode if > 0, Display only the ratsnest relative to the * @param aNetcode: if > 0, Display only the ratsnest relative to the * corresponding net_code * corresponding net_code */ */ void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) Loading @@ -282,7 +275,7 @@ void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) if( aDC == NULL ) if( aDC == NULL ) return; return; int state = CH_VISIBLE | CH_ACTIF; const int state = CH_VISIBLE | CH_ACTIF; for( unsigned ii = 0; ii < m_Pcb->GetRatsnestsCount(); ii++ ) for( unsigned ii = 0; ii < m_Pcb->GetRatsnestsCount(); ii++ ) { { Loading Loading @@ -363,12 +356,10 @@ static int tst_rats_block_to_block( NETINFO_ITEM* net, /** /** * Function used by TestRatsNest_general * Function used by TestRatsNest_general * The general ratsnest list must exists * The general ratsnest list must exists because this function explore this ratsnest * Activates the ratsnest between 2 pads ( assumes the same net ) * Activates (set the CH_ACTIF flag) the ratsnest links between 2 pads when needed * The function links 1 pad not already connected an other pad and activate * The function links 1 pad not already connected to an other pad (SubRatsnest = 0) * some blocks linked by a ratsnest * and active the correspondint link * It tests only the existing ratsnest and activate some ratsnest (status bit * CH_ACTIF set) * * * @param start_rat_list = starting address for the ratsnest list * @param start_rat_list = starting address for the ratsnest list * @param end_rat_list = ending address for the ratsnest list * @param end_rat_list = ending address for the ratsnest list Loading Loading @@ -419,7 +410,23 @@ static int tst_rats_pad_to_pad( int current_num_block, return current_num_block; return current_num_block; } } /* function TestRatsNest * determine the active links inside the full ratsnest * * I used an derived from the "lee algorithm". * The algorithm explore the existing full ratnest * This is a 2 steps algorithm (executed for each net). * - First: * Initialise for each pad the subratsnest id to its subnet value * explore the full ratnest (relative to the net) and active a link each time at least one pad of * the given link is not connected to an other pad by a track ( subratsnest = 0) * If the 2 pads linked have both the subratsnest id = 0, a new subratsnest value is created * - Second: * explore the full ratnest (relative to the net) and find a link that links * 2 pads having different subratsnest values * Active the link and merge the 2 subratsnest value. * */ void PCB_BASE_FRAME::TestRatsNest( wxDC* aDC, int aNetCode ) void PCB_BASE_FRAME::TestRatsNest( wxDC* aDC, int aNetCode ) { { RATSNEST_ITEM* rats; RATSNEST_ITEM* rats; Loading Loading @@ -492,6 +499,11 @@ int PCB_BASE_FRAME::TestOneRatsNest( wxDC* aDC, int aNetCode ) void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) { { // for local ratsnest calculation when moving a footprint: // list of pads to use for this local ratsnets: // this is the list of connected pads of the current module, // and all pads connected to these pads: static std::vector <D_PAD*> localPadList; static unsigned pads_module_count; // node count (node = pad with a net static unsigned pads_module_count; // node count (node = pad with a net // code) for the footprint being moved // code) for the footprint being moved static unsigned internalRatsCount; // number of internal links (links static unsigned internalRatsCount; // number of internal links (links Loading @@ -514,38 +526,38 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) * footprints which are "connected" to * footprints which are "connected" to * a pad in the current footprint * a pad in the current footprint */ */ if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) != 0 ) if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) == 0 ) goto CalculateExternalRatsnest; { /* Compute the "internal" ratsnest, i.e the links between the current /* Compute the "internal" ratsnest, i.e the links between the current * footprint pads * footprint pads */ */ s_localPadBuffer.clear(); localPadList.clear(); m_Pcb->m_LocalRatsnest.clear(); m_Pcb->m_LocalRatsnest.clear(); // collect active pads of the module: for( pad_ref = aModule->m_Pads; pad_ref != NULL; pad_ref = pad_ref->Next() ) for( pad_ref = aModule->m_Pads; pad_ref != NULL; pad_ref = pad_ref->Next() ) { { if( pad_ref->GetNet() == 0 ) if( pad_ref->GetNet() == 0 ) continue; continue; s_localPadBuffer.push_back( pad_ref ); localPadList.push_back( pad_ref ); pad_ref->SetSubRatsnest( 0 ); pad_ref->SetSubRatsnest( 0 ); pad_ref->SetSubNet( 0 ); pad_ref->SetSubNet( 0 ); } } pads_module_count = s_localPadBuffer.size(); pads_module_count = localPadList.size(); if( pads_module_count == 0 ) if( pads_module_count == 0 ) return; /* no connection! */ return; /* no connection! */ sort( s_localPadBuffer.begin(), s_localPadBuffer.end(), sortByNetcode ); sort( localPadList.begin(), localPadList.end(), sortByNetcode ); /* Build the list of pads linked to the current footprint pads */ /* Build the list of pads linked to the current footprint pads */ current_net_code = 0; current_net_code = 0; for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { pad_ref = s_localPadBuffer[ii]; pad_ref = localPadList[ii]; if( pad_ref->GetNet() == current_net_code ) if( pad_ref->GetNet() == current_net_code ) continue; continue; Loading @@ -569,12 +581,12 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) pad_externe->SetSubRatsnest( 0 ); pad_externe->SetSubRatsnest( 0 ); pad_externe->SetSubNet( 0 ); pad_externe->SetSubNet( 0 ); s_localPadBuffer.push_back( pad_externe ); localPadList.push_back( pad_externe ); } } } } /* Sort the pad list by net_code */ /* Sort the pad list by net_code */ sort( s_localPadBuffer.begin() + pads_module_count, s_localPadBuffer.end(), sort( localPadList.begin() + pads_module_count, localPadList.end(), sortByNetcode ); sortByNetcode ); /* Compute the internal rats nest: /* Compute the internal rats nest: Loading @@ -582,11 +594,10 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) * footprint pads it is therefore not time consuming, and it is made only * footprint pads it is therefore not time consuming, and it is made only * once * once */ */ current_net_code = s_localPadBuffer[0]->GetNet(); current_net_code = localPadList[0]->GetNet(); { MIN_SPAN_TREE_PADS min_spanning_tree; MIN_SPAN_TREE_PADS min_spanning_tree; std::vector<D_PAD*> padsBuffer; std::vector<D_PAD*> padsBuffer; // contains pads of only one net for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { /* Search the end of pad list relative to the current net */ /* Search the end of pad list relative to the current net */ Loading @@ -597,38 +608,33 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) if( jj >= pads_module_count ) if( jj >= pads_module_count ) break; break; if( s_localPadBuffer[jj]->GetNet() != current_net_code ) if( localPadList[jj]->GetNet() != current_net_code ) break; break; } } for(unsigned kk = ii; kk < jj; kk++ ) for(unsigned kk = ii; kk < jj; kk++ ) padsBuffer.push_back( s_localPadBuffer[kk] ); padsBuffer.push_back( localPadList[kk] ); min_spanning_tree.MSP_Init( &padsBuffer ); min_spanning_tree.MSP_Init( &padsBuffer ); min_spanning_tree.BuildTree(); min_spanning_tree.BuildTree(); min_spanning_tree.AddItemsToRatsnest( m_Pcb->m_LocalRatsnest ); min_spanning_tree.AddItemsToRatsnest( m_Pcb->m_LocalRatsnest ); padsBuffer.clear(); padsBuffer.clear(); ii = jj; ii = jj; if( ii < s_localPadBuffer.size() ) if( ii < localPadList.size() ) current_net_code = s_localPadBuffer[ii]->GetNet(); current_net_code = localPadList[ii]->GetNet(); } } } internalRatsCount = m_Pcb->m_LocalRatsnest.size(); internalRatsCount = m_Pcb->m_LocalRatsnest.size(); /* set the ratsnest status, flag LOCAL_RATSNEST_ITEM */ // set the flag LOCAL_RATSNEST_ITEM of the ratsnest status: for( unsigned ii = 0; ii < m_Pcb->m_LocalRatsnest.size(); ii++ ) for( unsigned ii = 0; ii < m_Pcb->m_LocalRatsnest.size(); ii++ ) { m_Pcb->m_LocalRatsnest[ii].m_Status = LOCAL_RATSNEST_ITEM; m_Pcb->m_LocalRatsnest[ii].m_Status = LOCAL_RATSNEST_ITEM; } m_Pcb->m_Status_Pcb |= RATSNEST_ITEM_LOCAL_OK; m_Pcb->m_Status_Pcb |= RATSNEST_ITEM_LOCAL_OK; } // End of internal ratsnest build /* This section computes the "external" ratsnest: must be done when the /* This section computes the "external" ratsnest: it is done when the * footprint position changes * footprint position changes */ * CalculateExternalRatsnest: * This section search: /* This section search: * for each current module pad the nearest neighbor external pad (of * for each current module pad the nearest neighbor external pad (of * course for the same net code). * course for the same net code). * For each current footprint cluster of pad (pads having the same net * For each current footprint cluster of pad (pads having the same net Loading @@ -637,19 +643,20 @@ CalculateExternalRatsnest: * so, for each net, only one rats nest item is created * so, for each net, only one rats nest item is created */ */ RATSNEST_ITEM local_rats; RATSNEST_ITEM local_rats; local_rats.m_Lenght = 0x7FFFFFFF; local_rats.m_Lenght = INT_MAX; local_rats.m_Status = 0; local_rats.m_Status = 0; bool addRats = false; bool addRats = false; // Erase external ratsnest items: if( internalRatsCount < m_Pcb->m_LocalRatsnest.size() ) if( internalRatsCount < m_Pcb->m_LocalRatsnest.size() ) m_Pcb->m_LocalRatsnest.erase( m_Pcb->m_LocalRatsnest.begin() + internalRatsCount, m_Pcb->m_LocalRatsnest.erase( m_Pcb->m_LocalRatsnest.begin() + internalRatsCount, m_Pcb->m_LocalRatsnest.end() ); m_Pcb->m_LocalRatsnest.end() ); current_net_code = s_localPadBuffer[0]->GetNet(); current_net_code = localPadList[0]->GetNet(); for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { pad_ref = s_localPadBuffer[ii]; pad_ref = localPadList[ii]; if( pad_ref->GetNet() != current_net_code ) if( pad_ref->GetNet() != current_net_code ) { { Loading @@ -661,15 +668,15 @@ CalculateExternalRatsnest: addRats = false; addRats = false; current_net_code = pad_ref->GetNet(); current_net_code = pad_ref->GetNet(); local_rats.m_Lenght = 0x7FFFFFFF; local_rats.m_Lenght = INT_MAX; } } pad_pos = pad_ref->m_Pos - g_Offset_Module; pad_pos = pad_ref->m_Pos - g_Offset_Module; // Search the nearest external pad of this current pad // Search the nearest external pad of this current pad for( unsigned jj = pads_module_count; jj < s_localPadBuffer.size(); jj++ ) for( unsigned jj = pads_module_count; jj < localPadList.size(); jj++ ) { { pad_externe = s_localPadBuffer[jj]; pad_externe = localPadList[jj]; /* we search pads having the same net code */ /* we search pads having the same net code */ if( pad_externe->GetNet() < pad_ref->GetNet() ) if( pad_externe->GetNet() < pad_ref->GetNet() ) Loading Loading
common/hotkeys_basic.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -689,7 +689,7 @@ void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( struct EDA_HOTKEY_CONFIG* aDesc mask, mask, this, this, wxFD_OPEN, wxFD_OPEN, TRUE ); true ); if( filename.IsEmpty() ) if( filename.IsEmpty() ) return; return; Loading @@ -710,14 +710,14 @@ void EDA_BASE_FRAME::ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescLi wxString path = wxGetCwd(); wxString path = wxGetCwd(); wxString filename; wxString filename; filename = EDA_FileSelector( _( "Read Hotkey Configuration File:" ), filename = EDA_FileSelector( _( "Write Hotkey Configuration File:" ), path, path, filename, filename, ext, ext, mask, mask, this, this, wxFD_OPEN, wxFD_OPEN | wxFD_SAVE, TRUE ); true ); if( filename.IsEmpty() ) if( filename.IsEmpty() ) return; return; Loading
pcbnew/CMakeLists.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -132,7 +132,7 @@ set(PCBNEW_SRCS magnetic_tracks_functions.cpp magnetic_tracks_functions.cpp menubar_modedit.cpp menubar_modedit.cpp menubar_pcbframe.cpp menubar_pcbframe.cpp minumun_spanning_tree.cpp minimun_spanning_tree.cpp mirepcb.cpp mirepcb.cpp modedit.cpp modedit.cpp modedit_onclick.cpp modedit_onclick.cpp Loading
pcbnew/minumun_spanning_tree.cpp→pcbnew/minimun_spanning_tree.cpp +2 −2 Original line number Original line Diff line number Diff line /** /** * @file minumun_spanning_tree.cpp * @file minimun_spanning_tree.cpp */ */ /* /* Loading Loading @@ -31,7 +31,7 @@ #include <limits.h> #include <limits.h> #include "minumun_spanning_tree.h" #include "minimun_spanning_tree.h" #include "class_pad.h" #include "class_pad.h" /* /* Loading
pcbnew/minumun_spanning_tree.h→pcbnew/minimun_spanning_tree.h +1 −1 Original line number Original line Diff line number Diff line /** /** * @file minumun_spanning_tree.h * @file minimun_spanning_tree.h */ */ #include <vector> #include <vector> Loading
pcbnew/ratsnest.cpp +123 −116 Original line number Original line Diff line number Diff line Loading @@ -17,12 +17,7 @@ #include "pcbnew.h" #include "pcbnew.h" #include "minumun_spanning_tree.h" #include "minimun_spanning_tree.h" static std::vector <D_PAD*> s_localPadBuffer; // for local ratsnest // calculations when moving a // footprint: buffer of pads to // consider /** /** * @brief class MIN_SPAN_TREE_PADS (derived from MIN_SPAN_TREE) specialize * @brief class MIN_SPAN_TREE_PADS (derived from MIN_SPAN_TREE) specialize Loading Loading @@ -190,8 +185,7 @@ static bool sortByNetcode( const D_PAD* const & ref, const D_PAD* const & item ) /** /** * Function to compute the full ratsnest * Function to compute the full ratsnest * In the functions tracks are not considered * This is the "basic" ratsnest depending only on pads. * This is only the "basic" ratsnest depending only on pads. * * * Create the sorted pad list (if necessary) * Create the sorted pad list (if necessary) * The active pads (i.e included in a net ) are called nodes * The active pads (i.e included in a net ) are called nodes Loading @@ -201,8 +195,7 @@ static bool sortByNetcode( const D_PAD* const & ref, const D_PAD* const & item ) * Update : * Update : * nb_nodes = Active pads count for the board * nb_nodes = Active pads count for the board * nb_links = link count for the board (logical connection count) * nb_links = link count for the board (logical connection count) * (there are n-1 links for a connection which have n active pads) . * (there are n-1 links in a net which counting n active pads) . * */ */ void PCB_BASE_FRAME::Build_Board_Ratsnest() void PCB_BASE_FRAME::Build_Board_Ratsnest() { { Loading Loading @@ -265,10 +258,10 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest() /** /** * function Displays the general ratsnest * function DrawGeneralRatsnest * Only ratsnest with the status bit CH_VISIBLE is set are displayed * Only ratsnest items with the status bit CH_VISIBLE set are displayed * @param aDC = the current device context (can be NULL) * @param aDC = the current device context (can be NULL) * @param aNetcode if > 0, Display only the ratsnest relative to the * @param aNetcode: if > 0, Display only the ratsnest relative to the * corresponding net_code * corresponding net_code */ */ void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) Loading @@ -282,7 +275,7 @@ void PCB_BASE_FRAME::DrawGeneralRatsnest( wxDC* aDC, int aNetcode ) if( aDC == NULL ) if( aDC == NULL ) return; return; int state = CH_VISIBLE | CH_ACTIF; const int state = CH_VISIBLE | CH_ACTIF; for( unsigned ii = 0; ii < m_Pcb->GetRatsnestsCount(); ii++ ) for( unsigned ii = 0; ii < m_Pcb->GetRatsnestsCount(); ii++ ) { { Loading Loading @@ -363,12 +356,10 @@ static int tst_rats_block_to_block( NETINFO_ITEM* net, /** /** * Function used by TestRatsNest_general * Function used by TestRatsNest_general * The general ratsnest list must exists * The general ratsnest list must exists because this function explore this ratsnest * Activates the ratsnest between 2 pads ( assumes the same net ) * Activates (set the CH_ACTIF flag) the ratsnest links between 2 pads when needed * The function links 1 pad not already connected an other pad and activate * The function links 1 pad not already connected to an other pad (SubRatsnest = 0) * some blocks linked by a ratsnest * and active the correspondint link * It tests only the existing ratsnest and activate some ratsnest (status bit * CH_ACTIF set) * * * @param start_rat_list = starting address for the ratsnest list * @param start_rat_list = starting address for the ratsnest list * @param end_rat_list = ending address for the ratsnest list * @param end_rat_list = ending address for the ratsnest list Loading Loading @@ -419,7 +410,23 @@ static int tst_rats_pad_to_pad( int current_num_block, return current_num_block; return current_num_block; } } /* function TestRatsNest * determine the active links inside the full ratsnest * * I used an derived from the "lee algorithm". * The algorithm explore the existing full ratnest * This is a 2 steps algorithm (executed for each net). * - First: * Initialise for each pad the subratsnest id to its subnet value * explore the full ratnest (relative to the net) and active a link each time at least one pad of * the given link is not connected to an other pad by a track ( subratsnest = 0) * If the 2 pads linked have both the subratsnest id = 0, a new subratsnest value is created * - Second: * explore the full ratnest (relative to the net) and find a link that links * 2 pads having different subratsnest values * Active the link and merge the 2 subratsnest value. * */ void PCB_BASE_FRAME::TestRatsNest( wxDC* aDC, int aNetCode ) void PCB_BASE_FRAME::TestRatsNest( wxDC* aDC, int aNetCode ) { { RATSNEST_ITEM* rats; RATSNEST_ITEM* rats; Loading Loading @@ -492,6 +499,11 @@ int PCB_BASE_FRAME::TestOneRatsNest( wxDC* aDC, int aNetCode ) void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) { { // for local ratsnest calculation when moving a footprint: // list of pads to use for this local ratsnets: // this is the list of connected pads of the current module, // and all pads connected to these pads: static std::vector <D_PAD*> localPadList; static unsigned pads_module_count; // node count (node = pad with a net static unsigned pads_module_count; // node count (node = pad with a net // code) for the footprint being moved // code) for the footprint being moved static unsigned internalRatsCount; // number of internal links (links static unsigned internalRatsCount; // number of internal links (links Loading @@ -514,38 +526,38 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) * footprints which are "connected" to * footprints which are "connected" to * a pad in the current footprint * a pad in the current footprint */ */ if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) != 0 ) if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) == 0 ) goto CalculateExternalRatsnest; { /* Compute the "internal" ratsnest, i.e the links between the current /* Compute the "internal" ratsnest, i.e the links between the current * footprint pads * footprint pads */ */ s_localPadBuffer.clear(); localPadList.clear(); m_Pcb->m_LocalRatsnest.clear(); m_Pcb->m_LocalRatsnest.clear(); // collect active pads of the module: for( pad_ref = aModule->m_Pads; pad_ref != NULL; pad_ref = pad_ref->Next() ) for( pad_ref = aModule->m_Pads; pad_ref != NULL; pad_ref = pad_ref->Next() ) { { if( pad_ref->GetNet() == 0 ) if( pad_ref->GetNet() == 0 ) continue; continue; s_localPadBuffer.push_back( pad_ref ); localPadList.push_back( pad_ref ); pad_ref->SetSubRatsnest( 0 ); pad_ref->SetSubRatsnest( 0 ); pad_ref->SetSubNet( 0 ); pad_ref->SetSubNet( 0 ); } } pads_module_count = s_localPadBuffer.size(); pads_module_count = localPadList.size(); if( pads_module_count == 0 ) if( pads_module_count == 0 ) return; /* no connection! */ return; /* no connection! */ sort( s_localPadBuffer.begin(), s_localPadBuffer.end(), sortByNetcode ); sort( localPadList.begin(), localPadList.end(), sortByNetcode ); /* Build the list of pads linked to the current footprint pads */ /* Build the list of pads linked to the current footprint pads */ current_net_code = 0; current_net_code = 0; for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { pad_ref = s_localPadBuffer[ii]; pad_ref = localPadList[ii]; if( pad_ref->GetNet() == current_net_code ) if( pad_ref->GetNet() == current_net_code ) continue; continue; Loading @@ -569,12 +581,12 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) pad_externe->SetSubRatsnest( 0 ); pad_externe->SetSubRatsnest( 0 ); pad_externe->SetSubNet( 0 ); pad_externe->SetSubNet( 0 ); s_localPadBuffer.push_back( pad_externe ); localPadList.push_back( pad_externe ); } } } } /* Sort the pad list by net_code */ /* Sort the pad list by net_code */ sort( s_localPadBuffer.begin() + pads_module_count, s_localPadBuffer.end(), sort( localPadList.begin() + pads_module_count, localPadList.end(), sortByNetcode ); sortByNetcode ); /* Compute the internal rats nest: /* Compute the internal rats nest: Loading @@ -582,11 +594,10 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) * footprint pads it is therefore not time consuming, and it is made only * footprint pads it is therefore not time consuming, and it is made only * once * once */ */ current_net_code = s_localPadBuffer[0]->GetNet(); current_net_code = localPadList[0]->GetNet(); { MIN_SPAN_TREE_PADS min_spanning_tree; MIN_SPAN_TREE_PADS min_spanning_tree; std::vector<D_PAD*> padsBuffer; std::vector<D_PAD*> padsBuffer; // contains pads of only one net for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { /* Search the end of pad list relative to the current net */ /* Search the end of pad list relative to the current net */ Loading @@ -597,38 +608,33 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) if( jj >= pads_module_count ) if( jj >= pads_module_count ) break; break; if( s_localPadBuffer[jj]->GetNet() != current_net_code ) if( localPadList[jj]->GetNet() != current_net_code ) break; break; } } for(unsigned kk = ii; kk < jj; kk++ ) for(unsigned kk = ii; kk < jj; kk++ ) padsBuffer.push_back( s_localPadBuffer[kk] ); padsBuffer.push_back( localPadList[kk] ); min_spanning_tree.MSP_Init( &padsBuffer ); min_spanning_tree.MSP_Init( &padsBuffer ); min_spanning_tree.BuildTree(); min_spanning_tree.BuildTree(); min_spanning_tree.AddItemsToRatsnest( m_Pcb->m_LocalRatsnest ); min_spanning_tree.AddItemsToRatsnest( m_Pcb->m_LocalRatsnest ); padsBuffer.clear(); padsBuffer.clear(); ii = jj; ii = jj; if( ii < s_localPadBuffer.size() ) if( ii < localPadList.size() ) current_net_code = s_localPadBuffer[ii]->GetNet(); current_net_code = localPadList[ii]->GetNet(); } } } internalRatsCount = m_Pcb->m_LocalRatsnest.size(); internalRatsCount = m_Pcb->m_LocalRatsnest.size(); /* set the ratsnest status, flag LOCAL_RATSNEST_ITEM */ // set the flag LOCAL_RATSNEST_ITEM of the ratsnest status: for( unsigned ii = 0; ii < m_Pcb->m_LocalRatsnest.size(); ii++ ) for( unsigned ii = 0; ii < m_Pcb->m_LocalRatsnest.size(); ii++ ) { m_Pcb->m_LocalRatsnest[ii].m_Status = LOCAL_RATSNEST_ITEM; m_Pcb->m_LocalRatsnest[ii].m_Status = LOCAL_RATSNEST_ITEM; } m_Pcb->m_Status_Pcb |= RATSNEST_ITEM_LOCAL_OK; m_Pcb->m_Status_Pcb |= RATSNEST_ITEM_LOCAL_OK; } // End of internal ratsnest build /* This section computes the "external" ratsnest: must be done when the /* This section computes the "external" ratsnest: it is done when the * footprint position changes * footprint position changes */ * CalculateExternalRatsnest: * This section search: /* This section search: * for each current module pad the nearest neighbor external pad (of * for each current module pad the nearest neighbor external pad (of * course for the same net code). * course for the same net code). * For each current footprint cluster of pad (pads having the same net * For each current footprint cluster of pad (pads having the same net Loading @@ -637,19 +643,20 @@ CalculateExternalRatsnest: * so, for each net, only one rats nest item is created * so, for each net, only one rats nest item is created */ */ RATSNEST_ITEM local_rats; RATSNEST_ITEM local_rats; local_rats.m_Lenght = 0x7FFFFFFF; local_rats.m_Lenght = INT_MAX; local_rats.m_Status = 0; local_rats.m_Status = 0; bool addRats = false; bool addRats = false; // Erase external ratsnest items: if( internalRatsCount < m_Pcb->m_LocalRatsnest.size() ) if( internalRatsCount < m_Pcb->m_LocalRatsnest.size() ) m_Pcb->m_LocalRatsnest.erase( m_Pcb->m_LocalRatsnest.begin() + internalRatsCount, m_Pcb->m_LocalRatsnest.erase( m_Pcb->m_LocalRatsnest.begin() + internalRatsCount, m_Pcb->m_LocalRatsnest.end() ); m_Pcb->m_LocalRatsnest.end() ); current_net_code = s_localPadBuffer[0]->GetNet(); current_net_code = localPadList[0]->GetNet(); for( unsigned ii = 0; ii < pads_module_count; ii++ ) for( unsigned ii = 0; ii < pads_module_count; ii++ ) { { pad_ref = s_localPadBuffer[ii]; pad_ref = localPadList[ii]; if( pad_ref->GetNet() != current_net_code ) if( pad_ref->GetNet() != current_net_code ) { { Loading @@ -661,15 +668,15 @@ CalculateExternalRatsnest: addRats = false; addRats = false; current_net_code = pad_ref->GetNet(); current_net_code = pad_ref->GetNet(); local_rats.m_Lenght = 0x7FFFFFFF; local_rats.m_Lenght = INT_MAX; } } pad_pos = pad_ref->m_Pos - g_Offset_Module; pad_pos = pad_ref->m_Pos - g_Offset_Module; // Search the nearest external pad of this current pad // Search the nearest external pad of this current pad for( unsigned jj = pads_module_count; jj < s_localPadBuffer.size(); jj++ ) for( unsigned jj = pads_module_count; jj < localPadList.size(); jj++ ) { { pad_externe = s_localPadBuffer[jj]; pad_externe = localPadList[jj]; /* we search pads having the same net code */ /* we search pads having the same net code */ if( pad_externe->GetNet() < pad_ref->GetNet() ) if( pad_externe->GetNet() < pad_ref->GetNet() ) Loading