KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_bus_entry.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) 2004 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 <bitmaps.h>
27#include <core/mirror.h>
28#include <schematic.h>
31#include <sch_bus_entry.h>
32#include <sch_edit_frame.h>
33#include <sch_junction.h>
34#include <sch_line.h>
38#include <netclass.h>
39#include <trigo.h>
40#include <board_item.h>
41#include <connection_graph.h>
42#include <api/api_enums.h>
43#include <api/api_utils.h>
44#include <api/schematic/schematic_types.pb.h>
45#include "sch_painter.h"
46#include "plotters/plotter.h"
47#include <properties/property.h>
49
50
51SCH_BUS_ENTRY_BASE::SCH_BUS_ENTRY_BASE( KICAD_T aType, const VECTOR2I& pos, bool aFlipY ) :
52 SCH_ITEM( nullptr, aType )
53{
54 m_pos = pos;
57
58 m_stroke.SetWidth( 0 );
59 m_stroke.SetLineStyle( LINE_STYLE::DEFAULT );
61
62 if( aFlipY )
63 m_size.y *= -1;
64
66
70}
71
72
83
84
87{
88 switch( aQuadrant )
89 {
90 case 1: m_size.x *= 1; m_size.y *= -1; break;
91 case 2: m_size.x *= 1; m_size.y *= 1; break;
92 case 3: m_size.x *= -1; m_size.y *= 1; break;
93 case 4: m_size.x *= -1; m_size.y *= -1; break;
94 default: wxFAIL_MSG( wxS( "SCH_BUS_WIRE_ENTRY ctor: unexpected quadrant" ) );
95 }
96
98 m_connected_bus_item = nullptr;
99
103}
104
105
117
118
119void SCH_BUS_ENTRY_BASE::Serialize( google::protobuf::Any& aContainer ) const
120{
121 using namespace kiapi::common;
122
123 kiapi::schematic::types::BusEntry entry;
124 types::StrokeAttributes* stroke = entry.mutable_stroke();
125
126 entry.mutable_id()->set_value( m_Uuid.AsStdString() );
127 PackVector2( *entry.mutable_position(), m_pos, schIUScale );
128 PackVector2( *entry.mutable_size(), m_size, schIUScale );
129 entry.set_locked( IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
130 entry.set_type( Type() == SCH_BUS_BUS_ENTRY_T ? kiapi::schematic::types::BET_BUS_TO_BUS
131 : kiapi::schematic::types::BET_WIRE_TO_BUS );
132
133 PackDistance( *stroke->mutable_width(), m_stroke.GetWidth(), schIUScale );
134 stroke->set_style( ToProtoEnum<LINE_STYLE, types::StrokeLineStyle>( m_stroke.GetLineStyle() ) );
135
136 if( m_stroke.GetColor() != COLOR4D::UNSPECIFIED )
137 PackColor( *stroke->mutable_color(), m_stroke.GetColor() );
138
139 aContainer.PackFrom( entry );
140}
141
142
143bool SCH_BUS_ENTRY_BASE::Deserialize( const google::protobuf::Any& aContainer )
144{
145 using namespace kiapi::common;
146
147 kiapi::schematic::types::BusEntry entry;
148
149 if( !aContainer.UnpackTo( &entry ) )
150 return false;
151
152 if( ( Type() == SCH_BUS_WIRE_ENTRY_T && entry.type() != kiapi::schematic::types::BET_WIRE_TO_BUS )
153 || ( Type() == SCH_BUS_BUS_ENTRY_T && entry.type() != kiapi::schematic::types::BET_BUS_TO_BUS ) )
154 {
155 return false;
156 }
157
158 const_cast<KIID&>( m_Uuid ) = KIID( entry.id().value() );
159 m_pos = UnpackVector2( entry.position(), schIUScale );
160 m_size = UnpackVector2( entry.size(), schIUScale );
161 SetLocked( entry.locked() == types::LockedState::LS_LOCKED );
162
163 m_stroke.SetWidth( UnpackDistance( entry.stroke().width(), schIUScale ) );
164 m_stroke.SetLineStyle( FromProtoEnum<LINE_STYLE, types::StrokeLineStyle>( entry.stroke().style() ) );
165
166 if( entry.stroke().has_color() )
167 m_stroke.SetColor( UnpackColor( entry.stroke().color() ) );
168 else
169 m_stroke.SetColor( COLOR4D::UNSPECIFIED );
170
171 SetLayer( entry.type() == kiapi::schematic::types::BET_BUS_TO_BUS ? LAYER_BUS : LAYER_WIRE );
172 return true;
173}
174
175
177{
178 return new SCH_BUS_WIRE_ENTRY( *this );
179}
180
181
183{
184 return new SCH_BUS_BUS_ENTRY( *this );
185}
186
187
188bool SCH_BUS_ENTRY_BASE::doIsConnected( const VECTOR2I& aPosition ) const
189{
190 return ( m_pos == aPosition || GetEnd() == aPosition );
191}
192
193
195{
196 return VECTOR2I( m_pos.x + m_size.x, m_pos.y + m_size.y );
197}
198
199
201{
202 SCH_BUS_ENTRY_BASE* item = dynamic_cast<SCH_BUS_ENTRY_BASE*>( aItem );
203 wxCHECK_RET( item, wxT( "Cannot swap bus entry data with invalid item." ) );
204
205 std::swap( m_pos, item->m_pos );
206 std::swap( m_size, item->m_size );
207 std::swap( m_stroke, item->m_stroke );
208
209 std::swap( m_lastResolvedWidth, item->m_lastResolvedWidth );
211 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
212}
213
214
222
223
225{
226 BOX2I bbox( m_pos );
227 bbox.SetEnd( GetEnd() );
228
229 bbox.Normalize();
230 bbox.Inflate( ( GetPenWidth() / 2 ) + 1 );
231
232 return bbox;
233}
234
235
245
246
248{
249 m_stroke.SetWidth( aWidth );
250 m_lastResolvedWidth = aWidth;
251}
252
253
255{
256 return m_lastResolvedWidth;
257}
258
259
261{
262 m_stroke.SetColor( aColor );
263 m_lastResolvedColor = aColor;
264}
265
266
276
277
279{
280 m_stroke.SetLineStyle( aStyle );
282}
283
284
286{
287 if( m_stroke.GetWidth() > 0 )
288 m_lastResolvedWidth = m_stroke.GetWidth();
289 else if( IsConnectable() && !IsConnectivityDirty() )
291
292 return m_lastResolvedWidth;
293}
294
295
297{
298 if( m_stroke.GetWidth() > 0 )
299 m_lastResolvedWidth = m_stroke.GetWidth();
300 else if( IsConnectable() && !IsConnectivityDirty() )
302
303 return m_lastResolvedWidth;
304}
305
306
307void SCH_BUS_WIRE_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
308{
310 aItemList.push_back( item );
311
312 DANGLING_END_ITEM item1( WIRE_ENTRY_END, this, GetEnd() );
313 aItemList.push_back( item1 );
314}
315
316
317void SCH_BUS_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
318{
320 aItemList.push_back( item );
321
322 DANGLING_END_ITEM item1( BUS_ENTRY_END, this, GetEnd() );
323 aItemList.push_back( item1 );
324}
325
326
328{
329 MIRROR( m_pos.y, aCenter );
330 m_size.y = -m_size.y;
331}
332
333
335{
336 MIRROR( m_pos.x, aCenter );
337 m_size.x = -m_size.x;
338}
339
340
341void SCH_BUS_ENTRY_BASE::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
342{
343 RotatePoint( m_pos, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
344 RotatePoint( &m_size.x, &m_size.y, aRotateCCW ? ANGLE_90 : ANGLE_270 );
345}
346
347
348bool SCH_BUS_WIRE_ENTRY::UpdateDanglingState( std::vector<DANGLING_END_ITEM>& aItemListByType,
349 std::vector<DANGLING_END_ITEM>& aItemListByPos,
350 const SCH_SHEET_PATH* aPath )
351{
352 bool previousStateStart = m_isStartDangling;
353 bool previousStateEnd = m_isEndDangling;
354
356
357 // Store the connection type and state for the start (0) and end (1)
358 bool has_wire[2] = { false };
359 bool has_bus[2] = { false };
360
361 for( unsigned ii = 0; ii < aItemListByType.size(); ii++ )
362 {
363 DANGLING_END_ITEM& item = aItemListByType[ii];
364
365 if( item.GetItem() == this )
366 continue;
367
368 switch( item.GetType() )
369 {
370 case WIRE_END:
371 if( m_pos == item.GetPosition() )
372 has_wire[0] = true;
373 else if( GetEnd() == item.GetPosition() )
374 has_wire[1] = true;
375
376 break;
377
378 case BUS_END:
379 {
380 // The bus has created 2 DANGLING_END_ITEMs, one per end.
381 DANGLING_END_ITEM& nextItem = aItemListByType[++ii];
382
383 if( IsPointOnSegment( item.GetPosition(), nextItem.GetPosition(), m_pos ) )
384 has_bus[0] = true;
385 else if( IsPointOnSegment( item.GetPosition(), nextItem.GetPosition(), GetEnd() ) )
386 has_bus[1] = true;
387 }
388 break;
389
390 default:
391 break;
392 }
393 }
394
395 // A bus-wire entry is connected at both ends if it has a bus and a wire on its
396 // ends. Otherwise, we connect only one end (in the case of a wire-wire or bus-bus)
397 if( ( has_wire[0] && has_bus[1] ) || ( has_wire[1] && has_bus[0] ) )
399 else if( has_wire[0] || has_bus[0] )
400 m_isStartDangling = false;
401 else if( has_wire[1] || has_bus[1] )
402 m_isEndDangling = false;
403
404 return (previousStateStart != m_isStartDangling) || (previousStateEnd != m_isEndDangling);
405}
406
407
408bool SCH_BUS_BUS_ENTRY::UpdateDanglingState( std::vector<DANGLING_END_ITEM>& aItemListByType,
409 std::vector<DANGLING_END_ITEM>& aItemListByPos,
410 const SCH_SHEET_PATH* aPath )
411{
412 bool previousStateStart = m_isStartDangling;
413 bool previousStateEnd = m_isEndDangling;
414
416
417 // TODO: filter using get_lower as we only use one item type
418 for( unsigned ii = 0; ii < aItemListByType.size(); ii++ )
419 {
420 DANGLING_END_ITEM& item = aItemListByType[ii];
421
422 if( item.GetItem() == this )
423 continue;
424
425 switch( item.GetType() )
426 {
427 case BUS_END:
428 {
429 // The bus has created 2 DANGLING_END_ITEMs, one per end.
430 DANGLING_END_ITEM& nextItem = aItemListByType[++ii];
431
432 if( IsPointOnSegment( item.GetPosition(), nextItem.GetPosition(), m_pos ) )
433 m_isStartDangling = false;
434
435 if( IsPointOnSegment( item.GetPosition(), nextItem.GetPosition(), GetEnd() ) )
436 m_isEndDangling = false;
437 }
438 break;
439
440 default:
441 break;
442 }
443 }
444
445 return (previousStateStart != m_isStartDangling) || (previousStateEnd != m_isEndDangling);
446}
447
448
453
454
455std::vector<VECTOR2I> SCH_BUS_ENTRY_BASE::GetConnectionPoints() const
456{
457 return { m_pos, GetEnd() };
458}
459
460
462 const SCH_SHEET_PATH* aInstance ) const
463{
464 // Do not compare to ourselves.
465 if( aItem == this )
466 return false;
467
468 const SCH_BUS_ENTRY_BASE* busEntry = dynamic_cast<const SCH_BUS_ENTRY_BASE*>( aItem );
469
470 // Don't compare against a different SCH_ITEM.
471 wxCHECK( busEntry, false );
472
473 if( GetPosition() != busEntry->GetPosition() )
474 return true;
475
476 return GetEnd() != busEntry->GetEnd();
477}
478
479
480wxString SCH_BUS_WIRE_ENTRY::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
481{
482 return wxString( _( "Bus to wire entry" ) );
483}
484
485
486wxString SCH_BUS_BUS_ENTRY::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
487{
488 return wxString( _( "Bus to bus entry" ) );
489}
490
491
496
497
502
503
504bool SCH_BUS_ENTRY_BASE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
505{
506 // Insure minimum accuracy
507 if( aAccuracy == 0 )
508 aAccuracy = ( GetPenWidth() / 2 ) + 4;
509
510 return TestSegmentHit( aPosition, m_pos, GetEnd(), aAccuracy );
511}
512
513
514bool SCH_BUS_ENTRY_BASE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
515{
516 BOX2I rect = aRect;
517
518 rect.Inflate( aAccuracy );
519
520 if( aContained )
521 return rect.Contains( GetBoundingBox() );
522
523 return rect.Intersects( GetBoundingBox() );
524}
525
526
527bool SCH_BUS_ENTRY_BASE::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
528{
530 return KIGEOM::ShapeHitTest( aPoly, line, aContained );
531}
532
533
534void SCH_BUS_ENTRY_BASE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
535 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
536{
537 if( aBackground )
538 return;
539
540 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
541
543 ? renderSettings->GetLayerColor( m_layer ) : GetBusEntryColor();
544
545 if( color.m_text && Schematic() )
546 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
547
548 int penWidth = ( GetPenWidth() == 0 ) ? renderSettings->GetDefaultPenWidth() : GetPenWidth();
549
550 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
551
552 aPlotter->SetCurrentLineWidth( penWidth );
553 aPlotter->SetColor( color );
554 aPlotter->SetDash( penWidth, GetEffectiveLineStyle() );
555 aPlotter->MoveTo( m_pos );
556 aPlotter->FinishTo( GetEnd() );
557
558 aPlotter->SetDash( penWidth, LINE_STYLE::SOLID );
559}
560
561
563 std::vector<MSG_PANEL_ITEM>& aList )
564{
565 wxString msg;
566
567 switch( GetLayer() )
568 {
569 default:
570 case LAYER_WIRE: msg = _( "Wire" ); break;
571 case LAYER_BUS: msg = _( "Bus" ); break;
572 }
573
574 aList.emplace_back( _( "Bus Entry Type" ), msg );
575
576 SCH_CONNECTION* conn = nullptr;
577
578 if( !IsConnectivityDirty() && dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
579 conn = Connection();
580
581 if( conn )
582 {
583 conn->AppendInfoToMsgPanel( aList );
584
585 if( !conn->IsBus() )
586 aList.emplace_back( _( "Resolved Netclass" ),
587 GetEffectiveNetClass()->GetHumanReadableName() );
588 }
589}
590
591
592bool SCH_BUS_ENTRY_BASE::operator <( const SCH_ITEM& aItem ) const
593{
594 if( Type() != aItem.Type() )
595 return Type() < aItem.Type();
596
597 auto symbol = static_cast<const SCH_BUS_ENTRY_BASE*>( &aItem );
598
599 if( GetLayer() != symbol->GetLayer() )
600 return GetLayer() < symbol->GetLayer();
601
602 if( GetPosition().x != symbol->GetPosition().x )
603 return GetPosition().x < symbol->GetPosition().x;
604
605 if( GetPosition().y != symbol->GetPosition().y )
606 return GetPosition().y < symbol->GetPosition().y;
607
608 if( GetEnd().x != symbol->GetEnd().x )
609 return GetEnd().x < symbol->GetEnd().x;
610
611 return GetEnd().y < symbol->GetEnd().y;
612}
613
614
616{
617 // Don't generate connections between bus entries and buses, since there is
618 // a connectivity change at that point (e.g. A[7..0] to A7)
619 if( ( aItem->Type() == SCH_LINE_T ) &&
620 ( static_cast<const SCH_LINE*>( aItem )->GetLayer() == LAYER_BUS ) )
621 {
622 return false;
623 }
624
625 // Same for bus junctions
626 if( ( aItem->Type() == SCH_JUNCTION_T ) &&
627 ( static_cast<const SCH_JUNCTION*>( aItem )->GetLayer() == LAYER_BUS_JUNCTION ) )
628 {
629 return false;
630 }
631
632 // Don't generate connections between bus entries and bus labels that happen
633 // to land at the same point on the bus wire as this bus entry
634 if( ( aItem->Type() == SCH_LABEL_T ) &&
635 SCH_CONNECTION::IsBusLabel( static_cast<const SCH_LABEL*>( aItem )->GetText() ) )
636 {
637 return false;
638 }
639
640 // Don't generate connections between two bus-wire entries
641 if( aItem->Type() == SCH_BUS_WIRE_ENTRY_T )
642 return false;
643
644 return true;
645}
646
647bool SCH_BUS_ENTRY_BASE::operator==( const SCH_ITEM& aItem ) const
648{
649 if( Type() != aItem.Type() )
650 return false;
651
652 const SCH_BUS_ENTRY_BASE* symbol = static_cast<const SCH_BUS_ENTRY_BASE*>( &aItem );
653
654 if( GetLayer() != symbol->GetLayer() )
655 return false;
656
657 if( GetPosition() != symbol->GetPosition() )
658 return false;
659
660 if( GetEnd() != symbol->GetEnd() )
661 return false;
662
663 return true;
664}
665
666
667double SCH_BUS_ENTRY_BASE::Similarity( const SCH_ITEM& aItem ) const
668{
669 if( aItem.Type() != Type() )
670 return 0.0;
671
672 if( m_Uuid == aItem.m_Uuid )
673 return 1.0;
674
675 const SCH_BUS_ENTRY_BASE& other = static_cast<const SCH_BUS_ENTRY_BASE&>( aItem );
676
677 if( GetLayer() != other.GetLayer() )
678 return 0.0;
679
680 if( GetPosition() != other.GetPosition() )
681 return 0.0;
682
683 return 1.0;
684}
685
686
688{
690 {
698
700
701 if( wireLineStyleEnum.Choices().GetCount() == 0 )
702 {
703 wireLineStyleEnum.Map( WIRE_STYLE::DEFAULT, _HKI( "Default" ) )
704 .Map( WIRE_STYLE::SOLID, _HKI( "Solid" ) )
705 .Map( WIRE_STYLE::DASH, _HKI( "Dashed" ) )
706 .Map( WIRE_STYLE::DOT, _HKI( "Dotted" ) )
707 .Map( WIRE_STYLE::DASHDOT, _HKI( "Dash-Dot" ) )
708 .Map( WIRE_STYLE::DASHDOTDOT, _HKI( "Dash-Dot-Dot" ) );
709 }
710
713
714 propMgr.AddProperty( new PROPERTY<SCH_BUS_ENTRY_BASE, int>( _HKI( "Line Width" ),
717
720 }
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
Definition api_enums.cpp:44
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:127
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
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 BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:146
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr void SetEnd(coord_type x, coord_type y)
Definition box2.h:297
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
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
DANGLING_END_T GetType() const
Definition sch_item.h:133
EDA_ITEM * GetItem() const
Definition sch_item.h:131
VECTOR2I GetPosition() const
Definition sch_item.h:130
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:528
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:114
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:727
static ENUM_MAP< T > & Instance()
Definition property.h:721
wxPGChoices & Choices()
Definition property.h:770
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
std::shared_ptr< wxString > m_text
Definition color4d.h:399
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Definition kiid.h:48
int GetLineStyle() const
Definition netclass.h:231
int GetWireWidth() const
Definition netclass.h:201
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:216
int GetBusWidth() const
Definition netclass.h:209
Base plotter engine class.
Definition plotter.h:136
void MoveTo(const VECTOR2I &pos)
Definition plotter.h:308
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle)=0
void FinishTo(const VECTOR2I &pos)
Definition plotter.h:318
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
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.
Class for a bus to bus entry.
int GetPenWidth() const override
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
SCH_BUS_BUS_ENTRY(const VECTOR2I &pos=VECTOR2I(0, 0), bool aFlipY=false)
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test the schematic item to aItemList to check if it's dangling state has changed.
SCH_ITEM * m_connected_bus_items[2]
Pointer to the bus items (usually bus wires) connected to this bus-bus entry (either or both may be n...
Base class for a bus or wire entry.
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
double Similarity(const SCH_ITEM &aItem) const override
Return a measure of how likely the other object is to represent the same object.
VECTOR2I m_pos
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
LINE_STYLE m_lastResolvedLineStyle
COLOR4D GetBusEntryColor() const
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void SetBusEntryColor(const COLOR4D &aColor)
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
VECTOR2I GetPosition() const override
bool m_isEndDangling
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void SetPenWidth(int aWidth)
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 SetWireStyle(WIRE_STYLE aStyle)
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool operator==(const SCH_ITEM &aItem) const override
int m_lastResolvedWidth
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
void SetLineStyle(LINE_STYLE aStyle)
bool IsConnectable() const override
int GetPenWidth() const override
WIRE_STYLE GetWireStyle() const
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 GetEnd() const
bool IsDangling() const override
COLOR4D m_lastResolvedColor
STROKE_PARAMS m_stroke
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
VECTOR2I m_size
SCH_BUS_ENTRY_BASE(KICAD_T aType, const VECTOR2I &pos=VECTOR2I(0, 0), bool aFlipY=false)
LINE_STYLE GetEffectiveLineStyle() const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool m_isStartDangling
bool operator<(const SCH_ITEM &aItem) const override
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
Class for a wire to bus entry.
SCH_BUS_WIRE_ENTRY(const VECTOR2I &pos=VECTOR2I(0, 0), bool aFlipY=false)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
int GetPenWidth() const override
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test the schematic item to aItemList to check if it's dangling state has changed.
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
virtual bool ConnectionPropagatesTo(const EDA_ITEM *aItem) const override
Return true if this item should propagate connection info to aItem.
SCH_ITEM * m_connected_bus_item
Pointer to the bus item (usually a bus wire) connected to this bus-wire entry, if it is connected to ...
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.
static bool IsBusLabel(const wxString &aLabel)
Test if aLabel has a bus notation.
Schematic editor (Eeschema) main window.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:168
void SetLocked(bool aLocked) override
Definition sch_item.h:257
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:730
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:272
bool IsLocked() const override
Definition sch_item.cpp:152
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:527
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:345
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:344
bool IsConnectivityDirty() const
Definition sch_item.h:591
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:491
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:381
SCH_LAYER_ID m_layer
Definition sch_item.h:781
Segment description base class to describe items which have 2 end points (track, wire,...
Definition sch_line.h:42
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
#define DEFAULT_SCH_ENTRY_SIZE
The default text size in mils. (can be changed in preference menu)
#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
a few functions useful in geometry calculations.
@ LAYER_WIRE
Definition layer_ids.h:454
@ LAYER_NET_COLOR_HIGHLIGHT
Definition layer_ids.h:495
@ LAYER_BUS
Definition layer_ids.h:455
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:497
@ LAYER_BUS_JUNCTION
Definition layer_ids.h:500
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.
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: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)
static struct SCH_BUS_ENTRY_DESC _SCH_BUS_ENTRY_DESC
@ BUS_END
Definition sch_item.h:81
@ BUS_ENTRY_END
Definition sch_item.h:85
@ WIRE_END
Definition sch_item.h:80
@ WIRE_ENTRY_END
Definition sch_item.h:86
LINE_STYLE
Dashed line types.
SCH_BUS_ENTRY_DESC()
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
Definition trigo.cpp:175
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
bool IsPointOnSegment(const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.
Definition trigo.cpp:89
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:75
@ SCH_LINE_T
Definition typeinfo.h:164
@ SCH_LABEL_T
Definition typeinfo.h:168
@ SCH_BUS_BUS_ENTRY_T
Definition typeinfo.h:163
@ SCH_BUS_WIRE_ENTRY_T
Definition typeinfo.h:162
@ SCH_JUNCTION_T
Definition typeinfo.h:160
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687