KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_junction.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) 2009 Jean-Pierre Charras, jp.charras at wanadoo.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
25#include <sch_draw_panel.h>
26#include <trigo.h>
27#include <common.h>
28#include <plotters/plotter.h>
29#include <bitmaps.h>
30#include <core/mirror.h>
31#include <geometry/shape_rect.h>
32#include <sch_painter.h>
33#include <sch_junction.h>
34#include <sch_edit_frame.h>
35#include <sch_connection.h>
36#include <schematic.h>
38#include <connection_graph.h>
39#include <string_utils.h>
40
41
42SCH_JUNCTION::SCH_JUNCTION( const VECTOR2I& aPosition, int aDiameter, SCH_LAYER_ID aLayer ) :
43 SCH_ITEM( nullptr, SCH_JUNCTION_T )
44{
45 m_pos = aPosition;
46 m_color = COLOR4D::UNSPECIFIED;
47 m_diameter = aDiameter;
48 m_layer = aLayer;
49
51 m_lastResolvedColor = COLOR4D::UNSPECIFIED;
52}
53
54
56{
57 return new SCH_JUNCTION( *this );
58}
59
60
62{
63 SCH_ITEM::SwapFlags( aItem );
64
65 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
66 wxT( "Cannot swap junction data with invalid item." ) );
67
68 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
69 std::swap( m_pos, item->m_pos );
70 std::swap( m_diameter, item->m_diameter );
71 std::swap( m_color, item->m_color );
72}
73
74
75void SCH_JUNCTION::ViewGetLayers( int aLayers[], int& aCount ) const
76{
77 aCount = 2;
78 aLayers[0] = m_layer;
79 aLayers[1] = LAYER_SELECTION_SHADOWS;
80}
81
82
84{
85 if( m_diameter != 0 )
87 else if( Schematic() )
89 else
91
92 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
93 {
94 // If we know what we're connected to, then enforce a minimum size of 170% of the
95 // connected wire width:
96 if( !IsConnectivityDirty() )
97 {
99 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
100 }
101 }
102
103 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
104}
105
106
108{
109 BOX2I bbox( m_pos );
110 bbox.Inflate( getEffectiveShape().GetRadius() );
111
112 return bbox;
113}
114
115
116void SCH_JUNCTION::Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
117{
118 wxDC* DC = aSettings->GetPrintDC();
120
121 if( color == COLOR4D::UNSPECIFIED )
122 color = aSettings->GetLayerColor( GetLayer() );
123
125
126 GRFilledCircle( DC, circle.GetCenter() + aOffset, circle.GetRadius(), 0, color, color );
127}
128
129
131{
132 MIRROR( m_pos.y, aCenter );
133}
134
135
137{
138 MIRROR( m_pos.x, aCenter );
139}
140
141
142void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter )
143{
144 RotatePoint( m_pos, aCenter, ANGLE_90 );
145}
146
147
148void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
149{
150 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
151 aItemList.push_back( item );
152}
153
154
155std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
156{
157 return { m_pos };
158}
159
160
161#if defined(DEBUG)
162void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
163{
164 // XML output:
165 wxString s = GetClass();
166
167 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << wxS( ", " ) << m_diameter
168 << wxS( "/>\n" );
169}
170#endif
171
172
173void SCH_JUNCTION::SetDiameter( int aDiameter )
174{
175 m_diameter = aDiameter;
176 m_lastResolvedDiameter = aDiameter;
177}
178
179
181{
182 if( m_color != COLOR4D::UNSPECIFIED )
184 else if( !IsConnectivityDirty() )
185 m_lastResolvedColor = GetEffectiveNetClass()->GetSchematicColor();
186
187 return m_lastResolvedColor;
188}
189
190
191void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
192{
193 m_color = aColor;
194 m_lastResolvedColor = aColor;
195}
196
197
199{
200 return getEffectiveShape().GetRadius() * 2;
201}
202
203
204bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
205{
206 if( aAccuracy >= 0 )
207 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
208 else
209 return aPosition == m_pos;
210}
211
212
213bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
214{
216 return false;
217
218 if( aContained )
219 {
220 BOX2I selRect( aRect );
221
222 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
223 }
224 else
225 {
226 SHAPE_CIRCLE junction = getEffectiveShape();
227 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
228
229 return selRect.Collide( &junction, aAccuracy );
230 }
231}
232
233
234bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
235{
236 return m_pos == aPosition;
237}
238
239
240void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground ) const
241{
242 if( aBackground )
243 return;
244
245 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
247
248 if( color == COLOR4D::UNSPECIFIED )
249 color = settings->GetLayerColor( GetLayer() );
250
251 aPlotter->SetColor( color );
252
253 aPlotter->Circle( m_pos, GetEffectiveDiameter(), FILL_T::FILLED_SHAPE );
254}
255
256
258{
259 return BITMAPS::add_junction;
260}
261
262
263bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
264{
265 if( Type() != aItem.Type() )
266 return Type() < aItem.Type();
267
268 if( GetLayer() != aItem.GetLayer() )
269 return GetLayer() < aItem.GetLayer();
270
271 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
272
273 if( GetPosition().x != junction->GetPosition().x )
274 return GetPosition().x < junction->GetPosition().x;
275
276 if( GetPosition().y != junction->GetPosition().y )
277 return GetPosition().y < junction->GetPosition().y;
278
279 if( GetDiameter() != junction->GetDiameter() )
280 return GetDiameter() < junction->GetDiameter();
281
282 return GetColor() < junction->GetColor();
283}
284
285
286void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
287{
288 aList.emplace_back( _( "Junction" ), wxEmptyString );
289
290 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
291
292 SCH_CONNECTION* conn = nullptr;
293
294 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
295 conn = Connection();
296
297 if( conn )
298 {
299 conn->AppendInfoToMsgPanel( aList );
300
301 if( !conn->IsBus() )
302 {
303 aList.emplace_back( _( "Resolved Netclass" ),
304 UnescapeString( GetEffectiveNetClass()->GetName() ) );
305 }
306 }
307}
308
309
310static struct SCH_JUNCTION_DESC
311{
313 {
317
318 propMgr.AddProperty( new PROPERTY<SCH_JUNCTION, int>( _HKI( "Diameter" ),
320 PROPERTY_DISPLAY::PT_SIZE ) );
321 }
int color
Definition: DXF_plotter.cpp:58
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:111
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
const Vec & GetPosition() const
Definition: box2.h:185
coord_type GetHeight() const
Definition: box2.h:189
coord_type GetWidth() const
Definition: box2.h:188
bool Contains(const Vec &aPoint) const
Definition: box2.h:142
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:507
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition: sch_item.h:85
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
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:487
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.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxDC * GetPrintDC() const
Base plotter engine class.
Definition: plotter.h:104
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:135
virtual void SetColor(const COLOR4D &color)=0
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:74
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:76
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:209
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
bool IsBus() const
void AppendInfoToMsgPanel(std::vector< MSG_PANEL_ITEM > &aList) const
Adds information about the connection object to aList.
Schematic editor (Eeschema) main window.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:150
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:113
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition: sch_item.cpp:176
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:257
bool IsConnectivityDirty() const
Definition: sch_item.h:426
void SwapFlags(SCH_ITEM *aItem)
Swap the non-temp and non-edit flags.
Definition: sch_item.cpp:267
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition: sch_item.cpp:147
SCH_LAYER_ID m_layer
Definition: sch_item.h:510
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
VECTOR2I m_pos
Definition: sch_junction.h:142
virtual bool operator<(const SCH_ITEM &aItem) const override
int GetEffectiveDiameter() const
void Rotate(const VECTOR2I &aCenter) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
Print a schematic item.
SHAPE_CIRCLE getEffectiveShape() const
SCH_JUNCTION(const VECTOR2I &aPosition=VECTOR2I(0, 0), int aDiameter=0, SCH_LAYER_ID aLayer=LAYER_JUNCTION)
void Plot(PLOTTER *aPlotter, bool aBackground) const override
Plot the schematic item to aPlotter.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
COLOR4D m_lastResolvedColor
Definition: sch_junction.h:150
int m_diameter
Zero is user default.
Definition: sch_junction.h:143
void SetDiameter(int aDiameter)
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
COLOR4D m_color
#COLOR4D::UNSPECIFIED is user default.
Definition: sch_junction.h:144
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
COLOR4D GetColor() const
Definition: sch_junction.h:118
int GetDiameter() const
Definition: sch_junction.h:113
COLOR4D GetJunctionColor() const
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.
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
VECTOR2I GetPosition() const override
Definition: sch_junction.h:106
void SetColor(const COLOR4D &aColor)
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the layers the item is drawn on (which may be more than its "home" layer)
int m_lastResolvedDiameter
Definition: sch_junction.h:149
wxString GetClass() const override
Return the class name.
Definition: sch_junction.h:50
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: seg.h:42
bool Collide(const SEG &aSeg, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the segment aSeg than aClearance,...
Definition: shape_circle.h:77
int GetRadius() const
Definition: shape_circle.h:108
const VECTOR2I GetCenter() const
Definition: shape_circle.h:113
bool Collide(const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
Definition: shape_rect.h:109
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A lower-precision version of StringFromValue().
The common library.
#define DEFAULT_JUNCTION_DIAM
The default bus and wire entry size in mils.
#define DEFAULT_WIRE_WIDTH_MILS
The default bus width in mils. (can be changed in preference menu)
#define _HKI(x)
#define _(s)
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:439
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
void GRFilledCircle(wxDC *aDC, const VECTOR2I &aPos, int aRadius, int aWidth, const COLOR4D &aStrokeColor, const COLOR4D &aFillColor)
Draw a circle onto the drawing context aDC centered at the user coordinates (x,y).
Definition: gr_basic.cpp:369
SCH_LAYER_ID
Eeschema drawing layers.
Definition: layer_ids.h:346
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:387
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:40
#define TYPE_HASH(x)
Definition: property.h:64
#define REGISTER_TYPE(x)
Definition: property_mgr.h:356
@ JUNCTION_END
Definition: sch_item.h:70
static struct SCH_JUNCTION_DESC _SCH_JUNCTION_DESC
wxString UnescapeString(const wxString &aSource)
constexpr int MilsToIU(int mils) const
Definition: base_units.h:94
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
@ SCH_JUNCTION_T
Definition: typeinfo.h:141
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:85