router: allow placing tracks/diff pairs without continuing routing by Shift+L-Click
Fixes: lp:1777688 * https://bugs.launchpad.net/kicad/+bug/1777688
This commit is contained in:
parent
462549fc84
commit
f6f726acab
|
@ -737,7 +737,7 @@ void DIFF_PAIR_PLACER::UpdateSizes( const SIZES_SETTINGS& aSizes )
|
|||
}
|
||||
|
||||
|
||||
bool DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
||||
bool DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish )
|
||||
{
|
||||
if( !m_fitOk )
|
||||
return false;
|
||||
|
@ -751,7 +751,7 @@ bool DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
|
||||
TOPOLOGY topo( m_lastNode );
|
||||
|
||||
if( !m_snapOnTarget && !m_currentTrace.EndsWithVias() )
|
||||
if( !m_snapOnTarget && !m_currentTrace.EndsWithVias() && !aForceFinish )
|
||||
{
|
||||
SHAPE_LINE_CHAIN newP( m_currentTrace.CP() );
|
||||
SHAPE_LINE_CHAIN newN( m_currentTrace.CN() );
|
||||
|
@ -773,7 +773,7 @@ bool DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
}
|
||||
else
|
||||
{
|
||||
m_chainedPlacement = !m_snapOnTarget;
|
||||
m_chainedPlacement = !m_snapOnTarget && !aForceFinish;
|
||||
}
|
||||
|
||||
LINE lineP( m_currentTrace.PLine() );
|
||||
|
@ -792,7 +792,7 @@ bool DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
m_lastNode = NULL;
|
||||
m_placingVia = false;
|
||||
|
||||
if( m_snapOnTarget )
|
||||
if( m_snapOnTarget || aForceFinish )
|
||||
{
|
||||
m_idle = true;
|
||||
return true;
|
||||
|
|
|
@ -84,7 +84,7 @@ public:
|
|||
* result is violating design rules - in such case, the track is only committed
|
||||
* if Settings.CanViolateDRC() is on.
|
||||
*/
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem ) override;
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish ) override;
|
||||
|
||||
/**
|
||||
* Function ToggleVia()
|
||||
|
|
|
@ -300,7 +300,7 @@ bool DP_MEANDER_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
}
|
||||
|
||||
|
||||
bool DP_MEANDER_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
||||
bool DP_MEANDER_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish )
|
||||
{
|
||||
LINE lP( m_originPair.PLine(), m_finalShapeP );
|
||||
LINE lN( m_originPair.NLine(), m_finalShapeN );
|
||||
|
|
|
@ -78,7 +78,7 @@ public:
|
|||
* result is violating design rules - in such case, the track is only committed
|
||||
* if Settings.CanViolateDRC() is on.
|
||||
*/
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem ) override;
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish = false ) override;
|
||||
|
||||
const LINE Trace() const;
|
||||
|
||||
|
|
|
@ -951,7 +951,7 @@ bool LINE_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
}
|
||||
|
||||
|
||||
bool LINE_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
||||
bool LINE_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish )
|
||||
{
|
||||
bool realEnd = false;
|
||||
int lastV;
|
||||
|
@ -1009,6 +1009,9 @@ bool LINE_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
|||
if( aEndItem && m_currentNet >= 0 && m_currentNet == aEndItem->Net() )
|
||||
realEnd = true;
|
||||
|
||||
if( aForceFinish )
|
||||
realEnd = true;
|
||||
|
||||
if( realEnd || m_placingVia )
|
||||
lastV = l.SegmentCount();
|
||||
else
|
||||
|
|
|
@ -81,7 +81,7 @@ public:
|
|||
* result is violating design rules - in such case, the track is only committed
|
||||
* if Settings.CanViolateDRC() is on.
|
||||
*/
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem ) override;
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish ) override;
|
||||
|
||||
/**
|
||||
* Function ToggleVia()
|
||||
|
|
|
@ -188,7 +188,7 @@ bool MEANDER_PLACER::doMove( const VECTOR2I& aP, ITEM* aEndItem, int aTargetLeng
|
|||
}
|
||||
|
||||
|
||||
bool MEANDER_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
||||
bool MEANDER_PLACER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish )
|
||||
{
|
||||
if( !m_currentNode )
|
||||
return false;
|
||||
|
|
|
@ -59,7 +59,7 @@ public:
|
|||
virtual bool Move( const VECTOR2I& aP, ITEM* aEndItem ) override;
|
||||
|
||||
/// @copydoc PLACEMENT_ALGO::FixRoute()
|
||||
virtual bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem ) override;
|
||||
virtual bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish = false ) override;
|
||||
|
||||
/// @copydoc PLACEMENT_ALGO::CurrentNode()
|
||||
NODE* CurrentNode( bool aLoopsRemoved = false ) const override;
|
||||
|
|
|
@ -76,7 +76,7 @@ public:
|
|||
* result is violating design rules - in such case, the track is only committed
|
||||
* if Settings.CanViolateDRC() is on.
|
||||
*/
|
||||
virtual bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem ) = 0;
|
||||
virtual bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish = false ) = 0;
|
||||
|
||||
/**
|
||||
* Function ToggleVia()
|
||||
|
|
|
@ -361,14 +361,14 @@ void ROUTER::CommitRouting( NODE* aNode )
|
|||
}
|
||||
|
||||
|
||||
bool ROUTER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem )
|
||||
bool ROUTER::FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish )
|
||||
{
|
||||
bool rv = false;
|
||||
|
||||
switch( m_state )
|
||||
{
|
||||
case ROUTE_TRACK:
|
||||
rv = m_placer->FixRoute( aP, aEndItem );
|
||||
rv = m_placer->FixRoute( aP, aEndItem, aForceFinish );
|
||||
break;
|
||||
|
||||
case DRAG_SEGMENT:
|
||||
|
|
|
@ -133,7 +133,7 @@ public:
|
|||
bool RoutingInProgress() const;
|
||||
bool StartRouting( const VECTOR2I& aP, ITEM* aItem, int aLayer );
|
||||
void Move( const VECTOR2I& aP, ITEM* aItem );
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aItem );
|
||||
bool FixRoute( const VECTOR2I& aP, ITEM* aItem, bool aForceFinish = false );
|
||||
void BreakSegment( ITEM *aItem, const VECTOR2I& aP );
|
||||
|
||||
void StopRouting();
|
||||
|
|
|
@ -728,8 +728,10 @@ void ROUTER_TOOL::performRouting()
|
|||
{
|
||||
updateEndItem( *evt );
|
||||
bool needLayerSwitch = m_router->IsPlacingVia();
|
||||
bool forceFinish = evt->Modifier( MD_SHIFT );
|
||||
|
||||
if( m_router->FixRoute( m_endSnapPoint, m_endItem ) )
|
||||
|
||||
if( m_router->FixRoute( m_endSnapPoint, m_endItem, forceFinish ) )
|
||||
break;
|
||||
|
||||
if( needLayerSwitch )
|
||||
|
|
Loading…
Reference in New Issue