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#include <properties/property.h>
43
44
45SCH_JUNCTION::SCH_JUNCTION( const VECTOR2I& aPosition, int aDiameter, SCH_LAYER_ID aLayer ) :
46 SCH_ITEM( nullptr, SCH_JUNCTION_T )
47{
48 m_pos = aPosition;
50 m_diameter = aDiameter;
51 m_layer = aLayer;
52
55}
56
57
59{
60 return new SCH_JUNCTION( *this );
61}
62
63
65{
66 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
67 wxT( "Cannot swap junction data with invalid item." ) );
68
69 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
70 std::swap( m_pos, item->m_pos );
71 std::swap( m_diameter, item->m_diameter );
72 std::swap( m_color, item->m_color );
73}
74
75
76std::vector<int> SCH_JUNCTION::ViewGetLayers() const
77{
79}
80
81
83{
84 if( m_diameter != 0 )
86 else if( Schematic() )
88 else
90
91 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
92 {
93 // If we know what we're connected to, then enforce a minimum size of 170% of the
94 // connected wire width:
95 if( !IsConnectivityDirty() )
96 {
98 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
99 }
100 }
101
102 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
103}
104
105
107{
108 BOX2I bbox( m_pos );
109 bbox.Inflate( getEffectiveShape().GetRadius() );
110
111 return bbox;
112}
113
114
116{
117 MIRROR( m_pos.y, aCenter );
118}
119
120
122{
123 MIRROR( m_pos.x, aCenter );
124}
125
126
127void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
128{
129 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
130}
131
132
133void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
134{
135 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
136 aItemList.push_back( item );
137}
138
139
140std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
141{
142 return { m_pos };
143}
144
145
146#if defined(DEBUG)
147void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
148{
149 // XML output:
150 wxString s = GetClass();
151
152 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
153 << "/>\n";
154}
155#endif
156
157
158void SCH_JUNCTION::SetDiameter( int aDiameter )
159{
160 m_diameter = aDiameter;
161 m_lastResolvedDiameter = aDiameter;
162}
163
164
174
175
176void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
177{
178 m_color = aColor;
179 m_lastResolvedColor = aColor;
180}
181
182
184{
185 return getEffectiveShape().GetRadius() * 2;
186}
187
188
189bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
190{
191 if( aAccuracy >= 0 )
192 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
193 else
194 return aPosition == m_pos;
195}
196
197
198bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
199{
201 return false;
202
203 if( aContained )
204 {
205 BOX2I selRect( aRect );
206
207 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
208 }
209 else
210 {
211 SHAPE_CIRCLE junction = getEffectiveShape();
212 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
213
214 return selRect.Collide( &junction, aAccuracy );
215 }
216}
217
218
219bool SCH_JUNCTION::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
220{
222 return false;
223
224 return KIGEOM::ShapeHitTest( aPoly, getEffectiveShape(), aContained );
225}
226
227
229 const SCH_SHEET_PATH* aInstance ) const
230{
231 // Do not compare to ourself.
232 if( aItem == this )
233 return false;
234
235 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
236
237 // Don't compare against a different SCH_ITEM.
238 wxCHECK( junction, false );
239
240 return GetPosition() != junction->GetPosition();
241}
242
243
244bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
245{
246 return m_pos == aPosition;
247}
248
249
250void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
251 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
252{
253 if( aBackground )
254 return;
255
256 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
257 COLOR4D color = GetJunctionColor();
258
259 if( color == COLOR4D::UNSPECIFIED )
260 color = settings->GetLayerColor( GetLayer() );
261
262 if( color.m_text && Schematic() )
263 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
264
265 aPlotter->SetColor( color );
266
268}
269
270
275
276
277bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
278{
279 if( Type() != aItem.Type() )
280 return Type() < aItem.Type();
281
282 if( GetLayer() != aItem.GetLayer() )
283 return GetLayer() < aItem.GetLayer();
284
285 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
286
287 if( GetPosition().x != junction->GetPosition().x )
288 return GetPosition().x < junction->GetPosition().x;
289
290 if( GetPosition().y != junction->GetPosition().y )
291 return GetPosition().y < junction->GetPosition().y;
292
293 if( GetDiameter() != junction->GetDiameter() )
294 return GetDiameter() < junction->GetDiameter();
295
296 return GetColor() < junction->GetColor();
297}
298
299
300void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
301{
302 aList.emplace_back( _( "Junction" ), wxEmptyString );
303
304 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
305
306 SCH_CONNECTION* conn = nullptr;
307
308 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
309 conn = Connection();
310
311 if( conn )
312 {
313 conn->AppendInfoToMsgPanel( aList );
314
315 if( !conn->IsBus() )
316 {
317 aList.emplace_back( _( "Resolved Netclass" ),
318 UnescapeString( GetEffectiveNetClass()->GetHumanReadableName() ) );
319 }
320 }
321}
322
323
324bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
325{
326 if( Type() != aOther.Type() )
327 return false;
328
329 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
330
331 if( m_pos != other.m_pos )
332 return false;
333
334 if( m_diameter != other.m_diameter )
335 return false;
336
337 if( m_color != other.m_color )
338 return false;
339
340 return true;
341}
342
343
344double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
345{
346 if( m_Uuid == aOther.m_Uuid )
347 return 1.0;
348
349 if( aOther.Type() != Type() )
350 return 0.0;
351
352 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
353
354 double similarity = 1.0;
355
356 if( m_pos != other.m_pos )
357 similarity *= 0.9;
358
359 if( m_diameter != other.m_diameter )
360 similarity *= 0.9;
361
362 if( m_color != other.m_color )
363 similarity *= 0.9;
364
365 return similarity;
366}
367
368
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:402
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:97
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:522
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:111
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:533
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
std::shared_ptr< wxString > m_text
Definition color4d.h:399
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:136
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:167
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:168
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:254
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:509
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:341
bool IsConnectivityDirty() const
Definition sch_item.h:588
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:56
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:473
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:363
SCH_LAYER_ID m_layer
Definition sch_item.h:778
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:449
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:495
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:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
@ JUNCTION_END
Definition sch_item.h:82
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:163
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695