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_constraints.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
129 {
130 m_constraint.reset( aConstraint );
131 }
132
138 {
139 return m_constraint.get();
140 }
141
145 inline void ClearConstraint()
146 {
147 m_constraint.reset();
148 }
149
155 virtual bool IsConstrained() const
156 {
157 return m_constraint != nullptr;
158 }
159
163 virtual void ApplyConstraint( const GRID_HELPER& aGrid )
164 {
165 if( m_constraint )
166 m_constraint->Apply( aGrid );
167 }
168
169 bool IsActive() const { return m_isActive; }
170 void SetActive( bool aActive = true ) { m_isActive = aActive; }
171
172 bool IsHover() const { return m_isHover; }
173 void SetHover( bool aHover = true ) { m_isHover = aHover; }
174
175 bool DrawCircle() const { return m_drawCircle; }
176 void SetDrawCircle( bool aDrawCircle = true ) { m_drawCircle = aDrawCircle; }
177
179 void SetGridConstraint( GRID_CONSTRAINT_TYPE aConstraint ) { m_gridConstraint = aConstraint; }
180
182 void SetSnapConstraint( SNAP_CONSTRAINT_TYPE aConstraint ) { m_snapConstraint = aConstraint; }
183
184 bool operator==( const EDIT_POINT& aOther ) const
185 {
186 return m_position == aOther.m_position;
187 }
188
190 static const int POINT_SIZE = 8;
191
192#ifdef __WXMAC__
193 static const int BORDER_SIZE = 3;
194 static const int HOVER_SIZE = 6;
195#else
196 static const int BORDER_SIZE = 2;
197 static const int HOVER_SIZE = 5;
198#endif
199
200private:
207
210 std::pair<EDA_ITEM*, int> m_connected;
211
213 std::shared_ptr<EDIT_CONSTRAINT<EDIT_POINT> > m_constraint;
214};
215
216
223class EDIT_LINE : public EDIT_POINT
224{
225public:
230 EDIT_LINE( EDIT_POINT& aOrigin, EDIT_POINT& aEnd ) :
231 EDIT_POINT( aOrigin.GetPosition()
232 + ( aEnd.GetPosition() / 2 - aOrigin.GetPosition() / 2 ) ),
233 m_origin( aOrigin ), m_end( aEnd )
234 {
236 }
237
239 virtual VECTOR2I GetPosition() const override
240 {
241 return m_origin.GetPosition() / 2 + m_end.GetPosition() / 2;
242 }
243
245 virtual void SetPosition( const VECTOR2I& aPosition ) override
246 {
247 VECTOR2I difference = aPosition - GetPosition();
248
249 m_origin.SetPosition( m_origin.GetPosition() + difference );
250 m_end.SetPosition( m_end.GetPosition() + difference );
251 }
252
254 virtual void ApplyConstraint( const GRID_HELPER& aGrid ) override
255 {
256 if( m_constraint )
257 m_constraint->Apply( aGrid );
258
259 m_origin.ApplyConstraint( aGrid );
260 m_end.ApplyConstraint( aGrid );
261 }
262
269 {
270 m_constraint.reset( aConstraint );
271 }
272
278 {
279 return m_constraint.get();
280 }
281
285 bool IsConstrained() const override
286 {
287 return m_constraint != nullptr;
288 }
289
294 {
295 return m_origin;
296 }
297
298 const EDIT_POINT& GetOrigin() const
299 {
300 return m_origin;
301 }
302
307 {
308 return m_end;
309 }
310
311 const EDIT_POINT& GetEnd() const
312 {
313 return m_end;
314 }
315
319 bool HasCenterPoint() const { return m_hasCenterPoint; }
320
324 void SetHasCenterPoint( bool aHasCenterPoint ) { m_hasCenterPoint = aHasCenterPoint; }
325
329 bool DrawLine() const { return m_showLine; }
330
334 void SetDrawLine( bool aShowLine ) { m_showLine = aShowLine; }
335
336 bool operator==( const EDIT_POINT& aOther ) const
337 {
338 return GetPosition() == aOther.GetPosition();
339 }
340
341 bool operator==( const EDIT_LINE& aOther ) const
342 {
343 return m_origin == aOther.m_origin && m_end == aOther.m_end;
344 }
345
346private:
349
350 bool m_hasCenterPoint = true;
351 bool m_showLine = false;
352
354 std::shared_ptr<EDIT_CONSTRAINT<EDIT_LINE> > m_constraint;
355};
356
357
361class EDIT_POINTS : public EDA_ITEM
362{
363public:
367 EDIT_POINTS( EDA_ITEM* aParent );
368
374 EDIT_POINT* FindPoint( const VECTOR2I& aLocation, KIGFX::VIEW *aView );
375
380 {
381 return m_parent;
382 }
383
387 void Clear()
388 {
389 m_points.clear();
390 m_lines.clear();
391 m_contours.clear();
392 }
393
399 void AddPoint( const EDIT_POINT& aPoint )
400 {
401 m_points.push_back( aPoint );
402 }
403
409 void AddPoint( const VECTOR2I& aPoint, std::pair<EDA_ITEM*, int> aConnected = { nullptr, 0 } )
410 {
411 AddPoint( EDIT_POINT( aPoint, aConnected ) );
412 }
413
419 void AddLine( const EDIT_LINE& aLine )
420 {
421 m_lines.push_back( aLine );
422 }
423
430 void AddLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
431 {
432 m_lines.emplace_back( aOrigin, aEnd );
433 }
434
443 void AddIndicatorLine( EDIT_POINT& aOrigin, EDIT_POINT& aEnd )
444 {
445 EDIT_LINE& line = m_lines.emplace_back( aOrigin, aEnd );
446 line.SetHasCenterPoint( false );
447 line.SetDrawLine( true );
448 }
449
450
454 void AddBreak()
455 {
456 assert( m_points.size() > 0 );
457 m_contours.push_back( m_points.size() - 1 );
458 }
459
466 int GetContourStartIdx( int aPointIdx ) const;
467
474 int GetContourEndIdx( int aPointIdx ) const;
475
482 bool IsContourStart( int aPointIdx ) const;
483
490 bool IsContourEnd( int aPointIdx ) const;
491
502 EDIT_POINT* Previous( const EDIT_POINT& aPoint, bool aTraverseContours = true );
503
504 EDIT_LINE* Previous( const EDIT_LINE& aLine );
505
516 EDIT_POINT* Next( const EDIT_POINT& aPoint, bool aTraverseContours = true );
517
518 EDIT_LINE* Next( const EDIT_LINE& aLine );
519
520 EDIT_POINT& Point( unsigned int aIndex )
521 {
522 return m_points[aIndex];
523 }
524
525 const EDIT_POINT& Point( unsigned int aIndex ) const
526 {
527 return m_points[aIndex];
528 }
529
530 EDIT_LINE& Line( unsigned int aIndex )
531 {
532 return m_lines[aIndex];
533 }
534
535 const EDIT_LINE& Line( unsigned int aIndex ) const
536 {
537 return m_lines[aIndex];
538 }
539
543 unsigned int PointsSize() const
544 {
545 return m_points.size();
546 }
547
551 unsigned int LinesSize() const
552 {
553 return m_lines.size();
554 }
555
557 virtual const BOX2I ViewBBox() const override;
558
560 virtual void ViewDraw( int aLayer, KIGFX::VIEW* aView ) const override;
561
563 virtual std::vector<int> ViewGetLayers() const override
564 {
565 return { LAYER_GP_OVERLAY };
566 }
567
568#if defined(DEBUG)
569 void Show( int x, std::ostream& st ) const override
570 {
571 }
572#endif
573
579 virtual wxString GetClass() const override
580 {
581 return wxT( "EDIT_POINTS" );
582 }
583
584 bool SwapX() const { return m_swapX; }
585 void SetSwapX( bool aSwap ) { m_swapX = aSwap; }
586
587 bool SwapY() const { return m_swapY; }
588 void SetSwapY( bool aSwap ) { m_swapY = aSwap; }
589
590private:
592 bool m_swapX;
593 bool m_swapY;
594 std::deque<EDIT_POINT> m_points;
595 std::deque<EDIT_LINE> m_lines;
596 std::list<int> m_contours;
598};
599
600#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
Describe constraints between two edit handles.
Represent a line connecting two EDIT_POINTs.
virtual void SetPosition(const VECTOR2I &aPosition) override
Return coordinates of an EDIT_POINT.
EDIT_LINE(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
const EDIT_POINT & GetEnd() const
bool operator==(const EDIT_LINE &aOther) const
bool IsConstrained() const override
Check if line is constrained.
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.
void SetConstraint(EDIT_CONSTRAINT< EDIT_LINE > *aConstraint)
Set a constraint for and EDIT_POINT.
virtual VECTOR2I GetPosition() const override
Return coordinates of an EDIT_POINT.
void SetDrawLine(bool aShowLine)
Set if the line itself should be drawn.
EDIT_CONSTRAINT< EDIT_LINE > * GetConstraint() const
Return the constraint imposed on an EDIT_POINT.
const EDIT_POINT & GetOrigin() const
EDIT_POINT & m_origin
Origin point for a line.
std::shared_ptr< EDIT_CONSTRAINT< EDIT_LINE > > m_constraint
Constraint for the point, NULL if none.
bool m_hasCenterPoint
True if the line has a (useful) center point.
virtual void ApplyConstraint(const GRID_HELPER &aGrid) override
Correct coordinates of an EDIT_POINT by applying previously set constraint.
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
void ClearConstraint()
Remove previously set constraint.
bool IsActive() const
bool m_isHover
True if this point is being hovered over.
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.
virtual void ApplyConstraint(const GRID_HELPER &aGrid)
Correct coordinates of an EDIT_POINT by applying previously set constraint.
void SetHover(bool aHover=true)
bool m_drawCircle
True if the point is drawn circular.
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_constraint
Constraint for the point, NULL if none.
void SetConstraint(EDIT_CONSTRAINT< EDIT_POINT > *aConstraint)
Set a constraint for an EDIT_POINT.
EDIT_CONSTRAINT< EDIT_POINT > * GetConstraint() const
Return the constraint imposed on an EDIT_POINT.
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 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