Commit 1dbf5e21 authored by dickelbeck's avatar dickelbeck

beautify

parent 4b8925dd
...@@ -499,25 +499,25 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) ...@@ -499,25 +499,25 @@ 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;
if (keep_on_grid) { if( keep_on_grid )
{
wxPoint on_grid = curpos; wxPoint on_grid = curpos;
PutOnGrid(&on_grid); PutOnGrid( &on_grid );
if (Magnetize(m_Pcb, (WinEDA_PcbFrame *) this, m_ID_current_state, if( Magnetize(m_Pcb, (WinEDA_PcbFrame *) this, m_ID_current_state,
GetScreen()->GetGrid(), on_grid, curpos)) GetScreen()->GetGrid(), on_grid, curpos) )
GetScreen()->m_Curseur = curpos; GetScreen()->m_Curseur = curpos;
else { else
extern TRACK *LocateIntrusion(TRACK *start, int net, int width); {
/* /*
* If there's an intrusion and DRC is active, we pass the cursor * If there's an intrusion and DRC is active, we pass the cursor
* "as is", and let ShowNewTrackWhenMovingCursor figure our what to * "as is", and let ShowNewTrackWhenMovingCursor figure our what to
* do. * do.
*/ */
if (!Drc_On || !g_CurrentTrackSegment || if( !Drc_On || !g_CurrentTrackSegment
g_CurrentTrackSegment != this->GetCurItem() || || g_CurrentTrackSegment != this->GetCurItem()
!LocateIntrusion(m_Pcb->m_Track, g_CurrentTrackSegment->GetNet(), || !LocateIntrusion(m_Pcb->m_Track, g_CurrentTrackSegment->GetNet(),
g_CurrentTrackSegment->m_Width)) g_CurrentTrackSegment->m_Width ) )
GetScreen()->m_Curseur = on_grid; GetScreen()->m_Curseur = on_grid;
} }
} }
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include "protos.h" #include "protos.h"
#include "drc_stuff.h" #include "drc_stuff.h"
#include "trigo.h"
/* Routines Locales */ /* Routines Locales */
...@@ -281,6 +283,7 @@ int WinEDA_PcbFrame::Add_45_degrees_Segment( wxDC* DC, TRACK* pt_segm ) ...@@ -281,6 +283,7 @@ int WinEDA_PcbFrame::Add_45_degrees_Segment( wxDC* DC, TRACK* pt_segm )
pas_45 = GetScreen()->GetGrid().x / 2; pas_45 = GetScreen()->GetGrid().x / 2;
if( pas_45 < pt_segm->m_Width ) if( pas_45 < pt_segm->m_Width )
pas_45 = GetScreen()->GetGrid().x; pas_45 = GetScreen()->GetGrid().x;
while( pas_45 < pt_segm->m_Width ) while( pas_45 < pt_segm->m_Width )
pas_45 *= 2; pas_45 *= 2;
...@@ -436,6 +439,7 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC ) ...@@ -436,6 +439,7 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
{ {
adr_buf = (TRACK*) LockPoint; adr_buf = (TRACK*) LockPoint;
g_HightLigth_NetCode = adr_buf->GetNet(); g_HightLigth_NetCode = adr_buf->GetNet();
/* creation eventuelle d'un point d'accrochage */ /* creation eventuelle d'un point d'accrochage */
LockPoint = CreateLockPoint( &g_CurrentTrackSegment->m_End.x, LockPoint = CreateLockPoint( &g_CurrentTrackSegment->m_End.x,
&g_CurrentTrackSegment->m_End.y, &g_CurrentTrackSegment->m_End.y,
...@@ -493,121 +497,126 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC ) ...@@ -493,121 +497,126 @@ 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) TRACK* LocateIntrusion( TRACK* start, int net, int width )
{ {
int layer = ((PCB_SCREEN *) ActiveScreen)->m_Active_Layer; int layer = ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer;
int layer_mask = g_TabOneLayerMask[layer]; int layer_mask = g_TabOneLayerMask[layer];
wxPoint ref = ActiveScreen->RefPos(1); wxPoint ref = ActiveScreen->RefPos( 1 );
TRACK *track, *found = NULL; TRACK* track, * found = NULL;
for (track = start; track; track = track->Next()) { for( track = start; track; track = track->Next() )
{
int dist; int dist;
wxPoint pos, vec; wxPoint pos, vec;
int64_t tmp; int64_t tmp;
/* Locate_Pistes */ /* Locate_Pistes */
if (track->GetState(BUSY | DELETED)) if( track->GetState( BUSY | DELETED ) )
continue; continue;
if (!(g_TabOneLayerMask[track->GetLayer()] & layer_mask))
if( !(g_TabOneLayerMask[track->GetLayer()] & layer_mask) )
continue; continue;
if (track->GetNet() == net)
if( track->GetNet() == net )
continue; continue;
if (track->Type() == TYPEVIA)
if( track->Type() == TYPEVIA )
continue; continue;
/* TRACK::HitTest */ /* TRACK::HitTest */
dist = width/2 + track->m_Width/2 + g_DesignSettings.m_TrackClearence; dist = width / 2 + track->m_Width / 2 + g_DesignSettings.m_TrackClearence;
pos = ref-track->m_Start; pos = ref - track->m_Start;
vec = track->m_End-track->m_Start; vec = track->m_End - track->m_Start;
if (!DistanceTest(dist, vec.x, vec.y, pos.x, pos.y))
if( !DistanceTest( dist, vec.x, vec.y, pos.x, pos.y ) )
continue; continue;
found = track; found = track;
/* prefer intrusions from the side, not the end */ /* prefer intrusions from the side, not the end */
tmp = (int64_t) pos.x*vec.x + (int64_t) pos.y*vec.y; 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) if( tmp >= 0 && tmp <= (int64_t) vec.x * vec.x + (int64_t) vec.y * vec.y )
break; break;
} }
return found; return found;
} }
/**
static void PushTrack(WinEDA_DrawPanel *panel) * Function PushTrack
* detects 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
*/
static void PushTrack( WinEDA_DrawPanel* panel )
{ {
BOARD *pcb = ((WinEDA_BasePcbFrame *) (panel->m_Parent))->m_Pcb; BOARD* pcb = ( (WinEDA_BasePcbFrame*) (panel->m_Parent) )->m_Pcb;
wxPoint cursor = ActiveScreen->m_Curseur; wxPoint cursor = ActiveScreen->m_Curseur;
wxPoint cv, vec, n; wxPoint cv, vec, n;
TRACK *track = g_CurrentTrackSegment; TRACK* track = g_CurrentTrackSegment;
TRACK *other; TRACK* other;
int64_t det; int64_t det;
int dist; int dist;
double f; double f;
other = LocateIntrusion(pcb->m_Track, track->GetNet(), track->m_Width); other = LocateIntrusion( pcb->m_Track, track->GetNet(), track->m_Width );
/* are we currently pointing into a conflicting trace ? */ /* are we currently pointing into a conflicting trace ? */
if (!other) if( !other )
return; return;
if (other->GetNet() == track->GetNet())
if( other->GetNet() == track->GetNet() )
return; return;
cv = cursor-other->m_Start; cv = cursor - other->m_Start;
vec = other->m_End-other->m_Start; vec = other->m_End - other->m_Start;
det = (int64_t) cv.x*vec.y - (int64_t) cv.y*vec.x; det = (int64_t) cv.x * vec.y - (int64_t) cv.y * vec.x;
/* cursor is right at the center of the old track */ /* cursor is right at the center of the old track */
if (!det) if( !det )
return; return;
dist = (track->m_Width+1)/2 + (other->m_Width+1)/2 + dist = (track->m_Width + 1) / 2 + (other->m_Width + 1) / 2 +
g_DesignSettings.m_TrackClearence+2; g_DesignSettings.m_TrackClearence + 2;
/* /*
* DRC wants >, so +1. * DRC wants >, so +1.
* We may have a quantization error of 1/sqrt(2), so +1 again. * We may have a quantization error of 1/sqrt(2), so +1 again.
*/ */
/* Vector "n" is perpendicular to "other", pointing towards the cursor. */ /* Vector "n" is perpendicular to "other", pointing towards the cursor. */
if (det > 0) { if( det > 0 )
{
n.x = vec.y; n.x = vec.y;
n.y = -vec.x; n.y = -vec.x;
} }
else { else
{
n.x = -vec.y; n.x = -vec.y;
n.y = vec.x; n.y = vec.x;
} }
f = dist/hypot(n.x, n.y); f = dist / hypot( n.x, n.y );
n.x = (int) round(f*n.x); n.x = (int) round( f * n.x );
n.y = (int) round(f*n.y); n.y = (int) round( f * n.y );
Project(track->m_End, cursor, other); Project( track->m_End, cursor, other );
track->m_End += n; track->m_End += n;
} }
/****************************************************************************/ /****************************************************************************/
void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
/****************************************************************************/ /****************************************************************************/
......
...@@ -224,6 +224,8 @@ MODULE* Load_Module_From_Library( WinEDA_DrawFrame* frame, wxDC* DC ); ...@@ -224,6 +224,8 @@ MODULE* Load_Module_From_Library( WinEDA_DrawFrame* frame, wxDC* DC );
/* EDITRACK.C : */ /* EDITRACK.C : */
/****************/ /****************/
TRACK* LocateIntrusion( TRACK* start, int net, int width );
void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel, void ShowNewTrackWhenMovingCursor( WinEDA_DrawPanel* panel,
wxDC* DC, bool erase ); wxDC* DC, bool erase );
...@@ -385,6 +387,7 @@ TRACK* CreateLockPoint( int* pX, int* pY, TRACK* ptsegm, TRACK* refsegm ...@@ -385,6 +387,7 @@ TRACK* CreateLockPoint( int* pX, int* pY, TRACK* ptsegm, TRACK* refsegm
/* CONTROLE.CPP */ /* CONTROLE.CPP */
/****************/ /****************/
void RemoteCommand( const char* cmdline ); void RemoteCommand( const char* cmdline );
bool Project( wxPoint& res, wxPoint on_grid, const TRACK* track );
/***************/ /***************/
......
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