KiCad PCB EDA Suite
sch_line.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) 2009 Jean-Pierre Charras, [email protected]
5 * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef _SCH_LINE_H_
26#define _SCH_LINE_H_
27
28#include <sch_item.h>
29#include <wx/pen.h> // for wxPenStyle
30#include <list> // for std::list
31
32class NETLIST_OBJECT_LIST;
33
34
39class SCH_LINE : public SCH_ITEM
40{
41public:
42 static const enum wxPenStyle PenStyle[];
43
44 SCH_LINE( const VECTOR2I& pos = VECTOR2I( 0, 0 ), int layer = LAYER_NOTES );
45
46 SCH_LINE( const VECTOR2D& pos, int layer = LAYER_NOTES ) :
47 SCH_LINE( VECTOR2I( pos.x, pos.y ), layer )
48 {}
49
50 SCH_LINE( const SCH_LINE& aLine );
51
53
54 static inline bool ClassOf( const EDA_ITEM* aItem )
55 {
56 return aItem && SCH_LINE_T == aItem->Type();
57 }
58
59 wxString GetClass() const override
60 {
61 return wxT( "SCH_LINE" );
62 }
63
70 wxString GetNetname(const SCH_SHEET_PATH &aSheet);
71
72 bool IsType( const std::vector<KICAD_T>& aScanTypes ) const override
73 {
74 if( SCH_ITEM::IsType( aScanTypes ) )
75 return true;
76
77 for( KICAD_T scanType : aScanTypes )
78 {
79 if( scanType == SCH_ITEM_LOCATE_WIRE_T && m_layer == LAYER_WIRE )
80 return true;
81
82 if ( scanType == SCH_ITEM_LOCATE_BUS_T && m_layer == LAYER_BUS )
83 return true;
84
86 return true;
87 }
88
89 return false;
90 }
91
92 bool IsEndPoint( const VECTOR2I& aPoint ) const
93 {
94 return aPoint == m_start || aPoint == m_end;
95 }
96
97 int GetAngleFrom( const VECTOR2I& aPoint ) const;
98 int GetReverseAngleFrom( const VECTOR2I& aPoint ) const;
99
105 inline EDA_ANGLE Angle() const
106 {
107 return ( EDA_ANGLE( (VECTOR2I) m_end - (VECTOR2I) m_start ) );
108 }
109
114 inline void StoreAngle() { m_storedAngle = Angle(); }
115
121 inline EDA_ANGLE GetStoredAngle() const { return m_storedAngle; }
122
128 inline bool IsOrthogonal() const { return Angle().IsCardinal(); }
129
130 bool IsNull() const { return m_start == m_end; }
131
132 VECTOR2I GetStartPoint() const { return m_start; }
133 void SetStartPoint( const VECTOR2I& aPosition ) { m_start = aPosition; }
134
135 VECTOR2I GetMidPoint() const { return ( m_start + m_end ) / 2; }
136
137 VECTOR2I GetEndPoint() const { return m_end; }
138 void SetEndPoint( const VECTOR2I& aPosition ) { m_end = aPosition; }
139
140 void SetLastResolvedState( const SCH_ITEM* aItem ) override
141 {
142 const SCH_LINE* aLine = dynamic_cast<const SCH_LINE*>( aItem );
143
144 if( aLine )
145 {
149 }
150 }
151
152 void SetLineStyle( const PLOT_DASH_TYPE aStyle );
153 void SetLineStyle( const int aStyleId );
155
159
160 void SetLineColor( const COLOR4D& aColor );
161
162 void SetLineColor( const double r, const double g, const double b, const double a );
163
165 COLOR4D GetLineColor() const;
166
167 void SetLineWidth( const int aSize );
168
169 virtual bool HasLineStroke() const override { return true; }
170 virtual STROKE_PARAMS GetStroke() const override { return m_stroke; }
171 virtual void SetStroke( const STROKE_PARAMS& aStroke ) override { m_stroke = aStroke; }
172
173 bool IsStrokeEquivalent( const SCH_LINE* aLine )
174 {
175 if( m_stroke.GetWidth() != aLine->GetStroke().GetWidth() )
176 return false;
177
178 if( m_stroke.GetColor() != aLine->GetStroke().GetColor() )
179 return false;
180
182 PLOT_DASH_TYPE style_b = aLine->GetStroke().GetPlotStyle();
183
184 return style_a == style_b
185 || ( style_a == PLOT_DASH_TYPE::DEFAULT && style_b == PLOT_DASH_TYPE::SOLID )
186 || ( style_a == PLOT_DASH_TYPE::SOLID && style_b == PLOT_DASH_TYPE::DEFAULT );
187 }
188
189 int GetLineSize() const { return m_stroke.GetWidth(); }
190
191 void ViewGetLayers( int aLayers[], int& aCount ) const override;
192
193 const BOX2I GetBoundingBox() const override;
194
198 double GetLength() const;
199
200 void Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset ) override;
201
202 int GetPenWidth() const override;
203
204 void Move( const VECTOR2I& aMoveVector ) override;
205 void MoveStart( const VECTOR2I& aMoveVector );
206 void MoveEnd( const VECTOR2I& aMoveVector );
207
208 void MirrorVertically( int aCenter ) override;
209 void MirrorHorizontally( int aCenter ) override;
210 void Rotate( const VECTOR2I& aCenter ) override;
211 void RotateStart( const VECTOR2I& aCenter );
212 void RotateEnd( const VECTOR2I& aCenter );
213
227 SCH_LINE* MergeOverlap( SCH_SCREEN* aScreen, SCH_LINE* aLine, bool aCheckJunctions );
228
229 bool IsParallel( const SCH_LINE* aLine ) const;
230
231 void GetEndPoints( std::vector<DANGLING_END_ITEM>& aItemList ) override;
232
233 bool UpdateDanglingState( std::vector<DANGLING_END_ITEM>& aItemList,
234 const SCH_SHEET_PATH* aPath = nullptr ) override;
235
236 bool IsStartDangling() const { return m_startIsDangling; }
237 bool IsEndDangling() const { return m_endIsDangling; }
238 bool IsDangling() const override { return m_startIsDangling || m_endIsDangling; }
239
240 bool IsConnectable() const override;
241
242 std::vector<VECTOR2I> GetConnectionPoints() const override;
243
244 bool ConnectionPropagatesTo( const EDA_ITEM* aItem ) const override;
245
246 void GetSelectedPoints( std::vector<VECTOR2I>& aPoints ) const;
247
248 bool CanConnect( const SCH_ITEM* aItem ) const override;
249
250 wxString GetSelectMenuText( UNITS_PROVIDER* aUnitsProvider ) const override;
251
252 BITMAPS GetMenuImage() const override;
253
254 bool operator <( const SCH_ITEM& aItem ) const override;
255
256 VECTOR2I GetPosition() const override { return m_start; }
257 void SetPosition( const VECTOR2I& aPosition ) override;
258 VECTOR2I GetSortPosition() const override { return GetMidPoint(); }
259
260 bool IsPointClickableAnchor( const VECTOR2I& aPos ) const override
261 {
262 return ( GetStartPoint() == aPos && IsStartDangling() )
263 || ( GetEndPoint() == aPos && IsEndDangling() );
264 }
265
266 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
267 bool HitTest( const BOX2I& aRect, bool aContained, int aAccuracy = 0 ) const override;
268
269 void Plot( PLOTTER* aPlotter, bool aBackground ) const override;
270
271 EDA_ITEM* Clone() const override;
272
273 void SwapData( SCH_ITEM* aItem ) override;
274
275 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
276
277#if defined(DEBUG)
278 void Show( int nestLevel, std::ostream& os ) const override;
279#endif
280
286 bool IsGraphicLine() const;
287
293 bool IsWire() const;
294
300 bool IsBus() const;
301
302private:
312 wxString FindWireSegmentNetNameRecursive( SCH_LINE *line, std::list<const SCH_LINE*>& checkedLines,
313 const SCH_SHEET_PATH &aSheet ) const;
314 bool doIsConnected( const VECTOR2I& aPosition ) const override;
315
322
323 // If real-time connectivity gets disabled (due to being too slow on a particular
324 // design), we can no longer rely on getting the NetClass to find netclass-specific
325 // linestyles, linewidths and colors.
329};
330
331
332#endif // _SCH_LINE_H_
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
bool IsCardinal() const
Definition: eda_angle.cpp:49
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
Base plotter engine class.
Definition: plotter.h:110
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
SCH_LAYER_ID m_layer
Definition: sch_item.h:482
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
Definition: sch_item.h:162
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:40
int GetPenWidth() const override
Definition: sch_line.cpp:293
void Rotate(const VECTOR2I &aCenter) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
Definition: sch_line.cpp:377
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
Definition: sch_line.cpp:811
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
Definition: sch_line.cpp:562
void SetStartPoint(const VECTOR2I &aPosition)
Definition: sch_line.h:133
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: sch_line.cpp:128
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: sch_line.cpp:731
bool m_startIsDangling
True if start point is not connected.
Definition: sch_line.h:316
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: sch_line.cpp:765
bool IsPointClickableAnchor(const VECTOR2I &aPos) const override
Definition: sch_line.h:260
void SetPosition(const VECTOR2I &aPosition) override
Definition: sch_line.cpp:875
void StoreAngle()
Saves the current line angle.
Definition: sch_line.h:114
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
Definition: sch_line.cpp:665
int GetReverseAngleFrom(const VECTOR2I &aPoint) const
Definition: sch_line.cpp:415
SCH_LINE(const VECTOR2I &pos=VECTOR2I(0, 0), int layer=LAYER_NOTES)
Definition: sch_line.cpp:43
virtual bool HasLineStroke() const override
Check if this schematic item has line stoke properties.
Definition: sch_line.h:169
bool IsWire() const
Return true if the line is a wire.
Definition: sch_line.cpp:926
bool IsStartDangling() const
Definition: sch_line.h:236
SCH_LINE(const VECTOR2D &pos, int layer=LAYER_NOTES)
Definition: sch_line.h:46
void RotateEnd(const VECTOR2I &aCenter)
Definition: sch_line.cpp:396
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: sch_line.cpp:191
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the layers the item is drawn on (which may be more than its "home" layer)
Definition: sch_line.cpp:182
void SetLineColor(const COLOR4D &aColor)
Definition: sch_line.cpp:214
bool CanConnect(const SCH_ITEM *aItem) const override
Definition: sch_line.cpp:622
EDA_ANGLE GetStoredAngle() const
Returns the angle stored by StoreAngle()
Definition: sch_line.h:121
bool IsParallel(const SCH_LINE *aLine) const
Definition: sch_line.cpp:428
void SetLineWidth(const int aSize)
Definition: sch_line.cpp:286
void RotateStart(const VECTOR2I &aCenter)
Definition: sch_line.cpp:390
int GetLineSize() const
Definition: sch_line.h:189
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
Definition: sch_line.cpp:367
virtual STROKE_PARAMS GetStroke() const override
Definition: sch_line.h:170
int GetAngleFrom(const VECTOR2I &aPoint) const
Definition: sch_line.cpp:402
void GetSelectedPoints(std::vector< VECTOR2I > &aPoints) const
Definition: sch_line.cpp:684
COLOR4D m_lastResolvedColor
Definition: sch_line.h:328
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: sch_line.cpp:882
EDA_ANGLE Angle() const
Gets the angle between the start and end lines.
Definition: sch_line.h:105
wxString GetSelectMenuText(UNITS_PROVIDER *aUnitsProvider) const override
Return the text to display to be used in the selection clarification context menu when multiple items...
Definition: sch_line.cpp:694
wxString GetClass() const override
Return the class name.
Definition: sch_line.h:59
static bool ClassOf(const EDA_ITEM *aItem)
Definition: sch_line.h:54
VECTOR2I GetMidPoint() const
Definition: sch_line.h:135
VECTOR2I GetEndPoint() const
Definition: sch_line.h:137
VECTOR2I GetStartPoint() const
Definition: sch_line.h:132
bool ConnectionPropagatesTo(const EDA_ITEM *aItem) const override
Return true if this item should propagate connection info to aItem.
Definition: sch_line.cpp:671
VECTOR2I GetPosition() const override
Definition: sch_line.h:256
bool IsEndDangling() const
Definition: sch_line.h:237
SCH_LINE * MergeOverlap(SCH_SCREEN *aScreen, SCH_LINE *aLine, bool aCheckJunctions)
Check line against aLine to see if it overlaps and merge if it does.
Definition: sch_line.cpp:441
VECTOR2I m_start
Line start point.
Definition: sch_line.h:318
bool IsBus() const
Return true if the line is a bus.
Definition: sch_line.cpp:932
int m_lastResolvedWidth
Definition: sch_line.h:327
VECTOR2I m_end
Line end point.
Definition: sch_line.h:319
PLOT_DASH_TYPE m_lastResolvedLineStyle
Definition: sch_line.h:326
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
Definition: sch_line.cpp:134
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemList, const SCH_SHEET_PATH *aPath=nullptr) override
Test the schematic item to aItemList to check if it's dangling state has changed.
Definition: sch_line.cpp:572
void SetLineStyle(const PLOT_DASH_TYPE aStyle)
Definition: sch_line.cpp:257
bool IsNull() const
Definition: sch_line.h:130
PLOT_DASH_TYPE GetLineStyle() const
Definition: sch_line.cpp:264
void MoveEnd(const VECTOR2I &aMoveVector)
Definition: sch_line.cpp:155
VECTOR2I GetSortPosition() const override
Return the coordinates that should be used for sorting this element visually compared to other elemen...
Definition: sch_line.h:258
STROKE_PARAMS m_stroke
Line stroke properties.
Definition: sch_line.h:321
EDA_ANGLE m_storedAngle
Stored angle.
Definition: sch_line.h:320
bool m_endIsDangling
True if end point is not connected.
Definition: sch_line.h:317
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition: sch_line.cpp:797
bool IsConnectable() const override
Definition: sch_line.cpp:613
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
Definition: sch_line.cpp:357
bool operator<(const SCH_ITEM &aItem) const override
Definition: sch_line.cpp:742
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
Definition: sch_line.h:171
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
Print a schematic item.
Definition: sch_line.cpp:327
wxString GetNetname(const SCH_SHEET_PATH &aSheet)
This function travel though all the connected wire segments to look for connected labels.
Definition: sch_line.cpp:90
bool IsEndPoint(const VECTOR2I &aPoint) const
Definition: sch_line.h:92
void Plot(PLOTTER *aPlotter, bool aBackground) const override
Plot the schematic item to aPlotter.
Definition: sch_line.cpp:820
bool IsStrokeEquivalent(const SCH_LINE *aLine)
Definition: sch_line.h:173
void SetLastResolvedState(const SCH_ITEM *aItem) override
Definition: sch_line.h:140
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
Definition: sch_line.cpp:920
static enum wxPenStyle PenStyle[]
Definition: sch_line.h:42
COLOR4D GetLineColor() const
Returns COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
Definition: sch_line.cpp:238
void MoveStart(const VECTOR2I &aMoveVector)
Definition: sch_line.cpp:145
double GetLength() const
Definition: sch_line.cpp:208
PLOT_DASH_TYPE GetEffectiveLineStyle() const
Definition: sch_line.cpp:273
~SCH_LINE()
Definition: sch_line.h:52
bool IsOrthogonal() const
Checks if line is orthogonal (to the grid).
Definition: sch_line.h:128
wxString FindWireSegmentNetNameRecursive(SCH_LINE *line, std::list< const SCH_LINE * > &checkedLines, const SCH_SHEET_PATH &aSheet) const
Recursively called function to travel through the connected wires and find a connected net name label...
Definition: sch_line.cpp:97
void SetEndPoint(const VECTOR2I &aPosition)
Definition: sch_line.h:138
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
Definition: sch_line.h:72
bool IsDangling() const override
Definition: sch_line.h:238
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Simple container to manage line stroke parameters.
Definition: stroke_params.h:88
int GetWidth() const
Definition: stroke_params.h:98
KIGFX::COLOR4D GetColor() const
PLOT_DASH_TYPE GetPlotStyle() const
E_SERIE r
Definition: eserie.cpp:41
@ LAYER_WIRE
Definition: layer_ids.h:344
@ LAYER_NOTES
Definition: layer_ids.h:358
@ LAYER_BUS
Definition: layer_ids.h:345
PLOT_DASH_TYPE
Dashed line types.
Definition: stroke_params.h:48
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ SCH_LINE_T
Definition: typeinfo.h:145
@ SCH_ITEM_LOCATE_WIRE_T
Definition: typeinfo.h:169
@ SCH_ITEM_LOCATE_BUS_T
Definition: typeinfo.h:170
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
Definition: typeinfo.h:171
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618