Initial global footprint library table fixes.

Fix bug when pcbnew is launched from a folder containing an existing
fp-lib-table file by using same method as setting the initial global
symbol library table.

Fixes lp:1810169

https://bugs.launchpad.net/kicad/+bug/1810169

Fixes lp:1738871

https://bugs.launchpad.net/kicad/+bug/1738871
This commit is contained in:
Wayne Stambaugh 2019-01-20 13:51:07 -05:00
parent 2dcba4723d
commit b13efdb0f2
4 changed files with 212 additions and 31 deletions

View File

@ -100,6 +100,7 @@ set( PCBNEW_DIALOGS
dialogs/dialog_global_edit_tracks_and_vias_base.cpp dialogs/dialog_global_edit_tracks_and_vias_base.cpp
dialogs/dialog_global_edit_text_and_graphics.cpp dialogs/dialog_global_edit_text_and_graphics.cpp
dialogs/dialog_global_edit_text_and_graphics_base.cpp dialogs/dialog_global_edit_text_and_graphics_base.cpp
dialogs/dialog_global_fp_lib_table_config.cpp
dialogs/dialog_push_pad_properties.cpp dialogs/dialog_push_pad_properties.cpp
dialogs/dialog_push_pad_properties_base.cpp dialogs/dialog_push_pad_properties_base.cpp
dialogs/dialog_graphic_item_properties.cpp dialogs/dialog_graphic_item_properties.cpp

View File

@ -0,0 +1,142 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dialog_global_fp_lib_table_config.h"
#include <confirm.h>
#include <kiface_i.h>
#include <macros.h>
#include "fp_lib_table.h"
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG::DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG( wxWindow* aParent ) :
DIALOG_GLOBAL_LIB_TABLE_CONFIG( aParent, "footprint" )
{
}
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG::~DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG()
{
}
wxFileName DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG::GetGlobalTableFileName()
{
return FP_LIB_TABLE::GetGlobalTableFileName();
}
bool DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG::TransferDataFromWindow()
{
// Create an empty table if requested by the user.
if( m_emptyRb->GetValue() )
{
FP_LIB_TABLE emptyTable;
try
{
emptyTable.Save( FP_LIB_TABLE::GetGlobalTableFileName() );
}
catch( const IO_ERROR& ioe )
{
DisplayError( this,
wxString::Format( _( "Error occurred writing empty footprint library "
"table file.\n\n%s" ),
FP_LIB_TABLE::GetGlobalTableFileName(),
ioe.What() ) );
return false;
}
return true;
}
wxString fileName = m_filePicker1->GetPath();
if( fileName.IsEmpty() )
{
DisplayError( this, _( "Please select a footprint library table file." ) );
return false;
}
wxFileName fn = fileName;
// Make sure the footprint library table to copy actually exists.
if( !fn.FileExists() )
{
DisplayError( this,
wxString::Format( _( "File \"%s\" not found." ), fn.GetFullPath() ) );
return false;
}
// Make sure the footprint library table to copy is a valid footprint library table file.
FP_LIB_TABLE tmpTable;
try
{
tmpTable.Load( fn.GetFullPath() );
}
catch( const IO_ERROR& ioe )
{
DisplayError( this,
wxString::Format( _( "File \"%s\" is not a valid footprint library table "
"file.\n\n%s" ), fn.GetFullPath(), ioe.What() ) );
return false;
}
// Create the config path if it doesn't already exist.
wxFileName fpTableFileName = FP_LIB_TABLE::GetGlobalTableFileName();
if( !fpTableFileName.DirExists() && !fpTableFileName.Mkdir( 0x777, wxPATH_MKDIR_FULL ) )
{
DisplayError( this,
wxString::Format( _( "Cannot create global library table path \"%s\"." ),
fpTableFileName.GetPath() ) );
return false;
}
// Copy the global footprint library table file to the user config.
if( !::wxCopyFile( fn.GetFullPath(), fpTableFileName.GetFullPath() ) )
{
DisplayError( this,
wxString::Format( _( "Cannot copy global footprint library table "
"file:\n\n \"%s\"\n\n:to:\n\n\"%s\"." ),
fn.GetFullPath(), fpTableFileName.GetFullPath() ) );
return false;
}
// Load the successfully copied footprint library table file. This should not fail
// since the file was tested above. Check for failure anyway to keep the compiler
// from complaining.
try
{
if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) )
return false;
}
catch( const IO_ERROR& ioe )
{
DisplayError( this,
wxString::Format( _( "Error occurred loading global footprint library table:"
"\n\n%s" ), ioe.What() ) );
return false;
}
return true;
}

View File

@ -0,0 +1,38 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG_H_
#define _DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG_H_
#include "dialog_global_lib_table_config.h"
class DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG : public DIALOG_GLOBAL_LIB_TABLE_CONFIG
{
public:
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG( wxWindow* aParent );
virtual ~DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG();
bool TransferDataFromWindow() override;
virtual wxFileName GetGlobalTableFileName() override;
};
#endif // _DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG_H_

View File

@ -3,7 +3,7 @@
* *
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com> * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -62,6 +62,7 @@
#include <footprint_info_impl.h> #include <footprint_info_impl.h>
#include <gl_context_mgr.h> #include <gl_context_mgr.h>
#include "invoke_pcb_dialog.h" #include "invoke_pcb_dialog.h"
#include "dialog_global_fp_lib_table_config.h"
extern bool IsWxPythonLoaded(); extern bool IsWxPythonLoaded();
@ -233,7 +234,7 @@ static bool scriptingSetup()
kipython = fn.GetPath(); kipython = fn.GetPath();
// If our python install is existing inside kicad, use it // If our python install is existing inside kicad, use it
// Note: this is usefull only when another python version is installed // Note: this is useful only when another python version is installed
if( wxDirExists( kipython ) ) if( wxDirExists( kipython ) )
{ {
// clear any PYTHONPATH and PYTHONHOME env var definition: the default // clear any PYTHONPATH and PYTHONHOME env var definition: the default
@ -343,40 +344,39 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// display the real hotkeys in menus or tool tips // display the real hotkeys in menus or tool tips
ReadHotkeyConfig( PCB_EDIT_FRAME_NAME, g_Board_Editor_Hotkeys_Descr ); ReadHotkeyConfig( PCB_EDIT_FRAME_NAME, g_Board_Editor_Hotkeys_Descr );
try wxFileName fn = FP_LIB_TABLE::GetGlobalTableFileName();
{
// The global table is not related to a specific project. All projects
// will use the same global table. So the KIFACE::OnKifaceStart() contract
// of avoiding anything project specific is not violated here.
if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) ) if( !fn.FileExists() )
{
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG fpDialog( NULL );
fpDialog.ShowModal();
}
else
{
try
{ {
DisplayInfoMessage( NULL, _( // The global table is not related to a specific project. All projects
"You have run Pcbnew for the first time using the " // will use the same global table. So the KIFACE::OnKifaceStart() contract
"new footprint library table method for finding footprints.\n" // of avoiding anything project specific is not violated here.
"Pcbnew has either copied the default " if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) )
"table or created an empty table in the kicad configuration folder.\n" return false;
"You must first configure the library " }
"table to include all footprint libraries you want to use.\n" catch( const IO_ERROR& ioe )
"See the \"Footprint Library Table\" section of " {
"the CvPcb or Pcbnew documentation for more information." ) ); // if we are here, a incorrect global footprint library table was found.
// Incorrect global symbol library table is not a fatal error:
// the user just has to edit the (partially) loaded table.
wxString msg = _(
"An error occurred attempting to load the global footprint library table.\n"
"Please edit this global symbol library table in Preferences menu."
);
DisplayErrorMessage( NULL, msg, ioe.What() );
} }
} }
catch( const IO_ERROR& ioe )
{
// if we are here, a incorrect global footprint library table was found.
// Incorrect global footprint library table is not a fatal error:
// the user just has to edit the (partially) loaded table.
wxString msg = _( #if defined( KICAD_SCRIPTING )
"An error occurred attempting to load the global footprint library table:\n"
"Please edit this global footprint library table in Preferences menu"
);
DisplayErrorMessage( NULL, msg, ioe.What() );
}
#if defined(KICAD_SCRIPTING)
scriptingSetup(); scriptingSetup();
#endif #endif