More safety (and better impl) for not sharing FP table/info stuff.
Fixes https://gitlab.com/kicad/code/kicad/issues/8657
This commit is contained in:
parent
6c67dfa032
commit
1db33c7b3a
|
@ -37,7 +37,7 @@
|
||||||
#include <lib_id.h>
|
#include <lib_id.h>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <kiface_i.h>
|
||||||
|
|
||||||
FOOTPRINT_INFO* FOOTPRINT_LIST::GetFootprintInfo( const wxString& aLibNickname,
|
FOOTPRINT_INFO* FOOTPRINT_LIST::GetFootprintInfo( const wxString& aLibNickname,
|
||||||
const wxString& aFootprintName )
|
const wxString& aFootprintName )
|
||||||
|
@ -123,9 +123,13 @@ static FOOTPRINT_LIST* get_instance_from_id( KIWAY& aKiway, int aId )
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB );
|
ptr = Kiface().IfaceOrAddress( aId );
|
||||||
|
|
||||||
ptr = kiface->IfaceOrAddress( aId );
|
if( !ptr )
|
||||||
|
{
|
||||||
|
KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB );
|
||||||
|
ptr = kiface->IfaceOrAddress( aId );
|
||||||
|
}
|
||||||
|
|
||||||
return static_cast<FOOTPRINT_LIST*>( ptr );
|
return static_cast<FOOTPRINT_LIST*>( ptr );
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include <wx/log.h>
|
#include <wx/log.h>
|
||||||
#include <wx/stdpaths.h>
|
#include <wx/stdpaths.h>
|
||||||
|
|
||||||
#include <config_params.h>
|
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
#include <core/arraydim.h>
|
#include <core/arraydim.h>
|
||||||
#include <fp_lib_table.h>
|
#include <fp_lib_table.h>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Jean-Pierre Charras, jp..charras at wanadoo.fr
|
* Copyright (C) 2007 Jean-Pierre Charras, jp..charras at wanadoo.fr
|
||||||
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||||
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2021 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
|
||||||
|
@ -23,12 +23,9 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @file cvpcb.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
#include <fp_lib_table.h>
|
#include <fp_lib_table.h>
|
||||||
|
#include <footprint_info_impl.h>
|
||||||
#include <kiface_i.h>
|
#include <kiface_i.h>
|
||||||
#include <pgm_base.h>
|
#include <pgm_base.h>
|
||||||
#include <settings/settings_manager.h>
|
#include <settings/settings_manager.h>
|
||||||
|
@ -36,7 +33,7 @@
|
||||||
#include <cvpcb_mainframe.h>
|
#include <cvpcb_mainframe.h>
|
||||||
#include <cvpcb_settings.h>
|
#include <cvpcb_settings.h>
|
||||||
#include <display_footprints_frame.h>
|
#include <display_footprints_frame.h>
|
||||||
|
#include <kiface_ids.h>
|
||||||
|
|
||||||
namespace CV {
|
namespace CV {
|
||||||
|
|
||||||
|
@ -75,7 +72,23 @@ static struct IFACE : public KIFACE_I
|
||||||
*/
|
*/
|
||||||
void* IfaceOrAddress( int aDataId ) override
|
void* IfaceOrAddress( int aDataId ) override
|
||||||
{
|
{
|
||||||
return NULL;
|
switch( aDataId )
|
||||||
|
{
|
||||||
|
// Return a pointer to the global instance of the footprint list.
|
||||||
|
case KIFACE_FOOTPRINT_LIST:
|
||||||
|
return (void*) &GFootprintList;
|
||||||
|
|
||||||
|
// Return a new FP_LIB_TABLE with the global table installed as a fallback.
|
||||||
|
case KIFACE_NEW_FOOTPRINT_TABLE:
|
||||||
|
return (void*) new FP_LIB_TABLE( &GFootprintTable );
|
||||||
|
|
||||||
|
// Return a pointer to the global instance of the global footprint table.
|
||||||
|
case KIFACE_GLOBAL_FOOTPRINT_TABLE:
|
||||||
|
return (void*) &GFootprintTable;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} kiface( "cvpcb", KIWAY::FACE_CVPCB );
|
} kiface( "cvpcb", KIWAY::FACE_CVPCB );
|
||||||
|
@ -115,11 +128,19 @@ PGM_BASE* PgmOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// The global footprint library table. This is not dynamically allocated because
|
||||||
|
/// in a multiple project environment we must keep its address constant (since it is
|
||||||
|
/// the fallback table for multiple projects).
|
||||||
|
FP_LIB_TABLE GFootprintTable;
|
||||||
|
|
||||||
|
/// The global footprint info table. This is performance-intensive to build so we
|
||||||
|
/// keep a hash-stamped global version. Any deviation from the request vs. stored
|
||||||
|
/// hash will result in it being rebuilt.
|
||||||
|
FOOTPRINT_LIST_IMPL GFootprintList;
|
||||||
|
|
||||||
|
|
||||||
//!!!!!!!!!!!!!!! This code is obsolete because of the merge into pcbnew, don't bother with it.
|
//!!!!!!!!!!!!!!! This code is obsolete because of the merge into pcbnew, don't bother with it.
|
||||||
|
|
||||||
FP_LIB_TABLE GFootprintTable;
|
|
||||||
|
|
||||||
|
|
||||||
// A short lived implementation. cvpcb will get combine into pcbnew shortly, so
|
// A short lived implementation. cvpcb will get combine into pcbnew shortly, so
|
||||||
// we skip setting KICAD6_FOOTPRINT_DIR here for now. User should set the environment
|
// we skip setting KICAD6_FOOTPRINT_DIR here for now. User should set the environment
|
||||||
// variable.
|
// variable.
|
||||||
|
@ -150,24 +171,22 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
|
||||||
|
|
||||||
if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) )
|
if( !FP_LIB_TABLE::LoadGlobalTable( GFootprintTable ) )
|
||||||
{
|
{
|
||||||
DisplayInfoMessage( NULL, _(
|
DisplayInfoMessage( NULL, _( "You have run CvPcb for the first time using the "
|
||||||
"You have run CvPcb for the first time using the "
|
"new footprint library table method for finding "
|
||||||
"new footprint library table method for finding "
|
"footprints.\nCvPcb has either copied the default "
|
||||||
"footprints.\nCvPcb has either copied the default "
|
"table or created an empty table in your home "
|
||||||
"table or created an empty table in your home "
|
"folder.\nYou must first configure the library "
|
||||||
"folder.\nYou must first configure the library "
|
"table to include all footprint libraries not "
|
||||||
"table to include all footprint libraries not "
|
"included with KiCad.\nSee the \"Footprint Library "
|
||||||
"included with KiCad.\nSee the \"Footprint Library "
|
"Table\" section of the CvPcb documentation for "
|
||||||
"Table\" section of the CvPcb documentation for "
|
"more information." ) );
|
||||||
"more information." ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
catch( const IO_ERROR& ioe )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage(
|
DisplayErrorMessage( nullptr, _( "An error occurred attempting to load the global "
|
||||||
nullptr,
|
"footprint library table." ),
|
||||||
_( "An error occurred attempting to load the global footprint library table" ),
|
ioe.What() );
|
||||||
ioe.What() );
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include <kiway_express.h>
|
#include <kiway_express.h>
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
#include <netlist_reader/netlist_reader.h>
|
#include <netlist_reader/netlist_reader.h>
|
||||||
#include <footprint_info_impl.h>
|
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <tool/action_manager.h>
|
#include <tool/action_manager.h>
|
||||||
#include <tool/action_toolbar.h>
|
#include <tool/action_toolbar.h>
|
||||||
|
@ -57,15 +56,10 @@
|
||||||
#include <wx/button.h>
|
#include <wx/button.h>
|
||||||
#include <wx/settings.h>
|
#include <wx/settings.h>
|
||||||
|
|
||||||
|
|
||||||
#define CVPCB_MAINFRAME_NAME wxT( "CvpcbFrame" )
|
#define CVPCB_MAINFRAME_NAME wxT( "CvpcbFrame" )
|
||||||
|
|
||||||
|
|
||||||
/// The global footprint info table. This is performance-intensive to build so we
|
|
||||||
/// keep a hash-stamped global version. Any deviation from the request vs. stored
|
|
||||||
/// hash will result in it being rebuilt.
|
|
||||||
FOOTPRINT_LIST_IMPL GFootprintList;
|
|
||||||
|
|
||||||
|
|
||||||
CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||||
KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition,
|
KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition,
|
||||||
wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, CVPCB_MAINFRAME_NAME )
|
wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, CVPCB_MAINFRAME_NAME )
|
||||||
|
@ -78,7 +72,7 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||||
m_skipComponentSelect = false;
|
m_skipComponentSelect = false;
|
||||||
m_filteringOptions = FOOTPRINTS_LISTBOX::UNFILTERED_FP_LIST;
|
m_filteringOptions = FOOTPRINTS_LISTBOX::UNFILTERED_FP_LIST;
|
||||||
m_tcFilterString = NULL;
|
m_tcFilterString = NULL;
|
||||||
m_FootprintsList = &GFootprintList;
|
m_FootprintsList = FOOTPRINT_LIST::GetInstance( Kiway() );
|
||||||
m_initialized = false;
|
m_initialized = false;
|
||||||
m_aboutTitle = "CvPcb";
|
m_aboutTitle = "CvPcb";
|
||||||
|
|
||||||
|
@ -96,8 +90,6 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||||
ReCreateMenuBar();
|
ReCreateMenuBar();
|
||||||
ReCreateHToolbar();
|
ReCreateHToolbar();
|
||||||
|
|
||||||
GFootprintList.ReadCacheFromFile( Prj().GetProjectPath() + "fp-info-cache" );
|
|
||||||
|
|
||||||
// Create list of available footprints and symbols of the schematic
|
// Create list of available footprints and symbols of the schematic
|
||||||
BuildSymbolsListBox();
|
BuildSymbolsListBox();
|
||||||
BuildFootprintsListBox();
|
BuildFootprintsListBox();
|
||||||
|
@ -777,7 +769,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract the library information
|
// Extract the library information
|
||||||
FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs( Kiway() );
|
FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs();
|
||||||
|
|
||||||
if( fptbl->HasLibrary( lib ) )
|
if( fptbl->HasLibrary( lib ) )
|
||||||
msg = wxString::Format( _( "Library location: %s" ), fptbl->GetFullURI( lib ) );
|
msg = wxString::Format( _( "Library location: %s" ), fptbl->GetFullURI( lib ) );
|
||||||
|
@ -790,7 +782,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
|
||||||
|
|
||||||
bool CVPCB_MAINFRAME::LoadFootprintFiles()
|
bool CVPCB_MAINFRAME::LoadFootprintFiles()
|
||||||
{
|
{
|
||||||
FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs( Kiway() );
|
FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs();
|
||||||
|
|
||||||
// Check if there are footprint libraries in the footprint library table.
|
// Check if there are footprint libraries in the footprint library table.
|
||||||
if( !fptbl || !fptbl->GetLogicalLibs().size() )
|
if( !fptbl || !fptbl->GetLogicalLibs().size() )
|
||||||
|
@ -949,7 +941,7 @@ void CVPCB_MAINFRAME::BuildLibrariesListBox()
|
||||||
wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) );
|
wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs( Kiway() );
|
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
|
||||||
|
|
||||||
if( tbl )
|
if( tbl )
|
||||||
{
|
{
|
||||||
|
|
|
@ -406,7 +406,7 @@ FOOTPRINT* DISPLAY_FOOTPRINTS_FRAME::GetFootprint( const wxString& aFootprintNam
|
||||||
wxString libNickname = FROM_UTF8( fpid.GetLibNickname().c_str() );
|
wxString libNickname = FROM_UTF8( fpid.GetLibNickname().c_str() );
|
||||||
wxString fpName = FROM_UTF8( fpid.GetLibItemName().c_str() );
|
wxString fpName = FROM_UTF8( fpid.GetLibItemName().c_str() );
|
||||||
|
|
||||||
FP_LIB_TABLE* fpTable = Prj().PcbFootprintLibs( Kiway() );
|
FP_LIB_TABLE* fpTable = Prj().PcbFootprintLibs();
|
||||||
wxASSERT( fpTable );
|
wxASSERT( fpTable );
|
||||||
|
|
||||||
// See if the library requested is in the library table
|
// See if the library requested is in the library table
|
||||||
|
|
|
@ -130,7 +130,7 @@ bool CVPCB_MAINFRAME::ReadNetListAndFpFiles( const std::string& aNetlist )
|
||||||
if( component->GetFPID().IsLegacy() )
|
if( component->GetFPID().IsLegacy() )
|
||||||
{
|
{
|
||||||
// get this first here, it's possibly obsoleted if we get it too soon.
|
// get this first here, it's possibly obsoleted if we get it too soon.
|
||||||
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs( Kiway() );
|
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
|
||||||
|
|
||||||
int guess = guessNickname( tbl, (LIB_ID*) &component->GetFPID() );
|
int guess = guessNickname( tbl, (LIB_ID*) &component->GetFPID() );
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,10 @@ FP_LIB_TABLE* PROJECT::PcbFootprintLibs()
|
||||||
DisplayErrorMessage( nullptr, _( "Error loading project footprint libraries." ),
|
DisplayErrorMessage( nullptr, _( "Error loading project footprint libraries." ),
|
||||||
ioe.What() );
|
ioe.What() );
|
||||||
}
|
}
|
||||||
|
catch( ... )
|
||||||
|
{
|
||||||
|
DisplayErrorMessage( NULL, _( "Error loading project footprint library table." ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tbl;
|
return tbl;
|
||||||
|
|
Loading…
Reference in New Issue