/****************************************/ /* 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++; } }