Commit 1e7d95d5 authored by Wayne Stambaugh's avatar Wayne Stambaugh

Begin schematic object rationalization and other minor improvements

parent 704e3c51
...@@ -4,6 +4,22 @@ KiCad ChangeLog 2010 ...@@ -4,6 +4,22 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2010-oct-26 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++EESchema
* Change screen list object array type from wxARRAY to std::vector.
* Move all SCH_SCREEN methods into file class_sch_screen.cpp.
* Move find dialog files to dialogs sub-directory.
* Remove hallucinatory save and restore methods I wrote from component
library draw objects.
* Merge external TstAlignSegment function to SCH_LINE::MergeOverlap method.
* Move save schematic method to files-io.cpp and remove empty file
save_schemas.cpp.
++include
* Remove unused internal link list next and back methods from base screen
object.
2010-oct-25 UPDATE Wayne Stambaugh <stambaughw@verizon.net> 2010-oct-25 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================ ================================================================================
++EESchema ++EESchema
......
...@@ -231,7 +231,7 @@ void DIALOG_PAGES_SETTINGS::SavePageSettings(wxCommandEvent& event) ...@@ -231,7 +231,7 @@ void DIALOG_PAGES_SETTINGS::SavePageSettings(wxCommandEvent& event)
/* Exports settings to other sheets if requested: */ /* Exports settings to other sheets if requested: */
SCH_SCREEN * screen; SCH_SCREEN * screen;
/* Build the screen list */ /* Build the screen list */
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
/* Update the datas */ /* Update the datas */
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "general.h" #include "general.h"
#include "protos.h" #include "protos.h"
#include "../eeschema/dialog_schematic_find.h" #include "../eeschema/dialogs/dialog_schematic_find.h"
/* Constructor and destructor for SCH_ITEM */ /* Constructor and destructor for SCH_ITEM */
......
...@@ -73,8 +73,8 @@ set(EESCHEMA_SRCS ...@@ -73,8 +73,8 @@ set(EESCHEMA_SRCS
dialog_print_using_printer.cpp dialog_print_using_printer.cpp
dialog_sch_sheet_props.cpp dialog_sch_sheet_props.cpp
dialog_sch_sheet_props_base.cpp dialog_sch_sheet_props_base.cpp
dialog_schematic_find.cpp dialogs/dialog_schematic_find.cpp
dialog_schematic_find_base.cpp dialogs/dialog_schematic_find_base.cpp
dialog_SVG_print.cpp dialog_SVG_print.cpp
dialog_SVG_print_base.cpp dialog_SVG_print_base.cpp
edit_component_in_lib.cpp edit_component_in_lib.cpp
...@@ -123,7 +123,6 @@ set(EESCHEMA_SRCS ...@@ -123,7 +123,6 @@ set(EESCHEMA_SRCS
pinedit.cpp pinedit.cpp
plot.cpp plot.cpp
read_from_file_schematic_items_descriptions.cpp read_from_file_schematic_items_descriptions.cpp
save_schemas.cpp
schedit.cpp schedit.cpp
schematic_undo_redo.cpp schematic_undo_redo.cpp
schframe.cpp schframe.cpp
......
...@@ -35,8 +35,8 @@ static int ReplaceDuplicatedTimeStamps(); ...@@ -35,8 +35,8 @@ static int ReplaceDuplicatedTimeStamps();
*/ */
void WinEDA_SchematicFrame::UpdateSheetNumberAndDate() void WinEDA_SchematicFrame::UpdateSheetNumberAndDate()
{ {
wxString date = GenDate(); wxString date = GenDate();
EDA_ScreenList s_list; SCH_SCREENS s_list;
// Set the date // Set the date
for( SCH_SCREEN* screen = s_list.GetFirst(); screen != NULL; for( SCH_SCREEN* screen = s_list.GetFirst(); screen != NULL;
...@@ -204,9 +204,9 @@ static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1, ...@@ -204,9 +204,9 @@ static bool SortByTimeStamp( const OBJ_CMP_TO_LIST& item1,
void WinEDA_SchematicFrame::DeleteAnnotation( bool aCurrentSheetOnly, void WinEDA_SchematicFrame::DeleteAnnotation( bool aCurrentSheetOnly,
bool aRedraw ) bool aRedraw )
{ {
SCH_ITEM* strct; SCH_ITEM* strct;
SCH_SCREEN* screen; SCH_SCREEN* screen;
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
screen = ScreenList.GetFirst(); screen = ScreenList.GetFirst();
...@@ -989,7 +989,7 @@ static bool SortItemByTimeStamp( const SCH_ITEM* item1, const SCH_ITEM* item2 ) ...@@ -989,7 +989,7 @@ static bool SortItemByTimeStamp( const SCH_ITEM* item1, const SCH_ITEM* item2 )
int ReplaceDuplicatedTimeStamps() int ReplaceDuplicatedTimeStamps()
{ {
/* Build the whole screen list */ /* Build the whole screen list */
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
/* Build the list of items with time stamps (components and sheets) /* Build the list of items with time stamps (components and sheets)
* note: if all items have a different time stamp, this ensure also * note: if all items have a different time stamp, this ensure also
......
...@@ -29,52 +29,6 @@ SCH_ITEM* s_OldWiresList; ...@@ -29,52 +29,6 @@ SCH_ITEM* s_OldWiresList;
wxPoint s_ConnexionStartPoint; wxPoint s_ConnexionStartPoint;
/* Extract the old wires, junctions and buses, an if CreateCopy replace them
* by a copy. Old ones must be put in undo list, and the new ones can be
* modified by clean up safely.
* If an abort command is made, old wires must be put in EEDrawList, and
* copies must be deleted. This is because previously stored undo commands
* can handle pointers on wires or bus, and we do not delete wires or bus,
* we must put they in undo list.
*
* Because cleanup delete and/or modify bus and wires, the more easy is to put
* all wires in undo list and use a new copy of wires for cleanup.
*/
SCH_ITEM* SCH_SCREEN::ExtractWires( bool CreateCopy )
{
SCH_ITEM* item, * next_item, * new_item, * List = NULL;
for( item = EEDrawList; item != NULL; item = next_item )
{
next_item = item->Next();
switch( item->Type() )
{
case DRAW_JUNCTION_STRUCT_TYPE:
case DRAW_SEGMENT_STRUCT_TYPE:
RemoveFromDrawList( item );
item->SetNext( List );
List = item;
if( CreateCopy )
{
if( item->Type() == DRAW_JUNCTION_STRUCT_TYPE )
new_item = ( (SCH_JUNCTION*) item )->GenCopy();
else
new_item = ( (SCH_LINE*) item )->GenCopy();
new_item->SetNext( EEDrawList );
EEDrawList = new_item;
}
break;
default:
break;
}
}
return List;
}
/* Replace the wires in screen->EEDrawList by s_OldWiresList wires. /* Replace the wires in screen->EEDrawList by s_OldWiresList wires.
*/ */
static void RestoreOldWires( SCH_SCREEN* screen ) static void RestoreOldWires( SCH_SCREEN* screen )
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "general.h" #include "general.h"
#include "dlist.h" #include "dlist.h"
#include "dialog_schematic_find.h" #include "dialogs/dialog_schematic_find.h"
/**********************************************/ /**********************************************/
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "macros.h" #include "macros.h"
#include "protos.h" #include "protos.h"
#include "class_library.h" #include "class_library.h"
#include "dialog_schematic_find.h" #include "dialogs/dialog_schematic_find.h"
#include "lib_rectangle.h" #include "lib_rectangle.h"
#include "lib_pin.h" #include "lib_pin.h"
#include "lib_text.h" #include "lib_text.h"
......
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
#include "fctsys.h" #include "fctsys.h"
#include "gr_basic.h" #include "gr_basic.h"
#include "common.h" #include "common.h"
#include "kicad_string.h"
#include "eeschema_id.h" #include "eeschema_id.h"
#include "appl_wxstruct.h"
#include "class_drawpanel.h" #include "class_drawpanel.h"
#include "program.h" #include "program.h"
#include "general.h" #include "general.h"
#include "protos.h" #include "protos.h"
#include "class_library.h"
void SetaParent( EDA_BaseStruct* Struct, BASE_SCREEN* Screen ) void SetaParent( EDA_BaseStruct* Struct, BASE_SCREEN* Screen )
...@@ -46,8 +49,7 @@ static int SchematicZoomList[] = ...@@ -46,8 +49,7 @@ static int SchematicZoomList[] =
5, 7, 10, 15, 20, 30, 40, 60, 80, 120, 160, 230, 320, 480, 640, 800, 1280 5, 7, 10, 15, 20, 30, 40, 60, 80, 120, 160, 230, 320, 480, 640, 800, 1280
}; };
#define SCHEMATIC_ZOOM_LIST_CNT ( sizeof( SchematicZoomList ) / \ #define SCHEMATIC_ZOOM_LIST_CNT ( sizeof( SchematicZoomList ) / sizeof( int ) )
sizeof( int ) )
#define MM_TO_SCH_UNITS 1000.0 / 25.4 //schematic internal unites are mils #define MM_TO_SCH_UNITS 1000.0 / 25.4 //schematic internal unites are mils
...@@ -57,7 +59,7 @@ static int SchematicZoomList[] = ...@@ -57,7 +59,7 @@ static int SchematicZoomList[] =
* because wires and pins are considered as connected when the are to the same coordinate * because wires and pins are considered as connected when the are to the same coordinate
* we cannot mix coordinates in mils (internal units) and mm * we cannot mix coordinates in mils (internal units) and mm
* (that cannot exactly converted in mils in many cases * (that cannot exactly converted in mils in many cases
* in fact schematic must only use 50 and 25 mils to place labnels, wires and components * in fact schematic must only use 50 and 25 mils to place labels, wires and components
* others values are useful only for graphic items (mainly in library editor) * others values are useful only for graphic items (mainly in library editor)
* so use integer values in mils only. * so use integer values in mils only.
*/ */
...@@ -70,8 +72,7 @@ static GRID_TYPE SchematicGridList[] = { ...@@ -70,8 +72,7 @@ static GRID_TYPE SchematicGridList[] = {
{ ID_POPUP_GRID_LEVEL_1, wxRealPoint( 1, 1 ) }, { ID_POPUP_GRID_LEVEL_1, wxRealPoint( 1, 1 ) },
}; };
#define SCHEMATIC_GRID_LIST_CNT ( sizeof( SchematicGridList ) / \ #define SCHEMATIC_GRID_LIST_CNT ( sizeof( SchematicGridList ) / sizeof( GRID_TYPE ) )
sizeof( GRID_TYPE ) )
SCH_SCREEN::SCH_SCREEN( KICAD_T type ) : BASE_SCREEN( type ) SCH_SCREEN::SCH_SCREEN( KICAD_T type ) : BASE_SCREEN( type )
...@@ -103,8 +104,6 @@ SCH_SCREEN::~SCH_SCREEN() ...@@ -103,8 +104,6 @@ SCH_SCREEN::~SCH_SCREEN()
} }
/* Routine to clear (free) EESchema drawing list of a screen.
*/
void SCH_SCREEN::FreeDrawList() void SCH_SCREEN::FreeDrawList()
{ {
SCH_ITEM* DrawStruct; SCH_ITEM* DrawStruct;
...@@ -165,68 +164,265 @@ void SCH_SCREEN::AddToDrawList( SCH_ITEM* st ) ...@@ -165,68 +164,265 @@ void SCH_SCREEN::AddToDrawList( SCH_ITEM* st )
} }
/*********************************************************************/ /* Extract the old wires, junctions and buses, an if CreateCopy replace them
/* Class EDA_ScreenList to handle the list of screens in a hierarchy */ * by a copy. Old ones must be put in undo list, and the new ones can be
/*********************************************************************/ * modified by clean up safely.
* If an abort command is made, old wires must be put in EEDrawList, and
* copies must be deleted. This is because previously stored undo commands
* can handle pointers on wires or bus, and we do not delete wires or bus,
* we must put they in undo list.
*
* Because cleanup delete and/or modify bus and wires, the more easy is to put
* all wires in undo list and use a new copy of wires for cleanup.
*/
SCH_ITEM* SCH_SCREEN::ExtractWires( bool CreateCopy )
{
SCH_ITEM* item, * next_item, * new_item, * List = NULL;
for( item = EEDrawList; item != NULL; item = next_item )
{
next_item = item->Next();
switch( item->Type() )
{
case DRAW_JUNCTION_STRUCT_TYPE:
case DRAW_SEGMENT_STRUCT_TYPE:
RemoveFromDrawList( item );
item->SetNext( List );
List = item;
if( CreateCopy )
{
if( item->Type() == DRAW_JUNCTION_STRUCT_TYPE )
new_item = ( (SCH_JUNCTION*) item )->GenCopy();
else
new_item = ( (SCH_LINE*) item )->GenCopy();
new_item->SetNext( EEDrawList );
EEDrawList = new_item;
}
break;
default:
break;
}
}
return List;
}
/* Routine cleaning:
* - Includes segments or buses aligned in only 1 segment
* - Detects identical objects superimposed
*/
bool SCH_SCREEN::SchematicCleanUp( wxDC* DC )
{
SCH_ITEM* DrawList, * TstDrawList;
bool Modify = FALSE;
DrawList = EEDrawList;
for( ; DrawList != NULL; DrawList = DrawList->Next() )
{
if( DrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE )
{
TstDrawList = DrawList->Next();
while( TstDrawList )
{
if( TstDrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE )
{
SCH_LINE* line = (SCH_LINE*) DrawList;
if( line->MergeOverlap( (SCH_LINE*) TstDrawList ) )
{
/* keep the bits set in .m_Flags, because the deleted
* segment can be flagged */
DrawList->m_Flags |= TstDrawList->m_Flags;
EraseStruct( TstDrawList, this );
SetRefreshReq();
TstDrawList = EEDrawList;
Modify = TRUE;
}
else
{
TstDrawList = TstDrawList->Next();
}
}
else
{
TstDrawList = TstDrawList->Next();
}
}
}
}
WinEDA_SchematicFrame* frame;
frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow();
frame->TestDanglingEnds( EEDrawList, DC );
return Modify;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_SCREEN::Save( FILE* aFile ) const
{
// Creates header
if( fprintf( aFile, "%s %s %d", EESCHEMA_FILE_STAMP,
SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION ) < 0
|| fprintf( aFile, " date %s\n", CONV_TO_UTF8( DateAndTime() ) ) < 0 )
return FALSE;
BOOST_FOREACH( const CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() )
{
if( fprintf( aFile, "LIBS:%s\n", CONV_TO_UTF8( lib.GetName() ) ) < 0 )
return FALSE;
}
if( fprintf( aFile, "EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers,
g_LayerDescr.CurrentLayer ) < 0
|| fprintf( aFile, "EELAYER END\n" ) < 0 )
return FALSE;
/* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
* SheetNumber and Sheet Count in a complex hierarchy, but useful in
* simple hierarchy and flat hierarchy. Used also to search the root
* sheet ( ScreenNumber = 1 ) within the files
*/
if( fprintf( aFile, "$Descr %s %d %d\n", CONV_TO_UTF8( m_CurrentSheetDesc->m_Name ),
m_CurrentSheetDesc->m_Size.x, m_CurrentSheetDesc->m_Size.y ) < 0
|| fprintf( aFile, "Sheet %d %d\n", m_ScreenNumber, m_NumberOfScreen ) < 0
|| fprintf( aFile, "Title \"%s\"\n", CONV_TO_UTF8( m_Title ) ) < 0
|| fprintf( aFile, "Date \"%s\"\n", CONV_TO_UTF8( m_Date ) ) < 0
|| fprintf( aFile, "Rev \"%s\"\n", CONV_TO_UTF8( m_Revision ) ) < 0
|| fprintf( aFile, "Comp \"%s\"\n", CONV_TO_UTF8( m_Company ) ) < 0
|| fprintf( aFile, "Comment1 \"%s\"\n", CONV_TO_UTF8( m_Commentaire1 ) ) < 0
|| fprintf( aFile, "Comment2 \"%s\"\n", CONV_TO_UTF8( m_Commentaire2 ) ) < 0
|| fprintf( aFile, "Comment3 \"%s\"\n", CONV_TO_UTF8( m_Commentaire3 ) ) < 0
|| fprintf( aFile, "Comment4 \"%s\"\n", CONV_TO_UTF8( m_Commentaire4 ) ) < 0
|| fprintf( aFile, "$EndDescr\n" ) < 0 )
return FALSE;
for( SCH_ITEM* item = EEDrawList; item; item = item->Next() )
{
if( !item->Save( aFile ) )
return FALSE;
}
if( fprintf( aFile, "$EndSCHEMATC\n" ) < 0 )
return FALSE;
return TRUE;
}
/** Function ClearUndoORRedoList
* free the undo or redo list from List element
* Wrappers are deleted.
* datas pointed by wrappers are deleted if not in use in schematic
* i.e. when they are copy of a schematic item or they are no more in use
* (DELETED)
* @param aList = the UNDO_REDO_CONTAINER to clear
* @param aItemCount = the count of items to remove. < 0 for all items
* items (commands stored in list) are removed from the beginning of the list.
* So this function can be called to remove old commands
*/
void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount )
{
if( aItemCount == 0 )
return;
unsigned icnt = aList.m_CommandsList.size();
if( aItemCount > 0 )
icnt = aItemCount;
for( unsigned ii = 0; ii < icnt; ii++ )
{
if( aList.m_CommandsList.size() == 0 )
break;
PICKED_ITEMS_LIST* curr_cmd = aList.m_CommandsList[0];
aList.m_CommandsList.erase( aList.m_CommandsList.begin() );
curr_cmd->ClearListAndDeleteItems();
delete curr_cmd; // Delete command
}
}
/******************************************************************/
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */
/******************************************************************/
EDA_ScreenList::EDA_ScreenList() SCH_SCREENS::SCH_SCREENS()
{ {
m_Index = 0; m_index = 0;
BuildScreenList( g_RootSheet ); BuildScreenList( g_RootSheet );
} }
SCH_SCREEN* EDA_ScreenList::GetFirst() SCH_SCREENS::~SCH_SCREENS()
{
}
SCH_SCREEN* SCH_SCREENS::GetFirst()
{ {
m_Index = 0; m_index = 0;
if( m_List.GetCount() > 0 )
return m_List[0]; if( m_screens.size() > 0 )
return m_screens[0];
return NULL; return NULL;
} }
SCH_SCREEN* EDA_ScreenList::GetNext() SCH_SCREEN* SCH_SCREENS::GetNext()
{ {
if( m_Index < m_List.GetCount() ) if( m_index < m_screens.size() )
m_Index++; m_index++;
return GetScreen( m_Index );
return GetScreen( m_index );
} }
/* return the m_List[index] item SCH_SCREEN* SCH_SCREENS::GetScreen( unsigned int aIndex )
*/
SCH_SCREEN* EDA_ScreenList::GetScreen( unsigned int index )
{ {
if( index < m_List.GetCount() ) if( aIndex < m_screens.size() )
return m_List[index]; return m_screens[ aIndex ];
return NULL; return NULL;
} }
void EDA_ScreenList::AddScreenToList( SCH_SCREEN* testscreen ) void SCH_SCREENS::AddScreenToList( SCH_SCREEN* aScreen )
{ {
if( testscreen == NULL ) if( aScreen == NULL )
return; return;
for( unsigned int i = 0; i< m_List.GetCount(); i++ )
for( unsigned int i = 0; i < m_screens.size(); i++ )
{ {
if( m_List[i] == testscreen ) if( m_screens[i] == aScreen )
return; return;
} }
m_List.Add( testscreen ); m_screens.push_back( aScreen );
} }
void EDA_ScreenList::BuildScreenList( EDA_BaseStruct* s ) void SCH_SCREENS::BuildScreenList( EDA_BaseStruct* aItem )
{ {
if( s && s->Type() == DRAW_SHEET_STRUCT_TYPE ) if( aItem && aItem->Type() == DRAW_SHEET_STRUCT_TYPE )
{ {
SCH_SHEET* ds = (SCH_SHEET*) s; SCH_SHEET* ds = (SCH_SHEET*) aItem;
s = ds->m_AssociatedScreen; aItem = ds->m_AssociatedScreen;
} }
if( s && s->Type() == SCREEN_STRUCT_TYPE ) if( aItem && aItem->Type() == SCREEN_STRUCT_TYPE )
{ {
SCH_SCREEN* screen = (SCH_SCREEN*) s; SCH_SCREEN* screen = (SCH_SCREEN*) aItem;
AddScreenToList( screen ); AddScreenToList( screen );
EDA_BaseStruct* strct = screen->EEDrawList; EDA_BaseStruct* strct = screen->EEDrawList;
while( strct ) while( strct )
......
...@@ -233,7 +233,7 @@ bool SCH_JUNCTION::HitTest( const wxPoint& aPosRef ) ...@@ -233,7 +233,7 @@ bool SCH_JUNCTION::HitTest( const wxPoint& aPosRef )
wxPoint dist = aPosRef - m_Pos; wxPoint dist = aPosRef - m_Pos;
return sqrt( ( (double) ( dist.x * dist.x ) ) + return sqrt( ( (double) ( dist.x * dist.x ) ) +
( (double) ( dist.y * dist.y ) ) ) < ( m_Size.x / 2 ); ( (double) ( dist.y * dist.y ) ) ) < ( m_Size.x / 2 );
} }
...@@ -295,8 +295,7 @@ void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) ...@@ -295,8 +295,7 @@ void SCH_JUNCTION::Show( int nestLevel, std::ostream& os )
// XML output: // XML output:
wxString s = GetClass(); wxString s = GetClass();
NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_Pos << "/>\n";
<< m_Pos << "/>\n";
} }
...@@ -517,8 +516,7 @@ EDA_Rect SCH_LINE::GetBoundingBox() ...@@ -517,8 +516,7 @@ EDA_Rect SCH_LINE::GetBoundingBox()
int ymax = MAX( m_Start.y, m_End.y ) + width; int ymax = MAX( m_Start.y, m_End.y ) + width;
// return a rectangle which is [pos,dim) in nature. therefore the +1 // return a rectangle which is [pos,dim) in nature. therefore the +1
EDA_Rect ret( wxPoint( xmin, ymin ), EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax - xmin + 1, ymax - ymin + 1 ) );
wxSize( xmax - xmin + 1, ymax - ymin + 1 ) );
return ret; return ret;
} }
...@@ -631,6 +629,70 @@ void SCH_LINE::Rotate( wxPoint rotationPoint ) ...@@ -631,6 +629,70 @@ void SCH_LINE::Rotate( wxPoint rotationPoint )
} }
bool SCH_LINE::MergeOverlap( SCH_LINE* aLine )
{
wxCHECK_MSG( aLine != NULL && aLine->Type() == DRAW_SEGMENT_STRUCT_TYPE, false,
wxT( "Cannot test line segment for overlap." ) );
if( this == aLine )
return false;
if( GetLayer() != aLine->GetLayer() )
return false;
// Search for a common end, and modify coordinates to ensure RefSegm->m_End
// == TstSegm->m_Start
if( m_Start == aLine->m_Start )
{
if( m_End == aLine->m_End )
return true;
EXCHG( m_Start, aLine->m_End );
}
else if( m_Start == aLine->m_End )
{
EXCHG( m_Start, m_End );
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End == aLine->m_End )
{
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End != aLine->m_Start )
// No common end point, segments cannot be merged.
return false;
/* Test alignment: */
if( m_Start.y == m_End.y ) // Horizontal segment
{
if( aLine->m_Start.y == aLine->m_End.y )
{
m_End = aLine->m_End;
return true;
}
}
else if( m_Start.x == m_End.x ) // Vertical segment
{
if( aLine->m_Start.x == aLine->m_End.x )
{
m_End = aLine->m_End;
return true;
}
}
else
{
if( atan2( (double) ( m_Start.x - m_End.x ), (double) ( m_Start.y - m_End.y ) )
== atan2( (double) ( aLine->m_Start.x - aLine->m_End.x ),
(double) ( aLine->m_Start.y - aLine->m_End.y ) ) )
{
m_End = aLine->m_End;
return true;
}
}
return false;
}
/***********************/ /***********************/
/* Class SCH_POLYLINE */ /* Class SCH_POLYLINE */
/***********************/ /***********************/
...@@ -686,15 +748,13 @@ bool SCH_POLYLINE::Save( FILE* aFile ) const ...@@ -686,15 +748,13 @@ bool SCH_POLYLINE::Save( FILE* aFile ) const
layer = "Wire"; layer = "Wire";
if( GetLayer() == LAYER_BUS ) if( GetLayer() == LAYER_BUS )
layer = "Bus"; layer = "Bus";
if( fprintf( aFile, "Poly %s %s %d\n", if( fprintf( aFile, "Poly %s %s %d\n", width, layer, GetCornerCount() ) == EOF )
width, layer, GetCornerCount() ) == EOF )
{ {
return false; return false;
} }
for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{ {
if( fprintf( aFile, "\t%-4d %-4d\n", if( fprintf( aFile, "\t%-4d %-4d\n", m_PolyPoints[ii ].x, m_PolyPoints[ii].y ) == EOF )
m_PolyPoints[ii ].x, m_PolyPoints[ii].y ) == EOF )
{ {
success = false; success = false;
break; break;
......
...@@ -96,6 +96,18 @@ public: ...@@ -96,6 +96,18 @@ public:
virtual void Mirror_Y( int aYaxis_position ); virtual void Mirror_Y( int aYaxis_position );
virtual void Rotate( wxPoint rotationPoint ); virtual void Rotate( wxPoint rotationPoint );
/**
* Check line against \a aLine to see if it overlaps and merge if it does.
*
* This method will change the line to be equivalent of the line and \a aLine if the
* two lines overlap. This method is used to merge multple line segments into a single
* line.
*
* @param aLine - Line to compare.
* @retuen True if lines overlap and the line was merged with \a aLine.
*/
bool MergeOverlap( SCH_LINE* aLine );
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ); void Show( int nestLevel, std::ostream& os );
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
/**************************************/ /**************************************/
#include "fctsys.h" #include "fctsys.h"
#include "appl_wxstruct.h"
#include "common.h" #include "common.h"
#include "trigo.h" #include "trigo.h"
#include "confirm.h" #include "confirm.h"
...@@ -15,58 +14,6 @@ ...@@ -15,58 +14,6 @@
#include "netlist.h" #include "netlist.h"
static int TstAlignSegment( SCH_LINE* RefSegm, SCH_LINE* TstSegm );
/* Routine cleaning:
* - Includes segments or buses aligned in only 1 segment
* - Detects identical objects superimposed
*/
bool SCH_SCREEN::SchematicCleanUp( wxDC* DC )
{
SCH_ITEM* DrawList, * TstDrawList;
int flag;
bool Modify = FALSE;
DrawList = EEDrawList;
for( ; DrawList != NULL; DrawList = DrawList->Next() )
{
if( DrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE )
{
TstDrawList = DrawList->Next();
while( TstDrawList )
{
if( TstDrawList->Type() == DRAW_SEGMENT_STRUCT_TYPE )
{
flag = TstAlignSegment( (SCH_LINE*) DrawList,
(SCH_LINE*) TstDrawList );
if( flag )
{
/* keep the bits set in .m_Flags, because the deleted
* segment can be flagged */
DrawList->m_Flags |= TstDrawList->m_Flags;
EraseStruct( TstDrawList, this );
SetRefreshReq();
TstDrawList = EEDrawList;
Modify = TRUE;
}
else
TstDrawList = TstDrawList->Next();
}
else
TstDrawList = TstDrawList->Next();
}
}
}
WinEDA_SchematicFrame* frame;
frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow();
frame->TestDanglingEnds( EEDrawList, DC );
return Modify;
}
/* Routine to start/end segment (BUS or wires) on junctions. /* Routine to start/end segment (BUS or wires) on junctions.
*/ */
void BreakSegmentOnJunction( SCH_SCREEN* Screen ) void BreakSegmentOnJunction( SCH_SCREEN* Screen )
...@@ -155,68 +102,3 @@ void BreakSegment( SCH_SCREEN* aScreen, wxPoint aBreakpoint ) ...@@ -155,68 +102,3 @@ void BreakSegment( SCH_SCREEN* aScreen, wxPoint aBreakpoint )
DrawList = NewSegment; DrawList = NewSegment;
} }
} }
/* Search if the 2 segments RefSegm and TstSegm are on a line.
* Return 0 if no
* 1 if yes, and RefSegm is modified to be the equivalent segment
*/
static int TstAlignSegment( SCH_LINE* RefSegm, SCH_LINE* TstSegm )
{
if( RefSegm == TstSegm )
return 0;
if( RefSegm->GetLayer() != TstSegm->GetLayer() )
return 0;
// search for a common end, and modify coordinates to ensure RefSegm->m_End
// == TstSegm->m_Start
if( RefSegm->m_Start == TstSegm->m_Start )
{
if( RefSegm->m_End == TstSegm->m_End )
return 1;
EXCHG( RefSegm->m_Start, RefSegm->m_End );
}
else if( RefSegm->m_Start == TstSegm->m_End )
{
EXCHG( RefSegm->m_Start, RefSegm->m_End );
EXCHG( TstSegm->m_Start, TstSegm->m_End );
}
else if( RefSegm->m_End == TstSegm->m_End )
{
EXCHG( TstSegm->m_Start, TstSegm->m_End );
}
else if( RefSegm->m_End != TstSegm->m_Start )
// No common end point, segments cannot be merged.
return 0;
/* Test alignment: */
if( RefSegm->m_Start.y == RefSegm->m_End.y ) // Horizontal segment
{
if( TstSegm->m_Start.y == TstSegm->m_End.y )
{
RefSegm->m_End = TstSegm->m_End;
return 1;
}
}
else if( RefSegm->m_Start.x == RefSegm->m_End.x ) // Vertical segment
{
if( TstSegm->m_Start.x == TstSegm->m_End.x )
{
RefSegm->m_End = TstSegm->m_End;
return 1;
}
}
else
{
if( atan2( (double) ( RefSegm->m_Start.x - RefSegm->m_End.x ),
(double) ( RefSegm->m_Start.y - RefSegm->m_End.y ) ) ==
atan2( (double) ( TstSegm->m_Start.x - TstSegm->m_End.x ),
(double) ( TstSegm->m_Start.y - TstSegm->m_End.y ) ) )
{
RefSegm->m_End = TstSegm->m_End;
return 1;
}
}
return 0;
}
...@@ -438,8 +438,7 @@ void DeleteAllMarkers( int type ) ...@@ -438,8 +438,7 @@ void DeleteAllMarkers( int type )
SCH_SCREEN* screen; SCH_SCREEN* screen;
SCH_ITEM * DrawStruct, * NextStruct; SCH_ITEM * DrawStruct, * NextStruct;
SCH_MARKER* Marker; SCH_MARKER* Marker;
SCH_SCREENS ScreenList;
EDA_ScreenList ScreenList;
for( screen = ScreenList.GetFirst(); screen != NULL; for( screen = ScreenList.GetFirst(); screen != NULL;
screen = ScreenList.GetNext() ) screen = ScreenList.GetNext() )
......
...@@ -184,8 +184,8 @@ static int MinimalReq[PIN_NMAX][PIN_NMAX] = ...@@ -184,8 +184,8 @@ static int MinimalReq[PIN_NMAX][PIN_NMAX] =
*/ */
int TestDuplicateSheetNames(bool aCreateMarker) int TestDuplicateSheetNames(bool aCreateMarker)
{ {
int err_count = 0; int err_count = 0;
EDA_ScreenList ScreenList; // Created the list of screen SCH_SCREENS ScreenList; // Created the list of screen
for( SCH_SCREEN* Screen = ScreenList.GetFirst(); for( SCH_SCREEN* Screen = ScreenList.GetFirst();
Screen != NULL; Screen != NULL;
...@@ -270,7 +270,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) ...@@ -270,7 +270,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
g_EESchemaVar.NbWarningErc = 0; g_EESchemaVar.NbWarningErc = 0;
/* Cleanup the entire hierarchy */ /* Cleanup the entire hierarchy */
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
for( SCH_SCREEN* Screen = ScreenList.GetFirst(); for( SCH_SCREEN* Screen = ScreenList.GetFirst();
Screen != NULL; Screen != NULL;
......
...@@ -17,6 +17,86 @@ ...@@ -17,6 +17,86 @@
/*****************************************************************************
* Routine to save an EESchema file. *
* 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 )
{
wxString msg;
wxFileName schematicFileName, backupFileName;
FILE* f;
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;
switch( FileSave )
{
case FILE_SAVE_AS:
schematicFileName = screen->m_FileName;
backupFileName = schematicFileName;
/* Rename the old file to a '.bak' one: */
if( schematicFileName.FileExists() )
{
backupFileName.SetExt( wxT( "bak" ) );
wxRemoveFile( backupFileName.GetFullPath() );
if( !wxRenameFile( schematicFileName.GetFullPath(), backupFileName.GetFullPath() ) )
{
DisplayError( this, wxT( "Warning: unable to rename old file" ) );
}
}
break;
case FILE_SAVE_NEW:
{
wxFileDialog dlg( this, _( "Schematic Files" ), wxGetCwd(),
screen->m_FileName, SchematicFileWildcard,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( dlg.ShowModal() == wxID_CANCEL )
return false;
screen->m_FileName = dlg.GetPath();
schematicFileName = dlg.GetPath();
break;
}
default:
break;
}
if( ( f = wxFopen( schematicFileName.GetFullPath(), wxT( "wt" ) ) ) == NULL )
{
msg = _( "Failed to create file " ) + schematicFileName.GetFullPath();
DisplayError( this, msg );
return false;
}
if( FileSave == FILE_SAVE_NEW )
screen->m_FileName = schematicFileName.GetFullPath();
bool success = screen->Save( f );
if( !success )
DisplayError( this, _( "File write operation failed." ) );
else
screen->ClrModify();
fclose( f );
return success;
}
/* Commands to save project or the current page. /* Commands to save project or the current page.
*/ */
void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event ) void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event )
...@@ -52,11 +132,10 @@ void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event ) ...@@ -52,11 +132,10 @@ void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event )
*/ */
bool WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsNew ) bool WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsNew )
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
wxString FullFileName, msg; wxString FullFileName, msg;
bool LibCacheExist = false; bool LibCacheExist = false;
SCH_SCREENS ScreenList;
EDA_ScreenList ScreenList;
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
...@@ -230,9 +309,9 @@ bool WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsN ...@@ -230,9 +309,9 @@ bool WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsN
*/ */
void WinEDA_SchematicFrame::SaveProject() void WinEDA_SchematicFrame::SaveProject()
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
wxFileName fn; wxFileName fn;
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
for( screen = ScreenList.GetFirst(); screen != NULL; for( screen = ScreenList.GetFirst(); screen != NULL;
screen = ScreenList.GetNext() ) screen = ScreenList.GetNext() )
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include "dialog_schematic_find.h" #include "dialogs/dialog_schematic_find.h"
void WinEDA_SchematicFrame::OnFindDrcMarker( wxFindDialogEvent& event ) void WinEDA_SchematicFrame::OnFindDrcMarker( wxFindDialogEvent& event )
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "libeditframe.h" #include "libeditframe.h"
#include "class_libentry.h" #include "class_libentry.h"
#include "dialog_schematic_find.h" #include "dialogs/dialog_schematic_find.h"
/* How to add a new hotkey: /* How to add a new hotkey:
......
...@@ -423,26 +423,6 @@ void LIB_ARC::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& a ...@@ -423,26 +423,6 @@ void LIB_ARC::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& a
} }
void LIB_ARC::saveAttributes()
{
m_savedPos = m_Pos;
m_savedStartPos = m_ArcStart;
m_savedEndPos = m_ArcEnd;
m_savedAngle1 = m_t1;
m_savedAngle2 = m_t2;
}
void LIB_ARC::restoreAttributes()
{
m_Pos = m_savedPos;
m_ArcStart = m_savedStartPos;
m_ArcEnd = m_savedEndPos;
m_t1 = m_savedAngle1;
m_t2 = m_savedAngle2;
}
EDA_Rect LIB_ARC::GetBoundingBox() EDA_Rect LIB_ARC::GetBoundingBox()
{ {
int minX, minY, maxX, maxY, angleStart, angleEnd; int minX, minY, maxX, maxY, angleStart, angleEnd;
...@@ -535,14 +515,10 @@ void LIB_ARC::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -535,14 +515,10 @@ void LIB_ARC::BeginEdit( int aEditMode, const wxPoint aPosition )
{ {
m_initialPos = m_Pos; m_initialPos = m_Pos;
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
else else
{ {
// Save the current arc positions in case the resize is aborted.
saveAttributes();
// The arc center point has to be rotated with while adjusting the // The arc center point has to be rotated with while adjusting the
// start or end point, determine the side of this point and the distance // start or end point, determine the side of this point and the distance
// from the start / end point // from the start / end point
...@@ -600,9 +576,6 @@ void LIB_ARC::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -600,9 +576,6 @@ void LIB_ARC::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,
wxT( "Bad call to EndEdit(). LIB_ARC is not being edited." ) ); wxT( "Bad call to EndEdit(). LIB_ARC is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
SetEraseLastDrawItem( false ); SetEraseLastDrawItem( false );
m_lastEditState = 0; m_lastEditState = 0;
m_editState = 0; m_editState = 0;
......
...@@ -28,10 +28,6 @@ class LIB_ARC : public LIB_DRAW_ITEM ...@@ -28,10 +28,6 @@ class LIB_ARC : public LIB_DRAW_ITEM
wxPoint m_ArcEnd; /* Arc end position. */ wxPoint m_ArcEnd; /* Arc end position. */
wxPoint m_Pos; /* Radius center point. */ wxPoint m_Pos; /* Radius center point. */
int m_Width; /* Line width */ int m_Width; /* Line width */
wxPoint m_savedStartPos;
wxPoint m_savedEndPos;
int m_savedAngle1;
int m_savedAngle2;
double m_editCenterDistance; double m_editCenterDistance;
SELECT_T m_editSelectPoint; SELECT_T m_editSelectPoint;
int m_editState; int m_editState;
...@@ -49,16 +45,6 @@ class LIB_ARC : public LIB_DRAW_ITEM ...@@ -49,16 +45,6 @@ class LIB_ARC : public LIB_DRAW_ITEM
*/ */
void drawEditGraphics( EDA_Rect* aClipBox, wxDC* aDC, int aColor ); void drawEditGraphics( EDA_Rect* aClipBox, wxDC* aDC, int aColor );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculates the center, radius, and angles at \a aPosition when the arc is being edited. * Calculates the center, radius, and angles at \a aPosition when the arc is being edited.
* *
......
...@@ -236,20 +236,6 @@ void LIB_CIRCLE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint ...@@ -236,20 +236,6 @@ void LIB_CIRCLE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint
} }
void LIB_CIRCLE::saveAttributes()
{
m_savedPos = m_Pos;
m_savedRadius = m_Radius;
}
void LIB_CIRCLE::restoreAttributes()
{
m_Pos = m_savedPos;
m_Radius = m_savedRadius;
}
EDA_Rect LIB_CIRCLE::GetBoundingBox() EDA_Rect LIB_CIRCLE::GetBoundingBox()
{ {
EDA_Rect rect; EDA_Rect rect;
...@@ -296,12 +282,10 @@ void LIB_CIRCLE::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -296,12 +282,10 @@ void LIB_CIRCLE::BeginEdit( int aEditMode, const wxPoint aPosition )
{ {
m_initialPos = m_Pos; m_initialPos = m_Pos;
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
else if( aEditMode == IS_RESIZED ) else if( aEditMode == IS_RESIZED )
{ {
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
...@@ -323,9 +307,6 @@ void LIB_CIRCLE::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -323,9 +307,6 @@ void LIB_CIRCLE::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,
wxT( "Bad call to EndEdit(). LIB_CIRCLE is not being edited." ) ); wxT( "Bad call to EndEdit(). LIB_CIRCLE is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
SetEraseLastDrawItem( false ); SetEraseLastDrawItem( false );
m_Flags = 0; m_Flags = 0;
} }
......
...@@ -15,24 +15,12 @@ class LIB_CIRCLE : public LIB_DRAW_ITEM ...@@ -15,24 +15,12 @@ class LIB_CIRCLE : public LIB_DRAW_ITEM
wxPoint m_Pos; // Position or centre (Arc and Circle) or start point (segments). wxPoint m_Pos; // Position or centre (Arc and Circle) or start point (segments).
int m_Width; // Line width. int m_Width; // Line width.
int m_savedRadius; // Temporary storage of radius before editing begins.
/** /**
* Draws the arc. * Draws the arc.
*/ */
void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform ); int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculate the new circle at \a aPosition when editing. * Calculate the new circle at \a aPosition when editing.
* *
......
...@@ -79,19 +79,6 @@ class LIB_DRAW_ITEM : public EDA_BaseStruct ...@@ -79,19 +79,6 @@ class LIB_DRAW_ITEM : public EDA_BaseStruct
*/ */
virtual void calcEdit( const wxPoint& aPosition ) {} virtual void calcEdit( const wxPoint& aPosition ) {}
/**
* Save the current item attributes while editing.
*
* This method is used to save the drawing attributes of the item during editing.
* These values are restored when an edit is canceled by calling EndEdit().
*/
virtual void saveAttributes() {}
/**
* Restore the saved attributes when an existing item edit is cancelled.
*/
virtual void restoreAttributes() {}
bool m_eraseLastDrawItem; ///< Used when editing a new draw item to prevent drawing bool m_eraseLastDrawItem; ///< Used when editing a new draw item to prevent drawing
///< artifacts. ///< artifacts.
...@@ -119,7 +106,6 @@ protected: ...@@ -119,7 +106,6 @@ protected:
wxString m_typeName; ///< Name of object displayed in the message panel. wxString m_typeName; ///< Name of object displayed in the message panel.
wxPoint m_savedPos; ///< Temporary position when editing an existing item.
wxPoint m_initialPos; ///< Temporary position when moving an existing item. wxPoint m_initialPos; ///< Temporary position when moving an existing item.
wxPoint m_initialCursorPos; ///< Initial cursor position at the beginning of a move. wxPoint m_initialCursorPos; ///< Initial cursor position at the beginning of a move.
......
...@@ -343,22 +343,6 @@ void LIB_FIELD::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& ...@@ -343,22 +343,6 @@ void LIB_FIELD::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint&
} }
void LIB_FIELD::saveAttributes()
{
m_savedPos = m_Pos;
m_savedText = m_Text;
m_savedOrientation = m_Orient;
}
void LIB_FIELD::restoreAttributes()
{
m_Pos = m_savedPos;
m_Text = m_savedText;
m_Orient = m_savedOrientation;
}
/** /**
* Function HitTest * Function HitTest
* tests if the given wxPoint is within the bounds of this object. * tests if the given wxPoint is within the bounds of this object.
...@@ -661,7 +645,6 @@ void LIB_FIELD::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -661,7 +645,6 @@ void LIB_FIELD::BeginEdit( int aEditMode, const wxPoint aPosition )
{ {
m_initialPos = m_Pos; m_initialPos = m_Pos;
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
else else
...@@ -687,9 +670,6 @@ void LIB_FIELD::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -687,9 +670,6 @@ void LIB_FIELD::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED ) ) != 0,
wxT( "Bad call to EndEdit(). Text is not being edited." ) ); wxT( "Bad call to EndEdit(). Text is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
m_Flags = 0; m_Flags = 0;
m_rotate = false; m_rotate = false;
m_updateText = false; m_updateText = false;
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
{ {
wxString m_savedText; ///< Temporary storage for the string when edition. wxString m_savedText; ///< Temporary storage for the string when edition.
int m_savedOrientation; ///< Temporary storage for orientation when editing.
bool m_rotate; ///< Flag to indicate a rotation occurred while editing. bool m_rotate; ///< Flag to indicate a rotation occurred while editing.
bool m_updateText; ///< Flag to indicate text change occurred while editing. bool m_updateText; ///< Flag to indicate text change occurred while editing.
...@@ -29,16 +28,6 @@ class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct ...@@ -29,16 +28,6 @@ class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform ); int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculate the new circle at \a aPosition when editing. * Calculate the new circle at \a aPosition when editing.
* *
......
...@@ -308,18 +308,6 @@ void LIB_POLYLINE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoi ...@@ -308,18 +308,6 @@ void LIB_POLYLINE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoi
} }
void LIB_POLYLINE::saveAttributes()
{
m_savedPolyPoints = m_PolyPoints;
}
void LIB_POLYLINE::restoreAttributes()
{
m_PolyPoints = m_savedPolyPoints;
}
/** /**
* Function HitTest * Function HitTest
* tests if the given wxPoint is within the bounds of this object. * tests if the given wxPoint is within the bounds of this object.
...@@ -433,8 +421,6 @@ void LIB_POLYLINE::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -433,8 +421,6 @@ void LIB_POLYLINE::BeginEdit( int aEditMode, const wxPoint aPosition )
} }
else if( aEditMode == IS_RESIZED ) else if( aEditMode == IS_RESIZED )
{ {
saveAttributes();
// Drag one edge point of the polyline // Drag one edge point of the polyline
// Find the nearest edge point to be dragged // Find the nearest edge point to be dragged
wxPoint startPoint = m_PolyPoints[0]; wxPoint startPoint = m_PolyPoints[0];
...@@ -472,7 +458,6 @@ void LIB_POLYLINE::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -472,7 +458,6 @@ void LIB_POLYLINE::BeginEdit( int aEditMode, const wxPoint aPosition )
{ {
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
m_initialPos = m_PolyPoints[0]; m_initialPos = m_PolyPoints[0];
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
...@@ -500,9 +485,6 @@ void LIB_POLYLINE::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -500,9 +485,6 @@ void LIB_POLYLINE::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,
wxT( "Bad call to EndEdit(). LIB_POLYLINE is not being edited." ) ); wxT( "Bad call to EndEdit(). LIB_POLYLINE is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
m_Flags = 0; m_Flags = 0;
SetEraseLastDrawItem( false ); SetEraseLastDrawItem( false );
} }
......
...@@ -15,7 +15,6 @@ class LIB_POLYLINE : public LIB_DRAW_ITEM ...@@ -15,7 +15,6 @@ class LIB_POLYLINE : public LIB_DRAW_ITEM
std::vector<wxPoint> m_PolyPoints; // list of points (>= 2) std::vector<wxPoint> m_PolyPoints; // list of points (>= 2)
int m_ModifyIndex; // Index of the polyline point to modify int m_ModifyIndex; // Index of the polyline point to modify
std::vector<wxPoint> m_savedPolyPoints;
/** /**
* Draw the polyline. * Draw the polyline.
...@@ -23,16 +22,6 @@ class LIB_POLYLINE : public LIB_DRAW_ITEM ...@@ -23,16 +22,6 @@ class LIB_POLYLINE : public LIB_DRAW_ITEM
void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform ); int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculate the polyline attributes relative to \a aPosition while editing. * Calculate the polyline attributes relative to \a aPosition while editing.
* *
......
...@@ -215,20 +215,6 @@ void LIB_RECTANGLE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, ...@@ -215,20 +215,6 @@ void LIB_RECTANGLE::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC,
} }
void LIB_RECTANGLE::saveAttributes()
{
m_savedPos = m_Pos;
m_savedEndPos = m_End;
}
void LIB_RECTANGLE::restoreAttributes()
{
m_Pos = m_savedPos;
m_End = m_savedEndPos;
}
void LIB_RECTANGLE::DisplayInfo( WinEDA_DrawFrame* aFrame ) void LIB_RECTANGLE::DisplayInfo( WinEDA_DrawFrame* aFrame )
{ {
wxString msg; wxString msg;
...@@ -339,14 +325,12 @@ void LIB_RECTANGLE::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -339,14 +325,12 @@ void LIB_RECTANGLE::BeginEdit( int aEditMode, const wxPoint aPosition )
m_isHeightLocked = abs( m_End.y - aPosition.y ) >= MINIMUM_SELECTION_DISTANCE; m_isHeightLocked = abs( m_End.y - aPosition.y ) >= MINIMUM_SELECTION_DISTANCE;
} }
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
else if( aEditMode == IS_MOVED ) else if( aEditMode == IS_MOVED )
{ {
m_initialPos = m_Pos; m_initialPos = m_Pos;
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
...@@ -368,9 +352,6 @@ void LIB_RECTANGLE::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -368,9 +352,6 @@ void LIB_RECTANGLE::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,
wxT( "Bad call to EndEdit(). LIB_RECTANGLE is not being edited." ) ); wxT( "Bad call to EndEdit(). LIB_RECTANGLE is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
m_Flags = 0; m_Flags = 0;
m_isHeightLocked = false; m_isHeightLocked = false;
m_isWidthLocked = false; m_isWidthLocked = false;
......
...@@ -18,24 +18,12 @@ class LIB_RECTANGLE : public LIB_DRAW_ITEM ...@@ -18,24 +18,12 @@ class LIB_RECTANGLE : public LIB_DRAW_ITEM
bool m_isHeightLocked; // Flag: Keep height locked bool m_isHeightLocked; // Flag: Keep height locked
bool m_isStartPointSelected; // Flag: is the upper left edge selected? bool m_isStartPointSelected; // Flag: is the upper left edge selected?
wxPoint m_savedEndPos; // Temporary storage of current end position before editing.
/** /**
* Draw the rectangle. * Draw the rectangle.
*/ */
void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform ); int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculate the rectangle attributes relative to \a aPosition while editing. * Calculate the rectangle attributes relative to \a aPosition while editing.
* *
......
...@@ -360,22 +360,6 @@ void LIB_TEXT::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& ...@@ -360,22 +360,6 @@ void LIB_TEXT::drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint&
} }
void LIB_TEXT::saveAttributes()
{
m_savedPos = m_Pos;
m_savedText = m_Text;
m_savedOrientation = m_Orient;
}
void LIB_TEXT::restoreAttributes()
{
m_Pos = m_savedPos;
m_Text = m_savedText;
m_Orient = m_savedOrientation;
}
void LIB_TEXT::DisplayInfo( WinEDA_DrawFrame* frame ) void LIB_TEXT::DisplayInfo( WinEDA_DrawFrame* frame )
{ {
wxString msg; wxString msg;
...@@ -453,7 +437,6 @@ void LIB_TEXT::BeginEdit( int aEditMode, const wxPoint aPosition ) ...@@ -453,7 +437,6 @@ void LIB_TEXT::BeginEdit( int aEditMode, const wxPoint aPosition )
{ {
m_initialPos = m_Pos; m_initialPos = m_Pos;
m_initialCursorPos = aPosition; m_initialCursorPos = aPosition;
saveAttributes();
SetEraseLastDrawItem(); SetEraseLastDrawItem();
} }
else else
...@@ -479,9 +462,6 @@ void LIB_TEXT::EndEdit( const wxPoint& aPosition, bool aAbort ) ...@@ -479,9 +462,6 @@ void LIB_TEXT::EndEdit( const wxPoint& aPosition, bool aAbort )
wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED ) ) != 0, wxCHECK_RET( ( m_Flags & ( IS_NEW | IS_MOVED ) ) != 0,
wxT( "Bad call to EndEdit(). Text is not being edited." ) ); wxT( "Bad call to EndEdit(). Text is not being edited." ) );
if( aAbort && !IsNew() )
restoreAttributes();
m_Flags = 0; m_Flags = 0;
m_rotate = false; m_rotate = false;
m_updateText = false; m_updateText = false;
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
class LIB_TEXT : public LIB_DRAW_ITEM, public EDA_TextStruct class LIB_TEXT : public LIB_DRAW_ITEM, public EDA_TextStruct
{ {
wxString m_savedText; ///< Temporary storage for the string when edition. wxString m_savedText; ///< Temporary storage for the string when edition.
int m_savedOrientation; ///< Temporary storage for orientation when editing.
bool m_rotate; ///< Flag to indicate a rotation occurred while editing. bool m_rotate; ///< Flag to indicate a rotation occurred while editing.
bool m_updateText; ///< Flag to indicate text change occurred while editing. bool m_updateText; ///< Flag to indicate text change occurred while editing.
...@@ -25,16 +24,6 @@ class LIB_TEXT : public LIB_DRAW_ITEM, public EDA_TextStruct ...@@ -25,16 +24,6 @@ class LIB_TEXT : public LIB_DRAW_ITEM, public EDA_TextStruct
void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, void drawGraphic( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform ); int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
/**
* See LIB_DRAW_ITEM::saveAttributes().
*/
void saveAttributes();
/**
* See LIB_DRAW_ITEM::restoreAttributes().
*/
void restoreAttributes();
/** /**
* Calculate the text attributes ralative to \a aPosition while editing. * Calculate the text attributes ralative to \a aPosition while editing.
* *
......
...@@ -23,8 +23,7 @@ bool LibArchive( wxWindow* frame, const wxString& ArchFullFileName ) ...@@ -23,8 +23,7 @@ bool LibArchive( wxWindow* frame, const wxString& ArchFullFileName )
wxString msg; wxString msg;
LIB_COMPONENT* Entry; LIB_COMPONENT* Entry;
CMP_LIBRARY* libCache; CMP_LIBRARY* libCache;
SCH_SCREENS ScreenList;
EDA_ScreenList ScreenList;
libCache = new CMP_LIBRARY( LIBRARY_TYPE_EESCHEMA, ArchFullFileName ); libCache = new CMP_LIBRARY( LIBRARY_TYPE_EESCHEMA, ArchFullFileName );
libCache->SetCache(); libCache->SetCache();
......
...@@ -538,7 +538,7 @@ bool WinEDA_SchematicFrame::CreateNetlist( int aFormat, const wxString& aFullFil ...@@ -538,7 +538,7 @@ bool WinEDA_SchematicFrame::CreateNetlist( int aFormat, const wxString& aFullFil
} }
/* Cleanup the entire hierarchy */ /* Cleanup the entire hierarchy */
EDA_ScreenList ScreenList; SCH_SCREENS ScreenList;
for( SCH_SCREEN* screen = ScreenList.GetFirst(); for( SCH_SCREEN* screen = ScreenList.GetFirst();
screen != NULL; screen != NULL;
screen = ScreenList.GetNext() ) screen = ScreenList.GetNext() )
......
...@@ -83,14 +83,12 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event ) ...@@ -83,14 +83,12 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event )
DIALOG_LIB_EDIT_PIN dlg( this ); DIALOG_LIB_EDIT_PIN dlg( this );
wxString units = GetUnitsLabel( g_UserUnit ); wxString units = GetUnitsLabel( g_UserUnit );
dlg.SetOrientationList( LIB_PIN::GetOrientationNames(), dlg.SetOrientationList( LIB_PIN::GetOrientationNames(), LIB_PIN::GetOrientationSymbols() );
LIB_PIN::GetOrientationSymbols() );
dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->m_Orient ) ); dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->m_Orient ) );
dlg.SetStyleList( LIB_PIN::GetStyleNames(), dlg.SetStyleList( LIB_PIN::GetStyleNames(), LIB_PIN::GetStyleSymbols() );
LIB_PIN::GetStyleSymbols());
dlg.SetStyle( LIB_PIN::GetStyleCodeIndex( pin->m_PinShape ) ); dlg.SetStyle( LIB_PIN::GetStyleCodeIndex( pin->m_PinShape ) );
dlg.SetElectricalTypeList( LIB_PIN::GetElectricalTypeNames(), dlg.SetElectricalTypeList( LIB_PIN::GetElectricalTypeNames(),
LIB_PIN::GetElectricalTypeSymbols()); LIB_PIN::GetElectricalTypeSymbols() );
dlg.SetElectricalType( pin->m_PinType ); dlg.SetElectricalType( pin->m_PinType );
dlg.SetName( pin->m_PinName ); dlg.SetName( pin->m_PinName );
dlg.SetNameTextSize( ReturnStringFromValue( g_UserUnit, dlg.SetNameTextSize( ReturnStringFromValue( g_UserUnit,
...@@ -102,8 +100,7 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event ) ...@@ -102,8 +100,7 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event )
pin->m_PinNumSize, pin->m_PinNumSize,
m_InternalUnits ) ); m_InternalUnits ) );
dlg.SetNumberTextSizeUnits( units ); dlg.SetNumberTextSizeUnits( units );
dlg.SetLength( ReturnStringFromValue( g_UserUnit, pin->m_PinLen, dlg.SetLength( ReturnStringFromValue( g_UserUnit, pin->m_PinLen, m_InternalUnits ) );
m_InternalUnits ) );
dlg.SetLengthUnits( units ); dlg.SetLengthUnits( units );
dlg.SetAddToAllParts( pin->GetUnit() == 0 ); dlg.SetAddToAllParts( pin->GetUnit() == 0 );
dlg.SetAddToAllBodyStyles( pin->GetConvert() == 0 ); dlg.SetAddToAllBodyStyles( pin->GetConvert() == 0 );
...@@ -137,8 +134,7 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event ) ...@@ -137,8 +134,7 @@ void WinEDA_LibeditFrame::OnEditPin( wxCommandEvent& event )
dlg.GetNumberTextSize(), dlg.GetNumberTextSize(),
m_InternalUnits ); m_InternalUnits );
LastPinOrient = LIB_PIN::GetOrientationCode( dlg.GetOrientation() ); LastPinOrient = LIB_PIN::GetOrientationCode( dlg.GetOrientation() );
LastPinLength = ReturnValueFromString( g_UserUnit, dlg.GetLength(), LastPinLength = ReturnValueFromString( g_UserUnit, dlg.GetLength(), m_InternalUnits );
m_InternalUnits );
LastPinShape = LIB_PIN::GetStyleCode( dlg.GetStyle() ); LastPinShape = LIB_PIN::GetStyleCode( dlg.GetStyle() );
LastPinType = dlg.GetElectricalType(); LastPinType = dlg.GetElectricalType();
LastPinCommonConvert = dlg.GetAddToAllBodyStyles(); LastPinCommonConvert = dlg.GetAddToAllBodyStyles();
...@@ -271,8 +267,7 @@ another pin. Continue?" ) ); ...@@ -271,8 +267,7 @@ another pin. Continue?" ) );
} }
/* Put linked pins in new position, and clear flags */ /* Put linked pins in new position, and clear flags */
for( Pin = m_component->GetNextPin(); Pin != NULL; for( Pin = m_component->GetNextPin(); Pin != NULL; Pin = m_component->GetNextPin( Pin ) )
Pin = m_component->GetNextPin( Pin ) )
{ {
if( Pin->m_Flags == 0 ) if( Pin->m_Flags == 0 )
continue; continue;
...@@ -437,8 +432,7 @@ void WinEDA_LibeditFrame::CreatePin( wxDC* DC ) ...@@ -437,8 +432,7 @@ void WinEDA_LibeditFrame::CreatePin( wxDC* DC )
if( g_EditPinByPinIsOn == false ) if( g_EditPinByPinIsOn == false )
pin->m_Flags |= IS_LINKED; pin->m_Flags |= IS_LINKED;
pin->m_Pos.x = GetScreen()->m_Curseur.x; pin->m_Pos = GetScreen()->GetCursorDrawPosition();
pin->m_Pos.y = -GetScreen()->m_Curseur.y;
pin->m_PinLen = LastPinLength; pin->m_PinLen = LastPinLength;
pin->m_Orient = LastPinOrient; pin->m_Orient = LastPinOrient;
pin->m_PinType = LastPinType; pin->m_PinType = LastPinType;
...@@ -471,7 +465,7 @@ void WinEDA_LibeditFrame::CreatePin( wxDC* DC ) ...@@ -471,7 +465,7 @@ void WinEDA_LibeditFrame::CreatePin( wxDC* DC )
if (pin->m_Flags & IS_CANCELLED) if (pin->m_Flags & IS_CANCELLED)
{ {
DeletePin(NULL, m_component, pin); DeletePin( NULL, m_component, pin );
m_drawItem = NULL; m_drawItem = NULL;
} }
else else
......
/**********************************************/
/* eesave.cpp Module to Save EESchema files */
/**********************************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "confirm.h"
#include "kicad_string.h"
#include "gestfich.h"
#include "macros.h"
#include "program.h"
#include "general.h"
#include "protos.h"
#include "class_library.h"
#include <boost/foreach.hpp>
/*****************************************************************************
* Routine to save an EESchema file. *
* 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 )
{
wxString msg, tmp;
wxFileName schematicFileName, backupFileName;
FILE* f;
wxString dirbuf;
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;
switch( FileSave )
{
case FILE_SAVE_AS:
schematicFileName = screen->m_FileName;
backupFileName = schematicFileName;
/* Rename the old file to a '.bak' one: */
if( schematicFileName.FileExists() )
{
backupFileName.SetExt( wxT( "bak" ) );
wxRemoveFile( backupFileName.GetFullPath() );
if( !wxRenameFile( schematicFileName.GetFullPath(),
backupFileName.GetFullPath() ) )
{
DisplayError( this,
wxT( "Warning: unable to rename old file" ), 10 );
}
}
break;
case FILE_SAVE_NEW:
{
wxFileDialog dlg( this, _( "Schematic Files" ), wxGetCwd(),
screen->m_FileName, SchematicFileWildcard,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( dlg.ShowModal() == wxID_CANCEL )
return false;
screen->m_FileName = dlg.GetPath();
schematicFileName = dlg.GetPath();
break;
}
default:
break;
}
if( ( f = wxFopen( schematicFileName.GetFullPath(), wxT( "wt" ) ) ) == NULL )
{
msg = _( "Failed to create file " ) + schematicFileName.GetFullPath();
DisplayError( this, msg );
return false;
}
if( FileSave == FILE_SAVE_NEW )
screen->m_FileName = schematicFileName.GetFullPath();
bool success = screen->Save( f );
if( !success )
DisplayError( this, _( "File write operation failed." ) );
else
screen->ClrModify();
fclose( f );
return success;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_SCREEN::Save( FILE* aFile ) const
{
// Creates header
if( fprintf( aFile, "%s %s %d", EESCHEMA_FILE_STAMP,
SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION ) < 0
|| fprintf( aFile, " date %s\n", CONV_TO_UTF8( DateAndTime() ) ) < 0 )
return FALSE;
BOOST_FOREACH( const CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() )
{
if( fprintf( aFile, "LIBS:%s\n", CONV_TO_UTF8( lib.GetName() ) ) < 0 )
return FALSE;
}
if( fprintf( aFile, "EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers,
g_LayerDescr.CurrentLayer ) < 0
|| fprintf( aFile, "EELAYER END\n" ) < 0 )
return FALSE;
/* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
* SheetNumber and Sheet Count in a complex hierarchy, but useful in
* simple hierarchy and flat hierarchy. Used also to search the root
* sheet ( ScreenNumber = 1 ) within the files
*/
if( fprintf( aFile, "$Descr %s %d %d\n", CONV_TO_UTF8( m_CurrentSheetDesc->m_Name ),
m_CurrentSheetDesc->m_Size.x, m_CurrentSheetDesc->m_Size.y ) < 0
|| fprintf( aFile, "Sheet %d %d\n", m_ScreenNumber, m_NumberOfScreen ) < 0
|| fprintf( aFile, "Title \"%s\"\n", CONV_TO_UTF8( m_Title ) ) < 0
|| fprintf( aFile, "Date \"%s\"\n", CONV_TO_UTF8( m_Date ) ) < 0
|| fprintf( aFile, "Rev \"%s\"\n", CONV_TO_UTF8( m_Revision ) ) < 0
|| fprintf( aFile, "Comp \"%s\"\n", CONV_TO_UTF8( m_Company ) ) < 0
|| fprintf( aFile, "Comment1 \"%s\"\n", CONV_TO_UTF8( m_Commentaire1 ) ) < 0
|| fprintf( aFile, "Comment2 \"%s\"\n", CONV_TO_UTF8( m_Commentaire2 ) ) < 0
|| fprintf( aFile, "Comment3 \"%s\"\n", CONV_TO_UTF8( m_Commentaire3 ) ) < 0
|| fprintf( aFile, "Comment4 \"%s\"\n", CONV_TO_UTF8( m_Commentaire4 ) ) < 0
|| fprintf( aFile, "$EndDescr\n" ) < 0 )
return FALSE;
for( SCH_ITEM* item = EEDrawList; item; item = item->Next() )
{
if( !item->Save( aFile ) )
return FALSE;
}
if( fprintf( aFile, "$EndSCHEMATC\n" ) < 0 )
return FALSE;
return TRUE;
}
...@@ -499,36 +499,3 @@ void WinEDA_SchematicFrame::GetSchematicFromRedoList( wxCommandEvent& event ) ...@@ -499,36 +499,3 @@ void WinEDA_SchematicFrame::GetSchematicFromRedoList( wxCommandEvent& event )
TestDanglingEnds( GetScreen()->EEDrawList, NULL ); TestDanglingEnds( GetScreen()->EEDrawList, NULL );
DrawPanel->Refresh(); DrawPanel->Refresh();
} }
/** Function ClearUndoORRedoList
* free the undo or redo list from List element
* Wrappers are deleted.
* datas pointed by wrappers are deleted if not in use in schematic
* i.e. when they are copy of a schematic item or they are no more in use
* (DELETED)
* @param aList = the UNDO_REDO_CONTAINER to clear
* @param aItemCount = the count of items to remove. < 0 for all items
* items (commands stored in list) are removed from the beginning of the list.
* So this function can be called to remove old commands
*/
void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList,
int aItemCount )
{
if( aItemCount == 0 )
return;
unsigned icnt = aList.m_CommandsList.size();
if( aItemCount > 0 )
icnt = aItemCount;
for( unsigned ii = 0; ii < icnt; ii++ )
{
if( aList.m_CommandsList.size() == 0 )
break;
PICKED_ITEMS_LIST* curr_cmd = aList.m_CommandsList[0];
aList.m_CommandsList.erase( aList.m_CommandsList.begin() );
curr_cmd->ClearListAndDeleteItems();
delete curr_cmd; // Delete command
}
}
...@@ -30,12 +30,11 @@ ...@@ -30,12 +30,11 @@
#include "viewlib_frame.h" #include "viewlib_frame.h"
#include "hotkeys.h" #include "hotkeys.h"
#include "dialog_schematic_find.h" #include "dialogs/dialog_schematic_find.h"
BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame )
EVT_SOCKET( ID_EDA_SOCKET_EVENT_SERV, EVT_SOCKET( ID_EDA_SOCKET_EVENT_SERV, WinEDA_DrawFrame::OnSockRequestServer )
WinEDA_DrawFrame::OnSockRequestServer )
EVT_SOCKET( ID_EDA_SOCKET_EVENT, WinEDA_DrawFrame::OnSockRequest ) EVT_SOCKET( ID_EDA_SOCKET_EVENT, WinEDA_DrawFrame::OnSockRequest )
EVT_CLOSE( WinEDA_SchematicFrame::OnCloseWindow ) EVT_CLOSE( WinEDA_SchematicFrame::OnCloseWindow )
...@@ -64,12 +63,9 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) ...@@ -64,12 +63,9 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame )
EVT_MENU( ID_POPUP_SCH_COPY_ITEM, WinEDA_SchematicFrame::OnCopySchematicItemRequest ) EVT_MENU( ID_POPUP_SCH_COPY_ITEM, WinEDA_SchematicFrame::OnCopySchematicItemRequest )
EVT_MENU( ID_CONFIG_REQ, EVT_MENU( ID_CONFIG_REQ, WinEDA_SchematicFrame::InstallConfigFrame )
WinEDA_SchematicFrame::InstallConfigFrame ) EVT_MENU( ID_CONFIG_SAVE, WinEDA_SchematicFrame::Process_Config )
EVT_MENU( ID_CONFIG_SAVE, EVT_MENU( ID_CONFIG_READ, WinEDA_SchematicFrame::Process_Config )
WinEDA_SchematicFrame::Process_Config )
EVT_MENU( ID_CONFIG_READ,
WinEDA_SchematicFrame::Process_Config )
EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START,
ID_PREFERENCES_HOTKEY_END, ID_PREFERENCES_HOTKEY_END,
WinEDA_SchematicFrame::Process_Config ) WinEDA_SchematicFrame::Process_Config )
...@@ -93,10 +89,8 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) ...@@ -93,10 +89,8 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame )
EVT_TOOL( wxID_CUT, WinEDA_SchematicFrame::Process_Special_Functions ) EVT_TOOL( wxID_CUT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_COPY, WinEDA_SchematicFrame::Process_Special_Functions ) EVT_TOOL( wxID_COPY, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_PASTE, WinEDA_SchematicFrame::Process_Special_Functions ) EVT_TOOL( wxID_PASTE, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_UNDO, EVT_TOOL( wxID_UNDO, WinEDA_SchematicFrame::GetSchematicFromUndoList )
WinEDA_SchematicFrame::GetSchematicFromUndoList ) EVT_TOOL( wxID_REDO, WinEDA_SchematicFrame::GetSchematicFromRedoList )
EVT_TOOL( wxID_REDO,
WinEDA_SchematicFrame::GetSchematicFromRedoList )
EVT_TOOL( ID_GET_ANNOTATE, WinEDA_SchematicFrame::OnAnnotate ) EVT_TOOL( ID_GET_ANNOTATE, WinEDA_SchematicFrame::OnAnnotate )
EVT_TOOL( wxID_PRINT, WinEDA_SchematicFrame::OnPrint ) EVT_TOOL( wxID_PRINT, WinEDA_SchematicFrame::OnPrint )
EVT_TOOL( ID_GET_ERC, WinEDA_SchematicFrame::OnErc ) EVT_TOOL( ID_GET_ERC, WinEDA_SchematicFrame::OnErc )
...@@ -104,15 +98,13 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) ...@@ -104,15 +98,13 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame )
EVT_TOOL( ID_GET_TOOLS, WinEDA_SchematicFrame::OnCreateBillOfMaterials ) EVT_TOOL( ID_GET_TOOLS, WinEDA_SchematicFrame::OnCreateBillOfMaterials )
EVT_TOOL( ID_FIND_ITEMS, WinEDA_SchematicFrame::OnFindItems ) EVT_TOOL( ID_FIND_ITEMS, WinEDA_SchematicFrame::OnFindItems )
EVT_TOOL( ID_BACKANNO_ITEMS, WinEDA_SchematicFrame::OnLoadStuffFile ) EVT_TOOL( ID_BACKANNO_ITEMS, WinEDA_SchematicFrame::OnLoadStuffFile )
EVT_TOOL( ID_COMPONENT_BUTT, EVT_TOOL( ID_COMPONENT_BUTT, WinEDA_SchematicFrame::Process_Special_Functions )
WinEDA_SchematicFrame::Process_Special_Functions )
EVT_MENU( ID_GENERAL_HELP, WinEDA_DrawFrame::GetKicadHelp ) EVT_MENU( ID_GENERAL_HELP, WinEDA_DrawFrame::GetKicadHelp )
EVT_MENU( ID_KICAD_ABOUT, WinEDA_DrawFrame::GetKicadAbout ) EVT_MENU( ID_KICAD_ABOUT, WinEDA_DrawFrame::GetKicadAbout )
// Tools and buttons for vertical toolbar. // Tools and buttons for vertical toolbar.
EVT_TOOL( ID_NO_SELECT_BUTT, EVT_TOOL( ID_NO_SELECT_BUTT, WinEDA_SchematicFrame::Process_Special_Functions )
WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL_RANGE( ID_SCHEMATIC_VERTICAL_TOOLBAR_START, EVT_TOOL_RANGE( ID_SCHEMATIC_VERTICAL_TOOLBAR_START,
ID_SCHEMATIC_VERTICAL_TOOLBAR_END, ID_SCHEMATIC_VERTICAL_TOOLBAR_END,
WinEDA_SchematicFrame::Process_Special_Functions ) WinEDA_SchematicFrame::Process_Special_Functions )
...@@ -131,18 +123,12 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) ...@@ -131,18 +123,12 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame )
EVT_UPDATE_UI( wxID_CUT, WinEDA_SchematicFrame::OnUpdateBlockSelected ) EVT_UPDATE_UI( wxID_CUT, WinEDA_SchematicFrame::OnUpdateBlockSelected )
EVT_UPDATE_UI( wxID_COPY, WinEDA_SchematicFrame::OnUpdateBlockSelected ) EVT_UPDATE_UI( wxID_COPY, WinEDA_SchematicFrame::OnUpdateBlockSelected )
EVT_UPDATE_UI( wxID_PASTE, WinEDA_SchematicFrame::OnUpdatePaste ) EVT_UPDATE_UI( wxID_PASTE, WinEDA_SchematicFrame::OnUpdatePaste )
EVT_UPDATE_UI( wxID_UNDO, EVT_UPDATE_UI( wxID_UNDO, WinEDA_SchematicFrame::OnUpdateSchematicUndo )
WinEDA_SchematicFrame::OnUpdateSchematicUndo ) EVT_UPDATE_UI( wxID_REDO, WinEDA_SchematicFrame::OnUpdateSchematicRedo )
EVT_UPDATE_UI( wxID_REDO, EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_GRID, WinEDA_SchematicFrame::OnUpdateGrid )
WinEDA_SchematicFrame::OnUpdateSchematicRedo ) EVT_UPDATE_UI( ID_TB_OPTIONS_SELECT_CURSOR, WinEDA_SchematicFrame::OnUpdateSelectCursor )
EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_GRID, EVT_UPDATE_UI( ID_TB_OPTIONS_HIDDEN_PINS, WinEDA_SchematicFrame::OnUpdateHiddenPins )
WinEDA_SchematicFrame::OnUpdateGrid ) EVT_UPDATE_UI( ID_TB_OPTIONS_BUS_WIRES_ORIENT, WinEDA_SchematicFrame::OnUpdateBusOrientation )
EVT_UPDATE_UI( ID_TB_OPTIONS_SELECT_CURSOR,
WinEDA_SchematicFrame::OnUpdateSelectCursor )
EVT_UPDATE_UI( ID_TB_OPTIONS_HIDDEN_PINS,
WinEDA_SchematicFrame::OnUpdateHiddenPins )
EVT_UPDATE_UI( ID_TB_OPTIONS_BUS_WIRES_ORIENT,
WinEDA_SchematicFrame::OnUpdateBusOrientation )
EVT_UPDATE_UI_RANGE( ID_TB_OPTIONS_SELECT_UNIT_MM, EVT_UPDATE_UI_RANGE( ID_TB_OPTIONS_SELECT_UNIT_MM,
ID_TB_OPTIONS_SELECT_UNIT_INCH, ID_TB_OPTIONS_SELECT_UNIT_INCH,
WinEDA_SchematicFrame::OnUpdateUnits ) WinEDA_SchematicFrame::OnUpdateUnits )
...@@ -235,20 +221,17 @@ WinEDA_SchematicFrame::WinEDA_SchematicFrame( wxWindow* father, ...@@ -235,20 +221,17 @@ WinEDA_SchematicFrame::WinEDA_SchematicFrame( wxWindow* father,
wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top().Row( 0 ) ); wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top().Row( 0 ) );
if( m_VToolBar ) if( m_VToolBar )
m_auimgr.AddPane( m_VToolBar, m_auimgr.AddPane( m_VToolBar, wxAuiPaneInfo( vert ).Name( wxT( "m_VToolBar" ) ).Right() );
wxAuiPaneInfo( vert ).Name( wxT( "m_VToolBar" ) ).Right() );
if( m_OptionsToolBar ) if( m_OptionsToolBar )
m_auimgr.AddPane( m_OptionsToolBar, m_auimgr.AddPane( m_OptionsToolBar,
wxAuiPaneInfo( vert ).Name( wxT( "m_OptionsToolBar" ) ).Left() ); wxAuiPaneInfo( vert ).Name( wxT( "m_OptionsToolBar" ) ).Left() );
if( DrawPanel ) if( DrawPanel )
m_auimgr.AddPane( DrawPanel, m_auimgr.AddPane( DrawPanel, wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() );
wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() );
if( MsgPanel ) if( MsgPanel )
m_auimgr.AddPane( MsgPanel, m_auimgr.AddPane( MsgPanel, wxAuiPaneInfo( horiz ).Name( wxT( "MsgPanel" ) ).Bottom() );
wxAuiPaneInfo( horiz ).Name( wxT( "MsgPanel" ) ).Bottom() );
m_auimgr.Update(); m_auimgr.Update();
} }
...@@ -282,8 +265,8 @@ SCH_SHEET_PATH* WinEDA_SchematicFrame::GetSheet() ...@@ -282,8 +265,8 @@ SCH_SHEET_PATH* WinEDA_SchematicFrame::GetSheet()
*/ */
void WinEDA_SchematicFrame::SetSheetNumberAndCount() void WinEDA_SchematicFrame::SetSheetNumberAndCount()
{ {
SCH_SCREEN* screen = GetScreen(); SCH_SCREEN* screen = GetScreen();
EDA_ScreenList s_list; SCH_SCREENS s_list;
/* Set the sheet count, and the sheet number (1 for root sheet) /* Set the sheet count, and the sheet number (1 for root sheet)
*/ */
...@@ -296,8 +279,7 @@ void WinEDA_SchematicFrame::SetSheetNumberAndCount() ...@@ -296,8 +279,7 @@ void WinEDA_SchematicFrame::SetSheetNumberAndCount()
// and count them from root to the current sheet path: // and count them from root to the current sheet path:
SCH_SHEET_PATH* sheet; SCH_SHEET_PATH* sheet;
for( sheet = SheetList.GetFirst(); sheet != NULL; for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() )
sheet = SheetList.GetNext() )
{ {
wxString sheetpath = sheet->Path(); wxString sheetpath = sheet->Path();
if( sheetpath == current_sheetpath ) // Current sheet path found if( sheetpath == current_sheetpath ) // Current sheet path found
...@@ -365,8 +347,7 @@ void WinEDA_SchematicFrame::OnCloseWindow( wxCloseEvent& Event ) ...@@ -365,8 +347,7 @@ void WinEDA_SchematicFrame::OnCloseWindow( wxCloseEvent& Event )
SCH_SHEET_LIST SheetList; SCH_SHEET_LIST SheetList;
for( sheet = SheetList.GetFirst(); sheet != NULL; for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() )
sheet = SheetList.GetNext() )
{ {
if( sheet->LastScreen() && sheet->LastScreen()->IsModify() ) if( sheet->LastScreen() && sheet->LastScreen()->IsModify() )
break; break;
...@@ -428,8 +409,7 @@ int WinEDA_SchematicFrame::BestZoom() ...@@ -428,8 +409,7 @@ int WinEDA_SchematicFrame::BestZoom()
dy = GetScreen()->m_CurrentSheetDesc->m_Size.y; dy = GetScreen()->m_CurrentSheetDesc->m_Size.y;
size = DrawPanel->GetClientSize(); size = DrawPanel->GetClientSize();
zoom = MAX( (double) dx / (double) size.x, zoom = MAX( (double) dx / (double) size.x, (double) dy / (double) size.y );
(double) dy / (double) size.y );
GetScreen()->m_Curseur.x = dx / 2; GetScreen()->m_Curseur.x = dx / 2;
GetScreen()->m_Curseur.y = dy / 2; GetScreen()->m_Curseur.y = dy / 2;
...@@ -486,10 +466,10 @@ wxString WinEDA_SchematicFrame::GetUniqueFilenameForCurrentSheet() ...@@ -486,10 +466,10 @@ wxString WinEDA_SchematicFrame::GetUniqueFilenameForCurrentSheet()
*/ */
void WinEDA_SchematicFrame::OnModify( ) void WinEDA_SchematicFrame::OnModify( )
{ {
GetScreen()->SetModify( ); GetScreen()->SetModify();
wxString date = GenDate(); wxString date = GenDate();
EDA_ScreenList s_list; SCH_SCREENS s_list;
// Set the date for each sheet // Set the date for each sheet
// There are 2 possibilities: // There are 2 possibilities:
...@@ -508,8 +488,7 @@ void WinEDA_SchematicFrame::OnModify( ) ...@@ -508,8 +488,7 @@ void WinEDA_SchematicFrame::OnModify( )
void WinEDA_SchematicFrame::OnUpdateBlockSelected( wxUpdateUIEvent& event ) void WinEDA_SchematicFrame::OnUpdateBlockSelected( wxUpdateUIEvent& event )
{ {
bool enable = ( GetScreen() bool enable = ( GetScreen() && GetScreen()->m_BlockLocate.m_Command == BLOCK_MOVE );
&& GetScreen()->m_BlockLocate.m_Command == BLOCK_MOVE );
event.Enable( enable ); event.Enable( enable );
m_HToolBar->EnableTool( wxID_CUT, enable ); m_HToolBar->EnableTool( wxID_CUT, enable );
...@@ -545,8 +524,7 @@ void WinEDA_SchematicFrame::OnUpdateBusOrientation( wxUpdateUIEvent& event ) ...@@ -545,8 +524,7 @@ void WinEDA_SchematicFrame::OnUpdateBusOrientation( wxUpdateUIEvent& event )
_( "Draw horizontal and vertical wires and buses only" ); _( "Draw horizontal and vertical wires and buses only" );
m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_BUS_WIRES_ORIENT, g_HVLines ); m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_BUS_WIRES_ORIENT, g_HVLines );
m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_BUS_WIRES_ORIENT, m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_BUS_WIRES_ORIENT, tool_tip );
tool_tip );
} }
...@@ -774,6 +752,7 @@ void WinEDA_SchematicFrame::OnExit( wxCommandEvent& event ) ...@@ -774,6 +752,7 @@ void WinEDA_SchematicFrame::OnExit( wxCommandEvent& event )
void WinEDA_SchematicFrame::SetLanguage( wxCommandEvent& event ) void WinEDA_SchematicFrame::SetLanguage( wxCommandEvent& event )
{ {
WinEDA_BasicFrame::SetLanguage( event ); WinEDA_BasicFrame::SetLanguage( event );
if( m_LibeditFrame ) if( m_LibeditFrame )
m_LibeditFrame->WinEDA_BasicFrame::SetLanguage( event ); m_LibeditFrame->WinEDA_BasicFrame::SetLanguage( event );
} }
......
...@@ -143,10 +143,6 @@ public: ...@@ -143,10 +143,6 @@ public:
BASE_SCREEN( KICAD_T aType = SCREEN_STRUCT_TYPE ); BASE_SCREEN( KICAD_T aType = SCREEN_STRUCT_TYPE );
~BASE_SCREEN(); ~BASE_SCREEN();
BASE_SCREEN* Next() const { return (BASE_SCREEN*) Pnext; }
BASE_SCREEN* Back() const { return (BASE_SCREEN*) Pback; }
/** /**
* Function setCurItem * Function setCurItem
* sets the currently selected object, m_CurrentItem. * sets the currently selected object, m_CurrentItem.
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base_struct.h" #include "base_struct.h"
#include "class_base_screen.h" #include "class_base_screen.h"
/* Max number of sheets in a hierarchy project: */ /* Max number of sheets in a hierarchy project: */
#define NB_MAX_SHEET 500 #define NB_MAX_SHEET 500
...@@ -44,11 +45,21 @@ public: ...@@ -44,11 +45,21 @@ public:
return wxT( "SCH_SCREEN" ); return wxT( "SCH_SCREEN" );
} }
void FreeDrawList(); // Free EESchema drawing list (does not delete the sub hierarchies) /**
* Free all the items from the schematic associated with the screen.
*
* This does not delete any sub hierarchies.
*/
void FreeDrawList();
void Place( WinEDA_SchematicFrame* frame, wxDC* DC ) { }; void Place( WinEDA_SchematicFrame* frame, wxDC* DC ) { };
void RemoveFromDrawList( SCH_ITEM* DrawStruct ); /* remove DrawStruct from EEDrawList. */ /**
* Remove \a aItem from the schematic associated with this screen.
*
* @param aItem - Item to be removed from schematic.
*/
void RemoveFromDrawList( SCH_ITEM* DrawStruct );
bool CheckIfOnDrawList( SCH_ITEM* st ); bool CheckIfOnDrawList( SCH_ITEM* st );
void AddToDrawList( SCH_ITEM* DrawStruct ); void AddToDrawList( SCH_ITEM* DrawStruct );
...@@ -62,7 +73,7 @@ public: ...@@ -62,7 +73,7 @@ public:
/** Function ClearUndoORRedoList /** Function ClearUndoORRedoList
* free the undo or redo list from List element * free the undo or redo list from List element
* Wrappers are deleted. * Wrappers are deleted.
* datas pointed by wrappers are deleted if not in use in schematic * data pointed by wrappers are deleted if not in use in schematic
* i.e. when they are copy of a schematic item or they are no more in use (DELETED) * i.e. when they are copy of a schematic item or they are no more in use (DELETED)
* @param aList = the UNDO_REDO_CONTAINER to clear * @param aList = the UNDO_REDO_CONTAINER to clear
* @param aItemCount = the count of items to remove. < 0 for all items * @param aItemCount = the count of items to remove. < 0 for all items
...@@ -73,7 +84,8 @@ public: ...@@ -73,7 +84,8 @@ public:
/** /**
* Function Save * Function Save
* writes the data structures for this object out to a FILE in "*.brd" format. * writes the data structures for this object out to \a aFile in "*.sch" format.
*
* @param aFile The FILE to write to. * @param aFile The FILE to write to.
* @return bool - true if success writing else false. * @return bool - true if success writing else false.
*/ */
...@@ -86,25 +98,23 @@ public: ...@@ -86,25 +98,23 @@ public:
/********************************************************/ /********************************************************/
// screens are unique, and correspond to .sch files. // screens are unique, and correspond to .sch files.
WX_DEFINE_ARRAY( SCH_SCREEN *, ScreenGrowArray ); class SCH_SCREENS
class EDA_ScreenList
{ {
private: private:
ScreenGrowArray m_List; std::vector< SCH_SCREEN* > m_screens;
unsigned int m_Index; unsigned int m_index;
public: public:
EDA_ScreenList(); SCH_SCREENS();
~EDA_ScreenList() { } ~SCH_SCREENS();
int GetCount() { return m_List.GetCount(); } int GetCount() const { return m_screens.size(); }
SCH_SCREEN* GetFirst(); SCH_SCREEN* GetFirst();
SCH_SCREEN* GetNext(); SCH_SCREEN* GetNext();
SCH_SCREEN* GetScreen( unsigned int index ); SCH_SCREEN* GetScreen( unsigned int aIndex );
private: private:
void AddScreenToList( SCH_SCREEN* testscreen ); void AddScreenToList( SCH_SCREEN* aScreen );
void BuildScreenList( EDA_BaseStruct* sheet ); void BuildScreenList( EDA_BaseStruct* aItem );
}; };
#endif /* CLASS_SCREEN_H */ #endif /* CLASS_SCREEN_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment