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:
49 EDIT_POINT( const VECTOR2I& aPoint, std::pair<EDA_ITEM*, int> aConnected = { nullptr, 0 } ) :
50 m_position( aPoint ),
51 m_isActive( false ),
52 m_isHover( false ),
53 m_drawCircle( false ),
56 m_connected( aConnected )
57 {
58 }
59
60 virtual ~EDIT_POINT() {}
61
68 virtual VECTOR2I GetPosition() const
69 {
70 return m_position;
71 }
72
76 virtual std::pair<EDA_ITEM*, int> GetConnected() const
77 {
78 return m_connected;
79 }
80
84 inline int GetX() const
85 {
86 return GetPosition().x;
87 }
88
92 inline int GetY() const
93 {
94 return GetPosition().y;
95 }
96
104 virtual void SetPosition( const VECTOR2I& aPosition )
105 {
106 m_position = aPosition;
107 }
108
109 virtual void SetPosition( int x, int y )
110 {
111 m_position.x = x;
112 m_position.y = y;
113 }
114
121 bool WithinPoint( const VECTOR2I& aPoint, unsigned int aSize ) const;
122
128 void SetRelation( std::unique_ptr<EDIT_RELATION> aRelation )
129 {
130 m_relation = std::move( aRelation );
131 }
132
138 {
139 return m_relation.get();
140 }
141
147 virtual bool IsConstrained() const
148 {
149 return m_relation != nullptr;
150 }
151
155 virtual void ApplyRelation( const GRID_HELPER& aGrid )
156 {
157 if( m_relation )
158 m_relation->Apply( *this, aGrid );
159 }
160
161 bool IsActive() const { return m_isActive; }
162 void SetActive( bool aActive = true ) { m_isActive = aActive; }
163
164 bool IsHover() const { return m_isHover; }
165 void SetHover( bool aHover = true ) { m_isHover = aHover; }
166
167 bool DrawCircle() const { return m_drawCircle; }
168 void SetDrawCircle( bool aDrawCircle = true ) { m_drawCircle = aDrawCircle; }
169
171 void SetGridConstraint( GRID_CONSTRAINT_TYPE aConstraint ) { m_gridConstraint = aConstraint; }
172
174 void SetSnapConstraint( SNAP_CONSTRAINT_TYPE aConstraint ) { m_snapConstraint = aConstraint; }
175
176 bool operator==( const EDIT_POINT& aOther ) const
177 {
178 return m_position == aOther.m_position;
179 }
180
182 static const int POINT_SIZE = 8;
183
184#ifdef __WXMAC__
185 static const int BORDER_SIZE = 3;
186 static const int HOVER_SIZE = 6;
187#else
188 static const int BORDER_SIZE = 2;
189 static const int HOVER_SIZE = 5;
190#endif
191
192private:
199
202 std::pair<EDA_ITEM*, int> m_connected;
203
205 std::shared_ptr<EDIT_RELATION> m_relation;
206};
207
208
215class EDIT_LINE : public EDIT_POINT
216{
217public:
222 EDIT_LINE( EDIT_POINT& aOrigin, EDIT_POINT& aEnd ) :
223 EDIT_POINT( aOrigin.GetPosition()
224 + ( aEnd.GetPosition() / 2 - aOrigin.GetPosition() / 2 ) ),
225 m_origin( aOrigin ), m_end( aEnd )
226 {
228 }
229
231 virtual VECTOR2I GetPosition() const override
232 {
233 return m_origin.GetPosition() / 2 + m_end.GetPosition() / 2;
234 }
235
237 virtual void SetPosition( const VECTOR2I& aPosition ) override
238 {
239 VECTOR2I difference = aPosition - GetPosition();
240
241 m_origin.SetPosition( m_origin.GetPosition() + difference );
242 m_end.SetPosition( m_end.GetPosition() + difference );
243 }
244
246 virtual void ApplyRelation( const GRID_HELPER& aGrid ) override
247 {
248 if( m_dragPolicy )
249 m_dragPolicy->Apply( *this, aGrid );
250
251 if( m_relation )
252 m_relation->Apply( *this, aGrid );
253
254 m_origin.ApplyRelation( aGrid );
255 m_end.ApplyRelation( aGrid );
256 }
257
263 void SetRelation( std::unique_ptr<EDIT_RELATION> aRelation )
264 {
265 m_relation = std::move( aRelation );
266 }
267
273 {
274 return m_relation.get();
275 }
276
277 void SetDragPolicy( std::unique_ptr<POLYGON_EDGE_DRAG_POLICY> aPolicy )
278 {
279 m_dragPolicy = std::move( aPolicy );
280 }
281
283
287 bool IsConstrained() const override
288 {
289 return m_relation != nullptr || m_dragPolicy != nullptr;
290 }
291
296 {
297 return m_origin;
298 }
299
300 const EDIT_POINT& GetOrigin() const
301 {
302 return m_origin;
303 }
304
309 {
310 return m_end;
311 }
312
313 const EDIT_POINT& GetEnd() const
314 {
315 return m_end;
316 }
317
321 bool HasCenterPoint() const { return m_hasCenterPoint; }
322
326 void SetHasCenterPoint( bool aHasCenterPoint ) { m_hasCenterPoint = aHasCenterPoint; }
327
331 bool DrawLine() const { return m_showLine; }
332
336 void SetDrawLine( bool aShowLine ) { m_showLine = aShowLine; }
337
338 bool operator==( const EDIT_POINT& aOther ) const
339 {
340 return GetPosition() == aOther.GetPosition();
341 }
342
343 bool operator==( const EDIT_LINE& aOther ) const
344 {
345 return m_origin == aOther.m_origin && m_end == aOther.m_end;
346 }
347
348private:
351
352 bool m_hasCenterPoint = true;
353 bool m_showLine = false;
354
356 std::shared_ptr<EDIT_RELATION> m_relation;
357 std::shared_ptr<POLYGON_EDGE_DRAG_POLICY> m_dragPolicy;
358};
359
360
364class EDIT_POINTS : public EDA_ITEM
365{
366public:
370 EDIT_POINTS( EDA_ITEM* aParent );
371
377 EDIT_POINT* FindPoint( const VECTOR2I& aLocation, KIGFX::VIEW *aView );
378
383 {
384 return m_parent;
385 }
386
390 void Clear()
391 {
392 m_points.clear();
393 m_lines.clear();
394 m_contours.clear();
395 }
396
402 void AddPoint( const EDIT_POINT& aPoint )
403 {
404 m_points.push_back( aPoint );
405 }
406
412 void AddPoint( const VECTOR2I& aPoint, std::pair<EDA_ITEM*, int> aConnected = { nullptr, 0 } )
413 {
414 AddPoint( EDIT_POINT( aPoint, aConnected ) );
415 }
416
422 void AddLine( const EDIT_LINE& aLine )
423 {
424 m_lines.push_back( aLine );
425 }
426
433 void AddLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
434 {
435 m_lines.emplace_back( aOrigin, aEnd );
436 }
437
446 void AddIndicatorLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
447 {
448 EDIT_LINE& line = m_lines.emplace_back( aOrigin, aEnd );
449 line.SetHasCenterPoint( false );
450 line.SetDrawLine( true );
451 }
452
453
457 void AddBreak()
458 {
459 assert( m_points.size() > 0 );
460 m_contours.push_back( m_points.size() - 1 );
461 }
462
469 int GetContourStartIdx( int aPointIdx ) const;
470
477 int GetContourEndIdx( int aPointIdx ) const;
478
485 bool IsContourStart( int aPointIdx ) const;
486
493 bool IsContourEnd( int aPointIdx ) const;
494
505 EDIT_POINT* Previous( const EDIT_POINT& aPoint, bool aTraverseContours = true );
506
507 EDIT_LINE* Previous( const EDIT_LINE& aLine );
508
519 EDIT_POINT* Next( const EDIT_POINT& aPoint, bool aTraverseContours = true );
520
521 EDIT_LINE* Next( const EDIT_LINE& aLine );
522
523 EDIT_POINT& Point( unsigned int aIndex )
524 {
525 return m_points[aIndex];
526 }
527
528 const EDIT_POINT& Point( unsigned int aIndex ) const
529 {
530 return m_points[aIndex];
531 }
532
533 EDIT_LINE& Line( unsigned int aIndex )
534 {
535 return m_lines[aIndex];
536 }
537
538 const EDIT_LINE& Line( unsigned int aIndex ) const
539 {
540 return m_lines[aIndex];
541 }
542
546 unsigned int PointsSize() const
547 {
548 return m_points.size();
549 }
550
554 unsigned int LinesSize() const
555 {
556 return m_lines.size();
557 }
558
560 virtual const BOX2I ViewBBox() const override;
561
563 virtual void ViewDraw( int aLayer, KIGFX::VIEW* aView ) const override;
564
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:918
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:37
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
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
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:76
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:92
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:60
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:49
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition edit_points.h:68
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:84
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:683