KiCad PCB EDA Suite
Loading...
Searching...
No Matches
grid_helper.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include "tool/grid_helper.h"
25
26#include <functional>
27
28#include <advanced_config.h>
30#include <gal/painter.h>
31#include <math/util.h> // for KiROUND
32#include <math/vector2d.h>
33#include <render_settings.h>
34#include <tool/tool_manager.h>
35#include <tool/tools_holder.h>
36#include <view/view.h>
38
39
41 m_toolMgr( nullptr ), m_snapManager( m_constructionGeomPreview )
42{
44 m_enableSnap = true;
45 m_enableSnapLine = true;
46 m_enableGrid = true;
47 m_snapItem = std::nullopt;
48
49 m_manualGrid = VECTOR2D( 1, 1 );
51 m_manualOrigin = VECTOR2I( 0, 0 );
53}
54
55
56GRID_HELPER::GRID_HELPER( TOOL_MANAGER* aToolMgr, int aConstructionLayer ) :
58{
59 m_toolMgr = aToolMgr;
60
61 if( !m_toolMgr )
62 return;
63
64 KIGFX::VIEW* view = m_toolMgr->GetView();
65 KIGFX::RENDER_SETTINGS* settings = view->GetPainter()->GetSettings();
66
67 const KIGFX::COLOR4D constructionColour = settings->GetLayerColor( aConstructionLayer );
69 m_constructionGeomPreview.SetColor( constructionColour.WithAlpha( 0.7 ) );
70
73
75 [view, this]( bool aAnythingShown )
76 {
77 const bool currentlyVisible = view->IsVisible( &m_constructionGeomPreview );
78
79 if( currentlyVisible && aAnythingShown )
80 {
82 }
83 else
84 {
85 view->SetVisible( &m_constructionGeomPreview, aAnythingShown );
86 }
88 m_toolMgr->GetToolHolder()->RefreshCanvas();
89 } );
90
91 // Initialise manual values from view for compatibility
92 m_manualGrid = view->GetGAL()->GetGridSize();
96}
97
98
100{
101 if( !m_toolMgr )
102 return;
103
104 KIGFX::VIEW& view = *m_toolMgr->GetView();
106
107 if( m_anchorDebug )
108 view.Remove( m_anchorDebug.get() );
109}
110
111
113{
114 static bool permitted = ADVANCED_CFG::GetCfg().m_EnableSnapAnchorsDebug;
115
116 if( !m_toolMgr )
117 return nullptr;
118
119 if( permitted && !m_anchorDebug )
120 {
121 KIGFX::VIEW& view = *m_toolMgr->GetView();
122 m_anchorDebug = std::make_unique<KIGFX::ANCHOR_DEBUG>();
123 view.Add( m_anchorDebug.get() );
124 view.SetVisible( m_anchorDebug.get(), true );
125 }
126
127 return m_anchorDebug.get();
128}
129
130
132{
133 if( m_toolMgr )
135}
136
137
139{
140 if( !m_toolMgr )
141 return;
142
145
148 else
150}
151
152
154{
156 return VECTOR2I( KiROUND( size.x ), KiROUND( size.y ) );
157}
158
159
161{
163}
164
165
167{
168 if( m_toolMgr )
169 {
171 return VECTOR2I( origin );
172 }
173
174 return m_manualOrigin;
175}
176
177
179{
180 GRID_HELPER_GRIDS grid = GetItemGrid( aSelection.Front() );
181
182 // Find the largest grid of all the items and use that
183 for( EDA_ITEM* item : aSelection )
184 {
185 GRID_HELPER_GRIDS itemGrid = GetItemGrid( item );
186
187 if( GetGridSize( itemGrid ) > GetGridSize( grid ) )
188 grid = itemGrid;
189 }
190
191 return grid;
192}
193
194
196{
198}
199
200
201void GRID_HELPER::SetAuxAxes( bool aEnable, const VECTOR2I& aOrigin )
202{
203 if( aEnable )
204 {
205 m_auxAxis = aOrigin;
206 m_viewAxis.SetPosition( aOrigin );
207 if( m_toolMgr )
209 }
210 else
211 {
212 m_auxAxis = std::optional<VECTOR2I>();
213 if( m_toolMgr )
214 m_toolMgr->GetView()->SetVisible( &m_viewAxis, false );
215 }
216}
217
218
220{
221 return computeNearest( aPoint, GetGrid() );
222}
223
224
225VECTOR2I GRID_HELPER::AlignGrid( const VECTOR2I& aPoint, const VECTOR2D& aGrid ) const
226{
227 return computeNearest( aPoint, aGrid );
228}
229
230
231VECTOR2I GRID_HELPER::computeNearest( const VECTOR2I& aPoint, const VECTOR2I& aGrid ) const
232{
233 return VECTOR2I( KiROUND( static_cast<double>( aPoint.x ) / aGrid.x ) * aGrid.x,
234 KiROUND( static_cast<double>( aPoint.y ) / aGrid.y ) * aGrid.y );
235}
236
237
239{
240 return Align( aPoint, GetGrid() );
241}
242
243
244VECTOR2I GRID_HELPER::Align( const VECTOR2I& aPoint, const VECTOR2D& aGrid ) const
245{
246 if( !canUseGrid() )
247 return aPoint;
248
249 VECTOR2I nearest = AlignGrid( aPoint, aGrid );
250
251 if( !m_auxAxis )
252 return nearest;
253
254 if( std::abs( m_auxAxis->x - aPoint.x ) < std::abs( nearest.x - aPoint.x ) )
255 nearest.x = m_auxAxis->x;
256
257 if( std::abs( m_auxAxis->y - aPoint.y ) < std::abs( nearest.y - aPoint.y ) )
258 nearest.y = m_auxAxis->y;
259
260 return nearest;
261}
262
263
265{
268}
269
270
271std::optional<VECTOR2I> GRID_HELPER::GetSnappedPoint() const
272{
273 if( m_snapItem )
274 return m_snapItem->pos;
275
276 return std::nullopt;
277}
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:98
KIGFX::CONSTRUCTION_GEOM m_constructionGeomPreview
Show construction geometry (if any) on the canvas.
Definition: grid_helper.h:250
std::optional< VECTOR2I > m_auxAxis
Definition: grid_helper.h:228
bool m_enableGrid
Definition: grid_helper.h:233
virtual GRID_HELPER_GRIDS GetItemGrid(const EDA_ITEM *aItem) const
Get the coarsest grid that applies to an item.
Definition: grid_helper.h:98
void showConstructionGeometry(bool aShow)
SNAP_MANAGER m_snapManager
Manage the construction geometry, snap lines, reference points, etc.
Definition: grid_helper.h:253
virtual ~GRID_HELPER()
Definition: grid_helper.cpp:99
VECTOR2D m_manualVisibleGrid
Definition: grid_helper.h:244
bool m_manualGridSnapping
Definition: grid_helper.h:246
VECTOR2I m_manualOrigin
Definition: grid_helper.h:245
virtual GRID_HELPER_GRIDS GetSelectionGrid(const SELECTION &aSelection) const
Gets the coarsest grid that applies to a selecion of items.
TOOL_MANAGER * m_toolMgr
Definition: grid_helper.h:227
std::optional< VECTOR2I > GetSnappedPoint() const
void SetAuxAxes(bool aEnable, const VECTOR2I &aOrigin=VECTOR2I(0, 0))
VECTOR2D GetVisibleGrid() const
std::unique_ptr< KIGFX::ANCHOR_DEBUG > m_anchorDebug
#VIEW_ITEM for visualising anchor points, if enabled.
Definition: grid_helper.h:256
virtual VECTOR2D GetGridSize(GRID_HELPER_GRIDS aGrid) const
Return the size of the specified grid.
VECTOR2I GetGrid() const
bool m_enableSnapLine
Definition: grid_helper.h:234
bool m_enableSnap
Definition: grid_helper.h:232
VECTOR2I GetOrigin() const
bool canUseGrid() const
Check whether it is possible to use the grid – this depends both on local grid helper settings and gl...
std::optional< ANCHOR > m_snapItem
Definition: grid_helper.h:235
KIGFX::ANCHOR_DEBUG * enableAndGetAnchorDebug()
Enable the anchor debug if permitted and return it.
VECTOR2I computeNearest(const VECTOR2I &aPoint, const VECTOR2I &aGrid) const
KIGFX::SNAP_INDICATOR m_viewSnapPoint
Definition: grid_helper.h:239
virtual VECTOR2I Align(const VECTOR2I &aPoint, GRID_HELPER_GRIDS aGrid) const
Definition: grid_helper.h:74
void updateSnapPoint(const TYPED_POINT2I &aPoint)
KIGFX::ORIGIN_VIEWITEM m_viewAxis
Definition: grid_helper.h:240
VECTOR2D m_manualGrid
Definition: grid_helper.h:243
virtual VECTOR2I AlignGrid(const VECTOR2I &aPoint, GRID_HELPER_GRIDS aGrid) const
Definition: grid_helper.h:79
View item to draw debug items for anchors.
Definition: anchor_debug.h:45
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
Definition: color4d.h:311
void SetColor(const COLOR4D &aColor)
void SetPersistentColor(const COLOR4D &aColor)
const VECTOR2D & GetGridOrigin() const
VECTOR2D GetVisibleGridSize() const
Return the visible grid size in x and y directions.
const VECTOR2D & GetGridSize() const
Return the grid size.
bool GetGridSnapping() const
void SetPosition(const VECTOR2I &aPosition) override
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
void SetSnapTypes(int aSnapTypes)
Set a mask of point types that this snap item represents.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:66
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:298
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:341
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1685
GAL * GetGAL() const
Return the #GAL this view is using to draw graphical primitives.
Definition: view.h:202
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:220
bool IsVisible(const VIEW_ITEM *aItem) const
Return information if the item is visible (or not).
Definition: view.cpp:1655
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1612
EDA_ITEM * Front() const
Definition: selection.h:177
void SetUpdateCallback(GFX_UPDATE_CALLBACK aCallback)
Set the callback to call when the construction geometry changes and a view may need updating.
Master controller class:
Definition: tool_manager.h:62
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:406
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:395
GRID_HELPER_GRIDS
Definition: grid_helper.h:43
bool m_EnableSnapAnchorsDebug
Enable snap anchors debug visualization.
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:55
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:400
VECTOR2I m_point
Definition: point_types.h:77
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695
VECTOR2< double > VECTOR2D
Definition: vector2d.h:694