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
75std::vector<int> SCH_JUNCTION::ViewGetLayers() const
76{
78}
79
80
82{
83 if( m_diameter != 0 )
85 else if( Schematic() )
87 else
89
90 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
91 {
92 // If we know what we're connected to, then enforce a minimum size of 170% of the
93 // connected wire width:
94 if( !IsConnectivityDirty() )
95 {
97 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
98 }
99 }
100
101 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
102}
103
104
106{
107 BOX2I bbox( m_pos );
108 bbox.Inflate( getEffectiveShape().GetRadius() );
109
110 return bbox;
111}
112
113
114void SCH_JUNCTION::Print( const SCH_RENDER_SETTINGS* aSettings, int aUnit, int aBodyStyle,
115 const VECTOR2I& aOffset, bool aForceNoFill, bool aDimmed )
116{
117 wxDC* DC = aSettings->GetPrintDC();
119
120 if( color == COLOR4D::UNSPECIFIED )
121 color = aSettings->GetLayerColor( GetLayer() );
122
124
125 GRFilledCircle( DC, circle.GetCenter() + aOffset, circle.GetRadius(), 0, color, color );
126}
127
128
130{
131 MIRROR( m_pos.y, aCenter );
132}
133
134
136{
137 MIRROR( m_pos.x, aCenter );
138}
139
140
141void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
142{
143 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
144}
145
146
147void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
148{
149 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
150 aItemList.push_back( item );
151}
152
153
154std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
155{
156 return { m_pos };
157}
158
159
160#if defined(DEBUG)
161void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
162{
163 // XML output:
164 wxString s = GetClass();
165
166 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
167 << "/>\n";
168}
169#endif
170
171
172void SCH_JUNCTION::SetDiameter( int aDiameter )
173{
174 m_diameter = aDiameter;
175 m_lastResolvedDiameter = aDiameter;
176}
177
178
180{
181 if( m_color != COLOR4D::UNSPECIFIED )
183 else if( !IsConnectivityDirty() )
184 m_lastResolvedColor = GetEffectiveNetClass()->GetSchematicColor();
185
186 return m_lastResolvedColor;
187}
188
189
190void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
191{
192 m_color = aColor;
193 m_lastResolvedColor = aColor;
194}
195
196
198{
199 return getEffectiveShape().GetRadius() * 2;
200}
201
202
203bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
204{
205 if( aAccuracy >= 0 )
206 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
207 else
208 return aPosition == m_pos;
209}
210
211
212bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
213{
215 return false;
216
217 if( aContained )
218 {
219 BOX2I selRect( aRect );
220
221 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
222 }
223 else
224 {
225 SHAPE_CIRCLE junction = getEffectiveShape();
226 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
227
228 return selRect.Collide( &junction, aAccuracy );
229 }
230}
231
232
234 const SCH_SHEET_PATH* aInstance ) const
235{
236 // Do not compare to ourself.
237 if( aItem == this )
238 return false;
239
240 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
241
242 // Don't compare against a different SCH_ITEM.
243 wxCHECK( junction, false );
244
245 return GetPosition() != junction->GetPosition();
246}
247
248
249bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
250{
251 return m_pos == aPosition;
252}
253
254
255void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
256 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
257{
258 if( aBackground )
259 return;
260
261 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
263
264 if( color == COLOR4D::UNSPECIFIED )
265 color = settings->GetLayerColor( GetLayer() );
266
267 aPlotter->SetColor( color );
268
269 aPlotter->Circle( m_pos, GetEffectiveDiameter(), FILL_T::FILLED_SHAPE );
270}
271
272
274{
275 return BITMAPS::add_junction;
276}
277
278
279bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
280{
281 if( Type() != aItem.Type() )
282 return Type() < aItem.Type();
283
284 if( GetLayer() != aItem.GetLayer() )
285 return GetLayer() < aItem.GetLayer();
286
287 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
288
289 if( GetPosition().x != junction->GetPosition().x )
290 return GetPosition().x < junction->GetPosition().x;
291
292 if( GetPosition().y != junction->GetPosition().y )
293 return GetPosition().y < junction->GetPosition().y;
294
295 if( GetDiameter() != junction->GetDiameter() )
296 return GetDiameter() < junction->GetDiameter();
297
298 return GetColor() < junction->GetColor();
299}
300
301
302void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
303{
304 aList.emplace_back( _( "Junction" ), wxEmptyString );
305
306 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
307
308 SCH_CONNECTION* conn = nullptr;
309
310 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
311 conn = Connection();
312
313 if( conn )
314 {
315 conn->AppendInfoToMsgPanel( aList );
316
317 if( !conn->IsBus() )
318 {
319 aList.emplace_back( _( "Resolved Netclass" ),
320 UnescapeString( GetEffectiveNetClass()->GetName() ) );
321 }
322 }
323}
324
325
326bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
327{
328 if( Type() != aOther.Type() )
329 return false;
330
331 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
332
333 if( m_pos != other.m_pos )
334 return false;
335
336 if( m_diameter != other.m_diameter )
337 return false;
338
339 if( m_color != other.m_color )
340 return false;
341
342 return true;
343}
344
345
346double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
347{
348 if( m_Uuid == aOther.m_Uuid )
349 return 1.0;
350
351 if( aOther.Type() != Type() )
352 return 0.0;
353
354 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
355
356 double similarity = 1.0;
357
358 if( m_pos != other.m_pos )
359 similarity *= 0.9;
360
361 if( m_diameter != other.m_diameter )
362 similarity *= 0.9;
363
364 if( m_color != other.m_color )
365 similarity *= 0.9;
366
367 return similarity;
368}
369
370
371static struct SCH_JUNCTION_DESC
372{
374 {
378
379 propMgr.AddProperty( new PROPERTY<SCH_JUNCTION, int>( _HKI( "Diameter" ),
381 PROPERTY_DISPLAY::PT_SIZE ) );
382
383 propMgr.AddProperty( new PROPERTY<SCH_JUNCTION, COLOR4D>( _HKI( "Color" ),
385
386 }
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:312
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:247
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:351
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:218
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:154
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:162
int m_diameter
Zero is user default.
Definition: sch_junction.h:155
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:156
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 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:161
wxString GetClass() const override
Return the class name.
Definition: sch_junction.h:50
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,...
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:353
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:397
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