diff --git a/pcbnew/autorout.h b/pcbnew/autorout.h index 2e3355da43..538d1ab1bb 100644 --- a/pcbnew/autorout.h +++ b/pcbnew/autorout.h @@ -61,13 +61,13 @@ public: /****************************************************************/ /* description d'un point de piste pour le suivi des connexions */ /****************************************************************/ -#define START_SUR_PAD 0x10 -#define END_SUR_PAD 0x20 -#define START_SUR_TRACK 0x40 -#define END_SUR_TRACK 0x80 +#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 +//#define START_EQU_VIA 0x10 +//#define END_EQU_VIA 0x20 /* Status bit (OR'ed bits) for class BOARD member .m_Status_Pcb */ diff --git a/pcbnew/clean.cpp b/pcbnew/clean.cpp index 656518e968..caa1e2f863 100644 --- a/pcbnew/clean.cpp +++ b/pcbnew/clean.cpp @@ -68,23 +68,23 @@ void Clean_Pcb_Items( WinEDA_PcbFrame* frame, wxDC* DC ) /************************************************************/ { frame->MsgPanel->EraseMsgBox(); - frame->m_Pcb->GetNumSegmTrack(); /* Met a jour le compte */ + frame->m_Pcb->GetNumSegmTrack(); // update the count /* construction de la liste des coordonn�s des pastilles */ frame->m_Pcb->m_Status_Pcb = 0; frame->build_liste_pads(); frame->recalcule_pad_net_code(); - if( s_CleanVias ) /* delete redundant vias */ + if( s_CleanVias ) // delete redundant vias { TRACK* track; TRACK* next_track; - for( track = frame->m_Pcb->m_Track; track != NULL; track = track->Next() ) + for( track = frame->m_Pcb->m_Track; track; track = track->Next() ) { - if( track->m_Shape != VIA_THROUGH ) + if( track->Shape() != VIA_THROUGH ) continue; - /* Search and delete others vias at same location */ + // Search and delete others vias at same location TRACK* alt_track = track->Next(); for( ; alt_track != NULL; alt_track = next_track ) { @@ -156,10 +156,11 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) * et le segment seront supprimes */ { - TRACK* segment, * pt_other, * pt_via; - TRACK* PtStartNetCode; - EDA_BaseStruct* NextS; - D_PAD* ptr_pad; + TRACK* segment; + TRACK* other; + TRACK* startNetcode; + TRACK* next; + int nbpoints_supprimes = 0; int masklayer, oldnetcode; int type_end, flag_erase; @@ -169,20 +170,20 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) frame->Affiche_Message( _( "Delete unconnected tracks:" ) ); frame->DrawPanel->m_AbortRequest = FALSE; - /* Correction des defauts des vias et recalcul du nombre de segm */ - frame->m_Pcb->m_NbSegmTrack = 0; ii = 0; - for( segment = frame->m_Pcb->m_Track; segment != NULL; segment = (TRACK*) NextS ) + // correct via m_End defects and count number of segments + frame->m_Pcb->m_NbSegmTrack = 0; + ii = 0; + for( segment = frame->m_Pcb->m_Track; segment != NULL; segment = next ) { frame->m_Pcb->m_NbSegmTrack++; - NextS = segment->Pnext; + next = segment->Next(); if( segment->Type() == TYPEVIA ) { - if( (segment->m_Start.x != segment->m_End.x ) - || (segment->m_Start.y != segment->m_End.y ) ) + if( segment->m_Start != segment->m_End ) { - segment->m_End.x = segment->m_Start.x; - segment->m_End.y = segment->m_Start.y; + segment->m_End = segment->m_Start; + ii++; msg.Printf( wxT( "%d " ), ii ); Affiche_1_Parametre( frame, POS_AFF_PASSE, _( "ViaDef" ), msg, LIGHTRED ); @@ -191,18 +192,17 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) } } - /* Suppression des pistes en l'air */ - segment = frame->m_Pcb->m_Track; + // removal of unconnected tracks percent = 0; oldpercent = -1; oldnetcode = 0; - PtStartNetCode = frame->m_Pcb->m_Track; - for( ii = 0; segment != NULL; segment = (TRACK*) NextS, ii++ ) + segment = startNetcode = frame->m_Pcb->m_Track; + for( ii = 0; segment; segment = next, ii++ ) { - NextS = segment->Pnext; + next = segment->Next(); - /* Affiche activite */ + // display activity percent = (100 * ii) / frame->m_Pcb->m_NbSegmTrack; if( percent != oldpercent ) { @@ -211,6 +211,7 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) msg.Printf( wxT( "%d " ), frame->m_Pcb->m_NbSegmTrack ); Affiche_1_Parametre( frame, POS_AFF_MAX, wxT( "Max" ), msg, GREEN ); + msg.Printf( wxT( "%d " ), ii ); Affiche_1_Parametre( frame, POS_AFF_NUMSEGM, wxT( "Segm" ), msg, CYAN ); } @@ -220,73 +221,84 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) if( segment->GetNet() != oldnetcode ) { - PtStartNetCode = segment; oldnetcode = segment->GetNet(); + startNetcode = segment; + oldnetcode = segment->GetNet(); } - flag_erase = 0; type_end = 0; + flag_erase = 0; + type_end = 0; /* y a t-il une pastille sur chaque extremite */ masklayer = segment->ReturnMaskLayer(); - ptr_pad = Fast_Locate_Pad_Connecte( frame->m_Pcb, segment->m_Start, masklayer ); - - if( ptr_pad != NULL ) + D_PAD* pad; + + pad = Fast_Locate_Pad_Connecte( frame->m_Pcb, segment->m_Start, masklayer ); + if( pad != NULL ) { - segment->start = ptr_pad; - type_end |= START_SUR_PAD; + segment->start = pad; + type_end |= START_ON_PAD; } - ptr_pad = Fast_Locate_Pad_Connecte( frame->m_Pcb, segment->m_End, masklayer ); - - if( ptr_pad != NULL ) + pad = Fast_Locate_Pad_Connecte( frame->m_Pcb, segment->m_End, masklayer ); + if( pad != NULL ) { - segment->end = ptr_pad; - type_end |= END_SUR_PAD; + segment->end = pad; + type_end |= END_ON_PAD; } - /* Test si une extremite est connectee sur une piste */ - if( (type_end & START_SUR_PAD ) == 0 ) + // if not connected to a pad, test if segment's START is connected to another track + if( (type_end & START_ON_PAD ) == 0 ) { - pt_other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, + other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, START ); - - if( pt_other == NULL ) + if( other == NULL ) flag_erase |= 1; - else /* Segment ou via connectee a cette extremite */ + else // segment or via connected to this end { - segment->start = pt_other; - if( pt_other->Type() == TYPEVIA ) /* recherche d'un autre segment */ + segment->start = other; + + if( other->Type() == TYPEVIA ) { + // search for another segment following the via + segment->SetState( BUSY, ON ); - pt_via = pt_other; - pt_other = Locate_Piste_Connectee( pt_via, frame->m_Pcb->m_Track, + + TRACK* via = other; + other = Locate_Piste_Connectee( via, frame->m_Pcb->m_Track, NULL, START ); - if( pt_other == NULL ) + if( other == NULL ) flag_erase |= 2; + segment->SetState( BUSY, OFF ); } } } - if( (type_end & END_SUR_PAD ) == 0 ) + // if not connected to a pad, test if segment's END is connected to another track + if( (type_end & END_ON_PAD ) == 0 ) { - pt_other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, + other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, END ); - if( pt_other == NULL ) + if( other == NULL ) flag_erase |= 0x10; - else /* Segment ou via connectee a cette extremite */ + + else // segment or via connected to this end { - segment->end = pt_other; - if( pt_other->Type() == TYPEVIA ) /* recherche d'un autre segment */ + segment->end = other; + if( other->Type() == TYPEVIA ) { + // search for another segment following the via + segment->SetState( BUSY, ON ); - pt_via = pt_other; - - pt_other = Locate_Piste_Connectee( pt_via, frame->m_Pcb->m_Track, + + TRACK* via = other; + other = Locate_Piste_Connectee( via, frame->m_Pcb->m_Track, NULL, END ); - if( pt_other == NULL ) + if( other == NULL ) flag_erase |= 0x20; + segment->SetState( BUSY, OFF ); } } @@ -294,7 +306,7 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) if( flag_erase ) { - oldpercent = -1; /* force affichage activite */ + oldpercent = -1; // force dispay activity nbpoints_supprimes++; ii--; @@ -302,21 +314,20 @@ static void suppression_piste_non_connectee( WinEDA_PcbFrame* frame, wxDC* DC ) msg.Printf( wxT( "%d " ), nbpoints_supprimes ); Affiche_1_Parametre( frame, POS_AFF_VAR, wxT( "NoConn." ), msg, LIGHTRED ); - /* rectification du pointeur segment pour repartir en debut - * du block des segments de meme net_code */ - if( segment == PtStartNetCode ) + // update the pointer to start of the contiguous netcode group + if( segment == startNetcode ) { - NextS = segment->Pnext; - PtStartNetCode = (TRACK*) NextS; + next = segment->Next(); + startNetcode = next; } else - NextS = PtStartNetCode; + next = startNetcode; - /* Suppression du segment */ + // remove segment from screen and board segment->Draw( frame->DrawPanel, DC, GR_XOR ); - segment->DeleteStructure(); - if( NextS == NULL ) + + if( next == NULL ) break; } } @@ -328,8 +339,9 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) /************************************************************/ /* Supprime segments nulls, points inutiles .. */ { - TRACK* segment, * pt_aux; - EDA_BaseStruct* NextS; + TRACK* segment; + TRACK* other; + TRACK* next; int ii, nbpoints_supprimes = 0; int flag, no_inc, percent, oldpercent; wxString msg; @@ -344,15 +356,16 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) nbpoints_supprimes = 0; percent = 0; oldpercent = -1; + frame->MsgPanel->EraseMsgBox(); frame->Affiche_Message( _( "Clean Null Segments" ) ); Affiche_1_Parametre( frame, POS_AFF_VAR, wxT( "NullSeg" ), wxT( "0" ), a_color ); segment = frame->m_Pcb->m_Track; - for( segment = frame->m_Pcb->m_Track; segment != NULL; segment = (TRACK*) NextS ) + for( segment = frame->m_Pcb->m_Track; segment; segment = next ) { - NextS = segment->Pnext; + next = (TRACK*) segment->Next(); if( !segment->IsNull() ) continue; @@ -375,7 +388,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) oldpercent = -1; segment = frame->m_Pcb->m_Track; - for( ii = 0; segment != NULL; segment = (TRACK*) segment->Pnext, ii++ ) + for( ii = 0; segment; segment = (TRACK*) segment->Next(), ii++ ) { /* affichage activite */ percent = (100 * ii) / frame->m_Pcb->m_NbSegmTrack; @@ -394,29 +407,29 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) return -1; } - for( pt_aux = (TRACK*) segment->Pnext; pt_aux != NULL; pt_aux = (TRACK*) NextS ) + for( other = (TRACK*) segment->Next(); other; other = next ) { int erase = 0; - NextS = pt_aux->Pnext; + next = (TRACK*) other->Next(); - if( segment->Type() != pt_aux->Type() ) + if( segment->Type() != other->Type() ) continue; - if( segment->GetLayer() != pt_aux->GetLayer() ) + if( segment->GetLayer() != other->GetLayer() ) continue; - if( segment->GetNet() != pt_aux->GetNet() ) + if( segment->GetNet() != other->GetNet() ) break; - if( segment->m_Start == pt_aux->m_Start ) + if( segment->m_Start == other->m_Start ) { - if( segment->m_End == pt_aux->m_End ) + if( segment->m_End == other->m_End ) erase = 1; } - if( segment->m_Start == pt_aux->m_End ) + if( segment->m_Start == other->m_End ) { - if( segment->m_End == pt_aux->m_Start ) + if( segment->m_End == other->m_Start ) erase = 1; } @@ -424,8 +437,8 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) if( erase ) { ii--; - pt_aux->Draw( frame->DrawPanel, DC, GR_OR ); - pt_aux->DeleteStructure(); + other->Draw( frame->DrawPanel, DC, GR_OR ); + other->DeleteStructure(); nbpoints_supprimes++; msg.Printf( wxT( " %d" ), nbpoints_supprimes ); @@ -446,12 +459,14 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) Affiche_1_Parametre( frame, POS_AFF_VAR, _( "Merge" ), _( "0" ), a_color ); ii = 0; - segment = frame->m_Pcb->m_Track; - for( segment = frame->m_Pcb->m_Track; segment!= NULL; segment = (TRACK*) NextS ) + for( segment = frame->m_Pcb->m_Track; segment; segment = next ) { - TRACK* pt_segm_s, * pt_segm_e, * pt_segm_delete; + TRACK* segStart; + TRACK* segEnd; + TRACK* pt_segm_delete; - NextS = segment->Pnext; + next = (TRACK*) segment->Next(); + /* affichage activite */ ii++; percent = (100 * ii) / frame->m_Pcb->m_NbSegmTrack; @@ -475,29 +490,30 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) flag = no_inc = 0; - /* Recherche d'un point possible raccorde sur DEBUT de segment: */ - for( pt_segm_s = (TRACK*) segment->Pnext; ; ) + // search for a possible point that connects on START of segment + for( segStart = (TRACK*) segment->Next(); ; ) { - pt_segm_s = Locate_Piste_Connectee( segment, pt_segm_s, + segStart = Locate_Piste_Connectee( segment, segStart, NULL, START ); - if( pt_segm_s ) + if( segStart ) { - /* les 2 segments doivent avoir meme largeur */ - if( segment->m_Width != pt_segm_s->m_Width ) + // the two segments must have the same width + if( segment->m_Width != segStart->m_Width ) break; - /* Ce ne peut etre une via */ - if( pt_segm_s->Type() != TYPETRACK ) + // it cannot be a via + if( segStart->Type() != TYPETRACK ) break; /* On ne peut avoir que 1 seul segment connecte */ - pt_segm_s->SetState( BUSY, ON ); - pt_aux = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, + segStart->SetState( BUSY, ON ); + other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, START ); - pt_segm_s->SetState( BUSY, OFF ); + segStart->SetState( BUSY, OFF ); - if( pt_aux == NULL ) - flag = 1;/* OK */ + if( other == NULL ) + flag = 1; /* OK */ + break; } break; @@ -505,7 +521,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) if( flag ) /* debut de segment raccorde a un autre segment */ { - pt_segm_delete = AlignSegment( frame->m_Pcb, segment, pt_segm_s, START ); + pt_segm_delete = AlignSegment( frame->m_Pcb, segment, segStart, START ); if( pt_segm_delete ) { nbpoints_supprimes++; no_inc = 1; @@ -514,27 +530,27 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) } /* Recherche d'un point possible raccorde sur FIN de segment: */ - for( pt_segm_e = (TRACK*) segment->Pnext; ; ) + for( segEnd = (TRACK*) segment->Next(); ; ) { - pt_segm_e = Locate_Piste_Connectee( segment, pt_segm_e, + segEnd = Locate_Piste_Connectee( segment, segEnd, NULL, END ); - if( pt_segm_e ) + if( segEnd ) { - /* les 2 segments doivent avoir meme largeur */ - if( segment->m_Width != pt_segm_e->m_Width ) + if( segment->m_Width != segEnd->m_Width ) break; - /* Ce ne peut etre une via */ - if( pt_segm_e->Type() != TYPETRACK ) + if( segEnd->Type() != TYPETRACK ) break; /* On ne peut avoir que 1 seul segment connecte */ - pt_segm_e->SetState( BUSY, ON ); - pt_aux = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, + segEnd->SetState( BUSY, ON ); + other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, END ); - pt_segm_e->SetState( BUSY, OFF ); - if( pt_aux == NULL ) - flag |= 2;/* Ok */ + segEnd->SetState( BUSY, OFF ); + + if( other == NULL ) + flag |= 2; /* Ok */ + break; } else @@ -543,10 +559,11 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) if( flag & 2 ) /* FIN de segment raccorde a un autre segment */ { - pt_segm_delete = AlignSegment( frame->m_Pcb, segment, pt_segm_e, END ); + pt_segm_delete = AlignSegment( frame->m_Pcb, segment, segEnd, END ); if( pt_segm_delete ) { - nbpoints_supprimes++; no_inc = 1; + nbpoints_supprimes++; + no_inc = 1; pt_segm_delete->DeleteStructure(); } } @@ -556,7 +573,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) msg.Printf( wxT( "%d " ), nbpoints_supprimes ); Affiche_1_Parametre( frame, POS_AFF_VAR, wxEmptyString, msg, a_color ); - NextS = segment->Pnext; + next = (TRACK*) segment->Next(); } } @@ -568,6 +585,10 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extremite ) /****************************************************************************/ +/** + * Function AlignSegment + */ + /* Routine utilisee par clean_segments. * Verifie l'alignement de pt_segm / pt_ref. et verifie que le point commun * a faire disparaitre n'est pas sur un pad. @@ -577,16 +598,15 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre * sinon retourne NULL */ { - int refdx, refdy, segmdx, segmdy;/* projections des segments */ int flag = 0; - refdx = pt_ref->m_End.x - pt_ref->m_Start.x; - refdy = pt_ref->m_End.y - pt_ref->m_Start.y; + int refdx = pt_ref->m_End.x - pt_ref->m_Start.x; + int refdy = pt_ref->m_End.y - pt_ref->m_Start.y; - segmdx = pt_segm->m_End.x - pt_segm->m_Start.x; - segmdy = pt_segm->m_End.y - pt_segm->m_Start.y; + int segmdx = pt_segm->m_End.x - pt_segm->m_Start.x; + int segmdy = pt_segm->m_End.y - pt_segm->m_Start.y; - /* Tst alignement vertical possible: */ + // test for vertical alignment if( refdx == 0 ) { if( segmdx != 0 ) @@ -594,7 +614,8 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre else flag = 1; } - /* Tst alignement horizontal possible: */ + + // test for horizontal alignment if( refdy == 0 ) { if( segmdy != 0 ) @@ -607,7 +628,7 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre * il faut que refdy/refdx == (+/-)segmdy/segmdx, c.a.d meme direction */ if( flag == 0 ) { - if( (refdy * segmdx != refdx * segmdy) + if( (refdy * segmdx != refdx * segmdy) && (refdy * segmdx != -refdx * segmdy) ) return NULL; flag = 4; @@ -622,22 +643,22 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre g_TabOneLayerMask[pt_ref->GetLayer()] ) ) return NULL; - if( (pt_ref->m_Start.x == pt_segm->m_Start.x) - && (pt_ref->m_Start.y == pt_segm->m_Start.y) ) + if( pt_ref->m_Start == pt_segm->m_Start ) { - pt_ref->m_Start.x = pt_segm->m_End.x; pt_ref->m_Start.y = pt_segm->m_End.y; + pt_ref->m_Start = pt_segm->m_End; return pt_segm; } else /* connexion par la fin de pt_segm */ { - pt_ref->m_Start.x = pt_segm->m_Start.x; pt_ref->m_Start.y = pt_segm->m_Start.y; + pt_ref->m_Start = pt_segm->m_Start; return pt_segm; } } else /* extremite == END */ { /* Ce ne doit pas etre sur un pad */ - if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_End, g_TabOneLayerMask[pt_ref->GetLayer()] ) ) + if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_End, + g_TabOneLayerMask[pt_ref->GetLayer()] ) ) return NULL; if( pt_ref->m_End == pt_segm->m_Start )