From b13efdb0f27d4db5114b69916c7a3e8bcc750eaa Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Sun, 20 Jan 2019 13:51:07 -0500 Subject: [PATCH] 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 --- pcbnew/CMakeLists.txt | 1 + .../dialog_global_fp_lib_table_config.cpp | 142 ++++++++++++++++++ .../dialog_global_fp_lib_table_config.h | 38 +++++ pcbnew/pcbnew.cpp | 62 ++++---- 4 files changed, 212 insertions(+), 31 deletions(-) create mode 100644 pcbnew/dialogs/dialog_global_fp_lib_table_config.cpp create mode 100644 pcbnew/dialogs/dialog_global_fp_lib_table_config.h diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index a52f4b35f5..38754c3f2c 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -100,6 +100,7 @@ set( PCBNEW_DIALOGS dialogs/dialog_global_edit_tracks_and_vias_base.cpp dialogs/dialog_global_edit_text_and_graphics.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_base.cpp dialogs/dialog_graphic_item_properties.cpp diff --git a/pcbnew/dialogs/dialog_global_fp_lib_table_config.cpp b/pcbnew/dialogs/dialog_global_fp_lib_table_config.cpp new file mode 100644 index 0000000000..fe556e3732 --- /dev/null +++ b/pcbnew/dialogs/dialog_global_fp_lib_table_config.cpp @@ -0,0 +1,142 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2019 Wayne Stambaugh + * 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 . + */ + +#include "dialog_global_fp_lib_table_config.h" + +#include +#include +#include + +#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; +} diff --git a/pcbnew/dialogs/dialog_global_fp_lib_table_config.h b/pcbnew/dialogs/dialog_global_fp_lib_table_config.h new file mode 100644 index 0000000000..1f749b5da9 --- /dev/null +++ b/pcbnew/dialogs/dialog_global_fp_lib_table_config.h @@ -0,0 +1,38 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2019 Wayne Stambaugh + * 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 . + */ + +#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_ diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index 76d5f86d86..d4bafb71b9 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -3,7 +3,7 @@ * * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck - * 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 * modify it under the terms of the GNU General Public License @@ -62,6 +62,7 @@ #include #include #include "invoke_pcb_dialog.h" +#include "dialog_global_fp_lib_table_config.h" extern bool IsWxPythonLoaded(); @@ -233,7 +234,7 @@ static bool scriptingSetup() kipython = fn.GetPath(); // 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 ) ) { // 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 ReadHotkeyConfig( PCB_EDIT_FRAME_NAME, g_Board_Editor_Hotkeys_Descr ); - try - { - // 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. + wxFileName fn = FP_LIB_TABLE::GetGlobalTableFileName(); - if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) ) + if( !fn.FileExists() ) + { + DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG fpDialog( NULL ); + + fpDialog.ShowModal(); + } + else + { + try { - DisplayInfoMessage( NULL, _( - "You have run Pcbnew for the first time using the " - "new footprint library table method for finding footprints.\n" - "Pcbnew has either copied the default " - "table or created an empty table in the kicad configuration folder.\n" - "You must first configure the library " - "table to include all footprint libraries you want to use.\n" - "See the \"Footprint Library Table\" section of " - "the CvPcb or Pcbnew documentation for more information." ) ); + // 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 ) ) + return false; + } + catch( const IO_ERROR& ioe ) + { + // 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 = _( - "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) +#if defined( KICAD_SCRIPTING ) scriptingSetup(); #endif