Non-Kicad Project Importers: Fix the creation of project fp libraries
Adds a new function to PLUGIN GetImportedCachedLibraryFootprints() that loads the library footprints of the board design that was imported Fixes https://gitlab.com/kicad/code/kicad/-/issues/7449
This commit is contained in:
parent
297ff282f1
commit
f559e94b00
|
@ -77,6 +77,7 @@ public:
|
||||||
// For the aCtl argument of OpenProjectFiles()
|
// For the aCtl argument of OpenProjectFiles()
|
||||||
#define KICTL_EAGLE_BRD (1<<0) ///< chosen *.brd file is Eagle according to user.
|
#define KICTL_EAGLE_BRD (1<<0) ///< chosen *.brd file is Eagle according to user.
|
||||||
#define KICTL_CREATE (1<<1) ///< caller thinks requested project files may not exist.
|
#define KICTL_CREATE (1<<1) ///< caller thinks requested project files may not exist.
|
||||||
|
#define KICTL_IMPORT_LIB (1<<2) ///< import all footprints into a project library.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a project or set of files given by @a aFileList.
|
* Open a project or set of files given by @a aFileList.
|
||||||
|
|
156
pcbnew/files.cpp
156
pcbnew/files.cpp
|
@ -761,6 +761,90 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
"It will be converted to the new format when saved." ),
|
"It will be converted to the new format when saved." ),
|
||||||
wxICON_WARNING );
|
wxICON_WARNING );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Import footprints into a project-specific library
|
||||||
|
//==================================================
|
||||||
|
// TODO: This should be refactored out of here into somewhere specific to the Project Import
|
||||||
|
// E.g. KICAD_MANAGER_FRAME::ImportNonKiCadProject
|
||||||
|
if( aCtl & KICTL_IMPORT_LIB )
|
||||||
|
{
|
||||||
|
wxFileName loadedBoardFn( fullFileName );
|
||||||
|
wxString libNickName = loadedBoardFn.GetName();
|
||||||
|
|
||||||
|
// Extract a footprint library from the design and add it to the fp-lib-table
|
||||||
|
// The footprints are saved in a new .pretty library.
|
||||||
|
// If this library already exists, all previous footprints will be deleted
|
||||||
|
std::vector<FOOTPRINT*> loadedFootprints = pi->GetImportedCachedLibraryFootprints();
|
||||||
|
wxString newLibPath = CreateNewLibrary( libNickName );
|
||||||
|
|
||||||
|
// Only create the new library if CreateNewLibrary succeeded (note that this fails if
|
||||||
|
// the library already exists and the user aborts after seeing the warning message
|
||||||
|
// which prompts the user to continue with overwrite or abort)
|
||||||
|
if( newLibPath.Length() > 0 )
|
||||||
|
{
|
||||||
|
PLUGIN::RELEASER piSexpr( IO_MGR::PluginFind( IO_MGR::KICAD_SEXP ) );
|
||||||
|
|
||||||
|
for( FOOTPRINT* footprint : loadedFootprints )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if( !footprint->GetFPID().GetLibItemName().empty() ) // Handle old boards.
|
||||||
|
{
|
||||||
|
footprint->SetReference( "REF**" );
|
||||||
|
piSexpr->FootprintSave( newLibPath, footprint );
|
||||||
|
delete footprint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( const IO_ERROR& ioe )
|
||||||
|
{
|
||||||
|
wxLogError( wxString::Format( _( "Error occurred when saving footprint "
|
||||||
|
"'%s' to the project specific footprint "
|
||||||
|
"library: %s" ),
|
||||||
|
footprint->GetFPID().GetUniStringLibItemName(),
|
||||||
|
ioe.What() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FP_LIB_TABLE* prjlibtable = Prj().PcbFootprintLibs();
|
||||||
|
const wxString& project_env = PROJECT_VAR_NAME;
|
||||||
|
wxString rel_path, env_path;
|
||||||
|
|
||||||
|
wxASSERT_MSG( wxGetEnv( project_env, &env_path ), "There is no project variable?" );
|
||||||
|
|
||||||
|
wxString result( newLibPath );
|
||||||
|
rel_path = result.Replace( env_path, wxString( "$(" + project_env + ")" ) ) ? result
|
||||||
|
: "";
|
||||||
|
|
||||||
|
FP_LIB_TABLE_ROW* row = new FP_LIB_TABLE_ROW( libNickName, rel_path,
|
||||||
|
wxT( "KiCad" ), wxEmptyString );
|
||||||
|
prjlibtable->InsertRow( row );
|
||||||
|
|
||||||
|
wxString tblName = Prj().FootprintLibTblName();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Prj().PcbFootprintLibs()->Save( tblName );
|
||||||
|
}
|
||||||
|
catch( const IO_ERROR& ioe )
|
||||||
|
{
|
||||||
|
wxLogError( wxString::Format( _( "Error occurred saving the project specific "
|
||||||
|
"footprint library table: %s" ),
|
||||||
|
ioe.What() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update footprint LIB_IDs to point to the just imported library
|
||||||
|
for( FOOTPRINT* footprint : GetBoard()->Footprints() )
|
||||||
|
{
|
||||||
|
LIB_ID libId = footprint->GetFPID();
|
||||||
|
|
||||||
|
if( libId.GetLibItemName().empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
libId.SetLibNickname( libNickName );
|
||||||
|
footprint->SetFPID( libId );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -1101,76 +1185,8 @@ bool PCB_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
|
||||||
{
|
{
|
||||||
case IO_MGR::CADSTAR_PCB_ARCHIVE:
|
case IO_MGR::CADSTAR_PCB_ARCHIVE:
|
||||||
case IO_MGR::EAGLE:
|
case IO_MGR::EAGLE:
|
||||||
if( OpenProjectFiles( std::vector<wxString>( 1, aFileName ), KICTL_EAGLE_BRD ) )
|
return OpenProjectFiles( std::vector<wxString>( 1, aFileName ),
|
||||||
{
|
KICTL_EAGLE_BRD | KICTL_IMPORT_LIB );
|
||||||
wxString projectpath = Kiway().Prj().GetProjectPath();
|
|
||||||
wxFileName newfilename;
|
|
||||||
|
|
||||||
newfilename.SetPath( Prj().GetProjectPath() );
|
|
||||||
newfilename.SetName( Prj().GetProjectName() );
|
|
||||||
newfilename.SetExt( KiCadPcbFileExtension );
|
|
||||||
|
|
||||||
GetBoard()->SetFileName( newfilename.GetFullPath() );
|
|
||||||
UpdateTitle();
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
// Extract a footprint library from the design and add it to the fp-lib-table
|
|
||||||
wxString newLibPath;
|
|
||||||
ExportFootprintsToLibrary( true, newfilename.GetName(), &newLibPath );
|
|
||||||
|
|
||||||
if( newLibPath.Length() > 0 )
|
|
||||||
{
|
|
||||||
FP_LIB_TABLE* prjlibtable = Prj().PcbFootprintLibs();
|
|
||||||
const wxString& project_env = PROJECT_VAR_NAME;
|
|
||||||
wxString rel_path, env_path;
|
|
||||||
|
|
||||||
wxGetEnv( project_env, &env_path );
|
|
||||||
|
|
||||||
wxString result( newLibPath );
|
|
||||||
rel_path = result.Replace( env_path,
|
|
||||||
wxString( "$(" + project_env + ")" ) ) ? result : "" ;
|
|
||||||
|
|
||||||
if( !rel_path.IsEmpty() )
|
|
||||||
newLibPath = rel_path;
|
|
||||||
|
|
||||||
FP_LIB_TABLE_ROW* row = new FP_LIB_TABLE_ROW( newfilename.GetName(),
|
|
||||||
newLibPath, wxT( "KiCad" ), wxEmptyString );
|
|
||||||
prjlibtable->InsertRow( row );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !GetBoard()->GetFileName().IsEmpty() )
|
|
||||||
{
|
|
||||||
wxString tblName = Prj().FootprintLibTblName();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Prj().PcbFootprintLibs()->Save( tblName );
|
|
||||||
}
|
|
||||||
catch( const IO_ERROR& ioe )
|
|
||||||
{
|
|
||||||
wxString msg = wxString::Format( _(
|
|
||||||
"Error occurred saving project specific footprint library "
|
|
||||||
"table:\n\n%s" ), ioe.What() );
|
|
||||||
wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update footprint LIB_IDs to point to the just imported library
|
|
||||||
for( FOOTPRINT* footprint : GetBoard()->Footprints() )
|
|
||||||
{
|
|
||||||
LIB_ID libId = footprint->GetFPID();
|
|
||||||
|
|
||||||
if( libId.GetLibItemName().empty() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
libId.SetLibNickname( newfilename.GetName() );
|
|
||||||
footprint->SetFPID( libId );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -306,6 +306,16 @@ public:
|
||||||
virtual BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
|
virtual BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
|
||||||
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr );
|
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a container with the cached library footprints generated in the last call to
|
||||||
|
* #Load. This function is intended to be used ONLY by the non-KiCad board importers for the
|
||||||
|
* purpose of obtaining the footprint library of the design and creating a project-specific
|
||||||
|
* library.
|
||||||
|
*
|
||||||
|
* @return Footprints (caller owns the objects)
|
||||||
|
*/
|
||||||
|
virtual std::vector<FOOTPRINT*> GetImportedCachedLibraryFootprints();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write @a aBoard to a storage file in a format that this PLUGIN implementation knows
|
* Write @a aBoard to a storage file in a format that this PLUGIN implementation knows
|
||||||
* about or it can be used to write a portion of \a aBoard to a special kind of export
|
* about or it can be used to write a portion of \a aBoard to a special kind of export
|
||||||
|
|
|
@ -51,6 +51,12 @@ BOARD* PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe, const PROPER
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> PLUGIN::GetImportedCachedLibraryFootprints()
|
||||||
|
{
|
||||||
|
not_implemented( this, __FUNCTION__ );
|
||||||
|
return std::vector<FOOTPRINT*>();
|
||||||
|
}
|
||||||
|
|
||||||
void PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, const PROPERTIES* aProperties )
|
void PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, const PROPERTIES* aProperties )
|
||||||
{
|
{
|
||||||
// not pure virtual so that plugins only have to implement subset of the PLUGIN interface.
|
// not pure virtual so that plugins only have to implement subset of the PLUGIN interface.
|
||||||
|
|
|
@ -128,6 +128,18 @@ void CADSTAR_PCB_ARCHIVE_LOADER::Load( ::BOARD* aBoard, ::PROJECT* aProject )
|
||||||
"Please review the import errors and warnings (if any)." ) );
|
"Please review the import errors and warnings (if any)." ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> CADSTAR_PCB_ARCHIVE_LOADER::GetLoadedLibraryFootpints() const
|
||||||
|
{
|
||||||
|
std::vector<FOOTPRINT*> retval;
|
||||||
|
|
||||||
|
for( std::pair<SYMDEF_ID, FOOTPRINT*> fpPair : mLibraryMap )
|
||||||
|
{
|
||||||
|
retval.push_back( static_cast<FOOTPRINT*>( fpPair.second->Clone() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning(
|
void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning(
|
||||||
const wxString& aCadstarLayerName,
|
const wxString& aCadstarLayerName,
|
||||||
|
|
|
@ -71,6 +71,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void Load( ::BOARD* aBoard, ::PROJECT* aProject );
|
void Load( ::BOARD* aBoard, ::PROJECT* aProject );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return a copy of the loaded library footprints (caller owns the objects)
|
||||||
|
* @return Container with all the footprint definitions that were loaded
|
||||||
|
*/
|
||||||
|
std::vector<FOOTPRINT*> GetLoadedLibraryFootpints() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LAYER_MAPPING_HANDLER mLayerMappingHandler; ///< Callback to get layer mapping
|
LAYER_MAPPING_HANDLER mLayerMappingHandler; ///< Callback to get layer mapping
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <cadstar_pcb_archive_loader.h>
|
#include <cadstar_pcb_archive_loader.h>
|
||||||
#include <cadstar_pcb_archive_plugin.h>
|
#include <cadstar_pcb_archive_plugin.h>
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
#include <footprint.h>
|
||||||
#include <properties.h>
|
#include <properties.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +69,17 @@ CADSTAR_PCB_ARCHIVE_PLUGIN::~CADSTAR_PCB_ARCHIVE_PLUGIN()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CADSTAR_PCB_ARCHIVE_PLUGIN::clearLoadedFootprints()
|
||||||
|
{
|
||||||
|
for( FOOTPRINT* fp : m_loaded_footprints )
|
||||||
|
{
|
||||||
|
delete fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_loaded_footprints.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const wxString CADSTAR_PCB_ARCHIVE_PLUGIN::PluginName() const
|
const wxString CADSTAR_PCB_ARCHIVE_PLUGIN::PluginName() const
|
||||||
{
|
{
|
||||||
return wxT( "CADSTAR PCB Archive" );
|
return wxT( "CADSTAR PCB Archive" );
|
||||||
|
@ -80,11 +92,25 @@ const wxString CADSTAR_PCB_ARCHIVE_PLUGIN::GetFileExtension() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> CADSTAR_PCB_ARCHIVE_PLUGIN::GetImportedCachedLibraryFootprints()
|
||||||
|
{
|
||||||
|
std::vector<FOOTPRINT*> retval;
|
||||||
|
|
||||||
|
for( FOOTPRINT* fp : m_loaded_footprints )
|
||||||
|
{
|
||||||
|
retval.push_back( static_cast<FOOTPRINT*>( fp->Clone() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BOARD* CADSTAR_PCB_ARCHIVE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
|
BOARD* CADSTAR_PCB_ARCHIVE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
|
||||||
const PROPERTIES* aProperties, PROJECT* aProject )
|
const PROPERTIES* aProperties, PROJECT* aProject )
|
||||||
{
|
{
|
||||||
m_props = aProperties;
|
m_props = aProperties;
|
||||||
m_board = aAppendToMe ? aAppendToMe : new BOARD();
|
m_board = aAppendToMe ? aAppendToMe : new BOARD();
|
||||||
|
clearLoadedFootprints();
|
||||||
|
|
||||||
CADSTAR_PCB_ARCHIVE_LOADER tempPCB(
|
CADSTAR_PCB_ARCHIVE_LOADER tempPCB(
|
||||||
aFileName, m_layer_mapping_handler, m_show_layer_mapping_warnings );
|
aFileName, m_layer_mapping_handler, m_show_layer_mapping_warnings );
|
||||||
|
@ -111,5 +137,7 @@ BOARD* CADSTAR_PCB_ARCHIVE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_loaded_footprints = tempPCB.GetLoadedLibraryFootpints();
|
||||||
|
|
||||||
return m_board;
|
return m_board;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,8 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> GetImportedCachedLibraryFootprints() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the automapped layers.
|
* Return the automapped layers.
|
||||||
*
|
*
|
||||||
|
@ -69,9 +71,12 @@ public:
|
||||||
~CADSTAR_PCB_ARCHIVE_PLUGIN();
|
~CADSTAR_PCB_ARCHIVE_PLUGIN();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const PROPERTIES* m_props;
|
void clearLoadedFootprints();
|
||||||
BOARD* m_board;
|
|
||||||
bool m_show_layer_mapping_warnings;
|
const PROPERTIES* m_props;
|
||||||
|
BOARD* m_board;
|
||||||
|
std::vector<FOOTPRINT*> m_loaded_footprints;
|
||||||
|
bool m_show_layer_mapping_warnings;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CADSTAR_ARCHIVE_PLUGIN_H_
|
#endif // CADSTAR_ARCHIVE_PLUGIN_H_
|
||||||
|
|
|
@ -402,6 +402,19 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> EAGLE_PLUGIN::GetImportedCachedLibraryFootprints()
|
||||||
|
{
|
||||||
|
std::vector<FOOTPRINT*> retval;
|
||||||
|
|
||||||
|
for( std::pair<wxString, FOOTPRINT*> fp : m_templates )
|
||||||
|
{
|
||||||
|
retval.push_back( static_cast<FOOTPRINT*>( fp.second->Clone() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EAGLE_PLUGIN::init( const PROPERTIES* aProperties )
|
void EAGLE_PLUGIN::init( const PROPERTIES* aProperties )
|
||||||
{
|
{
|
||||||
m_hole_count = 0;
|
m_hole_count = 0;
|
||||||
|
|
|
@ -132,6 +132,8 @@ public:
|
||||||
BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
|
BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
|
||||||
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
|
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
|
||||||
|
|
||||||
|
std::vector<FOOTPRINT*> GetImportedCachedLibraryFootprints() override;
|
||||||
|
|
||||||
const wxString GetFileExtension() const override;
|
const wxString GetFileExtension() const override;
|
||||||
|
|
||||||
void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
|
void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
|
||||||
|
|
Loading…
Reference in New Issue