kicad/cvpcb/listlib.cpp

172 lines
4.9 KiB
C++

/**
* @file listlib.cpp
*/
/*
* Functions to read footprint libraries and fill m_footprints by availlable footprints names
* and their documentation (comments and keywords)
*/
#include "fctsys.h"
#include "wxstruct.h"
#include "common.h"
#include "kicad_string.h"
#include "macros.h"
#include "appl_wxstruct.h"
#include "cvpcb.h"
#include "cvpcb_mainframe.h"
#include "richio.h"
#include "filter_reader.h"
#include "dialog_load_error.h"
/*
* Read the list of libraries (*.mod files) and generate a m_footprints of modules.
* for each module are stored
* the module name
* documentation string
* associated keywords
* Module description format:
* $MODULE c64acmd First line of module description
* Li c64acmd DIN connector Library reference
* Cd Europe 96 AC male vertical documentation string
* Kw PAD_CONN DIN associated keywords
* ...... other data (pads, outlines ..)
* $Endmodule
*
*/
bool CVPCB_MAINFRAME::LoadFootprintFiles( )
{
FILE* file;
wxFileName filename;
wxString libname;
wxString files_not_found;
wxString files_invalid;
/* Check if footprint m_footprints is not empty */
if( !m_footprints.empty() )
m_footprints.clear();
/* Check if there are footprint libraries in project file */
if( m_ModuleLibNames.GetCount() == 0 )
{
wxMessageBox( _( "No PCB footprint libraries are listed in the current project file." ),
_( "Project File Error" ), wxOK | wxICON_ERROR );
return false;
}
/* Parse Libraries Listed */
for( unsigned ii = 0; ii < m_ModuleLibNames.GetCount(); ii++ )
{
filename = m_ModuleLibNames[ii];
filename.SetExt( ModuleFileExtension );
libname = wxGetApp().FindLibraryPath( filename );
if( libname.IsEmpty() )
{
files_not_found << filename.GetFullName() << wxT("\n");
continue;
}
/* Open library file */
file = wxFopen( libname, wxT( "rt" ) );
if( file == NULL )
{
files_invalid << libname << _(" (file cannot be opened)") << wxT("\n");
continue;
}
FILE_LINE_READER fileReader( file, libname );
FILTER_READER reader( fileReader );
/* Read header. */
reader.ReadLine();
char * line = reader.Line();
StrPurge( line );
if( strnicmp( line, ENTETE_LIBRAIRIE, L_ENTETE_LIB ) != 0 )
{
wxString msg;
msg.Printf( _( "<%s> is not a valid Kicad PCB footprint library." ),
GetChars( libname ) );
files_invalid << msg << wxT("\n");
continue;
}
// Read library
bool end = false;
while( !end && reader.ReadLine() )
{
line = reader.Line();
StrPurge( line );
if( strnicmp( line, "$EndLIBRARY", 11 ) == 0 )
{
end = true;
break;
}
if( strnicmp( line, "$MODULE", 7 ) == 0 )
{
line += 7;
FOOTPRINT* ItemLib = new FOOTPRINT();
ItemLib->m_Module = CONV_FROM_UTF8( StrPurge( line ) );
ItemLib->m_LibName = libname;
m_footprints.push_back( ItemLib );
while( reader.ReadLine() )
{
line = reader.Line();
StrPurge( line );
if( strnicmp( line, "$EndMODULE", 10 ) == 0 )
break;
int id = ((line[0] & 0xFF) << 8) + (line[1] & 0xFF);
switch( id )
{
/* KeyWords */
case (('K'<<8) + 'w'):
ItemLib->m_KeyWord = CONV_FROM_UTF8( StrPurge( line + 3 ) );
break;
/* Doc */
case (('C'<<8) + 'd'):
ItemLib->m_Doc = CONV_FROM_UTF8( StrPurge( line + 3 ) );
break;
}
}
}
}
if( !end )
{
files_invalid << libname << _(" (Unexpected end of file)") << wxT("\n");
}
}
m_footprints.sort();
/* Display error messages, if any */
if( !files_not_found.IsEmpty() || !files_invalid.IsEmpty() )
{
DIALOG_LOAD_ERROR dialog(NULL);
if( !files_not_found.IsEmpty() )
{
wxString message = _("Some files could not be found!");
dialog.MessageSet(message);
dialog.ListSet(files_not_found);
}
/* Display if there are invalid files */
if( !files_invalid.IsEmpty() )
{
dialog.MessageSet( _("Some files are invalid!"));
dialog.ListSet(files_invalid);
}
dialog.ShowModal();
}
return true;
}