Commit e073bdc0 authored by charras's avatar charras

Pcbnew: cleaned code in ratsnet calculations (work in progress). The new code is also faster.

parent 8d604456
......@@ -50,8 +50,7 @@
* Gavin Bell
*/
#include <math.h>
#include "fctsys.h" // used only to define GLfloat
#include "3d_viewer.h" // used only to define GLfloat
#include "wx/glcanvas.h" // used only to define GLfloat
#include "trackball.h"
/*
......
......@@ -4,6 +4,18 @@ KiCad ChangeLog 2009
Please add newer entries at the top, list the date and your name with
email address.
2009-may-24 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++Pcbnew:
clean code in ratsnet calculations (work in progress)
The old code was very difficukt to understand, and was sometime very ugly.
Mainly, the list of nets (RATSNEST_ITEM class, formerly EQUIPOT class)
are now handled in a std::vector, and not a linked list.
This is better, because nets identifiers for pads and tracks are a number called netcode.
now, this is the index of the given net in this list, and the code to find a net given by its netcode
is very fast.
2009-may-12 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++All:
......
......@@ -57,6 +57,7 @@ set(PCB_COMMON_SRCS
../pcbnew/class_drc_item.cpp
../pcbnew/class_edge_mod.cpp
../pcbnew/class_equipot.cpp
../pcbnew/class_netinfolist.cpp
../pcbnew/class_marker.cpp
../pcbnew/class_mire.cpp
../pcbnew/class_module.cpp
......
......@@ -26,7 +26,6 @@ enum KICAD_T {
TYPE_PCB,
// Items in pcb
TYPE_EQUIPOT,
TYPE_MODULE,
TYPE_PAD,
TYPE_DRAWSEGMENT,
......
......@@ -123,9 +123,9 @@
#define EXTERNAL_LAYERS 0x00008001
/* Forward declaration */
class EQUIPOT;
class NETINFO_ITEM;
class MARKER;
class CHEVELU;
class RATSNEST_ITEM;
//class Ki_PageDescr;
//class DrawBlockStruct;
......
......@@ -286,8 +286,6 @@ public:
void Build_Board_Ratsnest( wxDC* DC );
void DrawGeneralRatsnest( wxDC* DC, int net_code = 0 );
void trace_ratsnest_pad( wxDC* DC );
void recalcule_pad_net_code(); /* compute and update the PAD net codes */
void build_liste_pads();
int* build_ratsnest_pad( EDA_BaseStruct* ref,
const wxPoint& refpos,
bool init );
......@@ -295,7 +293,7 @@ public:
void Tst_Ratsnest( wxDC* DC, int ref_netcode );
void test_connexions( wxDC* DC );
void test_1_net_connexion( wxDC* DC, int net_code );
void reattribution_reference_piste( int affiche );
void RecalculateAllTracksNetcode( );
// Plotting
void ToPlotter( wxCommandEvent& event );
......
......@@ -59,8 +59,8 @@ void ReSetQueue( int, int, int, int, int, int, int );
/* WORK.CPP */
void InitWork();
void ReInitWork();
int SetWork( int, int, int , int, int, CHEVELU *, int );
void GetWork( int *, int *, int *, int *, int *, CHEVELU ** );
int SetWork( int, int, int , int, int, RATSNEST_ITEM *, int );
void GetWork( int *, int *, int *, int *, int *, RATSNEST_ITEM ** );
void SortWork(); /* order the work items; shortest first */
/* DIST.CPP */
......@@ -69,7 +69,7 @@ int CalcDist( int, int, int ,int );
/* BOARD.CPP */
bool ComputeMatriceSize(WinEDA_BasePcbFrame * frame, int pas_route);
int Build_Work(BOARD * Pcb, CHEVELU* pt_chevelus);
int Build_Work(BOARD * Pcb, RATSNEST_ITEM* pt_chevelus);
void PlaceCells(BOARD * Pcb, int net_code, int flag = 0);
BoardCell GetCell( int, int, int );
......
......@@ -62,7 +62,7 @@ static void TracePenaliteRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, i
static MODULE* PickModule( WinEDA_PcbFrame* pcbframe, wxDC* DC );
/* variables importees */
extern CHEVELU* local_liste_chevelu; // adresse de base du buffer des chevelus locaux
extern RATSNEST_ITEM* local_liste_chevelu; // adresse de base du buffer des chevelus locaux
extern int nb_local_chevelu; // nbr de links du module en deplacement
......@@ -315,7 +315,7 @@ end_of_tst:
/* Recalcul de la liste des pads, detruite par les calculs precedents */
GetBoard()->m_Status_Pcb = 0;
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
DrawPanel->ReDraw( DC, TRUE );
......@@ -607,7 +607,7 @@ int WinEDA_PcbFrame::RecherchePlacementModule( MODULE* Module, wxDC* DC )
g_Offset_Module.x = cx - CurrPosition.x;
g_Offset_Module.y = cy - CurrPosition.y;
GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
/* tst des pastilles traversantes, qui pour un circuit imprime ayant des
* composants des 2 cotes, peuvent tomber sur un composant de cote oppose:
......@@ -710,7 +710,7 @@ int WinEDA_PcbFrame::RecherchePlacementModule( MODULE* Module, wxDC* DC )
Module->m_RealBoundaryBox.m_Pos.y = oy + cy;
CurrPosition = LastPosOK;
GetBoard()->m_Status_Pcb &= ~(CHEVELU_LOCAL_OK | LISTE_PAD_OK );
GetBoard()->m_Status_Pcb &= ~(RATSNEST_ITEM_LOCAL_OK | LISTE_PAD_OK );
MinCout = mincout;
return error;
......@@ -866,14 +866,14 @@ float WinEDA_PcbFrame::Compute_Ratsnest_PlaceModule( wxDC* DC )
* penalite pour les inclinaisons se rapprochant de 45 degre
*/
{
CHEVELU* pt_local_chevelu;
RATSNEST_ITEM* pt_local_chevelu;
int ii;
float cout, icout;
int ox, oy;
int fx, fy;
int dx, dy;
if( (GetBoard()->m_Status_Pcb & CHEVELU_LOCAL_OK) == 0 )
if( (GetBoard()->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) == 0 )
return -1;
pt_local_chevelu = local_liste_chevelu;
......@@ -882,12 +882,12 @@ float WinEDA_PcbFrame::Compute_Ratsnest_PlaceModule( wxDC* DC )
while( ii-- > 0 )
{
if( !(pt_local_chevelu->status & LOCAL_CHEVELU) )
if( !(pt_local_chevelu->m_Status & LOCAL_RATSNEST_ITEM) )
{
ox = pt_local_chevelu->pad_start->GetPosition().x - g_Offset_Module.x;
oy = pt_local_chevelu->pad_start->GetPosition().y - g_Offset_Module.y;
fx = pt_local_chevelu->pad_end->GetPosition().x;
fy = pt_local_chevelu->pad_end->GetPosition().y;
ox = pt_local_chevelu->m_PadStart->GetPosition().x - g_Offset_Module.x;
oy = pt_local_chevelu->m_PadStart->GetPosition().y - g_Offset_Module.y;
fx = pt_local_chevelu->m_PadEnd->GetPosition().x;
fy = pt_local_chevelu->m_PadEnd->GetPosition().y;
if( AutoPlaceShowAll )
{
......@@ -962,7 +962,7 @@ void Build_PlacedPads_List( BOARD* aPcb )
}
aPcb->m_Status_Pcb |= LISTE_PAD_OK;
aPcb->m_Status_Pcb &= ~(LISTE_CHEVELU_OK | CHEVELU_LOCAL_OK);
aPcb->m_Status_Pcb &= ~(LISTE_RATSNEST_ITEM_OK | RATSNEST_ITEM_LOCAL_OK);
}
......@@ -1102,7 +1102,7 @@ static MODULE* PickModule( WinEDA_PcbFrame* pcbframe, wxDC* DC )
{
MODULE** BaseListeModules, ** pt_Dmod;
MODULE* Module = NULL, * AltModule = NULL;
CHEVELU* pt_local_chevelu;
RATSNEST_ITEM* pt_local_chevelu;
int NbModules, ii;
BaseListeModules = GenListeModules( pcbframe->GetBoard(), &NbModules );
......@@ -1122,7 +1122,7 @@ static MODULE* PickModule( WinEDA_PcbFrame* pcbframe, wxDC* DC )
(*pt_Dmod)->flag = 0;
if( !( (*pt_Dmod)->m_ModuleStatus & MODULE_to_PLACE ) )
continue;
pcbframe->GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
pcbframe->GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
(*pt_Dmod)->DisplayInfo( pcbframe );
pcbframe->build_ratsnest_module( DC, *pt_Dmod );
......@@ -1131,13 +1131,13 @@ static MODULE* PickModule( WinEDA_PcbFrame* pcbframe, wxDC* DC )
ii = nb_local_chevelu;
while( ii-- > 0 )
{
if( (pt_local_chevelu->status & LOCAL_CHEVELU) == 0 )
if( (pt_local_chevelu->m_Status & LOCAL_RATSNEST_ITEM) == 0 )
(*pt_Dmod)->flag++;
pt_local_chevelu++;
}
}
pcbframe->GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
pcbframe->GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
qsort( BaseListeModules, NbModules, sizeof(MODULE * *),
( int (*)( const void*, const void* ) )Tri_RatsModules );
......
......@@ -34,7 +34,7 @@ void WinEDA_PcbFrame::Autoroute( wxDC* DC, int mode )
/* init board, route traces*/
{
int ii, start, stop;
CHEVELU* ptmp;
RATSNEST_ITEM* ptmp;
MODULE* Module = NULL;
D_PAD* Pad = NULL;
int autoroute_net_code = -1;
......@@ -90,23 +90,23 @@ void WinEDA_PcbFrame::Autoroute( wxDC* DC, int mode )
break;
}
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK ) == 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK ) == 0 )
Compile_Ratsnest( DC, TRUE );
/* Placement du flag CH_ROUTE_REQ sur les chevelus demandes */
ptmp = (CHEVELU*) GetBoard()->m_Ratsnest;
ptmp = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; ii--, ptmp++ )
{
ptmp->status &= ~CH_ROUTE_REQ;
ptmp->m_Status &= ~CH_ROUTE_REQ;
switch( mode )
{
case ROUTE_ALL:
ptmp->status |= CH_ROUTE_REQ; break;
ptmp->m_Status |= CH_ROUTE_REQ; break;
case ROUTE_NET:
if( autoroute_net_code == ptmp->GetNet() )
ptmp->status |= CH_ROUTE_REQ;
ptmp->m_Status |= CH_ROUTE_REQ;
break;
case ROUTE_MODULE:
......@@ -114,23 +114,23 @@ void WinEDA_PcbFrame::Autoroute( wxDC* DC, int mode )
D_PAD* pt_pad = (D_PAD*) Module->m_Pads;
for( ; pt_pad != NULL; pt_pad = pt_pad->Next() )
{
if( ptmp->pad_start == pt_pad )
ptmp->status |= CH_ROUTE_REQ;
if( ptmp->pad_end == pt_pad )
ptmp->status |= CH_ROUTE_REQ;
if( ptmp->m_PadStart == pt_pad )
ptmp->m_Status |= CH_ROUTE_REQ;
if( ptmp->m_PadEnd == pt_pad )
ptmp->m_Status |= CH_ROUTE_REQ;
}
break;
}
case ROUTE_PAD:
if( (ptmp->pad_start == Pad) || (ptmp->pad_end == Pad) )
ptmp->status |= CH_ROUTE_REQ;
if( (ptmp->m_PadStart == Pad) || (ptmp->m_PadEnd == Pad) )
ptmp->m_Status |= CH_ROUTE_REQ;
break;
}
}
ptmp = (CHEVELU*) GetBoard()->m_Ratsnest;
ptmp = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
start = time( NULL );
......@@ -191,18 +191,18 @@ void WinEDA_PcbFrame::Reset_Noroutable( wxDC* DC )
*/
{
int ii;
CHEVELU* pt_rats;
RATSNEST_ITEM* pt_rats;
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK )== 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK )== 0 )
Compile_Ratsnest( DC, TRUE );
pt_rats = (CHEVELU*) GetBoard()->m_Ratsnest;
pt_rats = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
if( pt_rats == NULL )
return;
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; ii--, pt_rats++ )
{
pt_rats->status &= ~CH_UNROUTABLE;
pt_rats->m_Status &= ~CH_UNROUTABLE;
}
}
......
/****************************************************/
/* AUTOROUT.H */
/* d‚clarations communes relative au routage, DRC */
/* declarations communes relative au routage */
/* et placement automatique des composants */
/****************************************************/
......@@ -14,74 +14,9 @@
#define ILLEGAL -1
/*****************************************************/
/* Structures de representation des pads et chevelus */
/* pour etablissement du chevelu general complet */
/*****************************************************/
/***********************************************/
/* description d'un segment de chevelu general */
/***********************************************/
/****************************/
/* bits d'etat du chevelu : */
/****************************/
#define CH_VISIBLE 1 /* affichage permanent demande */
#define CH_UNROUTABLE 2 /* non route par l'autorouteur */
#define CH_ROUTE_REQ 4 /* doit etre route par l'autorouteur */
#define CH_ACTIF 8 /* chevelu non encore routé */
#define LOCAL_CHEVELU 0x8000 /* indique un chevelu reliant 2 pins d'un meme
* module pour le calcul des chevelus relatifs a 1 seul module */
class CHEVELU
{
private:
int m_NetCode; // numero de code du net ( = 0.. n , avec 0 si non connecte)
public:
int status; // etat: voir defines précédents (CH_ ...)
D_PAD* pad_start; // pointeur sur le pad de depart
D_PAD* pad_end; // pointeur sur le pad de fin
int dist; // longeur du chevelu
/**
* Function GetNet
* @return int - the net code.
*/
int GetNet() const
{
return m_NetCode;
}
void SetNet( int aNetCode )
{
m_NetCode = aNetCode;
}
};
/****************************************************************/
/* description d'un point de piste pour le suivi des connexions */
/****************************************************************/
#define START_ON_PAD 0x10
#define END_ON_PAD 0x20
#define START_ON_TRACK 0x40
#define END_ON_TRACK 0x80
//#define START_EQU_VIA 0x10
//#define END_EQU_VIA 0x20
/* Status bit (OR'ed bits) for class BOARD member .m_Status_Pcb */
enum StatusPcbFlags {
LISTE_PAD_OK = 1, /* Pad list is Ok */
LISTE_CHEVELU_OK = 2, /* General Rastnest is Ok */
CHEVELU_LOCAL_OK = 4, /* current MODULE rastnest is Ok */
CONNEXION_OK = 8, /* Bit indicant que la liste des connexions existe */
NET_CODES_OK = 0x10, /* Bit indicant que les netcodes sont OK ( pas de modif
* de noms de net */
DO_NOT_SHOW_GENERAL_RASTNEST = 0x20 /* Do not display the general rastnest (used in module moves) */
};
/* Commandes d'autoplacement / autorouage possibles */
enum CommandOpt {
......
......@@ -578,7 +578,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
else
{
m_Pcb->m_Status_Pcb = 0; /* we need (later) a full ratnest computation */
build_liste_pads();
m_Pcb->Build_Pads_Full_List();
}
}
......
/************************************************/
/* EDITEUR de PCB: AUTOROUTAGE: routines d'init */
/************************************************/
/* Fichier BOARD.CC */
/* Fichier BOARD.CPP : functions for autorouting */
#include "fctsys.h"
#include "gr_basic.h"
......@@ -18,7 +14,7 @@
/* routines externes : */
/* Routines definies ici: */
int Build_Work( BOARD* Pcb, CHEVELU* pt_base_chevelu );
int Build_Work( BOARD* Pcb, RATSNEST_ITEM* pt_base_chevelu );
void PlaceCells( BOARD* Pcb, int net_code, int flag );
int InitBoard();
BoardCell GetCell( int, int, int );
......@@ -340,15 +336,15 @@ void PlaceCells( BOARD* aPcb, int net_code, int flag )
/******************************************************/
int Build_Work( BOARD* Pcb, CHEVELU* pt_base_chevelu )
int Build_Work( BOARD* Pcb, RATSNEST_ITEM* pt_base_chevelu )
/*****************************************************/
/* Build liste conn */
{
int ii;
CHEVELU* pt_rats = pt_base_chevelu;
RATSNEST_ITEM* pt_rats = pt_base_chevelu;
D_PAD* pt_pad;
int r1, r2, c1, c2, current_net_code;
CHEVELU* pt_ch;
RATSNEST_ITEM* pt_ch;
int demi_pas = g_GridRoutingSize / 2;
wxString msg;
......@@ -357,13 +353,13 @@ int Build_Work( BOARD* Pcb, CHEVELU* pt_base_chevelu )
for( ii = Pcb->GetNumRatsnests(); ii > 0; ii--, pt_rats++ )
{
/* On ne route que les chevelus actifs et routables */
if( (pt_rats->status & CH_ACTIF) == 0 )
if( (pt_rats->m_Status & CH_ACTIF) == 0 )
continue;
if( pt_rats->status & CH_UNROUTABLE )
if( pt_rats->m_Status & CH_UNROUTABLE )
continue;
if( (pt_rats->status & CH_ROUTE_REQ) == 0 )
if( (pt_rats->m_Status & CH_ROUTE_REQ) == 0 )
continue;
pt_pad = pt_rats->pad_start;
pt_pad = pt_rats->m_PadStart;
current_net_code = pt_pad->GetNet();
pt_ch = pt_rats;
......@@ -385,7 +381,7 @@ int Build_Work( BOARD* Pcb, CHEVELU* pt_base_chevelu )
return 0;
}
pt_pad = pt_rats->pad_end;
pt_pad = pt_rats->m_PadEnd;
r2 = (pt_pad->GetPosition().y - Pcb->m_BoundaryBox.m_Pos.y + demi_pas ) / g_GridRoutingSize;
if( r2 < 0 || r2 >= Nrows )
......
......@@ -33,7 +33,8 @@ BOARD::BOARD( EDA_BaseStruct* parent, WinEDA_BasePcbFrame* frame ) :
m_Ratsnest = NULL; // pointeur liste rats
m_LocalRatsnest = NULL; // pointeur liste rats local
m_CurrentZoneContour = NULL; // This ZONE_CONTAINER handle the zone contour cuurently in progress
// de determination des contours de zone
m_NetInfo = new NETINFO_LIST( this) ; // handle nets info list (name, design constraints ..
for( int layer=0; layer<NB_COPPER_LAYERS; ++layer )
{
......@@ -65,6 +66,8 @@ BOARD::~BOARD()
delete m_CurrentZoneContour;
m_CurrentZoneContour = NULL;
delete m_NetInfo;
}
......@@ -239,14 +242,6 @@ void BOARD::Add( BOARD_ITEM* aBoardItem, int aControl )
aBoardItem->SetParent( this );
break;
case TYPE_EQUIPOT:
if( aControl & ADD_APPEND )
m_Equipots.PushBack( (EQUIPOT*) aBoardItem );
else
m_Equipots.PushFront( (EQUIPOT*) aBoardItem );
aBoardItem->SetParent( this );
break;
// other types may use linked list
default:
wxFAIL_MSG( wxT("BOARD::Add() needs work: BOARD_ITEM type not handled") );
......@@ -306,10 +301,6 @@ BOARD_ITEM* BOARD::Remove( BOARD_ITEM* aBoardItem )
m_Drawings.Remove( aBoardItem );
break;
case TYPE_EQUIPOT:
m_Equipots.Remove( (EQUIPOT*) aBoardItem );
break;
// other types may use linked list
default:
wxFAIL_MSG( wxT("BOARD::Remove() needs more ::Type() support") );
......@@ -534,7 +525,7 @@ void BOARD::DisplayInfo( WinEDA_DrawFrame* frame )
txt.Printf( wxT( "%d" ), m_NbLinks );
Affiche_1_Parametre( frame, POS_AFF_NBLINKS, _( "Links" ), txt, DARKGREEN );
txt.Printf( wxT( "%d" ), m_Equipots.GetCount() );
txt.Printf( wxT( "%d" ), m_NetInfo->GetCount() );
Affiche_1_Parametre( frame, POS_AFF_NBNETS, _( "Nets" ), txt, RED );
txt.Printf( wxT( "%d" ), m_NbLinks - GetNumNoconnect() );
......@@ -683,11 +674,6 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
++p;
break;
case TYPE_EQUIPOT:
result = IterateForward( m_Equipots, inspector, testData, p );
++p;
break;
case TYPE_ZONE:
result = IterateForward( m_Zone, inspector, testData, p );
++p;
......@@ -794,18 +780,12 @@ BOARD_ITEM* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
* @param anetcode The netcode to search for.
* @return EQUIPOT* - the net or NULL if not found.
*/
EQUIPOT* BOARD::FindNet( int anetcode ) const
NETINFO_ITEM* BOARD::FindNet( int anetcode ) const
{
// the first valid netcode is 1.
// zero is reserved for "no connection" and is not used.
if( anetcode > 0 )
{
for( EQUIPOT* net = m_Equipots; net; net=net->Next() )
{
if( net->GetNet() == anetcode )
return net;
}
}
return m_NetInfo->GetItem( anetcode );
return NULL;
}
......@@ -816,16 +796,16 @@ EQUIPOT* BOARD::FindNet( int anetcode ) const
* @param aNetname A Netname to search for.
* @return EQUIPOT* - the net or NULL if not found.
*/
EQUIPOT* BOARD::FindNet( const wxString & aNetname ) const
NETINFO_ITEM* BOARD::FindNet( const wxString & aNetname ) const
{
// the first valid netcode is 1.
// zero is reserved for "no connection" and is not used.
if( ! aNetname.IsEmpty() )
{
for( EQUIPOT* net = m_Equipots; net; net=net->Next() )
for(unsigned ii = 1; ii < m_NetInfo->GetCount(); ii++ )
{
if( net->GetNetname() == aNetname )
return net;
if( m_NetInfo->GetItem( ii )->GetNetname() == aNetname )
return m_NetInfo->GetItem( ii );
}
}
return NULL;
......@@ -865,81 +845,40 @@ MODULE* BOARD::FindModuleByReference( const wxString& aReference ) const
}
/* Two sort functions used in BOARD::ReturnSortedNetnamesList */
// Sort nets by name
int s_SortByNames(const void * ptr1, const void * ptr2)
{
EQUIPOT* item1 = * (EQUIPOT**) ptr1;
EQUIPOT* item2 = * (EQUIPOT**) ptr2;
return item1->GetNetname().CmpNoCase(item2->GetNetname());
}
// Sort nets by decreasing pad count
int s_SortByNodes(const void * ptr1, const void * ptr2)
static bool s_SortByNodes(const NETINFO_ITEM* a, const NETINFO_ITEM* b)
{
EQUIPOT* item1 = * (EQUIPOT**) ptr1;
EQUIPOT* item2 = * (EQUIPOT**) ptr2;
if ( (item1->m_NbNodes - item2->m_NbNodes) != 0 )
return - (item1->m_NbNodes - item2->m_NbNodes);
return item1->GetNetname().CmpNoCase(item2->GetNetname());
return a->GetNodesCount() < b->GetNodesCount();
}
/**
* Function ReturnSortedNetnamesList
* searches for a net with the given netcode.
* @param aNames An array string to fill with net names.
* @param aSort_Type : NO_SORT = no sort, ALPHA_SORT = sort by alphabetic order, PAD_CNT_SORT = sort by active pads count.
* @param aSortbyPadsCount : true = sort by active pads count, false = no sort (i.e. leave the sort by net names)
* @return int - net names count.
*/
int BOARD::ReturnSortedNetnamesList( wxArrayString & aNames, const int aSort_Type)
int BOARD::ReturnSortedNetnamesList( wxArrayString & aNames, bool aSortbyPadsCount)
{
int NetCount = 0;
int ii;
EQUIPOT* net;
/* count items to list and sort */
for( net = m_Equipots; net; net=net->Next() )
{
if ( net->GetNetname().IsEmpty() ) continue;
NetCount++;
}
if ( NetCount == 0 ) return 0;
if ( m_NetInfo->GetCount() == 0 ) return 0;
/* Build the list */
EQUIPOT* * net_ptr_list = (EQUIPOT* *) MyMalloc( NetCount * sizeof(* net_ptr_list) );
for( ii = 0, net = m_Equipots; net; net=net->Next() )
std::vector <NETINFO_ITEM*> netBuffer;
netBuffer.reserve(m_NetInfo->GetCount());
for( unsigned ii = 1; ii < m_NetInfo->GetCount(); ii++ )
{
if ( net->GetNetname().IsEmpty() ) continue;
net_ptr_list[ii] = net;
ii++;
if ( m_NetInfo->GetItem(ii)->GetNet() > 0 )
netBuffer.push_back(m_NetInfo->GetItem(ii));
}
/* sort the list */
switch ( aSort_Type )
{
case NO_SORT : break;
if ( aSortbyPadsCount )
sort (netBuffer.begin(), netBuffer.end(), s_SortByNodes);
case ALPHA_SORT :
qsort (net_ptr_list, NetCount, sizeof(EQUIPOT*), s_SortByNames);
break;
case PAD_CNT_SORT:
qsort (net_ptr_list, NetCount, sizeof(EQUIPOT*), s_SortByNodes);
break;
}
for( unsigned ii = 0; ii < netBuffer.size(); ii++ )
aNames.Add(netBuffer[ii]->GetNetname());
/* fill the given list */
for( ii = 0; ii < NetCount; ii++ )
{
net = net_ptr_list[ii];
aNames.Add(net->GetNetname());
}
MyFree(net_ptr_list);
return NetCount;
return netBuffer.size();
}
/************************************/
......@@ -950,8 +889,8 @@ bool BOARD::Save( FILE* aFile ) const
BOARD_ITEM* item;
// save the nets
for( item = m_Equipots; item; item=item->Next() )
if( !item->Save( aFile ) )
for( unsigned ii = 0; ii < m_NetInfo->GetCount(); ii++ )
if( !m_NetInfo->GetItem(ii)->Save( aFile ) )
goto out;
// save the modules
......@@ -1084,6 +1023,45 @@ ZONE_CONTAINER* BOARD::HitTestForAnyFilledArea( const wxPoint& aRefPos, int aSt
return NULL;
}
/**
* Function SetAreasNetCodesFromNetNames
* Set the .m_NetCode member of all copper areas, according to the area Net Name
* The SetNetCodesFromNetNames is an equivalent to net name, for fast comparisons.
* However the Netcode is an arbitrary equivalence, it must be set after each netlist read
* or net change
* Must be called after pad netcodes are calculated
* @return : error count
* For non copper areas, netcode is set to 0
*/
int BOARD::SetAreasNetCodesFromNetNames( void )
{
int error_count = 0;
for( int ii = 0; ii < GetAreaCount(); ii++ )
{
if ( ! GetArea( ii )->IsOnCopperLayer() )
{
GetArea( ii )->SetNet( 0 );
continue;
}
if ( GetArea( ii )->GetNet() != 0 ) // i.e. if this zone is connected to a net
{
const NETINFO_ITEM* net = FindNet( GetArea( ii )->m_Netname );
if( net )
{
GetArea( ii )->SetNet( net->GetNet() );
}
else
{
error_count++;
GetArea( ii )->SetNet( -1 ); //keep Net Name ane set m_NetCode to -1 : error flag
}
}
}
return error_count;
}
#if defined(DEBUG)
......@@ -1115,12 +1093,6 @@ void BOARD::Show( int nestLevel, std::ostream& os )
p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</pdrawings>\n";
NestedSpace( nestLevel+1, os ) << "<nets>\n";
p = m_Equipots;
for( ; p; p = p->Next() )
p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</nets>\n";
NestedSpace( nestLevel+1, os ) << "<tracks>\n";
p = m_Track;
for( ; p; p = p->Next() )
......
......@@ -7,6 +7,7 @@
#include "dlist.h"
#include "class_equipot.h"
class ZONE_CONTAINER;
......@@ -86,21 +87,19 @@ public:
EDA_BoardDesignSettings* m_BoardSettings; // Link to current design settings
int m_NbNodes; // Active pads (pads attached to a net ) count
int m_NbLinks; // Ratsnest count
int m_NbLoclinks; // Ratsests to show while creating a track
int m_NbNoconnect; // Active ratsnet count (rastnest not alraedy connected by tracks
int m_NbLoclinks; // Number of ratsnests from mouse cursor to pads to show while creating a track
int m_NbNoconnect; // Active ratsnet count (rastnests not alraedy connected by tracks)
DLIST<BOARD_ITEM> m_Drawings; // linked list of lines & texts
DLIST<MODULE> m_Modules; // linked list of MODULEs
DLIST<EQUIPOT> m_Equipots; // linked list of nets
DLIST<TRACK> m_Track; // linked list of TRACKs and SEGVIAs
DLIST<SEGZONE> m_Zone; // linked list of SEGZONEs
std::vector<D_PAD*> m_Pads; // Entry for a sorted pad list (used in ratsnest calculations)
NETINFO_LIST* m_NetInfo; // nets info list (name, design constraints ..
CHEVELU* m_Ratsnest; // Rastnest list
CHEVELU* m_LocalRatsnest; // Rastnest list used while moving a footprint
RATSNEST_ITEM* m_Ratsnest; // Rastnest list
RATSNEST_ITEM* m_LocalRatsnest; // Rastnest list used while moving a footprint
ZONE_CONTAINER* m_CurrentZoneContour; // zone contour currently in progress
......@@ -247,6 +246,17 @@ public:
int GetNumNodes(); // retourne le nombre de pads a netcode > 0
/** Function Build_Pads_Full_List
* Create the pad list
* initialise:
* m_Pads (list of pads)
* m_NbNodes = 0
* set m_Status_Pcb = LISTE_PAD_OK;
* and clear for all pads the m_SubRatsnest member;
* delete ( free memory) m_Pcb->m_Ratsnest and set m_Pcb->m_Ratsnest to NULL
*/
void Build_Pads_Full_List();
// Calcul du rectangle d'encadrement:
bool ComputeBoundaryBox();
......@@ -294,17 +304,17 @@ public:
* Function FindNet
* searches for a net with the given netcode.
* @param aNetcode A netcode to search for.
* @return EQUIPOT* - the net or NULL if not found.
* @return NETINFO_ITEM_ITEM* - the net or NULL if not found.
*/
EQUIPOT* FindNet( int aNetcode ) const;
NETINFO_ITEM* FindNet( int aNetcode ) const;
/**
* Function FindNet overlayed
* searches for a net with the given name.
* @param aNetname A Netname to search for.
* @return EQUIPOT* - the net or NULL if not found.
* @return NETINFO_ITEM* - the net or NULL if not found.
*/
EQUIPOT* FindNet( const wxString & aNetname ) const;
NETINFO_ITEM* FindNet( const wxString & aNetname ) const;
/**
* Function FindModuleByReference
......@@ -319,18 +329,11 @@ public:
/**
* Function ReturnSortedNetnamesList
* searches for a net with the given netcode.
* @param aNames An array string to fill with net names.
* @param aSort_Type : NO_SORT = no sort, ALPHA_SORT = sort by alphabetic order, PAD_CNT_SORT = sort by active pads count.
* @param aSortbyPadsCount : true = sort by active pads count, false = no sort (i.e. leave the sort by net names)
* @return int - net names count.
*/
enum netname_sort_type {
NO_SORT,
ALPHA_SORT,
PAD_CNT_SORT
};
int ReturnSortedNetnamesList( wxArrayString & aNames, const int aSort_Type);
int ReturnSortedNetnamesList( wxArrayString & aNames, bool aSortbyPadsCount);
/**
* Function Save
......
......@@ -47,17 +47,12 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
wxString text;
wxString msg;
wxString temp;
NETINFO_ITEM* net;
const BOARD_ITEM* item = this;
EQUIPOT* net;
D_PAD * pad;
switch( item->Type() )
{
case TYPE_EQUIPOT:
text << _( "Net" ) << ( (EQUIPOT*) item )->GetNetname() << wxT( " " ) <<
( (EQUIPOT*) item )->GetNet();
break;
case TYPE_MODULE:
text << _( "Footprint" ) << wxT( " " ) << ( (MODULE*) item )->GetReference();
text << wxT( " (" ) << aPcb->GetLayerName( item->m_Layer ).Trim() << wxT( ")" );
......@@ -258,10 +253,6 @@ const char** BOARD_ITEM::MenuIcon() const
switch( item->Type() )
{
case TYPE_EQUIPOT:
xpm = general_ratsnet_xpm;
break;
case TYPE_MODULE:
xpm = module_xpm;
break;
......
/*****************************************************************/
/* fonctions membres de la classe EQUIPOT et fonctions associ�s */
/*****************************************************************/
/*************************************************************************/
/* NETINFO_ITEM class, to handle info on nets (netnames, net constraints ...) */
/*************************************************************************/
#include "fctsys.h"
#include "wxstruct.h"
......@@ -10,44 +10,31 @@
/*********************************************************/
/* classe EQUIPOT: gestion des listes d'equipotentielles */
/* class NETINFO_ITEM: hand data relative to a given net */
/*********************************************************/
/* Constructeur de la classe EQUIPOT */
EQUIPOT::EQUIPOT( BOARD_ITEM* aParent ) :
BOARD_ITEM( aParent, TYPE_EQUIPOT )
/* Constructor */
NETINFO_ITEM::NETINFO_ITEM( BOARD_ITEM* aParent )
{
SetNet( 0 );
m_NbNodes = m_NbLink = m_NbNoconn = 0;
m_Masque_Layer = 0;
m_Masque_Plan = 0;
m_ForceWidth = 0;
m_PadzoneStart = NULL; // pointeur sur debut de liste pads du net
m_PadzoneEnd = NULL; // pointeur sur fin de liste pads du net
m_RatsnestStart = NULL; // pointeur sur debut de liste ratsnests du net
m_RatsnestEnd = NULL; // pointeur sur fin de liste ratsnests du net
}
/* destructeut */
/* destructot */
EQUIPOT::~EQUIPOT()
NETINFO_ITEM::~NETINFO_ITEM()
{
}
wxPoint& EQUIPOT::GetPosition()
{
static wxPoint dummy;
return dummy;
}
/*********************************************************/
int EQUIPOT:: ReadDescr( FILE* File, int* LineNum )
int NETINFO_ITEM:: ReadDescr( FILE* File, int* LineNum )
/*********************************************************/
/* Routine de lecture de 1 descr Equipotentielle.
* retourne 0 si OK
* 1 si lecture incomplete
......@@ -84,12 +71,12 @@ int EQUIPOT:: ReadDescr( FILE* File, int* LineNum )
/**************************************/
bool EQUIPOT::Save( FILE* aFile ) const
bool NETINFO_ITEM::Save( FILE* aFile ) const
/**************************************/
/** Note: the old name of class NETINFO_ITEM was EQUIPOT
* so in Save (and read) functions, for compatibility, we use EQUIPOT as keyword
*/
{
if( GetState( DELETED ) )
return true;
bool success = false;
fprintf( aFile, "$EQUIPOT\n" );
......@@ -112,17 +99,17 @@ out:
* Function SetNetname
* @param const wxString : the new netname
*/
void EQUIPOT::SetNetname( const wxString & aNetname )
void NETINFO_ITEM::SetNetname( const wxString & aNetname )
{
m_Netname = aNetname;
m_ShortNetname = m_Netname.AfterLast( '/' );
}
/** function Draw
/** function Draw (TODO)
* we actually could show a NET, simply show all the tracks and pads or net name on pad and vias
*/
void EQUIPOT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset )
void NETINFO_ITEM::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset )
{
}
......@@ -134,7 +121,7 @@ void EQUIPOT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPo
* Is virtual from EDA_BaseStruct.
* @param frame A WinEDA_DrawFrame in which to print status information.
*/
void EQUIPOT::DisplayInfo( WinEDA_DrawFrame* frame )
void NETINFO_ITEM::DisplayInfo( WinEDA_DrawFrame* frame )
{
int count;
EDA_BaseStruct* Struct;
......@@ -182,23 +169,3 @@ void EQUIPOT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPo
valeur_param( (int) lengthnet, txt );
Affiche_1_Parametre( frame, 60, _( "Net Length" ), txt, RED );
}
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void EQUIPOT::Show( int nestLevel, std::ostream& os )
{
// for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" name=\"" << m_Netname.mb_str() << '"' <<
" netcode=\"" << GetNet() << "\"/>\n";
}
#endif
/*************************************************/
/* classe EQUIPOT: Class to handle info on nets */
/*************************************************/
/************************/
/* file class_equipot.h */
/************************/
class EQUIPOT : public BOARD_ITEM
/*
* Classes to handle info on nets
*/
#ifndef __CLASSES_NETINFO__
#define __CLASSES_NETINFO__
// Forward declaration:
class NETINFO_ITEM;
/* Class RATSNEST_ITEM: describes a ratsnest line: a straight line connecting 2 pads */
class RATSNEST_ITEM
{
private:
int m_NetCode; // netcode ( = 1.. n , 0 is the value used for not connected items)
public:
int m_Status; // etat: voir defines prcdents (CH_ ...)
D_PAD* m_PadStart; // pointer to the starting pad
D_PAD* m_PadEnd; // pointer to ending pad
int m_Lenght; // lenght of the line
/**
* Function GetNet
* @return int - the net code.
*/
int GetNet() const
{
return m_NetCode;
}
void SetNet( int aNetCode )
{
m_NetCode = aNetCode;
}
/** function Draw
*/
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset );
};
/***************************************************************/
/******************* class NETINFO *****************************/
/***************************************************************/
class NETINFO_LIST
{
private:
BOARD* m_Parent;
// boost::ptr_vector<NETINFO_ITEM*> m_NetBuffer; // nets buffer list (name, design constraints ..
std::vector<NETINFO_ITEM*> m_NetBuffer; // nets buffer list (name, design constraints ..
public:
NETINFO_LIST( BOARD* aParent );
~NETINFO_LIST();
/** Function GetItem
* @param aNetcode = netcode to identify a given NETINFO_ITEM
* @return a NETINFO_ITEM pointer to the selected NETINFO_ITEM by its netcode, or NULL if not found
*/
NETINFO_ITEM* GetItem( int aNetcode );
/** Function GetCount()
* @return the number of nets ( always >= 1 )
* the first net is the "not connected" net
*/
unsigned GetCount() { return m_NetBuffer.size(); }
/**
* Function Append
* adds \a aNewElement to the end of the list.
*/
void Append( NETINFO_ITEM* aNewElement );
/** Function Clear
* delete the list of nets (and free memory)
*/
void Clear();
/** Function BuildListOfNets
* initialize the list of NETINFO_ITEM m_NetBuffer
* The list is sorted by names.
*/
void BuildListOfNets();
};
/** class NETINFO_ITEM
* @info This class handle the data relative to a given net
*/
class NETINFO_ITEM
{
private:
int m_NetCode; // this is a number equivalent to the net name
......@@ -12,32 +107,18 @@ private:
public:
int status; // no route, hight light...
int m_NbNodes; // Pads count for this net
int m_NbLink; // Ratsnets count for this net
int m_NbNoconn; // Ratsnets remaining to route count
int m_Masque_Layer; // couches interdites (bit 0 = layer 0...)
int m_Masque_Plan; // couches mises en plan de cuivre
int m_ForceWidth; // specific width (O = default width)
LISTE_PAD* m_PadzoneStart; // pointeur sur debut de liste pads du net
LISTE_PAD* m_PadzoneEnd; // pointeur sur fin de liste pads du net
CHEVELU* m_RatsnestStart; // pointeur sur debut de liste ratsnests du net
CHEVELU* m_RatsnestEnd; // pointeur sur fin de liste ratsnests du net
std::vector <D_PAD*> m_ListPad; // List of pads connected to this net
RATSNEST_ITEM* m_RatsnestStart; // pointeur sur debut de liste ratsnests du net
RATSNEST_ITEM* m_RatsnestEnd; // pointeur sur fin de liste ratsnests du net
std::vector <RATSNEST_ITEM*> m_ListRatsnest; // List of Ratsnests for this net
EQUIPOT( BOARD_ITEM* aParent );
~EQUIPOT();
NETINFO_ITEM( BOARD_ITEM* aParent );
~NETINFO_ITEM();
EQUIPOT* Next() const { return (EQUIPOT*) Pnext; }
EQUIPOT* Back() const { return (EQUIPOT*) Pback; }
/**
* Function GetPosition
* returns the position of this object.
* @return wxPoint& - The position of this object, non-const so it
* can be changed
* A dummy to satisfy pure virtual BOARD::GetPosition()
*/
wxPoint& GetPosition();
/* Readind and writing data on files */
int ReadDescr( FILE* File, int* LineNum );
......@@ -54,8 +135,7 @@ public:
/** function Draw
* @todo we actually could show a NET, simply show all the tracks and pads or net name on pad and vias
*/
void Draw( WinEDA_DrawPanel* panel, wxDC* DC,
int aDrawMode, const wxPoint& offset = ZeroOffset );
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset );
/**
......@@ -65,11 +145,14 @@ public:
int GetNet() const { return m_NetCode; }
void SetNet( int aNetCode ) { m_NetCode = aNetCode; }
int GetNodesCount() const { return m_ListPad.size(); }
/**
* Function GetNetname
* @return const wxString * , a pointer to the full netname
*/
wxString GetNetname() const { return m_Netname; }
/**
* Function GetShortNetname
* @return const wxString * , a pointer to the short netname
......@@ -80,18 +163,7 @@ public:
* Function SetNetname
* @param const wxString : the new netname
*/
void SetNetname( const wxString & aNetname );
/**
* Function GetClass
* returns the class name.
* @return wxString
*/
wxString GetClass() const
{
return wxT("NET");
}
void SetNetname( const wxString& aNetname );
/**
......@@ -102,17 +174,39 @@ public:
* @param frame A WinEDA_DrawFrame in which to print status information.
*/
void DisplayInfo( WinEDA_DrawFrame* frame );
};
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
virtual void Show( int nestLevel, std::ostream& os );
#endif
/*****************************/
/* flags for a RATSNEST_ITEM */
/*****************************/
#define CH_VISIBLE 1 /* affichage permanent demande */
#define CH_UNROUTABLE 2 /* non route par l'autorouteur */
#define CH_ROUTE_REQ 4 /* doit etre route par l'autorouteur */
#define CH_ACTIF 8 /* chevelu non encore rout */
#define LOCAL_RATSNEST_ITEM 0x8000 /* indique un chevelu reliant 2 pins d'un meme
* module pour le calcul des chevelus relatifs a 1 seul module */
/****************************************************************/
/* description d'un point de piste pour le suivi des connexions */
/****************************************************************/
#define START_ON_PAD 0x10
#define END_ON_PAD 0x20
#define START_ON_TRACK 0x40
#define END_ON_TRACK 0x80
/* Status bit (OR'ed bits) for class BOARD member .m_Status_Pcb */
enum StatusPcbFlags {
LISTE_PAD_OK = 1, /* Pad list is Ok */
LISTE_RATSNEST_ITEM_OK = 2, /* General Rastnest is Ok */
RATSNEST_ITEM_LOCAL_OK = 4, /* current MODULE rastnest is Ok */
CONNEXION_OK = 8, /* Bit indicant que la liste des connexions existe */
NET_CODES_OK = 0x10, /* Bit indicant que les netcodes sont OK ( pas de modif
* de noms de net */
DO_NOT_SHOW_GENERAL_RASTNEST = 0x20 /* Do not display the general rastnest (used in module moves) */
};
#endif // __CLASSES_NETINFO__
/***********************/
/**** class_netinfolist.cpp ****/
/***********************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "class_drawpanel.h"
#include "pcbnew.h"
#include "autorout.h"
// Constructor and destructor
NETINFO_LIST::NETINFO_LIST( BOARD* aParent )
{
m_Parent = aParent;
}
NETINFO_LIST::~NETINFO_LIST()
{
Clear();
}
/** Function GetItem
* @param aNetcode = netcode to identify a given NETINFO_ITEM
* @return a NETINFO_ITEM pointer to the selected NETINFO_ITEM by its netcode, or NULL if not found
*/
NETINFO_ITEM* NETINFO_LIST::GetItem( int aNetcode )
{
if( aNetcode < 0 || ( aNetcode > (int) ( GetCount() - 1 ) ) )
return NULL;
return m_NetBuffer[aNetcode];
}
/** Function Clear
* delete the list of nets (and free memory)
*/
void NETINFO_LIST::Clear()
{
for( unsigned ii = 0; ii < GetCount(); ii++ )
delete m_NetBuffer[ii];
m_NetBuffer.clear();
}
/**
* Function Append
* adds \a aNewElement to the end of the list.
*/
void NETINFO_LIST::Append( NETINFO_ITEM* aNewElement )
{
m_NetBuffer.push_back( aNewElement );
}
/* sort function, to sort pad list by netnames
*/
static bool PadlistSortByNetnames( const D_PAD* a, const D_PAD* b )
{
return ( a->GetNetname().Cmp( b->GetNetname() ) ) < 0;
}
/*****************************************************/
void NETINFO_LIST::BuildListOfNets()
/*****************************************************/
/**
* Compute and update the net_codes for PADS et and equipots (.m_NetCode member)
* net_codes are >= 1 (net_code = 0 means not connected)
* Update the equipotents buffer
* Must be called after editing pads (netname, or deleting) or after read a netlist
* set to 1 flag NET_CODE_OK of m_Pcb->m_Status_Pcb;
* m_Pcb->m_NbNodes and m_Pcb->m_NbNets are updated
*/
{
D_PAD* pad;
int nodes_count = 0;
NETINFO_ITEM* net_item;
Clear(); // Remove all nets info and free memory
// Create and add the "unconnected net"
net_item = new NETINFO_ITEM( m_Parent );
Append( net_item );
/* Build the PAD list, sorted by net */
m_Parent->Build_Pads_Full_List();
int netcode = 0;
/* Build netnames list, and create a netcode for each netname */
D_PAD* last_pad = NULL;
for( unsigned ii = 0; ii < m_Parent->m_Pads.size(); ii++ )
{
pad = m_Parent->m_Pads[ii];
if( pad->GetNetname().IsEmpty() ) // pad not connected
{
pad->SetNet( 0 );
continue;
}
/* if the current netname was already found: add pad to the current net_item ,
* else create a new net_code and a new net_item
*/
if( last_pad == NULL || ( pad->GetNetname() != last_pad->GetNetname() ) ) // create a new net_code
{
netcode++;
net_item = new NETINFO_ITEM( m_Parent );
net_item->SetNet( netcode );
net_item->SetNetname( pad->GetNetname() );
Append( net_item );
}
pad->SetNet( netcode );
net_item->m_ListPad.push_back( pad );
nodes_count ++;
last_pad = pad;
}
m_Parent->m_NbNodes = nodes_count;
m_Parent->m_Status_Pcb |= NET_CODES_OK;
m_Parent->SetAreasNetCodesFromNetNames();
}
/**********************************/
void BOARD::Build_Pads_Full_List()
/**********************************/
/** Function Build_Pads_Full_List
* Create the pad list
* initialise:
* m_Pads (list of pads)
* m_NbNodes = 0
* set m_Status_Pcb = LISTE_PAD_OK;
* and clear for all pads the m_SubRatsnest member;
* delete ( free memory) m_Pcb->m_Ratsnest and set m_Pcb->m_Ratsnest to NULL
*/
{
if( m_Status_Pcb & LISTE_PAD_OK )
return;
// empty the old list
m_Pads.clear();
m_NbNodes = 0;
/* Clear variables used in rastnest computation */
for( MODULE* module = m_Modules; module; module = module->Next() )
{
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
{
m_Pads.push_back( pad );
pad->SetSubRatsnest( 0 );
pad->SetParent( module );
if( pad->GetNet() )
m_NbNodes++;
}
}
// Sort pad list per net
sort( m_Pads.begin(), m_Pads.end(), PadlistSortByNetnames );
if( m_Ratsnest )
{
MyFree( m_Ratsnest );
m_Ratsnest = NULL;
}
m_Status_Pcb = LISTE_PAD_OK;
}
......@@ -665,7 +665,7 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode, const wxPoin
if( GetNet() == 0 )
return;
EQUIPOT* net = ( (BOARD*) GetParent() )->FindNet( GetNet() );
NETINFO_ITEM* net = ( (BOARD*) GetParent() )->FindNet( GetNet() );
if( net == NULL )
return;
......@@ -824,7 +824,7 @@ void SEGVIA::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode, const wxPoi
return;
if( DisplayOpt.DisplayNetNamesMode == 0 || DisplayOpt.DisplayNetNamesMode == 1 )
return;
EQUIPOT* net = ( (BOARD*) GetParent() )->FindNet( GetNet() );
NETINFO_ITEM* net = ( (BOARD*) GetParent() )->FindNet( GetNet() );
if( net == NULL )
return;
......@@ -886,7 +886,7 @@ void TRACK::DisplayInfo( WinEDA_DrawFrame* frame )
{
/* Display NetName pour les segments de piste type cuivre */
EQUIPOT* equipot = board->FindNet( GetNet() );
NETINFO_ITEM* equipot = board->FindNet( GetNet() );
if( equipot )
msg = equipot->GetNetname();
......
......@@ -71,7 +71,7 @@ void ZONE_CONTAINER::SetNet( int anet_code )
if( m_Parent )
{
BOARD* board = (BOARD*) m_Parent;
EQUIPOT* net = board->FindNet( anet_code );
NETINFO_ITEM* net = board->FindNet( anet_code );
if( net )
m_Netname = net->GetNetname();
else
......@@ -883,7 +883,7 @@ void ZONE_CONTAINER::DisplayInfo( WinEDA_DrawFrame* frame )
{
if( GetNet() >= 0 )
{
EQUIPOT* equipot = ( (WinEDA_PcbFrame*) frame )->GetBoard()->FindNet( GetNet() );
NETINFO_ITEM* equipot = ( (WinEDA_PcbFrame*) frame )->GetBoard()->FindNet( GetNet() );
if( equipot )
msg = equipot->GetNetname();
......@@ -1055,7 +1055,7 @@ void ZONE_CONTAINER::Copy( ZONE_CONTAINER* src )
*/
bool ZONE_CONTAINER::SetNetNameFromNetCode( void )
{
EQUIPOT* net;
NETINFO_ITEM* net;
if ( m_Parent && (net = ((BOARD*)m_Parent)->FindNet( GetNet()) ) )
{
m_Netname = net->GetNetname();
......
......@@ -77,8 +77,7 @@ void Clean_Pcb_Items( WinEDA_PcbFrame* frame, wxDC* DC )
/* Rebuild the pad infos (pad list and netcodes) to ensure an up to date info */
frame->GetBoard()->m_Status_Pcb = 0;
frame->build_liste_pads();
frame->recalcule_pad_net_code();
frame->GetBoard()->m_NetInfo->BuildListOfNets();
if( s_CleanVias ) // delete redundant vias
{
......
......@@ -7,7 +7,6 @@
#include "common.h"
#include "pcbnew.h"
#include "autorout.h"
#include "protos.h"
......@@ -322,7 +321,7 @@ void WinEDA_BasePcbFrame::test_1_net_connexion( wxDC* DC, int net_code )
if( net_code == 0 )
return;
if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
Compile_Ratsnest( DC, TRUE );
for( unsigned i = 0; i<m_Pcb->m_Pads.size(); ++i )
......@@ -563,12 +562,11 @@ void CreateSortedPadListByXCoord( BOARD* aBoard, std::vector<D_PAD*>* aVector )
/********************************************************************/
void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
void WinEDA_BasePcbFrame::RecalculateAllTracksNetcode( )
/********************************************************************/
/* search connections between tracks and pads, and propagate pad net codes to the track segments
* This is a 2 pass computation.
* The pad netcodes are assumed to be initialized.
* First:
* We search a connection between a track segment and a pad: if found : this segment netcode is set to the pad netcode
*/
......@@ -583,6 +581,9 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
int masque_layer;
wxString msg;
// Build the net info list
GetBoard()->m_NetInfo->BuildListOfNets();
if( m_Pcb->m_Pads.size() == 0 ) // If no pad, reset pointers and netcode, and do nothing else
{
pt_piste = m_Pcb->m_Track;
......@@ -593,28 +594,14 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
pt_piste->SetNet( 0 );
pt_piste->end = NULL;
}
return;
}
a_color = CYAN;
if( affiche )
Affiche_1_Parametre( this, POS_AFF_CHREF, wxT( "DataBase" ), wxT( "Netcodes" ), a_color );
recalcule_pad_net_code();
if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Gen Pads " ), a_color );
/**************************************************************/
/* Pass 1: search the connections between track ends and pads */
/**************************************************************/
CreateSortedPadListByXCoord( m_Pcb, &sortedPads );
if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Conn Pads" ), a_color );
/* Reset variables and flags used in computation */
pt_piste = m_Pcb->m_Track;
for( ; pt_piste != NULL; pt_piste = pt_piste->Next() )
......@@ -667,8 +654,6 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
* the connection (if found) is between segments
* when a track has a net code and the other has a null net code, the null net code is changed
*/
if( affiche )
Affiche_1_Parametre( this, POS_AFF_CHREF, wxEmptyString, wxT( "Conn Segm" ), a_color );
for( pt_piste = m_Pcb->m_Track; pt_piste != NULL; pt_piste = pt_piste->Next() )
{
......@@ -693,11 +678,6 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
{
bool reset_flag = FALSE;
new_passe_request = 0;
if( affiche )
{
msg.Printf( wxT( "Net->Segm pass %d " ), new_passe_request + 1 );
Affiche_1_Parametre( this, POS_AFF_CHREF, wxEmptyString, msg, a_color );
}
/* look for vias which could be connect many tracks */
for( TRACK* via = m_Pcb->m_Track; via != NULL; via = via->Next() )
......@@ -789,12 +769,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
}
/* Sort the track list by net codes: */
if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Reorder " ), a_color );
RebuildTrackChain( m_Pcb );
if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( " " ), a_color );
}
......
......@@ -157,8 +157,7 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
wxArrayString ListNetName;
m_Parent->GetBoard()->ReturnSortedNetnamesList(
ListNetName,
m_NetSorting ==
0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT );
m_NetSorting == 0 ? false : true );
if( m_NetSorting != 0 )
{
......@@ -181,7 +180,7 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
if( net_select > 0 )
{
EQUIPOT* equipot = m_Parent->GetBoard()->FindNet( net_select );
NETINFO_ITEM* equipot = m_Parent->GetBoard()->FindNet( net_select );
if( equipot ) // Search net in list and select it
{
for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ )
......@@ -351,15 +350,9 @@ bool dialog_copper_zone::AcceptOptions( bool aPromptForErrors, bool aUseExportab
/* Search net_code for this net, if a net was selected */
if( m_ListNetNameSelection->GetSelection() > 0 )
{
EQUIPOT* net;
for( net = m_Parent->GetBoard()->m_Equipots; net; net = net->Next() )
{
if( net->GetNetname() == net_name )
{
NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet(net_name);
if( net )
g_Zone_Default_Setting.m_NetcodeSelection = net->GetNet();
break;
}
}
}
return true;
......@@ -374,9 +367,7 @@ void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event )
m_NetSorting = m_NetSortingOption->GetSelection();
m_Parent->GetBoard()->ReturnSortedNetnamesList(
ListNetName,
m_NetSorting ==
0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT );
ListNetName, m_NetSorting == 0 ? false : true );
if( m_NetSorting != 0 )
{
wxString Filter = m_NetNameFilter->GetValue();
......@@ -398,11 +389,11 @@ void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event )
m_Config->Write( ZONE_NET_FILTER_STRING_KEY, Filter );
}
// Select and isplay current zone net name in listbox:
// Select and display current zone net name in listbox:
int net_select = m_Zone_Setting->m_NetcodeSelection;
if( net_select > 0 )
{
EQUIPOT* equipot = m_Parent->GetBoard()->FindNet( net_select );
NETINFO_ITEM* equipot = m_Parent->GetBoard()->FindNet( net_select );
if( equipot ) // Search net in list and select it
{
for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ )
......
......@@ -634,7 +634,7 @@ void DrcDialog::OnStartdrcClick( wxCommandEvent& event )
// running the module editor and selecting "Update module in current board"
// causes the list to become obsolete because of the new pads from the
// revised module.
m_Parent->build_liste_pads();
m_Parent->GetBoard()->Build_Pads_Full_List();
// run all the tests, with no UI at this time.
m_tester->RunTests();
......
......@@ -521,7 +521,7 @@ void DialogPadProperties::PadPropertiesAccept( wxCommandEvent& event )
}
else
{
const EQUIPOT* net = m_Parent->GetBoard()->FindNet( Current_PadNetName );
const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( Current_PadNetName );
if( net )
{
RastnestIsChanged = true;
......
......@@ -190,7 +190,7 @@ int DRC::Drc( ZONE_CONTAINER* aArea, int CornerIndex )
void DRC::RunTests()
{
// Ensure ratsnest is up to date:
if( (m_pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (m_pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
m_mainWindow->Compile_Ratsnest( NULL, true );
// someone should have cleared the two lists before calling this.
......@@ -296,7 +296,7 @@ void DRC::testPad2Pad()
void DRC::testUnconnected()
{
if( (m_pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (m_pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
{
wxClientDC dc( m_mainWindow->DrawPanel );
m_mainWindow->Compile_Ratsnest( &dc, TRUE );
......@@ -305,14 +305,14 @@ void DRC::testUnconnected()
if( m_pcb->m_Ratsnest == NULL )
return;
CHEVELU* rat = m_pcb->m_Ratsnest;
RATSNEST_ITEM* rat = m_pcb->m_Ratsnest;
for( int i = 0; i<m_pcb->GetNumRatsnests(); ++i, ++rat )
{
if( (rat->status & CH_ACTIF) == 0 )
if( (rat->m_Status & CH_ACTIF) == 0 )
continue;
D_PAD* padStart = rat->pad_start;
D_PAD* padEnd = rat->pad_end;
D_PAD* padStart = rat->m_PadStart;
D_PAD* padEnd = rat->m_PadEnd;
DRC_ITEM* uncItem = new DRC_ITEM( DRCE_UNCONNECTED_PADS, padStart->GetPosition(),
padStart->MenuText( m_pcb ), padEnd->MenuText( m_pcb ),
......
......@@ -261,7 +261,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_TRACK_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add Tracks" ) );
DisplayTrackSettings();
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
{
Compile_Ratsnest( &dc, true );
}
......@@ -311,7 +311,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_PCB_SHOW_1_RATSNEST_BUTT:
SetToolID( id, wxCURSOR_HAND, _( "Local Ratsnest" ) );
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
Compile_Ratsnest( &dc, true );
break;
......@@ -466,6 +466,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
SetCurItem( NULL );
test_1_net_connexion( NULL, netcode );
GetScreen()->SetModify();
GetBoard()->DisplayInfo(this );
}
break;
......@@ -494,6 +495,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
Delete_Zone_Contour( &dc, (ZONE_CONTAINER*) GetCurItem() );
SetCurItem( NULL );
test_1_net_connexion( NULL, netcode );
GetBoard()->DisplayInfo(this );
}
break;
......@@ -571,6 +573,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_FILL_ALL_ZONES:
DrawPanel->MouseToCursorSchema();
Fill_All_Zones();
GetBoard()->DisplayInfo(this );
break;
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE:
......@@ -580,8 +583,10 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
Delete_Zone_Fill( &dc, NULL, zone_container->m_TimeStamp );
test_1_net_connexion( NULL, zone_container->GetNet() );
GetScreen()->SetModify();
GetBoard()->DisplayInfo(this );
DrawPanel->Refresh();
}
SetCurItem( NULL );
break;
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES: // Remove all zones :
......@@ -595,6 +600,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
test_connexions( NULL );
Tst_Ratsnest( NULL, 0 ); // Recalculate the active ratsnest, i.e. the unconnected links */
GetScreen()->SetModify();
GetBoard()->DisplayInfo(this );
DrawPanel->Refresh();
break;
......@@ -602,6 +608,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
DrawPanel->MouseToCursorSchema();
Fill_Zone( NULL, (ZONE_CONTAINER*) GetCurItem() );
test_1_net_connexion( NULL, ( (ZONE_CONTAINER*) GetCurItem() )->GetNet() );
GetBoard()->DisplayInfo(this );
DrawPanel->Refresh();
break;
......@@ -1133,6 +1140,7 @@ void WinEDA_PcbFrame::RemoveStruct( BOARD_ITEM* Item, wxDC* DC )
int netcode = ((ZONE_CONTAINER*) Item)->GetNet();
Delete_Zone_Contour( DC, (ZONE_CONTAINER*) Item );
test_1_net_connexion( NULL, netcode );
GetBoard()->DisplayInfo(this );
}
break;
......@@ -1151,7 +1159,6 @@ void WinEDA_PcbFrame::RemoveStruct( BOARD_ITEM* Item, wxDC* DC )
break;
case TYPE_NOT_INIT:
case TYPE_EQUIPOT:
case TYPE_PCB:
default:
{
......
......@@ -10,7 +10,6 @@
#include "confirm.h"
#include "pcbnew.h"
#include "autorout.h"
#include "protos.h"
......@@ -45,9 +44,9 @@ void WinEDA_PcbFrame::Ratsnest_On_Off( wxDC* DC )
/* Affiche ou efface le chevelu selon l'etat du bouton d'appel */
{
int ii;
CHEVELU* pt_chevelu;
RATSNEST_ITEM* pt_chevelu;
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
{
if( g_Show_Ratsnest )
Compile_Ratsnest( DC, TRUE );
......@@ -64,7 +63,7 @@ void WinEDA_PcbFrame::Ratsnest_On_Off( wxDC* DC )
{
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; pt_chevelu++, ii-- )
{
pt_chevelu->status |= CH_VISIBLE;
pt_chevelu->m_Status |= CH_VISIBLE;
}
DrawGeneralRatsnest( DC, 0 );
......@@ -73,7 +72,7 @@ void WinEDA_PcbFrame::Ratsnest_On_Off( wxDC* DC )
{
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; pt_chevelu++, ii-- )
{
pt_chevelu->status &= ~CH_VISIBLE;
pt_chevelu->m_Status &= ~CH_VISIBLE;
}
}
}
......@@ -346,14 +345,14 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
*/
{
int ii;
CHEVELU* pt_chevelu;
RATSNEST_ITEM* pt_chevelu;
D_PAD* pt_pad = NULL;
MODULE* Module = NULL;
if( g_Show_Ratsnest )
return; // Deja Affich�
if( (GetBoard()->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (GetBoard()->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
{
Compile_Ratsnest( DC, TRUE );
}
......@@ -369,22 +368,22 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
if( pt_pad ) /* Affichage du chevelu du net correspondant */
{
pt_pad->DisplayInfo( this );
pt_chevelu = (CHEVELU*) GetBoard()->m_Ratsnest;
pt_chevelu = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; pt_chevelu++, ii-- )
{
if( pt_chevelu->GetNet() == pt_pad->GetNet() )
{
if( (pt_chevelu->status & CH_VISIBLE) != 0 )
if( (pt_chevelu->m_Status & CH_VISIBLE) != 0 )
continue;
pt_chevelu->status |= CH_VISIBLE;
if( (pt_chevelu->status & CH_ACTIF) == 0 )
pt_chevelu->m_Status |= CH_VISIBLE;
if( (pt_chevelu->m_Status & CH_ACTIF) == 0 )
continue;
GRSetDrawMode( DC, GR_XOR );
GRLine( &DrawPanel->m_ClipBox, DC, pt_chevelu->pad_start->m_Pos.x,
pt_chevelu->pad_start->m_Pos.y,
pt_chevelu->pad_end->m_Pos.x,
pt_chevelu->pad_end->m_Pos.y,
GRLine( &DrawPanel->m_ClipBox, DC, pt_chevelu->m_PadStart->m_Pos.x,
pt_chevelu->m_PadStart->m_Pos.y,
pt_chevelu->m_PadEnd->m_Pos.x,
pt_chevelu->m_PadEnd->m_Pos.y,
0,
g_DesignSettings.m_RatsnestColor );
}
......@@ -408,24 +407,24 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
pt_pad = Module->m_Pads;
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Next() )
{
pt_chevelu = (CHEVELU*) GetBoard()->m_Ratsnest;
pt_chevelu = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; pt_chevelu++, ii-- )
{
if( (pt_chevelu->pad_start == pt_pad)
|| (pt_chevelu->pad_end == pt_pad) )
if( (pt_chevelu->m_PadStart == pt_pad)
|| (pt_chevelu->m_PadEnd == pt_pad) )
{
if( pt_chevelu->status & CH_VISIBLE )
if( pt_chevelu->m_Status & CH_VISIBLE )
continue;
pt_chevelu->status |= CH_VISIBLE;
if( (pt_chevelu->status & CH_ACTIF) == 0 )
pt_chevelu->m_Status |= CH_VISIBLE;
if( (pt_chevelu->m_Status & CH_ACTIF) == 0 )
continue;
GRSetDrawMode( DC, GR_XOR );
GRLine( &DrawPanel->m_ClipBox, DC, pt_chevelu->pad_start->m_Pos.x,
pt_chevelu->pad_start->m_Pos.y,
pt_chevelu->pad_end->m_Pos.x,
pt_chevelu->pad_end->m_Pos.y,
GRLine( &DrawPanel->m_ClipBox, DC, pt_chevelu->m_PadStart->m_Pos.x,
pt_chevelu->m_PadStart->m_Pos.y,
pt_chevelu->m_PadEnd->m_Pos.x,
pt_chevelu->m_PadEnd->m_Pos.y,
0,
g_DesignSettings.m_RatsnestColor );
}
......@@ -442,10 +441,10 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
if( (pt_pad == NULL) && (Module == NULL) )
{
DrawGeneralRatsnest( DC );
pt_chevelu = (CHEVELU*) GetBoard()->m_Ratsnest;
pt_chevelu = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
for( ii = GetBoard()->GetNumRatsnests(); (ii > 0) && pt_chevelu; pt_chevelu++, ii-- )
pt_chevelu->status &= ~CH_VISIBLE;
pt_chevelu->m_Status &= ~CH_VISIBLE;
}
}
......@@ -459,21 +458,21 @@ void WinEDA_PcbFrame::Affiche_PadsNoConnect( wxDC* DC )
*/
{
int ii;
CHEVELU* pt_chevelu;
RATSNEST_ITEM* pt_chevelu;
D_PAD* pt_pad;
pt_chevelu = (CHEVELU*) GetBoard()->m_Ratsnest;
pt_chevelu = (RATSNEST_ITEM*) GetBoard()->m_Ratsnest;
for( ii = GetBoard()->GetNumRatsnests(); ii > 0; pt_chevelu++, ii-- )
{
if( (pt_chevelu->status & CH_ACTIF) == 0 )
if( (pt_chevelu->m_Status & CH_ACTIF) == 0 )
continue;
pt_pad = pt_chevelu->pad_start;
pt_pad = pt_chevelu->m_PadStart;
if( pt_pad )
pt_pad->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
pt_pad = pt_chevelu->pad_end;
pt_pad = pt_chevelu->m_PadEnd;
if( pt_pad )
pt_pad->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
}
......
......@@ -433,25 +433,26 @@ void CreateSignalsSection( FILE* file, BOARD* pcb )
*/
{
wxString msg;
EQUIPOT* equipot;
NETINFO_ITEM* net;
D_PAD* pad;
MODULE* module;
int NbNoConn = 1;
fputs( "$SIGNALS\n", file );
for( equipot = pcb->m_Equipots; equipot != NULL; equipot = equipot->Next() )
for( unsigned ii = 0; ii < pcb->m_NetInfo->GetCount() ; ii++ )
{
if( equipot->GetNetname() == wxEmptyString ) // dummy equipot (non connexion)
net = pcb->m_NetInfo->GetItem(ii);
if( net->GetNetname() == wxEmptyString ) // dummy equipot (non connexion)
{
wxString msg; msg << wxT( "NoConnection" ) << NbNoConn++;
equipot->SetNetname(msg); ;
net->SetNetname(msg); ;
}
if( equipot->GetNet() <= 0 ) // dummy equipot (non connexion)
if( net->GetNet() <= 0 ) // dummy equipot (non connexion)
continue;
msg = wxT( "\nSIGNAL " ) + equipot->GetNetname();
msg = wxT( "\nSIGNAL " ) + net->GetNetname();
fputs( CONV_TO_UTF8( msg ), file );
fputs( "\n", file );
......@@ -461,7 +462,7 @@ void CreateSignalsSection( FILE* file, BOARD* pcb )
for( pad = module->m_Pads; pad != NULL; pad = pad->Next() )
{
wxString padname;
if( pad->GetNet() != equipot->GetNet() )
if( pad->GetNet() != net->GetNet() )
continue;
pad->ReturnStringPadName( padname );
......@@ -587,10 +588,10 @@ void CreateRoutesSection( FILE* file, BOARD* pcb )
if( old_netcode != track->GetNet() )
{
old_netcode = track->GetNet();
EQUIPOT* equipot = pcb->FindNet( track->GetNet() );
NETINFO_ITEM* net = pcb->FindNet( track->GetNet() );
wxString netname;
if( equipot && (equipot->GetNetname() != wxEmptyString) )
netname = equipot->GetNetname();
if( net && (net->GetNetname() != wxEmptyString) )
netname = net->GetNetname();
else
netname = wxT( "_noname_" );
fprintf( file, "\nROUTE %s\n", CONV_TO_UTF8( netname ) );
......
......@@ -262,7 +262,8 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, bool Append )
SetLastProject( GetScreen()->m_FileName );
/* Rebuild the new pad list (for drc and ratsnet control ...) */
build_liste_pads();
GetBoard()->m_Status_Pcb = 0;
GetBoard()->Build_Pads_Full_List();
GetBoard()->DisplayInfo( this );
DrawPanel->Refresh( true);
......
......@@ -8,7 +8,6 @@
#include "class_drawpanel.h"
#include "confirm.h"
#include "pcbnew.h"
#include "autorout.h"
#include "trigo.h"
#include "drag.h"
......@@ -279,7 +278,7 @@ void WinEDA_BasePcbFrame::Global_Import_Pad_Settings( D_PAD* aPad, bool aDraw )
if( pt_pad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
continue;
else
m_Pcb->m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK);
m_Pcb->m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
}
/* Modif des caracteristiques: */
......
......@@ -595,7 +595,7 @@ bool WinEDA_PcbFrame::WriteGeneralDescrPcb( FILE* File )
fprintf( File, "Nzone %d\n", GetBoard()->GetNumSegmZone() );
fprintf( File, "Nmodule %d\n", NbModules );
fprintf( File, "Nnets %d\n", GetBoard()->m_Equipots.GetCount() );
fprintf( File, "Nnets %d\n", GetBoard()->m_NetInfo->GetCount() );
fprintf( File, "$EndGENERAL\n\n" );
return TRUE;
......@@ -784,9 +784,9 @@ int WinEDA_PcbFrame::ReadPcbFile( FILE* File, bool Append )
if( strnicmp( Line, "$EQUIPOT", 7 ) == 0 )
{
EQUIPOT* Equipot = new EQUIPOT( GetBoard() );
GetBoard()->m_Equipots.PushBack( Equipot );
Equipot->ReadDescr( File, &LineNum );
NETINFO_ITEM* net = new NETINFO_ITEM( GetBoard() );
GetBoard()->m_NetInfo->Append( net );
net->ReadDescr( File, &LineNum );
continue;
}
......
......@@ -131,7 +131,7 @@ MODULE* WinEDA_ModuleEditFrame::Import_Module( wxDC* DC )
module->DisplayInfo( this );
Place_Module( module, DC );
GetBoard()->m_Status_Pcb = 0;
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
return module;
}
......
......@@ -77,7 +77,7 @@ void WinEDA_ModuleEditFrame::Load_Module_Module_From_BOARD( MODULE* Module )
Module->m_Flags = 0;
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
GetScreen()->m_Curseur.x = GetScreen()->m_Curseur.y = 0;
Place_Module( Module, NULL );
......@@ -162,7 +162,7 @@ MODULE* WinEDA_BasePcbFrame::Load_Module_From_Library( const wxString& library,
module->m_TimeStamp = GetTimeStamp();
GetBoard()->m_Status_Pcb = 0;
module->SetPosition( curspos );
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
if ( DC )
module->Draw( DrawPanel, DC, GR_OR );
}
......
......@@ -333,7 +333,6 @@ bool WinEDA_ModuleEditFrame::OnRightClick( const wxPoint& MousePos,
case TYPE_SCREEN:
case TYPE_NOT_INIT:
case TYPE_PCB:
case TYPE_EQUIPOT:
msg.Printf(
wxT( "WinEDA_ModuleEditFrame::OnRightClick Error: illegal DrawType %d" ),
DrawStruct->Type() );
......
......@@ -11,7 +11,6 @@
#include "confirm.h"
#include "pcbnew.h"
#include "autorout.h"
#include "trigo.h"
#include "protos.h"
......@@ -103,7 +102,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC )
return;
SetCurItem( module );
GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
module->m_Flags |= IS_MOVED;
ModuleInitOrient = module->m_Orient;
ModuleInitLayer = module->GetLayer();
......@@ -154,7 +153,7 @@ void Abort_MoveOrCopyModule( WinEDA_DrawPanel* Panel, wxDC* DC )
WinEDA_BasePcbFrame* pcbframe = (WinEDA_BasePcbFrame*) Panel->m_Parent;
module = (MODULE*) pcbframe->GetScreen()->GetCurItem();
pcbframe->GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
pcbframe->GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
if( module )
{
......@@ -195,7 +194,7 @@ void Abort_MoveOrCopyModule( WinEDA_DrawPanel* Panel, wxDC* DC )
module->DeleteStructure();
module = NULL;
pcbframe->GetBoard()->m_Status_Pcb = 0;
pcbframe->build_liste_pads();
pcbframe->GetBoard()->Build_Pads_Full_List();
}
}
......@@ -250,10 +249,10 @@ MODULE* WinEDA_BasePcbFrame::Copie_Module( MODULE* module )
newmodule->m_Flags = IS_NEW;
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
newmodule->DisplayInfo( this );
GetBoard()->m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
return newmodule;
}
......@@ -329,7 +328,7 @@ bool WinEDA_PcbFrame::Delete_Module( MODULE* module, wxDC* DC, bool aAskBeforeDe
SaveItemEfface( module, 1 );
GetBoard()->m_Status_Pcb = 0;
build_liste_pads();
GetBoard()->Build_Pads_Full_List();
ReCompile_Ratsnest_After_Changes( DC );
// redraw the area where the module was
......@@ -367,7 +366,7 @@ void BOARD::Change_Side_Module( MODULE* Module, wxDC* DC )
if( !(Module->m_Flags & IS_MOVED) )
{
m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK);
m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
if( DC && m_PcbFrame )
{
int tmp = Module->m_Flags;
......@@ -540,7 +539,7 @@ void BOARD::Change_Side_Module( MODULE* Module, wxDC* DC )
DrawModuleOutlines( m_PcbFrame->DrawPanel, DC, Module );
Dessine_Segments_Dragges( m_PcbFrame->DrawPanel, DC );
}
m_Status_Pcb &= ~CHEVELU_LOCAL_OK;
m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
}
}
......@@ -669,7 +668,7 @@ void WinEDA_BasePcbFrame::Place_Module( MODULE* module, wxDC* DC )
return;
GetScreen()->SetModify();
GetBoard()->m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK);
GetBoard()->m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
if( g_Show_Module_Ratsnest && (GetBoard()->m_Status_Pcb & LISTE_PAD_OK) && DC )
trace_ratsnest_module( DC );
......@@ -750,7 +749,7 @@ void WinEDA_BasePcbFrame::Rotate_Module( wxDC* DC, MODULE* module,
}
}
GetBoard()->m_Status_Pcb &= ~(LISTE_CHEVELU_OK | CONNEXION_OK);
GetBoard()->m_Status_Pcb &= ~(LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
if( incremental )
module->SetOrientation( module->m_Orient + angle );
......
......@@ -8,7 +8,6 @@
#include "class_drawpanel.h"
#include "confirm.h"
#include "pcbnew.h"
#include "autorout.h"
#include "trigo.h"
#include "drag.h"
......@@ -357,7 +356,7 @@ void WinEDA_BasePcbFrame::PlacePad( D_PAD* Pad, wxDC* DC )
GetScreen()->SetModify();
DrawPanel->ManageCurseur = NULL;
DrawPanel->ForceCloseManageCurseur = NULL;
m_Pcb->m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK);
m_Pcb->m_Status_Pcb &= ~( LISTE_RATSNEST_ITEM_OK | CONNEXION_OK);
}
......
......@@ -139,7 +139,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
GetBoard()->DisplayInfo( this );
else
{
EQUIPOT * net = GetBoard()->FindNet(netcode);
NETINFO_ITEM * net = GetBoard()->FindNet(netcode);
if ( net )
net->DisplayInfo( this );
}
......
......@@ -302,9 +302,8 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
case TYPE_SCREEN:
case TYPE_NOT_INIT:
case TYPE_PCB:
case TYPE_EQUIPOT:
msg.Printf(
wxT( "WinEDA_PcbFrame::OnRightClick() Error: illegal DrawType %d" ),
wxT( "WinEDA_PcbFrame::OnRightClick() Error: unexpected DrawType %d" ),
item->Type() );
DisplayError( this, msg );
SetCurItem( NULL );
......
......@@ -15,9 +15,10 @@
extern char* adr_lowmem; /* adresse de base memoire de calcul disponible */
/* exported variables */
CHEVELU* g_pt_chevelu;
CHEVELU* local_liste_chevelu; // Buffer address for local ratsnest
RATSNEST_ITEM* g_pt_chevelu;
RATSNEST_ITEM* local_liste_chevelu; // Buffer address for local ratsnest
// (ratnest relative to one footprint while moving it
int nb_local_chevelu; // link count (active ratnest count) for the footprint beeing moved
......@@ -100,38 +101,44 @@ static bool DisplayRastnestInProgress; // Enable the display of the ratsnes
void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb )
/******************************************************************************/
/*
/** Function Compile_Ratsnest
* Create the entire board ratsnesr.
* Msut be called AFTER the connectivity computation
* Must be called after a board change (changes for
* pads, footprints or a read netlist ).
*
* if display_status_pcb == true : Display the computation results
* @param display_status_pcb : if true, display the computation results
*/
{
wxString msg;
DisplayRastnestInProgress = TRUE;
/* Create the sorted pad list */
m_Pcb->m_Status_Pcb = 0; /* we want a full ratnest computation, from the scratch */
build_liste_pads();
GetBoard()->m_Status_Pcb = 0; /* we want a full ratnest computation, from the scratch */
GetBoard()->Build_Pads_Full_List(); /* Create the sorted pad list */
MsgPanel->EraseMsgBox();
if( display_status_pcb )
{
msg.Printf( wxT( " %d" ), m_Pcb->m_Pads.size() );
Affiche_1_Parametre( this, 1, wxT( "pads" ), msg, RED );
}
msg.Printf( wxT( " %d" ), m_Pcb->m_Equipots.GetCount() );
Affiche_1_Parametre( this, 8, wxT( "Nets" ), msg, CYAN );
//Rebuild the net info list
RecalculateAllTracksNetcode();
reattribution_reference_piste( display_status_pcb );
if( display_status_pcb )
{
msg.Printf( wxT( " %d" ), m_Pcb->m_NetInfo->GetCount() );
Affiche_1_Parametre( this, 8, wxT( "Nets" ), msg, CYAN );
}
/* Compute the full ratsnest
* which can be see like all the possible links or logical connections.
* some of thems are active (no track connected) and others are inactive (when track connect pads)
* This full ratsnest is not modified by track editing.
* It change only when a netlist is read, or footprints are modified
* It changes only when a netlist is read, or footprints are modified
*/
Build_Board_Ratsnest( DC );
......@@ -161,8 +168,8 @@ static int tri_par_net( const void* o1, const void* o2 )
* Sort pads by net code
*/
{
LISTE_PAD* pt_ref = (LISTE_PAD*) o1;
LISTE_PAD* pt_compare = (LISTE_PAD*) o2;
D_PAD** pt_ref = (D_PAD**) o1;
D_PAD** pt_compare = (D_PAD**) o2;
return (*pt_ref)->GetNet() - (*pt_compare)->GetNet();
}
......@@ -176,16 +183,16 @@ static int sort_by_length( const void* o1, const void* o2 )
* Sort ratsnest by lenght
*/
{
CHEVELU* ref = (CHEVELU*) o1;
CHEVELU* compare = (CHEVELU*) o2;
RATSNEST_ITEM* ref = (RATSNEST_ITEM*) o1;
RATSNEST_ITEM* compare = (RATSNEST_ITEM*) o2;
return ref->dist - compare->dist;
return ref->m_Lenght - compare->m_Lenght;
}
/*****************************************************************************/
static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
LISTE_PAD* pt_liste_pad, LISTE_PAD* pt_limite, int* nblinks )
D_PAD** pt_liste_pad, D_PAD** pt_limite, int* nblinks )
/*****************************************************************************/
/**
......@@ -206,10 +213,10 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
{
int dist_min, current_dist;
int current_num_block = 1;
LISTE_PAD* pt_liste_pad_tmp;
LISTE_PAD* pt_liste_pad_aux;
LISTE_PAD* pt_liste_pad_block1 = NULL;
LISTE_PAD* pt_start_liste;
D_PAD** pt_liste_pad_tmp;
D_PAD** pt_liste_pad_aux;
D_PAD** pt_liste_pad_block1 = NULL;
D_PAD** pt_start_liste;
pt_liste_pad_tmp = NULL;
......@@ -278,16 +285,16 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
/* Create the new ratsnet */
(*nblinks)++;
g_pt_chevelu->SetNet( (*pt_liste_pad)->GetNet() );
g_pt_chevelu->status = CH_ACTIF | CH_VISIBLE;
g_pt_chevelu->dist = dist_min;
g_pt_chevelu->pad_start = *pt_liste_pad;
g_pt_chevelu->pad_end = *pt_liste_pad_tmp;
g_pt_chevelu->m_Status = CH_ACTIF | CH_VISIBLE;
g_pt_chevelu->m_Lenght = dist_min;
g_pt_chevelu->m_PadStart = *pt_liste_pad;
g_pt_chevelu->m_PadEnd = *pt_liste_pad_tmp;
if( DisplayRastnestInProgress && DC )
GRLine( &DrawPanel->m_ClipBox, DC, g_pt_chevelu->pad_start->m_Pos.x,
g_pt_chevelu->pad_start->m_Pos.y,
g_pt_chevelu->pad_end->m_Pos.x,
g_pt_chevelu->pad_end->m_Pos.y,
GRLine( &DrawPanel->m_ClipBox, DC, g_pt_chevelu->m_PadStart->m_Pos.x,
g_pt_chevelu->m_PadStart->m_Pos.y,
g_pt_chevelu->m_PadEnd->m_Pos.x,
g_pt_chevelu->m_PadEnd->m_Pos.y,
0, g_DesignSettings.m_RatsnestColor );
g_pt_chevelu++;
......@@ -298,8 +305,8 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
/*****************************************************************************/
static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
LISTE_PAD* pt_liste_pad,
LISTE_PAD* pt_limite, int current_num_block, int* nblinks )
D_PAD** pt_liste_pad,
D_PAD** pt_limite, int current_num_block, int* nblinks )
/*****************************************************************************/
/**
......@@ -325,9 +332,9 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
*/
{
int dist_min, current_dist;
LISTE_PAD* pt_liste_pad_tmp;
LISTE_PAD* pt_liste_pad_aux;
LISTE_PAD* pt_start_liste;
D_PAD** pt_liste_pad_tmp;
D_PAD** pt_liste_pad_aux;
D_PAD** pt_start_liste;
D_PAD* ref_pad, * pad;
pt_start_liste = pt_liste_pad;
......@@ -376,28 +383,28 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
if( (pad->GetSubRatsnest() == 0) && (ref_pad->GetSubRatsnest() == 0) )
{
current_num_block++;
pad->SetSubRatsnest( current_num_block);
ref_pad->SetSubRatsnest( current_num_block);
pad->SetSubRatsnest( current_num_block );
ref_pad->SetSubRatsnest( current_num_block );
}
/* If a pad is already connected connected : merge the other pad in the block */
else
{
ref_pad->SetSubRatsnest( pad->GetSubRatsnest());
ref_pad->SetSubRatsnest( pad->GetSubRatsnest() );
}
(*nblinks)++;
g_pt_chevelu->SetNet( ref_pad->GetNet() );
g_pt_chevelu->status = CH_ACTIF | CH_VISIBLE;
g_pt_chevelu->dist = dist_min;
g_pt_chevelu->pad_start = ref_pad;
g_pt_chevelu->pad_end = pad;
g_pt_chevelu->m_Status = CH_ACTIF | CH_VISIBLE;
g_pt_chevelu->m_Lenght = dist_min;
g_pt_chevelu->m_PadStart = ref_pad;
g_pt_chevelu->m_PadEnd = pad;
if( DisplayRastnestInProgress && DC )
{
GRLine( &DrawPanel->m_ClipBox, DC, g_pt_chevelu->pad_start->m_Pos.x,
g_pt_chevelu->pad_start->m_Pos.y,
g_pt_chevelu->pad_end->m_Pos.x,
g_pt_chevelu->pad_end->m_Pos.y,
GRLine( &DrawPanel->m_ClipBox, DC, g_pt_chevelu->m_PadStart->m_Pos.x,
g_pt_chevelu->m_PadStart->m_Pos.y,
g_pt_chevelu->m_PadEnd->m_Pos.x,
g_pt_chevelu->m_PadEnd->m_Pos.y,
0, g_DesignSettings.m_RatsnestColor );
}
g_pt_chevelu++;
......@@ -438,12 +445,8 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC )
*
*/
{
LISTE_PAD* pt_liste_pad, * pt_start_liste, * pt_end_liste, * pt_liste_pad_limite;
D_PAD* pad;
int num_block, nbpads;
int ii;
CHEVELU* pt_deb_liste_ch;
int current_net_code, noconn;
int noconn;
m_Pcb->m_NbNoconnect = 0;
m_Pcb->m_NbLinks = 0;
......@@ -458,17 +461,14 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC )
/* Created pad list and the net_codes if needed */
if( (m_Pcb->m_Status_Pcb & NET_CODES_OK) == 0 )
recalcule_pad_net_code();
m_Pcb->m_NetInfo->BuildListOfNets();
for( unsigned i=0; i<m_Pcb->m_Pads.size(); ++i )
for( unsigned ii = 0; ii<m_Pcb->m_Pads.size(); ++ii )
{
pad = m_Pcb->m_Pads[i];
pad = m_Pcb->m_Pads[ii];
pad->SetSubRatsnest( 0 );
}
/* Sort the pad list by nets */
qsort( &m_Pcb->m_Pads[0], m_Pcb->m_Pads.size(), sizeof(LISTE_PAD), tri_par_net );
/* Allocate memory for buffer ratsnest: there are nb_nodes - 1 ratsnest
* maximum ( 1 node = 1 active pad ).
* Memory is allocated for nb_nodes ratsnests... (+ a bit more, just in case)
......@@ -477,7 +477,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC )
if( m_Pcb->m_NbNodes == 0 )
return; /* pas de connexions utiles */
m_Pcb->m_Ratsnest = (CHEVELU*) MyZMalloc( (m_Pcb->m_NbNodes + 10 ) * sizeof(CHEVELU) );
m_Pcb->m_Ratsnest = (RATSNEST_ITEM*) MyZMalloc( (m_Pcb->m_NbNodes + 10 ) * sizeof(RATSNEST_ITEM) );
if( m_Pcb->m_Ratsnest == NULL )
return;
......@@ -485,104 +485,63 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC )
DisplayRastnestInProgress = TRUE;
g_pt_chevelu = m_Pcb->m_Ratsnest;
pt_liste_pad = pt_start_liste = &m_Pcb->m_Pads[0];
pt_liste_pad_limite = pt_start_liste + m_Pcb->m_Pads.size();
current_net_code = 1; // 1er net_code a analyser (net_code = 0 -> no connect)
EQUIPOT* equipot = m_Pcb->m_Equipots;
unsigned current_net_code = 1; // 1er net_code a analyser (net_code = 0 -> no connect)
noconn = 0;
for( ; pt_liste_pad < pt_liste_pad_limite; )
{
pt_deb_liste_ch = g_pt_chevelu;
pad = *pt_liste_pad;
/* Skip the not connected pads */
if( pad->GetNet() == 0 )
for( ; current_net_code < m_Pcb->m_NetInfo->GetCount(); current_net_code++ )
{
pt_liste_pad++;
pt_start_liste = pt_liste_pad;
continue;
}
NETINFO_ITEM* net = m_Pcb->FindNet( current_net_code );
net->m_RatsnestStart = g_pt_chevelu;
m_Pcb->m_NbLinks += net->m_ListPad.size() - 1;
/* Search the end of pad list des pads for the current net */
num_block = pad->GetSubRatsnest();
nbpads = 0;
for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ )
int num_block = 0;
for( unsigned ii = 0; ii < net->m_ListPad.size(); ii++ )
{
if( pt_end_liste >= pt_liste_pad_limite )
break;
pad = *pt_end_liste;
if( pad->GetNet() != current_net_code )
break;
nbpads++;
pad = net->m_ListPad[ii];
if( num_block < pad->GetSubRatsnest() )
num_block = pad->GetSubRatsnest();
}
m_Pcb->m_NbLinks += nbpads;
/* Compute the ratsnest relative to the current net */
/* End of list found: Compute the ratsnest relative to the current net "net_code" */
equipot = m_Pcb->FindNet( current_net_code );
if( equipot == NULL )
DisplayError( this, wxT( "Gen ratsnest err: NULL equipot" ) );
else
{
equipot->m_NbNodes = nbpads;
equipot->m_NbLink = nbpads + 1;
equipot->m_PadzoneStart = pt_start_liste;
equipot->m_PadzoneEnd = pt_end_liste;
equipot->m_RatsnestStart = g_pt_chevelu;
}
/* a - first pass : create the blocks from "not in block" pads */
ii = gen_rats_pad_to_pad( DrawPanel, DC, pt_start_liste,
pt_end_liste, num_block, &noconn );
/* a - first pass : create the blocks from not already in block pads */
D_PAD ** pstart = &net->m_ListPad[0];
D_PAD ** pend = pstart + net->m_ListPad.size();
int icnt = gen_rats_pad_to_pad( DrawPanel, DC, pstart, pend,
num_block, &noconn );
/* b - blocks connection (Iteration) */
while( ii > 1 )
while( icnt > 1 )
{
ii = gen_rats_block_to_block( DrawPanel, DC, pt_liste_pad,
pt_end_liste, &noconn );
icnt = gen_rats_block_to_block( DrawPanel, DC, pstart, pend, &noconn );
}
if( equipot )
{
equipot->m_RatsnestEnd = g_pt_chevelu;
net->m_RatsnestEnd = g_pt_chevelu;
/* sort by lenght */
qsort( equipot->m_RatsnestStart,
equipot->m_RatsnestEnd - equipot->m_RatsnestStart,
sizeof(CHEVELU),
qsort( net->m_RatsnestStart,
net->m_RatsnestEnd - net->m_RatsnestStart,
sizeof(RATSNEST_ITEM),
sort_by_length );
}
pt_liste_pad = pt_start_liste = pt_end_liste;
pt_deb_liste_ch = g_pt_chevelu;
if( pt_start_liste < pt_liste_pad_limite )
current_net_code = (*pt_start_liste)->GetNet();
}
m_Pcb->m_NbNoconnect = noconn;
m_Pcb->m_Status_Pcb |= LISTE_CHEVELU_OK;
m_Pcb->m_Status_Pcb |= LISTE_RATSNEST_ITEM_OK;
// erase the ratsnest displayed on screen if needed
CHEVELU* Chevelu = (CHEVELU*) m_Pcb->m_Ratsnest;
if ( DC )
// erase the ratsnest displayed on screen if needed
RATSNEST_ITEM* Chevelu = m_Pcb->m_Ratsnest;
if( DC )
GRSetDrawMode( DC, GR_XOR );
for( ii = m_Pcb->GetNumRatsnests(); ii > 0; ii--, Chevelu++ )
for( int ii = m_Pcb->GetNumRatsnests(); ii > 0 && Chevelu; ii--, Chevelu++ )
{
if( !g_Show_Ratsnest )
Chevelu->status &= ~CH_VISIBLE;
Chevelu->m_Status &= ~CH_VISIBLE;
if( DC )
GRLine( &DrawPanel->m_ClipBox, DC,
Chevelu->pad_start->m_Pos.x, Chevelu->pad_start->m_Pos.y,
Chevelu->pad_end->m_Pos.x, Chevelu->pad_end->m_Pos.y,
Chevelu->m_PadStart->m_Pos.x, Chevelu->m_PadStart->m_Pos.y,
Chevelu->m_PadEnd->m_Pos.x, Chevelu->m_PadEnd->m_Pos.y,
0, g_DesignSettings.m_RatsnestColor );
}
}
......@@ -611,9 +570,9 @@ void WinEDA_BasePcbFrame::DrawGeneralRatsnest( wxDC* DC, int net_code )
*/
{
int ii;
CHEVELU* Chevelu;
RATSNEST_ITEM* Chevelu;
if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
return;
if( (m_Pcb->m_Status_Pcb & DO_NOT_SHOW_GENERAL_RASTNEST) )
return;
......@@ -627,25 +586,23 @@ void WinEDA_BasePcbFrame::DrawGeneralRatsnest( wxDC* DC, int net_code )
GRSetDrawMode( DC, GR_XOR );
for( ii = m_Pcb->GetNumRatsnests(); ii > 0; Chevelu++, ii-- )
{
if( ( Chevelu->status & (CH_VISIBLE | CH_ACTIF) ) != (CH_VISIBLE | CH_ACTIF) )
if( ( Chevelu->m_Status & (CH_VISIBLE | CH_ACTIF) ) != (CH_VISIBLE | CH_ACTIF) )
continue;
if( (net_code <= 0) || (net_code == Chevelu->GetNet()) )
if( (net_code <= 0) || ( net_code == Chevelu->GetNet() ) )
{
GRLine( &DrawPanel->m_ClipBox, DC,
Chevelu->pad_start->m_Pos.x, Chevelu->pad_start->m_Pos.y,
Chevelu->pad_end->m_Pos.x, Chevelu->pad_end->m_Pos.y,
Chevelu->m_PadStart->m_Pos.x, Chevelu->m_PadStart->m_Pos.y,
Chevelu->m_PadEnd->m_Pos.x, Chevelu->m_PadEnd->m_Pos.y,
0, g_DesignSettings.m_RatsnestColor );
}
}
}
/*****************************************************************************/
static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
LISTE_PAD* pt_liste_pad_start, LISTE_PAD* pt_liste_pad_end,
CHEVELU* start_rat_list, CHEVELU* end_rat_list )
/*****************************************************************************/
/**********************************************************************************************/
static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, NETINFO_ITEM* net )
/**********************************************************************************************/
/**
* Function used by Tst_Ratsnest()
......@@ -658,29 +615,25 @@ static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
* The function activate the smallest ratsnest between block 1 and the block n
* (activate a logical connexion)
*
* @param pt_liste_pad_start = adresse de debut de zone pad utile
* pt_liste_pad_end = adresse de fin de zone pad
* start_rat_list = adresse de debut de zone ratsnest utile
* end_rat_list = adresse de fin de zone ratsnest
* @param net = the current NETINFO_ITEM for the current net
* output:
* .state member of the ratsnests
* @return blocks not connected count
*/
{
int current_num_block, min_block;
LISTE_PAD* pt_liste_pad;
CHEVELU* chevelu, * min_chevelu;
RATSNEST_ITEM* chevelu, * min_chevelu;
/* Search a link from a blockto an other block */
/* Search a link from a block to an other block */
min_chevelu = NULL;
for( chevelu = start_rat_list; chevelu < end_rat_list; chevelu++ )
for( chevelu = net->m_RatsnestStart; chevelu < net->m_RatsnestEnd; chevelu++ )
{
if( chevelu->pad_start->GetSubRatsnest() == chevelu->pad_end->GetSubRatsnest() ) // Same block
if( chevelu->m_PadStart->GetSubRatsnest() == chevelu->m_PadEnd->GetSubRatsnest() ) // Same block
continue;
if( min_chevelu == NULL )
min_chevelu = chevelu;
else if( min_chevelu->dist > chevelu->dist )
else if( min_chevelu->m_Lenght > chevelu->m_Lenght )
min_chevelu = chevelu;
}
......@@ -690,19 +643,19 @@ static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
/* At this point we have found a link between 2 differents blocks (clusters) :
* we must set its status to ACTIVE and merge the 2 blocks
*/
min_chevelu->status |= CH_ACTIF;
current_num_block = min_chevelu->pad_start->GetSubRatsnest();
min_block = min_chevelu->pad_end->GetSubRatsnest();
min_chevelu->m_Status |= CH_ACTIF;
current_num_block = min_chevelu->m_PadStart->GetSubRatsnest();
min_block = min_chevelu->m_PadEnd->GetSubRatsnest();
if( min_block > current_num_block )
EXCHG( min_block, current_num_block );
/* Merging the 2 blocks in one cluster */
for( pt_liste_pad = pt_liste_pad_start; pt_liste_pad < pt_liste_pad_end; pt_liste_pad++ )
for( unsigned ii = 0; ii < net->m_ListPad.size(); ii++ )
{
if( (*pt_liste_pad)->GetSubRatsnest() == current_num_block )
if( net->m_ListPad[ii]->GetSubRatsnest() == current_num_block )
{
(*pt_liste_pad)->SetSubRatsnest( min_block);
net->m_ListPad[ii]->SetSubRatsnest( min_block );
}
}
......@@ -713,7 +666,7 @@ static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
/*********************************************************************/
static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
int current_num_block,
CHEVELU* start_rat_list, CHEVELU* end_rat_list )
RATSNEST_ITEM* start_rat_list, RATSNEST_ITEM* end_rat_list )
/**********************************************************************/
/**
......@@ -736,32 +689,32 @@ static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC,
*/
{
D_PAD* pad_start, * pad_end;
CHEVELU* chevelu;
RATSNEST_ITEM* chevelu;
for( chevelu = start_rat_list; chevelu < end_rat_list; chevelu++ )
{
pad_start = chevelu->pad_start;
pad_end = chevelu->pad_end;
pad_start = chevelu->m_PadStart;
pad_end = chevelu->m_PadEnd;
/* Update the block if the 2 pads are not connected : a new block is created
*/
if( (pad_start->GetSubRatsnest() == 0) && (pad_end->GetSubRatsnest() == 0) )
{
current_num_block++;
pad_start->SetSubRatsnest( current_num_block);
pad_end->SetSubRatsnest( current_num_block);
chevelu->status |= CH_ACTIF;
pad_start->SetSubRatsnest( current_num_block );
pad_end->SetSubRatsnest( current_num_block );
chevelu->m_Status |= CH_ACTIF;
}
/* If a pad is already connected : the other is merged in the current block */
else if( pad_start->GetSubRatsnest() == 0 )
{
pad_start->SetSubRatsnest( pad_end->GetSubRatsnest() );
chevelu->status |= CH_ACTIF;
chevelu->m_Status |= CH_ACTIF;
}
else if( pad_end->GetSubRatsnest() == 0 )
{
pad_end->SetSubRatsnest( pad_start->GetSubRatsnest() );
chevelu->status |= CH_ACTIF;
chevelu->m_Status |= CH_ACTIF;
}
}
......@@ -776,59 +729,58 @@ void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode )
/* Compute the active ratsnest
* The general ratsnest list must exists
* Compute the ACTIVE ratsnests in the general ratsnest list
* if ref_netcode == 0, test all nets, else test only ref_netcode
*/
{
LISTE_PAD* pt_liste_pad;
CHEVELU* chevelu;
RATSNEST_ITEM* chevelu;
D_PAD* pad;
int ii, num_block;
int net_code;
EQUIPOT* equipot;
NETINFO_ITEM* net;
if( m_Pcb->m_Pads.size() == 0 )
return;
if ( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
Build_Board_Ratsnest( DC );
for( net_code = 1; ; net_code++ )
{
equipot = m_Pcb->FindNet( net_code );
if( equipot == NULL )
net = m_Pcb->FindNet( net_code );
if( net == NULL )
break;
if( ref_netcode && (net_code != ref_netcode) )
continue;
num_block = 0;
pt_liste_pad = equipot->m_PadzoneStart;
for( ; pt_liste_pad < equipot->m_PadzoneEnd; pt_liste_pad++ )
int num_block = 0;
for( unsigned ip = 0; ip < net->m_ListPad.size(); ip++ )
{
pad = *pt_liste_pad;
pad->SetSubRatsnest( pad->GetSubNet() );
num_block = MAX( num_block, pad->GetSubRatsnest() );
pad = net->m_ListPad[ip];
int subnet = pad->GetSubNet();
pad->SetSubRatsnest( subnet );
num_block = MAX( num_block, subnet );
}
for( chevelu = equipot->m_RatsnestStart; chevelu < equipot->m_RatsnestEnd; chevelu++ )
for( chevelu = net->m_RatsnestStart; chevelu < net->m_RatsnestEnd; chevelu++ )
{
chevelu->status &= ~CH_ACTIF;
chevelu->m_Status &= ~CH_ACTIF;
}
/* a - tst connection between pads */
ii = tst_rats_pad_to_pad( DrawPanel, DC, num_block,
equipot->m_RatsnestStart, equipot->m_RatsnestEnd );
int ii = tst_rats_pad_to_pad( DrawPanel, DC, num_block,
net->m_RatsnestStart, net->m_RatsnestEnd );
/* b - test connexion between blocks (Iteration) */
while( ii > 1 )
{
ii = tst_rats_block_to_block( DrawPanel, DC,
equipot->m_PadzoneStart, equipot->m_PadzoneEnd,
equipot->m_RatsnestStart, equipot->m_RatsnestEnd );
ii = tst_rats_block_to_block( DrawPanel, DC, net );
}
}
m_Pcb->m_NbNoconnect = 0;
CHEVELU* Chevelu = m_Pcb->m_Ratsnest;
for( ii = m_Pcb->GetNumRatsnests(); ii > 0; ii--, Chevelu++ )
RATSNEST_ITEM* Chevelu = m_Pcb->m_Ratsnest;
for( int ii = m_Pcb->GetNumRatsnests(); ii > 0; ii--, Chevelu++ )
{
if( Chevelu->status & CH_ACTIF )
if( Chevelu->m_Status & CH_ACTIF )
m_Pcb->m_NbNoconnect++;
}
}
......@@ -852,167 +804,6 @@ int WinEDA_BasePcbFrame::Test_1_Net_Ratsnest( wxDC* DC, int ref_netcode )
}
/*****************************************************/
void WinEDA_BasePcbFrame::recalcule_pad_net_code()
/*****************************************************/
/**
* Compute and update the net_codes for PADS et and equipots (.m_NetCode member)
* net_codes are >= 1 (net_code = 0 means not connected)
* Update the equipotents buffer
* Must be called after editing pads (netname, or deleting) or after read a netlist
* set to 1 flag NET_CODE_OK of m_Pcb->m_Status_Pcb;
* m_Pcb->m_NbNodes and m_Pcb->m_NbNets are updated
*/
{
LISTE_PAD* pad_ref, * pad_courant;
int ii;
EQUIPOT** BufPtEquipot;
/* Build the PAD list */
build_liste_pads();
/* calcul des net_codes des pads */
ii = m_Pcb->m_Pads.size();
m_Pcb->m_NbNodes = 0;
int netcode = 0;
/* search for differents netnames, and create a netcode for each netname */
pad_courant = &m_Pcb->m_Pads[0];
for( ; ii > 0; pad_courant++, ii-- )
{
if( (*pad_courant)->GetNetname().IsEmpty() ) // pad not connected
{
(*pad_courant)->SetNet( 0 );
continue;
}
m_Pcb->m_NbNodes++;
/* if the current netname was already found: use the current net_code , else create a new net_code */
pad_ref = &m_Pcb->m_Pads[0];
while( pad_ref < pad_courant )
{
if( (*pad_ref)->GetNetname() == (*pad_courant)->GetNetname() )
break; // sont du meme met
pad_ref++;
}
/* if pad_ref != pad_courant we have found 2 pads on the same net., Use the current net_code for pad_courant
* if pad_ref == pad_courant: new net found (end of list reached) without other pad found on the same net:
* we must create a new net_code
*/
if( pad_ref == pad_courant ) // create a new net_code
{
netcode++;
(*pad_courant)->SetNet( netcode );
}
else // Use the current net_code for pad_courant
(*pad_courant)->SetNet( (*pad_ref)->GetNet() );
}
/* Build or update the equipotent list: we reuse the old list */
BufPtEquipot = (EQUIPOT**) MyMalloc( sizeof(EQUIPOT*) * (netcode + 1) );
EQUIPOT* equipot = m_Pcb->m_Equipots;
for( ii = 0; ii<= netcode; equipot = equipot->Next(), ++ii )
{
if( equipot == NULL ) /* Create a new equipot if no more equipot in old list */
{
equipot = new EQUIPOT( m_Pcb );
m_Pcb->Add( equipot, ADD_APPEND );
}
// Set the net_code for this equipot and reset other values
equipot->SetNet(ii);
equipot->m_NbNodes = 0;
equipot->SetNetname(wxEmptyString);
BufPtEquipot[ii] = equipot;
}
/* Delete the unused equipots in the old list */
while( equipot )
{
EQUIPOT* next =equipot->Next();
equipot->DeleteStructure();
equipot = next;
}
pad_courant = &m_Pcb->m_Pads[0];
equipot = m_Pcb->m_Equipots;
/* Set the equpot net name and node count for each equipot in equipot list */
for( ii = m_Pcb->m_Pads.size(); ii > 0; pad_courant++, ii-- )
{
int net = (*pad_courant)->GetNet();
equipot = BufPtEquipot[net];
equipot->m_NbNodes++;
if( equipot->GetNetname().IsEmpty() )
{
equipot->SetNetname((*pad_courant)->GetNetname());
}
}
MyFree( BufPtEquipot );
m_Pcb->m_Status_Pcb |= NET_CODES_OK;
m_Pcb->SetAreasNetCodesFromNetNames();
}
/***********************************************/
void WinEDA_BasePcbFrame::build_liste_pads()
/***********************************************/
/*
* Create the pad list
* initialise:
* m_Pcb->m_Pads (list of pads)
* m_Pcb->m_NbNodes = node count
* set m_Pcb->m_Status_Pcb = LISTE_PAD_OK;
* and clear for all pad their m_SubRatsnest member;
* delete ( free memory) m_Pcb->m_Ratsnest and set m_Pcb->m_Ratsnest to NULL
*/
{
if( m_Pcb->m_Status_Pcb & LISTE_PAD_OK )
return;
// empty the old list
m_Pcb->m_Pads.clear();
m_Pcb->m_NbNodes = 0;
/* Clear variables used in rastnest computation */
for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() )
{
for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() )
{
m_Pcb->m_Pads.push_back( pad );
pad->SetSubRatsnest( 0 );
pad->SetParent( module );
if( pad->GetNet() )
m_Pcb->m_NbNodes++;
}
}
if( m_Pcb->m_Ratsnest )
{
MyFree( m_Pcb->m_Ratsnest );
m_Pcb->m_Ratsnest = NULL;
}
m_Pcb->m_Status_Pcb = LISTE_PAD_OK;
}
/*****************************************************************************/
char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
/*****************************************************************************/
......@@ -1032,35 +823,37 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
* The ratsnest section must be computed for each new position
*/
{
LISTE_PAD* pt_liste_pad;
LISTE_PAD* pt_liste_ref;
LISTE_PAD* pt_liste_generale;
D_PAD** pt_liste_pad;
D_PAD** pt_liste_ref;
D_PAD** pt_liste_generale;
D_PAD* pad_ref;
D_PAD* pad_externe;
LISTE_PAD* pt_liste_pad_limite;
LISTE_PAD* pt_start_liste;
LISTE_PAD* pt_end_liste;
D_PAD** pt_liste_pad_limite;
D_PAD** pt_start_liste;
D_PAD** pt_end_liste;
int ii, jj;
CHEVELU* local_chevelu;
static CHEVELU* pt_fin_int_chevelu; // End list for "internal" ratsnest
RATSNEST_ITEM* local_chevelu;
static RATSNEST_ITEM* pt_fin_int_chevelu; // End list for "internal" ratsnest
static int nb_int_chevelu; // "internal" ratsnest count
int current_net_code;
int increment, distance; // variables de calcul de ratsnest
int pad_pos_X, pad_pos_Y; // True pad position according to the current footprint position
if( (m_Pcb->m_Status_Pcb & LISTE_PAD_OK) == 0 )
build_liste_pads();
if( (GetBoard()->m_Status_Pcb & LISTE_PAD_OK) == 0 )
{
GetBoard()->Build_Pads_Full_List();
}
/* Compute the "local" ratsnest if needed (when this footprint starts move)
and the list of external pads to consider, i.e pads in others footprints which are "connected" to
a pad in the current footprint
* and the list of external pads to consider, i.e pads in others footprints which are "connected" to
* a pad in the current footprint
*/
if( (m_Pcb->m_Status_Pcb & CHEVELU_LOCAL_OK) != 0 )
if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) != 0 )
goto calcul_chevelu_ext;
/* Compute the "internal" ratsnest, i.e the links beteween the curent footprint pads */
pt_liste_pad = (LISTE_PAD*) adr_lowmem;
/* Compute the "internal" ratsnest, i.e the links between the curent footprint pads */
pt_liste_pad = (D_PAD**) adr_lowmem;
nb_pads_ref = 0;
pad_ref = Module->m_Pads;
......@@ -1080,9 +873,9 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
qsort( adr_lowmem, nb_pads_ref, sizeof(D_PAD*), tri_par_net );
/* Build the list of pads linked to the current ffotprint pads */
/* Build the list of pads linked to the current footprint pads */
DisplayRastnestInProgress = FALSE;
pt_liste_ref = (LISTE_PAD*) adr_lowmem;
pt_liste_ref = (D_PAD**) adr_lowmem;
nb_pads_externes = 0;
current_net_code = 0;
......@@ -1104,7 +897,7 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
if( pad_externe->GetParent() == Module )
continue;
pad_externe->SetSubRatsnest(0);
pad_externe->SetSubRatsnest( 0 );
pad_externe->SetSubNet( 0 );
*pt_liste_pad = pad_externe;
......@@ -1122,12 +915,12 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
* this is the same as general ratsnest, but considers only the current footprint pads
* it is therefore not time consuming, and it is made only once
*/
local_liste_chevelu = (CHEVELU*) pt_liste_pad; // buffer chevelu a la suite de la liste des pads
local_liste_chevelu = (RATSNEST_ITEM*) pt_liste_pad; // buffer chevelu a la suite de la liste des pads
nb_local_chevelu = 0;
pt_liste_ref = (LISTE_PAD*) adr_lowmem;
pt_liste_ref = (D_PAD**) adr_lowmem;
g_pt_chevelu = local_liste_chevelu;
pt_liste_pad = pt_start_liste = (LISTE_PAD*) adr_lowmem;
pt_liste_pad = pt_start_liste = (D_PAD**) adr_lowmem;
pt_liste_pad_limite = pt_liste_pad + nb_pads_ref;
......@@ -1151,7 +944,7 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
ii = gen_rats_pad_to_pad( DrawPanel, DC, pt_start_liste, pt_end_liste,
0, &nb_local_chevelu );
/* b - secon step of lee algorithm : build the block to block link list (Iteration) */
/* b - second step of lee algorithm : build the block to block link list (Iteration) */
while( ii > 1 )
{
ii = gen_rats_block_to_block( DrawPanel, DC, pt_liste_pad,
......@@ -1166,17 +959,17 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module )
pt_fin_int_chevelu = local_chevelu = g_pt_chevelu;
nb_int_chevelu = nb_local_chevelu;
/* set the ratsnets status, flag LOCAL_CHEVELU */
/* set the ratsnets status, flag LOCAL_RATSNEST_ITEM */
g_pt_chevelu = local_liste_chevelu;
while( g_pt_chevelu < pt_fin_int_chevelu )
{
g_pt_chevelu->status = LOCAL_CHEVELU; g_pt_chevelu++;
g_pt_chevelu->m_Status = LOCAL_RATSNEST_ITEM; g_pt_chevelu++;
}
m_Pcb->m_Status_Pcb |= CHEVELU_LOCAL_OK;
m_Pcb->m_Status_Pcb |= RATSNEST_ITEM_LOCAL_OK;
/*
This section computes the "external" ratsnest: must be done when the footprint position changes
* This section computes the "external" ratsnest: must be done when the footprint position changes
*/
calcul_chevelu_ext:
......@@ -1187,12 +980,12 @@ calcul_chevelu_ext:
*/
local_chevelu = pt_fin_int_chevelu;
nb_local_chevelu = nb_int_chevelu;
pt_liste_ref = (LISTE_PAD*) adr_lowmem;
pt_liste_ref = (D_PAD**) adr_lowmem;
pad_ref = *pt_liste_ref;
current_net_code = pad_ref->GetNet();
local_chevelu->dist = 0x7FFFFFFF;
local_chevelu->status = 0;
local_chevelu->m_Lenght = 0x7FFFFFFF;
local_chevelu->m_Status = 0;
increment = 0;
for( ii = 0; ii < nb_pads_ref; ii++ )
{
......@@ -1206,7 +999,7 @@ calcul_chevelu_ext:
}
increment = 0;
current_net_code = pad_ref->GetNet();
local_chevelu->dist = 0x7FFFFFFF;
local_chevelu->m_Lenght = 0x7FFFFFFF;
}
pad_pos_X = pad_ref->m_Pos.x - g_Offset_Module.x;
......@@ -1227,13 +1020,13 @@ calcul_chevelu_ext:
distance = abs( pad_externe->m_Pos.x - pad_pos_X ) +
abs( pad_externe->m_Pos.y - pad_pos_Y );
if( distance < local_chevelu->dist )
if( distance < local_chevelu->m_Lenght )
{
local_chevelu->pad_start = pad_ref;
local_chevelu->pad_end = pad_externe;
local_chevelu->m_PadStart = pad_ref;
local_chevelu->m_PadEnd = pad_externe;
local_chevelu->SetNet( pad_ref->GetNet() );
local_chevelu->dist = distance;
local_chevelu->status = 0;
local_chevelu->m_Lenght = distance;
local_chevelu->m_Status = 0;
increment = 1;
}
......@@ -1246,8 +1039,8 @@ calcul_chevelu_ext:
local_chevelu++;
}
return (char*) (local_chevelu + 1); /* the struct pointed by local_chevelu is used
in temporary computations, so we skip it
return (char*)(local_chevelu + 1); /* the struct pointed by local_chevelu is used
* in temporary computations, so we skip it
*/
}
......@@ -1260,12 +1053,12 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC )
* Display the rastnest of a moving footprint, computed by build_ratsnest_module()
*/
{
CHEVELU* local_chevelu;
RATSNEST_ITEM* local_chevelu;
int ii;
if ( DC == NULL )
if( DC == NULL )
return;
if( (m_Pcb->m_Status_Pcb & CHEVELU_LOCAL_OK) == 0 )
if( (m_Pcb->m_Status_Pcb & RATSNEST_ITEM_LOCAL_OK) == 0 )
return;
local_chevelu = local_liste_chevelu;
......@@ -1275,22 +1068,22 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC )
while( ii-- > 0 )
{
if( local_chevelu->status & LOCAL_CHEVELU )
if( local_chevelu->m_Status & LOCAL_RATSNEST_ITEM )
{
GRLine( &DrawPanel->m_ClipBox, DC,
local_chevelu->pad_start->m_Pos.x - g_Offset_Module.x,
local_chevelu->pad_start->m_Pos.y - g_Offset_Module.y,
local_chevelu->pad_end->m_Pos.x - g_Offset_Module.x,
local_chevelu->pad_end->m_Pos.y - g_Offset_Module.y,
local_chevelu->m_PadStart->m_Pos.x - g_Offset_Module.x,
local_chevelu->m_PadStart->m_Pos.y - g_Offset_Module.y,
local_chevelu->m_PadEnd->m_Pos.x - g_Offset_Module.x,
local_chevelu->m_PadEnd->m_Pos.y - g_Offset_Module.y,
0, YELLOW );
}
else
{
GRLine( &DrawPanel->m_ClipBox, DC,
local_chevelu->pad_start->m_Pos.x - g_Offset_Module.x,
local_chevelu->pad_start->m_Pos.y - g_Offset_Module.y,
local_chevelu->pad_end->m_Pos.x,
local_chevelu->pad_end->m_Pos.y,
local_chevelu->m_PadStart->m_Pos.x - g_Offset_Module.x,
local_chevelu->m_PadStart->m_Pos.y - g_Offset_Module.y,
local_chevelu->m_PadEnd->m_Pos.x,
local_chevelu->m_PadEnd->m_Pos.y,
0, g_DesignSettings.m_RatsnestColor );
}
local_chevelu++;
......@@ -1298,10 +1091,6 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC )
}
/*********************************************************************************************/
/* int * WinEDA_BasePcbFrame::build_ratsnest_pad(D_PAD * pad_ref, const wxPoint & refpos) */
/*********************************************************************************************/
/**
* construction de la liste en mode de calcul rapide pour affichage
* en temps reel du chevelu d'un pad lors des tracés d'une piste démarrant
......@@ -1316,7 +1105,7 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC )
* retourne: adresse memoire disponible
*/
/* Used by build_ratsnest_pad(): sort function by link lenght (manathann distance)*/
/* Used by build_ratsnest_pad(): sort function by link lenght (manathan distance)*/
static int sort_by_localnetlength( const void* o1, const void* o2 )
{
int* ref = (int*) o1;
......@@ -1350,10 +1139,10 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref,
int ii;
int* pt_coord, * base_data;
int current_net_code = 0, conn_number = 0;
LISTE_PAD* padlist;
D_PAD** padlist;
D_PAD* pad_ref = NULL;
if( ( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( ( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
|| ( (m_Pcb->m_Status_Pcb & LISTE_PAD_OK) == 0 ) )
{
nb_local_chevelu = 0;
......@@ -1362,7 +1151,7 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref,
base_data = pt_coord = (int*) adr_lowmem;
local_liste_chevelu = (CHEVELU*) pt_coord;
local_liste_chevelu = (RATSNEST_ITEM*) pt_coord;
if( init )
{
nb_local_chevelu = 0;
......@@ -1417,7 +1206,6 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref,
}
}
} /* end if Init */
else if( nb_local_chevelu )
{
*pt_coord = refpos.x;
......@@ -1442,10 +1230,10 @@ void WinEDA_BasePcbFrame::trace_ratsnest_pad( wxDC* DC )
int ii;
int refX, refY;
if ( DC == NULL )
if( DC == NULL )
return;
if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
if( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 )
return;
if( nb_local_chevelu == 0 )
......
......@@ -191,9 +191,9 @@ void Out_Pads( BOARD* Pcb, FILE* outfile )
if( nb_pads < 2 )
{
wxString Line;
EQUIPOT* equipot = Pcb->FindNet( netcode );
NETINFO_ITEM* net = Pcb->FindNet( netcode );
Line.Printf( wxT( "Warning: %d pad, net %s" ),
nb_pads, equipot->GetNetname().GetData() );
nb_pads, net->GetNetname().GetData() );
DisplayError( NULL, Line, 20 );
}
fprintf( outfile, "r %d %d %d %d %d %d 1 1\n",
......
......@@ -21,7 +21,7 @@
/* Routines definies ici : */
static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC, int two_sides, int row_source,
int col_source,
int row_target, int col_target, CHEVELU* pt_chevelu );
int row_target, int col_target, RATSNEST_ITEM* pt_chevelu );
static int Retrace( WinEDA_PcbFrame* pcbframe, wxDC* DC, int, int, int, int, int, int net_code );
static void OrCell_Trace( BOARD* pcb, int col, int row, int side, int orient, int current_net_code );
static void Place_Piste_en_Buffer( WinEDA_PcbFrame* pcbframe, wxDC* DC );
......@@ -29,7 +29,7 @@ static void Place_Piste_en_Buffer( WinEDA_PcbFrame* pcbframe, wxDC* DC );
/* Variables locales : */
static int segm_oX, segm_oY;
static int segm_fX, segm_fY; /* Origine et fin de la piste en cours de trace */
static CHEVELU* pt_cur_ch;
static RATSNEST_ITEM* pt_cur_ch;
static int Ncurrent; /* measures of progress */
......@@ -212,7 +212,7 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
int current_net_code;
int row_source, col_source, row_target, col_target;
int success, nbsucces = 0, nbunsucces = 0;
EQUIPOT* pt_equipot;
NETINFO_ITEM* net;
bool stop = FALSE;
wxString msg;
......@@ -248,10 +248,10 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
}
Ncurrent++;
pt_equipot = GetBoard()->FindNet( current_net_code );
if( pt_equipot )
net = GetBoard()->FindNet( current_net_code );
if( net )
{
msg.Printf( wxT( "[%8.8s]" ), pt_equipot->GetNetname().GetData() );
msg.Printf( wxT( "[%8.8s]" ), net->GetNetname().GetData() );
Affiche_1_Parametre( this, 1, wxT( "Net route" ), msg, BROWN );
msg.Printf( wxT( "%d / %d" ), Ncurrent, Ntotal );
Affiche_1_Parametre( this, 12, wxT( "Activity" ), msg, BROWN );
......@@ -265,8 +265,8 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
/* Affiche Liaison */
GRLine( &DrawPanel->m_ClipBox, DC, segm_oX, segm_oY, segm_fX, segm_fY, 0, WHITE | GR_XOR );
pt_cur_ch->pad_start->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
pt_cur_ch->pad_end->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
pt_cur_ch->m_PadStart->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
pt_cur_ch->m_PadEnd->Draw( DrawPanel, DC, GR_OR | GR_SURBRILL );
success = Autoroute_One_Track( this, DC, two_sides, row_source, col_source,
row_target, col_target, pt_cur_ch );
......@@ -274,7 +274,7 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
switch( success )
{
case NOSUCCESS:
pt_cur_ch->status |= CH_UNROUTABLE;
pt_cur_ch->m_Status |= CH_UNROUTABLE;
nbunsucces++;
break;
......@@ -299,8 +299,8 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
Affiche_1_Parametre( this, 38, wxT( "NoConn" ), msg, CYAN );
/* Effacement des affichages de routage sur l'ecran */
pt_cur_ch->pad_start->Draw( DrawPanel, DC, GR_AND );
pt_cur_ch->pad_end->Draw( DrawPanel, DC, GR_AND );
pt_cur_ch->m_PadStart->Draw( DrawPanel, DC, GR_AND );
pt_cur_ch->m_PadEnd->Draw( DrawPanel, DC, GR_AND );
if( stop )
break;
......@@ -315,7 +315,7 @@ int WinEDA_PcbFrame::Solve( wxDC* DC, int two_sides )
/**********************************************************************************/
static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
int two_sides, int row_source, int col_source,
int row_target, int col_target, CHEVELU* pt_chevelu )
int row_target, int col_target, RATSNEST_ITEM* pt_chevelu )
/**********************************************************************************/
/* Route une piste du BOARD.
......@@ -374,8 +374,8 @@ static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
pt_cur_ch = pt_chevelu;
current_net_code = pt_chevelu->GetNet();
pad_masque_layer_s = pt_cur_ch->pad_start->m_Masque_Layer;
pad_masque_layer_e = pt_cur_ch->pad_end->m_Masque_Layer;
pad_masque_layer_s = pt_cur_ch->m_PadStart->m_Masque_Layer;
pad_masque_layer_e = pt_cur_ch->m_PadEnd->m_Masque_Layer;
/* Test 1 Si routage possible c.a.d si les pads sont accessibles
* sur les couches de routage */
......@@ -390,23 +390,23 @@ static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
{
int cX = (g_GridRoutingSize * col_source) + pcbframe->GetBoard()->m_BoundaryBox.m_Pos.x;
int cY = (g_GridRoutingSize * row_source) + pcbframe->GetBoard()->m_BoundaryBox.m_Pos.y;
int dx = pt_cur_ch->pad_start->m_Size.x / 2;
int dy = pt_cur_ch->pad_start->m_Size.y / 2;
int px = pt_cur_ch->pad_start->GetPosition().x;
int py = pt_cur_ch->pad_start->GetPosition().y;
int dx = pt_cur_ch->m_PadStart->m_Size.x / 2;
int dy = pt_cur_ch->m_PadStart->m_Size.y / 2;
int px = pt_cur_ch->m_PadStart->GetPosition().x;
int py = pt_cur_ch->m_PadStart->GetPosition().y;
if( ( (pt_cur_ch->pad_start->m_Orient / 900) & 1 ) != 0 )
if( ( (pt_cur_ch->m_PadStart->m_Orient / 900) & 1 ) != 0 )
EXCHG( dx, dy );
if( (abs( cX - px ) > dx ) || (abs( cY - py ) > dy) )
goto end_of_route;
cX = (g_GridRoutingSize * col_target) + pcbframe->GetBoard()->m_BoundaryBox.m_Pos.x;
cY = (g_GridRoutingSize * row_target) + pcbframe->GetBoard()->m_BoundaryBox.m_Pos.y;
dx = pt_cur_ch->pad_end->m_Size.x / 2;
dy = pt_cur_ch->pad_end->m_Size.y / 2;
px = pt_cur_ch->pad_end->GetPosition().x;
py = pt_cur_ch->pad_end->GetPosition().y;
if( ( (pt_cur_ch->pad_end->m_Orient / 900) & 1 ) != 0 )
dx = pt_cur_ch->m_PadEnd->m_Size.x / 2;
dy = pt_cur_ch->m_PadEnd->m_Size.y / 2;
px = pt_cur_ch->m_PadEnd->GetPosition().x;
py = pt_cur_ch->m_PadEnd->GetPosition().y;
if( ( (pt_cur_ch->m_PadEnd->m_Orient / 900) & 1 ) != 0 )
EXCHG( dx, dy );
if( (abs( cX - px ) > dx ) || (abs( cY - py ) > dy) )
......@@ -427,8 +427,8 @@ static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
pcbframe->Affiche_Message( wxT( "Gen Cells" ) );
Place_1_Pad_Board(
pcbframe->GetBoard(), pt_cur_ch->pad_start, CURRENT_PAD, marge, WRITE_OR_CELL );
Place_1_Pad_Board( pcbframe->GetBoard(), pt_cur_ch->pad_end, CURRENT_PAD, marge, WRITE_OR_CELL );
pcbframe->GetBoard(), pt_cur_ch->m_PadStart, CURRENT_PAD, marge, WRITE_OR_CELL );
Place_1_Pad_Board( pcbframe->GetBoard(), pt_cur_ch->m_PadEnd, CURRENT_PAD, marge, WRITE_OR_CELL );
/* Regenere les barrieres restantes (qui peuvent empieter sur le placement
* des bits precedents) */
......@@ -436,7 +436,7 @@ static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
i = pcbframe->GetBoard()->m_Pads.size();
for( ; i > 0; i--, ptr++ )
{
if( (pt_cur_ch->pad_start != *ptr) && (pt_cur_ch->pad_end != *ptr) )
if( (pt_cur_ch->m_PadStart != *ptr) && (pt_cur_ch->m_PadEnd != *ptr) )
{
Place_1_Pad_Board( pcbframe->GetBoard(), *ptr, ~CURRENT_PAD, marge, WRITE_AND_CELL );
}
......@@ -697,9 +697,9 @@ static int Autoroute_One_Track( WinEDA_PcbFrame* pcbframe, wxDC* DC,
end_of_route:
Place_1_Pad_Board(
pcbframe->GetBoard(), pt_cur_ch->pad_start, ~CURRENT_PAD, marge, WRITE_AND_CELL );
pcbframe->GetBoard(), pt_cur_ch->m_PadStart, ~CURRENT_PAD, marge, WRITE_AND_CELL );
Place_1_Pad_Board(
pcbframe->GetBoard(), pt_cur_ch->pad_end, ~CURRENT_PAD, marge, WRITE_AND_CELL );
pcbframe->GetBoard(), pt_cur_ch->m_PadEnd, ~CURRENT_PAD, marge, WRITE_AND_CELL );
AFFICHE_ACTIVITE_ROUTE;
......@@ -982,17 +982,17 @@ static void OrCell_Trace( BOARD* pcb, int col, int row,
dx1 = g_CurrentTrackSegment->m_End.x - g_CurrentTrackSegment->m_Start.x;
dy1 = g_CurrentTrackSegment->m_End.y - g_CurrentTrackSegment->m_Start.y;
dx0 = pt_cur_ch->pad_end->GetPosition().x - g_CurrentTrackSegment->m_Start.x;
dy0 = pt_cur_ch->pad_end->GetPosition().y - g_CurrentTrackSegment->m_Start.y;
dx0 = pt_cur_ch->m_PadEnd->GetPosition().x - g_CurrentTrackSegment->m_Start.x;
dy0 = pt_cur_ch->m_PadEnd->GetPosition().y - g_CurrentTrackSegment->m_Start.y;
/* si aligne: modif du point origine */
if( abs( dx0 * dy1 ) == abs( dx1 * dy0 ) ) /* Alignes ! */
{
g_CurrentTrackSegment->m_Start = pt_cur_ch->pad_end->GetPosition();
g_CurrentTrackSegment->m_Start = pt_cur_ch->m_PadEnd->GetPosition();
}
else // Creation of a supplemental segment
{
g_CurrentTrackSegment->m_Start = pt_cur_ch->pad_end->GetPosition();
g_CurrentTrackSegment->m_Start = pt_cur_ch->m_PadEnd->GetPosition();
newTrack = g_CurrentTrackSegment->Copy();
newTrack->m_Start = g_CurrentTrackSegment->m_End;
......@@ -1058,19 +1058,19 @@ static void Place_Piste_en_Buffer( WinEDA_PcbFrame* pcbframe, wxDC* DC )
dy1 = g_CurrentTrackSegment->m_End.y - g_CurrentTrackSegment->m_Start.y;
/* Replacement sur le centre du pad si hors grille */
dx0 = pt_cur_ch->pad_start->GetPosition().x - g_CurrentTrackSegment->m_Start.x;
dy0 = pt_cur_ch->pad_start->GetPosition().y - g_CurrentTrackSegment->m_Start.y;
dx0 = pt_cur_ch->m_PadStart->GetPosition().x - g_CurrentTrackSegment->m_Start.x;
dy0 = pt_cur_ch->m_PadStart->GetPosition().y - g_CurrentTrackSegment->m_Start.y;
/* si aligne: modif du point origine */
if( abs( dx0 * dy1 ) == abs( dx1 * dy0 ) ) /* Alignes ! */
{
g_CurrentTrackSegment->m_End = pt_cur_ch->pad_start->GetPosition();
g_CurrentTrackSegment->m_End = pt_cur_ch->m_PadStart->GetPosition();
}
else /* Creation d'un segment suppl raccord */
{
TRACK* newTrack = g_CurrentTrackSegment->Copy();
newTrack->m_End = pt_cur_ch->pad_start->GetPosition();
newTrack->m_End = pt_cur_ch->m_PadStart->GetPosition();
newTrack->m_Start = g_CurrentTrackSegment->m_End;
g_CurrentTrackList.PushBack( newTrack );
......
......@@ -1112,9 +1112,9 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError )
// find the highest numbered netCode within the board.
int highestNetCode = -1;
for( EQUIPOT* equipot = aBoard->m_Equipots; equipot; equipot = equipot->Next() )
highestNetCode = MAX( highestNetCode, equipot->GetNet() );
// for( EQUIPOT* equipot = aBoard->m_Equipots; equipot; equipot = equipot->Next() )
// highestNetCode = MAX( highestNetCode, equipot->GetNet() );
highestNetCode = aBoard->m_NetInfo->GetCount() - 1;
deleteNETs();
// expand the net vector to highestNetCode+1, setting empty to NULL
......@@ -1124,11 +1124,12 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError )
for( unsigned i=1; i<nets.size(); ++i )
nets[i] = new NET( pcb->network );
for( EQUIPOT* equipot = aBoard->m_Equipots; equipot; equipot = equipot->Next() )
for( unsigned ii = 0; ii < aBoard->m_NetInfo->GetCount(); ii++ )
{
int netcode = equipot->GetNet();
NETINFO_ITEM* net = aBoard->m_NetInfo->GetItem(ii);
int netcode = net->GetNet();
if( netcode > 0 )
nets[ netcode ]->net_id = CONV_TO_UTF8( equipot->GetNetname() );
nets[ netcode ]->net_id = CONV_TO_UTF8( net->GetNetname() );
}
items.Collect( aBoard, scanMODULEs );
......@@ -1303,9 +1304,9 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError )
if( old_netcode != netcode )
{
old_netcode = netcode;
EQUIPOT* equipot = aBoard->FindNet( netcode );
wxASSERT( equipot );
netname = CONV_TO_UTF8( equipot->GetNetname() );
NETINFO_ITEM* net = aBoard->FindNet( netcode );
wxASSERT( net );
netname = CONV_TO_UTF8( net->GetNetname() );
}
WIRE* wire = new WIRE( wiring );
......@@ -1364,10 +1365,10 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IOError )
dsnVia->padstack_id = registered->padstack_id;
dsnVia->vertexes.push_back( mapPt( via->GetPosition() ) );
EQUIPOT* equipot = aBoard->FindNet( netcode );
wxASSERT( equipot );
NETINFO_ITEM* net = aBoard->FindNet( netcode );
wxASSERT( net );
dsnVia->net_id = CONV_TO_UTF8( equipot->GetNetname() );
dsnVia->net_id = CONV_TO_UTF8( net->GetNetname() );
dsnVia->via_type = T_protect; // @todo, this should be configurable
}
......
......@@ -447,9 +447,9 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
{
wxString netName = CONV_FROM_UTF8( net->net_id.c_str() );
EQUIPOT* equipot = aBoard->FindNet( netName );
if( equipot )
netCode = equipot->GetNet();
NETINFO_ITEM* net = aBoard->FindNet( netName );
if( net )
netCode = net->GetNet();
else // else netCode remains 0
{
// int breakhere = 1;
......@@ -508,9 +508,9 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
{
wxString netName = CONV_FROM_UTF8( net->net_id.c_str() );
EQUIPOT* equipot = aBoard->FindNet( netName );
if( equipot )
netCode = equipot->GetNet();
NETINFO_ITEM* net = aBoard->FindNet( netName );
if( net )
netCode = net->GetNet();
// else netCode remains 0
}
......
......@@ -24,10 +24,10 @@ void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event )
* if an equipot is selected the corresponding tracks and pads are highlighted
*/
{
EQUIPOT* Equipot;
NETINFO_ITEM* net;
wxString msg;
WinEDA_TextFrame* List;
int ii, jj;
unsigned ii;
msg = wxT( "*" );
Get_Message( _( "Filter for net names:" ), _("Net Filter"), msg, this );
......@@ -36,16 +36,15 @@ void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event )
List = new WinEDA_TextFrame( this, _( "List Nets" ) );
Equipot = (EQUIPOT*) GetBoard()->m_Equipots;
for( ; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Next() )
for( ii = 0; ii < GetBoard()->m_NetInfo->GetCount() ; ii++ )
{
net = GetBoard()->m_NetInfo->GetItem( ii );
wxString Line;
/* calcul adr relative du nom de la pastille reference de la piste */
if( !WildCompareString( msg, Equipot->GetNetname(), FALSE ) )
if( !WildCompareString( msg, net->GetNetname(), false ) )
continue;
Line.Printf( wxT( "net_code = %3.3d [%.16s] " ), Equipot->GetNet(),
Equipot->GetNetname().GetData() );
Line.Printf( wxT( "net_code = %3.3d [%.16s] " ), net->GetNet(),
net->GetNetname().GetData() );
List->Append( Line );
}
......@@ -56,17 +55,15 @@ void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event )
if( ii < 0 )
return;
/* Recherche du numero de net rellement selectionn�*/
Equipot = (EQUIPOT*) GetBoard()->m_Equipots;
for( jj = 0; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Next() )
for( unsigned jj = 0; jj < GetBoard()->m_NetInfo->GetCount() ; jj++ )
{
/* calcul adr relative du nom de la pastille reference de la piste */
if( !WildCompareString( msg, Equipot->GetNetname(), FALSE ) )
net = GetBoard()->m_NetInfo->GetItem( ii );
if( !WildCompareString( msg, net->GetNetname(), false ) )
continue;
if( ii == jj )
{
ii = Equipot->GetNet();
ii = net->GetNet();
break;
}
jj++;
......
......@@ -178,12 +178,6 @@ void BOARD::Draw( WinEDA_DrawPanel* aPanel, wxDC* DC,
}
}
// Draw equipots info
for( EQUIPOT* net = m_Equipots; net; net = net->Next() )
{
if ( net->GetNet() != 0 ) // no net if 0
net->Draw( aPanel, DC, aDrawMode );
}
// @todo: this high-light functionality could be built into me.
if( g_HightLigt_Status )
......
......@@ -95,9 +95,8 @@ void WinEDA_BasePcbFrame::UnDeleteItem( wxDC* DC )
item->SetState( DELETED, OFF ); /* Creal DELETED flag */
item->m_Flags = 0;
m_Pcb->m_Status_Pcb = 0;
build_liste_pads();
GetBoard()->m_Status_Pcb = 0;
GetBoard()->Build_Pads_Full_List();
ReCompile_Ratsnest_After_Changes( DC );
break;
#endif
......@@ -168,7 +167,8 @@ BOARD_ITEM* WinEDA_BasePcbFrame::SaveItemEfface( BOARD_ITEM* aItem, int nbitems
m_Pcb->m_Modules.Remove( module );
module->SetState( DELETED, ON );
g_UnDeleteStack[g_UnDeleteStackPtr++] = module;
build_liste_pads();
GetBoard()->m_Status_Pcb = 0;
GetBoard()->Build_Pads_Full_List();
}
break;
#endif
......
......@@ -23,7 +23,7 @@ struct CWORK /* a unit of work is a hole-pair to connect */
int net_code; /* net_code */
int ToRow; /* target row */
int ToCol; /* target column */
CHEVELU *pt_rats; /* chevelu correspondant*/
RATSNEST_ITEM *pt_rats; /* chevelu correspondant*/
int ApxDist; /* approximate distance */
int Cost; /* cost for sort by length */
int Priority; /* routage priority */
......@@ -38,8 +38,8 @@ static CWORK *Current = NULL;
void InitWork();
void ReInitWork();
int SetWork( int, int, int, int, int, CHEVELU *, int );
void GetWork( int *, int *, int *, int *, int *, CHEVELU ** );
int SetWork( int, int, int, int, int, RATSNEST_ITEM *, int );
void GetWork( int *, int *, int *, int *, int *, RATSNEST_ITEM ** );
void SortWork();
......@@ -71,7 +71,7 @@ void ReInitWork()
}
/*****************************************************************************/
/*int SetWork(int r1,int c1,int* n_c,int r2,int c2,CHEVELU * pt_ch,int pri )*/
/*int SetWork(int r1,int c1,int* n_c,int r2,int c2,RATSNEST_ITEM * pt_ch,int pri )*/
/*****************************************************************************/
/* add a unit of work to the work list
......@@ -81,7 +81,7 @@ void ReInitWork()
*/
static int GetCost(int r1,int c1,int r2,int c2);
int SetWork(int r1,int c1,int n_c,int r2,int c2,CHEVELU * pt_ch,int pri )
int SetWork(int r1,int c1,int n_c,int r2,int c2,RATSNEST_ITEM * pt_ch,int pri )
{
CWORK *p;
......@@ -113,7 +113,7 @@ CWORK *p;
/* void GetWork (int *r1,int *c1,int *r2,int *c2, char **n1,char **n2 ) */
/************************************************************************/
void GetWork (int *r1,int *c1,int *n_c,int *r2,int *c2,CHEVELU** pt_ch )
void GetWork (int *r1,int *c1,int *n_c,int *r2,int *c2,RATSNEST_ITEM** pt_ch )
/* fetch a unit of work from the work list */
{
if (Current)
......
......@@ -310,7 +310,7 @@ void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event )
if( Change_1_Module( m_CurrentModule, newmodulename, TRUE ) )
{
m_Parent->GetBoard()->m_Status_Pcb = 0;
m_Parent->build_liste_pads();
m_Parent->GetBoard()->Build_Pads_Full_List();
}
}
......@@ -395,7 +395,7 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event )
if( change )
{
m_Parent->GetBoard()->m_Status_Pcb = 0;
m_Parent->build_liste_pads();
m_Parent->GetBoard()->Build_Pads_Full_List();
}
}
......@@ -446,7 +446,7 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event )
if( change )
{
m_Parent->GetBoard()->m_Status_Pcb = 0;
m_Parent->build_liste_pads();
m_Parent->GetBoard()->Build_Pads_Full_List();
}
}
......
......@@ -793,7 +793,7 @@ void WinEDA_PcbFrame::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container
}
g_Zone_Default_Setting.ExportSetting( *zone_container);
EQUIPOT* net = GetBoard()->FindNet( g_Zone_Default_Setting.m_NetcodeSelection );
NETINFO_ITEM* net = GetBoard()->FindNet( g_Zone_Default_Setting.m_NetcodeSelection );
if( net ) // net === NULL should not occur
zone_container->m_Netname = net->GetNetname();
......@@ -880,7 +880,7 @@ int WinEDA_PcbFrame::Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool v
if( g_HightLigth_NetCode > 0 )
{
EQUIPOT* net = GetBoard()->FindNet( g_HightLigth_NetCode );
NETINFO_ITEM* net = GetBoard()->FindNet( g_HightLigth_NetCode );
if( net == NULL )
{
if( g_HightLigth_NetCode > 0 )
......@@ -943,42 +943,3 @@ int WinEDA_PcbFrame::Fill_All_Zones( bool verbose )
}
/**
* Function SetAreasNetCodesFromNetNames
* Set the .m_NetCode member of all copper areas, according to the area Net Name
* The SetNetCodesFromNetNames is an equivalent to net name, for fast comparisons.
* However the Netcode is an arbitrary equivalence, it must be set after each netlist read
* or net change
* Must be called after pad netcodes are calculated
* @return : error count
* For non copper areas, netcode is set to 0
*/
int BOARD::SetAreasNetCodesFromNetNames( void )
{
int error_count = 0;
for( int ii = 0; ii < GetAreaCount(); ii++ )
{
if ( ! GetArea( ii )->IsOnCopperLayer() )
{
GetArea( ii )->SetNet( 0 );
continue;
}
if ( GetArea( ii )->GetNet() != 0 ) // i.e. if this zone is connected to a net
{
const EQUIPOT* net = FindNet( GetArea( ii )->m_Netname );
if( net )
{
GetArea( ii )->SetNet( net->GetNet() );
}
else
{
error_count++;
GetArea( ii )->SetNet( -1 ); //keep Net Name ane set m_NetCode to -1 : error flag
}
}
}
return error_count;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment