Fix snapping dist when disabling grid

The disable grid hotkey should allow the snap scale to be completely
determined by the snapSize and world scale.  This prevents snapRange
from overriding in the case where grid is disabled.

Additionally, we disallow grid snapping when the grid scale is not
visible.  This means that when zoomed out sufficiently to not show the
minor ticks, these minor ticks will not override a snap

Fixes https://gitlab.com/kicad/code/kicad/issues/12303
This commit is contained in:
Seth Hillbrand 2022-12-21 17:45:31 -08:00
parent 73c4ec0b85
commit 1cc9792cdb
5 changed files with 39 additions and 17 deletions

View File

@ -1605,23 +1605,11 @@ void OPENGL_GAL::DrawGrid()
if( !m_gridVisibility || m_gridSize.x == 0 || m_gridSize.y == 0 )
return;
VECTOR2D gridScreenSize( m_gridSize );
double gridThreshold = computeMinGridSpacing() / m_worldScale;
if( m_gridStyle == GRID_STYLE::SMALL_CROSS )
gridThreshold *= 2.0;
// If we cannot display the grid density, scale down by a tick size and
// try again. Eventually, we get some representation of the grid
while( std::min( gridScreenSize.x, gridScreenSize.y ) <= gridThreshold )
{
gridScreenSize = gridScreenSize * static_cast<double>( m_gridTick );
}
VECTOR2D gridScreenSize = GetVisibleGridSize();
// Compute grid starting and ending indexes to draw grid points on the
// visible screen area
// Note: later any point coordinate will be offsetted by m_gridOrigin
// Note: later any point coordinate will be offset by m_gridOrigin
int gridStartX = KiROUND( ( worldStartPoint.x - m_gridOrigin.x ) / gridScreenSize.x );
int gridEndX = KiROUND( ( worldEndPoint.x - m_gridOrigin.x ) / gridScreenSize.x );
int gridStartY = KiROUND( ( worldStartPoint.y - m_gridOrigin.y ) / gridScreenSize.y );

View File

@ -56,6 +56,14 @@ VECTOR2I GRID_HELPER::GetGrid() const
}
VECTOR2I GRID_HELPER::GetVisibleGrid() const
{
VECTOR2D size = m_toolMgr->GetView()->GetGAL()->GetVisibleGridSize();
return VECTOR2I( KiROUND( size.x ), KiROUND( size.y ) );
}
VECTOR2I GRID_HELPER::GetOrigin() const
{
VECTOR2D origin = m_toolMgr->GetView()->GetGAL()->GetGridOrigin();

View File

@ -775,6 +775,30 @@ public:
return m_gridSize;
}
/**
* Return the visible grid size in x and y directions
*
* @return A vector containing the spacing of visible grid marks
*/
inline VECTOR2D GetVisibleGridSize() const
{
VECTOR2D gridScreenSize( m_gridSize );
double gridThreshold = computeMinGridSpacing() / m_worldScale;
if( m_gridStyle == GRID_STYLE::SMALL_CROSS )
gridThreshold *= 2.0;
// If we cannot display the grid density, scale down by a tick size and
// try again. Eventually, we get some representation of the grid
while( std::min( gridScreenSize.x, gridScreenSize.y ) <= gridThreshold )
{
gridScreenSize = gridScreenSize * static_cast<double>( m_gridTick );
}
return gridScreenSize;
}
/**
* Set the grid color.
*

View File

@ -40,6 +40,7 @@ public:
virtual ~GRID_HELPER();
VECTOR2I GetGrid() const;
VECTOR2I GetVisibleGrid() const;
VECTOR2I GetOrigin() const;
void SetAuxAxes( bool aEnable, const VECTOR2I& aOrigin = VECTOR2I( 0, 0 ) );

View File

@ -285,9 +285,10 @@ VECTOR2I PCB_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, const LSET& a
// points that are visible can always be snapped to.
// see https://gitlab.com/kicad/code/kicad/-/issues/5638
// see https://gitlab.com/kicad/code/kicad/-/issues/7125
double snapScale = snapSize / m_toolMgr->GetView()->GetGAL()->GetWorldScale();
int snapRange = std::min( KiROUND( snapScale ), GetGrid().x );
int snapDist = snapRange;
// see https://gitlab.com/kicad/code/kicad/-/issues/12303
int snapScale = KiROUND( snapSize / m_toolMgr->GetView()->GetGAL()->GetWorldScale() );
int snapRange = m_enableGrid ? std::min( snapScale, GetVisibleGrid().x ) : snapScale;
int snapDist = snapRange;
//Respect limits of coordinates representation
BOX2I bb;