missing file update in rev 68 (pcbnew/clean.cpp was not up to date)

This commit is contained in:
charras 2007-06-14 05:31:55 +00:00
parent 60802457b2
commit b3df52a493
1 changed files with 95 additions and 40 deletions

View File

@ -23,16 +23,29 @@
/* Routines locales : */
#if 0
static void raccord_track_a_centre(WinEDA_PcbFrame * frame);
static void ConnectDanglingEndToPad(WinEDA_PcbFrame * frame);
static void Gen_Raccord_Track(WinEDA_PcbFrame * frame, wxDC * DC);
#endif
static int clean_segments(WinEDA_PcbFrame * frame, wxDC * DC);
static void suppression_piste_non_connectee(WinEDA_PcbFrame * frame, wxDC * DC);
static TRACK * AlignSegment(BOARD * Pcb, TRACK * pt_ref, TRACK * pt_segm, int extremite);
static void Clean_Pcb_Items(WinEDA_PcbFrame * frame, wxDC * DC );
/* Variables locales : */
static int a_color; /* couleur du message */
static bool a_color; /* couleur du message */
static bool s_CleanVias = true;
static bool s_MergeSegments = true;
static bool s_DeleteUnconnectedSegm = true;
static bool s_ConnectToPads = false;
#include "cleaningoptions_dialog.cpp"
#define CONN2PAD_ENBL
#ifdef CONN2PAD_ENBL
static void ConnectDanglingEndToPad(WinEDA_PcbFrame * frame, wxDC * DC);
static void Gen_Raccord_Track(WinEDA_PcbFrame * frame, wxDC * DC);
#endif
/*****************************************/
void WinEDA_PcbFrame::Clean_Pcb(wxDC * DC)
@ -41,37 +54,81 @@ void WinEDA_PcbFrame::Clean_Pcb(wxDC * DC)
Suppression des points inutiles
- via sur pad
- points de couche et coord identiques
- points aligns (supp du pt milieu)
- points alignes (supp du pt milieu)
*/
{
MsgPanel->EraseMsgBox();
m_Pcb->GetNumSegmTrack(); /* Met a jour le compte */
/* construction de la liste des coordonnées des pastilles */
m_Pcb->m_Status_Pcb = 0;
build_liste_pads();
recalcule_pad_net_code();
s_ConnectToPads = false;
WinEDA_CleaningOptionsFrame * frame = new WinEDA_CleaningOptionsFrame( this, DC );
frame->ShowModal(); frame->Destroy();
DrawPanel->Refresh(true);
#if 0
if( Raccords_Auto) /* Creation de points de connexion */
}
/************************************************************/
void Clean_Pcb_Items(WinEDA_PcbFrame * frame, wxDC * DC )
/************************************************************/
{
frame->MsgPanel->EraseMsgBox();
frame->m_Pcb->GetNumSegmTrack(); /* Met a jour le compte */
/* construction de la liste des coordonnées des pastilles */
frame->m_Pcb->m_Status_Pcb = 0;
frame->build_liste_pads();
frame->recalcule_pad_net_code();
if ( s_CleanVias ) /* delete redundant vias */
{
TRACK *track, *next_track;
for( track = frame->m_Pcb->m_Track; track != NULL; track = track->Next())
{
if( track->m_Shape != VIA_NORMALE ) continue;
/* Search and delete others vias at same location */
TRACK * alt_track = track->Next();
for( ; alt_track != NULL; alt_track = next_track )
{
next_track = alt_track->Next();
if( alt_track->m_Shape != VIA_NORMALE ) continue;
if ( alt_track->m_Start != track->m_Start ) continue;
/* delete via */
alt_track->UnLink();
delete alt_track;
}
}
/* Delete Via on pads at same location */
for( track = frame->m_Pcb->m_Track; track != NULL; track = next_track)
{
next_track = track->Next();
if( track->m_Shape != VIA_NORMALE ) continue;
D_PAD * pad = Fast_Locate_Pad_Connecte(frame->m_Pcb, track->m_Start, ALL_CU_LAYERS);
if (pad && (pad->m_Masque_Layer&EXTERNAL_LAYERS) == EXTERNAL_LAYERS) // redundant Via
{
/* delete via */
track->UnLink();
delete track;
}
}
}
#ifdef CONN2PAD_ENBL
if( s_ConnectToPads ) /* Creation de points de connexion */
{
/* Raccordement des extremites de piste au centre des pastilles : */
raccord_track_a_centre(this);
ConnectDanglingEndToPad(frame, DC);
/* Creation de points de raccordements aux intersections de pistes */
Gen_Raccord_Track(this);
}
// Gen_Raccord_Track(frame, DC);
}
#endif
/* suppression des segments de longueur nulle et des points intermediaires
alignes */
clean_segments(this, DC);
if ( s_MergeSegments ) clean_segments(frame, DC);
/* suppression des pistes non connectees ( c.a.d dont 1 extremite est en l'air) */
suppression_piste_non_connectee(this, DC);
if ( s_DeleteUnconnectedSegm ) suppression_piste_non_connectee(frame, DC);
Compile_Ratsnest(DC, AFFICHE);
frame->Compile_Ratsnest(DC, AFFICHE);
m_CurrentScreen->SetModify();
frame->m_CurrentScreen->SetModify();
}
@ -527,15 +584,14 @@ int flag = 0;
}
/**********************************************/
/* Netliste Controle: Controle des connexions */
/**********************************************/
/***************************************************************************/
int Netliste_Controle_piste(WinEDA_PcbFrame * frame, wxDC * DC, int affiche)
/***************************************************************************/
/*
verification des connexions.
Supprime les segments mal connectes, c.a.d. interconnectant des segments
de net_code differents
*/
int Netliste_Controle_piste(WinEDA_PcbFrame * frame, wxDC * DC, int affiche)
{
TRACK * PtSegm, * pt_aux;
EDA_BaseStruct * NextS;
@ -634,7 +690,7 @@ wxString msg;
}
#if 0
#ifdef CONN2PAD_ENBL
/***************************************************************/
static void Gen_Raccord_Track(WinEDA_PcbFrame * frame, wxDC * DC)
@ -661,20 +717,20 @@ wxString msg;
oldpercent = -1; ii = 0;
for( PtSegm = frame->m_Pcb->m_Track; PtSegm != NULL; PtSegm = (TRACK*) NextS)
{
{
NextS = PtSegm->Pnext;
/* affichage activite */
ii++;
percent = (100 * ii)/ frame->m_Pcb->m_NbSegmTrack;
if( percent != oldpercent)
{
{
frame->DisplayActivity(percent, wxT("Tracks: ") );
oldpercent = percent;
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);
}
}
if( frame->DrawPanel->m_AbortRequest ) return;
@ -682,7 +738,7 @@ wxString msg;
/* examen du point de depart du segment de reference */
for(pt_aux = frame->m_Pcb->m_Track; ; pt_aux = (TRACK*) pt_aux->Pnext)
{
{
if (pt_aux == NULL) break;
pt_aux = Locate_Pistes(pt_aux, PtSegm->m_Start, masquelayer);
if (pt_aux == NULL) break;
@ -706,11 +762,11 @@ wxString msg;
NewTrack->m_Start = PtSegm->m_Start;
Trace_Une_Piste(frame->DrawPanel, DC, pt_aux, 2, GR_OR);
pt_aux = NewTrack;
}
}
/* examen du point de fin du segment de reference */
for(pt_aux = frame->m_Pcb->m_Track; pt_aux != NULL; pt_aux = (TRACK*) pt_aux->Pnext)
{
{
pt_aux = Locate_Pistes(pt_aux, PtSegm->m_End, masquelayer);
if(pt_aux == NULL) break;
if(pt_aux == PtSegm) continue;
@ -734,13 +790,13 @@ wxString msg;
NewTrack->m_Start.x = PtSegm->m_End.x; NewTrack->m_Start.y = PtSegm->m_End.y;
Trace_Une_Piste(frame->DrawPanel, DC, pt_aux,2,GR_OR);
pt_aux = NewTrack;
}
}
}
}
/*****************************************************/
void raccord_track_a_centre(WinEDA_PcbFrame * frame)
/****************************************************/
/***************************************************************/
void ConnectDanglingEndToPad(WinEDA_PcbFrame * frame, wxDC * DC)
/**************************************************************/
/*
rajoute eventuellement un segment a une extremite de piste connectee
a un pad si cette extremite n'est pas exactement connectee au centre
@ -760,7 +816,7 @@ wxString msg;
frame->DrawPanel->m_AbortRequest = FALSE;
Affiche_1_Parametre(frame, POS_AFF_VAR, wxT("Centre"), wxT("0 "),a_color);
Affiche_1_Parametre(frame, POS_AFF_VAR, _("Centre"), _("0 "),a_color);
ii = 0;
for(PtSegm = frame->m_Pcb->m_Track; PtSegm != NULL; PtSegm = (TRACK*)NextS)
@ -774,9 +830,9 @@ wxString msg;
frame->DisplayActivity(percent, _("Pads: "));
oldpercent = percent;
msg.Printf( wxT("%d"), frame->m_Pcb->m_NbSegmTrack );
Affiche_1_Parametre(frame, POS_AFF_MAX, wxT("Max"),msg,GREEN);
Affiche_1_Parametre(frame, POS_AFF_MAX, _("Max"),msg,GREEN);
msg.Printf( wxT("%d"), ii);
Affiche_1_Parametre(frame, POS_AFF_NUMSEGM, wxT("Segm"),msg,CYAN);
Affiche_1_Parametre(frame, POS_AFF_NUMSEGM, _("Segm"),msg,CYAN);
if( frame->DrawPanel->m_AbortRequest ) return;
}
@ -784,19 +840,18 @@ wxString msg;
ptr_pad = Locate_Pad_Connecte(frame->m_Pcb, PtSegm,START);
if( ptr_pad != NULL )
{ /* Test si point piste non deja connecte a un autre segment */
if( (PtSegm->m_Start.x != ptr_pad->m_Pos.x) ||
(PtSegm->m_Start.y != ptr_pad->m_Pos.y) )
if( PtSegm->m_Start != ptr_pad->m_Pos )
{
if(Locate_Piste_Connectee(PtSegm,frame->m_Pcb->m_Track,
NULL, START) == NULL)
{
TRACK * NewTrack = PtSegm->Copy();
NewTrack->Insert(frame->m_Pcb, PtSegm);
NewTrack->m_End.x = ptr_pad->m_Pos.x;
NewTrack->m_End.y = ptr_pad->m_Pos.y;
NewTrack->m_End = ptr_pad->m_Pos;
NewTrack->start = PtSegm;
NewTrack->end = ptr_pad;
nb_new_piste++;
NewTrack->Draw(frame->DrawPanel, DC, GR_OR);
Affiche_1_Parametre(frame,POS_AFF_VAR,wxEmptyString,msg,a_color);
}