kicad/pcbnew/librairi.cpp

783 lines
21 KiB
C++
Raw Normal View History

/**
* @file librairi.cpp
* @brief Manage module (footprint) libraries.
*/
2007-05-06 16:03:28 +00:00
#include "fctsys.h"
#include "appl_wxstruct.h"
#include "class_drawpanel.h"
#include "confirm.h"
#include "kicad_string.h"
#include "gestfich.h"
2009-07-30 11:04:07 +00:00
#include "wxPcbStruct.h"
2010-11-18 21:16:28 +00:00
#include "dialog_helpers.h"
#include "richio.h"
#include "filter_reader.h"
#include "pcbcommon.h"
#include "macros.h"
#include "class_board.h"
#include "class_module.h"
#include "pcbnew.h"
#include "class_footprint_library.h"
#include "module_editor_frame.h"
2007-05-06 16:03:28 +00:00
/*
* Module library header format:
* Array LIBRARY HEADER-datetime
* $INDEX
* List of modules names (1 name per line)
* $EndIndex
* List of descriptions of Modules
* $EndLIBRARY
2007-10-30 21:30:58 +00:00
*/
#define BACKUP_EXT wxT( "bak" )
#define FILETMP_EXT wxT( "$$$" )
#define EXPORT_IMPORT_LASTPATH_KEY wxT( "import_last_path" )
2007-05-06 16:03:28 +00:00
const wxString ModExportFileExtension( wxT( "emp" ) );
static const wxString ModExportFileWildcard( _( "KiCad foot print export files (*.emp)|*.emp" ) );
static const wxString ModImportFileWildcard( _( "GPcb foot print files (*)|*" ) );
MODULE* FOOTPRINT_EDIT_FRAME::Import_Module()
2007-05-06 16:03:28 +00:00
{
char* Line;
FILE* file;
MODULE* module = NULL;
bool Footprint_Is_GPCB_Format = false;
wxString LastOpenedPathForLoading;
2011-12-16 20:12:49 +00:00
wxConfig* Config = wxGetApp().GetSettings();
2007-10-30 21:30:58 +00:00
2008-03-12 11:49:16 +00:00
if( Config )
Config->Read( EXPORT_IMPORT_LASTPATH_KEY, &LastOpenedPathForLoading );
wxString importWildCard = ModExportFileWildcard + wxT("|") + ModImportFileWildcard;
wxFileDialog dlg( this, _( "Import Footprint Module" ),
LastOpenedPathForLoading, wxEmptyString,
importWildCard, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
if( dlg.ShowModal() == wxID_CANCEL )
2007-10-30 21:30:58 +00:00
return NULL;
file = wxFopen( dlg.GetPath(), wxT( "rt" ) );
if( file == NULL )
2007-10-30 21:30:58 +00:00
{
wxString msg;
msg.Printf( _( "File <%s> not found" ), GetChars( dlg.GetPath() ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return NULL;
}
FILE_LINE_READER fileReader( file, dlg.GetPath() );
FILTER_READER reader( fileReader );
if( Config ) // Save file path
{
LastOpenedPathForLoading = wxPathOnly( dlg.GetPath() );
2008-03-12 11:49:16 +00:00
Config->Write( EXPORT_IMPORT_LASTPATH_KEY, LastOpenedPathForLoading );
}
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
2008-03-12 11:49:16 +00:00
/* Read header and test file type */
reader.ReadLine();
Line = reader.Line();
if( strnicmp( Line, FOOTPRINT_LIBRARY_HEADER, FOOTPRINT_LIBRARY_HEADER_CNT ) != 0 )
2007-10-30 21:30:58 +00:00
{
if( strnicmp( Line, "Element", 7 ) == 0 )
{
Footprint_Is_GPCB_Format = true;
}
else
{
DisplayError( this, _( "Not a module file" ) );
return NULL;
}
2007-10-30 21:30:58 +00:00
}
2008-03-12 11:49:16 +00:00
/* Read file: Search the description starting line (skip lib header)*/
if( !Footprint_Is_GPCB_Format )
{
while( reader.ReadLine() )
{
if( strnicmp( Line, "$MODULE", 7 ) == 0 )
break;
}
}
2007-10-30 21:30:58 +00:00
module = new MODULE( GetBoard() );
2007-10-30 21:30:58 +00:00
if( Footprint_Is_GPCB_Format )
{
module->Read_GPCB_Descr( dlg.GetPath() );
}
else
{
module->ReadDescr( &reader );
}
SetLocaleTo_Default(); // revert to the current locale
2007-10-30 21:30:58 +00:00
2008-03-12 11:49:16 +00:00
/* Insert footprint in list*/
GetBoard()->Add( module );
2007-10-30 21:30:58 +00:00
2008-03-12 11:49:16 +00:00
/* Display info : */
module->DisplayInfo( this );
PlaceModule( module, NULL );
GetBoard()->m_Status_Pcb = 0;
GetBoard()->BuildListOfNets();
2007-10-30 21:30:58 +00:00
return module;
2007-05-06 16:03:28 +00:00
}
2007-10-30 21:30:58 +00:00
void FOOTPRINT_EDIT_FRAME::Export_Module( MODULE* aModule, bool aCreateSysLib )
2007-05-06 16:03:28 +00:00
{
wxFileName fn;
FILE* file;
wxString msg, path, title, wildcard;
2011-12-16 20:12:49 +00:00
wxConfig* Config = wxGetApp().GetSettings();
2007-10-30 21:30:58 +00:00
2010-12-29 17:47:32 +00:00
if( aModule == NULL )
2007-10-30 21:30:58 +00:00
return;
2010-12-29 17:47:32 +00:00
fn.SetName( aModule->m_LibRef );
fn.SetExt( aCreateSysLib ? ModuleFileExtension : ModExportFileExtension );
2007-10-30 21:30:58 +00:00
2010-12-29 17:47:32 +00:00
if( aCreateSysLib )
path = wxGetApp().ReturnLastVisitedLibraryPath();
else if( Config )
2008-03-12 11:49:16 +00:00
Config->Read( EXPORT_IMPORT_LASTPATH_KEY, &path );
fn.SetPath( path );
2010-12-29 17:47:32 +00:00
title = aCreateSysLib ? _( "Create New Library" ) : _( "Export Module" );
wildcard = aCreateSysLib ? ModuleFileWildcard : ModExportFileWildcard;
wxFileDialog dlg( this, msg, fn.GetPath(), fn.GetFullName(), wildcard,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( dlg.ShowModal() == wxID_CANCEL )
2007-10-30 21:30:58 +00:00
return;
fn = dlg.GetPath();
wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() );
2007-10-30 21:30:58 +00:00
if( ( file = wxFopen( fn.GetFullPath(), wxT( "wt" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return;
}
2010-12-29 17:47:32 +00:00
if( !aCreateSysLib && Config ) // Save file path
{
Config->Write( EXPORT_IMPORT_LASTPATH_KEY, fn.GetPath() );
}
2008-03-12 11:49:16 +00:00
// Switch the locale to standard C (needed to read/write floating point numbers like 1.3)
SetLocaleTo_C_standard();
FOOTPRINT_LIBRARY libexport( file );
libexport.WriteHeader();
libexport.m_List.Add(aModule->m_LibRef);
libexport.WriteSectionIndex();
2007-10-30 21:30:58 +00:00
GetBoard()->m_Modules->Save( file );
2007-10-30 21:30:58 +00:00
libexport.WriteEndOfFile();
fclose( file );
2011-01-16 05:11:17 +00:00
SetLocaleTo_Default(); // revert to the current locale
msg.Printf( _( "Module exported in file <%s>" ), GetChars( fn.GetFullPath() ) );
DisplayInfoMessage( this, msg );
2007-05-06 16:03:28 +00:00
}
2007-10-30 21:30:58 +00:00
void FOOTPRINT_EDIT_FRAME::Delete_Module_In_Library( const wxString& aLibname )
2007-05-06 16:03:28 +00:00
{
wxFileName newFileName;
wxFileName oldFileName;
int LineNum = 0;
char Line[1024], Name[256];
FILE* out_file, * lib_module;
wxString CmpName, msg;
2007-10-30 21:30:58 +00:00
CmpName = Select_1_Module_From_List( this, aLibname, wxEmptyString, wxEmptyString );
2007-10-30 21:30:58 +00:00
if( CmpName == wxEmptyString )
return;
/* Confirmation */
msg.Printf( _( "Ok to delete module %s in library %s" ),
GetChars( CmpName ), GetChars( aLibname ) );
2011-01-16 05:11:17 +00:00
2007-10-30 21:30:58 +00:00
if( !IsOK( this, msg ) )
return;
oldFileName = aLibname;
2007-10-30 21:30:58 +00:00
if( ( lib_module = wxFopen( oldFileName.GetFullPath(), wxT( "rt" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
wxString msg;
msg.Printf( _( "Library <%s> not found" ), GetChars(oldFileName.GetFullPath() ) );
DisplayError( NULL, msg );
2007-10-30 21:30:58 +00:00
return;
}
FOOTPRINT_LIBRARY input_lib( lib_module );
2007-10-30 21:30:58 +00:00
/* Read header. */
if( ! input_lib.IsLibrary() )
2007-10-30 21:30:58 +00:00
{
fclose( lib_module );
wxString msg;
msg.Printf( _( "<%s> is not a valid footprint library file" ),
GetChars( oldFileName.GetFullPath() ) );
DisplayError( NULL, msg );
2007-10-30 21:30:58 +00:00
return;
}
/* Read module names. */
input_lib.RebuildIndex();
bool found = input_lib.FindInList( CmpName );
if( !found )
2007-10-30 21:30:58 +00:00
{
fclose( lib_module );
msg.Printf( _( "Module [%s] not found" ), GetChars( CmpName ) );
DisplayError( NULL, msg );
2007-10-30 21:30:58 +00:00
return;
}
/* Create new library. */
newFileName = oldFileName;
newFileName.SetExt( FILETMP_EXT );
if( ( out_file = wxFopen( newFileName.GetFullPath(), wxT( "wt" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
fclose( lib_module );
msg.Printf( _( "Unable to create %s" ), GetChars( newFileName.GetFullPath() ) );
DisplayError( NULL, msg );
2007-10-30 21:30:58 +00:00
return;
}
wxBeginBusyCursor();
FOOTPRINT_LIBRARY output_lib( out_file );
output_lib.m_List = input_lib.m_List;
2007-10-30 21:30:58 +00:00
output_lib.WriteHeader();
output_lib.RemoveFromList( CmpName );
output_lib.SortList();
output_lib.WriteSectionIndex();
2007-10-30 21:30:58 +00:00
/* Copy modules. */
rewind( lib_module );
LineNum = input_lib.m_LineNum;
bool copylines = false;
2007-10-30 21:30:58 +00:00
while( GetLine( lib_module, Line, &LineNum ) )
{
StrPurge( Line );
2007-10-30 21:30:58 +00:00
if( strnicmp( Line, "$MODULE", 7 ) == 0 )
{
copylines = true;
2007-10-30 21:30:58 +00:00
sscanf( Line + 7, " %s", Name );
msg = FROM_UTF8( Name );
2007-10-30 21:30:58 +00:00
if( msg.CmpNoCase( CmpName ) == 0 )
{
/* Delete old module (i.e. do not copy description to out_file). */
2007-10-30 21:30:58 +00:00
while( GetLine( lib_module, Line, &LineNum ) )
{
if( strnicmp( Line, "$EndMODULE", 9 ) == 0 )
break;
}
continue;
}
}
if( copylines )
fprintf( out_file, "%s\n", Line );
2007-10-30 21:30:58 +00:00
}
fclose( lib_module );
fclose( out_file );
2007-10-30 21:30:58 +00:00
wxEndBusyCursor();
/* The old library file is renamed .bak */
wxFileName backupFileName = oldFileName;
backupFileName.SetExt( BACKUP_EXT );
2007-10-30 21:30:58 +00:00
if( backupFileName.FileExists() )
wxRemoveFile( backupFileName.GetFullPath() );
2007-10-30 21:30:58 +00:00
if( !wxRenameFile( oldFileName.GetFullPath(), backupFileName.GetFullPath() ) )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Could not create library back up file <%s>." ),
GetChars( backupFileName.GetFullName() ) );
DisplayError( this, msg );
2007-10-30 21:30:58 +00:00
return;
}
/* The temporary file is renamed as the previous library. */
if( !wxRenameFile( newFileName.GetFullPath(), oldFileName.GetFullPath() ) )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _("Could not create temporary library file <%s>."),
GetChars( oldFileName.GetFullName() ) );
DisplayError( this, msg );
2007-10-30 21:30:58 +00:00
return;
}
msg.Printf( _( "Component %s deleted in library %s" ), GetChars( CmpName ),
GetChars( oldFileName.GetFullPath() ) );
SetStatusText( msg );
2007-05-06 16:03:28 +00:00
}
/* Save modules in a library:
* param aNewModulesOnly:
* true : save modules not already existing in this lib
* false: save all modules
*/
void PCB_EDIT_FRAME::ArchiveModulesOnBoard( const wxString& aLibName, bool aNewModulesOnly )
2007-05-06 16:03:28 +00:00
{
wxString fileName = aLibName;
wxString path;
2007-10-30 21:30:58 +00:00
if( GetBoard()->m_Modules == NULL )
2007-10-30 21:30:58 +00:00
{
DisplayInfoMessage( this, _( "No modules to archive!" ) );
2007-10-30 21:30:58 +00:00
return;
}
path = wxGetApp().ReturnLastVisitedLibraryPath();
if( aLibName.IsEmpty() )
2007-10-30 21:30:58 +00:00
{
wxFileDialog dlg( this, _( "Library" ), path,
wxEmptyString, ModuleFileWildcard,
wxFD_SAVE );
2007-10-30 21:30:58 +00:00
if( dlg.ShowModal() == wxID_CANCEL )
2007-10-30 21:30:58 +00:00
return;
fileName = dlg.GetPath();
2007-10-30 21:30:58 +00:00
}
wxFileName fn( fileName );
wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() );
bool file_exists = wxFileExists( fileName );
if( !aNewModulesOnly && file_exists )
2007-10-30 21:30:58 +00:00
{
wxString msg;
msg.Printf( _( "File %s exists, OK to replace ?" ), GetChars( fileName ) );
2007-10-30 21:30:58 +00:00
if( !IsOK( this, msg ) )
return;
}
m_canvas->SetAbortRequest( false );
2007-10-30 21:30:58 +00:00
// Create a new, empty library if no old lib, or if archive all modules
if( !aNewModulesOnly || !file_exists )
2007-10-30 21:30:58 +00:00
{
FILE* lib_module;
if( ( lib_module = wxFopen( fileName, wxT( "w+t" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
wxString msg;
msg.Printf( _( "Unable to create <%s>" ), GetChars(fileName) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return;
}
FOOTPRINT_LIBRARY new_lib( lib_module );
new_lib.WriteHeader();
new_lib.WriteSectionIndex();
new_lib.WriteEndOfFile();
2007-10-30 21:30:58 +00:00
fclose( lib_module );
}
MODULE* module = (MODULE*) GetBoard()->m_Modules;
for( int ii = 1; module != NULL; ii++, module = module->Next() )
2007-10-30 21:30:58 +00:00
{
// Save footprints in default orientation (0.0) and default layer (FRONT layer)
int orient = module->GetOrientation();
if ( orient != 0 )
module->SetOrientation( 0 );
int layer = module->GetLayer();
if(layer != LAYER_N_FRONT )
module->Flip( module->m_Pos );
bool success = Save_Module_In_Library( fileName, module,
aNewModulesOnly ? false : true, false );
// Restore previous orientation and/or side
if(layer != module->GetLayer() )
module->Flip( module->m_Pos );
if ( orient != 0 )
module->SetOrientation( orient );
if( !success )
2007-10-30 21:30:58 +00:00
break;
/* Check for request to stop backup (ESCAPE key actuated) */
if( m_canvas->GetAbortRequest() )
2007-10-30 21:30:58 +00:00
break;
}
2007-05-06 16:03:28 +00:00
}
bool PCB_BASE_FRAME::Save_Module_In_Library( const wxString& aLibName,
MODULE* aModule,
bool aOverwrite,
bool aDisplayDialog )
2007-05-06 16:03:28 +00:00
{
wxFileName oldFileName;
wxFileName newFileName;
int LineNum = 0, tmp;
char Name[256], Line[1024];
wxString Name_Cmp;
wxString msg;
FILE* lib_module, * dest;
2007-10-30 21:30:58 +00:00
if( aModule == NULL )
return false;
aModule->DisplayInfo( this );
2007-10-30 21:30:58 +00:00
newFileName = aLibName;
if( !newFileName.FileExists( aLibName ) )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Library <%s> not found." ), GetChars( aLibName ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return false;
2007-10-30 21:30:58 +00:00
}
if( !IsWritable( newFileName ) )
return false;
/* Ask for the footprint name in lib */
Name_Cmp = aModule->m_LibRef;
2007-10-30 21:30:58 +00:00
if( aDisplayDialog )
2007-10-30 21:30:58 +00:00
{
2010-07-20 18:11:34 +00:00
wxTextEntryDialog dlg( this, _( "Name:" ), _( "Save module" ), Name_Cmp );
2010-07-20 18:11:34 +00:00
if( dlg.ShowModal() != wxID_OK )
return false; // canceled by user
Name_Cmp = dlg.GetValue();
Name_Cmp.Trim( true );
2010-07-20 18:11:34 +00:00
Name_Cmp.Trim( false );
2010-07-20 18:11:34 +00:00
if( Name_Cmp.IsEmpty() )
return false;
aModule->m_LibRef = Name_Cmp;
}
// Ensure this footprint has a libname
if( Name_Cmp.IsEmpty() )
{
Name_Cmp = wxT("noname");
aModule->m_LibRef = Name_Cmp;
2007-10-30 21:30:58 +00:00
}
if( ( lib_module = wxFopen( aLibName, wxT( "rt" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Unable to open <%s>" ), GetChars( aLibName ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return false;
2007-10-30 21:30:58 +00:00
}
/* Read library file */
FOOTPRINT_LIBRARY input_lib( lib_module );
if( ! input_lib.IsLibrary() )
2007-10-30 21:30:58 +00:00
{
fclose( lib_module );
msg.Printf( _( "File <%s> is not an Eeschema library" ), GetChars( aLibName ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return false;
2007-10-30 21:30:58 +00:00
}
/* Read footprints in lib: - search for an existing footprint */
input_lib.RebuildIndex();
bool module_exists = input_lib.FindInList( Name_Cmp );
if( module_exists )
2007-10-30 21:30:58 +00:00
{
// an existing footprint is found in current lib
if( aDisplayDialog )
2007-10-30 21:30:58 +00:00
{
msg = _( "Module exists\n Line: " );
msg << LineNum;
SetStatusText( msg );
}
if( !aOverwrite ) // Do not save the given footprint: an old one exists
{
fclose( lib_module );
return true;
2007-10-30 21:30:58 +00:00
}
}
/* Creates the new library */
2007-10-30 21:30:58 +00:00
newFileName.SetExt( FILETMP_EXT );
if( ( dest = wxFopen( newFileName.GetFullPath(), wxT( "w+t" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
fclose( lib_module );
msg.Printf( _( "Unable to create <%s>" ), GetChars( newFileName.GetFullPath() ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return false;
2007-10-30 21:30:58 +00:00
}
wxBeginBusyCursor();
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
FOOTPRINT_LIBRARY output_lib( dest );
output_lib.m_List = input_lib.m_List;
if( ! module_exists )
output_lib.m_List.Add( Name_Cmp );
output_lib.SortList();
/* Create the library header with a new date */
output_lib.WriteHeader();
output_lib.WriteSectionIndex();
2007-10-30 21:30:58 +00:00
LineNum = 0;
rewind( lib_module);
// Copy footprints, until the old footprint to delete
bool skip_header = true;
2007-10-30 21:30:58 +00:00
while( GetLine( lib_module, Line, &LineNum ) )
{
StrPurge( Line );
if( strnicmp( Line, "$EndLIBRARY", 8 ) == 0 )
continue;
// Search for the beginning of module section:
if( skip_header )
{
if( strnicmp( Line, "$MODULE", 7 ) == 0 )
skip_header = false;
else
continue;
}
2007-10-30 21:30:58 +00:00
if( strnicmp( Line, "$MODULE", 7 ) == 0 )
{
sscanf( Line + 7, " %s", Name );
msg = FROM_UTF8( Name );
2007-10-30 21:30:58 +00:00
if( msg.CmpNoCase( Name_Cmp ) == 0 )
{
/* skip old footprint descr (delete from the lib) */
2007-10-30 21:30:58 +00:00
while( GetLine( lib_module, Line, &LineNum ) )
{
if( strnicmp( Line, "$EndMODULE", 9 ) == 0 )
break;
}
continue;
}
}
2007-10-30 21:30:58 +00:00
fprintf( dest, "%s\n", Line );
}
/* Write the new footprint ( append it to the list of footprint ) */
tmp = aModule->GetTimeStamp();
aModule->SetTimeStamp( 0 );
aModule->Save( dest );
2011-12-12 08:37:05 +00:00
aModule->SetTimeStamp( tmp );
2007-10-30 21:30:58 +00:00
output_lib.WriteEndOfFile();
2011-01-16 05:11:17 +00:00
fclose( dest );
fclose( lib_module );
SetLocaleTo_Default(); // revert to the current locale
2007-10-30 21:30:58 +00:00
wxEndBusyCursor();
/* The old library file is renamed .bak */
oldFileName = aLibName;
oldFileName.SetExt( BACKUP_EXT );
2007-10-30 21:30:58 +00:00
if( oldFileName.FileExists() )
wxRemoveFile( oldFileName.GetFullPath() );
2007-10-30 21:30:58 +00:00
if( !wxRenameFile( aLibName, oldFileName.GetFullPath() ) )
{
msg.Printf( _( "Could not create library back up file <%s>." ),
GetChars( oldFileName.GetFullName() ) );
DisplayError( this, msg );
}
2007-10-30 21:30:58 +00:00
/* The new library file is renamed */
if( !wxRenameFile( newFileName.GetFullPath(), aLibName ) )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Could not create temporary library file <%s>." ),
GetChars( aLibName ) );
DisplayError( this, msg );
return false;
2007-10-30 21:30:58 +00:00
}
if( aDisplayDialog )
2007-10-30 21:30:58 +00:00
{
wxString fmt = module_exists ?
_( "Component [%s] replaced in <%s>" ) :
_( "Component [%s] added in <%s>" );
msg.Printf( fmt, GetChars( Name_Cmp ), GetChars( aLibName ) );
SetStatusText( msg );
2007-10-30 21:30:58 +00:00
}
return true;
2007-05-06 16:03:28 +00:00
}
MODULE* PCB_BASE_FRAME::Create_1_Module( const wxString& aModuleName )
2007-05-06 16:03:28 +00:00
{
2007-10-30 21:30:58 +00:00
MODULE* Module;
2010-07-20 18:11:34 +00:00
wxString moduleName;
2007-10-30 21:30:58 +00:00
wxPoint newpos;
2010-07-20 18:11:34 +00:00
moduleName = aModuleName;
/* Ask for the new module reference */
2010-07-20 18:11:34 +00:00
if( moduleName.IsEmpty() )
2007-10-30 21:30:58 +00:00
{
2010-07-20 18:11:34 +00:00
wxTextEntryDialog dlg( this, _( "Module Reference:" ),
_( "Module Creation" ), moduleName );
if( dlg.ShowModal() != wxID_OK )
2010-07-20 18:11:34 +00:00
return NULL; //Aborted by user
moduleName = dlg.GetValue();
2010-07-20 18:11:34 +00:00
}
2010-07-20 18:11:34 +00:00
moduleName.Trim( true );
moduleName.Trim( false );
2010-07-20 18:11:34 +00:00
if( moduleName.IsEmpty( ) )
{
DisplayInfoMessage( this, _( "No reference, aborted" ) );
return NULL;
2007-10-30 21:30:58 +00:00
}
// Creates the new module and add it to the head of the linked list of modules
Module = new MODULE( GetBoard() );
2007-10-30 21:30:58 +00:00
GetBoard()->Add( Module );
2007-10-30 21:30:58 +00:00
/* Update parameters: position, timestamp ... */
newpos = GetScreen()->GetCrossHairPosition();
2007-10-30 21:30:58 +00:00
Module->SetPosition( newpos );
Module->m_LastEdit_Time = time( NULL );
/* Update its name in lib */
2010-07-20 18:11:34 +00:00
Module->m_LibRef = moduleName;
2007-10-30 21:30:58 +00:00
/* Update reference: */
2010-07-20 18:11:34 +00:00
Module->m_Reference->m_Text = moduleName;
Module->m_Reference->SetThickness( g_ModuleTextWidth );
Module->m_Reference->SetSize( g_ModuleTextSize );
2007-10-30 21:30:58 +00:00
/* Set the value field to a default value */
2007-10-30 21:30:58 +00:00
Module->m_Value->m_Text = wxT( "VAL**" );
Module->m_Value->SetThickness( g_ModuleTextWidth );
Module->m_Value->SetSize( g_ModuleTextSize );
2007-10-30 21:30:58 +00:00
Module->SetPosition( wxPoint( 0, 0 ) );
Module->DisplayInfo( this );
2007-10-30 21:30:58 +00:00
return Module;
2007-05-06 16:03:28 +00:00
}
void FOOTPRINT_EDIT_FRAME::Select_Active_Library()
2007-05-06 16:03:28 +00:00
{
wxString msg;
if( g_LibraryNames.GetCount() == 0 )
2007-10-30 21:30:58 +00:00
return;
2007-05-06 16:03:28 +00:00
EDA_LIST_DIALOG dlg( this, _( "Select Active Library:" ), g_LibraryNames, m_CurrentLib );
2007-05-06 16:03:28 +00:00
2010-11-19 18:50:23 +00:00
if( dlg.ShowModal() != wxID_OK )
return;
2007-05-06 16:03:28 +00:00
wxFileName fileName = wxFileName( wxEmptyString, dlg.GetTextSelection(), ModuleFileExtension );
fileName = wxGetApp().FindLibraryPath( fileName );
2007-05-06 16:03:28 +00:00
if( fileName.IsOk() && fileName.FileExists() )
{
m_CurrentLib = dlg.GetTextSelection();
}
else
{
msg.Printf( _( "The footprint library <%s> could not be found in any of the search paths." ),
GetChars( dlg.GetTextSelection() ) );
DisplayError( this, msg );
m_CurrentLib.Empty();
}
UpdateTitle();
2007-05-06 16:03:28 +00:00
}
int FOOTPRINT_EDIT_FRAME::CreateLibrary( const wxString& aLibName )
2007-05-06 16:03:28 +00:00
{
2007-10-30 21:30:58 +00:00
FILE* lib_module;
wxString msg;
wxFileName fileName = aLibName;
2007-10-30 21:30:58 +00:00
if( fileName.FileExists() )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Library <%s> already exists." ), GetChars( fileName.GetFullPath() ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return 0;
}
if( !IsWritable( fileName ) )
return 0;
if( ( lib_module = wxFopen( fileName.GetFullPath(), wxT( "wt" ) ) ) == NULL )
2007-10-30 21:30:58 +00:00
{
msg.Printf( _( "Unable to create library <%s>" ), GetChars( fileName.GetFullPath() ) );
2007-10-30 21:30:58 +00:00
DisplayError( this, msg );
return -1;
}
FOOTPRINT_LIBRARY new_lib( lib_module );
new_lib.WriteHeader();
new_lib.WriteSectionIndex();
new_lib.WriteEndOfFile();
2007-10-30 21:30:58 +00:00
fclose( lib_module );
return 1;
2007-05-06 16:03:28 +00:00
}