kicad/cvpcb/loadcmp.cpp

140 lines
4.3 KiB
C++

/***************************************************/
/* Localisation des elements pointes par la souris */
/***************************************************/
#include "fctsys.h"
#include "wxstruct.h"
#include "common.h"
#include "confirm.h"
#include "kicad_string.h"
#include "gestfich.h"
#include "macros.h"
#include "appl_wxstruct.h"
#include "cvpcb.h"
#include "protos.h"
#include "cvstruct.h"
/*****************************************************************
*
* Analyse les LIBRAIRIES pour trouver le module demande
* Si ce module est trouve, le copie en memoire, et le
* chaine en fin de liste des modules
* - Entree:
* name_cmp = nom du module
* - Retour:
* Pointeur sur le nouveau module.
*
*****************************************************************/
MODULE* WinEDA_DisplayFrame::Get_Module( const wxString& CmpName )
{
int LineNum, Found = 0;
unsigned ii;
char Line[1024], Name[255];
wxString tmp, msg;
wxFileName fn;
MODULE* Module = NULL;
WinEDA_CvpcbFrame* parent = ( WinEDA_CvpcbFrame* ) GetParent();
for( ii = 0; ii < parent->m_ModuleLibNames.GetCount(); ii++ )
{
/* Calcul du nom complet de la librairie */
fn = parent->m_ModuleLibNames[ii];
fn.SetExt( ModuleFileExtension );
tmp = wxGetApp().FindLibraryPath( fn );
if( !tmp )
{
msg.Printf( _( "PCB foot print library file <%s> could not be \
found in the default search paths." ),
fn.GetFullName().c_str() );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this );
continue;
}
FILE* file = wxFopen( tmp, wxT( "rt" ) );
if( file == NULL )
{
msg.Printf( _( "Could not open PCB foot print library file <%s>." ),
tmp.c_str() );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this );
continue;
}
/* lecture entete chaine definie par ENTETE_LIBRAIRIE */
LineNum = 0;
GetLine( file, Line, &LineNum );
StrPurge( Line );
if( strnicmp( Line, ENTETE_LIBRAIRIE, L_ENTETE_LIB ) != 0 )
{
msg.Printf( _( "<%s> is not a valid Kicad PCB foot print library." ),
tmp.c_str() );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this );
fclose( file );
return NULL;
}
/* Lecture de la liste des composants de la librairie */
Found = 0;
while( !Found && GetLine( file, Line, &LineNum ) )
{
if( strncmp( Line, "$MODULE", 6 ) == 0 )
break;
if( strnicmp( Line, "$INDEX", 6 ) == 0 )
{
while( GetLine( file, Line, &LineNum ) )
{
if( strnicmp( Line, "$EndINDEX", 9 ) == 0 )
break;
StrPurge( Line );
if( stricmp( Line, CONV_TO_UTF8( CmpName ) ) == 0 )
{
Found = 1;
break; /* Trouve! */
}
}
}
}
/* Lecture de la librairie */
while( Found && GetLine( file, Line, &LineNum ) )
{
if( Line[0] != '$' )
continue;
if( Line[1] != 'M' )
continue;
if( strnicmp( Line, "$MODULE", 7 ) != 0 )
continue;
/* Lecture du nom du composant */
sscanf( Line + 7, " %s", Name );
if( stricmp( Name, CONV_TO_UTF8( CmpName ) ) == 0 ) /* composant localise */
{
Module = new MODULE( GetBoard() );
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
Module->ReadDescr( file, &LineNum );
SetLocaleTo_Default(); // revert to the current locale
Module->SetPosition( wxPoint( 0, 0 ) );
fclose( file );
return Module;
}
}
fclose( file );
file = NULL;
}
msg.Printf( _( "Module %s not found" ), CmpName.GetData() );
DisplayError( this, msg );
return NULL;
}