KiCad PCB EDA Suite
Loading...
Searching...
No Matches
edit_points.h
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 (C) 2014-2017 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Maciej Suminski <[email protected]>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifndef EDIT_POINTS_H_
24#define EDIT_POINTS_H_
25
26#include <eda_item.h>
27#include <layer_ids.h>
28
29#include <list>
30#include <deque>
31#include <memory>
32
33#include "edit_relations.h"
34#include <view/view.h>
35
36
44{
45public:
50 EDIT_POINT( const VECTOR2I& aPoint, std::pair<EDA_ITEM*, int> aConnected = { nullptr, 0 } ) :
51 m_position( aPoint ),
52 m_isActive( false ),
53 m_isHover( false ),
54 m_drawCircle( false ),
57 m_connected( aConnected )
58 {
59 }
60
61 virtual ~EDIT_POINT() {}
62
69 virtual VECTOR2I GetPosition() const
70 {
71 return m_position;
72 }
73
77 virtual std::pair<EDA_ITEM*, int> GetConnected() const
78 {
79 return m_connected;
80 }
81
85 inline int GetX() const
86 {
87 return GetPosition().x;
88 }
89
93 inline int GetY() const
94 {
95 return GetPosition().y;
96 }
97
105 virtual void SetPosition( const VECTOR2I& aPosition )
106 {
107 m_position = aPosition;
108 }
109
110 virtual void SetPosition( int x, int y )
111 {
112 m_position.x = x;
113 m_position.y = y;
114 }
115
122 bool WithinPoint( const VECTOR2I& aPoint, unsigned int aSize ) const;
123
129 void SetRelation( std::unique_ptr<EDIT_RELATION> aRelation )
130 {
131 m_relation = std::move( aRelation );
132 }
133
139 {
140 return m_relation.get();
141 }
142
148 virtual bool IsConstrained() const
149 {
150 return m_relation != nullptr;
151 }
152
156 virtual void ApplyRelation( const GRID_HELPER& aGrid )
157 {
158 if( m_relation )
159 m_relation->Apply( *this, aGrid );
160 }
161
162 bool IsActive() const { return m_isActive; }
163 void SetActive( bool aActive = true ) { m_isActive = aActive; }
164
165 bool IsHover() const { return m_isHover; }
166 void SetHover( bool aHover = true ) { m_isHover = aHover; }
167
168 bool DrawCircle() const { return m_drawCircle; }
169 void SetDrawCircle( bool aDrawCircle = true ) { m_drawCircle = aDrawCircle; }
170
172 void SetGridConstraint( GRID_CONSTRAINT_TYPE aConstraint ) { m_gridConstraint = aConstraint; }
173
175 void SetSnapConstraint( SNAP_CONSTRAINT_TYPE aConstraint ) { m_snapConstraint = aConstraint; }
176
177 bool operator==( const EDIT_POINT& aOther ) const
178 {
179 return m_position == aOther.m_position;
180 }
181
183 static const int POINT_SIZE = 8;
184
185#ifdef __WXMAC__
186 static const int BORDER_SIZE = 3;
187 static const int HOVER_SIZE = 6;
188#else
189 static const int BORDER_SIZE = 2;
190 static const int HOVER_SIZE = 5;
191#endif
192
193private:
200
203 std::pair<EDA_ITEM*, int> m_connected;
204
206 std::shared_ptr<EDIT_RELATION> m_relation;
207};
208
209
216class EDIT_LINE : public EDIT_POINT
217{
218public:
223 EDIT_LINE( EDIT_POINT& aOrigin, EDIT_POINT& aEnd ) :
224 EDIT_POINT( aOrigin.GetPosition()
225 + ( aEnd.GetPosition() / 2 - aOrigin.GetPosition() / 2 ) ),
226 m_origin( aOrigin ), m_end( aEnd )
227 {
229 }
230
232 virtual VECTOR2I GetPosition() const override
233 {
234 return m_origin.GetPosition() / 2 + m_end.GetPosition() / 2;
235 }
236
238 virtual void SetPosition( const VECTOR2I& aPosition ) override
239 {
240 VECTOR2I difference = aPosition - GetPosition();
241
242 m_origin.SetPosition( m_origin.GetPosition() + difference );
243 m_end.SetPosition( m_end.GetPosition() + difference );
244 }
245
247 virtual void ApplyRelation( const GRID_HELPER& aGrid ) override
248 {
249 if( m_dragPolicy )
250 m_dragPolicy->Apply( *this, aGrid );
251
252 if( m_relation )
253 m_relation->Apply( *this, aGrid );
254
255 m_origin.ApplyRelation( aGrid );
256 m_end.ApplyRelation( aGrid );
257 }
258
264 void SetRelation( std::unique_ptr<EDIT_RELATION> aRelation )
265 {
266 m_relation = std::move( aRelation );
267 }
268
274 {
275 return m_relation.get();
276 }
277
278 void SetDragPolicy( std::unique_ptr<POLYGON_EDGE_DRAG_POLICY> aPolicy )
279 {
280 m_dragPolicy = std::move( aPolicy );
281 }
282
284
288 bool IsConstrained() const override
289 {
290 return m_relation != nullptr || m_dragPolicy != nullptr;
291 }
292
297 {
298 return m_origin;
299 }
300
301 const EDIT_POINT& GetOrigin() const
302 {
303 return m_origin;
304 }
305
310 {
311 return m_end;
312 }
313
314 const EDIT_POINT& GetEnd() const
315 {
316 return m_end;
317 }
318
322 bool HasCenterPoint() const { return m_hasCenterPoint; }
323
327 void SetHasCenterPoint( bool aHasCenterPoint ) { m_hasCenterPoint = aHasCenterPoint; }
328
332 bool DrawLine() const { return m_showLine; }
333
337 void SetDrawLine( bool aShowLine ) { m_showLine = aShowLine; }
338
339 bool operator==( const EDIT_POINT& aOther ) const
340 {
341 return GetPosition() == aOther.GetPosition();
342 }
343
344 bool operator==( const EDIT_LINE& aOther ) const
345 {
346 return m_origin == aOther.m_origin && m_end == aOther.m_end;
347 }
348
349private:
352
353 bool m_hasCenterPoint = true;
354 bool m_showLine = false;
355
357 std::shared_ptr<EDIT_RELATION> m_relation;
358 std::shared_ptr<POLYGON_EDGE_DRAG_POLICY> m_dragPolicy;
359};
360
361
365class EDIT_POINTS : public EDA_ITEM
366{
367public:
371 EDIT_POINTS( EDA_ITEM* aParent );
372
379 EDIT_POINT* FindPoint( const VECTOR2I& aLocation, KIGFX::VIEW *aView );
380
385 {
386 return m_parent;
387 }
388
392 void Clear()
393 {
394 m_points.clear();
395 m_lines.clear();
396 m_contours.clear();
397 }
398
404 void AddPoint( const EDIT_POINT& aPoint )
405 {
406 m_points.push_back( aPoint );
407 }
408
415 void AddPoint( const VECTOR2I& aPoint, std::pair<EDA_ITEM*, int> aConnected = { nullptr, 0 } )
416 {
417 AddPoint( EDIT_POINT( aPoint, aConnected ) );
418 }
419
425 void AddLine( const EDIT_LINE& aLine )
426 {
427 m_lines.push_back( aLine );
428 }
429
436 void AddLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
437 {
438 m_lines.emplace_back( aOrigin, aEnd );
439 }
440
449 void AddIndicatorLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
450 {
451 EDIT_LINE& line = m_lines.emplace_back( aOrigin, aEnd );
452 line.SetHasCenterPoint( false );
453 line.SetDrawLine( true );
454 }
455
456
460 void AddBreak()
461 {
462 assert( m_points.size() > 0 );
463 m_contours.push_back( m_points.size() - 1 );
464 }
465
472 int GetContourStartIdx( int aPointIdx ) const;
473
480 int GetContourEndIdx( int aPointIdx ) const;
481
488 bool IsContourStart( int aPointIdx ) const;
489
496 bool IsContourEnd( int aPointIdx ) const;
497
508 EDIT_POINT* Previous( const EDIT_POINT& aPoint, bool aTraverseContours = true );
509
510 EDIT_LINE* Previous( const EDIT_LINE& aLine );
511
522 EDIT_POINT* Next( const EDIT_POINT& aPoint, bool aTraverseContours = true );
523
524 EDIT_LINE* Next( const EDIT_LINE& aLine );
525
526 EDIT_POINT& Point( unsigned int aIndex )
527 {
528 return m_points[aIndex];
529 }
530
531 const EDIT_POINT& Point( unsigned int aIndex ) const
532 {
533 return m_points[aIndex];
534 }
535
536 EDIT_LINE& Line( unsigned int aIndex )
537 {
538 return m_lines[aIndex];
539 }
540
541 const EDIT_LINE& Line( unsigned int aIndex ) const
542 {
543 return m_lines[aIndex];
544 }
545
549 unsigned int PointsSize() const
550 {
551 return m_points.size();
552 }
553
557 unsigned int LinesSize() const
558 {
559 return m_lines.size();
560 }
561
562 virtual const BOX2I ViewBBox() const override;
563
564 virtual void ViewDraw( int aLayer, KIGFX::VIEW* aView ) const override;
565
566 virtual std::vector<int> ViewGetLayers() const override
567 {
568 return { LAYER_GP_OVERLAY };
569 }
570
571#if defined(DEBUG)
572 void Show( int x, std::ostream& st ) const override
573 {
574 }
575#endif
576
582 virtual wxString GetClass() const override
583 {
584 return wxT( "EDIT_POINTS" );
585 }
586
587 bool SwapX() const { return m_swapX; }
588 void SetSwapX( bool aSwap ) { m_swapX = aSwap; }
589
590 bool SwapY() const { return m_swapY; }
591 void SetSwapY( bool aSwap ) { m_swapY = aSwap; }
592
593private:
595 bool m_swapX;
596 bool m_swapY;
597 std::deque<EDIT_POINT> m_points;
598 std::deque<EDIT_LINE> m_lines;
599 std::list<int> m_contours;
601};
602
603#endif /* EDIT_POINTS_H_ */
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
Represent a line connecting two EDIT_POINTs.
virtual void SetPosition(const VECTOR2I &aPosition) override
Return coordinates of an EDIT_POINT.
POLYGON_EDGE_DRAG_POLICY * GetDragPolicy() const
EDIT_LINE(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
const EDIT_POINT & GetEnd() const
bool operator==(const EDIT_LINE &aOther) const
void SetRelation(std::unique_ptr< EDIT_RELATION > aRelation)
Set a relation for an EDIT_LINE.
bool IsConstrained() const override
Check if line is constrained.
virtual void ApplyRelation(const GRID_HELPER &aGrid) override
Correct coordinates of an EDIT_POINT by applying its relation.
void SetHasCenterPoint(bool aHasCenterPoint)
Set if the center-point of the line should be shown.
EDIT_POINT & GetEnd()
Return the end EDIT_POINT.
EDIT_POINT & GetOrigin()
Return the origin EDIT_POINT.
bool DrawLine() const
Should the line itself be drawn, or just the end and/or center points?
bool m_showLine
True if the line itself should be drawn.
EDIT_POINT & m_end
End point for a line.
virtual VECTOR2I GetPosition() const override
Return coordinates of an EDIT_POINT.
void SetDragPolicy(std::unique_ptr< POLYGON_EDGE_DRAG_POLICY > aPolicy)
std::shared_ptr< POLYGON_EDGE_DRAG_POLICY > m_dragPolicy
void SetDrawLine(bool aShowLine)
Set if the line itself should be drawn.
std::shared_ptr< EDIT_RELATION > m_relation
Relation and geometry policy for the line, NULL if absent.
EDIT_RELATION * GetRelation() const
Return the relation imposed on an EDIT_LINE.
const EDIT_POINT & GetOrigin() const
EDIT_POINT & m_origin
Origin point for a line.
bool m_hasCenterPoint
True if the line has a (useful) center point.
bool operator==(const EDIT_POINT &aOther) const
bool HasCenterPoint() const
Is the center-point of the line useful to be shown?
unsigned int PointsSize() const
Return number of stored EDIT_POINTs.
bool IsContourStart(int aPointIdx) const
Check if a point with given index is a contour origin.
bool m_allowPoints
If false, only allow editing of EDIT_LINES.
int GetContourEndIdx(int aPointIdx) const
Return index of the contour finish for a point with given index.
void AddPoint(const EDIT_POINT &aPoint)
Add an EDIT_POINT.
const EDIT_LINE & Line(unsigned int aIndex) const
void SetSwapY(bool aSwap)
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
EDIT_POINT * Previous(const EDIT_POINT &aPoint, bool aTraverseContours=true)
Return the point that is after the given point in the list.
void Clear()
Clear all stored EDIT_POINTs and EDIT_LINEs.
EDIT_POINT * Next(const EDIT_POINT &aPoint, bool aTraverseContours=true)
Return the point that is before the given point in the list.
std::deque< EDIT_LINE > m_lines
EDIT_LINEs for modifying m_parent.
std::list< int > m_contours
Indices of end contour points.
virtual std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
EDIT_POINTS(EDA_ITEM *aParent)
void AddPoint(const VECTOR2I &aPoint, std::pair< EDA_ITEM *, int > aConnected={ nullptr, 0 })
Add an EDIT_POINT.
EDIT_LINE & Line(unsigned int aIndex)
virtual wxString GetClass() const override
Get the class name.
bool m_swapY
Parent's Y coords are inverted.
const EDIT_POINT & Point(unsigned int aIndex) const
bool IsContourEnd(int aPointIdx) const
Check is a point with given index is a contour finish.
EDA_ITEM * m_parent
Parent of the EDIT_POINTs.
void AddIndicatorLine(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
Adds an EDIT_LINE that is shown as an indicator, rather than an editable line (no center point drag,...
std::deque< EDIT_POINT > m_points
EDIT_POINTs for modifying m_parent.
bool SwapX() const
bool m_swapX
Parent's X coords are inverted.
EDIT_POINT * FindPoint(const VECTOR2I &aLocation, KIGFX::VIEW *aView)
Return a point that is at given coordinates or NULL if there is no such point.
bool SwapY() const
void SetSwapX(bool aSwap)
void AddBreak()
Adds a break, indicating the end of a contour.
int GetContourStartIdx(int aPointIdx) const
Return index of the contour origin for a point with given index.
EDA_ITEM * GetParent() const
Return parent of the EDIT_POINTS.
unsigned int LinesSize() const
Return number of stored EDIT_LINEs.
void AddLine(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
Adds an EDIT_LINE.
virtual void ViewDraw(int aLayer, KIGFX::VIEW *aView) const override
Draw the parts of the object belonging to layer aLayer.
EDIT_POINT & Point(unsigned int aIndex)
void AddLine(const EDIT_LINE &aLine)
Adds an EDIT_LINE.
Represent a single point that can be used for modifying items.
Definition edit_points.h:44
virtual std::pair< EDA_ITEM *, int > GetConnected() const
Return a connected item record comprising an EDA_ITEM* and a STARTPOINT/ENDPOINT flag.
Definition edit_points.h:77
void SetGridConstraint(GRID_CONSTRAINT_TYPE aConstraint)
static const int HOVER_SIZE
Border size when hovering.
std::pair< EDA_ITEM *, int > m_connected
An optional connected item record used to mimic polyLine behavior with individual line segments.
int GetY() const
Return Y coordinate of an EDIT_POINT.
Definition edit_points.h:93
bool DrawCircle() const
std::shared_ptr< EDIT_RELATION > m_relation
Relation for the point, NULL if none.
bool IsActive() const
bool m_isHover
True if this point is being hovered over.
EDIT_RELATION * GetRelation() const
Return the relation imposed on an EDIT_POINT.
virtual void ApplyRelation(const GRID_HELPER &aGrid)
Correct coordinates of an EDIT_POINT by applying its relation.
virtual ~EDIT_POINT()
Definition edit_points.h:61
virtual void SetPosition(int x, int y)
virtual bool IsConstrained() const
Check if point is constrained.
static const int POINT_SIZE
Single point size in pixels.
GRID_CONSTRAINT_TYPE m_gridConstraint
Describe the grid snapping behavior.
SNAP_CONSTRAINT_TYPE GetSnapConstraint() const
virtual void SetPosition(const VECTOR2I &aPosition)
Set new coordinates for an EDIT_POINT.
VECTOR2I m_position
Position of EDIT_POINT.
EDIT_POINT(const VECTOR2I &aPoint, std::pair< EDA_ITEM *, int > aConnected={ nullptr, 0 })
Definition edit_points.h:50
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition edit_points.h:69
void SetSnapConstraint(SNAP_CONSTRAINT_TYPE aConstraint)
bool WithinPoint(const VECTOR2I &aPoint, unsigned int aSize) const
Check if given point is within a square centered in the EDIT_POINT position.
SNAP_CONSTRAINT_TYPE m_snapConstraint
Describe the object snapping behavior.
void SetHover(bool aHover=true)
bool m_drawCircle
True if the point is drawn circular.
bool IsHover() const
bool operator==(const EDIT_POINT &aOther) const
int GetX() const
Return X coordinate of an EDIT_POINT.
Definition edit_points.h:85
void SetRelation(std::unique_ptr< EDIT_RELATION > aRelation)
Set a relation for an EDIT_POINT.
void SetActive(bool aActive=true)
static const int BORDER_SIZE
Border size when not hovering.
GRID_CONSTRAINT_TYPE GetGridConstraint() const
bool m_isActive
True if this point is being manipulated.
void SetDrawCircle(bool aDrawCircle=true)
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:63
SNAP_CONSTRAINT_TYPE
@ OBJECT_LAYERS
GRID_CONSTRAINT_TYPE
@ SNAP_BY_GRID
@ SNAP_TO_GRID
@ LAYER_GP_OVERLAY
General purpose overlay.
Definition layer_ids.h:275
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708