Commit 30932a46 authored by dickelbeck's avatar dickelbeck

Werner Almesberger's patches

parent 5977accf
...@@ -890,10 +890,8 @@ bool TRACK::HitTest( const wxPoint& ref_pos ) ...@@ -890,10 +890,8 @@ bool TRACK::HitTest( const wxPoint& ref_pos )
if( Type() == TYPEVIA ) /* VIA rencontree */ if( Type() == TYPEVIA ) /* VIA rencontree */
{ {
if( (abs( spot_cX ) <= l_piste ) && (abs( spot_cY ) <=l_piste) ) return (int64_t) spot_cX*spot_cX + (int64_t) spot_cY*spot_cY <=
return true; (int64_t) l_piste*l_piste;
else
return false;
} }
else else
{ {
......
...@@ -219,6 +219,152 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) ...@@ -219,6 +219,152 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode )
} }
/*
* "Join" finds the point where b0+x*(b1-b0) intersects with a0+y*(a1-a0).
* If that point would be outside of a0-a1, the respective endpoint is used.
* Join returns the point in "res" and "true" if a suitable point was found,
* "false" if both lines are parallel.
*/
static bool Join( wxPoint& res, wxPoint a0, wxPoint a1, wxPoint b0, wxPoint b1 )
{
int64_t denom;
double t;
a1 -= a0;
b1 -= b0;
b0 -= a0;
denom = (int64_t) b1.y*a1.x - (int64_t) b1.x*a1.y;
if (!denom)
return false; // parallel
t = ((int64_t) b1.y*b0.x - (int64_t) b1.x*b0.y)/(double) denom;
t = min( max( t, 0.0 ), 1.0 );
res.x = (int) round(a0.x+t*a1.x);
res.y = (int) round(a0.y+t*a1.y);
return true;
}
/*
* "Project" finds the projection of a grid point on a track. This is the point
* from where we want to draw new orthogonal tracks when starting on a track.
*/
bool Project( wxPoint& res, wxPoint on_grid, const TRACK* track )
{
wxPoint vec;
double t;
if( track->m_Start == track->m_End )
return false;
vec = track->m_End-track->m_Start;
t = (int64_t) (on_grid.x-track->m_Start.x)*vec.x +
(int64_t) (on_grid.y-track->m_Start.y)*vec.y;
t /= (int64_t) vec.x*vec.x + (int64_t) vec.y*vec.y;
t = min( max( t, 0.0 ), 1.0 );
res.x = (int) round( track->m_Start.x + t*vec.x );
res.y = (int) round( track->m_Start.y + t*vec.y );
return true;
}
static bool Magnetize( BOARD* m_Pcb, WinEDA_PcbFrame* frame,
int m_ID_current_state, wxSize grid, wxPoint on_grid, wxPoint& curpos )
{
const D_PAD* pad;
const TRACK* curr = NULL;
const TRACK* via, * track;
int layer, layer_mask;
bool sometimes = g_MagneticPadOption != capture_always && Drc_On;
curr = g_CurrentTrackSegment;
if( frame->GetCurItem() != curr )
curr = NULL;
switch( g_MagneticPadOption )
{
case capture_cursor_in_track_tool:
if( m_ID_current_state != ID_TRACK_BUTT )
return false;
break;
case capture_always:
break;
case no_effect:
default:
return false;
}
pad = Locate_Any_Pad( m_Pcb, CURSEUR_OFF_GRILLE, TRUE );
if( pad )
{
if( curr && curr->GetNet() != pad->GetNet() && sometimes )
return false;
curpos = pad->m_Pos;
return true;
}
layer = ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer;
via = Locate_Via_Area( m_Pcb, curpos, layer );
if( via )
{
if( curr && curr->GetNet() != via->GetNet() && sometimes )
return false;
curpos = via->m_Start;
return true;
}
layer_mask = g_TabOneLayerMask[layer];
if( !curr )
{
track = Locate_Pistes( m_Pcb->m_Track, layer_mask, CURSEUR_OFF_GRILLE );
if( !track || track->Type() != TYPETRACK )
return false;
return Project( curpos, on_grid, track );
}
/*
* In two segment mode, ignore the final segment if it's inside a grid
* square.
*/
if( g_TwoSegmentTrackBuild && curr->Pback
&& curr->m_Start.x - grid.x < curr->m_End.x
&& curr->m_Start.x + grid.x > curr->m_End.x
&& curr->m_Start.y - grid.y < curr->m_End.y
&& curr->m_Start.y + grid.y > curr->m_End.y )
curr = curr->Back();
track = Locate_Pistes( m_Pcb->m_Track, layer_mask, CURSEUR_OFF_GRILLE );
for( ; track; track = track->Next() )
{
if( track->Type() != TYPETRACK )
continue;
if( curr->GetNet() != track->GetNet() && sometimes )
continue;
if( Join( curpos, track->m_Start, track->m_End,
curr->m_Start, curr->m_End ) )
return true;
}
return false;
}
/****************************************************************/ /****************************************************************/
void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
/*****************************************************************/ /*****************************************************************/
...@@ -232,7 +378,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) ...@@ -232,7 +378,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
// Save the board after the time out : // Save the board after the time out :
int CurrentTime = time( NULL ); int CurrentTime = time( NULL );
if( !GetScreen()->IsModify() || GetScreen()->IsSave() ) if( !GetScreen()->IsModify() || GetScreen()->IsSave() )
{ {
/* If no change, reset the time out */ /* If no change, reset the time out */
...@@ -262,7 +408,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) ...@@ -262,7 +408,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
delta.x = (int) round( (double) GetScreen()->GetGrid().x / zoom ); delta.x = (int) round( (double) GetScreen()->GetGrid().x / zoom );
delta.y = (int) round( (double) GetScreen()->GetGrid().y / zoom ); delta.y = (int) round( (double) GetScreen()->GetGrid().y / zoom );
if( delta.x <= 0 ) if( delta.x <= 0 )
delta.x = 1; delta.x = 1;
if( delta.y <= 0 ) if( delta.y <= 0 )
...@@ -341,7 +487,6 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) ...@@ -341,7 +487,6 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
* But if the tool DELETE is active the cursor is left off grid * But if the tool DELETE is active the cursor is left off grid
* this is better to reach items to delete off grid * this is better to reach items to delete off grid
*/ */
D_PAD* pad;
bool keep_on_grid = TRUE; bool keep_on_grid = TRUE;
if( m_ID_current_state == ID_PCB_DELETE_ITEM_BUTT ) if( m_ID_current_state == ID_PCB_DELETE_ITEM_BUTT )
keep_on_grid = FALSE; keep_on_grid = FALSE;
...@@ -354,34 +499,27 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) ...@@ -354,34 +499,27 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
if( DrawStruct && DrawStruct->m_Flags ) if( DrawStruct && DrawStruct->m_Flags )
keep_on_grid = TRUE; keep_on_grid = TRUE;
switch( g_MagneticPadOption ) if (keep_on_grid) {
{ wxPoint on_grid = curpos;
case capture_cursor_in_track_tool:
case capture_always:
pad = Locate_Any_Pad( m_Pcb, CURSEUR_OFF_GRILLE, TRUE );
if( (m_ID_current_state != ID_TRACK_BUTT )
&& (g_MagneticPadOption == capture_cursor_in_track_tool) )
pad = NULL;
if( keep_on_grid )
{
if( pad ) // Put cursor on the pad
GetScreen()->m_Curseur = curpos = pad->m_Pos;
else
// Put cursor on grid
PutOnGrid( &GetScreen()->m_Curseur );
}
break;
case no_effect: PutOnGrid(&on_grid);
default: if (Magnetize(m_Pcb, (WinEDA_PcbFrame *) this, m_ID_current_state,
GetScreen()->GetGrid(), on_grid, curpos))
GetScreen()->m_Curseur = curpos;
else {
extern TRACK *LocateIntrusion(TRACK *start, int net, int width);
// If we are not in delete function, put cursor on grid /*
if( keep_on_grid ) * If there's an intrusion and DRC is active, we pass the cursor
{ * "as is", and let ShowNewTrackWhenMovingCursor figure our what to
PutOnGrid( &GetScreen()->m_Curseur ); * do.
} */
break; if (!Drc_On || !g_CurrentTrackSegment ||
g_CurrentTrackSegment != this->GetCurItem() ||
!LocateIntrusion(m_Pcb->m_Track, g_CurrentTrackSegment->GetNet(),
g_CurrentTrackSegment->m_Width))
GetScreen()->m_Curseur = on_grid;
}
} }
if( oldpos != GetScreen()->m_Curseur ) if( oldpos != GetScreen()->m_Curseur )
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
static void Exit_Editrack( WinEDA_DrawPanel* panel, wxDC* DC ); static void Exit_Editrack( WinEDA_DrawPanel* panel, wxDC* DC );
void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel,
wxDC* DC, bool erase ); wxDC* DC, bool erase );
static void ComputeBreakPoint( TRACK* track, int n ); static void ComputeBreakPoint( TRACK* track, int n, wxPoint end );
static TRACK* DeleteNullTrackSegments( BOARD* pcb, TRACK* track, int* segmcount ); static TRACK* DeleteNullTrackSegments( BOARD* pcb, TRACK* track, int* segmcount );
static void EnsureEndTrackOnPad( D_PAD* Pad ); static void EnsureEndTrackOnPad( D_PAD* Pad );
...@@ -493,6 +493,120 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC ) ...@@ -493,6 +493,120 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
SetCurItem( NULL ); SetCurItem( NULL );
} }
/*
* PushTrack detecs if the mouse is pointing into a conflicting track.
* In this case, it tries to push the new track out of the conflicting track's
* clearance zone. This gives us a cheap mechanism for drawing tracks that
* tightly follow others, independent of grid settings.
*
* KNOWN BUGS:
* - we do the same sort of search and calculation up to three times:
* 1) we search for magnetic hits (in controle.cpp)
* 2) we check if there's a DRC violation in the making (also controle.cpp)
* 3) we try to fix the DRC violation (here)
* - if we have a magnetic hit and a DRC violation at the same time, we choose
* the magnetic hit instead of solving the violation
* - should locate conflicting tracks also when we're crossing over them
* - we obviously shouldn't access functions through "extern" or have #includes
* in the middle of the file
*/
#include "trigo.h"
extern bool Project(wxPoint &res, wxPoint on_grid, const TRACK *track);
TRACK *LocateIntrusion(TRACK *start, int net, int width)
{
int layer = ((PCB_SCREEN *) ActiveScreen)->m_Active_Layer;
int layer_mask = g_TabOneLayerMask[layer];
wxPoint ref = ActiveScreen->RefPos(1);
TRACK *track, *found = NULL;
for (track = start; track; track = track->Next()) {
int dist;
wxPoint pos, vec;
int64_t tmp;
/* Locate_Pistes */
if (track->GetState(BUSY | DELETED))
continue;
if (!(g_TabOneLayerMask[track->GetLayer()] & layer_mask))
continue;
if (track->GetNet() == net)
continue;
if (track->Type() == TYPEVIA)
continue;
/* TRACK::HitTest */
dist = width/2 + track->m_Width/2 + g_DesignSettings.m_TrackClearence;
pos = ref-track->m_Start;
vec = track->m_End-track->m_Start;
if (!DistanceTest(dist, vec.x, vec.y, pos.x, pos.y))
continue;
found = track;
/* prefer intrusions from the side, not the end */
tmp = (int64_t) pos.x*vec.x + (int64_t) pos.y*vec.y;
if (tmp >= 0 && tmp <= (int64_t) vec.x*vec.x + (int64_t) vec.y*vec.y)
break;
}
return found;
}
static void PushTrack(WinEDA_DrawPanel *panel)
{
BOARD *pcb = ((WinEDA_BasePcbFrame *) (panel->m_Parent))->m_Pcb;
wxPoint cursor = ActiveScreen->m_Curseur;
wxPoint cv, vec, n;
TRACK *track = g_CurrentTrackSegment;
TRACK *other;
int64_t det;
int dist;
double f;
other = LocateIntrusion(pcb->m_Track, track->GetNet(), track->m_Width);
/* are we currently pointing into a conflicting trace ? */
if (!other)
return;
if (other->GetNet() == track->GetNet())
return;
cv = cursor-other->m_Start;
vec = other->m_End-other->m_Start;
det = (int64_t) cv.x*vec.y - (int64_t) cv.y*vec.x;
/* cursor is right at the center of the old track */
if (!det)
return;
dist = (track->m_Width+1)/2 + (other->m_Width+1)/2 +
g_DesignSettings.m_TrackClearence+2;
/*
* DRC wants >, so +1.
* We may have a quantization error of 1/sqrt(2), so +1 again.
*/
/* Vector "n" is perpendicular to "other", pointing towards the cursor. */
if (det > 0) {
n.x = vec.y;
n.y = -vec.x;
}
else {
n.x = -vec.y;
n.y = vec.x;
}
f = dist/hypot(n.x, n.y);
n.x = (int) round(f*n.x);
n.y = (int) round(f*n.y);
Project(track->m_End, cursor, other);
track->m_End += n;
}
/****************************************************************************/ /****************************************************************************/
void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
...@@ -538,8 +652,13 @@ void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ...@@ -538,8 +652,13 @@ void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase
if( Track_45_Only ) if( Track_45_Only )
{ {
if( g_TwoSegmentTrackBuild ) if( g_TwoSegmentTrackBuild ) {
ComputeBreakPoint( g_CurrentTrackSegment, g_TrackSegmentCount ); g_CurrentTrackSegment->m_End = ActiveScreen->m_Curseur;
if (Drc_On)
PushTrack(panel);
ComputeBreakPoint( g_CurrentTrackSegment, g_TrackSegmentCount,
g_CurrentTrackSegment->m_End);
}
else else
{ {
/* Calcul de l'extremite de la piste pour orientations permises: /* Calcul de l'extremite de la piste pour orientations permises:
...@@ -625,7 +744,7 @@ void Calcule_Coord_Extremite_45( int ox, int oy, int* fx, int* fy ) ...@@ -625,7 +744,7 @@ void Calcule_Coord_Extremite_45( int ox, int oy, int* fx, int* fy )
/********************************************************/ /********************************************************/
void ComputeBreakPoint( TRACK* track, int SegmentCount ) void ComputeBreakPoint( TRACK* track, int SegmentCount, wxPoint end )
/********************************************************/ /********************************************************/
/** /**
...@@ -646,8 +765,8 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount ) ...@@ -646,8 +765,8 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
SegmentCount--; SegmentCount--;
if( track ) if( track )
{ {
iDx = ActiveScreen->m_Curseur.x - track->m_Start.x; iDx = end.x - track->m_Start.x;
iDy = ActiveScreen->m_Curseur.y - track->m_Start.y; iDy = end.y - track->m_Start.y;
iDx = abs( iDx ); iDx = abs( iDx );
iDy = abs( iDy ); iDy = abs( iDy );
...@@ -680,10 +799,10 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount ) ...@@ -680,10 +799,10 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
break; break;
case 0: case 0:
if( (ActiveScreen->m_Curseur.x - track->m_Start.x) < 0 ) if( (end.x - track->m_Start.x) < 0 )
track->m_End.x = ActiveScreen->m_Curseur.x + iDy; track->m_End.x = end.x + iDy;
else else
track->m_End.x = ActiveScreen->m_Curseur.x - iDy; track->m_End.x = end.x - iDy;
track->m_End.y = track->m_Start.y; track->m_End.y = track->m_Start.y;
break; break;
...@@ -691,19 +810,19 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount ) ...@@ -691,19 +810,19 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
iDx = MIN( iDx, iDy ); iDx = MIN( iDx, iDy );
iDy = iDx; iDy = iDx;
/* recalcul des signes de deltax et deltay */ /* recalcul des signes de deltax et deltay */
if( (ActiveScreen->m_Curseur.x - track->m_Start.x) < 0 ) if( (end.x - track->m_Start.x) < 0 )
iDx = -iDx; iDx = -iDx;
if( (ActiveScreen->m_Curseur.y - track->m_Start.y) < 0 ) if( (end.y - track->m_Start.y) < 0 )
iDy = -iDy; iDy = -iDy;
track->m_End.x = track->m_Start.x + iDx; track->m_End.x = track->m_Start.x + iDx;
track->m_End.y = track->m_Start.y + iDy; track->m_End.y = track->m_Start.y + iDy;
break; break;
case 90: case 90:
if( (ActiveScreen->m_Curseur.y - track->m_Start.y) < 0 ) if( (end.y - track->m_Start.y) < 0 )
track->m_End.y = ActiveScreen->m_Curseur.y + iDx; track->m_End.y = end.y + iDx;
else else
track->m_End.y = ActiveScreen->m_Curseur.y - iDx; track->m_End.y = end.y - iDx;
track->m_End.x = track->m_Start.x; track->m_End.x = track->m_Start.x;
break; break;
} }
...@@ -711,10 +830,10 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount ) ...@@ -711,10 +830,10 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount )
if( track ) if( track )
{ {
if( track->IsNull() ) if( track->IsNull() )
track->m_End = ActiveScreen->m_Curseur; track->m_End = end;
NewTrack->m_Start = track->m_End; NewTrack->m_Start = track->m_End;
} }
NewTrack->m_End = ActiveScreen->m_Curseur; NewTrack->m_End = end;
} }
......
...@@ -111,6 +111,34 @@ TRACK* Locate_Via( BOARD* Pcb, const wxPoint& pos, int layer ) ...@@ -111,6 +111,34 @@ TRACK* Locate_Via( BOARD* Pcb, const wxPoint& pos, int layer )
} }
/*******************************************************************/
TRACK* Locate_Via_Area( BOARD* Pcb, const wxPoint& pos, int layer )
/*******************************************************************/
/*
* Like Locate_Via, but finds any via covering the cursor position
*/
{
TRACK* Track;
for( Track = Pcb->m_Track; Track != NULL; Track = Track->Next() )
{
if( Track->Type() != TYPEVIA )
continue;
if(!Track->HitTest(pos))
continue;
if( Track->GetState( BUSY | DELETED ) )
continue;
if( layer < 0 )
return Track;
if( Track->IsOnLayer( layer ) )
return Track;
}
return NULL;
}
/********************************************************************/ /********************************************************************/
D_PAD* Locate_Pad_Connecte( BOARD* Pcb, TRACK* ptr_piste, int extr ) D_PAD* Locate_Pad_Connecte( BOARD* Pcb, TRACK* ptr_piste, int extr )
/********************************************************************/ /********************************************************************/
......
...@@ -8,336 +8,378 @@ ...@@ -8,336 +8,378 @@
/***************/ /***************/
/* PAD_CONNECT.CPP */ /* PAD_CONNECT.CPP */
/***************/ /***************/
LISTE_PAD* CreateSortedPadListByXCoord(BOARD * pcb); LISTE_PAD* CreateSortedPadListByXCoord( BOARD* pcb );
/* Create a sorted list of pointers to pads. /* Create a sorted list of pointers to pads.
This list is sorted by X ccordinate value. * This list is sorted by X ccordinate value.
The list must be freed bu user */ * The list must be freed bu user
*/
/**************/ /**************/
/* PCBCFG.CPP */ /* PCBCFG.CPP */
/**************/ /**************/
bool Read_Config(const wxString & project_name); bool Read_Config( const wxString& project_name );
bool Read_Hotkey_Config( WinEDA_DrawFrame * frame, bool verbose ); bool Read_Hotkey_Config( WinEDA_DrawFrame* frame, bool verbose );
/***************/ /***************/
/* TRACEPCB.CPP */ /* TRACEPCB.CPP */
/***************/ /***************/
void Trace_MirePcb(WinEDA_DrawPanel * panel, wxDC * DC, MIREPCB * MirePcb, int mode_color); void Trace_MirePcb( WinEDA_DrawPanel* panel, wxDC* DC, MIREPCB* MirePcb, int mode_color );
/***************/ /***************/
/* TRPISTE.CPP */ /* TRPISTE.CPP */
/***************/ /***************/
void Trace_Pistes(WinEDA_DrawPanel * panel, BOARD * Pcb, wxDC * DC, int drawmode); void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode );
void Trace_Une_Piste(WinEDA_DrawPanel * panel, wxDC * DC, TRACK * pt_start_piste,int nbsegment, int mode_color); void Trace_Une_Piste( WinEDA_DrawPanel* panel,
/* routine de trace de n segments consecutifs en memoire. wxDC* DC,
Utile pour monter une piste en cours de trace car les segments de cette TRACK* pt_start_piste,
piste sont alors contigus en memoire int nbsegment,
Parametres : int mode_color );
pt_start_piste = adresse de depart de la liste des segments
nbsegment = nombre de segments a tracer /* routine de trace de n segments consecutifs en memoire.
mode_color = mode ( GrXOR, GrOR..) * Utile pour monter une piste en cours de trace car les segments de cette
ATTENTION: * piste sont alors contigus en memoire
le point de depart d'une piste suivante DOIT exister: peut etre * Parametres :
donc mis a 0 avant appel a la routine si la piste a tracer est la derniere * pt_start_piste = adresse de depart de la liste des segments
*/ * nbsegment = nombre de segments a tracer
* mode_color = mode ( GrXOR, GrOR..)
void Trace_DrawSegmentPcb(WinEDA_DrawPanel * panel, wxDC * DC, DRAWSEGMENT * PtDrawSegment,int mode_color); * ATTENTION:
* le point de depart d'une piste suivante DOIT exister: peut etre
* donc mis a 0 avant appel a la routine si la piste a tracer est la derniere
*/
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel,
wxDC* DC,
DRAWSEGMENT* PtDrawSegment,
int mode_color );
/****************/ /****************/
/* TRACEMOD.C : */ /* TRACEMOD.C : */
/****************/ /****************/
void Trace_Pads_Only(WinEDA_DrawPanel * panel, wxDC * DC, MODULE * Module, int ox, int oy, void Trace_Pads_Only( WinEDA_DrawPanel* panel, wxDC* DC, MODULE* Module, int ox, int oy,
int MasqueLayer,int mode_color); int MasqueLayer, int mode_color );
/* Trace les pads d'un module en mode SKETCH.
Utilisee pour afficher les pastilles d'un module lorsque celui ci n'est /* Trace les pads d'un module en mode SKETCH.
pas affiche par les options d'affichage des Modules * Utilisee pour afficher les pastilles d'un module lorsque celui ci n'est
Les pads affiches doivent apparaitre sur les couches donnees par * pas affiche par les options d'affichage des Modules
MasqueLayer */ * Les pads affiches doivent apparaitre sur les couches donnees par
* MasqueLayer */
/****************/ /****************/
/* LOCATE.CPP : */ /* LOCATE.CPP : */
/****************/ /****************/
MODULE * ReturnModule(BOARD * Pcb, const wxString & name); MODULE* ReturnModule( BOARD* Pcb, const wxString& name );
/* Recherche d'une empreinte par son nom */
/* Recherche d'une empreinte par son nom */
D_PAD * ReturnPad(MODULE * Module, const wxString & name);
/* Recherche d'un pad par son nom, pour le module Module */ D_PAD* ReturnPad( MODULE* Module, const wxString& name );
TRACK * Locate_Via(BOARD * Pcb, const wxPoint & pos, int layer = -1); /* Recherche d'un pad par son nom, pour le module Module */
TRACK * Fast_Locate_Via(TRACK *start_adr, TRACK* end_adr, TRACK* Locate_Via( BOARD* Pcb, const wxPoint& pos, int layer = -1 );
const wxPoint & pos, int masquelayer);
/* Localise la via de centre le point x,y , sur les couches donnees TRACK* Locate_Via_Area( BOARD* Pcb, const wxPoint& pos, int layer = -1 );
par masquelayer.
la recherche se fait de l'adresse start_adr a end_adr(non comprise) TRACK* Fast_Locate_Via( TRACK* start_adr, TRACK* end_adr,
*/ const wxPoint& pos, int masquelayer );
TRACK* Fast_Locate_Piste(TRACK *start_adr, TRACK* end_adr, /* Localise la via de centre le point x,y , sur les couches donnees
const wxPoint & ref_pos, int masquelayer); * par masquelayer.
/* Localiste le segment dont une extremite coincide avec le point x,y * la recherche se fait de l'adresse start_adr a end_adr(non comprise)
sur les couches donnees par masquelayer */
la recherche se fait de l'adresse start_adr a end_adr(non comprise)
*/ TRACK* Fast_Locate_Piste( TRACK* start_adr, TRACK* end_adr,
const wxPoint& ref_pos, int masquelayer );
TRACK * Locate_Piste_Connectee( TRACK*ptr_piste, TRACK* pt_base,
TRACK* pt_lim,int extr); /* Localiste le segment dont une extremite coincide avec le point x,y
/* recherche le segment connecte au segment pointe par * sur les couches donnees par masquelayer
ptr_piste: * la recherche se fait de l'adresse start_adr a end_adr(non comprise)
si int = START, le point de debut du segment est utilise */
si int = END, le point de fin du segment est utilise
La recherche ne se fait que sur les EXTREMITES des segments TRACK* Locate_Piste_Connectee( TRACK* ptr_piste, TRACK* pt_base,
La recherche est limitee a la zone [pt_base...]pt_lim. TRACK* pt_lim, int extr );
*/
/* recherche le segment connecte au segment pointe par
TRACK * Locate_Pistes(TRACK * start_adresse,int layer, int typeloc); * ptr_piste:
TRACK * Locate_Pistes(TRACK * start_adresse, * si int = START, le point de debut du segment est utilise
const wxPoint & ref_pos,int layer); * si int = END, le point de fin du segment est utilise
/* * La recherche ne se fait que sur les EXTREMITES des segments
1 - routine de localisation du segment de piste pointe par la souris. * La recherche est limitee a la zone [pt_base...]pt_lim.
2 - routine de localisation du segment de piste pointe par le point */
ref_pX , ref_pY.
TRACK* Locate_Pistes( TRACK* start_adresse, int layer, int typeloc );
Si layer < 0 la couche n'est pas testee. TRACK* Locate_Pistes( TRACK* start_adresse,
const wxPoint& ref_pos, int layer );
La recherche commence a l'adresse start_adresse
*/ /*
* 1 - routine de localisation du segment de piste pointe par la souris.
D_PAD * Locate_Pad_Connecte(BOARD * Pcb, TRACK * ptr_segment, int extr); * 2 - routine de localisation du segment de piste pointe par le point
/* localisation de la pastille connectee au debut ou fin du segment * ref_pX , ref_pY.
entree : pointeur sur le segment, et flag = START ou END *
retourne: * Si layer < 0 la couche n'est pas testee.
un pointeur sur la description de la pastille si localisation *
pointeur NULL si pastille non trouvee */ * La recherche commence a l'adresse start_adresse
*/
D_PAD * Locate_Any_Pad(BOARD * Pcb, int typeloc, bool OnlyCurrentLayer = FALSE);
D_PAD * Locate_Any_Pad(BOARD * Pcb, const wxPoint & ref_pos, bool OnlyCurrentLayer = FALSE); D_PAD* Locate_Pad_Connecte( BOARD* Pcb, TRACK* ptr_segment, int extr );
/*
localisation de la pastille pointee par la coordonnee ref_pX,,ref_pY, ou /* localisation de la pastille connectee au debut ou fin du segment
par la souris, recherche faite sur toutes les empreintes. * entree : pointeur sur le segment, et flag = START ou END
entree : (OVERHAEAD) * retourne:
- coord souris (Curseur_X et Curseur_Y) * un pointeur sur la description de la pastille si localisation
ou ref_pX, ref_pY * pointeur NULL si pastille non trouvee */
retourne:
pointeur sur la description de la pastille si localisation D_PAD* Locate_Any_Pad( BOARD* Pcb, int typeloc, bool OnlyCurrentLayer = FALSE );
pointeur NULL si pastille non trouvee D_PAD* Locate_Any_Pad( BOARD* Pcb, const wxPoint& ref_pos, bool OnlyCurrentLayer = FALSE );
*/
/*
D_PAD * Locate_Pads(MODULE * Module, int layer, int typeloc) ; * localisation de la pastille pointee par la coordonnee ref_pX,,ref_pY, ou
D_PAD * Locate_Pads(MODULE * Module, const wxPoint & ref_pos,int layer) ; * par la souris, recherche faite sur toutes les empreintes.
/* localisation de la pastille pointee par la coordonnee ref_pX,,ref_pY, ou * entree : (OVERHAEAD)
par la souris, concernant l'empreinte en cours. * - coord souris (Curseur_X et Curseur_Y)
entree : * ou ref_pX, ref_pY
- parametres generaux de l'empreinte mise a jous par caract() * retourne:
- layer = couche ou doit se trouver la pastille * pointeur sur la description de la pastille si localisation
(si layer < 0 ) la couche est ignoree) * pointeur NULL si pastille non trouvee
retourne: */
un pointeur sur la description de la pastille si localisation
pointeur NULL si pastille non trouvee D_PAD* Locate_Pads( MODULE* Module, int layer, int typeloc );
*/ D_PAD* Locate_Pads( MODULE* Module, const wxPoint& ref_pos, int layer );
MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc); /* localisation de la pastille pointee par la coordonnee ref_pX,,ref_pY, ou
/* localisation d'une empreinte par son rectangle d'encadrement */ * par la souris, concernant l'empreinte en cours.
* entree :
D_PAD * Locate_Pads(MODULE * Module, int typeloc); * - parametres generaux de l'empreinte mise a jous par caract()
/* localisation de la pastille pointee par la souris, concernant l'empreinte * - layer = couche ou doit se trouver la pastille
Module. * (si layer < 0 ) la couche est ignoree)
entree : * retourne:
- parametres generaux de l'empreinte mise a jous par caract() * un pointeur sur la description de la pastille si localisation
retourne: * pointeur NULL si pastille non trouvee
un pointeur sur la description de la pastille si localisation */
pointeur NULL si pastille non trouvee
*/ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc );
TRACK * Locate_Pistes(TRACK * start_adresse, int typeloc); /* localisation d'une empreinte par son rectangle d'encadrement */
/* routine de localisation du segment de piste pointe par la souris
La recherche commence a l'adresse start_adresse */ D_PAD* Locate_Pads( MODULE* Module, int typeloc );
DRAWSEGMENT * Locate_Segment_Pcb(BOARD * Pcb, int LayerSearch , int typeloc) ; /* localisation de la pastille pointee par la souris, concernant l'empreinte
* Module.
* entree :
D_PAD * Fast_Locate_Pad_Connecte(BOARD * Pcb, const wxPoint & ref_pos, int layer); * - parametres generaux de l'empreinte mise a jous par caract()
/* Routine cherchant le pad contenant le point px,py, sur la couche layer * retourne:
( extremite de piste ) * un pointeur sur la description de la pastille si localisation
La liste des pads doit deja exister. * pointeur NULL si pastille non trouvee
*/
retourne :
NULL si pas de pad localise. TRACK* Locate_Pistes( TRACK* start_adresse, int typeloc );
pointeur sur le pad correspondante si pad trouve
(bonne position ET bonne couche). */ /* routine de localisation du segment de piste pointe par la souris
* La recherche commence a l'adresse start_adresse */
TRACK * Locate_Zone(TRACK * start_adresse,int layer, int typeloc); DRAWSEGMENT* Locate_Segment_Pcb( BOARD* Pcb, int LayerSearch, int typeloc );
TRACK * Locate_Zone(TRACK * start_adresse, const wxPoint & ref_pos,int layer);
/*
1 - routine de localisation du segment de zone pointe par la souris. D_PAD* Fast_Locate_Pad_Connecte( BOARD* Pcb, const wxPoint& ref_pos, int layer );
2 - routine de localisation du segment de zone pointe par le point
ref_pX , ref_pY.r /* Routine cherchant le pad contenant le point px,py, sur la couche layer
* ( extremite de piste )
Si layer == -1 , le tst de la couche n'est pas fait * La liste des pads doit deja exister.
*
La recherche commence a l'adresse start_adresse * retourne :
*/ * NULL si pas de pad localise.
* pointeur sur le pad correspondante si pad trouve
* (bonne position ET bonne couche). */
/*************/
/* MODULES.C */
/*************/ TRACK* Locate_Zone( TRACK* start_adresse, int layer, int typeloc );
int ChangeSideNumLayer(int oldlayer); TRACK* Locate_Zone( TRACK* start_adresse, const wxPoint& ref_pos, int layer );
void DrawModuleOutlines(WinEDA_DrawPanel * panel, wxDC * DC, MODULE * module);
void Montre_Position_Empreinte(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) ; /*
* 1 - routine de localisation du segment de zone pointe par la souris.
* 2 - routine de localisation du segment de zone pointe par le point
* ref_pX , ref_pY.r
*
* Si layer == -1 , le tst de la couche n'est pas fait
*
* La recherche commence a l'adresse start_adresse
*/
/*************/
/* MODULES.C */
/*************/
int ChangeSideNumLayer( int oldlayer );
void DrawModuleOutlines( WinEDA_DrawPanel* panel, wxDC* DC, MODULE* module );
void Montre_Position_Empreinte( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
/* LOADCMP.C : */ /* LOADCMP.C : */
MODULE * Load_Module_From_Library(WinEDA_DrawFrame * frame, wxDC * DC); MODULE* Load_Module_From_Library( WinEDA_DrawFrame* frame, wxDC* DC );
/****************/ /****************/
/* EDITRACK.C : */ /* EDITRACK.C : */
/****************/ /****************/
void ShowNewTrackWhenMovingCursor(WinEDA_DrawPanel * panel, void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel,
wxDC * DC, bool erase); wxDC* DC, bool erase );
void Calcule_Coord_Extremite_45( int ox, int oy, int* fx, int* fy );
void Calcule_Coord_Extremite_45(int ox, int oy, int *fx, int * fy); /* determine les coord fx et fy d'un segment
/* determine les coord fx et fy d'un segment * pour avoir un segment oriente a 0, 90 ou 45 degres, selon position
pour avoir un segment oriente a 0, 90 ou 45 degres, selon position * du point d'origine (ox,oy) et de la souris */
du point d'origine (ox,oy) et de la souris */
/*****************/ /*****************/
/* TRACK.CPP : */ /* TRACK.CPP : */
/*****************/ /*****************/
TRACK * Marque_Une_Piste(WinEDA_BasePcbFrame * frame, wxDC * DC, TRACK* Marque_Une_Piste( WinEDA_BasePcbFrame* frame, wxDC* DC,
TRACK* pt_segm, int * nb_segm, int flagcolor); TRACK* pt_segm, int* nb_segm, int flagcolor );
/* Routine de Marquage de 1 piste, a partir du segment pointe par pt_segm.
le segment pointe est marque puis les segments adjacents /* Routine de Marquage de 1 piste, a partir du segment pointe par pt_segm.
jusqu'a un pad ou un point de jonction de plus de 2 segments * le segment pointe est marque puis les segments adjacents
le marquage est la mise a 1 du bit BUSY du parametre .status * jusqu'a un pad ou un point de jonction de plus de 2 segments
Les segments sont ensuite reclasses pour etre contigus en memoire * le marquage est la mise a 1 du bit BUSY du parametre .status
Retourne: * Les segments sont ensuite reclasses pour etre contigus en memoire
adresse du 1er segment de la chaine creee * Retourne:
nombre de segments */ * adresse du 1er segment de la chaine creee
* nombre de segments */
int ReturnEndsTrack(TRACK* RefTrack, int NbSegm,
TRACK ** StartTrack, TRACK ** EndTrack); int ReturnEndsTrack( TRACK* RefTrack, int NbSegm,
/* Calcule les coordonnes des extremites d'une piste TRACK** StartTrack, TRACK** EndTrack );
retourne 1 si OK, 0 si piste bouclee
Les coord sont retournees en StartTrack->ox, oy /* Calcule les coordonnes des extremites d'une piste
et EndTrack->fx, fy si OK * retourne 1 si OK, 0 si piste bouclee
Les segments sont supposes chaines de facon consecutive */ * Les coord sont retournees en StartTrack->ox, oy
* et EndTrack->fx, fy si OK
void ListSetState(EDA_BaseStruct * Start, int Nbitem,int State, int onoff); * Les segments sont supposes chaines de facon consecutive */
/* Met a jour le membre .state d'une chaine de structures */
void ListSetState( EDA_BaseStruct* Start, int Nbitem, int State, int onoff );
/* Met a jour le membre .state d'une chaine de structures */
/*****************/ /*****************/
/* EDITEDGE.CPP : */ /* EDITEDGE.CPP : */
/*****************/ /*****************/
void Trace_1_Edge(WinEDA_DrawPanel * panel, wxDC * DC, TRACK * start_edge, int nbpoint, int mode_color); void Trace_1_Edge( WinEDA_DrawPanel* panel,
wxDC* DC,
TRACK* start_edge,
int nbpoint,
int mode_color );
/************/ /************/
/* DRC.CPP : */ /* DRC.CPP : */
/************/ /************/
int Drc(WinEDA_BasePcbFrame * frame, wxDC * DC, int Drc( WinEDA_BasePcbFrame* frame, wxDC* DC,
TRACK * pt_segment, TRACK * pt_start_buffer, int show_err); TRACK* pt_segment, TRACK* pt_start_buffer, int show_err );
/* Teste le segment pointe par pt_segment:
debsegment = adresse du segment a tester /* Teste le segment pointe par pt_segment:
pt_start_buffer = adresse de la zone piste * debsegment = adresse du segment a tester
show_err (flag) si 0 pas d'affichage d'erreur sur ecran * pt_start_buffer = adresse de la zone piste
retourne : * show_err (flag) si 0 pas d'affichage d'erreur sur ecran
BAD_DRC (1) si Violation DRC * retourne :
OK_DRC (0) si OK */ * BAD_DRC (1) si Violation DRC
* OK_DRC (0) si OK */
/*****************/ /*****************/
/* TR_MODIF.CPP : */ /* TR_MODIF.CPP : */
/*****************/ /*****************/
int EraseOldTrack(WinEDA_BasePcbFrame * frame, BOARD * Pcb, wxDC * DC, int EraseOldTrack( WinEDA_BasePcbFrame* frame, BOARD* Pcb, wxDC* DC,
TRACK * pt_new_track, int nbptnewpiste); TRACK* pt_new_track, int nbptnewpiste );
void Modif_Auto_Route(TRACK * pt_debut_new_piste) ; void Modif_Auto_Route( TRACK* pt_debut_new_piste );
/**************/
/* CLEAN.CPP : */
/**************/
int Netliste_Controle_piste( WinEDA_PcbFrame* frame, wxDC* DC, int affiche );
/**************/ /* Supprime les segments mal connectes, cad interconnectant des segments
/* CLEAN.CPP : */ * de net_code differents */
/**************/
int Netliste_Controle_piste(WinEDA_PcbFrame * frame, wxDC * DC, int affiche);
/* Supprime les segments mal connectes, cad interconnectant des segments
de net_code differents */
/************/
/* BLOCK.CPP */
/************/
/************/ void Block_Affiche( int on_off ); /*
/* BLOCK.CPP */ * routine de trace du cadre d'un Block en cours de delimitation
/************/ * Si on_off = 0 : effacement du cadre
* Si on_off = 1 : affichage du cadre */
void Block_Affiche(int on_off); /* void Trace_Block( WinEDA_DrawPanel* panel, wxDC* DC, int ox, int oy, int fx, int fy, int color );
routine de trace du cadre d'un Block en cours de delimitation
Si on_off = 0 : effacement du cadre
Si on_off = 1 : affichage du cadre */
void Trace_Block(WinEDA_DrawPanel * panel, wxDC * DC, int ox, int oy, int fx, int fy , int color ); /* Routine de trace d'un rectangle symbolisant un block
/* Routine de trace d'un rectangle symbolisant un block * (toujours en mode XOR) */
(toujours en mode XOR) */
/***************/ /***************/
/* PLOT_RTN.CPP */ /* PLOT_RTN.CPP */
/***************/ /***************/
void Affiche_erreur(int nb_err) ; void Affiche_erreur( int nb_err );
/*****************************************************************/ /*****************************************************************/
/* AFFICHE.CPP: (Fonctions d'affichage de messages, parametres... */ /* AFFICHE.CPP: (Fonctions d'affichage de messages, parametres... */
/*****************************************************************/ /*****************************************************************/
void Affiche_Infos_Equipot(int netcode, WinEDA_BasePcbFrame * frame); void Affiche_Infos_Equipot( int netcode, WinEDA_BasePcbFrame* frame );
/************/ /************/
/* ZONES.CPP */ /* ZONES.CPP */
/************/ /************/
int Propagation(WinEDA_PcbFrame * frame); int Propagation( WinEDA_PcbFrame* frame );
/***************/ /***************/
/* ATTRIBUT.CPP */ /* ATTRIBUT.CPP */
/***************/ /***************/
void MasqueAttributs( int * masque_set, int * masque_clr); void MasqueAttributs( int* masque_set, int* masque_clr );
/* Calcule les attributs a remettre a 0 (masque_clr) et a mettre a 1
(masque_set), en fonction des options d'attributs
ces attributs sont normalement le membre .flags de la structure TRACK /* Calcule les attributs a remettre a 0 (masque_clr) et a mettre a 1
les pointeurs NULLs sont acceptes * (masque_set), en fonction des options d'attributs
*/ *
* ces attributs sont normalement le membre .flags de la structure TRACK
* les pointeurs NULLs sont acceptes
*/
/***************/ /***************/
/* DUPLTRAC.CPP */ /* DUPLTRAC.CPP */
/***************/ /***************/
EDA_BaseStruct * LocateLockPoint(BOARD * Pcb, wxPoint pos, int LayerMask); EDA_BaseStruct* LocateLockPoint( BOARD* Pcb, wxPoint pos, int LayerMask );
/* Routine trouvant le point " d'accrochage " d'une extremite de piste.
Ce point peut etre un PAD ou un autre segment de piste /* Routine trouvant le point " d'accrochage " d'une extremite de piste.
Retourne: * Ce point peut etre un PAD ou un autre segment de piste
- pointeur sur ce PAD ou: * Retourne:
- pointeur sur le segment ou: * - pointeur sur ce PAD ou:
- NULL * - pointeur sur le segment ou:
Parametres d'appel: * - NULL
coord pX, pY du point tst * Parametres d'appel:
masque des couches a tester */ * coord pX, pY du point tst
* masque des couches a tester
*/
TRACK * CreateLockPoint(int *pX, int *pY, TRACK * ptsegm, TRACK * refsegm);
/* Routine de creation d'un point intermediaire sur un segment
le segment ptsegm est casse en 2 segments se raccordant au point pX, pY TRACK* CreateLockPoint( int* pX, int* pY, TRACK* ptsegm, TRACK* refsegm );
retourne:
NULL si pas de nouveau point ( c.a.d si pX, pY correspondait deja /* Routine de creation d'un point intermediaire sur un segment
a une extremite ou: * le segment ptsegm est casse en 2 segments se raccordant au point pX, pY
pointeur sur le segment cree * retourne:
si refsegm != NULL refsegm est pointeur sur le segment incident, * NULL si pas de nouveau point ( c.a.d si pX, pY correspondait deja
et le point cree est l'ntersection des 2 axes des segments ptsegm et * a une extremite ou:
refsegm * pointeur sur le segment cree
retourne la valeur exacte de pX et pY * si refsegm != NULL refsegm est pointeur sur le segment incident,
*/ * et le point cree est l'ntersection des 2 axes des segments ptsegm et
* refsegm
* retourne la valeur exacte de pX et pY
*/
/****************/ /****************/
/* CONTROLE.CPP */ /* CONTROLE.CPP */
...@@ -348,21 +390,22 @@ void RemoteCommand( const char* cmdline ); ...@@ -348,21 +390,22 @@ void RemoteCommand( const char* cmdline );
/***************/ /***************/
/* AUTOPLACE.CPP */ /* AUTOPLACE.CPP */
/***************/ /***************/
int Calcule_Encadrement_EdgeBoard(); int Calcule_Encadrement_EdgeBoard();
/***************/ /***************/
/* AUTOROUT.CPP */ /* AUTOROUT.CPP */
/***************/ /***************/
void DisplayBoard(WinEDA_DrawPanel * panel, wxDC * DC); /* routine de Debug */ void DisplayBoard( WinEDA_DrawPanel* panel, wxDC* DC ); /* routine de Debug */
/**************/ /**************/
/* NETLIST.CPP */ /* NETLIST.CPP */
/**************/ /**************/
MODULE * ListAndSelectModuleName(COMMAND * Cmd); MODULE* ListAndSelectModuleName( COMMAND* Cmd );
/* liste les noms des modules du PCB
Retourne un pointeur sur le module selectionne /* liste les noms des modules du PCB
( ou NULL si pas de selection ) */ * Retourne un pointeur sur le module selectionne
* ( ou NULL si pas de selection ) */
/***************/ /***************/
/* LAY2PLOT.CPP */ /* LAY2PLOT.CPP */
...@@ -371,9 +414,8 @@ MODULE * ListAndSelectModuleName(COMMAND * Cmd); ...@@ -371,9 +414,8 @@ MODULE * ListAndSelectModuleName(COMMAND * Cmd);
/*****************/ /*****************/
/* SET_COLOR.CPP */ /* SET_COLOR.CPP */
/*****************/ /*****************/
void DisplayColorSetupFrame(WinEDA_DrawFrame * parent, void DisplayColorSetupFrame( WinEDA_DrawFrame* parent,
const wxPoint & framepos); const wxPoint& framepos );
#endif /* #define PROTO_H */
#endif /* #define PROTO_H */
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