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, see <https://www.gnu.org/licenses/>.
19 */
20
21#include <sch_draw_panel.h>
22#include <trigo.h>
23#include <common.h>
24#include <plotters/plotter.h>
25#include <bitmaps.h>
26#include <core/mirror.h>
27#include <geometry/shape_rect.h>
29#include <sch_painter.h>
30#include <sch_junction.h>
31#include <sch_edit_frame.h>
32#include <sch_connection.h>
33#include <schematic.h>
35#include <connection_graph.h>
36#include <string_utils.h>
37#include <api/api_utils.h>
38#include <api/schematic/schematic_types.pb.h>
39#include <properties/property.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
62void SCH_JUNCTION::Serialize( google::protobuf::Any& aContainer ) const
63{
64 using namespace kiapi::common;
65
66 kiapi::schematic::types::Junction junction;
67
68 junction.mutable_id()->set_value( m_Uuid.AsStdString() );
69 PackVector2( *junction.mutable_position(), m_pos, schIUScale );
70 PackDistance( *junction.mutable_diameter(), m_diameter, schIUScale );
71
73 PackColor( *junction.mutable_color(), m_color );
74
75 junction.set_locked( IsLocked() ? types::LockedState::LS_LOCKED
76 : types::LockedState::LS_UNLOCKED );
77
78 aContainer.PackFrom( junction );
79}
80
81
82bool SCH_JUNCTION::Deserialize( const google::protobuf::Any& aContainer )
83{
84 using namespace kiapi::common;
85
86 kiapi::schematic::types::Junction junction;
87
88 if( !aContainer.UnpackTo( &junction ) )
89 return false;
90
91 const_cast<KIID&>( m_Uuid ) = KIID( junction.id().value() );
92 m_pos = UnpackVector2( junction.position(), schIUScale );
93 m_diameter = UnpackDistance( junction.diameter(), schIUScale );
94
95 if( junction.has_color() )
96 m_color = UnpackColor( junction.color() );
97 else
99
100 SetLocked( junction.locked() == types::LockedState::LS_LOCKED );
101 return true;
102}
103
104
106{
107 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
108 wxT( "Cannot swap junction data with invalid item." ) );
109
110 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
111 std::swap( m_pos, item->m_pos );
112 std::swap( m_diameter, item->m_diameter );
113 std::swap( m_color, item->m_color );
114}
115
116
117std::vector<int> SCH_JUNCTION::ViewGetLayers() const
118{
120}
121
122
124{
125 if( m_diameter != 0 )
127 else if( Schematic() )
129 else
131
132 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
133 {
134 // If we know what we're connected to, then enforce a minimum size of 170% of the
135 // connected wire width:
136 if( !IsConnectivityDirty() )
137 {
139 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
140 }
141 }
142
143 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
144}
145
146
148{
149 BOX2I bbox( m_pos );
150 bbox.Inflate( getEffectiveShape().GetRadius() );
151
152 return bbox;
153}
154
155
157{
158 MIRROR( m_pos.y, aCenter );
159}
160
161
163{
164 MIRROR( m_pos.x, aCenter );
165}
166
167
168void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
169{
170 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
171}
172
173
174void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
175{
176 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
177 aItemList.push_back( item );
178}
179
180
181std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
182{
183 return { m_pos };
184}
185
186
187#if defined(DEBUG)
188void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
189{
190 // XML output:
191 wxString s = GetClass();
192
193 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
194 << "/>\n";
195}
196#endif
197
198
199void SCH_JUNCTION::SetDiameter( int aDiameter )
200{
201 m_diameter = aDiameter;
202 m_lastResolvedDiameter = aDiameter;
203}
204
205
215
216
217void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
218{
219 m_color = aColor;
220 m_lastResolvedColor = aColor;
221}
222
223
225{
226 return getEffectiveShape().GetRadius() * 2;
227}
228
229
230bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
231{
232 if( aAccuracy >= 0 )
233 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
234 else
235 return aPosition == m_pos;
236}
237
238
239bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
240{
242 return false;
243
244 if( aContained )
245 {
246 BOX2I selRect( aRect );
247
248 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
249 }
250 else
251 {
252 SHAPE_CIRCLE junction = getEffectiveShape();
253 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
254
255 return selRect.Collide( &junction, aAccuracy );
256 }
257}
258
259
260bool SCH_JUNCTION::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
261{
263 return false;
264
265 return KIGEOM::ShapeHitTest( aPoly, getEffectiveShape(), aContained );
266}
267
268
270 const SCH_SHEET_PATH* aInstance ) const
271{
272 // Do not compare to ourself.
273 if( aItem == this )
274 return false;
275
276 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
277
278 // Don't compare against a different SCH_ITEM.
279 wxCHECK( junction, false );
280
281 return GetPosition() != junction->GetPosition();
282}
283
284
285bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
286{
287 return m_pos == aPosition;
288}
289
290
291void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
292 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
293{
294 if( aBackground )
295 return;
296
297 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
298 COLOR4D color = GetJunctionColor();
299
300 if( color == COLOR4D::UNSPECIFIED )
301 color = settings->GetLayerColor( GetLayer() );
302
303 if( color.m_text && Schematic() )
304 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
305
306 aPlotter->SetColor( color );
307
309}
310
311
316
317
318bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
319{
320 if( Type() != aItem.Type() )
321 return Type() < aItem.Type();
322
323 if( GetLayer() != aItem.GetLayer() )
324 return GetLayer() < aItem.GetLayer();
325
326 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
327
328 if( GetPosition().x != junction->GetPosition().x )
329 return GetPosition().x < junction->GetPosition().x;
330
331 if( GetPosition().y != junction->GetPosition().y )
332 return GetPosition().y < junction->GetPosition().y;
333
334 if( GetDiameter() != junction->GetDiameter() )
335 return GetDiameter() < junction->GetDiameter();
336
337 return GetColor() < junction->GetColor();
338}
339
340
341void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
342{
343 aList.emplace_back( _( "Junction" ), wxEmptyString );
344
345 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
346
347 SCH_CONNECTION* conn = nullptr;
348
349 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
350 conn = Connection();
351
352 if( conn )
353 {
354 conn->AppendInfoToMsgPanel( aList );
355
356 if( !conn->IsBus() )
357 {
358 aList.emplace_back( _( "Resolved Netclass" ),
359 UnescapeString( GetEffectiveNetClass()->GetHumanReadableName() ) );
360 }
361 }
362}
363
364
365bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
366{
367 if( Type() != aOther.Type() )
368 return false;
369
370 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
371
372 if( m_pos != other.m_pos )
373 return false;
374
375 if( m_diameter != other.m_diameter )
376 return false;
377
378 if( m_color != other.m_color )
379 return false;
380
381 return true;
382}
383
384
385double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
386{
387 if( m_Uuid == aOther.m_Uuid )
388 return 1.0;
389
390 if( aOther.Type() != Type() )
391 return 0.0;
392
393 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
394
395 double similarity = 1.0;
396
397 if( m_pos != other.m_pos )
398 similarity *= 0.9;
399
400 if( m_diameter != other.m_diameter )
401 similarity *= 0.9;
402
403 if( m_color != other.m_color )
404 similarity *= 0.9;
405
406 return similarity;
407}
408
409
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:123
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:918
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:986
constexpr const Vec & GetPosition() const
Definition box2.h:207
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:554
constexpr size_type GetWidth() const
Definition box2.h:210
constexpr size_type GetHeight() const
Definition box2.h:211
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:164
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:93
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:531
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:108
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:542
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:37
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
std::shared_ptr< wxString > m_text
Definition color4d.h:395
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.
Definition kiid.h:44
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:225
Base plotter engine class.
Definition plotter.h:133
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:164
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.
int GetJunctionSize()
Accessor that computes the current junction size.
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:162
void SetLocked(bool aLocked) override
Definition sch_item.h:251
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:268
bool IsLocked() const override
Definition sch_item.cpp:148
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:523
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:338
bool IsConnectivityDirty() const
Definition sch_item.h:585
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:52
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:487
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:377
SCH_LAYER_ID m_layer
Definition sch_item.h:775
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
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
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 Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
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:38
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:147
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:61
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:447
@ 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:41
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
KICOMMON_API void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
#define _HKI(x)
Definition page_info.cpp:40
#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:78
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:225
@ SCH_JUNCTION_T
Definition typeinfo.h:156
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683