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-2019 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 <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 <macros.h>
38 #include <trigo.h>
39 
40 
41 SCH_NO_CONNECT::SCH_NO_CONNECT( const wxPoint& pos ) :
43 {
44  m_pos = pos;
45  m_size = Mils2iu( DEFAULT_NOCONNECT_SIZE );
46 
48 }
49 
50 
52 {
53  return new SCH_NO_CONNECT( *this );
54 }
55 
56 
58 {
59  wxCHECK_RET( (aItem != NULL) && (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  EDA_RECT box;
72 
73  box.SetOrigin( m_pos );
74  box.Inflate( delta );
75 
76  return box;
77 }
78 
79 
80 void SCH_NO_CONNECT::ViewGetLayers( int aLayers[], int& aCount ) const
81 {
82  aCount = 2;
83  aLayers[0] = LAYER_NOCONNECT;
84  aLayers[1] = LAYER_SELECTION_SHADOWS;
85 }
86 
87 
88 void SCH_NO_CONNECT::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
89 {
90  DANGLING_END_ITEM item( NO_CONNECT_END, this, m_pos );
91  aItemList.push_back( item );
92 }
93 
94 
96 {
97  if( !Schematic() )
98  return 1;
99 
100  return std::max( Schematic()->Settings().m_DefaultLineWidth, 1 );
101 }
102 
103 
104 void SCH_NO_CONNECT::Print( RENDER_SETTINGS* aSettings, const wxPoint& aOffset )
105 {
106  wxDC* DC = aSettings->GetPrintDC();
107  int half = GetSize() / 2;
108  int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
109  int pX = m_pos.x + aOffset.x;
110  int pY = m_pos.y + aOffset.y;
111  COLOR4D color = aSettings->GetLayerColor( LAYER_NOCONNECT );
112 
113  GRLine( nullptr, DC, pX - half, pY - half, pX + half, pY + half, penWidth, color );
114  GRLine( nullptr, DC, pX + half, pY - half, pX - half, pY + half, penWidth, color );
115 }
116 
117 
118 void SCH_NO_CONNECT::MirrorX( int aXaxis_position )
119 {
120  MIRROR( m_pos.y, aXaxis_position );
121 }
122 
123 
124 void SCH_NO_CONNECT::MirrorY( int aYaxis_position )
125 {
126  MIRROR( m_pos.x, aYaxis_position );
127 }
128 
129 
130 void SCH_NO_CONNECT::Rotate( wxPoint aPosition )
131 {
132  RotatePoint( &m_pos, aPosition, 900 );
133 }
134 
135 
136 std::vector<wxPoint> SCH_NO_CONNECT::GetConnectionPoints() const
137 {
138  return { m_pos };
139 }
140 
141 
142 bool SCH_NO_CONNECT::doIsConnected( const wxPoint& aPosition ) const
143 {
144  return m_pos == aPosition;
145 }
146 
147 bool SCH_NO_CONNECT::HitTest( const wxPoint& aPosition, int aAccuracy ) const
148 {
149  int delta = ( GetPenWidth() + GetSize() ) / 2 + aAccuracy;
150 
151  wxPoint 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 
160 bool SCH_NO_CONNECT::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) const
161 {
162  EDA_RECT 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 
173 void SCH_NO_CONNECT::Plot( PLOTTER* aPlotter )
174 {
175  int delta = GetSize() / 2;
176  int pX = m_pos.x;
177  int pY = m_pos.y;
178  int penWidth = std::max( GetPenWidth(), aPlotter->RenderSettings()->GetMinPenWidth() );
179 
180  aPlotter->SetCurrentLineWidth( penWidth );
181  aPlotter->SetColor( aPlotter->RenderSettings()->GetLayerColor( LAYER_NOCONNECT ) );
182  aPlotter->MoveTo( wxPoint( pX - delta, pY - delta ) );
183  aPlotter->FinishTo( wxPoint( pX + delta, pY + delta ) );
184  aPlotter->MoveTo( wxPoint( pX + delta, pY - delta ) );
185  aPlotter->FinishTo( wxPoint( pX - delta, pY + delta ) );
186 }
187 
188 
190 {
191  return noconn_xpm;
192 }
void FinishTo(const wxPoint &pos)
Definition: plotter.h:283
std::vector< wxPoint > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
Plot settings, and plotting engines (PostScript, Gerber, HPGL and DXF)
void MirrorY(int aYaxis_position) override
Mirror item relative to the Y axis about aYaxis_position.
int GetPenWidth() const override
PNG memory record (file in memory).
Definition: bitmap_def.h:29
BITMAP_DEF GetMenuImage() const override
Function GetMenuImage returns a pointer to an image to be used in menus.
RENDER_SETTINGS Contains all the knowledge about how graphical objects are drawn on any output surfac...
virtual void SetColor(COLOR4D color)=0
wxPoint m_pos
Position of the no connect object.
int color
Definition: DXF_plotter.cpp:60
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:113
void MirrorX(int aXaxis_position) override
Mirror item relative to the X axis about aXaxis_position.
const COLOR4D & GetLayerColor(int aLayer) const
Function GetLayerColor Returns the color used to draw a layer.
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:131
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
SCH_NO_CONNECT(const wxPoint &pos=wxPoint(0, 0))
bool Contains(const wxPoint &aPoint) const
Function Contains.
Definition: eda_rect.cpp:57
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void Print(RENDER_SETTINGS *aSettings, const wxPoint &aOffset) override
Print a schematic item.
This file contains miscellaneous commonly used macros and functions.
void MIRROR(T &aPoint, const T &aMirrorRef)
Definition: macros.h:136
bool HitTest(const wxPoint &aPosition, int aAccuracy=0) const override
Function HitTest tests if aPosition is contained within or on the bounding box of an item.
#define NULL
const BITMAP_OPAQUE noconn_xpm[1]
Definition: noconn.cpp:26
void SetLayer(SCH_LAYER_ID aLayer)
Set the layer this item is on.
Definition: sch_item.h:286
int GetSize() const
#define DEFAULT_NOCONNECT_SIZE
The default junction diameter in mils. (can be changed in preference menu)
void GRLine(EDA_RECT *ClipBox, wxDC *DC, int x1, int y1, int x2, int y2, int width, COLOR4D Color, wxPenStyle aStyle)
Definition: gr_basic.cpp:228
void Plot(PLOTTER *aPlotter) override
Plot the schematic item to aPlotter.
const EDA_RECT GetBoundingBox() const override
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes.
void MoveTo(const wxPoint &pos)
Definition: plotter.h:273
Base plotter engine class.
Definition: plotter.h:131
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:165
EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boards.
Definition: eda_item.h:148
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the layers the item is drawn on (which may be more than its "home" layer)
bool Intersects(const EDA_RECT &aRect) const
Function Intersects tests for a common area between rectangles.
Definition: eda_rect.cpp:150
void Rotate(wxPoint aPosition) override
Rotate the item around aPosition 90 degrees in the clockwise direction.
int GetDefaultPenWidth() const
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition: sch_item.h:85
EDA_ITEM * Clone() const override
Function Clone creates a duplicate of this item with linked list members set to NULL.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:194
bool doIsConnected(const wxPoint &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:363
int m_size
Size of the no connect object.
KICAD_T Type() const
Function Type()
Definition: eda_item.h:182
virtual void SetCurrentLineWidth(int width, void *aData=NULL)=0
Set the line width for the next drawing.
COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:100