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
23#include <netclass.h>
24#include <sch_draw_panel.h>
25#include <trigo.h>
26#include <common.h>
27#include <plotters/plotter.h>
28#include <bitmaps.h>
29#include <core/mirror.h>
30#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#include <api/api_utils.h>
41#include <api/schematic/schematic_types.pb.h>
42#include <properties/property.h>
44
45
46SCH_JUNCTION::SCH_JUNCTION( const VECTOR2I& aPosition, int aDiameter, SCH_LAYER_ID aLayer ) :
47 SCH_ITEM( nullptr, SCH_JUNCTION_T )
48{
49 m_pos = aPosition;
51 m_diameter = aDiameter;
52 m_layer = aLayer;
53
56}
57
58
60{
61 return new SCH_JUNCTION( *this );
62}
63
64
65void SCH_JUNCTION::Serialize( google::protobuf::Any& aContainer ) const
66{
67 using namespace kiapi::common;
68
69 kiapi::schematic::types::Junction junction;
70
71 junction.mutable_id()->set_value( m_Uuid.AsStdString() );
72 PackVector2( *junction.mutable_position(), m_pos, schIUScale );
73 PackDistance( *junction.mutable_diameter(), m_diameter, schIUScale );
74
76 PackColor( *junction.mutable_color(), m_color );
77
78 junction.set_locked( IsLocked() ? types::LockedState::LS_LOCKED
79 : types::LockedState::LS_UNLOCKED );
80
81 kiapi::common::PackCustomProperties( junction.mutable_custom_properties(), *this );
82 aContainer.PackFrom( junction );
83}
84
85
86bool SCH_JUNCTION::Deserialize( const google::protobuf::Any& aContainer )
87{
88 using namespace kiapi::common;
89
90 kiapi::schematic::types::Junction junction;
91
92 if( !aContainer.UnpackTo( &junction ) )
93 return false;
94
95 const_cast<KIID&>( m_Uuid ) = KIID( junction.id().value() );
96 m_pos = UnpackVector2( junction.position(), schIUScale );
97 m_diameter = UnpackDistance( junction.diameter(), schIUScale );
98
99 if( junction.has_color() )
100 m_color = UnpackColor( junction.color() );
101 else
103
104 SetLocked( junction.locked() == types::LockedState::LS_LOCKED );
105 kiapi::common::UnpackCustomProperties( junction.custom_properties(), *this );
106 return true;
107}
108
109
111{
112 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
113 wxT( "Cannot swap junction data with invalid item." ) );
114
115 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
116 std::swap( m_pos, item->m_pos );
117 std::swap( m_diameter, item->m_diameter );
118 std::swap( m_color, item->m_color );
119}
120
121
122std::vector<int> SCH_JUNCTION::ViewGetLayers() const
123{
125}
126
127
129{
130 if( m_diameter != 0 )
132 else if( Schematic() )
134 else
136
137 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
138 {
139 // If we know what we're connected to, then enforce a minimum size of 170% of the
140 // connected wire width:
141 if( !IsConnectivityDirty() )
142 {
144 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
145 }
146 }
147
148 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
149}
150
151
153{
154 BOX2I bbox( m_pos );
155 bbox.Inflate( getEffectiveShape().GetRadius() );
156
157 return bbox;
158}
159
160
162{
163 MIRROR( m_pos.y, aCenter );
164}
165
166
168{
169 MIRROR( m_pos.x, aCenter );
170}
171
172
173void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
174{
175 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
176}
177
178
179void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
180{
181 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
182 aItemList.push_back( item );
183}
184
185
186std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
187{
188 return { m_pos };
189}
190
191
192#if defined(DEBUG)
193void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
194{
195 // XML output:
196 wxString s = GetClass();
197
198 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
199 << "/>\n";
200}
201#endif
202
203
204void SCH_JUNCTION::SetDiameter( int aDiameter )
205{
206 m_diameter = aDiameter;
207 m_lastResolvedDiameter = aDiameter;
208}
209
210
220
221
222void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
223{
224 m_color = aColor;
225 m_lastResolvedColor = aColor;
226}
227
228
230{
231 return getEffectiveShape().GetRadius() * 2;
232}
233
234
235bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
236{
237 if( aAccuracy >= 0 )
238 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
239 else
240 return aPosition == m_pos;
241}
242
243
244bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
245{
247 return false;
248
249 if( aContained )
250 {
251 BOX2I selRect( aRect );
252
253 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
254 }
255 else
256 {
257 SHAPE_CIRCLE junction = getEffectiveShape();
258 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
259
260 return selRect.Collide( &junction, aAccuracy );
261 }
262}
263
264
265bool SCH_JUNCTION::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
266{
268 return false;
269
270 return KIGEOM::ShapeHitTest( aPoly, getEffectiveShape(), aContained );
271}
272
273
275 const SCH_SHEET_PATH* aInstance ) const
276{
277 // Do not compare to ourself.
278 if( aItem == this )
279 return false;
280
281 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
282
283 // Don't compare against a different SCH_ITEM.
284 wxCHECK( junction, false );
285
286 return GetPosition() != junction->GetPosition();
287}
288
289
290bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
291{
292 return m_pos == aPosition;
293}
294
295
296void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
297 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
298{
299 if( aBackground )
300 return;
301
302 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
303 COLOR4D color = GetJunctionColor();
304
305 if( color == COLOR4D::UNSPECIFIED )
306 color = settings->GetLayerColor( GetLayer() );
307
308 if( color.m_text && Schematic() )
309 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
310
311 aPlotter->SetColor( color );
312
314}
315
316
321
322
323bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
324{
325 if( Type() != aItem.Type() )
326 return Type() < aItem.Type();
327
328 if( GetLayer() != aItem.GetLayer() )
329 return GetLayer() < aItem.GetLayer();
330
331 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
332
333 if( GetPosition().x != junction->GetPosition().x )
334 return GetPosition().x < junction->GetPosition().x;
335
336 if( GetPosition().y != junction->GetPosition().y )
337 return GetPosition().y < junction->GetPosition().y;
338
339 if( GetDiameter() != junction->GetDiameter() )
340 return GetDiameter() < junction->GetDiameter();
341
342 return GetColor() < junction->GetColor();
343}
344
345
346void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
347{
348 aList.emplace_back( _( "Junction" ), wxEmptyString );
349
350 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
351
352 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
354}
355
356
357bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
358{
359 if( Type() != aOther.Type() )
360 return false;
361
362 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
363
364 if( m_pos != other.m_pos )
365 return false;
366
367 if( m_diameter != other.m_diameter )
368 return false;
369
370 if( m_color != other.m_color )
371 return false;
372
373 return true;
374}
375
376
377double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
378{
379 if( m_Uuid == aOther.m_Uuid )
380 return 1.0;
381
382 if( aOther.Type() != Type() )
383 return 0.0;
384
385 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
386
387 double similarity = 1.0;
388
389 if( m_pos != other.m_pos )
390 similarity *= 0.9;
391
392 if( m_diameter != other.m_diameter )
393 similarity *= 0.9;
394
395 if( m_color != other.m_color )
396 similarity *= 0.9;
397
398 return similarity;
399}
400
401
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:130
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:982
constexpr const Vec & GetPosition() const
Definition box2.h:208
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:553
constexpr size_type GetWidth() const
Definition box2.h:211
constexpr size_type GetHeight() const
Definition box2.h:212
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:165
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:400
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:101
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:599
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:608
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
std::shared_ptr< wxString > m_text
Definition color4d.h:397
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:46
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:244
Base plotter engine class.
Definition plotter.h:138
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:169
virtual void SetColor(const COLOR4D &color)=0
Provide class metadata.
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
Schematic editor (Eeschema) main window.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:170
void SetLocked(bool aLocked) override
Definition sch_item.h:262
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:302
bool IsLocked() const override
Definition sch_item.cpp:179
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:733
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:353
bool IsConnectivityDirty() const
Definition sch_item.h:635
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:65
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:464
SCH_LAYER_ID m_layer
Definition sch_item.h:843
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.
void SetColor(const KIGFX::COLOR4D &aColor)
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.
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.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
int GetDiameter() const
KIGFX::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
KIGFX::COLOR4D m_color
KIGFX::COLOR4D::UNSPECIFIED is user default.
KIGFX::COLOR4D GetColor() const
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.
KIGFX::COLOR4D m_lastResolvedColor
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 *aActual) 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().
#define DEFAULT_JUNCTION_DIAM
The default junction diameter in mils. (can be changed in preference menu)
#define DEFAULT_WIRE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:450
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:453
@ FILLED_SHAPE
Fill with object color.
Definition eda_fill.h:31
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:477
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:523
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.
std::optional< wxString > AppendConnectionInfo(const SCH_ITEM &aItem, std::vector< MSG_PANEL_ITEM > &aList, const SCH_SHEET_PATH *aPath=nullptr)
Append connection details; return its name for a signal, or no value for a bus/missing row.
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 void PackCustomProperties(google::protobuf::RepeatedPtrField< types::CustomProperty > *aOutput, const EDA_ITEM &aItem)
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)
KICOMMON_API void UnpackCustomProperties(const google::protobuf::RepeatedPtrField< types::CustomProperty > &aInput, EDA_ITEM &aItem)
#define _HKI(x)
Definition page_info.cpp:40
#define TYPE_HASH(x)
Macro to generate unique identifier for a type.
Definition property.h:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
Helper macro to map type hashes to names.
@ JUNCTION_END
Definition sch_item.h:86
static struct SCH_JUNCTION_DESC _SCH_JUNCTION_DESC
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:227
@ SCH_JUNCTION_T
Definition typeinfo.h:155
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708