From 8123d3a5eb2b3cb23e949488593a20ad6dbb8c3c Mon Sep 17 00:00:00 2001 From: charras Date: Tue, 15 Apr 2008 19:38:19 +0000 Subject: [PATCH] see changelog --- change_log.txt | 11 + common/base_screen.cpp | 2 +- common/class_drawpickedstruct.cpp | 16 + eeschema/CMakeLists.txt | 5 +- eeschema/block.cpp | 34 +- eeschema/bus-wire-junction.cpp | 2 +- eeschema/class_drawsheet.cpp | 334 ++++-------- eeschema/class_drawsheet.h | 41 +- eeschema/class_hierarchical_PIN_sheet.cpp | 201 ++++++++ ...cmpclass.cpp => class_schematic_items.cpp} | 243 +++++++-- eeschema/class_screen.cpp | 2 +- eeschema/class_screen.h | 7 + eeschema/class_text-label.cpp | 154 ++++-- eeschema/class_text-label.h | 33 ++ eeschema/cleanup.cpp | 2 +- eeschema/component_class.cpp | 315 ++++++++---- eeschema/component_class.h | 54 +- eeschema/dangling_ends.cpp | 4 +- eeschema/delete.cpp | 12 +- eeschema/dialog_build_BOM.cpp | 28 +- eeschema/divers.cpp | 30 -- eeschema/eecreate.cpp | 2 +- eeschema/eeload.cpp | 0 eeschema/eeredraw.cpp | 2 +- eeschema/load_one_schematic_file.cpp | 7 +- eeschema/locate.cpp | 14 +- eeschema/makefile.include | 6 +- eeschema/netlist.cpp | 6 +- eeschema/onleftclick.cpp | 4 +- eeschema/onrightclick.cpp | 10 +- eeschema/plot.cpp | 8 +- eeschema/plothpgl.cpp | 2 +- eeschema/plotps.cpp | 2 +- eeschema/program.h | 54 +- eeschema/protos.h | 4 +- eeschema/save_schemas.cpp | 474 ++++++++---------- eeschema/schedit.cpp | 6 +- eeschema/schematic_undo_redo.cpp | 6 +- eeschema/sheet.cpp | 8 +- eeschema/sheetlab.cpp | 44 +- include/base_struct.h | 2 +- include/sch_item_struct.h | 25 +- include/wxEeschemaStruct.h | 12 +- include/wxstruct.h | 2 +- pcbnew/class_board.cpp | 11 + 45 files changed, 1377 insertions(+), 864 deletions(-) create mode 100644 eeschema/class_hierarchical_PIN_sheet.cpp rename eeschema/{cmpclass.cpp => class_schematic_items.cpp} (59%) delete mode 100644 eeschema/divers.cpp delete mode 100644 eeschema/eeload.cpp diff --git a/change_log.txt b/change_log.txt index 2e954463e3..8243633192 100644 --- a/change_log.txt +++ b/change_log.txt @@ -5,6 +5,17 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2008-Apr-14 UPDATE Jean-Pierre Charras +================================================================================ ++eeschema + More code cleaning and Files cleaning and reorganization. + change DrawSheetLabelStruct class name to a better name: Hierarchical_PIN_Sheet_Struct + For simple Hierarchies, files are now compatables with old eescheam versions + In complex hierarchies, multiples parts per packages have still problems, + but i hope to solve that soon + (in fact all the last changes were made for that) + + 2008-Apr-14 UPDATE Jean-Pierre Charras ================================================================================ +eeschema diff --git a/common/base_screen.cpp b/common/base_screen.cpp index cf68b01515..27680c5e09 100644 --- a/common/base_screen.cpp +++ b/common/base_screen.cpp @@ -569,7 +569,7 @@ EDA_BaseStruct* BASE_SCREEN::GetItemFromRedoList() */ void BASE_SCREEN::Show( int nestLevel, std::ostream& os ) { - EDA_BaseStruct* item = EEDrawList; + EDA_BaseStruct* item = (EDA_BaseStruct*) EEDrawList; // @todo : use SCH_ITEM as type for item // for now, make it look like XML, expand on this later. NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << diff --git a/common/class_drawpickedstruct.cpp b/common/class_drawpickedstruct.cpp index dd9507e3e6..1057733d57 100644 --- a/common/class_drawpickedstruct.cpp +++ b/common/class_drawpickedstruct.cpp @@ -6,6 +6,22 @@ #include "common.h" #include "sch_item_struct.h" + +/* Constructor and destructor for SCH_ITEM */ +/* They are not inline because this creates problems with gcc at linking time + * in debug mode +*/ + +SCH_ITEM::SCH_ITEM( EDA_BaseStruct* aParent, KICAD_T aType ) : + EDA_BaseStruct( aParent, aType ) +{ + m_Layer = 0; +} + +SCH_ITEM::~SCH_ITEM() +{ +} + /**************************/ /* class DrawPickedStruct */ /**************************/ diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index b1e5c36e46..1470362951 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -13,10 +13,11 @@ set(EESCHEMA_SRCS busentry.cpp bus-wire-junction.cpp class_drawsheet.cpp + class_hierarchical_PIN_sheet.cpp class_screen.cpp class_text-label.cpp + class_schematic_items.cpp cleanup.cpp - cmpclass.cpp component_class.cpp controle.cpp cross-probing.cpp @@ -34,7 +35,6 @@ set(EESCHEMA_SRCS dialog_erc.cpp # dialog_find.cpp dialog_options.cpp -# divers.cpp edit_component_in_lib.cpp edit_component_in_schematic.cpp edit_label.cpp @@ -43,7 +43,6 @@ set(EESCHEMA_SRCS eelayer.cpp eelibs_draw_components.cpp eelibs_read_libraryfiles.cpp - eeload.cpp eeredraw.cpp eeschema.cpp eestring.cpp diff --git a/eeschema/block.cpp b/eeschema/block.cpp index e55325edf7..681e7e8758 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -607,7 +607,7 @@ void MirrorOneStruct( SCH_ITEM * DrawStruct, wxPoint& Center ) DrawBusEntryStruct* DrawRaccord; SCH_COMPONENT* DrawLibItem; DrawSheetStruct* DrawSheet; - DrawSheetLabelStruct* DrawSheetLabel; + Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; DrawMarkerStruct* DrawMarker; DrawNoConnectStruct* DrawNoConnect; SCH_TEXT* DrawText; @@ -728,13 +728,13 @@ void MirrorOneStruct( SCH_ITEM * DrawStruct, wxPoint& Center ) { MirrorYPoint( DrawSheetLabel->m_Pos, Center ); DrawSheetLabel->m_Edge = DrawSheetLabel->m_Edge ? 0 : 1; - DrawSheetLabel = (DrawSheetLabelStruct*) DrawSheetLabel->Pnext; + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawSheetLabel->Pnext; } break; - case DRAW_SHEETLABEL_STRUCT_TYPE: - DrawSheetLabel = (DrawSheetLabelStruct*) DrawStruct; + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawStruct; MirrorYPoint( DrawSheetLabel->m_Pos, Center ); break; @@ -876,7 +876,7 @@ static SCH_ITEM * CopyStruct( WinEDA_DrawPanel* panel, wxDC* DC, BASE_SCREEN* sc case TYPE_SCH_LABEL: case TYPE_SCH_GLOBALLABEL: case TYPE_SCH_HIERLABEL: - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_PICK_ITEM_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE: case DRAW_NOCONNECT_STRUCT_TYPE: @@ -929,12 +929,12 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, SCH_ITEM * DrawStruct ) if( !DrawStruct ) return; - if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) + if( DrawStruct->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) { /* Cette stucture est rattachee a une feuille, et n'est pas * accessible par la liste globale directement */ - frame->SaveCopyInUndoList( (SCH_ITEM*) ( (DrawSheetLabelStruct*) DrawStruct )->m_Parent, IS_CHANGED ); - frame->DeleteSheetLabel( DC, (DrawSheetLabelStruct*) DrawStruct ); + frame->SaveCopyInUndoList( (SCH_ITEM*) ( (Hierarchical_PIN_Sheet_Struct*) DrawStruct )->m_Parent, IS_CHANGED ); + frame->DeleteSheetLabel( DC, (Hierarchical_PIN_Sheet_Struct*) DrawStruct ); return; } @@ -1127,7 +1127,7 @@ bool PlaceStruct( BASE_SCREEN* screen, SCH_ITEM * DrawStruct ) case TYPE_SCH_HIERLABEL: case TYPE_SCH_COMPONENT: case DRAW_SHEET_STRUCT_TYPE: - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE: case DRAW_NOCONNECT_STRUCT_TYPE: MoveOneStruct( DrawStruct, move_vector ); @@ -1162,7 +1162,7 @@ void MoveOneStruct( SCH_ITEM * DrawStruct, const wxPoint& move_vector ) DrawBusEntryStruct* DrawRaccord; SCH_COMPONENT* DrawLibItem; DrawSheetStruct* DrawSheet; - DrawSheetLabelStruct* DrawSheetLabel; + Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; DrawMarkerStruct* DrawMarker; DrawNoConnectStruct* DrawNoConnect; @@ -1255,8 +1255,8 @@ void MoveOneStruct( SCH_ITEM * DrawStruct, const wxPoint& move_vector ) break; - case DRAW_SHEETLABEL_STRUCT_TYPE: - DrawSheetLabel = (DrawSheetLabelStruct*) DrawStruct; + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawStruct; DrawSheetLabel->m_Pos += move_vector; break; @@ -1356,7 +1356,7 @@ SCH_ITEM * DuplicateStruct( SCH_ITEM * DrawStruct ) break; } - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_PART_TEXT_STRUCT_TYPE: case SCREEN_STRUCT_TYPE: default: @@ -1467,12 +1467,12 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) if( Struct->Type() == DRAW_SHEET_STRUCT_TYPE ) { - DrawSheetLabelStruct* SLabel = ( (DrawSheetStruct*) Struct )->m_Label; + Hierarchical_PIN_Sheet_Struct* SLabel = ( (DrawSheetStruct*) Struct )->m_Label; while( SLabel ) { - if( SLabel->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) + if( SLabel->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) AddPickedItem( screen, SLabel->m_Pos ); - SLabel = (DrawSheetLabelStruct*) SLabel->Pnext; + SLabel = (Hierarchical_PIN_Sheet_Struct*) SLabel->Pnext; } } @@ -1611,7 +1611,7 @@ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position ) case DRAW_SHEET_STRUCT_TYPE: break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: break; case DRAW_PICK_ITEM_STRUCT_TYPE: diff --git a/eeschema/bus-wire-junction.cpp b/eeschema/bus-wire-junction.cpp index 69cf5d5337..f361553b98 100644 --- a/eeschema/bus-wire-junction.cpp +++ b/eeschema/bus-wire-junction.cpp @@ -789,7 +789,7 @@ static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer ) EDA_BaseStruct* item; LibDrawPin* pin; SCH_COMPONENT* LibItem = NULL; - DrawSheetLabelStruct* pinsheet; + Hierarchical_PIN_Sheet_Struct* pinsheet; wxPoint itempos; switch( layer ) diff --git a/eeschema/class_drawsheet.cpp b/eeschema/class_drawsheet.cpp index 1dd90f9a86..3b983bc880 100644 --- a/eeschema/class_drawsheet.cpp +++ b/eeschema/class_drawsheet.cpp @@ -1,14 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: DrawSheet.cpp -// Purpose: member functions for DrawSheetStruct and DrawSheetLabelStruct -// header = class_screen.h +// Name: class_drawsheet.cpp +// Purpose: member functions for DrawSheetStruct +// header = class_drawsheet.h // Author: jean-pierre Charras // Modified by: // Created: 08/02/2006 18:37:02 // RCS-ID: -// Copyright: License GNU -// Licence: +// Copyright: +// Licence: License GNU ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -56,11 +56,11 @@ DrawSheetStruct::DrawSheetStruct( const wxPoint& pos ) : DrawSheetStruct::~DrawSheetStruct() /**************************************/ { - DrawSheetLabelStruct* label = m_Label, * next_label; + Hierarchical_PIN_Sheet_Struct* label = m_Label, * next_label; while( label ) { - next_label = (DrawSheetLabelStruct*) label->Pnext; + next_label = label->Next(); delete label; label = next_label; } @@ -76,82 +76,66 @@ DrawSheetStruct::~DrawSheetStruct() } - /**********************************************/ -bool DrawSheetStruct::Save( FILE *f ) +bool DrawSheetStruct::Save( FILE* f ) const /***********************************************/ + /* Routine utilisee dans la routine precedente. - Assure la sauvegarde de la structure LibItemStruct -*/ + * Assure la sauvegarde de la structure LibItemStruct + */ { -int ii; -bool Failed = FALSE; -DrawSheetLabelStruct * SheetLabel; + bool Success = true; + Hierarchical_PIN_Sheet_Struct* SheetLabel; - fprintf(f, "$Sheet\n"); + fprintf( f, "$Sheet\n" ); - if (fprintf(f, "S %-4d %-4d %-4d %-4d\n", - m_Pos.x,m_Pos.y, - m_Size.x,m_Size.y) == EOF){ - Failed = TRUE; return(Failed); + if( fprintf( f, "S %-4d %-4d %-4d %-4d\n", + m_Pos.x, m_Pos.y, + m_Size.x, m_Size.y ) == EOF ) + { + Success = false; + return Success; } //save the unique timestamp, like other shematic parts. - if( fprintf(f, "U %8.8lX\n", m_TimeStamp) == EOF ){ - Failed = TRUE; return(Failed); + if( fprintf( f, "U %8.8lX\n", m_TimeStamp ) == EOF ) + { + Success = false; return Success; } /* Generation de la liste des 2 textes (sheetname et filename) */ - if ( ! m_SheetName.IsEmpty()) + if( !m_SheetName.IsEmpty() ) { - if(fprintf(f,"F0 \"%s\" %d\n", CONV_TO_UTF8(m_SheetName), m_SheetNameSize) == EOF) + if( fprintf( f, "F0 \"%s\" %d\n", CONV_TO_UTF8( m_SheetName ), m_SheetNameSize ) == EOF ) { - Failed = TRUE; return(Failed); + Success = false; return Success; } } - if( ! GetFileName().IsEmpty()) + if( !m_FileName.IsEmpty() ) { - if(fprintf(f,"F1 \"%s\" %d\n", CONV_TO_UTF8(GetFileName()), m_FileNameSize) == EOF) + if( fprintf( f, "F1 \"%s\" %d\n", CONV_TO_UTF8( m_FileName ), m_FileNameSize ) == EOF ) { - Failed = TRUE; return(Failed); + Success = false; return Success; } } /* Generation de la liste des labels (entrees) de la sous feuille */ - ii = 2; SheetLabel = m_Label; + int l_id = 2; while( SheetLabel != NULL ) { - int type = 'U', side = 'L'; - - if( SheetLabel->m_Text.IsEmpty() ) continue; - if( SheetLabel->m_Edge ) side = 'R'; - - switch(SheetLabel->m_Shape) - { - case NET_INPUT: type = 'I'; break; - case NET_OUTPUT: type = 'O'; break; - case NET_BIDI: type = 'B'; break; - case NET_TRISTATE: type = 'T'; break; - case NET_UNSPECIFIED: type = 'U'; break; - } - - if(fprintf(f,"F%d \"%s\" %c %c %-3d %-3d %-3d\n", ii, - CONV_TO_UTF8(SheetLabel->m_Text), type, side, - SheetLabel->m_Pos.x, SheetLabel->m_Pos.y, - SheetLabel->m_Size.x) == EOF) - { - Failed = TRUE; break; - } - ii++; - SheetLabel = (DrawSheetLabelStruct*)SheetLabel->Pnext; + SheetLabel->m_Number = l_id; + SheetLabel->Save( f ); + l_id++; + SheetLabel = SheetLabel->Next(); } - fprintf(f, "$EndSheet\n"); - return(Failed); + fprintf( f, "$EndSheet\n" ); + return Success; } + /***********************************************/ DrawSheetStruct* DrawSheetStruct::GenCopy() /***********************************************/ @@ -174,7 +158,7 @@ DrawSheetStruct* DrawSheetStruct::GenCopy() newitem->m_Label = NULL; - DrawSheetLabelStruct* Slabel = NULL, * label = m_Label; + Hierarchical_PIN_Sheet_Struct* Slabel = NULL, * label = m_Label; if( label ) { @@ -186,7 +170,7 @@ DrawSheetStruct* DrawSheetStruct::GenCopy() while( label ) { Slabel->Pnext = label->GenCopy(); - Slabel = (DrawSheetLabelStruct*) Slabel->Pnext; + Slabel = (Hierarchical_PIN_Sheet_Struct*) Slabel->Pnext; Slabel->m_Parent = newitem; label = label->Next(); } @@ -217,19 +201,19 @@ void DrawSheetStruct::SwapData( DrawSheetStruct* copyitem ) EXCHG( m_NbLabel, copyitem->m_NbLabel ); // Ensure sheet labels have their .m_Parent member poiuntin really on their parent, after swapping. - DrawSheetLabelStruct * label = m_Label; + Hierarchical_PIN_Sheet_Struct* label = m_Label; while( label ) { label->m_Parent = this; label = label->Next(); } + label = copyitem->m_Label; while( label ) { label->m_Parent = copyitem; label = label->Next(); } - } @@ -263,7 +247,7 @@ void DrawSheetStruct::CleanupSheet( WinEDA_SchematicFrame* frame, wxDC* DC ) * if DC != NULL, redraw Sheet */ { - DrawSheetLabelStruct* Pinsheet, * NextPinsheet; + Hierarchical_PIN_Sheet_Struct* Pinsheet, * NextPinsheet; if( !IsOK( frame, _( "Ok to cleanup this sheet" ) ) ) return; @@ -273,8 +257,8 @@ void DrawSheetStruct::CleanupSheet( WinEDA_SchematicFrame* frame, wxDC* DC ) { /* Search Hlabel corresponding to this Pinsheet */ - EDA_BaseStruct* DrawStruct = m_AssociatedScreen->EEDrawList; - SCH_HIERLABEL* HLabel = NULL; + EDA_BaseStruct* DrawStruct = m_AssociatedScreen->EEDrawList; + SCH_HIERLABEL* HLabel = NULL; for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) { if( DrawStruct->Type() != TYPE_SCH_HIERLABEL ) @@ -285,7 +269,7 @@ void DrawSheetStruct::CleanupSheet( WinEDA_SchematicFrame* frame, wxDC* DC ) HLabel = NULL; } - NextPinsheet = (DrawSheetLabelStruct*) Pinsheet->Pnext; + NextPinsheet = Pinsheet->Next(); if( HLabel == NULL ) // Hlabel not found: delete pinsheet { frame->GetScreen()->SetModify(); @@ -302,7 +286,7 @@ void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& of /**************************************************************************************/ /* Draw the hierarchical sheet shape */ { - DrawSheetLabelStruct* SheetLabelStruct; + Hierarchical_PIN_Sheet_Struct* SheetLabelStruct; int txtcolor; wxString Text; int color; @@ -316,7 +300,7 @@ void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& of GRSetDrawMode( DC, DrawMode ); GRRect( &panel->m_ClipBox, DC, pos.x, pos.y, - pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color ); + pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color ); /* Draw text : SheetName */ if( Color > 0 ) @@ -326,9 +310,9 @@ void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& of Text = wxT( "Sheet: " ) + m_SheetName; DrawGraphicText( panel, DC, - wxPoint( pos.x, pos.y - 8 ), txtcolor, - Text, TEXT_ORIENT_HORIZ, wxSize( m_SheetNameSize, m_SheetNameSize ), - GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth ); + wxPoint( pos.x, pos.y - 8 ), txtcolor, + Text, TEXT_ORIENT_HORIZ, wxSize( m_SheetNameSize, m_SheetNameSize ), + GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth ); /* Draw text : FileName */ if( Color >= 0 ) @@ -337,37 +321,44 @@ void DrawSheetStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& of txtcolor = ReturnLayerColor( LAYER_SHEETFILENAME ); Text = wxT( "File: " ) + m_FileName; DrawGraphicText( panel, DC, - wxPoint( pos.x, pos.y + m_Size.y + 4 ), - txtcolor, - Text, TEXT_ORIENT_HORIZ, wxSize( m_FileNameSize, m_FileNameSize ), - GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, LineWidth ); + wxPoint( pos.x, pos.y + m_Size.y + 4 ), + txtcolor, + Text, TEXT_ORIENT_HORIZ, wxSize( m_FileNameSize, m_FileNameSize ), + GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, LineWidth ); /* Draw text : SheetLabel */ SheetLabelStruct = m_Label; while( SheetLabelStruct != NULL ) { - if ( !(SheetLabelStruct->m_Flags & IS_MOVED) ) + if( !(SheetLabelStruct->m_Flags & IS_MOVED) ) SheetLabelStruct->Draw( panel, DC, offset, DrawMode, Color ); - SheetLabelStruct = (DrawSheetLabelStruct*) (SheetLabelStruct->Pnext); + SheetLabelStruct = SheetLabelStruct->Next(); } } -EDA_Rect DrawSheetStruct::GetBoundingBox(){ - int dx, dy; - // Determine length of texts - wxString Text1 = wxT( "Sheet: " ) + m_SheetName; - wxString Text2 = wxT( "File: " ) + m_FileName; - int textlen1 = 10 * Text1.Len() * m_SheetNameSize / 9; - int textlen2 = 10 * Text2.Len() * m_FileNameSize / 9; - textlen1 = MAX(textlen1, textlen2); - dx = MAX(m_Size.x, textlen1 ); - dy = m_Size.y+m_SheetNameSize+m_FileNameSize+16; - EDA_Rect box(wxPoint(m_Pos.x,m_Pos.y-m_SheetNameSize-8), wxSize(dx,dy) ); +/*****************************************/ +EDA_Rect DrawSheetStruct::GetBoundingBox() +/*****************************************/ +{ + int dx, dy; + + // Determine length of texts + wxString Text1 = wxT( "Sheet: " ) + m_SheetName; + wxString Text2 = wxT( "File: " ) + m_FileName; + int textlen1 = 10 * Text1.Len() * m_SheetNameSize / 9; + int textlen2 = 10 * Text2.Len() * m_FileNameSize / 9; + + textlen1 = MAX( textlen1, textlen2 ); + dx = MAX( m_Size.x, textlen1 ); + dy = m_Size.y + m_SheetNameSize + m_FileNameSize + 16; + + EDA_Rect box( wxPoint( m_Pos.x, m_Pos.y - m_SheetNameSize - 8 ), wxSize( dx, dy ) ); return box; } + /**************************************************************************************/ void DrawSheetStruct::DeleteAnnotation( bool recurse ) /**************************************************************************************/ @@ -440,8 +431,8 @@ bool DrawSheetStruct::SearchHierarchy( wxString filename, SCH_SCREEN** screen ) if( strct->Type() == DRAW_SHEET_STRUCT_TYPE ) { DrawSheetStruct* ss = (DrawSheetStruct*) strct; - if( ss->m_AssociatedScreen && - ss->m_AssociatedScreen->m_FileName.CmpNoCase( filename ) == 0 ) + if( ss->m_AssociatedScreen + && ss->m_AssociatedScreen->m_FileName.CmpNoCase( filename ) == 0 ) { *screen = ss->m_AssociatedScreen; return true; @@ -575,36 +566,35 @@ void DrawSheetStruct::SetFileName( const wxString& aFilename ) * - if new filename is already used (a complex hierarchy) : reference the sheet. */ -bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame * aFrame, const wxString& aFileName ) +bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame* aFrame, const wxString& aFileName ) { if( (GetFileName() == aFileName) && m_AssociatedScreen ) return true; SCH_SCREEN* Screen_to_use = NULL; - wxString msg; - bool LoadFromFile = false; + wxString msg; + bool LoadFromFile = false; if( g_RootSheet->SearchHierarchy( aFileName, &Screen_to_use ) ) //do we reload the data from the existing hierarchy { - if(m_AssociatedScreen) //upon initial load, this will be null. - { - msg.Printf( _( - "A Sub Hierarchy named %s exists, Use it (The data in this sheet will be replaced)?" ), - aFileName.GetData() ); - if( ! IsOK( NULL, msg ) ) - { - DisplayInfo(NULL, _("Sheet Filename Renaming Aborted")); - return false; - } - } + if( m_AssociatedScreen ) //upon initial load, this will be null. + { + msg.Printf( _( + "A Sub Hierarchy named %s exists, Use it (The data in this sheet will be replaced)?" ), + aFileName.GetData() ); + if( !IsOK( NULL, msg ) ) + { + DisplayInfo( NULL, _( "Sheet Filename Renaming Aborted" ) ); + return false; + } + } } - else if( wxFileExists( aFileName ) ) //do we reload the data from an existing file { msg.Printf( _( - "A file named %s exists, load it (otherwise keep current sheet data if possible)?" ), - aFileName.GetData() ); + "A file named %s exists, load it (otherwise keep current sheet data if possible)?" ), + aFileName.GetData() ); if( IsOK( NULL, msg ) ) { LoadFromFile = true; @@ -616,11 +606,12 @@ bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame * aFrame, const wxSt } // if an associated screen exists, shared between this sheet and others sheets, what we do ? - if( m_AssociatedScreen && ( m_AssociatedScreen->m_RefCount > 1 )) + if( m_AssociatedScreen && ( m_AssociatedScreen->m_RefCount > 1 ) ) { - msg = _("This sheet uses shared data in a complex hierarchy" ) ; - msg << wxT("\n"); - msg << _("Do we convert it in a simple hierarchical sheet (otherwise delete current sheet data)"); + msg = _( "This sheet uses shared data in a complex hierarchy" ); + msg << wxT( "\n" ); + msg << _( + "Do we convert it in a simple hierarchical sheet (otherwise delete current sheet data)" ); if( IsOK( NULL, msg ) ) { LoadFromFile = true; @@ -629,8 +620,8 @@ bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame * aFrame, const wxSt aFrame->SaveEEFile( m_AssociatedScreen, FILE_SAVE_AS ); m_AssociatedScreen->m_FileName = oldfilename; } - m_AssociatedScreen->m_RefCount--; //be careful with these - m_AssociatedScreen = NULL; //will be created later + m_AssociatedScreen->m_RefCount--; //be careful with these + m_AssociatedScreen = NULL; //will be created later } @@ -645,9 +636,9 @@ bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame * aFrame, const wxSt m_AssociatedScreen = NULL; //so that we reload.. } - if ( LoadFromFile ) + if( LoadFromFile ) Load( aFrame ); - else if ( Screen_to_use ) + else if( Screen_to_use ) { m_AssociatedScreen = Screen_to_use; m_AssociatedScreen->m_RefCount++; @@ -666,129 +657,6 @@ bool DrawSheetStruct::ChangeFileName( WinEDA_SchematicFrame * aFrame, const wxSt } -/************************/ -/* DrawSheetLabelStruct */ -/************************/ - -/*******************************************************************/ -DrawSheetLabelStruct::DrawSheetLabelStruct( DrawSheetStruct* parent, - const wxPoint& pos, const wxString& text ) : - SCH_ITEM( NULL, DRAW_SHEETLABEL_STRUCT_TYPE ) - , EDA_TextStruct( text ) -/*******************************************************************/ -{ - m_Layer = LAYER_SHEETLABEL; - m_Pos = pos; - m_Edge = 0; - m_Shape = NET_INPUT; - m_IsDangling = TRUE; -} - - -/***********************************************************/ -DrawSheetLabelStruct* DrawSheetLabelStruct::GenCopy() -/***********************************************************/ -{ - DrawSheetLabelStruct* newitem = - new DrawSheetLabelStruct( (DrawSheetStruct*) m_Parent, m_Pos, m_Text ); - - newitem->m_Edge = m_Edge; - newitem->m_Shape = m_Shape; - - return newitem; -} - - -/********************************************************************************************/ -void DrawSheetLabelStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, - int DrawMode, int Color ) -/********************************************************************************************/ -/* Routine de dessin des Labels type hierarchie */ -{ - int side, txtcolor; - int posx, tposx, posy, size2; - wxSize size; - int NbSegm, coord[20]; - int LineWidth = g_DrawMinimunLineWidth; - - if( Color >= 0 ) - txtcolor = Color; - else - txtcolor = ReturnLayerColor( m_Layer ); - GRSetDrawMode( DC, DrawMode ); - - posx = m_Pos.x + offset.x; posy = m_Pos.y + offset.y; size = m_Size; - if( !m_Text.IsEmpty() ) - { - if( m_Edge ) - { - tposx = posx - size.x; - side = GR_TEXT_HJUSTIFY_RIGHT; - } - else - { - tposx = posx + size.x + (size.x / 8); - side = GR_TEXT_HJUSTIFY_LEFT; - } - DrawGraphicText( panel, DC, wxPoint( tposx, posy ), txtcolor, - m_Text, TEXT_ORIENT_HORIZ, size, - side, GR_TEXT_VJUSTIFY_CENTER, LineWidth ); - } - /* dessin du symbole de connexion */ - - if( m_Edge ) - { - size.x = -size.x; - size.y = -size.y; - } - - coord[0] = posx; coord[1] = posy; size2 = size.x / 2; - NbSegm = 0; - - switch( m_Shape ) - { - case 0: /* input |> */ - coord[2] = posx; coord[3] = posy - size2; - coord[4] = posx + size2; coord[5] = posy - size2; - coord[6] = posx + size.x; coord[7] = posy; - coord[8] = posx + size2; coord[9] = posy + size2; - coord[10] = posx; coord[11] = posy + size2; - coord[12] = coord[0]; coord[13] = coord[1]; - NbSegm = 7; - break; - - case 1: /* output <| */ - coord[2] = posx + size2; coord[3] = posy - size2; - coord[4] = posx + size.x; coord[5] = posy - size2; - coord[6] = posx + size.x; coord[7] = posy + size2; - coord[8] = posx + size2; coord[9] = posy + size2; - coord[10] = coord[0]; coord[11] = coord[1]; - NbSegm = 6; - break; - - case 2: /* bidi <> */ - case 3: /* TriSt <> */ - coord[2] = posx + size2; coord[3] = posy - size2; - coord[4] = posx + size.x; coord[5] = posy; - coord[6] = posx + size2; coord[7] = posy + size2; - coord[8] = coord[0]; coord[9] = coord[1]; - NbSegm = 5; - break; - - default: /* unsp []*/ - coord[2] = posx; coord[3] = posy - size2; - coord[4] = posx + size.x; coord[5] = posy - size2; - coord[6] = posx + size.x; coord[7] = posy + size2; - coord[8] = posx; coord[9] = posy + size2; - coord[10] = coord[0]; coord[11] = coord[1]; - NbSegm = 6; - break; - } - - int FillShape = FALSE; - GRPoly( &panel->m_ClipBox, DC, NbSegm, coord, FillShape, LineWidth, txtcolor, txtcolor ); /* Poly Non rempli */ -} - /**********************************************/ /* class to handle a series of sheets *********/ diff --git a/eeschema/class_drawsheet.h b/eeschema/class_drawsheet.h index 7bc332429a..3cd6948ddd 100644 --- a/eeschema/class_drawsheet.h +++ b/eeschema/class_drawsheet.h @@ -14,33 +14,43 @@ extern DrawSheetStruct* g_RootSheet; -class DrawSheetLabelStruct : public SCH_ITEM, +class Hierarchical_PIN_Sheet_Struct : public SCH_ITEM, public EDA_TextStruct { public: int m_Edge, m_Shape; bool m_IsDangling; // TRUE non connected + int m_Number; // used to numbered labels when writing data on file . m_Number >= 2 + // value 0 is for sheet name and 1 for sheet filename public: - DrawSheetLabelStruct( DrawSheetStruct* parent, + Hierarchical_PIN_Sheet_Struct( DrawSheetStruct* parent, const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); - ~DrawSheetLabelStruct() { } + ~Hierarchical_PIN_Sheet_Struct() { } virtual wxString GetClass() const { - return wxT( "DrawSheetLabelStruct" ); + return wxT( "Hierarchical_PIN_Sheet_Struct" ); } - DrawSheetLabelStruct* GenCopy(); + Hierarchical_PIN_Sheet_Struct* GenCopy(); - DrawSheetLabelStruct* Next() - { return (DrawSheetLabelStruct*) Pnext; } + Hierarchical_PIN_Sheet_Struct* Next() + { return (Hierarchical_PIN_Sheet_Struct*) Pnext; } void Place( WinEDA_DrawFrame* frame, wxDC* DC ); - virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; }; @@ -65,7 +75,7 @@ public: wxPoint m_Pos; wxSize m_Size; /* Position and Size of sheet symbol */ int m_Layer; - DrawSheetLabelStruct* m_Label; /* Points de connection, linked list.*/ + Hierarchical_PIN_Sheet_Struct* m_Label; /* Points de connection, linked list.*/ int m_NbLabel; /* Nombre de points de connexion */ SCH_SCREEN* m_AssociatedScreen; /* Associated Screen which handle the physical data * In complex hierarchies we can have many DrawSheetStruct using the same data @@ -81,12 +91,13 @@ public: return wxT( "DrawSheetStruct" ); } - /** Function Save - * Write on file a DrawSheetStruct description - * @param f = output file - * return an error: false if ok, true if error - */ - bool Save( FILE *f ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; void Place( WinEDA_DrawFrame* frame, wxDC* DC ); DrawSheetStruct* GenCopy(); diff --git a/eeschema/class_hierarchical_PIN_sheet.cpp b/eeschema/class_hierarchical_PIN_sheet.cpp new file mode 100644 index 0000000000..acf20ff44a --- /dev/null +++ b/eeschema/class_hierarchical_PIN_sheet.cpp @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// + +// Name: class_hierarchical_PIN_sheet.cpp +// Purpose: member functions Hierarchical_PIN_Sheet_Struct +// header = class_drawsheet.h +// Author: jean-pierre Charras +// Modified by: +// Created: 08/02/2006 18:37:02 +// RCS-ID: +// Copyright: License GNU +// Licence: +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "fctsys.h" +#include "gr_basic.h" + +#include "common.h" +#include "program.h" +#include "libcmp.h" +#include "general.h" + +#include "protos.h" + + +/*******************************************************************/ +Hierarchical_PIN_Sheet_Struct::Hierarchical_PIN_Sheet_Struct( DrawSheetStruct* parent, + const wxPoint& pos, const wxString& text ) : + SCH_ITEM( NULL, DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ), + EDA_TextStruct( text ) +/*******************************************************************/ +{ + m_Layer = LAYER_SHEETLABEL; + m_Pos = pos; + m_Edge = 0; + m_Shape = NET_INPUT; + m_IsDangling = TRUE; + m_Number = 2; +} + + +/***********************************************************/ +Hierarchical_PIN_Sheet_Struct* Hierarchical_PIN_Sheet_Struct::GenCopy() +/***********************************************************/ +{ + Hierarchical_PIN_Sheet_Struct* newitem = + new Hierarchical_PIN_Sheet_Struct( (DrawSheetStruct*) m_Parent, m_Pos, m_Text ); + + newitem->m_Edge = m_Edge; + newitem->m_Shape = m_Shape; + newitem->m_Number = m_Number; + + return newitem; +} + + +/********************************************************************************************/ +void Hierarchical_PIN_Sheet_Struct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int DrawMode, int Color ) +/********************************************************************************************/ +/* Routine de dessin des Labels type hierarchie */ +{ + int side, txtcolor; + int posx, tposx, posy, size2; + wxSize size; + int NbSegm, coord[20]; + int LineWidth = g_DrawMinimunLineWidth; + + if( Color >= 0 ) + txtcolor = Color; + else + txtcolor = ReturnLayerColor( m_Layer ); + GRSetDrawMode( DC, DrawMode ); + + posx = m_Pos.x + offset.x; posy = m_Pos.y + offset.y; size = m_Size; + if( !m_Text.IsEmpty() ) + { + if( m_Edge ) + { + tposx = posx - size.x; + side = GR_TEXT_HJUSTIFY_RIGHT; + } + else + { + tposx = posx + size.x + (size.x / 8); + side = GR_TEXT_HJUSTIFY_LEFT; + } + DrawGraphicText( panel, DC, wxPoint( tposx, posy ), txtcolor, + m_Text, TEXT_ORIENT_HORIZ, size, + side, GR_TEXT_VJUSTIFY_CENTER, LineWidth ); + } + /* dessin du symbole de connexion */ + + if( m_Edge ) + { + size.x = -size.x; + size.y = -size.y; + } + + coord[0] = posx; coord[1] = posy; size2 = size.x / 2; + NbSegm = 0; + + switch( m_Shape ) + { + case 0: /* input |> */ + coord[2] = posx; coord[3] = posy - size2; + coord[4] = posx + size2; coord[5] = posy - size2; + coord[6] = posx + size.x; coord[7] = posy; + coord[8] = posx + size2; coord[9] = posy + size2; + coord[10] = posx; coord[11] = posy + size2; + coord[12] = coord[0]; coord[13] = coord[1]; + NbSegm = 7; + break; + + case 1: /* output <| */ + coord[2] = posx + size2; coord[3] = posy - size2; + coord[4] = posx + size.x; coord[5] = posy - size2; + coord[6] = posx + size.x; coord[7] = posy + size2; + coord[8] = posx + size2; coord[9] = posy + size2; + coord[10] = coord[0]; coord[11] = coord[1]; + NbSegm = 6; + break; + + case 2: /* bidi <> */ + case 3: /* TriSt <> */ + coord[2] = posx + size2; coord[3] = posy - size2; + coord[4] = posx + size.x; coord[5] = posy; + coord[6] = posx + size2; coord[7] = posy + size2; + coord[8] = coord[0]; coord[9] = coord[1]; + NbSegm = 5; + break; + + default: /* unsp []*/ + coord[2] = posx; coord[3] = posy - size2; + coord[4] = posx + size.x; coord[5] = posy - size2; + coord[6] = posx + size.x; coord[7] = posy + size2; + coord[8] = posx; coord[9] = posy + size2; + coord[10] = coord[0]; coord[11] = coord[1]; + NbSegm = 6; + break; + } + + int FillShape = FALSE; + GRPoly( &panel->m_ClipBox, DC, NbSegm, coord, FillShape, LineWidth, txtcolor, txtcolor ); /* Poly Non rempli */ +} + + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool Hierarchical_PIN_Sheet_Struct::Save( FILE* aFile ) const +{ + int type = 'U', side = 'L'; + + if( m_Text.IsEmpty() ) + return true; + if( m_Edge ) + side = 'R'; + + switch( m_Shape ) + { + case NET_INPUT: + type = 'I'; break; + + case NET_OUTPUT: + type = 'O'; break; + + case NET_BIDI: + type = 'B'; break; + + case NET_TRISTATE: + type = 'T'; break; + + case NET_UNSPECIFIED: + type = 'U'; break; + } + + if( fprintf( aFile, "F%d \"%s\" %c %c %-3d %-3d %-3d\n", m_Number, + CONV_TO_UTF8( m_Text ), type, side, + m_Pos.x, m_Pos.y, + m_Size.x ) == EOF ) + { + return false; + } + + return true; +} + diff --git a/eeschema/cmpclass.cpp b/eeschema/class_schematic_items.cpp similarity index 59% rename from eeschema/cmpclass.cpp rename to eeschema/class_schematic_items.cpp index c47c6b378d..8181b91940 100644 --- a/eeschema/cmpclass.cpp +++ b/eeschema/class_schematic_items.cpp @@ -13,6 +13,10 @@ #include "protos.h" +/****************************/ +/* class DrawBusEntryStruct */ +/***************************/ + /*******************************************************************/ DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) : @@ -37,7 +41,7 @@ DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) /*************************************/ -wxPoint DrawBusEntryStruct::m_End() +wxPoint DrawBusEntryStruct::m_End() const /*************************************/ // retourne la coord de fin du raccord @@ -61,6 +65,39 @@ DrawBusEntryStruct* DrawBusEntryStruct::GenCopy() } +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool DrawBusEntryStruct::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", + m_Pos.x, m_Pos.y, + m_End().x, m_End().y ) == EOF ) + { + success = false; + } + + return success; +} + + /****************************/ /* class DrawJunctionStruct */ /***************************/ @@ -86,6 +123,37 @@ DrawJunctionStruct* DrawJunctionStruct::GenCopy() } +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool DrawJunctionStruct::Save( FILE* aFile ) const +{ + bool success = true; + + if( fprintf( aFile, "Connection ~ %-4d %-4d\n", m_Pos.x, m_Pos.y ) == EOF ) + { + success = false; + } + + return success; +} + + +EDA_Rect DrawJunctionStruct::GetBoundingBox() +{ + int width = DRAWJUNCTION_SIZE * 2; + int xmin = m_Pos.x - DRAWJUNCTION_SIZE; + int ymin = m_Pos.y - DRAWJUNCTION_SIZE; + + EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( width, width ) ); + + return ret; +}; + + /*****************************/ /* class DrawNoConnectStruct */ /*****************************/ @@ -107,6 +175,25 @@ DrawNoConnectStruct* DrawNoConnectStruct::GenCopy() } +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool DrawNoConnectStruct::Save( FILE* aFile ) const +{ + bool success = true; + + if( fprintf( aFile, "NoConn ~ %-4d %-4d\n", m_Pos.x, m_Pos.y ) == EOF ) + { + success = false; + } + + return success; +} + + /**************************/ /* class DrawMarkerStruct */ /**************************/ @@ -143,7 +230,8 @@ wxString DrawMarkerStruct::GetComment() } -#if defined(DEBUG) +#if defined (DEBUG) + /** * Function Show * is used to output the object tree, currently for debugging only. @@ -154,11 +242,36 @@ wxString DrawMarkerStruct::GetComment() void DrawMarkerStruct::Show( int nestLevel, std::ostream& os ) { // for now, make it look like XML: - NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos - << "/>\n"; + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos + << "/>\n"; } + + #endif +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool DrawMarkerStruct::Save( FILE* aFile ) const +{ + bool success = true; + wxString msg; + + if( fprintf( aFile, "Kmarq %c %-4d %-4d \"%s\" F=%X\n", + m_Type + 'A', + m_Pos.x, m_Pos.y, + CONV_TO_UTF8( m_Comment ), m_MarkFlags ) == EOF ) + { + success = false; + } + + return success; +} + + /***************************/ /* Class EDA_DrawLineStruct */ @@ -218,7 +331,8 @@ bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos ) } -#if defined(DEBUG) +#if defined (DEBUG) + /** * Function Show * is used to output the object tree, currently for debugging only. @@ -229,65 +343,70 @@ bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos ) void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os ) { NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << - " layer=\"" << m_Layer << '"' << - " width=\"" << m_Width << '"' << - " startIsDangling=\"" << m_StartIsDangling << '"' << - " endIsDangling=\"" << m_EndIsDangling << '"' << ">" << - " " << - " " << - "\n"; + " layer=\"" << m_Layer << '"' << + " width=\"" << m_Width << '"' << + " startIsDangling=\"" << m_StartIsDangling << '"' << + " endIsDangling=\"" << m_EndIsDangling << '"' << ">" << + " " << + " " << + "\n"; } -#endif +#endif + EDA_Rect EDA_DrawLineStruct::GetBoundingBox() { - int width = 25; + int width = 25; - int xmin = MIN( m_Start.x, m_End.x ) - width; - int ymin = MIN( m_Start.y, m_End.y ) - width; + int xmin = MIN( m_Start.x, m_End.x ) - width; + int ymin = MIN( m_Start.y, m_End.y ) - width; - int xmax = MAX( m_Start.x, m_End.x ) + width; - int ymax = MAX( m_Start.y, m_End.y ) + width; + int xmax = MAX( m_Start.x, m_End.x ) + width; + int ymax = MAX( m_Start.y, m_End.y ) + width; // return a rectangle which is [pos,dim) in nature. therefore the +1 - EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax-xmin+1, ymax-ymin+1 ) ); + EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax - xmin + 1, ymax - ymin + 1 ) ); return ret; } -EDA_Rect DrawJunctionStruct::GetBoundingBox() + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool EDA_DrawLineStruct::Save( FILE* aFile ) const { - int width = DRAWJUNCTION_SIZE * 2; - int xmin = m_Pos.x - DRAWJUNCTION_SIZE ; - int ymin = m_Pos.y - DRAWJUNCTION_SIZE; + bool success = true; - EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( width, width ) ); + const char* layer = "Notes"; + const char* width = "Line"; - return ret; -}; - - -EDA_Rect SCH_COMPONENT::GetBoundingBox() -{ - const int PADDING = 40; - - // This gives a reasonable approximation (but some things are missing so... - EDA_Rect ret = GetBoundaryBox(); - - // Include BoundingBoxes of fields - for( int i = REFERENCE; i < NUMBER_OF_FIELDS; i++ ) + if( GetLayer() == LAYER_WIRE ) + layer = "Wire"; + if( GetLayer() == LAYER_BUS ) + layer = "Bus"; + if( m_Width != GR_NORM_WIDTH ) + layer = "Bus"; + if( fprintf( aFile, "Wire %s %s\n", layer, width ) == EOF ) { - ret.Merge( m_Field[i].GetBoundaryBox() ); + success = false; + } + if (fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", + m_Start.x,m_Start.y, + m_End.x,m_End.y) == EOF) + { + success = false; } - // ... add padding - ret.Inflate(PADDING, PADDING); - - return ret; + return success; } + /****************************/ /* Class DrawPolylineStruct */ /****************************/ @@ -345,3 +464,43 @@ DrawPolylineStruct* DrawPolylineStruct::GenCopy() return newitem; } + + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool DrawPolylineStruct::Save( FILE* aFile ) const +{ + bool success = true; + + const char* layer = "Notes"; + const char* width = "Line"; + + if( GetLayer() == LAYER_WIRE ) + layer = "Wire"; + if( GetLayer() == LAYER_BUS ) + layer = "Bus"; + if( m_Width != GR_NORM_WIDTH ) + width = "Bus"; + if( fprintf( aFile, "Poly %s %s %d\n", + width, layer, m_NumOfPoints ) == EOF ) + { + success = false; + return success; + } + for( int ii = 0; ii < m_NumOfPoints; ii++ ) + { + if( fprintf( aFile, "\t%-4d %-4d\n", + m_Points[ii * 2], + m_Points[ii * 2 + 1] ) == EOF ) + { + success = false; + break; + } + } + + return success; +} diff --git a/eeschema/class_screen.cpp b/eeschema/class_screen.cpp index 66b0045ed9..22b53fe622 100644 --- a/eeschema/class_screen.cpp +++ b/eeschema/class_screen.cpp @@ -31,7 +31,7 @@ void SetStructFather( EDA_BaseStruct* Struct, BASE_SCREEN* Screen ) Struct->m_Parent = Screen; break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_PICK_ITEM_STRUCT_TYPE: break; diff --git a/eeschema/class_screen.h b/eeschema/class_screen.h index 59c5b9c6bf..f9608a4657 100644 --- a/eeschema/class_screen.h +++ b/eeschema/class_screen.h @@ -47,6 +47,13 @@ public: virtual void ClearUndoRedoList(); virtual void AddItemToUndoList( EDA_BaseStruct* item ); virtual void AddItemToRedoList( EDA_BaseStruct* item ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; }; diff --git a/eeschema/class_text-label.cpp b/eeschema/class_text-label.cpp index c2bf6f604b..c0b858cfbd 100644 --- a/eeschema/class_text-label.cpp +++ b/eeschema/class_text-label.cpp @@ -115,40 +115,6 @@ void SCH_TEXT::Place( WinEDA_DrawFrame* frame, wxDC* DC ) SCH_ITEM::Place( frame, DC ); } - -/****************************************************************************/ -SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) : - SCH_TEXT( pos, text, TYPE_SCH_LABEL ) -/****************************************************************************/ -{ - m_Layer = LAYER_LOCLABEL; - m_Shape = NET_INPUT; - m_IsDangling = TRUE; -} - - -/***********************************************************************************/ -SCH_GLOBALLABEL::SCH_GLOBALLABEL( const wxPoint& pos, const wxString& text ) : - SCH_TEXT( pos, text, TYPE_SCH_GLOBALLABEL ) -/***********************************************************************************/ -{ - m_Layer = LAYER_GLOBLABEL; - m_Shape = NET_BIDI; - m_IsDangling = TRUE; -} - - -/***********************************************************************************/ -SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text ) : - SCH_TEXT( pos, text, TYPE_SCH_HIERLABEL ) -/***********************************************************************************/ -{ - m_Layer = LAYER_HIERLABEL; - m_Shape = NET_INPUT; - m_IsDangling = TRUE; -} - - /*******************************************************************************************/ void SCH_TEXT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int DrawMode, int Color ) @@ -209,6 +175,126 @@ void SCH_TEXT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, } +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool SCH_TEXT::Save( FILE* aFile ) const +{ + bool success = true; + if( fprintf( aFile, "Text Notes %-4d %-4d %-4d %-4d ~\n%s\n", + m_Pos.x, m_Pos.y, + m_Orient, m_Size.x, + CONV_TO_UTF8( m_Text ) ) == EOF ) + { + success = false; + } + + return success; +} + + +/****************************************************************************/ +SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) : + SCH_TEXT( pos, text, TYPE_SCH_LABEL ) +/****************************************************************************/ +{ + m_Layer = LAYER_LOCLABEL; + m_Shape = NET_INPUT; + m_IsDangling = TRUE; +} + + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool SCH_LABEL::Save( FILE* aFile ) const +{ + bool success = true; + char shape = '~'; + if( fprintf( aFile, "Text Label %-4d %-4d %-4d %-4d %c\n%s\n", + m_Pos.x, m_Pos.y, + m_Orient, m_Size.x, shape, + CONV_TO_UTF8( m_Text ) ) == EOF ) + { + success = false; + } + + return success; +} + + +/***********************************************************************************/ +SCH_GLOBALLABEL::SCH_GLOBALLABEL( const wxPoint& pos, const wxString& text ) : + SCH_TEXT( pos, text, TYPE_SCH_GLOBALLABEL ) +/***********************************************************************************/ +{ + m_Layer = LAYER_GLOBLABEL; + m_Shape = NET_BIDI; + m_IsDangling = TRUE; +} + + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool SCH_GLOBALLABEL::Save( FILE* aFile ) const +{ + bool success = true; + if( fprintf( aFile, "Text GLabel %-4d %-4d %-4d %-4d %s\n%s\n", + m_Pos.x, m_Pos.y, + m_Orient, m_Size.x, + SheetLabelType[m_Shape], + CONV_TO_UTF8( m_Text ) ) == EOF ) + { + success = false; + } + + return success; +} + + +/***********************************************************************************/ +SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text ) : + SCH_TEXT( pos, text, TYPE_SCH_HIERLABEL ) +/***********************************************************************************/ +{ + m_Layer = LAYER_HIERLABEL; + m_Shape = NET_INPUT; + m_IsDangling = TRUE; +} + + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool SCH_HIERLABEL::Save( FILE* aFile ) const +{ + bool success = true; + if( fprintf( aFile, "Text HLabel %-4d %-4d %-4d %-4d %s\n%s\n", + m_Pos.x, m_Pos.y, + m_Orient, m_Size.x, + SheetLabelType[m_Shape], + CONV_TO_UTF8( m_Text ) ) == EOF ) + { + success = false; + } + + return success; +} + + /*********************************************************************************************/ void SCH_LABEL::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int DrawMode, int Color ) diff --git a/eeschema/class_text-label.h b/eeschema/class_text-label.h index 2e804c84ea..1e3b835988 100644 --- a/eeschema/class_text-label.h +++ b/eeschema/class_text-label.h @@ -103,6 +103,15 @@ public: virtual void Place( WinEDA_DrawFrame* frame, wxDC* DC ); EDA_Rect GetBoundingBox(); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + }; @@ -118,6 +127,14 @@ public: { return wxT( "SCH_LABEL" ); } + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; }; @@ -145,6 +162,14 @@ public: */ void CreateGraphicShape( int* corner_list, const wxPoint & Pos ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + EDA_Rect GetBoundingBox(); }; @@ -174,6 +199,14 @@ public: */ void CreateGraphicShape( int* corner_list, const wxPoint & Pos ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + EDA_Rect GetBoundingBox(); }; diff --git a/eeschema/cleanup.cpp b/eeschema/cleanup.cpp index 162d624317..c329cb4c26 100644 --- a/eeschema/cleanup.cpp +++ b/eeschema/cleanup.cpp @@ -113,7 +113,7 @@ void BreakSegmentOnJunction( SCH_SCREEN* Screen ) case DRAW_MARKER_STRUCT_TYPE: case TYPE_SCH_TEXT: case DRAW_SHEET_STRUCT_TYPE: - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: break; default: diff --git a/eeschema/component_class.cpp b/eeschema/component_class.cpp index 73bc0e055c..53bdd217dc 100644 --- a/eeschema/component_class.cpp +++ b/eeschema/component_class.cpp @@ -1,5 +1,5 @@ /***********************************************************************/ -/* Methodes de base de gestion des classes des elements de schematique */ +/* component_class.cpp : handle the class SCH_COMPONENT */ /***********************************************************************/ #include "fctsys.h" @@ -17,6 +17,7 @@ #include "macros.h" #include +#include WX_DEFINE_OBJARRAY( ArrayOfSheetLists ); @@ -31,8 +32,27 @@ WX_DEFINE_OBJARRAY( ArrayOfSheetLists ); */ void SCH_COMPONENT::AddHierarchicalReference( const wxString& path, const wxString& ref ) { - m_Paths.Add( path ); - m_References.Add( ref ); + + wxString h_path, h_ref; + wxStringTokenizer tokenizer; + wxString separators( wxT( " " ) ); + + // Search for an existing path and remove it if found (should not occur) + for( unsigned ii = 0; iim_UnitSelectionLocked ) + KeepMulti = true; while( defRef.Last() == '?' ) defRef.RemoveLast(); defRef.Append( wxT( "?" ) ); - m_References.Empty(); - unsigned int i; - for( i = 0; i< m_Paths.GetCount(); i++ ) + + wxString multi = wxT( "1" ); + wxString NewHref; + for( unsigned int ii = 0; ii< m_PathsAndReferences.GetCount(); ii++ ) { - m_References.Add( defRef ); + if( KeepMulti ) // Get and keep part selection + multi = m_PathsAndReferences[ii].AfterLast( wxChar( ' ' ) ); + NewHref = m_PathsAndReferences[ii].BeforeFirst( wxChar( ' ' ) ); + NewHref << wxT( " " ) << defRef << wxT( " " ) << multi; + m_PathsAndReferences[ii] = NewHref; } m_Field[REFERENCE].m_Text = defRef; //for drawing. - EDA_LibComponentStruct* Entry; - Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); - if( !Entry || !Entry->m_UnitSelectionLocked ) - { + if( !KeepMulti ) m_Multi = 1; - } } @@ -618,7 +659,7 @@ wxPoint SCH_COMPONENT::GetScreenCoord( const wxPoint& coord ) /* Renvoie la coordonn�e du point coord, en fonction de l'orientation * du composant (rotation, miroir). - * Les coord sont toujours relatives � l'ancre (coord 0,0) du composant + * Les coord sont toujours relatives a l'ancre (coord 0,0) du composant */ { wxPoint screenpos; @@ -674,8 +715,8 @@ PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) : EDA_TextStruct( text ) /***************************************************************************/ { - m_Pos = pos; - m_FieldId = 0; + m_Pos = pos; + m_FieldId = 0; m_AddExtraText = false; } @@ -829,24 +870,82 @@ EDA_Rect PartTextStruct::GetBoundaryBox() const } -/**********************************/ -bool SCH_COMPONENT::Save( FILE* f ) -/**********************************/ +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool PartTextStruct::Save( FILE* aFile ) const +{ + char hjustify = 'C'; -/** Function Save - * Write on file a SCH_COMPONENT decscription - * @param f = output file - * return an error: false if ok, true if error + if( m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) + hjustify = 'L'; + else if( m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) + hjustify = 'R'; + char vjustify = 'C'; + if( m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) + vjustify = 'B'; + else if( m_VJustify == GR_TEXT_VJUSTIFY_TOP ) + vjustify = 'T'; + if( fprintf( aFile, "F %d \"%s\" %c %-3d %-3d %-3d %4.4X %c %c", m_FieldId, + CONV_TO_UTF8( m_Text ), + m_Orient == TEXT_ORIENT_HORIZ ? 'H' : 'V', + m_Pos.x, m_Pos.y, + m_Size.x, + m_Attributs, + hjustify, vjustify ) == EOF ) + { + return false; + } + + + // Save field name, if necessary + if( m_FieldId >= FIELD1 && !m_Name.IsEmpty() ) + { + wxString fieldname = ReturnDefaultFieldName( m_FieldId ); + if( fieldname != m_Name ) + { + if( fprintf( aFile, " \"%s\"", CONV_TO_UTF8( m_Name ) ) == EOF ) + { + return false; + } + } + } + + if( fprintf( aFile, "\n" ) == EOF ) + { + return false; + } + + return true; +} + + +/****************************************/ +bool SCH_COMPONENT::Save( FILE* f ) const +/****************************************/ + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. */ { - int ii, Failed = FALSE; - char Name1[256], Name2[256]; - int hjustify, vjustify; + int ii, Success = true; + char Name1[256], Name2[256]; + wxArrayString reference_fields; + static wxString delimiters( wxT( " " ) ); //this is redundant with the AR entries below, but it makes the //files backwards-compatible. - if( m_References.GetCount() > 0 ) - strncpy( Name1, CONV_TO_UTF8( m_References[0] ), sizeof(Name1) ); + if( m_PathsAndReferences.GetCount() > 0 ) + { + reference_fields = wxStringTokenize( m_PathsAndReferences[0], delimiters ); + strncpy( Name1, CONV_TO_UTF8( reference_fields[1] ), sizeof(Name1) ); + } else { if( m_Field[REFERENCE].m_Text.IsEmpty() ) @@ -874,88 +973,73 @@ bool SCH_COMPONENT::Save( FILE* f ) if( fprintf( f, "L %s %s\n", Name2, Name1 ) == EOF ) { - Failed = TRUE; - return Failed; + Success = false; + return Success; } /* Generation de numero d'unit, convert et Time Stamp*/ if( fprintf( f, "U %d %d %8.8lX\n", m_Multi, m_Convert, m_TimeStamp ) == EOF ) { - Failed = TRUE; return Failed; + Success = false; + return Success; } - /* Sortie de la position */ + /* Save the position */ if( fprintf( f, "P %d %d\n", m_Pos.x, m_Pos.y ) == EOF ) { - Failed = TRUE; return Failed; + Success = false; + return Success; } - unsigned int i; - for( i = 0; i< m_References.GetCount(); i++ ) + + /* If this is a complex hierarchy; save hierarchical references. + * but for simple hierarchies it is not necessary. + * the reference inf is already saved + * this is usefull for old eeschema version compatibility + */ + if( m_PathsAndReferences.GetCount() > 1 ) { - /*format: - * AR Path="/140/2" Ref="C99" - * where 140 is the uid of the contianing sheet - * and 2 is the timestamp of this component. - * (timestamps are actually 8 hex chars) - * Ref is the conventional component reference for this 'path' - */ - if( fprintf( f, "AR Path=\"%s\" Ref=\"%s\" \n", - CONV_TO_UTF8( m_Paths[i] ), - CONV_TO_UTF8( m_References[i] ) ) == EOF ) + for( unsigned int ii = 0; ii< m_PathsAndReferences.GetCount(); ii++ ) { - Failed = TRUE; break; + /*format: + * AR Path="/140/2" Ref="C99" Part="1" + * where 140 is the uid of the containing sheet + * and 2 is the timestamp of this component. + * (timestamps are actually 8 hex chars) + * Ref is the conventional component reference for this 'path' + * Part is the conventional component part selection for this 'path' + */ + reference_fields = wxStringTokenize( m_PathsAndReferences[ii], delimiters ); + if( fprintf( f, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n", + CONV_TO_UTF8( reference_fields[0] ), + CONV_TO_UTF8( reference_fields[1] ), + CONV_TO_UTF8( reference_fields[2] ) + ) == EOF ) + { + Success = false; + return Success; + } } } for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ ) { - PartTextStruct* field = &m_Field[ii]; + const PartTextStruct* field = &m_Field[ii]; if( field->m_Text.IsEmpty() ) continue; - hjustify = 'C'; - if( field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT ) - hjustify = 'L'; - else if( field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT ) - hjustify = 'R'; - vjustify = 'C'; - if( field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM ) - vjustify = 'B'; - else if( field->m_VJustify == GR_TEXT_VJUSTIFY_TOP ) - vjustify = 'T'; - if( fprintf( f, "F %d \"%s\" %c %-3d %-3d %-3d %4.4X %c %c", ii, - CONV_TO_UTF8( field->m_Text ), - field->m_Orient == TEXT_ORIENT_HORIZ ? 'H' : 'V', - field->m_Pos.x, field->m_Pos.y, - field->m_Size.x, - field->m_Attributs, - hjustify, vjustify ) == EOF ) + if( !field->Save( f ) ) { - Failed = TRUE; break; - } - - // Save field name, if necessary - if( ii >= FIELD1 && !field->m_Name.IsEmpty() ) - { - wxString fieldname = ReturnDefaultFieldName( ii ); - if( fieldname != field->m_Name ) - if( fprintf( f, " \"%s\"", CONV_TO_UTF8( field->m_Name ) ) == EOF ) - { - Failed = TRUE; break; - } - } - if( fprintf( f, "\n" ) == EOF ) - { - Failed = TRUE; break; + Success = false; break; } } - if( Failed ) - return Failed; + if( !Success ) + return Success; /* Generation du num unit, position, box ( ancienne norme )*/ if( fprintf( f, "\t%-4d %-4d %-4d\n", m_Multi, m_Pos.x, m_Pos.y ) == EOF ) { - Failed = TRUE; return Failed; + Success = false; + return Success; } if( fprintf( f, "\t%-4d %-4d %-4d %-4d\n", @@ -964,9 +1048,30 @@ bool SCH_COMPONENT::Save( FILE* f ) m_Transform[1][0], m_Transform[1][1] ) == EOF ) { - Failed = TRUE; return Failed; + Success = false; + return Success; } fprintf( f, "$EndComp\n" ); - return Failed; + return Success; +} + + +EDA_Rect SCH_COMPONENT::GetBoundingBox() +{ + const int PADDING = 40; + + // This gives a reasonable approximation (but some things are missing so... + EDA_Rect ret = GetBoundaryBox(); + + // Include BoundingBoxes of fields + for( int i = REFERENCE; i < NUMBER_OF_FIELDS; i++ ) + { + ret.Merge( m_Field[i].GetBoundaryBox() ); + } + + // ... add padding + ret.Inflate( PADDING, PADDING ); + + return ret; } diff --git a/eeschema/component_class.h b/eeschema/component_class.h index 69451bd2ce..5ee1d6e5c0 100644 --- a/eeschema/component_class.h +++ b/eeschema/component_class.h @@ -41,10 +41,10 @@ class PartTextStruct : public SCH_ITEM, public EDA_TextStruct { public: - int m_FieldId; // Field indicator type (REFERENCE, VALUE or other id) + int m_FieldId; // Field indicator type (REFERENCE, VALUE or other id) wxString m_Name; /* Field name (ref, value,pcb, sheet, filed 1.. * and for fields 1 to 8 the name is editable */ - bool m_AddExtraText; // Mainly for REFERENCE, add extar info (for REFERENCE: add part selection text + bool m_AddExtraText; // Mainly for REFERENCE, add extar info (for REFERENCE: add part selection text public: PartTextStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); @@ -62,14 +62,22 @@ public: EDA_Rect GetBoundaryBox() const; bool IsVoid(); void SwapData( PartTextStruct* copyitem ); + /** * Function Draw - */ - void Draw( WinEDA_DrawPanel* panel, - wxDC* DC, - const wxPoint& offset, - int draw_mode, - int Color = -1 ); + */ + void Draw( WinEDA_DrawPanel* panel, + wxDC* DC, + const wxPoint& offset, + int draw_mode, + int Color = -1 ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; }; @@ -98,8 +106,16 @@ public: int m_Transform[2][2]; /* The rotation/mirror transformation matrix. */ private: - wxArrayString m_Paths; // /sheet1/C102, /sh2/sh1/U32 etc. - wxArrayString m_References; // C102, U32 etc. + + /* Hierarchical references. + * format is + * path reference multi + * with: + * path = // (subsheet path, = / for the root scheet) + * reference = reference for this path (C23, R5, U78 ... ) + * multi = part selection in multi parts per package (0 or 1 for àne part per package) + */ + wxArrayString m_PathsAndReferences; public: SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ) ); @@ -110,12 +126,14 @@ public: return wxT( "SCH_COMPONENT" ); } - /** Function Save - * Write on file a SCH_COMPONENT decscription - * @param f = output file - * return an error: false if ok, true if error - */ - bool Save( FILE *f ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; SCH_COMPONENT* GenCopy(); void SetRotationMiroir( int type ); @@ -152,8 +170,8 @@ public: //returns a unique ID, in the form of a path. wxString GetPath( DrawSheetPath* sheet ); const wxString GetRef( DrawSheetPath* sheet ); - void SetRef( DrawSheetPath* sheet, const wxString & ref ); - void AddHierarchicalReference(const wxString & path, const wxString & ref); + void SetRef( DrawSheetPath* sheet, const wxString& ref ); + void AddHierarchicalReference( const wxString& path, const wxString& ref ); int GetUnitSelection( DrawSheetPath* aSheet ); void SetUnitSelection( DrawSheetPath* aSheet, int aUnitSelection ); diff --git a/eeschema/dangling_ends.cpp b/eeschema/dangling_ends.cpp index 6ec443c764..eb53da9354 100644 --- a/eeschema/dangling_ends.cpp +++ b/eeschema/dangling_ends.cpp @@ -435,7 +435,7 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ) { #undef STRUCT #define STRUCT ( (DrawSheetStruct*) DrawItem ) - DrawSheetLabelStruct* pinsheet = STRUCT->m_Label; + Hierarchical_PIN_Sheet_Struct* pinsheet = STRUCT->m_Label; while( pinsheet ) { item = new DanglingEndHandle( SHEET_LABEL_END ); @@ -447,7 +447,7 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ) else StartList = item; lastitem = item; - pinsheet = (DrawSheetLabelStruct*) pinsheet->Pnext; + pinsheet = (Hierarchical_PIN_Sheet_Struct*) pinsheet->Pnext; } break; diff --git a/eeschema/delete.cpp b/eeschema/delete.cpp index 79647bfb01..70b395023a 100644 --- a/eeschema/delete.cpp +++ b/eeschema/delete.cpp @@ -382,7 +382,7 @@ void EraseStruct( SCH_ITEM* DrawStruct, SCH_SCREEN* Screen ) { EDA_BaseStruct* DrawList; DrawPickedStruct* PickedList = NULL; - DrawSheetLabelStruct* SheetLabel, * NextLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel, * NextLabel; if( DrawStruct == NULL ) return; @@ -392,7 +392,7 @@ void EraseStruct( SCH_ITEM* DrawStruct, SCH_SCREEN* Screen ) Screen->SetModify(); - if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) + if( DrawStruct->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) { /* Cette stucture est rattachee a une feuille, et n'est pas * accessible par la liste globale directement */ @@ -408,10 +408,10 @@ void EraseStruct( SCH_ITEM* DrawStruct, SCH_SCREEN* Screen ) if( SheetLabel == NULL ) continue; - if( SheetLabel == (DrawSheetLabelStruct*) DrawStruct ) + if( SheetLabel == (Hierarchical_PIN_Sheet_Struct*) DrawStruct ) { ( (DrawSheetStruct*) DrawList )->m_Label = - (DrawSheetLabelStruct*) SheetLabel->Pnext; + (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; SAFE_DELETE( DrawStruct ); return; @@ -420,8 +420,8 @@ void EraseStruct( SCH_ITEM* DrawStruct, SCH_SCREEN* Screen ) { while( SheetLabel->Pnext ) /* Examen de la liste dependante */ { - NextLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext; - if( NextLabel == (DrawSheetLabelStruct*) DrawStruct ) + NextLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; + if( NextLabel == (Hierarchical_PIN_Sheet_Struct*) DrawStruct ) { SheetLabel->Pnext = (EDA_BaseStruct*) NextLabel->Pnext; SAFE_DELETE( DrawStruct ); diff --git a/eeschema/dialog_build_BOM.cpp b/eeschema/dialog_build_BOM.cpp index 9522c41746..d24d1d6e51 100644 --- a/eeschema/dialog_build_BOM.cpp +++ b/eeschema/dialog_build_BOM.cpp @@ -896,7 +896,7 @@ static int GenListeGLabels( ListLabel* List ) { int ItemCount = 0; EDA_BaseStruct* DrawList; - DrawSheetLabelStruct* SheetLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel; DrawSheetPath* sheet; /* Build the screen list */ @@ -931,14 +931,14 @@ static int GenListeGLabels( ListLabel* List ) { if( List ) { - List->m_LabelType = DRAW_SHEETLABEL_STRUCT_TYPE; + List->m_LabelType = DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE; snprintf( List->m_SheetPath, sizeof(List->m_SheetPath), "%s", CONV_TO_UTF8( path ) ); List->m_Label = SheetLabel; List++; } ItemCount++; - SheetLabel = (DrawSheetLabelStruct*) (SheetLabel->Pnext); + SheetLabel = (Hierarchical_PIN_Sheet_Struct*) (SheetLabel->Pnext); } } break; @@ -1060,13 +1060,13 @@ static int ListTriGLabelByVal( ListLabel* Objet1, ListLabel* Objet2 ) int ii; const wxString* Text1, * Text2; - if( Objet1->m_LabelType == DRAW_SHEETLABEL_STRUCT_TYPE ) - Text1 = &( (DrawSheetLabelStruct*) Objet1->m_Label )->m_Text; + if( Objet1->m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) + Text1 = &( (Hierarchical_PIN_Sheet_Struct*) Objet1->m_Label )->m_Text; else Text1 = &( (SCH_TEXT*) Objet1->m_Label )->m_Text; - if( Objet2->m_LabelType == DRAW_SHEETLABEL_STRUCT_TYPE ) - Text2 = &( (DrawSheetLabelStruct*) Objet2->m_Label )->m_Text; + if( Objet2->m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) + Text2 = &( (Hierarchical_PIN_Sheet_Struct*) Objet2->m_Label )->m_Text; else Text2 = &( (SCH_TEXT*) Objet2->m_Label )->m_Text; @@ -1099,13 +1099,13 @@ static int ListTriGLabelBySheet( ListLabel* Objet1, ListLabel* Objet2 ) if( ii == 0 ) { - if( Objet1->m_LabelType == DRAW_SHEETLABEL_STRUCT_TYPE ) - Text1 = &( (DrawSheetLabelStruct*) Objet1->m_Label )->m_Text; + if( Objet1->m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) + Text1 = &( (Hierarchical_PIN_Sheet_Struct*) Objet1->m_Label )->m_Text; else Text1 = &( (SCH_TEXT*) Objet1->m_Label )->m_Text; - if( Objet2->m_LabelType == DRAW_SHEETLABEL_STRUCT_TYPE ) - Text2 = &( (DrawSheetLabelStruct*) Objet2->m_Label )->m_Text; + if( Objet2->m_LabelType == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) + Text2 = &( (Hierarchical_PIN_Sheet_Struct*) Objet2->m_Label )->m_Text; else Text2 = &( (SCH_TEXT*) Objet2->m_Label )->m_Text; @@ -1378,7 +1378,7 @@ static int PrintListeGLabel( FILE* f, ListLabel* List, int NbItems ) { int ii, jj; SCH_LABEL* DrawTextItem; - DrawSheetLabelStruct* DrawSheetLabel; + Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; ListLabel* LabelItem; wxString msg, sheetpath; wxString labeltype; @@ -1408,9 +1408,9 @@ static int PrintListeGLabel( FILE* f, ListLabel* List, int NbItems ) fprintf( f, CONV_TO_UTF8( msg ) ); break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: { - DrawSheetLabel = (DrawSheetLabelStruct*) LabelItem->m_Label; + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) LabelItem->m_Label; jj = DrawSheetLabel->m_Shape; if( jj < 0 ) jj = NET_TMAX; diff --git a/eeschema/divers.cpp b/eeschema/divers.cpp deleted file mode 100644 index f9b2ced6e3..0000000000 --- a/eeschema/divers.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/************************************************/ -/* Routines diverses */ -/************************************************/ - -#include "fctsys.h" -#include "gr_basic.h" - -#include "common.h" - -#include "program.h" -#include "libcmp.h" -#include "general.h" - -#include "protos.h" - - -/**************************************/ -void SetFlagModify(BASE_SCREEN * Window) -/**************************************/ -/* Mise a 1 du flag modified de l'ecran Window, et de la date de la feuille -*/ -{ - if( Window == NULL ) return; - Window->SetModify(); - - /* Mise a jour des dates */ - Window->m_Date = GenDate(); -} - - diff --git a/eeschema/eecreate.cpp b/eeschema/eecreate.cpp index f5e44e16d6..774eeb2f1d 100644 --- a/eeschema/eecreate.cpp +++ b/eeschema/eecreate.cpp @@ -477,7 +477,7 @@ static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer ) EDA_BaseStruct* item; LibDrawPin* pin; DrawLibItemStruct* LibItem = NULL; - DrawSheetLabelStruct* pinsheet; + Hierarchical_PIN_Sheet_Struct* pinsheet; wxPoint itempos; switch( layer ) diff --git a/eeschema/eeload.cpp b/eeschema/eeload.cpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/eeschema/eeredraw.cpp b/eeschema/eeredraw.cpp index da3bb3b7eb..dcc22992d8 100644 --- a/eeschema/eeredraw.cpp +++ b/eeschema/eeredraw.cpp @@ -524,7 +524,7 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, break; } - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE: break; diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index 1c6709f58d..09ac9acfd1 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -126,11 +126,14 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F MsgDiag = FullFileName + _( " was created by a more recent version of EESchema and may not load correctly. Please consider updating!"); DisplayInfo( this, MsgDiag); } +#if 0 + // Compile it if the new versiopn is unreadable by previous eeschema versions else if ( ver < EESCHEMA_VERSION ) { MsgDiag = FullFileName + _( " was created by an older version of EESchema. It will be stored in the new file format when you save this file again."); DisplayInfo( this, MsgDiag); } +#endif LineCount++; if( fgets( Line, 1024 - 1, f ) == NULL || strncmp( Line, "LIBS:", 5 ) != 0 ) @@ -792,7 +795,7 @@ static int ReadSheetDescr( wxWindow* frame, char* Line, FILE* f, BASE_SCREEN* Wi int ii, fieldref, size; char Name1[256], Char1[256], Char2[256]; DrawSheetStruct* SheetStruct; - DrawSheetLabelStruct* SheetLabelStruct, * OldSheetLabel = NULL; + Hierarchical_PIN_Sheet_Struct* SheetLabelStruct, * OldSheetLabel = NULL; int Failed = FALSE; char* ptcar; @@ -901,7 +904,7 @@ static int ReadSheetDescr( wxWindow* frame, char* Line, FILE* f, BASE_SCREEN* Wi if( fieldref > 1 ) { - SheetLabelStruct = new DrawSheetLabelStruct( SheetStruct, + SheetLabelStruct = new Hierarchical_PIN_Sheet_Struct( SheetStruct, wxPoint( 0, 0 ), CONV_FROM_UTF8( Name1 ) ); if( SheetStruct->m_Label == NULL ) OldSheetLabel = SheetStruct->m_Label = SheetLabelStruct; diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index 9c34bd6991..0f5d65228e 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -655,7 +655,7 @@ bool DrawStructInBox( int x1, int y1, int x2, int y2, return TRUE; break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: break; case DRAW_PICK_ITEM_STRUCT_TYPE: @@ -1170,14 +1170,14 @@ LibEDA_BaseStruct* LocatePin( const wxPoint& RefPos, /***********************************************************************************/ -DrawSheetLabelStruct* LocateSheetLabel( DrawSheetStruct* Sheet, const wxPoint& pos ) +Hierarchical_PIN_Sheet_Struct* LocateSheetLabel( DrawSheetStruct* Sheet, const wxPoint& pos ) /***********************************************************************************/ { int size, dy, minx, maxx; - DrawSheetLabelStruct* SheetLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel; SheetLabel = Sheet->m_Label; - while( (SheetLabel) && (SheetLabel->Type()==DRAW_SHEETLABEL_STRUCT_TYPE) ) + while( (SheetLabel) && (SheetLabel->Type()==DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE) ) { size = ( SheetLabel->GetLength() + 1 ) * SheetLabel->m_Size.x; if( SheetLabel->m_Edge ) @@ -1190,7 +1190,7 @@ DrawSheetLabelStruct* LocateSheetLabel( DrawSheetStruct* Sheet, const wxPoint& p && (pos.x <= maxx) && (pos.x >= minx) ) return SheetLabel; - SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext; + SheetLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; } return NULL; @@ -1228,12 +1228,12 @@ LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, /***************************************************************/ -DrawSheetLabelStruct* LocateAnyPinSheet( const wxPoint& RefPos, +Hierarchical_PIN_Sheet_Struct* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList ) /***************************************************************/ { SCH_ITEM* DrawStruct; - DrawSheetLabelStruct* PinSheet = NULL; + Hierarchical_PIN_Sheet_Struct* PinSheet = NULL; for( DrawStruct = DrawList; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) { diff --git a/eeschema/makefile.include b/eeschema/makefile.include index 6173797730..9efb633a13 100644 --- a/eeschema/makefile.include +++ b/eeschema/makefile.include @@ -19,8 +19,9 @@ OBJECTS = eeschema.o\ dangling_ends.o\ cross-probing.o\ setpage.o\ - cmpclass.o\ + class_schematic_items.o\ class_drawsheet.o\ + class_hierarchical_PIN_sheet.o\ class_text-label.o\ component_class.o\ libclass.o\ @@ -38,7 +39,6 @@ OBJECTS = eeschema.o\ bus-wire-junction.o \ eelibs_read_libraryfiles.o \ eelibs_draw_components.o \ - eeload.o\ block.o\ block_libedit.o\ eeredraw.o\ @@ -165,8 +165,6 @@ eelibs_read_libraryfiles.o: eelibs_read_libraryfiles.cpp $(DEPEND) eelibs_draw_components.o: eelibs_draw_components.cpp $(DEPEND) -eeload.o: eeload.cpp $(DEPEND) - block.o: block.cpp $(DEPEND) block_libedit.o: block_libedit.cpp $(DEPEND) diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index ccb42441a5..97652642df 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -451,7 +451,7 @@ static int ListeObjetConnection( WinEDA_SchematicFrame* frame, DrawSheetPath* sh int TransMat[2][2], PartX, PartY, x2, y2; EDA_LibComponentStruct* Entry; LibEDA_BaseStruct* DEntry; - DrawSheetLabelStruct* SheetLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel; DrawSheetPath list; DrawList = sheetlist->LastScreen()->EEDrawList; @@ -653,7 +653,7 @@ static int ListeObjetConnection( WinEDA_SchematicFrame* frame, DrawSheetPath* sh list.Push(STRUCT); SheetLabel = STRUCT->m_Label; for( ; SheetLabel != NULL; - SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext ) + SheetLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext ) { ii = IsBusLabel( SheetLabel->m_Text ); if( ObjNet ) @@ -677,7 +677,7 @@ static int ListeObjetConnection( WinEDA_SchematicFrame* frame, DrawSheetPath* sh break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: DisplayError( frame, wxT( "Netlist: Type DRAW_SHEETLABEL inattendu" ) ); break; diff --git a/eeschema/onleftclick.cpp b/eeschema/onleftclick.cpp index 8bb569c5d2..0aec369468 100644 --- a/eeschema/onleftclick.cpp +++ b/eeschema/onleftclick.cpp @@ -41,7 +41,7 @@ void WinEDA_SchematicFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) case TYPE_SCH_GLOBALLABEL: case TYPE_SCH_HIERLABEL: case TYPE_SCH_TEXT: - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case DRAW_SHEET_STRUCT_TYPE: case DRAW_BUSENTRY_STRUCT_TYPE: case DRAW_JUNCTION_STRUCT_TYPE: @@ -266,7 +266,7 @@ void WinEDA_SchematicFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) GetScreen()->SetCurItem( Create_PinSheet( (DrawSheetStruct*) DrawStruct, DC ) ); } - else if( (DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE) + else if( (DrawStruct->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE) && (DrawStruct->m_Flags != 0) ) { DrawStruct->Place( this, DC ); diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 3064f3894e..bd4bd25397 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -52,7 +52,7 @@ static void AddMenusForWire( wxMenu* PopMenu, EDA_DrawLineStruct* Wire, static void AddMenusForBus( wxMenu* PopMenu, EDA_DrawLineStruct* Bus, WinEDA_SchematicFrame* frame ); static void AddMenusForHierchicalSheet( wxMenu* PopMenu, DrawSheetStruct* Sheet ); -static void AddMenusForPinSheet( wxMenu* PopMenu, DrawSheetLabelStruct* PinSheet ); +static void AddMenusForPinSheet( wxMenu* PopMenu, Hierarchical_PIN_Sheet_Struct* PinSheet ); static void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ); static void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ); static void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ); @@ -107,7 +107,7 @@ bool WinEDA_SchematicFrame::OnRightClick( const wxPoint& MousePos, DrawStruct = SchematicGeneralLocateAndDisplay( FALSE ); if( DrawStruct && (DrawStruct->Type() == DRAW_SHEET_STRUCT_TYPE) ) { - DrawSheetLabelStruct* slabel; + Hierarchical_PIN_Sheet_Struct* slabel; slabel = LocateSheetLabel( (DrawSheetStruct*) DrawStruct, GetScreen()->m_Curseur ); if( slabel ) @@ -242,8 +242,8 @@ bool WinEDA_SchematicFrame::OnRightClick( const wxPoint& MousePos, AddMenusForHierchicalSheet( PopMenu, (DrawSheetStruct*) DrawStruct ); break; - case DRAW_SHEETLABEL_STRUCT_TYPE: - AddMenusForPinSheet( PopMenu, (DrawSheetLabelStruct*) DrawStruct ); + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + AddMenusForPinSheet( PopMenu, (Hierarchical_PIN_Sheet_Struct*) DrawStruct ); break; default: @@ -608,7 +608,7 @@ void AddMenusForHierchicalSheet( wxMenu* PopMenu, DrawSheetStruct* Sheet ) /************************************************************************/ -void AddMenusForPinSheet( wxMenu* PopMenu, DrawSheetLabelStruct* PinSheet ) +void AddMenusForPinSheet( wxMenu* PopMenu, Hierarchical_PIN_Sheet_Struct* PinSheet ) /************************************************************************/ /* Add menu commands for a Pin Sheet (or Sheet label) diff --git a/eeschema/plot.cpp b/eeschema/plot.cpp index b6ba139447..e12c8b4a5b 100644 --- a/eeschema/plot.cpp +++ b/eeschema/plot.cpp @@ -15,7 +15,7 @@ #include "protos.h" /* Variables locales : */ -static void PlotSheetLabelStruct( DrawSheetLabelStruct* Struct ); +static void PlotSheetLabelStruct( Hierarchical_PIN_Sheet_Struct* Struct ); static void PlotTextField( SCH_COMPONENT* DrawLibItem, int FieldNumber, int IsMulti, int DrawMode ); static void PlotPinSymbol( int posX, int posY, int len, int orient, int Shape ); @@ -661,7 +661,7 @@ void PlotTextStruct( EDA_BaseStruct* Struct ) /***********************************************************/ -static void PlotSheetLabelStruct( DrawSheetLabelStruct* Struct ) +static void PlotSheetLabelStruct( Hierarchical_PIN_Sheet_Struct* Struct ) /***********************************************************/ /* Routine de dessin des Sheet Labels type hierarchie */ { @@ -739,7 +739,7 @@ void PlotSheetStruct( DrawSheetStruct* Struct ) /*************************************************/ /* Routine de dessin du bloc type hierarchie */ { - DrawSheetLabelStruct* SheetLabelStruct; + Hierarchical_PIN_Sheet_Struct* SheetLabelStruct; int txtcolor = -1; wxSize size; wxString Text; @@ -788,6 +788,6 @@ void PlotSheetStruct( DrawSheetStruct* Struct ) while( SheetLabelStruct != NULL ) { PlotSheetLabelStruct( SheetLabelStruct ); - SheetLabelStruct = (DrawSheetLabelStruct*) (SheetLabelStruct->Pnext); + SheetLabelStruct = (Hierarchical_PIN_Sheet_Struct*) (SheetLabelStruct->Pnext); } } diff --git a/eeschema/plothpgl.cpp b/eeschema/plothpgl.cpp index 98158e5b6b..5701fc97b7 100644 --- a/eeschema/plothpgl.cpp +++ b/eeschema/plothpgl.cpp @@ -647,7 +647,7 @@ wxString msg; case DRAW_PICK_ITEM_STRUCT_TYPE : break; case DRAW_POLYLINE_STRUCT_TYPE : break; - case DRAW_SHEETLABEL_STRUCT_TYPE : break; + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE : break; case DRAW_MARKER_STRUCT_TYPE : break; case DRAW_SHEET_STRUCT_TYPE : diff --git a/eeschema/plotps.cpp b/eeschema/plotps.cpp index dabd27bc94..462c10a8c4 100644 --- a/eeschema/plotps.cpp +++ b/eeschema/plotps.cpp @@ -483,7 +483,7 @@ wxPoint StartPos, EndPos; case DRAW_PICK_ITEM_STRUCT_TYPE : break; case DRAW_POLYLINE_STRUCT_TYPE : break; - case DRAW_SHEETLABEL_STRUCT_TYPE: break; + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: break; case DRAW_MARKER_STRUCT_TYPE : break; case DRAW_SHEET_STRUCT_TYPE : diff --git a/eeschema/program.h b/eeschema/program.h index d217a5369f..a1240c2c36 100644 --- a/eeschema/program.h +++ b/eeschema/program.h @@ -98,6 +98,14 @@ public: virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + #if defined(DEBUG) /** * Function Show @@ -132,6 +140,14 @@ public: wxString GetComment(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + #if defined(DEBUG) /** * Function Show @@ -162,6 +178,15 @@ public: DrawNoConnectStruct* GenCopy(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + EDA_Rect GetBoundingBox(); }; @@ -188,9 +213,18 @@ public: DrawBusEntryStruct* GenCopy(); - wxPoint m_End(); // retourne la coord de fin du raccord + wxPoint m_End() const ; // retourne la coord de fin du raccord virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + EDA_Rect GetBoundingBox(); }; @@ -214,6 +248,15 @@ public: DrawPolylineStruct* GenCopy(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + }; class DrawJunctionStruct : public SCH_ITEM @@ -235,6 +278,15 @@ public: DrawJunctionStruct* GenCopy(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + }; diff --git a/eeschema/protos.h b/eeschema/protos.h index ece31f84c2..444599ff74 100644 --- a/eeschema/protos.h +++ b/eeschema/protos.h @@ -151,11 +151,11 @@ SCH_ITEM * PickStruct(const wxPoint & refpos, BASE_SCREEN* screen, int SearchMas LibEDA_BaseStruct * LocateDrawItem(SCH_SCREEN * Screen, const wxPoint & refpoint, EDA_LibComponentStruct * LibEntry, int Unit, int Convert, int masque); -DrawSheetLabelStruct * LocateSheetLabel(DrawSheetStruct *Sheet, const wxPoint & pos); +Hierarchical_PIN_Sheet_Struct * LocateSheetLabel(DrawSheetStruct *Sheet, const wxPoint & pos); LibDrawPin * LocateAnyPin(SCH_ITEM *DrawList, const wxPoint & RefPos, SCH_COMPONENT ** libpart = NULL ); -DrawSheetLabelStruct * LocateAnyPinSheet(const wxPoint & RefPos, +Hierarchical_PIN_Sheet_Struct * LocateAnyPinSheet(const wxPoint & RefPos, SCH_ITEM *DrawList); int distance(int dx, int dy, int spot_cX, int spot_cY, int seuil); diff --git a/eeschema/save_schemas.cpp b/eeschema/save_schemas.cpp index f16759d89d..09d38d73f1 100644 --- a/eeschema/save_schemas.cpp +++ b/eeschema/save_schemas.cpp @@ -1,6 +1,6 @@ - /*********************************************/ - /* eesave.cpp Module to Save EESchema files */ - /*********************************************/ +/*********************************************/ +/* eesave.cpp Module to Save EESchema files */ +/*********************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -14,7 +14,7 @@ #include "protos.h" /* Fonctions Locales */ -static void SaveLayers(FILE *f); +static void SaveLayers( FILE* f ); /* Variables locales */ @@ -23,307 +23,259 @@ static void SaveLayers(FILE *f); * FileSave controls how the file is to be saved - under what name. * * Returns TRUE if the file has been saved. * *****************************************************************************/ -bool WinEDA_SchematicFrame::SaveEEFile(SCH_SCREEN *screen, int FileSave) +bool WinEDA_SchematicFrame::SaveEEFile( SCH_SCREEN* screen, int FileSave ) { wxString msg; wxString Name, BakName; - const wxChar **LibNames; - const char * layer, *width; - int ii, shape; - bool Failed = FALSE; - EDA_BaseStruct *Phead; - Ki_PageDescr * PlotSheet; - FILE *f; + FILE* f; wxString dirbuf; - if ( screen == NULL ) screen = (SCH_SCREEN*)GetScreen(); + if( screen == NULL ) + screen = (SCH_SCREEN*) GetScreen(); /* If no name exists in the window yet - save as new. */ - if( screen->m_FileName.IsEmpty() ) FileSave = FILE_SAVE_NEW; + if( screen->m_FileName.IsEmpty() ) + FileSave = FILE_SAVE_NEW; - switch (FileSave) + switch( FileSave ) { - case FILE_SAVE_AS: - dirbuf = wxGetCwd() + STRING_DIR_SEP; - Name = MakeFileName(dirbuf, screen->m_FileName, g_SchExtBuffer); - /* Rename the old file to a '.bak' one: */ - BakName = Name; - if ( wxFileExists(Name) ) - { - ChangeFileNameExt(BakName, wxT(".bak")); - wxRemoveFile(BakName); /* delete Old .bak file */ - if( ! wxRenameFile(Name, BakName) ){ - DisplayError(this, wxT("Warning: unable to rename old file"), 10); - } - } - break; - - case FILE_SAVE_NEW: + case FILE_SAVE_AS: + dirbuf = wxGetCwd() + STRING_DIR_SEP; + Name = MakeFileName( dirbuf, screen->m_FileName, g_SchExtBuffer ); + /* Rename the old file to a '.bak' one: */ + BakName = Name; + if( wxFileExists( Name ) ) { - wxString mask = wxT("*") + g_SchExtBuffer; - Name = EDA_FileSelector(_("Schematic files:"), - wxEmptyString, /* Chemin par defaut */ - screen->m_FileName, /* nom fichier par defaut, et resultat */ - g_SchExtBuffer, /* extension par defaut */ - mask, /* Masque d'affichage */ - this, - wxFD_SAVE, - FALSE - ); - if ( Name.IsEmpty() ) return FALSE; - - screen->m_FileName = Name; - dirbuf = wxGetCwd() + STRING_DIR_SEP; - Name = MakeFileName(dirbuf, Name, g_SchExtBuffer); - - break; + ChangeFileNameExt( BakName, wxT( ".bak" ) ); + wxRemoveFile( BakName ); /* delete Old .bak file */ + if( !wxRenameFile( Name, BakName ) ) + { + DisplayError( this, wxT( "Warning: unable to rename old file" ), 10 ); + } } + break; - default: break; + case FILE_SAVE_NEW: + { + wxString mask = wxT( "*" ) + g_SchExtBuffer; + Name = EDA_FileSelector( _( "Schematic files:" ), + wxEmptyString, /* Chemin par defaut */ + screen->m_FileName, /* nom fichier par defaut, et resultat */ + g_SchExtBuffer, /* extension par defaut */ + mask, /* Masque d'affichage */ + this, + wxFD_SAVE, + FALSE + ); + if( Name.IsEmpty() ) + return FALSE; + + screen->m_FileName = Name; + dirbuf = wxGetCwd() + STRING_DIR_SEP; + Name = MakeFileName( dirbuf, Name, g_SchExtBuffer ); + + break; } - if ((f = wxFopen(Name, wxT("wt"))) == NULL) + default: + break; + } + + if( ( f = wxFopen( Name, wxT( "wt" ) ) ) == NULL ) { - msg = _("Failed to create file ") + Name; - DisplayError(this, msg); + msg = _( "Failed to create file " ) + Name; + DisplayError( this, msg ); return FALSE; } - msg = _("Save file ") + Name; - Affiche_Message(msg); + if( FileSave == FILE_SAVE_NEW ) + screen->m_FileName = Name; + + bool success = screen->Save( f ); + if( !success ) + DisplayError( this, _( "File write operation failed." ) ); + else + screen->ClrModify(); + + + fclose( f ); + + return success; +} + + +/*****************************************/ +bool SCH_SCREEN::Save( FILE* aFile ) const +/*****************************************/ + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +{ + const wxChar** LibNames; + wxString Name, msg; + int ii; + bool Failed = FALSE; + EDA_BaseStruct* Phead; + Ki_PageDescr* PlotSheet; LibNames = GetLibNames(); - BakName.Empty(); // temporary buffer! - for (ii = 0; LibNames[ii] != NULL; ii++) + for( ii = 0; LibNames[ii] != NULL; ii++ ) { - if (ii > 0) BakName += wxT(","); - BakName += LibNames[ii]; + if( ii > 0 ) + Name += wxT( "," ); + Name += LibNames[ii]; } - MyFree( LibNames); - if (fprintf(f, "%s %s %d\n", EESCHEMA_FILE_STAMP, - SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION) == EOF || - fprintf(f, "LIBS:%s\n", CONV_TO_UTF8(BakName)) == EOF) + MyFree( LibNames ); + + // Creates header + if( fprintf( aFile, "%s %s %d\n", EESCHEMA_FILE_STAMP, + SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION ) == EOF + || fprintf( aFile, "LIBS:%s\n", CONV_TO_UTF8( Name ) ) == EOF ) { - DisplayError(this, _("File write operation failed.")); - fclose(f); return FALSE; } - screen->ClrModify(); + SaveLayers( aFile ); - SaveLayers(f); - /* Sauvegarde des dimensions du schema, des textes du cartouche.. */ + /* Write page info */ - PlotSheet = screen->m_CurrentSheetDesc; - fprintf(f,"$Descr %s %d %d\n",CONV_TO_UTF8(PlotSheet->m_Name), - PlotSheet->m_Size.x, PlotSheet->m_Size.y); + PlotSheet = m_CurrentSheetDesc; + fprintf( aFile, "$Descr %s %d %d\n", CONV_TO_UTF8( PlotSheet->m_Name ), + PlotSheet->m_Size.x, PlotSheet->m_Size.y ); - fprintf(f,"Sheet %d %d\n",screen->m_ScreenNumber, screen->m_NumberOfScreen); - fprintf(f,"Title \"%s\"\n",CONV_TO_UTF8(screen->m_Title)); - fprintf(f,"Date \"%s\"\n",CONV_TO_UTF8(screen->m_Date)); - fprintf(f,"Rev \"%s\"\n",CONV_TO_UTF8(screen->m_Revision)); - fprintf(f,"Comp \"%s\"\n",CONV_TO_UTF8(screen->m_Company)); - fprintf(f,"Comment1 \"%s\"\n", CONV_TO_UTF8(screen->m_Commentaire1)); - fprintf(f,"Comment2 \"%s\"\n", CONV_TO_UTF8(screen->m_Commentaire2)); - fprintf(f,"Comment3 \"%s\"\n", CONV_TO_UTF8(screen->m_Commentaire3)); - fprintf(f,"Comment4 \"%s\"\n", CONV_TO_UTF8(screen->m_Commentaire4)); + fprintf( aFile, "Sheet %d %d\n", m_ScreenNumber, m_NumberOfScreen ); + fprintf( aFile, "Title \"%s\"\n", CONV_TO_UTF8( m_Title ) ); + fprintf( aFile, "Date \"%s\"\n", CONV_TO_UTF8( m_Date ) ); + fprintf( aFile, "Rev \"%s\"\n", CONV_TO_UTF8( m_Revision ) ); + fprintf( aFile, "Comp \"%s\"\n", CONV_TO_UTF8( m_Company ) ); + fprintf( aFile, "Comment1 \"%s\"\n", CONV_TO_UTF8( m_Commentaire1 ) ); + fprintf( aFile, "Comment2 \"%s\"\n", CONV_TO_UTF8( m_Commentaire2 ) ); + fprintf( aFile, "Comment3 \"%s\"\n", CONV_TO_UTF8( m_Commentaire3 ) ); + fprintf( aFile, "Comment4 \"%s\"\n", CONV_TO_UTF8( m_Commentaire4 ) ); - fprintf(f,"$EndDescr\n"); + fprintf( aFile, "$EndDescr\n" ); - /* Sauvegarde des elements du dessin */ - Phead = screen->EEDrawList; - while (Phead) + /* Saving schematic items */ + Phead = EEDrawList; + while( Phead ) + { + switch( Phead->Type() ) { - switch(Phead->Type()) - { - case TYPE_SCH_COMPONENT: /* Its a library item. */ - ((SCH_COMPONENT *) Phead)->Save( f ); - break; - - case DRAW_SHEET_STRUCT_TYPE: /* Its a Sheet item. */ - ((DrawSheetStruct *) Phead)->Save( f ); - break; - - case DRAW_SEGMENT_STRUCT_TYPE: /* Its a Segment item. */ - #undef STRUCT - #define STRUCT ((EDA_DrawLineStruct *) Phead) - layer = "Notes"; width = "Line"; - if (STRUCT->GetLayer() == LAYER_WIRE) layer = "Wire"; - if (STRUCT->GetLayer() == LAYER_BUS) layer = "Bus"; - if( STRUCT->m_Width != GR_NORM_WIDTH) layer = "Bus"; - if (fprintf(f, "Wire %s %s\n", layer, width ) == EOF) - { - Failed = TRUE; break; - } - if (fprintf(f, "\t%-4d %-4d %-4d %-4d\n", - STRUCT->m_Start.x,STRUCT->m_Start.y, - STRUCT->m_End.x,STRUCT->m_End.y) == EOF) - { - Failed = TRUE; break; - } - break; - - case DRAW_BUSENTRY_STRUCT_TYPE: /* Its a Raccord item. */ - #undef STRUCT - #define STRUCT ((DrawBusEntryStruct *) Phead) - layer = "Wire"; width = "Line"; - if (STRUCT->GetLayer() == LAYER_BUS) - { - layer = "Bus"; width = "Bus"; - } - - if (fprintf(f, "Entry %s %s\n", layer, width) == EOF) - { - Failed = TRUE; break; - } - if( fprintf(f, "\t%-4d %-4d %-4d %-4d\n", - STRUCT->m_Pos.x,STRUCT->m_Pos.y, - STRUCT->m_End().x,STRUCT->m_End().y) == EOF) - { - Failed = TRUE; break; - } - break; - - case DRAW_POLYLINE_STRUCT_TYPE: /* Its a polyline item. */ - #undef STRUCT - #define STRUCT ((DrawPolylineStruct *) Phead) - layer = "Notes"; width = "Line"; - if (STRUCT->GetLayer() == LAYER_WIRE) layer = "Wire"; - if (STRUCT->GetLayer() == LAYER_BUS) layer = "Bus"; - if( STRUCT->m_Width != GR_NORM_WIDTH) width = "Bus"; - if (fprintf(f, "Poly %s %s %d\n", - width, layer, STRUCT->m_NumOfPoints) == EOF) - { - Failed = TRUE; break; - } - for (ii = 0; ii < STRUCT->m_NumOfPoints; ii++) - { - if (fprintf(f, "\t%-4d %-4d\n", - STRUCT->m_Points[ii*2], - STRUCT->m_Points[ii*2+1]) == EOF) - { - Failed = TRUE; - break; - } - } - break; - - case DRAW_JUNCTION_STRUCT_TYPE: /* Its a connection item. */ - #undef STRUCT - #define STRUCT ((DrawJunctionStruct *) Phead) - if (fprintf(f, "Connection ~ %-4d %-4d\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y) == EOF) - { - Failed = TRUE; - } - break; - - case DRAW_NOCONNECT_STRUCT_TYPE: /* Its a NoConnection item. */ - #undef STRUCT - #define STRUCT ((DrawNoConnectStruct *) Phead) - if (fprintf(f, "NoConn ~ %-4d %-4d\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y) == EOF) - { - Failed = TRUE; - } - break; - - case TYPE_SCH_TEXT: /* Its a text item. */ - #undef STRUCT - #define STRUCT ((SCH_TEXT *) Phead) - if (fprintf(f, "Text Notes %-4d %-4d %-4d %-4d ~\n%s\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y, - STRUCT->m_Orient, STRUCT->m_Size.x, - CONV_TO_UTF8(STRUCT->m_Text)) == EOF) - Failed = TRUE; - break; - - - case TYPE_SCH_LABEL: /* Its a label item. */ - #undef STRUCT - #define STRUCT ((SCH_LABEL *) Phead) - shape = '~'; - if (fprintf(f, "Text Label %-4d %-4d %-4d %-4d %c\n%s\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y, - STRUCT->m_Orient, STRUCT->m_Size.x, shape, - CONV_TO_UTF8(STRUCT->m_Text)) == EOF) - Failed = TRUE; - break; - - case TYPE_SCH_GLOBALLABEL: /* Its a Global label item. */ - #undef STRUCT - #define STRUCT ((SCH_GLOBALLABEL *) Phead) - shape = STRUCT->m_Shape; - if (fprintf(f, "Text GLabel %-4d %-4d %-4d %-4d %s\n%s\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y, - STRUCT->m_Orient, STRUCT->m_Size.x, - SheetLabelType[shape], - CONV_TO_UTF8(STRUCT->m_Text)) == EOF) - Failed = TRUE; - break; - - case TYPE_SCH_HIERLABEL: /* Its a Hierarchical label item. */ - #undef STRUCT - #define STRUCT ((SCH_HIERLABEL *) Phead) - shape = STRUCT->m_Shape; - if (fprintf(f, "Text HLabel %-4d %-4d %-4d %-4d %s\n%s\n", - STRUCT->m_Pos.x, STRUCT->m_Pos.y, - STRUCT->m_Orient, STRUCT->m_Size.x, - SheetLabelType[shape], - CONV_TO_UTF8(STRUCT->m_Text)) == EOF) - Failed = TRUE; - break; - - case DRAW_MARKER_STRUCT_TYPE: /* Its a marker item. */ - #undef STRUCT - #define STRUCT ((DrawMarkerStruct *) Phead) - if( STRUCT->GetComment() ) msg = STRUCT->GetComment(); - else msg.Empty(); - if (fprintf(f, "Kmarq %c %-4d %-4d \"%s\" F=%X\n", - (int) STRUCT->m_Type + 'A', - STRUCT->m_Pos.x, STRUCT->m_Pos.y, - CONV_TO_UTF8(msg), STRUCT->m_MarkFlags) == EOF) - { - Failed = TRUE; - } - break; - - case DRAW_SHEETLABEL_STRUCT_TYPE : - case DRAW_PICK_ITEM_STRUCT_TYPE : - break; - - default: - break; - } - - if (Failed) - { - DisplayError(this, _("File write operation failed.")); + case TYPE_SCH_COMPONENT: /* Its a library item. */ + if( !( (SCH_COMPONENT*) Phead )->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_SHEET_STRUCT_TYPE: /* Its a Sheet item. */ + if( !( (DrawSheetStruct*) Phead )->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_SEGMENT_STRUCT_TYPE: /* Its a Segment item. */ + #undef STRUCT + #define STRUCT ( (EDA_DrawLineStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_BUSENTRY_STRUCT_TYPE: /* Its a Raccord item. */ + #undef STRUCT + #define STRUCT ( (DrawBusEntryStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_POLYLINE_STRUCT_TYPE: /* Its a polyline item. */ + #undef STRUCT + #define STRUCT ( (DrawPolylineStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_JUNCTION_STRUCT_TYPE: /* Its a connection item. */ + #undef STRUCT + #define STRUCT ( (DrawJunctionStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_NOCONNECT_STRUCT_TYPE: /* Its a NoConnection item. */ + #undef STRUCT + #define STRUCT ( (DrawNoConnectStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case TYPE_SCH_TEXT: /* Its a text item. */ + #undef STRUCT + #define STRUCT ( (SCH_TEXT*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + + case TYPE_SCH_LABEL: /* Its a label item. */ + #undef STRUCT + #define STRUCT ( (SCH_LABEL*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case TYPE_SCH_GLOBALLABEL: /* Its a Global label item. */ + #undef STRUCT + #define STRUCT ( (SCH_GLOBALLABEL*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case TYPE_SCH_HIERLABEL: /* Its a Hierarchical label item. */ + #undef STRUCT + #define STRUCT ( (SCH_HIERLABEL*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_MARKER_STRUCT_TYPE: /* Its a marker item. */ + #undef STRUCT + #define STRUCT ( (DrawMarkerStruct*) Phead ) + if( !STRUCT->Save( aFile ) ) + Failed = TRUE; + break; + + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + case DRAW_PICK_ITEM_STRUCT_TYPE: + break; + + default: + break; + } + + if( Failed ) break; - } Phead = Phead->Pnext; - } - if (fprintf(f, "$EndSCHEMATC\n") == EOF) Failed = TRUE; + } - fclose(f); - - if (FileSave == FILE_SAVE_NEW) screen->m_FileName = Name; + if( fprintf( aFile, "$EndSCHEMATC\n" ) == EOF ) + Failed = TRUE; return !Failed; } /****************************/ -static void SaveLayers(FILE *f) +static void SaveLayers( FILE* f ) /****************************/ + /* Save a Layer Structure to a file -theses infos are not used in eeschema -*/ + * theses infos are not used in eeschema + */ { - fprintf(f,"EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers,g_LayerDescr.CurrentLayer); - fprintf(f,"EELAYER END\n"); + fprintf( f, "EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers, g_LayerDescr.CurrentLayer ); + fprintf( f, "EELAYER END\n" ); } - - diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 8d8b3e067b..8302c39a83 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -384,13 +384,13 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_SCH_EDIT_PINSHEET: - Edit_PinSheet( (DrawSheetLabelStruct*) + Edit_PinSheet( (Hierarchical_PIN_Sheet_Struct*) GetScreen()->GetCurItem(), &dc ); break; case ID_POPUP_SCH_MOVE_PINSHEET: DrawPanel->MouseToCursorSchema(); - StartMove_PinSheet( (DrawSheetLabelStruct*) + StartMove_PinSheet( (Hierarchical_PIN_Sheet_Struct*) GetScreen()->GetCurItem(), &dc ); break; @@ -781,7 +781,7 @@ void WinEDA_SchematicFrame::Process_Move_Item( SCH_ITEM* DrawStruct, wxDC* DC ) break; case DRAW_MARKER_STRUCT_TYPE: - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: default: wxString msg; msg.Printf( diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index c2ec31e28d..139753a83d 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -141,11 +141,11 @@ void SwapData( EDA_BaseStruct* Item ) EXCHG( SOURCE->m_Pos, DEST->m_Pos ); break; - case DRAW_SHEETLABEL_STRUCT_TYPE: + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: #undef SOURCE #undef DEST - #define SOURCE ( (DrawSheetLabelStruct*) Item ) - #define DEST ( (DrawSheetLabelStruct*) image ) + #define SOURCE ( (Hierarchical_PIN_Sheet_Struct*) Item ) + #define DEST ( (Hierarchical_PIN_Sheet_Struct*) image ) EXCHG( SOURCE->m_Edge, DEST->m_Edge ); EXCHG( SOURCE->m_Shape, DEST->m_Shape ); break; diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index e6e972895e..44a5017802 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -400,7 +400,7 @@ DrawSheetStruct* WinEDA_SchematicFrame::CreateSheet( wxDC* DC ) void WinEDA_SchematicFrame::ReSizeSheet( DrawSheetStruct* Sheet, wxDC* DC ) /*******************************************************************************/ { - DrawSheetLabelStruct* sheetlabel; + Hierarchical_PIN_Sheet_Struct* sheetlabel; if( Sheet == NULL ) return; @@ -430,7 +430,7 @@ void WinEDA_SchematicFrame::ReSizeSheet( DrawSheetStruct* Sheet, wxDC* DC ) (int) ( (sheetlabel->GetLength() + 1) * sheetlabel->m_Size.x ) ); s_SheetMindy = MAX( s_SheetMindy, sheetlabel->m_Pos.y - Sheet->m_Pos.y ); - sheetlabel = (DrawSheetLabelStruct*) sheetlabel->Pnext; + sheetlabel = (Hierarchical_PIN_Sheet_Struct*) sheetlabel->Pnext; } DrawPanel->ManageCurseur = DeplaceSheet; @@ -467,7 +467,7 @@ void WinEDA_SchematicFrame::StartMoveSheet( DrawSheetStruct* Sheet, wxDC* DC ) static void DeplaceSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) { wxPoint move_vector; - DrawSheetLabelStruct* SheetLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel; BASE_SCREEN* screen = panel->m_Parent->GetScreen(); DrawSheetStruct* Sheet = (DrawSheetStruct*) @@ -488,7 +488,7 @@ static void DeplaceSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) { if( SheetLabel->m_Edge ) SheetLabel->m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x; - SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext; + SheetLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; } } else /* Move Sheet */ diff --git a/eeschema/sheetlab.cpp b/eeschema/sheetlab.cpp index 46f9a6fc12..4bc795071c 100644 --- a/eeschema/sheetlab.cpp +++ b/eeschema/sheetlab.cpp @@ -39,7 +39,7 @@ class WinEDA_PinSheetPropertiesFrame : public wxDialog private: WinEDA_SchematicFrame* m_Parent; - DrawSheetLabelStruct* m_CurrentPinSheet; + Hierarchical_PIN_Sheet_Struct* m_CurrentPinSheet; wxRadioBox* m_PinSheetType; wxRadioBox* m_PinSheetShape; WinEDA_GraphicTextCtrl* m_TextWin; @@ -48,7 +48,7 @@ public: // Constructor and destructor WinEDA_PinSheetPropertiesFrame( WinEDA_SchematicFrame* parent, - DrawSheetLabelStruct* curr_pinsheet, + Hierarchical_PIN_Sheet_Struct* curr_pinsheet, const wxPoint& framepos = wxPoint( -1, -1 ) ); ~WinEDA_PinSheetPropertiesFrame() { }; @@ -68,7 +68,7 @@ END_EVENT_TABLE() /**********************************************************************************/ WinEDA_PinSheetPropertiesFrame::WinEDA_PinSheetPropertiesFrame( WinEDA_SchematicFrame* parent, - DrawSheetLabelStruct* curr_pinsheet, + Hierarchical_PIN_Sheet_Struct* curr_pinsheet, const wxPoint& framepos ) : wxDialog( parent, -1, _( "PinSheet Properties:" ), framepos, wxSize( 340, 220 ), DIALOG_STYLE ) @@ -142,7 +142,7 @@ static void ExitPinSheet( WinEDA_DrawPanel* Panel, wxDC* DC ) /* Routine de sortie du Menu d'Edition Des NETS (Labels) SHEET */ { - DrawSheetLabelStruct* SheetLabel = (DrawSheetLabelStruct*) + Hierarchical_PIN_Sheet_Struct* SheetLabel = (Hierarchical_PIN_Sheet_Struct*) Panel->GetScreen()->GetCurItem(); if( SheetLabel == NULL ) @@ -169,7 +169,7 @@ static void ExitPinSheet( WinEDA_DrawPanel* Panel, wxDC* DC ) * de deplacement * Si le NetSheet est nouveau, il est pointe par NewSheetLabel */ -void DrawSheetLabelStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) +void Hierarchical_PIN_Sheet_Struct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) { DrawSheetStruct* Sheet = (DrawSheetStruct*) m_Parent; @@ -179,7 +179,7 @@ void DrawSheetLabelStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) Sheet->m_Label = this; else { - DrawSheetLabelStruct* pinsheet = Sheet->m_Label; + Hierarchical_PIN_Sheet_Struct* pinsheet = Sheet->m_Label; while( pinsheet ) { if( pinsheet->Pnext == NULL ) @@ -187,7 +187,7 @@ void DrawSheetLabelStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) pinsheet->Pnext = this; break; } - pinsheet = (DrawSheetLabelStruct*) pinsheet->Pnext; + pinsheet = (Hierarchical_PIN_Sheet_Struct*) pinsheet->Pnext; } } } @@ -215,7 +215,7 @@ void DrawSheetLabelStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) /*******************************************************************************/ -void WinEDA_SchematicFrame::StartMove_PinSheet( DrawSheetLabelStruct* SheetLabel, +void WinEDA_SchematicFrame::StartMove_PinSheet( Hierarchical_PIN_Sheet_Struct* SheetLabel, wxDC* DC ) /*******************************************************************************/ /* Initialise un deplacement de NetSheet */ @@ -236,7 +236,7 @@ void WinEDA_SchematicFrame::StartMove_PinSheet( DrawSheetLabelStruct* SheetLabel static void Move_PinSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) { - DrawSheetLabelStruct* SheetLabel = (DrawSheetLabelStruct*) + Hierarchical_PIN_Sheet_Struct* SheetLabel = (Hierarchical_PIN_Sheet_Struct*) panel->m_Parent->GetScreen()->GetCurItem(); if( SheetLabel == NULL ) @@ -268,7 +268,7 @@ static void Move_PinSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) /***************************************************************************/ -void WinEDA_SchematicFrame::Edit_PinSheet( DrawSheetLabelStruct* SheetLabel, +void WinEDA_SchematicFrame::Edit_PinSheet( Hierarchical_PIN_Sheet_Struct* SheetLabel, wxDC* DC ) /***************************************************************************/ /* Modification du texte d'un net sheet */ @@ -288,7 +288,7 @@ void WinEDA_SchematicFrame::Edit_PinSheet( DrawSheetLabelStruct* SheetLabel, /***************************************************************/ -DrawSheetLabelStruct* WinEDA_SchematicFrame::Create_PinSheet( +Hierarchical_PIN_Sheet_Struct* WinEDA_SchematicFrame::Create_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ) /**************************************************************/ @@ -297,7 +297,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Create_PinSheet( */ { wxString Line, Text; - DrawSheetLabelStruct* NewSheetLabel; + Hierarchical_PIN_Sheet_Struct* NewSheetLabel; switch( CurrentTypeLabel ) { @@ -332,7 +332,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Create_PinSheet( GetScreen()->SetModify(); /* Creation en memoire */ - NewSheetLabel = new DrawSheetLabelStruct( Sheet, wxPoint( 0, 0 ), Line ); + NewSheetLabel = new Hierarchical_PIN_Sheet_Struct( Sheet, wxPoint( 0, 0 ), Line ); NewSheetLabel->m_Flags = IS_NEW; NewSheetLabel->m_Size = NetSheetTextSize; NewSheetLabel->m_Shape = CurrentTypeLabel; @@ -348,7 +348,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Create_PinSheet( /*****************************************************************************/ -DrawSheetLabelStruct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ) +Hierarchical_PIN_Sheet_Struct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ) /*****************************************************************************/ /* Permet de creer automatiquement les Sheet Labels a partir des Labels Globaux @@ -356,7 +356,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* S */ { EDA_BaseStruct* DrawStruct; - DrawSheetLabelStruct* NewSheetLabel, * SheetLabel = NULL; + Hierarchical_PIN_Sheet_Struct* NewSheetLabel, * SheetLabel = NULL; SCH_HIERLABEL* HLabel = NULL; if(!Sheet->m_AssociatedScreen) return NULL; @@ -370,7 +370,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* S /* Ici un G-Label a ete trouve: y a t-il un SheetLabel correspondant */ SheetLabel = Sheet->m_Label; - for( ; SheetLabel != NULL; SheetLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext ) + for( ; SheetLabel != NULL; SheetLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext ) { if( SheetLabel->m_Text.CmpNoCase( HLabel->m_Text ) == 0 ) { @@ -393,7 +393,7 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* S GetScreen()->SetModify(); /* Creation en memoire */ - NewSheetLabel = new DrawSheetLabelStruct( Sheet, wxPoint( 0, 0 ), HLabel->m_Text ); + NewSheetLabel = new Hierarchical_PIN_Sheet_Struct( Sheet, wxPoint( 0, 0 ), HLabel->m_Text ); NewSheetLabel->m_Flags = IS_NEW; NewSheetLabel->m_Size = NetSheetTextSize; CurrentTypeLabel = NewSheetLabel->m_Shape = HLabel->m_Shape; @@ -409,18 +409,18 @@ DrawSheetLabelStruct* WinEDA_SchematicFrame::Import_PinSheet( DrawSheetStruct* S /**************************************************************/ void WinEDA_SchematicFrame::DeleteSheetLabel( wxDC* DC, - DrawSheetLabelStruct* SheetLabelToDel ) + Hierarchical_PIN_Sheet_Struct* SheetLabelToDel ) /**************************************************************/ /* - * Routine de suppression de 1 Structure type (DrawSheetLabelStruct. + * Routine de suppression de 1 Structure type (Hierarchical_PIN_Sheet_Struct. * Cette Structure ne peut etre mise en pile "undelete" car il ne serait pas * possible de la ratacher a la 'DrawSheetStruct' d'origine * si DC != NULL, effacement a l'ecran du dessin */ { EDA_BaseStruct* DrawStruct; - DrawSheetLabelStruct* SheetLabel, * NextLabel; + Hierarchical_PIN_Sheet_Struct* SheetLabel, * NextLabel; if( DC ) RedrawOneStruct( DrawPanel, DC, SheetLabelToDel, g_XorMode ); @@ -441,12 +441,12 @@ void WinEDA_SchematicFrame::DeleteSheetLabel( wxDC* DC, SheetLabel = ( (DrawSheetStruct*) DrawStruct )->m_Label; if( SheetLabel == SheetLabelToDel ) ( (DrawSheetStruct*) DrawStruct )->m_Label = - (DrawSheetLabelStruct*) SheetLabel->Pnext; + (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; else while( SheetLabel ) /* Examen de la liste dependante et suppression chainage */ { - NextLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext; + NextLabel = (Hierarchical_PIN_Sheet_Struct*) SheetLabel->Pnext; if( NextLabel == SheetLabelToDel ) { SheetLabel->Pnext = NextLabel->Pnext; diff --git a/include/base_struct.h b/include/base_struct.h index 1e79212137..7be1b08ebb 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -56,7 +56,7 @@ enum KICAD_T { DRAW_SEGMENT_STRUCT_TYPE, DRAW_BUSENTRY_STRUCT_TYPE, DRAW_SHEET_STRUCT_TYPE, - DRAW_SHEETLABEL_STRUCT_TYPE, + DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE, DRAW_MARKER_STRUCT_TYPE, DRAW_NOCONNECT_STRUCT_TYPE, DRAW_PART_TEXT_STRUCT_TYPE, diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h index 681bbae339..ddf7c0986e 100644 --- a/include/sch_item_struct.h +++ b/include/sch_item_struct.h @@ -21,13 +21,9 @@ protected: public: - SCH_ITEM( EDA_BaseStruct* aParent, KICAD_T aType ) : - EDA_BaseStruct( aParent, aType ), - m_Layer( 0 ) - { - } + SCH_ITEM( EDA_BaseStruct* aParent, KICAD_T aType ); - ~SCH_ITEM(){} + ~SCH_ITEM(); virtual wxString GetClass() const { @@ -62,6 +58,13 @@ public: /* fonction de placement */ virtual void Place( WinEDA_DrawFrame* frame, wxDC* DC ); + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + virtual bool Save( FILE* aFile ) const = 0; }; @@ -110,6 +113,16 @@ public: { } + /** + * Function Save + * Do nothing, needed for SCH_ITEM compat. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const + { + return false; + } #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ); diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 15359ebb27..da8bbcf2a3 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -195,14 +195,14 @@ public: private: void StartMoveSheet( DrawSheetStruct* sheet, wxDC* DC ); - DrawSheetLabelStruct* Create_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ); - void Edit_PinSheet( DrawSheetLabelStruct* SheetLabel, wxDC* DC ); - void StartMove_PinSheet( DrawSheetLabelStruct* SheetLabel, wxDC* DC ); - void Place_PinSheet( DrawSheetLabelStruct* SheetLabel, wxDC* DC ); - DrawSheetLabelStruct* Import_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ); + Hierarchical_PIN_Sheet_Struct* Create_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ); + void Edit_PinSheet( Hierarchical_PIN_Sheet_Struct* SheetLabel, wxDC* DC ); + void StartMove_PinSheet( Hierarchical_PIN_Sheet_Struct* SheetLabel, wxDC* DC ); + void Place_PinSheet( Hierarchical_PIN_Sheet_Struct* SheetLabel, wxDC* DC ); + Hierarchical_PIN_Sheet_Struct* Import_PinSheet( DrawSheetStruct* Sheet, wxDC* DC ); public: - void DeleteSheetLabel( wxDC* DC, DrawSheetLabelStruct* SheetLabelToDel ); + void DeleteSheetLabel( wxDC* DC, Hierarchical_PIN_Sheet_Struct* SheetLabelToDel ); private: diff --git a/include/wxstruct.h b/include/wxstruct.h index a7e2a86062..8da0e1544b 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -76,7 +76,7 @@ class SCH_TEXT; class EDA_DrawLineStruct; class DrawSheetStruct; class DrawSheetPath; -class DrawSheetLabelStruct; +class Hierarchical_PIN_Sheet_Struct; class SCH_COMPONENT; class LibDrawField; class PartTextStruct; diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 52a3ea2b17..1cb68a5de5 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -13,6 +13,17 @@ wxPoint BOARD_ITEM::ZeroOffset(0,0); + +// define SCH_ITEM::Place() (defined and used in eeschema but not for pcbnew) +// this is an ugly workaround to a linking problem in debug mode +// which needs to define SCH_ITEM::Place() when not really used. +#include "sch_item_struct.h" +void SCH_ITEM::Place( WinEDA_DrawFrame* frame, wxDC* DC ) +{ +} + + + /*****************/ /* Class BOARD: */ /*****************/