KiCad PCB EDA Suite
editrack.cpp File Reference
#include <fctsys.h>
#include <class_drawpanel.h>
#include <trigo.h>
#include <pcb_edit_frame.h>
#include <pcbnew.h>
#include <drc.h>
#include <protos.h>
#include <class_board.h>
#include <class_track.h>
#include <class_zone.h>
#include <connectivity/connectivity_data.h>

Go to the source code of this file.

Functions

static void Abort_Create_Track (EDA_DRAW_PANEL *panel, wxDC *DC)
 
void ShowNewTrackWhenMovingCursor (EDA_DRAW_PANEL *aPanel, wxDC *aDC, const wxPoint &aPosition, bool aErase)
 
static void ComputeBreakPoint (TRACK *track, int SegmentCount, wxPoint end)
 Compute new track angle based on previous track. More...
 
static void DeleteNullTrackSegments (BOARD *pcb, DLIST< TRACK > &aTrackList)
 
static void EnsureEndTrackOnPad (D_PAD *Pad)
 
TRACKLocateIntrusion (TRACK *listStart, TRACK *aTrack, LAYER_NUM aLayer, const wxPoint &aRef)
 
static void PushTrack (EDA_DRAW_PANEL *panel)
 Function PushTrack detects if the mouse is pointing into a conflicting track. More...
 
void DrawViaCirclesWhenEditingNewTrack (EDA_RECT *aPanelClipBox, wxDC *aDC, const wxPoint &aPos, int aViaRadius, int aViaRadiusWithClearence, COLOR4D aColor)
 
wxPoint CalculateSegmentEndPoint (const wxPoint &aPosition, const wxPoint &aOrigin)
 Determine end point for a segment direction 0, 90, or 45 degrees depending on it's position from the origin aOrigin and aPosition. More...
 

Variables

static PICKED_ITEMS_LIST s_ItemsListPicker
 

Function Documentation

static void Abort_Create_Track ( EDA_DRAW_PANEL panel,
wxDC *  DC 
)
static

Definition at line 60 of file editrack.cpp.

References PICKED_ITEMS_LIST::ClearListAndDeleteItems(), EDA_DRAW_FRAME::ClearMsgPanel(), DHEAD::DeleteAll(), BOARD::DrawHighLight(), dyn_cast(), g_CurrentTrackList, PCB_BASE_FRAME::GetBoard(), PCB_BASE_FRAME::GetCurItem(), BOARD::GetHighLightNetCode(), EDA_DRAW_PANEL::GetParent(), PCB_EDIT_FRAME::HighLight(), BOARD::IsHighLightNetON(), BOARD::PopHighLight(), PCB_BASE_EDIT_FRAME::PutDataInPreviousState(), PCB_BASE_FRAME::SetCurItem(), and ShowNewTrackWhenMovingCursor().

Referenced by PCB_EDIT_FRAME::Begin_Route().

61 {
62  PCB_EDIT_FRAME* frame = (PCB_EDIT_FRAME*) Panel->GetParent();
63  BOARD* pcb = frame->GetBoard();
64  TRACK* track = dyn_cast<TRACK*>( frame->GetCurItem() );
65 
66  if( track )
67  {
68  // Erase the current drawing
69  ShowNewTrackWhenMovingCursor( Panel, DC, wxDefaultPosition, false );
70 
71  if( pcb->IsHighLightNetON() )
72  frame->HighLight( DC );
73 
74  pcb->PopHighLight();
75 
76  if( pcb->IsHighLightNetON() )
77  pcb->DrawHighLight( Panel, DC, pcb->GetHighLightNetCode() );
78 
79  frame->ClearMsgPanel();
80 
81  // Undo pending changes (mainly a lock point creation) and clear the
82  // undo picker list:
83  frame->PutDataInPreviousState( &s_ItemsListPicker, false, false );
85 
86  // Delete current (new) track
88  }
89 
90  frame->SetCurItem( NULL );
91 }
DLIST< TRACK > g_CurrentTrackList
Definition: pcbnew.cpp:90
void SetCurItem(BOARD_ITEM *aItem, bool aDisplayInfo=true)
Function SetCurItem sets the currently selected item and displays it in the MsgPanel.
BOARD * GetBoard() const
void DeleteAll()
Function DeleteAll deletes all items on the list and leaves the list empty.
Definition: dlist.cpp:44
Casted dyn_cast(From aObject)
Function dyn_cast()
Definition: typeinfo.h:61
void PopHighLight()
Function PopHighLight retrieve a previously saved high light info.
void PutDataInPreviousState(PICKED_ITEMS_LIST *aList, bool aRedoCommand, bool aRebuildRatsnet=true)
Function PutDataInPreviousState Used in undo or redo command.
Definition: undo_redo.cpp:409
void HighLight(wxDC *DC)
Function HighLight.
Definition: highlight.cpp:105
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:170
Class PCB_EDIT_FRAME is the main frame for Pcbnew.
void ShowNewTrackWhenMovingCursor(EDA_DRAW_PANEL *aPanel, wxDC *aDC, const wxPoint &aPosition, bool aErase)
Definition: editrack.cpp:665
static PICKED_ITEMS_LIST s_ItemsListPicker
Definition: editrack.cpp:55
bool IsHighLightNetON() const
Function IsHighLightNetON.
Definition: class_board.h:387
int GetHighLightNetCode() const
Function GetHighLightNetCode.
Definition: class_board.h:372
void DrawHighLight(EDA_DRAW_PANEL *aDrawPanel, wxDC *aDC, int aNetCode)
Function DrawHighLight redraws the objects in the board that are associated with the given aNetCode a...
BOARD_ITEM * GetCurItem()
void ClearMsgPanel(void)
Clear all messages from the message panel.
void ClearListAndDeleteItems()
Function ClearListAndDeleteItems deletes the list of pickers, AND the data pointed by m_PickedItem or...
wxPoint CalculateSegmentEndPoint ( const wxPoint aPosition,
const wxPoint aOrigin 
)

Determine end point for a segment direction 0, 90, or 45 degrees depending on it's position from the origin aOrigin and aPosition.

Definition at line 800 of file editrack.cpp.

References abs, PNS::angle(), min, wxPoint::x, and wxPoint::y.

Referenced by DrawSegment(), Show_New_Edge_While_Move_Mouse(), and ShowNewTrackWhenMovingCursor().

801 {
802  // Determine end point for a segment direction 0, 90, or 45 degrees
803  // depending on it's position from the origin \a aOrigin and \a aPosition.
804  wxPoint endPoint;
805 
806  int deltax = aPosition.x - aOrigin.x;
807  int deltay = aPosition.y - aOrigin.y;
808 
809  deltax = abs( deltax );
810  deltay = abs( deltay );
811  int angle = 45;
812 
813  if( deltax >= deltay )
814  {
815  if( deltax == 0 )
816  angle = 0;
817  else if( ( (deltay << 6 ) / deltax ) < 26 )
818  angle = 0;
819  }
820  else
821  {
822  angle = 45;
823 
824  if( deltay == 0 )
825  angle = 90;
826  else if( ( (deltax << 6 ) / deltay ) < 26 )
827  angle = 90;
828  }
829 
830  switch( angle )
831  {
832  case 0:
833  endPoint.x = aPosition.x;
834  endPoint.y = aOrigin.y;
835  break;
836 
837  case 45:
838  deltax = std::min( deltax, deltay );
839  deltay = deltax;
840 
841  // Recalculate the signs for deltax and deltaY.
842  if( ( aPosition.x - aOrigin.x ) < 0 )
843  deltax = -deltax;
844 
845  if( ( aPosition.y - aOrigin.y ) < 0 )
846  deltay = -deltay;
847 
848  endPoint.x = aOrigin.x + deltax;
849  endPoint.y = aOrigin.y + deltay;
850  break;
851 
852  case 90:
853  endPoint.x = aOrigin.x;
854  endPoint.y = aPosition.y;
855  break;
856  }
857 
858  return endPoint;
859 }
#define abs(a)
Definition: auxiliary.h:84
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
#define min(a, b)
Definition: auxiliary.h:85
void ComputeBreakPoint ( TRACK track,
int  n,
wxPoint  end 
)
static

Compute new track angle based on previous track.

Definition at line 865 of file editrack.cpp.

References abs, TRACK::Back(), g_Alternate_Track_Posture, TRACK::GetEnd(), TRACK::GetStart(), TRACK::IsNull(), min, TRACK::SetEnd(), TRACK::SetStart(), wxPoint::x, and wxPoint::y.

Referenced by ShowNewTrackWhenMovingCursor().

866 {
867  int iDx = 0;
868  int iDy = 0;
869  int iAngle = 0;
870 
871  if( SegmentCount <= 0 )
872  return;
873 
874  if( track == NULL )
875  return;
876 
877  TRACK* newTrack = track;
878  track = track->Back();
879  SegmentCount--;
880 
881  if( track )
882  {
883  iDx = end.x - track->GetStart().x;
884  iDy = end.y - track->GetStart().y;
885 
886  iDx = abs( iDx );
887  iDy = abs( iDy );
888  }
889 
890  TRACK* lastTrack = track ? track->Back() : NULL;
891 
892  if( lastTrack )
893  {
894  if(( (lastTrack->GetEnd().x == lastTrack->GetStart().x)
895  || (lastTrack->GetEnd().y == lastTrack->GetStart().y) )
897  {
898  iAngle = 45;
899  }
900  }
901  else
902  {
904  {
905  iAngle = 45;
906  }
907  }
908 
909  if( iAngle == 0 )
910  {
911  if( iDx >= iDy )
912  iAngle = 0;
913  else
914  iAngle = 90;
915  }
916 
917  if( track == NULL )
918  iAngle = -1;
919 
920  switch( iAngle )
921  {
922  case -1:
923  break;
924 
925  case 0:
926  if( ( end.x - track->GetStart().x ) < 0 )
927  track->SetEnd(wxPoint( end.x + iDy, track->GetStart().y));
928  else
929  track->SetEnd(wxPoint( end.x - iDy, track->GetStart().y));
930  break;
931 
932  case 45:
933  iDx = std::min( iDx, iDy );
934  iDy = iDx;
935 
936  // Recalculate the signs for deltax and deltaY.
937  if( ( end.x - track->GetStart().x ) < 0 )
938  iDx = -iDx;
939 
940  if( ( end.y - track->GetStart().y ) < 0 )
941  iDy = -iDy;
942 
943  track->SetEnd(wxPoint(track->GetStart().x + iDx, track->GetStart().y + iDy));
944  break;
945 
946  case 90:
947  if( ( end.y - track->GetStart().y ) < 0 )
948  track->SetEnd(wxPoint(track->GetStart().x , end.y + iDx));
949  else
950  track->SetEnd(wxPoint(track->GetStart().x , end.y - iDx));
951  break;
952  }
953 
954  if( track )
955  {
956  if( track->IsNull() )
957  track->SetEnd( end );
958 
959  newTrack->SetStart( track->GetEnd() );
960  }
961 
962  newTrack->SetEnd( end );
963 }
bool IsNull()
Function IsNull returns true if segment length is zero.
bool g_Alternate_Track_Posture
Definition: pcbnew.cpp:72
void SetEnd(const wxPoint &aEnd)
Definition: class_track.h:118
#define abs(a)
Definition: auxiliary.h:84
TRACK * Back() const
Definition: class_track.h:100
const wxPoint & GetEnd() const
Definition: class_track.h:119
const wxPoint & GetStart() const
Definition: class_track.h:122
void SetStart(const wxPoint &aStart)
Definition: class_track.h:121
#define min(a, b)
Definition: auxiliary.h:85
void DeleteNullTrackSegments ( BOARD pcb,
DLIST< TRACK > &  aTrackList 
)
static

Definition at line 969 of file editrack.cpp.

References BEGIN_ONPAD, TRACK::end, END_ONPAD, ENDPOINT_END, DHEAD::GetCount(), DLIST< T >::GetFirst(), BOARD::GetPad(), TRACK::IsNull(), TRACK::Next(), PCB_PAD_T, DLIST< T >::Remove(), EDA_ITEM::SetState(), EDA_ITEM::SetStatus(), TRACK::start, and EDA_ITEM::Type().

Referenced by PCB_EDIT_FRAME::End_Route().

970 {
971  if( aTrackList.GetCount() == 0 )
972  return;
973 
974  TRACK* track = aTrackList.GetFirst();
975  TRACK* firsttrack = track;
976  TRACK* oldtrack;
977 
978  BOARD_CONNECTED_ITEM* lockPoint = track->start;
979 
980  while( track != NULL )
981  {
982  oldtrack = track;
983  track = track->Next();
984 
985  if( !oldtrack->IsNull() )
986  {
987  continue;
988  }
989 
990  // NULL segment, delete it
991  if( firsttrack == oldtrack )
992  firsttrack = track;
993 
994  delete aTrackList.Remove( oldtrack );
995  }
996 
997  if( aTrackList.GetCount() == 0 )
998  return; // all the new track segments have been deleted
999 
1000  // we must set the pointers on connected items and the connection status
1001  oldtrack = track = firsttrack;
1002  firsttrack->start = NULL;
1003 
1004  while( track != NULL )
1005  {
1006  oldtrack = track;
1007  track = track->Next();
1008  oldtrack->end = track;
1009 
1010  if( track )
1011  track->start = oldtrack;
1012 
1013  oldtrack->SetStatus( 0 );
1014  }
1015 
1016  firsttrack->start = lockPoint;
1017 
1018  if( lockPoint && lockPoint->Type()==PCB_PAD_T )
1019  firsttrack->SetState( BEGIN_ONPAD, true );
1020 
1021  track = firsttrack;
1022 
1023  while( track != NULL )
1024  {
1025  TRACK* next_track = track->Next();
1026  lockPoint = pcb->GetPad( track, ENDPOINT_END );
1027 
1028  if( lockPoint )
1029  {
1030  track->end = lockPoint;
1031  track->SetState( END_ONPAD, true );
1032 
1033  if( next_track )
1034  {
1035  next_track->start = lockPoint;
1036  next_track->SetState( BEGIN_ONPAD, true );
1037  }
1038  }
1039 
1040  track = next_track;
1041  }
1042 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
bool IsNull()
Function IsNull returns true if segment length is zero.
T * Remove(T *aElement)
Function Remove removes aElement from the list, but does not delete it.
Definition: dlist.h:211
#define END_ONPAD
Pcbnew: flag set for track segment ending on a pad.
Definition: base_struct.h:134
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
D_PAD * GetPad(unsigned aIndex) const
Function GetPad.
#define BEGIN_ONPAD
Pcbnew: flag set for track segment starting on a pad.
Definition: base_struct.h:133
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
T * GetFirst() const
Function GetFirst returns the first T* in the list without removing it, or NULL if the list is empty...
Definition: dlist.h:163
TRACK * Next() const
Definition: class_track.h:99
void SetState(int type, int state)
Definition: base_struct.h:245
void SetStatus(STATUS_FLAGS aStatus)
Definition: base_struct.h:254
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
BOARD_CONNECTED_ITEM * end
Definition: class_track.h:91
BOARD_CONNECTED_ITEM * start
Definition: class_track.h:90
void DrawViaCirclesWhenEditingNewTrack ( EDA_RECT aPanelClipBox,
wxDC *  aDC,
const wxPoint aPos,
int  aViaRadius,
int  aViaRadiusWithClearence,
COLOR4D  aColor 
)
inline

Definition at line 651 of file editrack.cpp.

References GRCircle(), wxPoint::x, and wxPoint::y.

Referenced by ShowNewTrackWhenMovingCursor().

656 {
657  //Current viasize clearance circle
658  GRCircle( aPanelClipBox, aDC, aPos.x, aPos.y, aViaRadiusWithClearence, aColor );
659  //Current viasize circle
660  GRCircle( aPanelClipBox, aDC, aPos.x, aPos.y, aViaRadius, aColor );
661 }
void GRCircle(EDA_RECT *ClipBox, wxDC *DC, int xc, int yc, int r, int width, COLOR4D Color)
Definition: gr_basic.cpp:755
void EnsureEndTrackOnPad ( D_PAD Pad)
static

Definition at line 1049 of file editrack.cpp.

References TRACK::Clone(), TRACK::end, END_ONPAD, g_CurrentTrackList, g_CurrentTrackSegment, D_PAD::GetPosition(), and DLIST< T >::PushBack().

Referenced by PCB_EDIT_FRAME::End_Route().

1050 {
1051  if( g_CurrentTrackSegment->GetEnd() == aPad->GetPosition() ) // Ok !
1052  {
1053  g_CurrentTrackSegment->end = aPad;
1054  g_CurrentTrackSegment->SetState( END_ONPAD, true );
1055  return;
1056  }
1057 
1058  TRACK* lasttrack = g_CurrentTrackSegment;
1059 
1060  if( !g_CurrentTrackSegment->IsNull() )
1061  {
1062  // Must create a new segment, from track end to pad center
1063  g_CurrentTrackList.PushBack( (TRACK*)lasttrack->Clone() );
1064 
1065  lasttrack->end = g_CurrentTrackSegment;
1066  }
1067 
1068  g_CurrentTrackSegment->SetEnd( aPad->GetPosition() );
1069  g_CurrentTrackSegment->SetState( END_ONPAD, false );
1070 
1071  g_CurrentTrackSegment->end = aPad;
1072  g_CurrentTrackSegment->SetState( END_ONPAD, true );
1073 }
#define g_CurrentTrackSegment
most recently created segment
Definition: pcbnew.h:95
#define END_ONPAD
Pcbnew: flag set for track segment ending on a pad.
Definition: base_struct.h:134
DLIST< TRACK > g_CurrentTrackList
Definition: pcbnew.cpp:90
virtual EDA_ITEM * Clone() const override
Function Clone creates a duplicate of this item with linked list members set to NULL.
void PushBack(T *aNewElement)
Function PushBack puts aNewElement at the end of the list sequence.
Definition: dlist.h:250
BOARD_CONNECTED_ITEM * end
Definition: class_track.h:91
TRACK* LocateIntrusion ( TRACK listStart,
TRACK aTrack,
LAYER_NUM  aLayer,
const wxPoint aRef 
)

Definition at line 533 of file editrack.cpp.

References BUSY, dist, TRACK::GetClearance(), BOARD_CONNECTED_ITEM::GetNetCode(), TRACK::GetWidth(), IS_DELETED, TRACK::Next(), PCB_TRACE_T, TestSegmentHit(), wxPoint::x, and wxPoint::y.

Referenced by PCB_EDIT_FRAME::GeneralControl(), and PushTrack().

534 {
535  int net = aTrack->GetNetCode();
536  int width = aTrack->GetWidth();
537 
538  TRACK* found = NULL;
539 
540  for( TRACK* track = listStart; track; track = track->Next() )
541  {
542  if( track->Type() == PCB_TRACE_T ) // skip vias
543  {
544  if( track->GetState( BUSY | IS_DELETED ) )
545  continue;
546 
547  if( aLayer != track->GetLayer() )
548  continue;
549 
550  if( track->GetNetCode() == net )
551  continue;
552 
553  // TRACK::HitTest
554  int dist = (width + track->GetWidth()) / 2 + aTrack->GetClearance( track );
555 
556  if( !TestSegmentHit( aRef, track->GetStart(), track->GetEnd(), dist ) )
557  continue;
558 
559  found = track;
560 
561  // prefer intrusions from the side, not the end
562  wxPoint pos = aRef - track->GetStart();
563  wxPoint vec = track->GetEnd() - track->GetStart();
564  double tmp = (double) pos.x * vec.x + (double) pos.y * vec.y;
565 
566  if( tmp >= 0 && tmp <= (double) vec.x * vec.x + (double) vec.y * vec.y )
567  break;
568  }
569  }
570 
571  return found;
572 }
static const int dist[10][10]
Definition: ar_matrix.cpp:320
#define BUSY
Pcbnew: flag indicating that the structure has.
Definition: base_struct.h:135
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
#define IS_DELETED
Definition: base_struct.h:117
virtual int GetClearance(BOARD_CONNECTED_ITEM *aItem=NULL) const override
Function GetClearance returns the clearance in internal units.
int GetNetCode() const
Function GetNetCode.
TRACK * Next() const
Definition: class_track.h:99
int GetWidth() const
Definition: class_track.h:116
bool TestSegmentHit(const wxPoint &aRefPoint, wxPoint aStart, wxPoint aEnd, int aDist)
Function TestSegmentHit test for hit on line segment i.e.
Definition: trigo.cpp:122
static void PushTrack ( EDA_DRAW_PANEL panel)
static

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

Definition at line 591 of file editrack.cpp.

References dist, FindBestGridPointOnTrack(), g_CurrentTrackSegment, BOARD_ITEM::GetBoard(), TRACK::GetClearance(), EDA_DRAW_FRAME::GetCrossHairPosition(), TRACK::GetEnd(), BOARD_CONNECTED_ITEM::GetNetCode(), EDA_DRAW_PANEL::GetParent(), EDA_DRAW_FRAME::GetScreen(), TRACK::GetStart(), TRACK::GetWidth(), KiROUND(), LocateIntrusion(), PCB_SCREEN::m_Active_Layer, BOARD::m_Track, EDA_DRAW_FRAME::RefPos(), TRACK::SetEnd(), wxPoint::x, and wxPoint::y.

Referenced by ShowNewTrackWhenMovingCursor().

592 {
593  PCB_SCREEN* screen = (PCB_SCREEN*) panel->GetParent()->GetScreen();
594  BOARD* pcb = ( (PCB_BASE_FRAME*) (panel->GetParent()) )->GetBoard();
595  wxPoint cursor = panel->GetParent()->GetCrossHairPosition();
596  wxPoint cv, vec, n;
597  TRACK* track = g_CurrentTrackSegment;
598  TRACK* other;
599  double det;
600  int dist;
601  double f;
602 
603  other = LocateIntrusion( pcb->m_Track, track, screen->m_Active_Layer, panel->GetParent()->RefPos( true ) );
604 
605  // are we currently pointing into a conflicting trace ?
606  if( !other )
607  return;
608 
609  if( other->GetNetCode() == track->GetNetCode() )
610  return;
611 
612  cv = cursor - other->GetStart();
613  vec = other->GetEnd() - other->GetStart();
614 
615  det = (double) cv.x * vec.y - (double) cv.y * vec.x;
616 
617  // cursor is right at the center of the old track
618  if( !det )
619  return;
620 
621  dist = (track->GetWidth() + 1) / 2 + (other->GetWidth() + 1) / 2 + track->GetClearance( other ) + 2;
622 
623  /*
624  * DRC wants >, so +1.
625  * We may have a quantization error of 1/sqrt(2), so +1 again.
626  */
627 
628  // Vector "n" is perpendicular to "other", pointing towards the cursor.
629  if( det > 0 )
630  {
631  n.x = vec.y;
632  n.y = -vec.x;
633  }
634  else
635  {
636  n.x = -vec.y;
637  n.y = vec.x;
638  }
639 
640  f = dist / hypot( double(n.x), double(n.y) );
641  n.x = KiROUND( f * n.x );
642  n.y = KiROUND( f * n.y );
643 
644  wxPoint hp = track->GetEnd();
645  FindBestGridPointOnTrack( &hp, cursor, other );
646  track->SetEnd( hp + n );
647 }
#define g_CurrentTrackSegment
most recently created segment
Definition: pcbnew.h:95
static const int dist[10][10]
Definition: ar_matrix.cpp:320
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:120
void SetEnd(const wxPoint &aEnd)
Definition: class_track.h:118
PCB_LAYER_ID m_Active_Layer
Definition: pcb_screen.h:44
const wxPoint & GetEnd() const
Definition: class_track.h:119
virtual EDA_DRAW_FRAME * GetParent() const =0
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
Definition: draw_frame.h:397
const wxPoint & GetStart() const
Definition: class_track.h:122
TRACK * LocateIntrusion(TRACK *listStart, TRACK *aTrack, LAYER_NUM aLayer, const wxPoint &aRef)
Definition: editrack.cpp:533
virtual int GetClearance(BOARD_CONNECTED_ITEM *aItem=NULL) const override
Function GetClearance returns the clearance in internal units.
bool FindBestGridPointOnTrack(wxPoint *aNearPos, wxPoint on_grid, const TRACK *track)
Finds the projection of a grid point on a track.
int GetNetCode() const
Function GetNetCode.
wxPoint RefPos(bool useMouse) const
Return the reference position, coming from either the mouse position or the cursor position...
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:170
int GetWidth() const
Definition: class_track.h:116
virtual BOARD * GetBoard() const
Function GetBoard returns the BOARD in which this BOARD_ITEM resides, or NULL if none.
DLIST< TRACK > m_Track
Definition: class_board.h:249
wxPoint GetCrossHairPosition(bool aInvertY=false) const
Return the current cross hair position in logical (drawing) coordinates.
class PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer...
void ShowNewTrackWhenMovingCursor ( EDA_DRAW_PANEL aPanel,
wxDC *  aDC,
const wxPoint aPosition,
bool  aErase 
)

Definition at line 665 of file editrack.cpp.

References EDA_DRAW_FRAME::AppendMsgPanel(), PCB_BASE_FRAME::BuildAirWiresTargetsList(), CalculateSegmentEndPoint(), color, PCB_GENERAL_SETTINGS::Colors(), ComputeBreakPoint(), DARKCYAN, DBG, PCB_DISPLAY_OPTIONS::DO_NOT_SHOW_CLEARANCE, DrawTraces(), DrawViaCirclesWhenEditingNewTrack(), g_CurrentTrackList, g_CurrentTrackSegment, g_FirstTrackSegment, EDA_DRAW_PANEL::GetClipBox(), DHEAD::GetCount(), EDA_DRAW_FRAME::GetCrossHairPosition(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetCurrentViaSize(), PCB_BASE_FRAME::GetDesignSettings(), PCB_BASE_FRAME::GetDisplayOptions(), COLORS_DESIGN_SETTINGS::GetLayerColor(), EDA_DRAW_PANEL::GetParent(), EDA_DRAW_PANEL::GetScreen(), GR_XOR, PCB_SCREEN::m_Active_Layer, PCB_GENERAL_SETTINGS::m_legacyDrcOn, PCB_GENERAL_SETTINGS::m_legacyUse45DegreeTracks, PCB_GENERAL_SETTINGS::m_legacyUseTwoSegmentTracks, BOARD_DESIGN_SETTINGS::m_UseConnectedTrackWidth, PCB_TRACE_T, PushTrack(), BOARD_ITEM::SetLayer(), EDA_DRAW_FRAME::SetMsgPanel(), PCB_BASE_FRAME::Settings(), TRACK::SetWidth(), PCB_DISPLAY_OPTIONS::SHOW_CLEARANCE_ALWAYS, PCB_DISPLAY_OPTIONS::SHOW_CLEARANCE_NEW_TRACKS_AND_VIA_AREAS, PCB_BASE_FRAME::TraceAirWiresToTargets(), and EDA_ITEM::Type().

Referenced by Abort_Create_Track(), PCB_EDIT_FRAME::Begin_Route(), PCB_EDIT_FRAME::Delete_Segment(), and PCB_EDIT_FRAME::End_Route().

667 {
668 // DBG( g_CurrentTrackList.VerifyListIntegrity(); );
669 
670  PCB_SCREEN* screen = (PCB_SCREEN*) aPanel->GetScreen();
671  PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) aPanel->GetParent();
672  auto displ_opts = (PCB_DISPLAY_OPTIONS*) aPanel-> GetDisplayOptions();
673 
674  bool tmp = displ_opts->m_DisplayPcbTrackFill;
675  displ_opts->m_DisplayPcbTrackFill = true;
676  auto showTrackClearanceMode = displ_opts->m_ShowTrackClearanceMode;
677 
678  if ( g_FirstTrackSegment == NULL )
679  return;
680 
681  NETCLASSPTR netclass = g_FirstTrackSegment->GetNetClass();
682 
683  if( showTrackClearanceMode != PCB_DISPLAY_OPTIONS::DO_NOT_SHOW_CLEARANCE )
684  displ_opts->m_ShowTrackClearanceMode = PCB_DISPLAY_OPTIONS::SHOW_CLEARANCE_ALWAYS;
685 
686  // Values to Via circle
687  int boardViaRadius = frame->GetDesignSettings().GetCurrentViaSize()/2;
688  int viaRadiusWithClearence = boardViaRadius+netclass->GetClearance();
689  EDA_RECT* panelClipBox=aPanel->GetClipBox();
690 
691 #ifndef USE_WX_OVERLAY
692  // Erase old track
693  if( aErase )
694  {
696 
697  frame->TraceAirWiresToTargets( aDC );
698 
700  {
701  COLOR4D color = frame->Settings().Colors().GetLayerColor( g_CurrentTrackSegment->GetLayer() );
702  DrawViaCirclesWhenEditingNewTrack( panelClipBox, aDC, g_CurrentTrackSegment->GetEnd(),
703  boardViaRadius, viaRadiusWithClearence, color);
704  }
705  }
706 #endif
707  // MacOSX seems to need this.
708  if( g_CurrentTrackList.GetCount() == 0 )
709  return;
710 
711  // Set track parameters, that can be modified while creating the track
712  g_CurrentTrackSegment->SetLayer( screen->m_Active_Layer );
713 
716 
718  {
719  TRACK* previous_track = g_CurrentTrackSegment->Back();
720 
721  if( previous_track && previous_track->Type()==PCB_TRACE_T )
722  {
723  previous_track->SetLayer( screen->m_Active_Layer );
724 
726  previous_track->SetWidth( frame->GetDesignSettings().GetCurrentTrackWidth() );
727  }
728  }
729 
730  if( frame->Settings().m_legacyUse45DegreeTracks )
731  {
733  {
734  g_CurrentTrackSegment->SetEnd( frame->GetCrossHairPosition() );
735 
736  if( frame->Settings().m_legacyDrcOn )
737  PushTrack( aPanel );
738 
741  g_CurrentTrackSegment->GetEnd() );
742  }
743  else
744  {
745  /* Calculate of the end of the path for the permitted directions:
746  * horizontal, vertical or 45 degrees.
747  */
748  wxPoint hp = g_CurrentTrackSegment->GetEnd();
750  g_CurrentTrackSegment->GetStart() );
751  g_CurrentTrackSegment->SetEnd(hp);
752  }
753  }
754  else // Here the angle is arbitrary
755  {
756  g_CurrentTrackSegment->SetEnd( frame->GetCrossHairPosition() );
757  }
758 
759  // Redraw the new track
760  DBG( g_CurrentTrackList.VerifyListIntegrity(); );
762 
764  {
765  COLOR4D color = frame->Settings().Colors().GetLayerColor(g_CurrentTrackSegment->GetLayer());
766 
767  //Via diameter must have taken what we are using, rather than netclass value.
768  DrawViaCirclesWhenEditingNewTrack( panelClipBox, aDC, g_CurrentTrackSegment->GetEnd(),
769  boardViaRadius, viaRadiusWithClearence, color);
770 
771  }
772 
773  /* Display info about current segment and the full new track:
774  * Choose the interesting segment: because we are using a 2 segments step,
775  * the last segment can be null, and the previous segment can be the
776  * interesting segment.
777  */
778  TRACK* isegm = g_CurrentTrackSegment;
779 
780  if( isegm->GetLength() == 0 && g_CurrentTrackSegment->Back() )
781  isegm = g_CurrentTrackSegment->Back();
782 
783  // display track info:
784  frame->SetMsgPanel( isegm );
785  wxString msg;
786 
787  // Display current segments count (number of segments in this new track):
788  msg.Printf( "%d", g_CurrentTrackList.GetCount() );
789  frame->AppendMsgPanel( _( "Segs Count" ), msg, DARKCYAN );
790 
791  displ_opts->m_ShowTrackClearanceMode = showTrackClearanceMode;
792  displ_opts->m_DisplayPcbTrackFill = tmp;
793 
794  frame->BuildAirWiresTargetsList( NULL, g_CurrentTrackSegment->GetEnd(),
795  g_CurrentTrackSegment->GetNetCode() );
796  frame->TraceAirWiresToTargets( aDC );
797 }
virtual BASE_SCREEN * GetScreen()=0
#define g_FirstTrackSegment
first segment created
Definition: pcbnew.h:96
#define g_CurrentTrackSegment
most recently created segment
Definition: pcbnew.h:95
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
void TraceAirWiresToTargets(wxDC *aDC)
Function TraceAirWiresToTargets This functions shows airwires to nearest connecting points (pads) fro...
Definition: ratsnest.cpp:205
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
DLIST< TRACK > g_CurrentTrackList
Definition: pcbnew.cpp:90
int color
Definition: DXF_plotter.cpp:62
virtual EDA_RECT * GetClipBox()
void BuildAirWiresTargetsList(BOARD_CONNECTED_ITEM *aItemRef, const wxPoint &aPosition, int aNet)
Function BuildAirWiresTargetsList Build a list of candidates that can be a coonection point when a tr...
Definition: ratsnest.cpp:182
PCB_LAYER_ID m_Active_Layer
Definition: pcb_screen.h:44
int GetCurrentViaSize() const
Function GetCurrentViaSize.
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
wxPoint CalculateSegmentEndPoint(const wxPoint &aPosition, const wxPoint &aOrigin)
Determine end point for a segment direction 0, 90, or 45 degrees depending on it&#39;s position from the ...
Definition: editrack.cpp:800
void SetWidth(int aWidth)
Definition: class_track.h:115
virtual EDA_DRAW_FRAME * GetParent() const =0
static void PushTrack(EDA_DRAW_PANEL *panel)
Function PushTrack detects if the mouse is pointing into a conflicting track.
Definition: editrack.cpp:591
Class PCB_DISPLAY_OPTIONS handles display options like enable/disable some optional drawings...
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
PCB_GENERAL_SETTINGS & Settings()
void DrawTraces(EDA_DRAW_PANEL *panel, wxDC *DC, TRACK *aTrackList, int nbsegment, GR_DRAWMODE draw_mode)
Function DrawTraces Draws n consecutive track segments in list.
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings returns the BOARD_DESIGN_SETTINGS for the BOARD owned by this frame...
COLORS_DESIGN_SETTINGS & Colors()
void AppendMsgPanel(const wxString &textUpper, const wxString &textLower, COLOR4D color, int pad=6)
Append a message to the message panel.
void DrawViaCirclesWhenEditingNewTrack(EDA_RECT *aPanelClipBox, wxDC *aDC, const wxPoint &aPos, int aViaRadius, int aViaRadiusWithClearence, COLOR4D aColor)
Definition: editrack.cpp:651
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
static void ComputeBreakPoint(TRACK *track, int n, wxPoint end)
Compute new track angle based on previous track.
Definition: editrack.cpp:865
COLOR4D GetLayerColor(LAYER_NUM aLayer) const
Function GetLayerColor.
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
#define DBG(x)
Definition: fctsys.h:33
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
wxPoint GetCrossHairPosition(bool aInvertY=false) const
Return the current cross hair position in logical (drawing) coordinates.
class PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer...
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39

Variable Documentation

PICKED_ITEMS_LIST s_ItemsListPicker
static

Definition at line 55 of file editrack.cpp.