970 lines
25 KiB
C++
970 lines
25 KiB
C++
/****************************************/
|
|
/* Module to load/save EESchema files. */
|
|
/****************************************/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
|
|
#include "common.h"
|
|
#include "program.h"
|
|
#include "libcmp.h"
|
|
#include "general.h"
|
|
|
|
#include "protos.h"
|
|
|
|
#include "id.h"
|
|
|
|
/* Format des fichiers:
|
|
- entete:
|
|
EESchema Schematic File Version n
|
|
- liste des librairies utilisees
|
|
LIBS:lib1,lib2,...
|
|
|
|
- description des elements:
|
|
- ici Dimensions du schema, cartouche..:
|
|
$Descr A3 xx yy (format A3 (A..A0 / A..E / "user") xx yy = dims internes )
|
|
$EndDescr
|
|
|
|
- ici: polyline
|
|
P L 0 3
|
|
2208 1008
|
|
2208 1136
|
|
2128 1136
|
|
|
|
- ici: Segment (wire, bus) ( 1; W = segment type Wire, 2: W = Wire B = Bus
|
|
3: L ou B = epaisseur ( L = ligne, B = bus)
|
|
W W L (W B B si bus)
|
|
1856 1008 1856 1136 (debut X,Y fin X,Y)
|
|
|
|
- ici: Raccord (wire, bus)
|
|
R W L
|
|
1856 1008 1856 1136 (debut X,Y fin X,Y)
|
|
|
|
- ici: Sheet ( Sous-feuille de hierarchie)
|
|
$Sheet
|
|
S 1856 1008 1856 1136 (debut X,Y fin X,Y)
|
|
F0 "texte" X X posx posy ; sheetname
|
|
F1 "texte" X X posx posy ; filename
|
|
Fn "label" type side posx posy size ; n lignes de label
|
|
$EndSheet
|
|
|
|
- ici: composant
|
|
$Comp
|
|
L CAPACITOR C1 H H -30863 -14794 1968 1184 nom, ref, dir et pos
|
|
1 2016 1136 1904 1024 2128 1248 multi, posx,y, rect encadrement
|
|
1 0 0 -1 matrice de rotation/miroir
|
|
$EndComp
|
|
*/
|
|
|
|
/* Fonctions locales */
|
|
static int ReadPartDescr(wxWindow * frame, char *Line, FILE *f, BASE_SCREEN *Window);
|
|
static int ReadSheetDescr(wxWindow * frame, char *Line, FILE *f, BASE_SCREEN * Window);
|
|
static int ReadSchemaDescr(wxWindow * frame, char *Line, FILE *f, BASE_SCREEN * Window);
|
|
static void LoadLayers(FILE *f, int * linecnt);
|
|
|
|
/* Variables locales */
|
|
static int LineCount; /* Decompte de num de ligne lue dans eeload() */
|
|
static wxString MsgDiag; /* Error and log messages */
|
|
|
|
/************************************************************************************************/
|
|
bool WinEDA_SchematicFrame::LoadOneEEFile(SCH_SCREEN *screen, const wxString & FullFileName)
|
|
/************************************************************************************************/
|
|
/* Routine to load an EESchema file.
|
|
Returns TRUE if file has been loaded (at list partially.)
|
|
*/
|
|
{
|
|
char Line[1024], * SLine;
|
|
char Name1[256],
|
|
Name2[256];
|
|
int ii, layer, orient, size;
|
|
wxPoint pos;
|
|
bool Failed = FALSE;
|
|
EDA_BaseStruct *Phead, *Pnext;
|
|
DrawJunctionStruct *ConnectionStruct;
|
|
DrawPolylineStruct *PolylineStruct;
|
|
EDA_DrawLineStruct * SegmentStruct;
|
|
DrawBusEntryStruct * RaccordStruct;
|
|
DrawMarkerStruct * MarkerStruct;
|
|
DrawNoConnectStruct * NoConnectStruct;
|
|
|
|
FILE *f;
|
|
|
|
if ( screen == NULL ) return FALSE;
|
|
if( FullFileName.IsEmpty() ) return FALSE;
|
|
|
|
screen->m_CurrentItem = NULL;
|
|
|
|
LineCount = 1;
|
|
if ((f = wxFopen(FullFileName, wxT("rt")) ) == NULL)
|
|
{
|
|
MsgDiag = _("Failed to open ") + FullFileName;
|
|
DisplayError(this, MsgDiag);
|
|
return FALSE;
|
|
}
|
|
|
|
MsgDiag = _("Loading ") + FullFileName;
|
|
PrintMsg(MsgDiag);
|
|
|
|
if (fgets(Line, 1024 - 1, f) == NULL ||
|
|
strncmp(Line+9, SCHEMATIC_HEAD_STRING, sizeof(SCHEMATIC_HEAD_STRING) - 1)
|
|
!= 0)
|
|
{
|
|
MsgDiag = FullFileName + _(" is NOT EESchema file");
|
|
DisplayError(this, MsgDiag);
|
|
fclose(f);
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount++;
|
|
if(fgets(Line, 1024 - 1, f) == NULL || strncmp(Line, "LIBS:", 5) != 0)
|
|
{
|
|
MsgDiag = FullFileName + _(" is NOT EESchema file");
|
|
DisplayError(this, MsgDiag);
|
|
fclose(f);
|
|
return FALSE;
|
|
}
|
|
|
|
LoadLayers(f, &LineCount);
|
|
|
|
while (!feof(f) && GetLine(f, Line, &LineCount, sizeof(Line)) != NULL)
|
|
{
|
|
SLine = Line;
|
|
while( (*SLine != ' ' ) && *SLine ) SLine++;
|
|
switch(Line[0])
|
|
{
|
|
case '$': /* identification de bloc */
|
|
if(Line[1] == 'C')
|
|
{
|
|
Failed = ReadPartDescr(this, Line, f, screen);
|
|
}
|
|
else if(Line[1] == 'S')
|
|
{
|
|
Failed = ReadSheetDescr(this, Line, f, screen);
|
|
}
|
|
else if(Line[1] == 'D')
|
|
{
|
|
Failed = ReadSchemaDescr(this, Line, f, screen);
|
|
}
|
|
break;
|
|
|
|
case 'L': /* Its a library item. */
|
|
Failed = ReadPartDescr(this, Line, f, screen);
|
|
break; /* Fin lecture 1 composant */
|
|
|
|
|
|
case 'W': /* Its a Segment (WIRE or BUS) item. */
|
|
if( sscanf(SLine, "%s %s", Name1, Name2) != 2 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file Segment struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
break;
|
|
}
|
|
layer = LAYER_NOTES;
|
|
if( Name1[0] == 'W' ) layer = LAYER_WIRE;
|
|
if( Name1[0] == 'B' ) layer = LAYER_BUS;
|
|
|
|
SegmentStruct = new EDA_DrawLineStruct(wxPoint(0,0),layer);
|
|
|
|
LineCount++;
|
|
if (fgets(Line, 256 - 1, f) == NULL ||
|
|
sscanf(Line, "%d %d %d %d ",
|
|
&SegmentStruct->m_Start.x,&SegmentStruct->m_Start.y,
|
|
&SegmentStruct->m_End.x,&SegmentStruct->m_End.y) != 4 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file Segment struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
delete SegmentStruct;
|
|
break;
|
|
}
|
|
|
|
if (!Failed)
|
|
{
|
|
SegmentStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = (EDA_BaseStruct *) SegmentStruct;
|
|
}
|
|
break;
|
|
|
|
|
|
case 'E': /* Its a Raccord (WIRE or BUS) item. */
|
|
if( sscanf(SLine, "%s %s", Name1, Name2) != 2 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file Raccord struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
break;
|
|
}
|
|
|
|
ii = WIRE_TO_BUS;
|
|
if( Name1[0] == 'B' ) ii = BUS_TO_BUS;
|
|
RaccordStruct = new DrawBusEntryStruct(wxPoint(0,0), '\\', ii);
|
|
LineCount++;
|
|
if (fgets(Line, 256 - 1, f) == NULL ||
|
|
sscanf(Line, "%d %d %d %d ",
|
|
&RaccordStruct->m_Pos.x,&RaccordStruct->m_Pos.y,
|
|
&RaccordStruct->m_Size.x,&RaccordStruct->m_Size.y) != 4 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file Raccord struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
delete RaccordStruct;
|
|
break;
|
|
}
|
|
|
|
if (!Failed)
|
|
{
|
|
RaccordStruct->m_Size.x -= RaccordStruct->m_Pos.x;
|
|
RaccordStruct->m_Size.y -= RaccordStruct->m_Pos.y;
|
|
RaccordStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = RaccordStruct;
|
|
}
|
|
break;
|
|
|
|
case 'P': /* Its a polyline item. */
|
|
if (sscanf(SLine, "%s %s %d", Name1, Name2, &ii) != 3 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file polyline struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
break;
|
|
}
|
|
layer = LAYER_NOTES;
|
|
if( Name2[0] == 'W' ) layer = LAYER_WIRE;
|
|
if( Name2[0] == 'B' ) layer = LAYER_BUS;
|
|
|
|
PolylineStruct = new DrawPolylineStruct(layer);
|
|
|
|
PolylineStruct->m_NumOfPoints = ii;
|
|
PolylineStruct->m_Points = (int *) MyZMalloc(sizeof(int) * 2 *
|
|
PolylineStruct->m_NumOfPoints);
|
|
for (ii = 0; ii < PolylineStruct->m_NumOfPoints; ii++)
|
|
{
|
|
LineCount++;
|
|
if (fgets(Line, 256 - 1, f) == NULL ||
|
|
sscanf(Line, "%d %d", &PolylineStruct->m_Points[ii*2],
|
|
&PolylineStruct->m_Points[ii*2+1]) != 2)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file polyline struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
delete PolylineStruct;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!Failed)
|
|
{
|
|
PolylineStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = (EDA_BaseStruct *)
|
|
PolylineStruct;
|
|
}
|
|
break;
|
|
|
|
case 'C': /* Its a connection item. */
|
|
ConnectionStruct = new DrawJunctionStruct(wxPoint(0,0));
|
|
if (sscanf(SLine, "%s %d %d", Name1,
|
|
&ConnectionStruct->m_Pos.x,
|
|
&ConnectionStruct->m_Pos.y) != 3)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file connection struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
delete ConnectionStruct;
|
|
}
|
|
else
|
|
{
|
|
ConnectionStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = ConnectionStruct;
|
|
}
|
|
break;
|
|
|
|
case 'N': /* Its a NoConnect item. */
|
|
if (sscanf(SLine, "%s %d %d", Name1, &pos.x, &pos.y) != 3)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file NoConnect struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
NoConnectStruct = new DrawNoConnectStruct(pos);
|
|
NoConnectStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = NoConnectStruct;
|
|
}
|
|
break;
|
|
|
|
case 'K': /* Its a MarKer item. */
|
|
if (sscanf(SLine, "%s %d %d", Name1, &pos.x, &pos.y) != 3)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file marker struct error line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
char * text;
|
|
char BufLine[1024];
|
|
MarkerStruct = new DrawMarkerStruct(pos,wxEmptyString);
|
|
ii = ReadDelimitedText(BufLine, Line, 256 );
|
|
MarkerStruct->m_Type = (TypeMarker)((Name1[0] & 255) - 'A');
|
|
if( MarkerStruct->m_Type < 0 )
|
|
MarkerStruct->m_Type = MARQ_UNSPEC;
|
|
if ( ii ) MarkerStruct->m_Comment = CONV_FROM_UTF8(BufLine);
|
|
text = strstr(Line," F=");
|
|
if (text)
|
|
{
|
|
sscanf(text+3, "%X", &ii);
|
|
MarkerStruct->m_MarkFlags = ii;
|
|
}
|
|
MarkerStruct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = MarkerStruct;
|
|
}
|
|
break;
|
|
|
|
case 'T': /* Its a text item. */
|
|
{
|
|
EDA_BaseStruct * Struct = NULL;
|
|
*Name1 = *Name2 = 0;
|
|
ii = sscanf(SLine, "%s %d %d %d %d %s",
|
|
Name1, &pos.x, &pos.y, &orient, &size, Name2);
|
|
|
|
if( ii < 4 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file text struct error line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
else if( fgets(Line, 256 - 1, f) == NULL )
|
|
{
|
|
LineCount++;
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file text struct error line %d (No text), aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LineCount++;
|
|
if( size == 0 ) size = DEFAULT_SIZE_TEXT;
|
|
char * text = strtok(Line, "\n\r");
|
|
if ( text == NULL ) break;
|
|
|
|
if( Name1[0] == 'L' )
|
|
{
|
|
DrawLabelStruct * TextStruct =
|
|
new DrawLabelStruct(pos, CONV_FROM_UTF8(text));
|
|
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
|
|
TextStruct->m_Orient = orient;
|
|
Struct = (EDA_BaseStruct*)TextStruct;
|
|
}
|
|
else if( Name1[0] == 'G' )
|
|
{
|
|
DrawGlobalLabelStruct * TextStruct =
|
|
new DrawGlobalLabelStruct(pos, CONV_FROM_UTF8(text));
|
|
Struct = (EDA_BaseStruct*)TextStruct;
|
|
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
|
|
TextStruct->m_Orient = orient;
|
|
if( stricmp(Name2,SheetLabelType[NET_OUTPUT]) == 0 )
|
|
TextStruct->m_Shape = NET_OUTPUT;
|
|
if( stricmp(Name2,SheetLabelType[NET_BIDI]) == 0 )
|
|
TextStruct->m_Shape = NET_BIDI;
|
|
if( stricmp(Name2,SheetLabelType[NET_TRISTATE]) == 0 )
|
|
TextStruct->m_Shape = NET_TRISTATE;
|
|
if( stricmp(Name2,SheetLabelType[NET_UNSPECIFIED]) == 0 )
|
|
TextStruct->m_Shape = NET_UNSPECIFIED;
|
|
}
|
|
else
|
|
{
|
|
DrawTextStruct * TextStruct =
|
|
new DrawTextStruct(pos, CONV_FROM_UTF8(text));
|
|
TextStruct->m_Size.x = TextStruct->m_Size.y = size;
|
|
TextStruct->m_Orient = orient;
|
|
Struct = (EDA_BaseStruct*)TextStruct;
|
|
}
|
|
if (Struct )
|
|
{
|
|
Struct->Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = Struct;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
Failed = FALSE;
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file undef structdef at line %d, aborted"),
|
|
LineCount);
|
|
break;
|
|
}
|
|
|
|
if (Failed)
|
|
{
|
|
DisplayError(this, MsgDiag);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* EEDrawList was constructed in reverse order - reverse it back: */
|
|
Phead = NULL;
|
|
while (screen->EEDrawList)
|
|
{
|
|
Pnext = screen->EEDrawList;
|
|
screen->EEDrawList = screen->EEDrawList->Pnext;
|
|
Pnext->Pnext = Phead;
|
|
Phead = Pnext;
|
|
}
|
|
screen->EEDrawList = Phead;
|
|
|
|
fclose(f);
|
|
|
|
TestDanglingEnds(screen->EEDrawList, NULL);
|
|
|
|
return TRUE; /* Although it may be that file is only partially loaded. */
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************/
|
|
static int ReadPartDescr(wxWindow * frame, char *Line, FILE *f,
|
|
BASE_SCREEN * Window)
|
|
/*************************************************************/
|
|
|
|
/* Fonction utilisee par LoadEEFile().
|
|
Lit les lignes relatives a la description d'un composant en schema
|
|
*/
|
|
{
|
|
int ii, fieldref;
|
|
char Name1[256], Name2[256],
|
|
Char1[256], Char2[256], Char3[256];
|
|
EDA_SchComponentStruct *LibItemStruct;
|
|
int Failed = 0, newfmt = 0;
|
|
char * ptcar;
|
|
|
|
LibItemStruct = new EDA_SchComponentStruct();
|
|
LibItemStruct->m_Convert = 1;
|
|
|
|
if(Line[0] == '$')
|
|
{
|
|
newfmt = 1;
|
|
LineCount++;
|
|
if( fgets(Line, 256 - 1, f) == 0) return(TRUE);
|
|
}
|
|
|
|
/* Traitement de la 1ere ligne de description */
|
|
if( sscanf(&Line[1], "%s %s", Name1, Name2) != 2 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema Component descr error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
return(Failed);
|
|
}
|
|
|
|
if (strcmp(Name1, NULL_STRING) != 0)
|
|
{
|
|
for (ii = 0; ii < (int)strlen(Name1); ii++)
|
|
if (Name1[ii] == '~') Name1[ii] = ' ';
|
|
LibItemStruct->m_ChipName = CONV_FROM_UTF8(Name1);
|
|
if( !newfmt )
|
|
LibItemStruct->m_Field[VALUE].m_Text = CONV_FROM_UTF8(Name1);
|
|
}
|
|
else
|
|
{
|
|
LibItemStruct->m_ChipName.Empty();
|
|
LibItemStruct->m_Field[VALUE].m_Text.Empty();
|
|
LibItemStruct->m_Field[VALUE].m_Orient = TEXT_ORIENT_HORIZ;
|
|
LibItemStruct->m_Field[VALUE].m_Attributs = TEXT_NO_VISIBLE;
|
|
}
|
|
|
|
if (strcmp(Name2, NULL_STRING) != 0)
|
|
{
|
|
for (ii = 0; ii < (int)strlen(Name2); ii++)
|
|
if (Name2[ii] == '~') Name2[ii] = ' ';
|
|
if(!newfmt) LibItemStruct->m_Field[REFERENCE].m_Text = CONV_FROM_UTF8(Name2);
|
|
}
|
|
else
|
|
{
|
|
LibItemStruct->m_Field[REFERENCE].m_Attributs = TEXT_NO_VISIBLE;
|
|
}
|
|
|
|
/* Traitement des autres lignes de description */
|
|
/* Ces lignes commencent par:
|
|
"P " = position
|
|
"U " = Num Unit, et Conversion
|
|
"Fn" = Champs ( n = 0.. = numero de champ )
|
|
*/
|
|
|
|
/* Lecture des champs */
|
|
for(;;)
|
|
{
|
|
LineCount++;
|
|
if( fgets(Line, 256 - 1, f) == NULL ) return(TRUE);
|
|
if( (Line[0] != 'F' ) &&
|
|
(Line[0] != 'P' ) &&
|
|
(Line[0] != 'U' ) )
|
|
break;
|
|
|
|
if( Line[0] == 'U' ) /* Lecture num multi, conversion et time stamp */
|
|
{
|
|
sscanf(Line+1,"%d %d %lX",
|
|
&LibItemStruct->m_Multi, &LibItemStruct->m_Convert,
|
|
&LibItemStruct->m_TimeStamp);
|
|
}
|
|
|
|
if( Line[0] == 'P' )
|
|
{
|
|
sscanf(Line+1,"%d %d",
|
|
&LibItemStruct->m_Pos.x, &LibItemStruct->m_Pos.y);
|
|
}
|
|
|
|
if( Line[0] == 'F' )
|
|
{
|
|
char FieldUserName[1024];
|
|
int hjustify = GR_TEXT_HJUSTIFY_CENTER;
|
|
int vjustify = GR_TEXT_VJUSTIFY_CENTER;
|
|
|
|
FieldUserName[0] = 0;
|
|
|
|
sscanf(Line+1,"%d", &fieldref);
|
|
if( fieldref >= NUMBER_OF_FIELDS)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component Field number error at line %d, aborted"),
|
|
LineCount);
|
|
return(TRUE);
|
|
}
|
|
/* Lecture du champ */
|
|
ptcar = Line; while( *ptcar && (*ptcar != '"') ) ptcar++;
|
|
if( *ptcar != '"')
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file lib field F at line %d, aborted"),
|
|
LineCount);
|
|
return(TRUE);
|
|
}
|
|
|
|
for(ptcar++, ii = 0; ; ii++, ptcar++ )
|
|
{
|
|
Name1[ii] = *ptcar;
|
|
if( *ptcar == 0 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component field F at line %d, aborted"),
|
|
LineCount);
|
|
return(TRUE);
|
|
}
|
|
if( *ptcar == '"' )
|
|
{
|
|
Name1[ii] = 0; ptcar++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(LibItemStruct->m_Field[fieldref].m_Text.IsEmpty())
|
|
LibItemStruct->m_Field[fieldref].m_Text = CONV_FROM_UTF8(Name1);
|
|
|
|
/* Lecture des coordonnees */
|
|
if( (ii = sscanf(ptcar, "%s %d %d %d %X %s %s", Char1,
|
|
&LibItemStruct->m_Field[fieldref].m_Pos.x,
|
|
&LibItemStruct->m_Field[fieldref].m_Pos.y,
|
|
&LibItemStruct->m_Field[fieldref].m_Size.x,
|
|
&LibItemStruct->m_Field[fieldref].m_Attributs,
|
|
Char2, Char3) ) < 4 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component Field error line %d, aborted"),
|
|
LineCount);
|
|
DisplayError(frame, MsgDiag);
|
|
continue;
|
|
}
|
|
|
|
ReadDelimitedText(FieldUserName,ptcar, sizeof(FieldUserName) );
|
|
if( (LibItemStruct->m_Field[fieldref].m_Size.x == 0 ) || (ii == 4) )
|
|
LibItemStruct->m_Field[fieldref].m_Size.x = DEFAULT_SIZE_TEXT;
|
|
LibItemStruct->m_Field[fieldref].m_Orient = TEXT_ORIENT_HORIZ;
|
|
LibItemStruct->m_Field[fieldref].m_Size.y = LibItemStruct->m_Field[fieldref].m_Size.x;
|
|
if(Char1[0] == 'V')
|
|
LibItemStruct->m_Field[fieldref].m_Orient = TEXT_ORIENT_VERT;
|
|
if ( ii >= 7 )
|
|
{
|
|
if ( *Char2 == 'L' ) hjustify = GR_TEXT_HJUSTIFY_LEFT;
|
|
else if ( *Char2 == 'R' ) hjustify = GR_TEXT_HJUSTIFY_RIGHT;
|
|
if ( *Char3 == 'B' ) vjustify = GR_TEXT_VJUSTIFY_BOTTOM;
|
|
else if ( *Char3 == 'T' ) vjustify = GR_TEXT_VJUSTIFY_TOP;
|
|
LibItemStruct->m_Field[fieldref].m_HJustify = hjustify;
|
|
LibItemStruct->m_Field[fieldref].m_VJustify = vjustify;
|
|
}
|
|
|
|
if ( fieldref >= FIELD1 )
|
|
{
|
|
LibItemStruct->m_Field[fieldref].m_Name = CONV_FROM_UTF8(FieldUserName);
|
|
}
|
|
|
|
// 27 juin 2001: A Supprimer lorsque tous les schemas auront ete traites :
|
|
if ( fieldref == REFERENCE )
|
|
if (LibItemStruct->m_Field[fieldref].m_Text[0] == '#' )
|
|
LibItemStruct->m_Field[fieldref].m_Attributs |= TEXT_NO_VISIBLE;
|
|
}
|
|
}
|
|
|
|
|
|
/* Lecture multi et position du composant */
|
|
if( sscanf(Line, "%d %d %d",
|
|
&LibItemStruct->m_Multi,
|
|
&LibItemStruct->m_Pos.x, &LibItemStruct->m_Pos.y) != 3)
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component unit & pos error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
return(Failed);
|
|
}
|
|
|
|
/* Lecture de la matrice de miroir / rotation */
|
|
LineCount++;
|
|
if( (fgets(Line, 256 - 1, f) == NULL) ||
|
|
(sscanf(Line, "%d %d %d %d",
|
|
&LibItemStruct->m_Transform[0][0],
|
|
&LibItemStruct->m_Transform[0][1],
|
|
&LibItemStruct->m_Transform[1][0],
|
|
&LibItemStruct->m_Transform[1][1]) != 4) )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component orient error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
return(Failed);
|
|
}
|
|
|
|
if(newfmt)
|
|
{
|
|
LineCount++;
|
|
if( fgets(Line, 256 - 1, f) == NULL ) return(TRUE);
|
|
if( strnicmp("$End", Line,4) != 0 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT("Component End expected at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
}
|
|
|
|
if (!Failed)
|
|
{
|
|
LibItemStruct->Pnext = Window->EEDrawList;
|
|
Window->EEDrawList = (EDA_BaseStruct *) LibItemStruct;
|
|
}
|
|
|
|
return(Failed); /* Fin lecture 1 composant */
|
|
}
|
|
|
|
|
|
/*************************************************************************************/
|
|
static int ReadSheetDescr(wxWindow * frame, char *Line, FILE *f, BASE_SCREEN * Window)
|
|
/*************************************************************************************/
|
|
/* Fonction utilisee par LoadEEFile().
|
|
Lit les lignes relatives a la description d'une feuille de hierarchie
|
|
*/
|
|
{
|
|
int ii, fieldref, size;
|
|
char Name1[256], Char1[256], Char2[256];
|
|
DrawSheetStruct *SheetStruct;
|
|
DrawSheetLabelStruct *SheetLabelStruct, *OldSheetLabel = NULL;
|
|
int Failed = FALSE;
|
|
char * ptcar;
|
|
|
|
SheetStruct = new DrawSheetStruct();
|
|
SheetStruct->m_TimeStamp = GetTimeStamp();
|
|
SheetStruct->m_Parent = Window;
|
|
|
|
if(Line[0] == '$') /* Ligne doit etre "$Sheet" */
|
|
{
|
|
LineCount++;
|
|
if( fgets(Line, 256 - 1, f) == 0)
|
|
{
|
|
MsgDiag.Printf( wxT("Read File Errror") ); return(TRUE);
|
|
}
|
|
}
|
|
|
|
/* Next line: must be "S xx yy nn mm" with xx, yy = sheet position
|
|
( upper left corner ) et nn,mm = sheet size */
|
|
if( (sscanf(&Line[1], "%d %d %d %d",
|
|
&SheetStruct->m_Pos.x, &SheetStruct->m_Pos.y,
|
|
&SheetStruct->m_Size.x, &SheetStruct->m_Size.y) != 4) ||
|
|
(Line[0] != 'S' ) )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" ** EESchema file sheet struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
return(Failed);
|
|
}
|
|
|
|
/* Lecture des champs */
|
|
for(;;) /* Analyse des lignes "Fn "texte" .." */
|
|
{
|
|
LineCount++;
|
|
if( fgets(Line, 256 - 1, f) == NULL ) return(TRUE);
|
|
if( Line[0] != 'F' ) break;
|
|
sscanf(Line+1,"%d", &fieldref);
|
|
/* Lecture du champ :
|
|
si fieldref >= 2 : Fn "texte" t s posx posy
|
|
sinon F0 "texte" pour sheetname
|
|
et F1 "texte" pour filename */
|
|
|
|
ptcar = Line; while( *ptcar && (*ptcar != '"') ) ptcar++;
|
|
if( *ptcar != '"')
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" ** EESchema file sheet label F%d at line %d, aborted"),
|
|
fieldref, LineCount);
|
|
return(TRUE);
|
|
}
|
|
|
|
for(ptcar++, ii = 0; ; ii++, ptcar++ )
|
|
{
|
|
Name1[ii] = *ptcar;
|
|
if( *ptcar == 0 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" ** EESchema file sheet field F at line %d, aborted"), LineCount);
|
|
return(TRUE);
|
|
}
|
|
if( *ptcar == '"' )
|
|
{
|
|
Name1[ii] = 0; ptcar++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( ( fieldref == 0 ) || ( fieldref == 1 ) )
|
|
{
|
|
if( sscanf(ptcar, "%d", &size) != 1 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" ** EESchema file sheet Label Caract error line %d, aborted"),LineCount);
|
|
DisplayError(frame, MsgDiag);
|
|
}
|
|
if(size == 0) size = DEFAULT_SIZE_TEXT;
|
|
if ( fieldref == 0 )
|
|
{
|
|
SheetStruct->m_SheetName = CONV_FROM_UTF8(Name1);
|
|
SheetStruct->m_SheetNameSize = size;
|
|
}
|
|
else
|
|
{
|
|
SheetStruct->m_FileName = CONV_FROM_UTF8(Name1);
|
|
SheetStruct->m_FileNameSize = size;
|
|
}
|
|
}
|
|
|
|
if( fieldref > 1 )
|
|
{
|
|
SheetLabelStruct = new DrawSheetLabelStruct(SheetStruct,
|
|
wxPoint(0,0), CONV_FROM_UTF8(Name1) );
|
|
if( SheetStruct->m_Label == NULL )
|
|
OldSheetLabel = SheetStruct->m_Label = SheetLabelStruct;
|
|
else OldSheetLabel->Pnext = (EDA_BaseStruct*)SheetLabelStruct;
|
|
OldSheetLabel = SheetLabelStruct;
|
|
|
|
/* Lecture des coordonnees */
|
|
if( sscanf(ptcar, "%s %s %d %d %d", Char1, Char2,
|
|
&SheetLabelStruct->m_Pos.x, &SheetLabelStruct->m_Pos.y,
|
|
&size) != 5 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" ** EESchema file Sheet Label Caract error line %d, aborted"),LineCount);
|
|
DisplayError(frame, MsgDiag);
|
|
continue;
|
|
}
|
|
|
|
if(size == 0) size = DEFAULT_SIZE_TEXT;
|
|
SheetLabelStruct->m_Size.x = SheetLabelStruct->m_Size.y = size;
|
|
/* Mise a jour des cadrage et type */
|
|
switch( Char1[0])
|
|
{
|
|
case 'I': SheetLabelStruct->m_Shape = NET_INPUT; break;
|
|
case 'O': SheetLabelStruct->m_Shape = NET_OUTPUT; break;
|
|
case 'B': SheetLabelStruct->m_Shape = NET_BIDI; break;
|
|
case 'T': SheetLabelStruct->m_Shape = NET_TRISTATE; break;
|
|
case 'U': SheetLabelStruct->m_Shape = NET_UNSPECIFIED; break;
|
|
}
|
|
if( Char2[0] == 'R' ) SheetLabelStruct->m_Edge = 1;
|
|
}
|
|
}
|
|
|
|
if( strnicmp("$End", Line,4) != 0 )
|
|
{
|
|
MsgDiag.Printf(
|
|
wxT(" **EESchema file end_sheet struct error at line %d, aborted"),
|
|
LineCount);
|
|
Failed = TRUE;
|
|
}
|
|
|
|
if (!Failed)
|
|
{
|
|
SheetStruct->Pnext = Window->EEDrawList;
|
|
Window->EEDrawList = (EDA_BaseStruct *) SheetStruct;
|
|
}
|
|
|
|
return(Failed); /* Fin lecture 1 composant */
|
|
}
|
|
|
|
|
|
/******************************************************************/
|
|
static int ReadSchemaDescr(wxWindow * frame, char *Line, FILE *f, BASE_SCREEN * Window)
|
|
/******************************************************************/
|
|
/* Analyse de l'entete du schema ( dims feuille, cartouche..)
|
|
*/
|
|
{
|
|
char Text[256], buf[1024];
|
|
int ii;
|
|
Ki_PageDescr * wsheet = &g_Sheet_A4;
|
|
static Ki_PageDescr * SheetFormatList[] = {
|
|
&g_Sheet_A4, &g_Sheet_A3, &g_Sheet_A2, &g_Sheet_A1, &g_Sheet_A0,
|
|
&g_Sheet_A, &g_Sheet_B, &g_Sheet_C, &g_Sheet_D, &g_Sheet_E,
|
|
&g_Sheet_user, NULL};
|
|
wxSize PageSize;
|
|
|
|
sscanf(Line, "%s %s %d %d", Text, Text, & PageSize.x, & PageSize.y);
|
|
/* Recherche de la descr correspondante: */
|
|
wxString pagename = CONV_FROM_UTF8(Text);
|
|
for(ii = 0; SheetFormatList[ii] != NULL; ii++ )
|
|
{
|
|
wsheet = SheetFormatList[ii];
|
|
if( wsheet->m_Name.CmpNoCase(pagename) == 0 )
|
|
{ /* Descr found ! */
|
|
if ( wsheet == & g_Sheet_user ) // Get the user page size and make it the default
|
|
{
|
|
g_Sheet_user.m_Size = PageSize;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( SheetFormatList[ii] == NULL )
|
|
{
|
|
/* Erreur ici: descr non trouvee */
|
|
MsgDiag.Printf(
|
|
wxT("EESchema file Dims Caract error line %d, aborted"),LineCount);
|
|
DisplayError(frame, MsgDiag);
|
|
}
|
|
|
|
/* Ajuste ecran */
|
|
Window->m_CurrentSheet = wsheet;
|
|
|
|
/* Recheche suite et fin de descr */
|
|
for( ;; )
|
|
{
|
|
if( GetLine(f, Line, &LineCount, 1024 ) == NULL ) return(TRUE);
|
|
if( strnicmp(Line,"$End",4) == 0 ) break;
|
|
|
|
if( strnicmp(Line,"Sheet",2) == 0 )
|
|
sscanf( Line+5," %d %d",
|
|
&Window->m_SheetNumber,&Window->m_NumberOfSheet);
|
|
|
|
if( strnicmp(Line,"Title",2) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Title = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Date",2) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Date = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Rev",2) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Revision = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Comp",4) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Company = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Comment1",8) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Commentaire1 = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Comment2",8) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Commentaire2 = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Comment3",8) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Commentaire3 = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
|
|
if( strnicmp(Line,"Comment4",8) == 0 )
|
|
{
|
|
ReadDelimitedText( buf, Line, 256);
|
|
Window->m_Commentaire4 = CONV_FROM_UTF8(buf);
|
|
continue;
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/***********************************/
|
|
static void LoadLayers(FILE *f, int * linecnt)
|
|
/***********************************/
|
|
/* Load the Layer Struct from a file
|
|
*/
|
|
{
|
|
int cnt = 0, Number;
|
|
char Line[1024];
|
|
//int Mode,Color,Layer;
|
|
char Name[256];
|
|
|
|
GetLine(f, Line, NULL, sizeof(Line) ); /* read line */
|
|
(*linecnt)++;
|
|
sscanf(Line,"%s %d %d",Name,&Number,&g_LayerDescr.CurrentLayer);
|
|
if( strcmp(Name,"EELAYER") !=0 )
|
|
{
|
|
/* error : init par defaut */
|
|
Number = MAX_LAYER;
|
|
}
|
|
if ( Number <= 0 ) Number = MAX_LAYER;
|
|
if ( Number > MAX_LAYER ) Number = MAX_LAYER;
|
|
|
|
g_LayerDescr.NumberOfLayers=Number;
|
|
|
|
while( GetLine(f, Line, NULL, sizeof(Line)) )
|
|
{
|
|
(*linecnt)++;
|
|
if( strnicmp(Line,"EELAYER END",11) == 0 ) break;
|
|
cnt++;
|
|
}
|
|
}
|
|
|
|
|