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 The 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>
33#include <sch_painter.h>
34#include <sch_junction.h>
35#include <sch_edit_frame.h>
36#include <sch_connection.h>
37#include <schematic.h>
39#include <connection_graph.h>
40#include <string_utils.h>
41
42
43SCH_JUNCTION::SCH_JUNCTION( const VECTOR2I& aPosition, int aDiameter, SCH_LAYER_ID aLayer ) :
44 SCH_ITEM( nullptr, SCH_JUNCTION_T )
45{
46 m_pos = aPosition;
48 m_diameter = aDiameter;
49 m_layer = aLayer;
50
53}
54
55
57{
58 return new SCH_JUNCTION( *this );
59}
60
61
63{
64 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
65 wxT( "Cannot swap junction data with invalid item." ) );
66
67 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
68 std::swap( m_pos, item->m_pos );
69 std::swap( m_diameter, item->m_diameter );
70 std::swap( m_color, item->m_color );
71}
72
73
74std::vector<int> SCH_JUNCTION::ViewGetLayers() const
75{
77}
78
79
81{
82 if( m_diameter != 0 )
84 else if( Schematic() )
86 else
88
89 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
90 {
91 // If we know what we're connected to, then enforce a minimum size of 170% of the
92 // connected wire width:
93 if( !IsConnectivityDirty() )
94 {
96 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
97 }
98 }
99
100 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
101}
102
103
105{
106 BOX2I bbox( m_pos );
107 bbox.Inflate( getEffectiveShape().GetRadius() );
108
109 return bbox;
110}
111
112
114{
115 MIRROR( m_pos.y, aCenter );
116}
117
118
120{
121 MIRROR( m_pos.x, aCenter );
122}
123
124
125void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
126{
127 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
128}
129
130
131void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
132{
133 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
134 aItemList.push_back( item );
135}
136
137
138std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
139{
140 return { m_pos };
141}
142
143
144#if defined(DEBUG)
145void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
146{
147 // XML output:
148 wxString s = GetClass();
149
150 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
151 << "/>\n";
152}
153#endif
154
155
156void SCH_JUNCTION::SetDiameter( int aDiameter )
157{
158 m_diameter = aDiameter;
159 m_lastResolvedDiameter = aDiameter;
160}
161
162
172
173
174void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
175{
176 m_color = aColor;
177 m_lastResolvedColor = aColor;
178}
179
180
182{
183 return getEffectiveShape().GetRadius() * 2;
184}
185
186
187bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
188{
189 if( aAccuracy >= 0 )
190 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
191 else
192 return aPosition == m_pos;
193}
194
195
196bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
197{
199 return false;
200
201 if( aContained )
202 {
203 BOX2I selRect( aRect );
204
205 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
206 }
207 else
208 {
209 SHAPE_CIRCLE junction = getEffectiveShape();
210 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
211
212 return selRect.Collide( &junction, aAccuracy );
213 }
214}
215
216
217bool SCH_JUNCTION::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
218{
220 return false;
221
222 return KIGEOM::ShapeHitTest( aPoly, getEffectiveShape(), aContained );
223}
224
225
227 const SCH_SHEET_PATH* aInstance ) const
228{
229 // Do not compare to ourself.
230 if( aItem == this )
231 return false;
232
233 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
234
235 // Don't compare against a different SCH_ITEM.
236 wxCHECK( junction, false );
237
238 return GetPosition() != junction->GetPosition();
239}
240
241
242bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
243{
244 return m_pos == aPosition;
245}
246
247
248void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
249 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
250{
251 if( aBackground )
252 return;
253
254 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
256
258 color = settings->GetLayerColor( GetLayer() );
259
260 aPlotter->SetColor( color );
261
263}
264
265
270
271
272bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
273{
274 if( Type() != aItem.Type() )
275 return Type() < aItem.Type();
276
277 if( GetLayer() != aItem.GetLayer() )
278 return GetLayer() < aItem.GetLayer();
279
280 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
281
282 if( GetPosition().x != junction->GetPosition().x )
283 return GetPosition().x < junction->GetPosition().x;
284
285 if( GetPosition().y != junction->GetPosition().y )
286 return GetPosition().y < junction->GetPosition().y;
287
288 if( GetDiameter() != junction->GetDiameter() )
289 return GetDiameter() < junction->GetDiameter();
290
291 return GetColor() < junction->GetColor();
292}
293
294
295void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
296{
297 aList.emplace_back( _( "Junction" ), wxEmptyString );
298
299 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
300
301 SCH_CONNECTION* conn = nullptr;
302
303 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
304 conn = Connection();
305
306 if( conn )
307 {
308 conn->AppendInfoToMsgPanel( aList );
309
310 if( !conn->IsBus() )
311 {
312 aList.emplace_back( _( "Resolved Netclass" ),
313 UnescapeString( GetEffectiveNetClass()->GetHumanReadableName() ) );
314 }
315 }
316}
317
318
319bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
320{
321 if( Type() != aOther.Type() )
322 return false;
323
324 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
325
326 if( m_pos != other.m_pos )
327 return false;
328
329 if( m_diameter != other.m_diameter )
330 return false;
331
332 if( m_color != other.m_color )
333 return false;
334
335 return true;
336}
337
338
339double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
340{
341 if( m_Uuid == aOther.m_Uuid )
342 return 1.0;
343
344 if( aOther.Type() != Type() )
345 return 0.0;
346
347 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
348
349 double similarity = 1.0;
350
351 if( m_pos != other.m_pos )
352 similarity *= 0.9;
353
354 if( m_diameter != other.m_diameter )
355 similarity *= 0.9;
356
357 if( m_color != other.m_color )
358 similarity *= 0.9;
359
360 return similarity;
361}
362
363
int color
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
constexpr const Vec & GetPosition() const
Definition box2.h:211
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:558
constexpr size_type GetWidth() const
Definition box2.h:214
constexpr size_type GetHeight() const
Definition box2.h:215
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:96
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:527
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:39
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.
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:219
Base plotter engine class.
Definition plotter.h:121
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:152
virtual void SetColor(const COLOR4D &color)=0
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
SCHEMATIC_SETTINGS & Settings() const
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:167
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:217
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:352
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:309
bool IsConnectivityDirty() const
Definition sch_item.h:554
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:51
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:323
SCH_LAYER_ID m_layer
Definition sch_item.h:739
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
VECTOR2I m_pos
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
virtual bool operator<(const SCH_ITEM &aItem) const override
int GetEffectiveDiameter() const
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
SHAPE_CIRCLE getEffectiveShape() const
SCH_JUNCTION(const VECTOR2I &aPosition=VECTOR2I(0, 0), int aDiameter=0, SCH_LAYER_ID aLayer=LAYER_JUNCTION)
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
COLOR4D m_lastResolvedColor
int m_diameter
Zero is user default.
bool operator==(const SCH_ITEM &aOther) const override
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.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
COLOR4D GetColor() const
int GetDiameter() const
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.
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
VECTOR2I GetPosition() const override
void SetColor(const COLOR4D &aColor)
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
int m_lastResolvedDiameter
wxString GetClass() const override
Return the class name.
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
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.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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,...
int GetRadius() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
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:151
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
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 _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
@ FILLED_SHAPE
Fill with object color.
Definition eda_shape.h:58
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:448
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:493
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition mirror.h:45
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
#define _HKI(x)
Definition page_info.cpp:44
#define TYPE_HASH(x)
Definition property.h:73
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:62
#define REGISTER_TYPE(x)
@ JUNCTION_END
Definition sch_item.h:81
static struct SCH_JUNCTION_DESC _SCH_JUNCTION_DESC
wxString UnescapeString(const wxString &aSource)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:229
@ SCH_JUNCTION_T
Definition typeinfo.h:161
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695