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-2024 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 SCH_RENDER_SETTINGS* aSettings, int aUnit, int aBodyStyle,
117 const VECTOR2I& aOffset, bool aForceNoFill, bool aDimmed )
118{
119 wxDC* DC = aSettings->GetPrintDC();
121
122 if( color == COLOR4D::UNSPECIFIED )
123 color = aSettings->GetLayerColor( GetLayer() );
124
126
127 GRFilledCircle( DC, circle.GetCenter() + aOffset, circle.GetRadius(), 0, color, color );
128}
129
130
132{
133 MIRROR( m_pos.y, aCenter );
134}
135
136
138{
139 MIRROR( m_pos.x, aCenter );
140}
141
142
143void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
144{
145 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
146}
147
148
149void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
150{
151 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
152 aItemList.push_back( item );
153}
154
155
156std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
157{
158 return { m_pos };
159}
160
161
162#if defined(DEBUG)
163void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
164{
165 // XML output:
166 wxString s = GetClass();
167
168 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
169 << "/>\n";
170}
171#endif
172
173
174void SCH_JUNCTION::SetDiameter( int aDiameter )
175{
176 m_diameter = aDiameter;
177 m_lastResolvedDiameter = aDiameter;
178}
179
180
182{
183 if( m_color != COLOR4D::UNSPECIFIED )
185 else if( !IsConnectivityDirty() )
186 m_lastResolvedColor = GetEffectiveNetClass()->GetSchematicColor();
187
188 return m_lastResolvedColor;
189}
190
191
192void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
193{
194 m_color = aColor;
195 m_lastResolvedColor = aColor;
196}
197
198
200{
201 return getEffectiveShape().GetRadius() * 2;
202}
203
204
205bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
206{
207 if( aAccuracy >= 0 )
208 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
209 else
210 return aPosition == m_pos;
211}
212
213
214bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
215{
217 return false;
218
219 if( aContained )
220 {
221 BOX2I selRect( aRect );
222
223 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
224 }
225 else
226 {
227 SHAPE_CIRCLE junction = getEffectiveShape();
228 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
229
230 return selRect.Collide( &junction, aAccuracy );
231 }
232}
233
234
236 const SCH_SHEET_PATH* aInstance ) const
237{
238 // Do not compare to ourself.
239 if( aItem == this )
240 return false;
241
242 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
243
244 // Don't compare against a different SCH_ITEM.
245 wxCHECK( junction, false );
246
247 return GetPosition() != junction->GetPosition();
248}
249
250
251bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
252{
253 return m_pos == aPosition;
254}
255
256
257void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
258 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
259{
260 if( aBackground )
261 return;
262
263 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
265
266 if( color == COLOR4D::UNSPECIFIED )
267 color = settings->GetLayerColor( GetLayer() );
268
269 aPlotter->SetColor( color );
270
271 aPlotter->Circle( m_pos, GetEffectiveDiameter(), FILL_T::FILLED_SHAPE );
272}
273
274
276{
277 return BITMAPS::add_junction;
278}
279
280
281bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
282{
283 if( Type() != aItem.Type() )
284 return Type() < aItem.Type();
285
286 if( GetLayer() != aItem.GetLayer() )
287 return GetLayer() < aItem.GetLayer();
288
289 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
290
291 if( GetPosition().x != junction->GetPosition().x )
292 return GetPosition().x < junction->GetPosition().x;
293
294 if( GetPosition().y != junction->GetPosition().y )
295 return GetPosition().y < junction->GetPosition().y;
296
297 if( GetDiameter() != junction->GetDiameter() )
298 return GetDiameter() < junction->GetDiameter();
299
300 return GetColor() < junction->GetColor();
301}
302
303
304void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
305{
306 aList.emplace_back( _( "Junction" ), wxEmptyString );
307
308 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
309
310 SCH_CONNECTION* conn = nullptr;
311
312 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
313 conn = Connection();
314
315 if( conn )
316 {
317 conn->AppendInfoToMsgPanel( aList );
318
319 if( !conn->IsBus() )
320 {
321 aList.emplace_back( _( "Resolved Netclass" ),
322 UnescapeString( GetEffectiveNetClass()->GetName() ) );
323 }
324 }
325}
326
327
328bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
329{
330 if( Type() != aOther.Type() )
331 return false;
332
333 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
334
335 if( m_pos != other.m_pos )
336 return false;
337
338 if( m_diameter != other.m_diameter )
339 return false;
340
341 if( m_color != other.m_color )
342 return false;
343
344 return true;
345}
346
347
348double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
349{
350 if( m_Uuid == aOther.m_Uuid )
351 return 1.0;
352
353 if( aOther.Type() != Type() )
354 return 0.0;
355
356 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
357
358 double similarity = 1.0;
359
360 if( m_pos != other.m_pos )
361 similarity *= 0.9;
362
363 if( m_diameter != other.m_diameter )
364 similarity *= 0.9;
365
366 if( m_color != other.m_color )
367 similarity *= 0.9;
368
369 return similarity;
370}
371
372
373static struct SCH_JUNCTION_DESC
374{
376 {
380
381 propMgr.AddProperty( new PROPERTY<SCH_JUNCTION, int>( _HKI( "Diameter" ),
383 PROPERTY_DISPLAY::PT_SIZE ) );
384
385 propMgr.AddProperty( new PROPERTY<SCH_JUNCTION, COLOR4D>( _HKI( "Color" ),
387
388 }
int color
Definition: DXF_plotter.cpp:58
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
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
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition: sch_item.h:95
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:89
const KIID m_Uuid
Definition: eda_item.h:489
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:499
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:105
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:136
virtual void SetColor(const COLOR4D &color)=0
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:85
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:87
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:314
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:166
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:150
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition: sch_item.cpp:250
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:281
bool IsConnectivityDirty() const
Definition: sch_item.h:510
void SwapFlags(SCH_ITEM *aItem)
Swap the non-temp and non-edit flags.
Definition: sch_item.cpp:354
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:221
SCH_LAYER_ID m_layer
Definition: sch_item.h:723
void SwapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
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
Definition: sch_junction.h:151
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
Definition: sch_junction.h:159
int m_diameter
Zero is user default.
Definition: sch_junction.h:152
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.
Definition: sch_junction.h:153
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
COLOR4D GetColor() const
Definition: sch_junction.h:119
int GetDiameter() const
Definition: sch_junction.h:114
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.
void Print(const SCH_RENDER_SETTINGS *aSettings, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aForceNoFill, bool aDimmed) override
Print an item.
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
Definition: sch_junction.h:107
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)
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
int m_lastResolvedDiameter
Definition: sch_junction.h:158
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.
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,...
Definition: shape_circle.h:77
int GetRadius() const
Definition: shape_circle.h:118
const VECTOR2I GetCenter() const
Definition: shape_circle.h:123
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:142
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 _HKI(x)
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
static constexpr EDA_ANGLE ANGLE_270
Definition: eda_angle.h:406
#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:354
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:398
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:45
#define TYPE_HASH(x)
Definition: property.h:71
#define REGISTER_TYPE(x)
Definition: property_mgr.h:371
@ JUNCTION_END
Definition: sch_item.h:80
static struct SCH_JUNCTION_DESC _SCH_JUNCTION_DESC
wxString UnescapeString(const wxString &aSource)
constexpr int MilsToIU(int mils) const
Definition: base_units.h:93
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:159