Fix automatic wire tool in gridless mode

The automatic wire tool was not working in the gridless mode because the
grid snapping on/off logic present in `EE_GRID_HELPER`, based on the
value of `m_enableGrid`, was not taking into account that another check,
but for the global KiCad setting, would be performed in the `Align()`
method, which is inherited from `GRID_HELPER`.

I've modified all tests of `m_enableGrid` value to also take the global
setting into account, and moved checks for it to `Align()` method, as
it's more consistent this way.

I've also removed an override of the `Align()` method in the
`PCB_GRID_HELPER` class, as it was made redundant by my changes.

Fixes https://gitlab.com/kicad/code/kicad/issues/7402
This commit is contained in:
Mikolaj Wielgus 2021-02-10 01:01:36 +01:00 committed by Seth Hillbrand
parent 05ff0fb658
commit 1dc0ef01b3
4 changed files with 25 additions and 21 deletions

View File

@ -94,7 +94,7 @@ VECTOR2I GRID_HELPER::AlignGrid( const VECTOR2I& aPoint ) const
VECTOR2I GRID_HELPER::Align( const VECTOR2I& aPoint ) const
{
if( !m_toolMgr->GetView()->GetGAL()->GetGridSnapping() )
if( !canUseGrid() )
return aPoint;
VECTOR2I nearest = AlignGrid( aPoint );

View File

@ -135,7 +135,7 @@ VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, int aLayer,
computeAnchors( item, aOrigin );
ANCHOR* nearest = nearestAnchor( aOrigin, SNAPPABLE, aLayer );
VECTOR2I nearestGrid = m_enableGrid ? Align( aOrigin ) : aOrigin;
VECTOR2I nearestGrid = Align( aOrigin );
if( m_enableSnapLine && m_snapItem && m_skipPoint != VECTOR2I( m_viewSnapLine.GetPosition() ) )
{
@ -153,14 +153,14 @@ VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, int aLayer,
snapLineY = true;
}
if( m_enableGrid && std::abs( nearestGrid.x - aOrigin.x ) < snapDist.x )
if( canUseGrid() && std::abs( nearestGrid.x - aOrigin.x ) < snapDist.x )
{
pt.x = nearestGrid.x;
snapDist.x = std::abs( nearestGrid.x - aOrigin.x );
snapLineX = false;
}
if( m_enableGrid && std::abs( nearestGrid.y - aOrigin.y ) < snapDist.y )
if( canUseGrid() && std::abs( nearestGrid.y - aOrigin.y ) < snapDist.y )
{
pt.y = nearestGrid.y;
snapDist.y = std::abs( nearestGrid.y - aOrigin.y );
@ -172,24 +172,27 @@ VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, int aLayer,
if( m_enableSnap && nearest && nearest->Distance( aOrigin ) < snapDist.EuclideanNorm() )
{
pt = nearest->pos;
snapDist.x = std::abs( nearest->pos.x - aOrigin.x );
snapDist.y = std::abs( nearest->pos.y - aOrigin.y );
snapLineX = snapLineY = false;
snapPoint = true;
if( m_enableGrid && ( nearestGrid - aOrigin ).EuclideanNorm() < snapDist.EuclideanNorm() )
if( canUseGrid() && ( nearestGrid - aOrigin ).EuclideanNorm() < snapDist.EuclideanNorm() )
{
pt = nearestGrid;
snapDist.x = std::abs( nearestGrid.x - aOrigin.x );
snapDist.y = std::abs( nearestGrid.y - aOrigin.y );
snapPoint = false;
}
else
{
pt = nearest->pos;
snapDist.x = std::abs( nearest->pos.x - aOrigin.x );
snapDist.y = std::abs( nearest->pos.y - aOrigin.y );
snapPoint = true;
}
snapLineX = snapLineY = false;
gridChecked = true;
}
if( m_enableGrid && !gridChecked )
if( canUseGrid() && !gridChecked )
pt = nearestGrid;
if( snapLineX || snapLineY )
@ -223,7 +226,6 @@ VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, int aLayer,
return pt;
}
SCH_ITEM* EE_GRID_HELPER::GetSnapped() const
{
if( !m_snapItem )
@ -289,7 +291,7 @@ void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, b
if( SCH_LINE* line = dyn_cast<SCH_LINE*>( aItem ) )
{
VECTOR2I pt = m_enableGrid ? Align( aRefPos ) : aRefPos;
VECTOR2I pt = Align( aRefPos );
if( line->GetStartPoint().x == line->GetEndPoint().x )
{

View File

@ -24,6 +24,7 @@
#ifndef GRID_HELPER_H
#define GRID_HELPER_H
#include <tool/tool_manager.h>
#include <vector>
#include <math/vector2d.h>
#include <origin_viewitem.h>
@ -113,6 +114,15 @@ protected:
m_anchors.clear();
}
/**
* Check whether it is possible to use the grid -- this depends both on local grid helper
* settings and global (tool manager) KiCad settings.
*/
bool canUseGrid() const
{
return m_enableGrid && m_toolMgr->GetView()->GetGAL()->GetGridSnapping();
}
protected:
std::vector<ANCHOR> m_anchors;

View File

@ -46,14 +46,6 @@ public:
*/
BOARD_ITEM* GetSnapped() const;
VECTOR2I Align( const VECTOR2I& aPoint ) const override
{
if( !m_enableGrid )
return aPoint;
return GRID_HELPER::Align( aPoint );
}
VECTOR2I AlignToSegment ( const VECTOR2I& aPoint, const SEG& aSeg );
VECTOR2I BestDragOrigin( const VECTOR2I& aMousePos, std::vector<BOARD_ITEM*>& aItem );