KiCad PCB EDA Suite
sch_no_connect.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 (C) 2015 Jean-Pierre Charras, jp.charras at wanoadoo.fr
5 * Copyright (C) 1992-2022 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
30#include <sch_draw_panel.h>
31#include <plotters/plotter.h>
32#include <bitmaps.h>
33#include <schematic.h>
34#include <sch_no_connect.h>
36#include <default_values.h> // For some default values
37#include <core/mirror.h>
38#include <trigo.h>
39
40
42 SCH_ITEM( nullptr, SCH_NO_CONNECT_T )
43{
44 m_pos = pos;
46
48}
49
50
52{
53 return new SCH_NO_CONNECT( *this );
54}
55
56
58{
59 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_NO_CONNECT_T ),
60 wxT( "Cannot swap no connect data with invalid item." ) );
61
62 SCH_NO_CONNECT* item = (SCH_NO_CONNECT*)aItem;
63 std::swap( m_pos, item->m_pos );
64 std::swap( m_size, item->m_size );
65}
66
67
69{
70 int delta = ( GetPenWidth() + GetSize() ) / 2;
71 BOX2I bbox( m_pos );
72
73 bbox.Inflate( delta );
74
75 return bbox;
76}
77
78
79void SCH_NO_CONNECT::ViewGetLayers( int aLayers[], int& aCount ) const
80{
81 aCount = 2;
82 aLayers[0] = LAYER_NOCONNECT;
83 aLayers[1] = LAYER_SELECTION_SHADOWS;
84}
85
86
87void SCH_NO_CONNECT::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
88{
90 aItemList.push_back( item );
91}
92
93
95{
96 if( !Schematic() )
97 return 1;
98
99 return std::max( Schematic()->Settings().m_DefaultLineWidth, 1 );
100}
101
102
103void SCH_NO_CONNECT::Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
104{
105 wxDC* DC = aSettings->GetPrintDC();
106 int half = GetSize() / 2;
107 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
108 int pX = m_pos.x + aOffset.x;
109 int pY = m_pos.y + aOffset.y;
111
112 GRLine( DC, pX - half, pY - half, pX + half, pY + half, penWidth, color );
113 GRLine( DC, pX + half, pY - half, pX - half, pY + half, penWidth, color );
114}
115
116
118{
119 MIRROR( m_pos.y, aCenter );
120}
121
122
124{
125 MIRROR( m_pos.x, aCenter );
126}
127
128
129void SCH_NO_CONNECT::Rotate( const VECTOR2I& aCenter )
130{
131 RotatePoint( m_pos, aCenter, ANGLE_90 );
132}
133
134
135std::vector<VECTOR2I> SCH_NO_CONNECT::GetConnectionPoints() const
136{
137 return { m_pos };
138}
139
140
141bool SCH_NO_CONNECT::doIsConnected( const VECTOR2I& aPosition ) const
142{
143 return m_pos == aPosition;
144}
145
146
147bool SCH_NO_CONNECT::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
148{
149 int delta = ( GetPenWidth() + GetSize() ) / 2 + aAccuracy;
150
151 VECTOR2I dist = aPosition - m_pos;
152
153 if( ( std::abs( dist.x ) <= delta ) && ( std::abs( dist.y ) <= delta ) )
154 return true;
155
156 return false;
157}
158
159
160bool SCH_NO_CONNECT::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
161{
162 BOX2I rect = aRect;
163
164 rect.Inflate( aAccuracy );
165
166 if( aContained )
167 return rect.Contains( GetBoundingBox() );
168
169 return rect.Intersects( GetBoundingBox() );
170}
171
172
173void SCH_NO_CONNECT::Plot( PLOTTER* aPlotter, bool aBackground ) const
174{
175 if( aBackground )
176 return;
177
178 int delta = GetSize() / 2;
179 int pX = m_pos.x;
180 int pY = m_pos.y;
181 int penWidth = std::max( GetPenWidth(), aPlotter->RenderSettings()->GetDefaultPenWidth() );
182
183 aPlotter->SetCurrentLineWidth( penWidth );
184 aPlotter->SetColor( aPlotter->RenderSettings()->GetLayerColor( LAYER_NOCONNECT ) );
185 aPlotter->MoveTo( VECTOR2I( pX - delta, pY - delta ) );
186 aPlotter->FinishTo( VECTOR2I( pX + delta, pY + delta ) );
187 aPlotter->MoveTo( VECTOR2I( pX + delta, pY - delta ) );
188 aPlotter->FinishTo( VECTOR2I( pX - delta, pY + delta ) );
189}
190
191
193{
194 return BITMAPS::noconn;
195}
int color
Definition: DXF_plotter.cpp:57
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:111
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:269
bool Contains(const Vec &aPoint) const
Definition: box2.h:141
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:506
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition: sch_item.h:82
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.
int GetDefaultPenWidth() const
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxDC * GetPrintDC() const
Base plotter engine class.
Definition: plotter.h:110
void MoveTo(const VECTOR2I &pos)
Definition: plotter.h:247
void FinishTo(const VECTOR2I &pos)
Definition: plotter.h:257
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:141
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
virtual void SetColor(const COLOR4D &color)=0
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:112
void SetLayer(SCH_LAYER_ID aLayer)
Set the layer this item is on.
Definition: sch_item.h:253
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
SCH_NO_CONNECT(const VECTOR2I &pos=VECTOR2I(0, 0))
int m_size
Size of the no connect object.
int GetSize() const
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
VECTOR2I m_pos
Position of the no connect object.
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
void Rotate(const VECTOR2I &aCenter) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the layers the item is drawn on (which may be more than its "home" layer)
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
int GetPenWidth() const override
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
Print a schematic item.
void Plot(PLOTTER *aPlotter, bool aBackground) const override
Plot the schematic item to aPlotter.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
#define DEFAULT_NOCONNECT_SIZE
The default junction diameter in mils. (can be changed in preference menu)
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:414
void GRLine(wxDC *DC, int x1, int y1, int x2, int y2, int width, const COLOR4D &Color, wxPenStyle aStyle)
Definition: gr_basic.cpp:162
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:381
@ LAYER_NOCONNECT
Definition: layer_ids.h:367
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:40
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:401
Plot settings, and plotting engines (PostScript, Gerber, HPGL and DXF)
@ NO_CONNECT_END
Definition: sch_item.h:73
constexpr int MilsToIU(int mils) const
Definition: base_units.h:94
constexpr int delta
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
@ SCH_NO_CONNECT_T
Definition: typeinfo.h:143
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618