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
22#include <sch_draw_panel.h>
23#include <trigo.h>
24#include <common.h>
25#include <plotters/plotter.h>
26#include <bitmaps.h>
27#include <core/mirror.h>
28#include <geometry/shape_rect.h>
30#include <sch_painter.h>
31#include <sch_junction.h>
32#include <sch_edit_frame.h>
33#include <sch_connection.h>
34#include <schematic.h>
36#include <connection_graph.h>
37#include <string_utils.h>
38#include <api/api_utils.h>
39#include <api/schematic/schematic_types.pb.h>
40#include <properties/property.h>
42
43
44SCH_JUNCTION::SCH_JUNCTION( const VECTOR2I& aPosition, int aDiameter, SCH_LAYER_ID aLayer ) :
45 SCH_ITEM( nullptr, SCH_JUNCTION_T )
46{
47 m_pos = aPosition;
49 m_diameter = aDiameter;
50 m_layer = aLayer;
51
54}
55
56
58{
59 return new SCH_JUNCTION( *this );
60}
61
62
63void SCH_JUNCTION::Serialize( google::protobuf::Any& aContainer ) const
64{
65 using namespace kiapi::common;
66
67 kiapi::schematic::types::Junction junction;
68
69 junction.mutable_id()->set_value( m_Uuid.AsStdString() );
70 PackVector2( *junction.mutable_position(), m_pos, schIUScale );
71 PackDistance( *junction.mutable_diameter(), m_diameter, schIUScale );
72
74 PackColor( *junction.mutable_color(), m_color );
75
76 junction.set_locked( IsLocked() ? types::LockedState::LS_LOCKED
77 : types::LockedState::LS_UNLOCKED );
78
79 kiapi::common::PackCustomProperties( junction.mutable_custom_properties(), *this );
80 aContainer.PackFrom( junction );
81}
82
83
84bool SCH_JUNCTION::Deserialize( const google::protobuf::Any& aContainer )
85{
86 using namespace kiapi::common;
87
88 kiapi::schematic::types::Junction junction;
89
90 if( !aContainer.UnpackTo( &junction ) )
91 return false;
92
93 const_cast<KIID&>( m_Uuid ) = KIID( junction.id().value() );
94 m_pos = UnpackVector2( junction.position(), schIUScale );
95 m_diameter = UnpackDistance( junction.diameter(), schIUScale );
96
97 if( junction.has_color() )
98 m_color = UnpackColor( junction.color() );
99 else
101
102 SetLocked( junction.locked() == types::LockedState::LS_LOCKED );
103 kiapi::common::UnpackCustomProperties( junction.custom_properties(), *this );
104 return true;
105}
106
107
109{
110 wxCHECK_RET( ( aItem != nullptr ) && ( aItem->Type() == SCH_JUNCTION_T ),
111 wxT( "Cannot swap junction data with invalid item." ) );
112
113 SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
114 std::swap( m_pos, item->m_pos );
115 std::swap( m_diameter, item->m_diameter );
116 std::swap( m_color, item->m_color );
117}
118
119
120std::vector<int> SCH_JUNCTION::ViewGetLayers() const
121{
123}
124
125
127{
128 if( m_diameter != 0 )
130 else if( Schematic() )
132 else
134
135 if( m_lastResolvedDiameter != 1 ) // Diameter 1 means user doesn't want to draw junctions
136 {
137 // If we know what we're connected to, then enforce a minimum size of 170% of the
138 // connected wire width:
139 if( !IsConnectivityDirty() )
140 {
142 GetEffectiveNetClass()->GetWireWidth() * 1.7 );
143 }
144 }
145
146 return SHAPE_CIRCLE( m_pos, std::max( m_lastResolvedDiameter / 2, 1 ) );
147}
148
149
151{
152 BOX2I bbox( m_pos );
153 bbox.Inflate( getEffectiveShape().GetRadius() );
154
155 return bbox;
156}
157
158
160{
161 MIRROR( m_pos.y, aCenter );
162}
163
164
166{
167 MIRROR( m_pos.x, aCenter );
168}
169
170
171void SCH_JUNCTION::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
172{
173 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
174}
175
176
177void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
178{
179 DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
180 aItemList.push_back( item );
181}
182
183
184std::vector<VECTOR2I> SCH_JUNCTION::GetConnectionPoints() const
185{
186 return { m_pos };
187}
188
189
190#if defined(DEBUG)
191void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) const
192{
193 // XML output:
194 wxString s = GetClass();
195
196 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << ", " << m_diameter
197 << "/>\n";
198}
199#endif
200
201
202void SCH_JUNCTION::SetDiameter( int aDiameter )
203{
204 m_diameter = aDiameter;
205 m_lastResolvedDiameter = aDiameter;
206}
207
208
218
219
220void SCH_JUNCTION::SetColor( const COLOR4D& aColor )
221{
222 m_color = aColor;
223 m_lastResolvedColor = aColor;
224}
225
226
228{
229 return getEffectiveShape().GetRadius() * 2;
230}
231
232
233bool SCH_JUNCTION::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
234{
235 if( aAccuracy >= 0 )
236 return getEffectiveShape().Collide( SEG( aPosition, aPosition ), aAccuracy );
237 else
238 return aPosition == m_pos;
239}
240
241
242bool SCH_JUNCTION::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
243{
245 return false;
246
247 if( aContained )
248 {
249 BOX2I selRect( aRect );
250
251 return selRect.Inflate( aAccuracy ).Contains( GetBoundingBox() );
252 }
253 else
254 {
255 SHAPE_CIRCLE junction = getEffectiveShape();
256 SHAPE_RECT selRect( aRect.GetPosition(), aRect.GetWidth(), aRect.GetHeight() );
257
258 return selRect.Collide( &junction, aAccuracy );
259 }
260}
261
262
263bool SCH_JUNCTION::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
264{
266 return false;
267
268 return KIGEOM::ShapeHitTest( aPoly, getEffectiveShape(), aContained );
269}
270
271
273 const SCH_SHEET_PATH* aInstance ) const
274{
275 // Do not compare to ourself.
276 if( aItem == this )
277 return false;
278
279 const SCH_JUNCTION* junction = dynamic_cast<const SCH_JUNCTION*>( aItem );
280
281 // Don't compare against a different SCH_ITEM.
282 wxCHECK( junction, false );
283
284 return GetPosition() != junction->GetPosition();
285}
286
287
288bool SCH_JUNCTION::doIsConnected( const VECTOR2I& aPosition ) const
289{
290 return m_pos == aPosition;
291}
292
293
294void SCH_JUNCTION::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
295 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
296{
297 if( aBackground )
298 return;
299
300 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
301 COLOR4D color = GetJunctionColor();
302
303 if( color == COLOR4D::UNSPECIFIED )
304 color = settings->GetLayerColor( GetLayer() );
305
306 if( color.m_text && Schematic() )
307 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
308
309 aPlotter->SetColor( color );
310
312}
313
314
319
320
321bool SCH_JUNCTION::operator <( const SCH_ITEM& aItem ) const
322{
323 if( Type() != aItem.Type() )
324 return Type() < aItem.Type();
325
326 if( GetLayer() != aItem.GetLayer() )
327 return GetLayer() < aItem.GetLayer();
328
329 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( &aItem );
330
331 if( GetPosition().x != junction->GetPosition().x )
332 return GetPosition().x < junction->GetPosition().x;
333
334 if( GetPosition().y != junction->GetPosition().y )
335 return GetPosition().y < junction->GetPosition().y;
336
337 if( GetDiameter() != junction->GetDiameter() )
338 return GetDiameter() < junction->GetDiameter();
339
340 return GetColor() < junction->GetColor();
341}
342
343
344void SCH_JUNCTION::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
345{
346 aList.emplace_back( _( "Junction" ), wxEmptyString );
347
348 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetEffectiveDiameter() ) );
349
350 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
352}
353
354
355bool SCH_JUNCTION::operator==( const SCH_ITEM& aOther ) const
356{
357 if( Type() != aOther.Type() )
358 return false;
359
360 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
361
362 if( m_pos != other.m_pos )
363 return false;
364
365 if( m_diameter != other.m_diameter )
366 return false;
367
368 if( m_color != other.m_color )
369 return false;
370
371 return true;
372}
373
374
375double SCH_JUNCTION::Similarity( const SCH_ITEM& aOther ) const
376{
377 if( m_Uuid == aOther.m_Uuid )
378 return 1.0;
379
380 if( aOther.Type() != Type() )
381 return 0.0;
382
383 const SCH_JUNCTION& other = static_cast<const SCH_JUNCTION&>( aOther );
384
385 double similarity = 1.0;
386
387 if( m_pos != other.m_pos )
388 similarity *= 0.9;
389
390 if( m_diameter != other.m_diameter )
391 similarity *= 0.9;
392
393 if( m_color != other.m_color )
394 similarity *= 0.9;
395
396 return similarity;
397}
398
399
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:123
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:995
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:399
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:96
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:597
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:606
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:396
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:233
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.
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:165
void SetLocked(bool aLocked) override
Definition sch_item.h:256
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:281
bool IsLocked() const override
Definition sch_item.cpp:158
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:556
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:345
bool IsConnectivityDirty() const
Definition sch_item.h:598
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:52
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:390
SCH_LAYER_ID m_layer
Definition sch_item.h:790
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().
#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:424
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:427
@ 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:471
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:517
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)
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:81
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:225
@ SCH_JUNCTION_T
Definition typeinfo.h:155
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683