242 lines
5.8 KiB
C++
242 lines
5.8 KiB
C++
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
#include "common.h"
|
|
#include "eeschema_id.h"
|
|
#include "class_drawpanel.h"
|
|
|
|
#include "program.h"
|
|
#include "general.h"
|
|
#include "protos.h"
|
|
|
|
|
|
void SetaParent( EDA_BaseStruct* Struct, BASE_SCREEN* Screen )
|
|
{
|
|
switch( Struct->Type() )
|
|
{
|
|
case DRAW_POLYLINE_STRUCT_TYPE:
|
|
case DRAW_JUNCTION_STRUCT_TYPE:
|
|
case TYPE_SCH_TEXT:
|
|
case TYPE_SCH_LABEL:
|
|
case TYPE_SCH_GLOBALLABEL:
|
|
case TYPE_SCH_HIERLABEL:
|
|
case TYPE_SCH_COMPONENT:
|
|
case DRAW_SEGMENT_STRUCT_TYPE:
|
|
case DRAW_BUSENTRY_STRUCT_TYPE:
|
|
case DRAW_SHEET_STRUCT_TYPE:
|
|
case TYPE_SCH_MARKER:
|
|
case DRAW_NOCONNECT_STRUCT_TYPE:
|
|
Struct->SetParent( Screen );
|
|
break;
|
|
|
|
case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/* Default EESchema zoom values. Limited to 17 values to keep a decent size
|
|
* to menus
|
|
*/
|
|
static int SchematicZoomList[] =
|
|
{
|
|
5, 7, 10, 15, 20, 30, 40, 60, 80, 120, 160, 230, 320, 480, 640, 800, 1280
|
|
};
|
|
|
|
#define SCHEMATIC_ZOOM_LIST_CNT ( sizeof( SchematicZoomList ) / \
|
|
sizeof( int ) )
|
|
#define MM_TO_SCH_UNITS 1000.0 / 25.4 //schematic internal unites are mils
|
|
|
|
|
|
/* Default grid sizes for the schematic editor.
|
|
* Do NOT add others values (mainly grid values in mm),
|
|
* because they can break the schematic:
|
|
* 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
|
|
* (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
|
|
* others values are useful only for graphic items (mainly in library editor)
|
|
* so use integer values in mils only.
|
|
*/
|
|
static GRID_TYPE SchematicGridList[] = {
|
|
{ ID_POPUP_GRID_LEVEL_50, wxRealPoint( 50, 50 ) },
|
|
{ ID_POPUP_GRID_LEVEL_25, wxRealPoint( 25, 25 ) },
|
|
{ ID_POPUP_GRID_LEVEL_10, wxRealPoint( 10, 10 ) },
|
|
{ ID_POPUP_GRID_LEVEL_5, wxRealPoint( 5, 5 ) },
|
|
{ ID_POPUP_GRID_LEVEL_2, wxRealPoint( 2, 2 ) },
|
|
{ ID_POPUP_GRID_LEVEL_1, wxRealPoint( 1, 1 ) },
|
|
};
|
|
|
|
#define SCHEMATIC_GRID_LIST_CNT ( sizeof( SchematicGridList ) / \
|
|
sizeof( GRID_TYPE ) )
|
|
|
|
|
|
SCH_SCREEN::SCH_SCREEN( KICAD_T type ) : BASE_SCREEN( type )
|
|
{
|
|
size_t i;
|
|
|
|
EEDrawList = NULL; /* Schematic items list */
|
|
m_Zoom = 32;
|
|
|
|
for( i = 0; i < SCHEMATIC_ZOOM_LIST_CNT; i++ )
|
|
m_ZoomList.Add( SchematicZoomList[i] );
|
|
|
|
for( i = 0; i < SCHEMATIC_GRID_LIST_CNT; i++ )
|
|
AddGrid( SchematicGridList[i] );
|
|
|
|
SetGrid( wxRealPoint( 50, 50 ) ); /* Default grid size. */
|
|
m_RefCount = 0;
|
|
m_Center = false; /* Suitable for schematic only. For
|
|
* libedit and viewlib, must be set
|
|
* to true */
|
|
InitDatas();
|
|
}
|
|
|
|
|
|
SCH_SCREEN::~SCH_SCREEN()
|
|
{
|
|
ClearUndoRedoList();
|
|
FreeDrawList();
|
|
}
|
|
|
|
|
|
/* Routine to clear (free) EESchema drawing list of a screen.
|
|
*/
|
|
void SCH_SCREEN::FreeDrawList()
|
|
{
|
|
SCH_ITEM* DrawStruct;
|
|
|
|
while( EEDrawList != NULL )
|
|
{
|
|
DrawStruct = EEDrawList;
|
|
EEDrawList = EEDrawList->Next();
|
|
SAFE_DELETE( DrawStruct );
|
|
}
|
|
|
|
EEDrawList = NULL;
|
|
}
|
|
|
|
|
|
/* If found in EEDrawList, remove DrawStruct from EEDrawList.
|
|
* DrawStruct is not deleted or modified
|
|
*/
|
|
void SCH_SCREEN::RemoveFromDrawList( SCH_ITEM * DrawStruct )
|
|
{
|
|
if( DrawStruct == EEDrawList )
|
|
EEDrawList = EEDrawList->Next();
|
|
else
|
|
{
|
|
EDA_BaseStruct* DrawList = EEDrawList;
|
|
while( DrawList && DrawList->Next() )
|
|
{
|
|
if( DrawList->Next() == DrawStruct )
|
|
{
|
|
DrawList->SetNext( DrawList->Next()->Next() );
|
|
break;
|
|
}
|
|
DrawList = DrawList->Next();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool SCH_SCREEN::CheckIfOnDrawList( SCH_ITEM* st )
|
|
{
|
|
SCH_ITEM * DrawList = EEDrawList;
|
|
|
|
while( DrawList )
|
|
{
|
|
if( DrawList == st )
|
|
return true;
|
|
DrawList = DrawList->Next();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
void SCH_SCREEN::AddToDrawList( SCH_ITEM* st )
|
|
{
|
|
st->SetNext( EEDrawList );
|
|
EEDrawList = st;
|
|
}
|
|
|
|
|
|
/*********************************************************************/
|
|
/* Class EDA_ScreenList to handle the list of screens in a hierarchy */
|
|
/*********************************************************************/
|
|
|
|
EDA_ScreenList::EDA_ScreenList()
|
|
{
|
|
m_Index = 0;
|
|
BuildScreenList( g_RootSheet );
|
|
}
|
|
|
|
|
|
SCH_SCREEN* EDA_ScreenList::GetFirst()
|
|
{
|
|
m_Index = 0;
|
|
if( m_List.GetCount() > 0 )
|
|
return m_List[0];
|
|
return NULL;
|
|
}
|
|
|
|
|
|
SCH_SCREEN* EDA_ScreenList::GetNext()
|
|
{
|
|
if( m_Index < m_List.GetCount() )
|
|
m_Index++;
|
|
return GetScreen( m_Index );
|
|
}
|
|
|
|
|
|
/* return the m_List[index] item
|
|
*/
|
|
SCH_SCREEN* EDA_ScreenList::GetScreen( unsigned int index )
|
|
{
|
|
if( index < m_List.GetCount() )
|
|
return m_List[index];
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void EDA_ScreenList::AddScreenToList( SCH_SCREEN* testscreen )
|
|
{
|
|
if( testscreen == NULL )
|
|
return;
|
|
for( unsigned int i = 0; i< m_List.GetCount(); i++ )
|
|
{
|
|
if( m_List[i] == testscreen )
|
|
return;
|
|
}
|
|
|
|
m_List.Add( testscreen );
|
|
}
|
|
|
|
|
|
void EDA_ScreenList::BuildScreenList( EDA_BaseStruct* s )
|
|
{
|
|
if( s && s->Type() == DRAW_SHEET_STRUCT_TYPE )
|
|
{
|
|
SCH_SHEET* ds = (SCH_SHEET*) s;
|
|
s = ds->m_AssociatedScreen;
|
|
}
|
|
if( s && s->Type() == SCREEN_STRUCT_TYPE )
|
|
{
|
|
SCH_SCREEN* screen = (SCH_SCREEN*) s;
|
|
AddScreenToList( screen );
|
|
EDA_BaseStruct* strct = screen->EEDrawList;
|
|
while( strct )
|
|
{
|
|
if( strct->Type() == DRAW_SHEET_STRUCT_TYPE )
|
|
{
|
|
BuildScreenList( strct );
|
|
}
|
|
strct = strct->Next();
|
|
}
|
|
}
|
|
}
|