From f37812f8986fc068bb4ce6300039e47bcc875bd6 Mon Sep 17 00:00:00 2001 From: Lorenzo Marcantonio Date: Mon, 1 Apr 2013 12:35:20 +0200 Subject: [PATCH] Refactoring: split in two the SCH_BUS_ENTRY class --- eeschema/busentry.cpp | 20 ++- eeschema/load_one_schematic_file.cpp | 9 +- eeschema/onleftclick.cpp | 16 ++- eeschema/onrightclick.cpp | 9 +- eeschema/operations_on_items_lists.cpp | 6 +- eeschema/sch_bus_entry.cpp | 164 +++++++++++++------------ eeschema/sch_bus_entry.h | 91 +++++++++----- eeschema/sch_collectors.cpp | 23 ++-- eeschema/sch_screen.cpp | 13 +- eeschema/schedit.cpp | 10 +- include/base_struct.h | 3 +- include/wxEeschemaStruct.h | 9 +- 12 files changed, 227 insertions(+), 146 deletions(-) diff --git a/eeschema/busentry.cpp b/eeschema/busentry.cpp index 2a198f3857..2066aba264 100644 --- a/eeschema/busentry.cpp +++ b/eeschema/busentry.cpp @@ -43,28 +43,36 @@ static int s_LastShape = '\\'; -SCH_BUS_ENTRY* SCH_EDIT_FRAME::CreateBusEntry( wxDC* aDC, int aType ) +SCH_BUS_BUS_ENTRY* SCH_EDIT_FRAME::CreateBusBusEntry( wxDC* aDC ) { SCH_SCREEN* screen = GetScreen(); // Create and place a new bus entry at cursor position - SCH_BUS_ENTRY* busEntry = new SCH_BUS_ENTRY( screen->GetCrossHairPosition(), s_LastShape, - aType ); + SCH_BUS_BUS_ENTRY* busEntry = new SCH_BUS_BUS_ENTRY( screen->GetCrossHairPosition(), s_LastShape ); busEntry->SetFlags( IS_NEW ); GetScreen()->SetCurItem( busEntry ); addCurrentItemToList( aDC ); return busEntry; } +SCH_BUS_WIRE_ENTRY* SCH_EDIT_FRAME::CreateBusWireEntry( wxDC* aDC ) +{ + SCH_SCREEN* screen = GetScreen(); + + // Create and place a new bus entry at cursor position + SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( screen->GetCrossHairPosition(), s_LastShape ); + busEntry->SetFlags( IS_NEW ); + GetScreen()->SetCurItem( busEntry ); + addCurrentItemToList( aDC ); + return busEntry; +} /* set the shape of BusEntry (shape = / or \ ) */ -void SCH_EDIT_FRAME::SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY* BusEntry, int entry_shape ) +void SCH_EDIT_FRAME::SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY_BASE* BusEntry, char entry_shape ) { if( BusEntry == NULL ) return; - - if( BusEntry->Type() != SCH_BUS_ENTRY_T ) { DisplayError( this, wxT( "SetBusEntryType: Bad StructType" ) ); return; diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index 05edd267b4..7d7a9be5ad 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -147,6 +147,7 @@ again." ); while( reader.ReadLine() ) { + itemLoaded = false; line = reader.Line(); item = NULL; @@ -167,6 +168,8 @@ again." ); itemLoaded = ReadSchemaDescr( &reader, msgDiag, aScreen ); else if( line[1] == 'B' ) item = new SCH_BITMAP(); + else if( line[1] == 'E' ) + itemLoaded = true; // The EOF marker break; case 'L': // Its a library item. @@ -178,7 +181,9 @@ again." ); break; case 'E': // Its a WIRE or BUS item. - item = new SCH_BUS_ENTRY(); + /* The bus entry can be represented by two different + * classes, so we need a factory function */ + itemLoaded = SCH_BUS_ENTRY_BASE::Load( reader, msgDiag, &item ); break; case 'C': // It is a connection item. @@ -220,6 +225,8 @@ again." ); if( item ) { + // Load it if it wasn't by a factory + if( !itemLoaded ) itemLoaded = item->Load( reader, msgDiag ); if( !itemLoaded ) diff --git a/eeschema/onleftclick.cpp b/eeschema/onleftclick.cpp index 1fcd2085b9..067db61625 100644 --- a/eeschema/onleftclick.cpp +++ b/eeschema/onleftclick.cpp @@ -70,7 +70,8 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) case SCH_TEXT_T: case SCH_SHEET_PIN_T: case SCH_SHEET_T: - case SCH_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: + case SCH_BUS_BUS_ENTRY_T: case SCH_JUNCTION_T: case SCH_COMPONENT_T: case SCH_FIELD_T: @@ -157,11 +158,20 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) break; case ID_WIRETOBUS_ENTRY_BUTT: + if( ( item == NULL ) || ( item->GetFlags() == 0 ) ) + { + CreateBusWireEntry( aDC ); + m_canvas->SetAutoPanRequest( true ); + } + else + { + addCurrentItemToList( aDC ); + } + break; case ID_BUSTOBUS_ENTRY_BUTT: if( ( item == NULL ) || ( item->GetFlags() == 0 ) ) { - CreateBusEntry( aDC, ( GetToolId() == ID_WIRETOBUS_ENTRY_BUTT ) ? - WIRE_TO_BUS : BUS_TO_BUS ); + CreateBusBusEntry( aDC ); m_canvas->SetAutoPanRequest( true ); } else diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 9f59ce816f..42e406b794 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -64,7 +64,7 @@ static void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ); static void AddMenusForComponentField( wxMenu* PopMenu, SCH_FIELD* Field ); static void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME* aFrame ); static void AddMenusForBitmap( wxMenu* aPopMenu, SCH_BITMAP * aBitmap ); -static void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY * aBusEntry ); +static void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE * aBusEntry ); @@ -219,8 +219,9 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) addJunctionMenuEntries( PopMenu, (SCH_JUNCTION*) item ); break; - case SCH_BUS_ENTRY_T: - AddMenusForBusEntry( PopMenu, (SCH_BUS_ENTRY*) item ); + case SCH_BUS_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: + AddMenusForBusEntry( PopMenu, dynamic_cast( item ) ); break; case SCH_MARKER_T: @@ -873,7 +874,7 @@ void AddMenusForBitmap( wxMenu* aPopMenu, SCH_BITMAP * aBitmap ) } } -void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY * aBusEntry ) +void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE* aBusEntry ) { wxString msg; if( !aBusEntry->GetFlags() ) diff --git a/eeschema/operations_on_items_lists.cpp b/eeschema/operations_on_items_lists.cpp index 943b514296..a080833d0a 100644 --- a/eeschema/operations_on_items_lists.cpp +++ b/eeschema/operations_on_items_lists.cpp @@ -31,7 +31,8 @@ void SetSchItemParent( SCH_ITEM* Struct, SCH_SCREEN* Screen ) case SCH_HIERARCHICAL_LABEL_T: case SCH_COMPONENT_T: case SCH_LINE_T: - case SCH_BUS_ENTRY_T: + case SCH_BUS_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: case SCH_SHEET_T: case SCH_MARKER_T: case SCH_NO_CONNECT_T: @@ -185,7 +186,8 @@ void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList, { case SCH_JUNCTION_T: case SCH_LINE_T: - case SCH_BUS_ENTRY_T: + case SCH_BUS_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: diff --git a/eeschema/sch_bus_entry.cpp b/eeschema/sch_bus_entry.cpp index b7c2c61e27..e792949410 100644 --- a/eeschema/sch_bus_entry.cpp +++ b/eeschema/sch_bus_entry.cpp @@ -42,80 +42,81 @@ #include -SCH_BUS_ENTRY::SCH_BUS_ENTRY( const wxPoint& pos, int shape, int id ) : - SCH_ITEM( NULL, SCH_BUS_ENTRY_T ) +SCH_BUS_ENTRY_BASE::SCH_BUS_ENTRY_BASE( KICAD_T aType, const wxPoint& pos, char shape ) : + SCH_ITEM( NULL, aType ) { m_pos = pos; m_size.x = 100; m_size.y = 100; - m_Layer = LAYER_WIRE; - m_width = 0; - - if( id == BUS_TO_BUS ) - { - m_Layer = LAYER_BUS; - } if( shape == '/' ) m_size.y = -100; } - -EDA_ITEM* SCH_BUS_ENTRY::Clone() const +SCH_BUS_WIRE_ENTRY::SCH_BUS_WIRE_ENTRY( const wxPoint& pos, char shape ) : + SCH_BUS_ENTRY_BASE( SCH_BUS_WIRE_ENTRY_T, pos, shape ) { - return new SCH_BUS_ENTRY( *this ); + m_Layer = LAYER_WIRE; +} + +SCH_BUS_BUS_ENTRY::SCH_BUS_BUS_ENTRY( const wxPoint& pos, char shape ) : + SCH_BUS_ENTRY_BASE( SCH_BUS_BUS_ENTRY_T, pos, shape ) +{ + m_Layer = LAYER_BUS; +} + +EDA_ITEM* SCH_BUS_WIRE_ENTRY::Clone() const +{ + return new SCH_BUS_WIRE_ENTRY( *this ); +} + +EDA_ITEM* SCH_BUS_BUS_ENTRY::Clone() const +{ + return new SCH_BUS_BUS_ENTRY( *this ); } -wxPoint SCH_BUS_ENTRY::m_End() const +wxPoint SCH_BUS_ENTRY_BASE::m_End() const { return wxPoint( m_pos.x + m_size.x, m_pos.y + m_size.y ); } -void SCH_BUS_ENTRY::SwapData( SCH_ITEM* aItem ) +void SCH_BUS_ENTRY_BASE::SwapData( SCH_ITEM* aItem ) { - wxCHECK_RET( (aItem != NULL) && (aItem->Type() == SCH_BUS_ENTRY_T), - wxT( "Cannot swap bus entry data with invalid item." ) ); + SCH_BUS_ENTRY_BASE* item = dynamic_cast( aItem ); + wxCHECK_RET( item, wxT( "Cannot swap bus entry data with invalid item." ) ); - SCH_BUS_ENTRY* item = (SCH_BUS_ENTRY*)aItem; EXCHG( m_pos, item->m_pos ); EXCHG( m_size, item->m_size ); - EXCHG( m_width, item->m_width ); } -bool SCH_BUS_ENTRY::Save( FILE* aFile ) const +bool SCH_BUS_WIRE_ENTRY::Save( FILE* aFile ) const { - bool success = true; - - const char* layer = "Wire"; - const char* width = "Line"; - - if( GetLayer() == LAYER_BUS ) - { - layer = "Bus"; width = "Bus"; - } - - if( fprintf( aFile, "Entry %s %s\n", layer, width ) == EOF ) - { - success = false; - } - if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", + if( fprintf( aFile, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n", m_pos.x, m_pos.y, m_End().x, m_End().y ) == EOF ) - { - success = false; - } - - return success; + return false; + return true; } -bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg ) +bool SCH_BUS_BUS_ENTRY::Save( FILE* aFile ) const +{ + if( fprintf( aFile, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n", + m_pos.x, m_pos.y, m_End().x, m_End().y ) == EOF ) + return false; + return true; +} + + +bool SCH_BUS_ENTRY_BASE::Load( LINE_READER& aLine, wxString& aErrorMsg, + SCH_ITEM **out ) { char Name1[256]; char Name2[256]; char* line = (char*) aLine; + *out = NULL; while( (*line != ' ' ) && *line ) line++; @@ -128,13 +129,16 @@ bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg ) return false; } - m_Layer = LAYER_WIRE; - + SCH_BUS_ENTRY_BASE *this_new; if( Name1[0] == 'B' ) - m_Layer = LAYER_BUS; + this_new = new SCH_BUS_BUS_ENTRY; + else + this_new = new SCH_BUS_WIRE_ENTRY; + *out = this_new; - if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", &m_pos.x, &m_pos.y, - &m_size.x, &m_size.y ) != 4 ) + if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", + &this_new->m_pos.x, &this_new->m_pos.y, + &this_new->m_size.x, &this_new->m_size.y ) != 4 ) { aErrorMsg.Printf( wxT( "Eeschema file bus entry load error at line %d" ), aLine.LineNumber() ); @@ -142,14 +146,14 @@ bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg ) return false; } - m_size.x -= m_pos.x; - m_size.y -= m_pos.y; + this_new->m_size.x -= this_new->m_pos.x; + this_new->m_size.y -= this_new->m_pos.y; return true; } -EDA_RECT SCH_BUS_ENTRY::GetBoundingBox() const +EDA_RECT SCH_BUS_ENTRY_BASE::GetBoundingBox() const { EDA_RECT box; @@ -157,27 +161,25 @@ EDA_RECT SCH_BUS_ENTRY::GetBoundingBox() const box.SetEnd( m_End() ); box.Normalize(); - int width = ( m_width == 0 ) ? GetDefaultLineThickness() : m_width; - box.Inflate( width / 2 ); + box.Inflate( GetPenSize() / 2 ); return box; } -int SCH_BUS_ENTRY::GetPenSize() const +int SCH_BUS_WIRE_ENTRY::GetPenSize() const { - int pensize = ( m_width == 0 ) ? GetDefaultLineThickness() : m_width; - - if( m_Layer == LAYER_BUS ) - { - pensize = ( m_width == 0 ) ? GetDefaultBusThickness() : m_width; - } - - return pensize; + return GetDefaultLineThickness(); } -void SCH_BUS_ENTRY::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, +int SCH_BUS_BUS_ENTRY::GetPenSize() const +{ + return GetDefaultBusThickness(); +} + + +void SCH_BUS_ENTRY_BASE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, GR_DRAWMODE aDrawMode, EDA_COLOR_T aColor ) { EDA_COLOR_T color; @@ -194,7 +196,7 @@ void SCH_BUS_ENTRY::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOff } -void SCH_BUS_ENTRY::MirrorX( int aXaxis_position ) +void SCH_BUS_ENTRY_BASE::MirrorX( int aXaxis_position ) { m_pos.y -= aXaxis_position; NEGATE( m_pos.y ); @@ -203,7 +205,7 @@ void SCH_BUS_ENTRY::MirrorX( int aXaxis_position ) } -void SCH_BUS_ENTRY::MirrorY( int aYaxis_position ) +void SCH_BUS_ENTRY_BASE::MirrorY( int aYaxis_position ) { m_pos.x -= aYaxis_position; NEGATE( m_pos.x ); @@ -212,14 +214,14 @@ void SCH_BUS_ENTRY::MirrorY( int aYaxis_position ) } -void SCH_BUS_ENTRY::Rotate( wxPoint aPosition ) +void SCH_BUS_ENTRY_BASE::Rotate( wxPoint aPosition ) { RotatePoint( &m_pos, aPosition, 900 ); RotatePoint( &m_size.x, &m_size.y, 900 ); } -void SCH_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList ) +void SCH_BUS_ENTRY_BASE::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList ) { DANGLING_END_ITEM item( ENTRY_END, this, m_pos ); aItemList.push_back( item ); @@ -229,44 +231,47 @@ void SCH_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList ) } -bool SCH_BUS_ENTRY::IsSelectStateChanged( const wxRect& aRect ) +bool SCH_BUS_ENTRY_BASE::IsSelectStateChanged( const wxRect& aRect ) { bool previousState = IsSelected(); // If either end of the bus entry is inside the selection rectangle, the entire // bus entry is selected. Bus entries have a fixed length and angle. if( aRect.Contains( m_pos ) || aRect.Contains( m_End() ) ) - m_Flags |= SELECTED; + SetFlags( SELECTED ); else - m_Flags &= ~SELECTED; + ClearFlags( SELECTED ); return previousState != IsSelected(); } -void SCH_BUS_ENTRY::GetConnectionPoints( vector< wxPoint >& aPoints ) const +void SCH_BUS_ENTRY_BASE::GetConnectionPoints( vector< wxPoint >& aPoints ) const { aPoints.push_back( m_pos ); aPoints.push_back( m_End() ); } -wxString SCH_BUS_ENTRY::GetSelectMenuText() const +wxString SCH_BUS_WIRE_ENTRY::GetSelectMenuText() const { - if( m_Layer == LAYER_WIRE ) return wxString( _( "Bus to Wire Entry" ) ); +} + +wxString SCH_BUS_BUS_ENTRY::GetSelectMenuText() const +{ return wxString( _( "Bus to Bus Entry" ) ); } -bool SCH_BUS_ENTRY::HitTest( const wxPoint& aPosition, int aAccuracy ) const +bool SCH_BUS_ENTRY_BASE::HitTest( const wxPoint& aPosition, int aAccuracy ) const { return TestSegmentHit( aPosition, m_pos, m_End(), aAccuracy ); } -bool SCH_BUS_ENTRY::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) const +bool SCH_BUS_ENTRY_BASE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) const { EDA_RECT rect = aRect; @@ -279,7 +284,7 @@ bool SCH_BUS_ENTRY::HitTest( const EDA_RECT& aRect, bool aContained, int aAccura } -void SCH_BUS_ENTRY::Plot( PLOTTER* aPlotter ) +void SCH_BUS_ENTRY_BASE::Plot( PLOTTER* aPlotter ) { aPlotter->SetCurrentLineWidth( GetPenSize() ); aPlotter->SetColor( ReturnLayerColor( GetLayer() ) ); @@ -291,7 +296,7 @@ void SCH_BUS_ENTRY::Plot( PLOTTER* aPlotter ) * Set the shape of the bus entry. * aShape = ascii code '/' or '\' */ -void SCH_BUS_ENTRY::SetBusEntryShape( int aShape ) +void SCH_BUS_ENTRY_BASE::SetBusEntryShape( char aShape ) { switch( aShape ) { @@ -311,12 +316,11 @@ void SCH_BUS_ENTRY::SetBusEntryShape( int aShape ) /* GetBusEntryShape: * return the shape of the bus entry, as an ascii code '/' or '\' */ -int SCH_BUS_ENTRY::GetBusEntryShape() const +char SCH_BUS_ENTRY_BASE::GetBusEntryShape() const { - int shape = '\\'; - if( GetSize().y < 0 ) - shape = '/'; - - return shape; + return '/'; + else + return '\\'; } + diff --git a/eeschema/sch_bus_entry.h b/eeschema/sch_bus_entry.h index 9ad33c8d42..4eb3bd1938 100644 --- a/eeschema/sch_bus_entry.h +++ b/eeschema/sch_bus_entry.h @@ -33,33 +33,23 @@ #include -/* Flags for BUS ENTRY (bus to bus or wire to bus */ -#define WIRE_TO_BUS 0 -#define BUS_TO_BUS 1 - - /** - * Class SCH_BUS_ENTRY + * Class SCH_BUS_ENTRY_BASE * - * Defines a bus or wire entry. + * Base class for a bus or wire entry. */ -class SCH_BUS_ENTRY : public SCH_ITEM +class SCH_BUS_ENTRY_BASE : public SCH_ITEM { +protected: wxPoint m_pos; - int m_width; wxSize m_size; public: - SCH_BUS_ENTRY( const wxPoint& pos = wxPoint( 0, 0 ), int shape = '\\', int id = WIRE_TO_BUS ); + SCH_BUS_ENTRY_BASE( KICAD_T aType, const wxPoint& pos = wxPoint( 0, 0 ), char shape = '\\' ); // Do not create a copy constructor. The one generated by the compiler is adequate. - ~SCH_BUS_ENTRY() { } - - wxString GetClass() const - { - return wxT( "SCH_BUS_ENTRY" ); - } + ~SCH_BUS_ENTRY_BASE() { } wxPoint m_End() const; @@ -67,17 +57,13 @@ public: * function GetBusEntryShape * @return the shape of the bus entry, as an ascii code '/' or '\' */ - int GetBusEntryShape() const; + char GetBusEntryShape() const; /** * function SetBusEntryShape * @param aShape = the shape of the bus entry, as an ascii code '/' or '\' */ - void SetBusEntryShape( int aShape ); - - int GetWidth() const { return m_width; } - - void SetWidth( int aWidth ) { m_width = aWidth; } + void SetBusEntryShape( char aShape ); wxSize GetSize() const { return m_size; } @@ -88,14 +74,10 @@ public: void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, GR_DRAWMODE aDrawMode, EDA_COLOR_T aColor = UNSPECIFIED_COLOR ); - bool Save( FILE* aFile ) const; - - bool Load( LINE_READER& aLine, wxString& aErrorMsg ); + static bool Load( LINE_READER& aLine, wxString& aErrorMsg, SCH_ITEM **out ); EDA_RECT GetBoundingBox() const; - int GetPenSize() const; - void Move( const wxPoint& aMoveVector ) { m_pos += aMoveVector; @@ -116,8 +98,6 @@ public: void GetConnectionPoints( vector< wxPoint >& aPoints ) const; - wxString GetSelectMenuText() const; - BITMAP_DEF GetMenuImage() const { return add_entry_xpm; } wxPoint GetPosition() const { return m_pos; } @@ -130,12 +110,61 @@ public: void Plot( PLOTTER* aPlotter ); - EDA_ITEM* Clone() const; - #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override #endif }; +/** + * Class SCH_BUS_WIRE_ENTRY + * + * Class for a wire to bus entry. + */ +class SCH_BUS_WIRE_ENTRY : public SCH_BUS_ENTRY_BASE +{ +public: + SCH_BUS_WIRE_ENTRY( const wxPoint& pos = wxPoint( 0, 0 ), char shape = '\\' ); + + ~SCH_BUS_WIRE_ENTRY() { } + + wxString GetClass() const + { + return wxT( "SCH_BUS_WIRE_ENTRY" ); + } + + bool Save( FILE* aFile ) const; + + int GetPenSize() const; + + wxString GetSelectMenuText() const; + + EDA_ITEM* Clone() const; +}; + +/** + * Class SCH_BUS_WIRE_ENTRY + * + * Class for a bus to bus entry. + */ +class SCH_BUS_BUS_ENTRY : public SCH_BUS_ENTRY_BASE +{ +public: + SCH_BUS_BUS_ENTRY( const wxPoint& pos = wxPoint( 0, 0 ), char shape = '\\' ); + + ~SCH_BUS_BUS_ENTRY() { } + + wxString GetClass() const + { + return wxT( "SCH_BUS_BUS_ENTRY" ); + } + + bool Save( FILE* aFile ) const; + + int GetPenSize() const; + + wxString GetSelectMenuText() const; + + EDA_ITEM* Clone() const; +}; #endif // _SCH_BUS_ENTRY_H_ diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index 62bc97dbbf..1d672670bf 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -33,13 +33,15 @@ #include #include #include +#include const KICAD_T SCH_COLLECTOR::AllItems[] = { SCH_MARKER_T, SCH_JUNCTION_T, SCH_NO_CONNECT_T, - SCH_BUS_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, SCH_LINE_T, SCH_BITMAP_T, SCH_TEXT_T, @@ -59,7 +61,8 @@ const KICAD_T SCH_COLLECTOR::AllItemsButPins[] = { SCH_MARKER_T, SCH_JUNCTION_T, SCH_NO_CONNECT_T, - SCH_BUS_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, SCH_LINE_T, SCH_BITMAP_T, SCH_TEXT_T, @@ -107,7 +110,8 @@ const KICAD_T SCH_COLLECTOR::MovableItems[] = { SCH_MARKER_T, SCH_JUNCTION_T, SCH_NO_CONNECT_T, - SCH_BUS_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, // SCH_LINE_T, SCH_BITMAP_T, SCH_TEXT_T, @@ -124,7 +128,8 @@ const KICAD_T SCH_COLLECTOR::MovableItems[] = { const KICAD_T SCH_COLLECTOR::DraggableItems[] = { SCH_JUNCTION_T, - SCH_BUS_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, SCH_LINE_T, SCH_LABEL_T, SCH_GLOBAL_LABEL_T, @@ -152,7 +157,8 @@ const KICAD_T SCH_COLLECTOR::ParentItems[] = { SCH_MARKER_T, SCH_JUNCTION_T, SCH_NO_CONNECT_T, - SCH_BUS_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, SCH_LINE_T, SCH_TEXT_T, SCH_LABEL_T, @@ -241,13 +247,16 @@ bool SCH_COLLECTOR::IsCorner() const if( GetCount() != 2 ) return false; + bool is_busentry0 = dynamic_cast( m_List[0] ); + bool is_busentry1 = dynamic_cast( m_List[1] ); + if( (m_List[0]->Type() == SCH_LINE_T) && (m_List[1]->Type() == SCH_LINE_T) ) return true; - if( (m_List[0]->Type() == SCH_LINE_T) && (m_List[1]->Type() == SCH_BUS_ENTRY_T) ) + if( (m_List[0]->Type() == SCH_LINE_T) && is_busentry1 ) return true; - if( (m_List[0]->Type() == SCH_BUS_ENTRY_T) && (m_List[1]->Type() == SCH_LINE_T) ) + if( is_busentry0 && (m_List[1]->Type() == SCH_LINE_T) ) return true; return false; diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index fae91ce1bb..2617401a5d 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -394,7 +394,10 @@ bool SCH_SCREEN::IsTerminalPoint( const wxPoint& aPosition, int aLayer ) break; case LAYER_WIRE: - if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_BUS_ENTRY_T ) ) + if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_BUS_WIRE_ENTRY_T) ) + return true; + + if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_BUS_BUS_ENTRY_T) ) return true; if( GetItem( aPosition, std::max( GetDefaultLineThickness(), 3 ), SCH_JUNCTION_T ) ) @@ -958,13 +961,15 @@ bool SCH_SCREEN::BreakSegmentsOnJunctions() if( BreakSegment( junction->GetPosition() ) ) brokenSegments = true; } - else if( item->Type() == SCH_BUS_ENTRY_T ) + else + { + SCH_BUS_ENTRY_BASE* busEntry = dynamic_cast( item ); + if( busEntry ) { - SCH_BUS_ENTRY* busEntry = ( SCH_BUS_ENTRY* ) item; - if( BreakSegment( busEntry->GetPosition() ) || BreakSegment( busEntry->m_End() ) ) brokenSegments = true; + } } } diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index a2f4f9c6d4..605c28cbfc 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -137,12 +137,12 @@ void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_SCH_ENTRY_SELECT_SLASH: m_canvas->MoveCursorToCrossHair(); - SetBusEntryShape( &dc, (SCH_BUS_ENTRY*) item, '/' ); + SetBusEntryShape( &dc, dynamic_cast( item ), '/' ); break; case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH: m_canvas->MoveCursorToCrossHair(); - SetBusEntryShape( &dc, (SCH_BUS_ENTRY*) item, '\\' ); + SetBusEntryShape( &dc, dynamic_cast( item ), '\\' ); break; case ID_POPUP_CANCEL_CURRENT_COMMAND: @@ -417,7 +417,8 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent ) case SCH_JUNCTION_T: case SCH_NO_CONNECT_T: - case SCH_BUS_ENTRY_T: + case SCH_BUS_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: @@ -939,7 +940,8 @@ void SCH_EDIT_FRAME::OnDragItem( wxCommandEvent& aEvent ) switch( item->Type() ) { - case SCH_BUS_ENTRY_T: + case SCH_BUS_BUS_ENTRY_T: + case SCH_BUS_WIRE_ENTRY_T: case SCH_LINE_T: case SCH_JUNCTION_T: if( item->GetLayer() == LAYER_BUS ) diff --git a/include/base_struct.h b/include/base_struct.h index 0c0db083d5..40eb7fcaff 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -82,7 +82,8 @@ enum KICAD_T { SCH_MARKER_T, SCH_JUNCTION_T, SCH_NO_CONNECT_T, - SCH_BUS_ENTRY_T, + SCH_BUS_WIRE_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, SCH_LINE_T, SCH_BITMAP_T, SCH_TEXT_T, diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 921dd26ec0..728cc3795f 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -48,7 +48,9 @@ class CMP_LIBRARY; class LIB_COMPONENT; class LIB_DRAW_ITEM; class EDA_ITEM; -class SCH_BUS_ENTRY; +class SCH_BUS_ENTRY_BASE; +class SCH_BUS_WIRE_ENTRY; +class SCH_BUS_BUS_ENTRY; class SCH_GLOBALLABEL; class SCH_TEXT; class SCH_BITMAP; @@ -811,8 +813,9 @@ private: void UpdateTitle(); // Bus Entry - SCH_BUS_ENTRY* CreateBusEntry( wxDC* DC, int entry_type ); - void SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY* BusEntry, int entry_type ); + SCH_BUS_WIRE_ENTRY* CreateBusWireEntry( wxDC* DC ); + SCH_BUS_BUS_ENTRY* CreateBusBusEntry( wxDC* DC ); + void SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY_BASE* BusEntry, char entry_shape ); /** * Function AddNoConnect