Pcbnew: Enhancement in connections calculations:
Until now, 2 tracks were seen as connected only if one end of the first track is *exactly* on one end of the other track. Now the 2 ends are seen as connected when they are "near" i.e. the distance between the 2 ends is < track width/2
This commit is contained in:
parent
518fdb93e5
commit
8b6d5cb42f
|
@ -282,6 +282,15 @@ void CONNECTIONS::BuildTracksCandidatesList( TRACK * aBegin, TRACK * aEnd)
|
||||||
sort( m_candidates.begin(), m_candidates.end(), sortConnectedPointByXthenYCoordinates );
|
sort( m_candidates.begin(), m_candidates.end(), sortConnectedPointByXthenYCoordinates );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Populates .m_connected with tracks/vias connected to aTrack
|
||||||
|
* param aTrack = track or via to use as reference
|
||||||
|
* For calculation time reason, an exhaustive search cannot be made
|
||||||
|
* and a proximity search is made:
|
||||||
|
* Only tracks with one end near one end of aTrack are collected.
|
||||||
|
* near means dist <= aTrack width / 2
|
||||||
|
* because with this constraint we can make a fast search in track list
|
||||||
|
* m_candidates is expected to be populated by the track candidates ends list
|
||||||
|
*/
|
||||||
int CONNECTIONS::SearchConnectedTracks( const TRACK * aTrack )
|
int CONNECTIONS::SearchConnectedTracks( const TRACK * aTrack )
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -290,9 +299,15 @@ int CONNECTIONS::SearchConnectedTracks( const TRACK * aTrack )
|
||||||
int layerMask = aTrack->ReturnMaskLayer();
|
int layerMask = aTrack->ReturnMaskLayer();
|
||||||
|
|
||||||
// Search for connections to starting point:
|
// Search for connections to starting point:
|
||||||
|
#define USE_EXTENDED_SEARCH
|
||||||
|
#ifdef USE_EXTENDED_SEARCH
|
||||||
|
int dist_max = aTrack->GetWidth() / 2;
|
||||||
|
static std::vector<CONNECTED_POINT*> tracks_candidates;
|
||||||
|
#endif
|
||||||
wxPoint position = aTrack->m_Start;
|
wxPoint position = aTrack->m_Start;
|
||||||
for( int kk = 0; kk < 2; kk++ )
|
for( int kk = 0; kk < 2; kk++ )
|
||||||
{
|
{
|
||||||
|
#ifndef USE_EXTENDED_SEARCH
|
||||||
int idx = searchEntryPointInCandidatesList( position );
|
int idx = searchEntryPointInCandidatesList( position );
|
||||||
if ( idx >= 0 )
|
if ( idx >= 0 )
|
||||||
{
|
{
|
||||||
|
@ -317,6 +332,30 @@ int CONNECTIONS::SearchConnectedTracks( const TRACK * aTrack )
|
||||||
m_connected.push_back( m_candidates[ii].GetTrack() );
|
m_connected.push_back( m_candidates[ii].GetTrack() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
tracks_candidates.clear();
|
||||||
|
CollectItemsNearTo( tracks_candidates, position, dist_max );
|
||||||
|
for ( unsigned ii = 0; ii < tracks_candidates.size(); ii ++ )
|
||||||
|
{
|
||||||
|
TRACK * ctrack = tracks_candidates[ii]->GetTrack();
|
||||||
|
|
||||||
|
if( ( ctrack->ReturnMaskLayer() & layerMask ) == 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( ctrack == aTrack )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// We have a good candidate: calculate the actual distance
|
||||||
|
// beteween ends, which should be <= dist max.
|
||||||
|
wxPoint delta = tracks_candidates[ii]->GetPoint() - position;
|
||||||
|
int dist = (int) hypot( (double) delta.x, (double) delta.y );
|
||||||
|
|
||||||
|
if( dist > dist_max )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_connected.push_back( ctrack );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Search for connections to ending point:
|
// Search for connections to ending point:
|
||||||
if( aTrack->Type() == PCB_VIA_T )
|
if( aTrack->Type() == PCB_VIA_T )
|
||||||
|
|
|
@ -147,14 +147,15 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function BuildPadsCandidatesList
|
* Function BuildPadsCandidatesList
|
||||||
* Fills m_Candidates with all pads connecting points (pads position)
|
* Populates m_candidates with all pads connecting points (pads position)
|
||||||
* m_sortedPads must be built
|
* m_sortedPads is expected to be populated by the pad candidates list
|
||||||
*/
|
*/
|
||||||
void BuildPadsCandidatesList();
|
void BuildPadsCandidatesList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* function SearchConnectedTracks
|
* function SearchConnectedTracks
|
||||||
* Fills m_Connected with tracks/vias connected to aTrack
|
* Populates .m_connected with tracks/vias connected to aTrack
|
||||||
|
* m_candidates is expected to be populated by the track candidates ends list
|
||||||
* @param aTrack = track or via to use as reference
|
* @param aTrack = track or via to use as reference
|
||||||
*/
|
*/
|
||||||
int SearchConnectedTracks( const TRACK * aTrack );
|
int SearchConnectedTracks( const TRACK * aTrack );
|
||||||
|
|
|
@ -165,10 +165,19 @@ void DrawSegmentWhileMovingFootprint( EDA_DRAW_PANEL* panel, wxDC* DC );
|
||||||
*/
|
*/
|
||||||
void EraseDragList();
|
void EraseDragList();
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* function used to collect track segments in drag track segment
|
* function Collect_TrackSegmentsToDrag.
|
||||||
|
* used to collect track segments in drag track segment
|
||||||
|
* Build the list of tracks connected to the ref point by calling
|
||||||
|
* AddSegmentToDragList for each selected track
|
||||||
|
* Net codes must be up to date, because only tracks having the right net code are tested.
|
||||||
|
* @param aRefPos = reference point of connection
|
||||||
|
* @param aLayerMask = layers mask to collect tracks
|
||||||
|
* @param aNetCode = the net code to consider
|
||||||
|
* @param aMaxDist = max distance from aRefPos to a track end candidate to collect the track
|
||||||
*/
|
*/
|
||||||
void Collect_TrackSegmentsToDrag( BOARD* aPcb, wxPoint& point, int LayerMask, int net_code );
|
void Collect_TrackSegmentsToDrag( BOARD* aPcb, wxPoint& aRefPos, int aLayerMask,
|
||||||
|
int aNetCode, int aMaxDist );
|
||||||
|
|
||||||
/* Add aTrack to the drag list
|
/* Add aTrack to the drag list
|
||||||
* flag = STARTPOINT (if the point to drag is the start point of Track)
|
* flag = STARTPOINT (if the point to drag is the start point of Track)
|
||||||
|
|
|
@ -345,29 +345,55 @@ void AddSegmentToDragList( int flag, TRACK* aTrack )
|
||||||
/* Build the list of tracks connected to the ref point
|
/* Build the list of tracks connected to the ref point
|
||||||
* Net codes must be up to date, because only tracks having the right net code are tested.
|
* Net codes must be up to date, because only tracks having the right net code are tested.
|
||||||
* aRefPos = reference point of connection
|
* aRefPos = reference point of connection
|
||||||
|
* aLayerMask = layers mask to collect tracks
|
||||||
|
* aNetCode = the net code to consider
|
||||||
|
* aMaxDist = max distance from aRefPos to a track end candidate to collect the track
|
||||||
*/
|
*/
|
||||||
void Collect_TrackSegmentsToDrag( BOARD* aPcb, wxPoint& aRefPos, int LayerMask, int net_code )
|
void Collect_TrackSegmentsToDrag( BOARD* aPcb, wxPoint& aRefPos, int aLayerMask,
|
||||||
|
int aNetCode, int aMaxDist )
|
||||||
{
|
{
|
||||||
TRACK* track = aPcb->m_Track->GetStartNetCode( net_code );
|
TRACK* track = aPcb->m_Track->GetStartNetCode( aNetCode );
|
||||||
|
|
||||||
for( ; track; track = track->Next() )
|
for( ; track; track = track->Next() )
|
||||||
{
|
{
|
||||||
if( track->GetNet() != net_code ) // not the same netcodenet code: all candidates tested
|
if( track->GetNet() != aNetCode ) // not the same netcodenet code: all candidates tested
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if( ( LayerMask & track->ReturnMaskLayer() ) == 0 )
|
if( ( aLayerMask & track->ReturnMaskLayer() ) == 0 )
|
||||||
continue; // Cannot be connected, not on the same layer
|
continue; // Cannot be connected, not on the same layer
|
||||||
|
|
||||||
if( track->IsDragging() )
|
if( track->IsDragging() )
|
||||||
continue; // already put in list
|
continue; // already put in list
|
||||||
|
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
|
int maxdist = std::max( aMaxDist, track->GetWidth() / 2 );
|
||||||
|
|
||||||
if( (track->m_Start == aRefPos) && ((track->GetFlags() & STARTPOINT) == 0) )
|
if( (track->GetFlags() & STARTPOINT) == 0 )
|
||||||
flag |= STARTPOINT;
|
{
|
||||||
|
wxPoint delta = track->m_Start - aRefPos;
|
||||||
|
if( std::abs( delta.x ) <= maxdist && std::abs( delta.y ) <= maxdist )
|
||||||
|
{
|
||||||
|
int dist = (int) hypot( (double) delta.x, (double) delta.y );
|
||||||
|
if( dist <= maxdist )
|
||||||
|
{
|
||||||
|
flag |= STARTPOINT;
|
||||||
|
if( track->Type() == PCB_VIA_T )
|
||||||
|
flag |= ENDPOINT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( (track->GetFlags() & ENDPOINT) == 0 )
|
||||||
|
{
|
||||||
|
wxPoint delta = track->m_End - aRefPos;
|
||||||
|
if( std::abs( delta.x ) <= maxdist && std::abs( delta.y ) <= maxdist )
|
||||||
|
{
|
||||||
|
int dist = (int) hypot( (double) delta.x, (double) delta.y );
|
||||||
|
if( dist <= maxdist )
|
||||||
|
flag |= ENDPOINT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( track->m_End == aRefPos && ((track->GetFlags() & ENDPOINT) == 0) )
|
|
||||||
flag |= ENDPOINT;
|
|
||||||
|
|
||||||
// Note: vias will be flagged with both STARTPOINT and ENDPOINT
|
// Note: vias will be flagged with both STARTPOINT and ENDPOINT
|
||||||
// and must not be entered twice.
|
// and must not be entered twice.
|
||||||
|
@ -379,7 +405,7 @@ void Collect_TrackSegmentsToDrag( BOARD* aPcb, wxPoint& aRefPos, int LayerMask,
|
||||||
// collect also tracks connected by this via.
|
// collect also tracks connected by this via.
|
||||||
if( track->Type() == PCB_VIA_T )
|
if( track->Type() == PCB_VIA_T )
|
||||||
Collect_TrackSegmentsToDrag( aPcb, aRefPos, track->ReturnMaskLayer(),
|
Collect_TrackSegmentsToDrag( aPcb, aRefPos, track->ReturnMaskLayer(),
|
||||||
net_code );
|
aNetCode, track->GetWidth() / 2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,7 +632,7 @@ void PCB_EDIT_FRAME::StartMoveOneNodeOrSegment( TRACK* aTrack, wxDC* aDC, int aC
|
||||||
{
|
{
|
||||||
Collect_TrackSegmentsToDrag( GetBoard(), aTrack->m_Start,
|
Collect_TrackSegmentsToDrag( GetBoard(), aTrack->m_Start,
|
||||||
aTrack->ReturnMaskLayer(),
|
aTrack->ReturnMaskLayer(),
|
||||||
aTrack->GetNet() );
|
aTrack->GetNet(), aTrack->GetWidth() / 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
PosInit = aTrack->m_Start;
|
PosInit = aTrack->m_Start;
|
||||||
|
@ -652,17 +652,17 @@ void PCB_EDIT_FRAME::StartMoveOneNodeOrSegment( TRACK* aTrack, wxDC* aDC, int aC
|
||||||
case ID_POPUP_PCB_DRAG_TRACK_SEGMENT: // drag a segment
|
case ID_POPUP_PCB_DRAG_TRACK_SEGMENT: // drag a segment
|
||||||
pos = aTrack->m_Start;
|
pos = aTrack->m_Start;
|
||||||
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
||||||
aTrack->GetNet() );
|
aTrack->GetNet(), aTrack->GetWidth() / 2 );
|
||||||
pos = aTrack->m_End;
|
pos = aTrack->m_End;
|
||||||
aTrack->SetFlags( IS_DRAGGED | ENDPOINT | STARTPOINT );
|
aTrack->SetFlags( IS_DRAGGED | ENDPOINT | STARTPOINT );
|
||||||
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
||||||
aTrack->GetNet() );
|
aTrack->GetNet(), aTrack->GetWidth() / 2 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_POPUP_PCB_MOVE_TRACK_NODE: // Drag via or move node
|
case ID_POPUP_PCB_MOVE_TRACK_NODE: // Drag via or move node
|
||||||
pos = (diag & STARTPOINT) ? aTrack->m_Start : aTrack->m_End;
|
pos = (diag & STARTPOINT) ? aTrack->m_Start : aTrack->m_End;
|
||||||
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->ReturnMaskLayer(),
|
||||||
aTrack->GetNet() );
|
aTrack->GetNet(), aTrack->GetWidth() / 2 );
|
||||||
PosInit = pos;
|
PosInit = pos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue