Fix up kicad-cli DRC project and library handling

Fixes https://gitlab.com/kicad/code/kicad/-/issues/23379
This commit is contained in:
Jon Evans
2026-03-09 20:41:43 -04:00
parent e47e3cc166
commit e468788aa8
3 changed files with 34 additions and 9 deletions
+22 -5
View File
@@ -95,12 +95,29 @@ static std::unique_ptr<SCHEMATIC> readSchematicFromFile( const std::string& aFil
SETTINGS_MANAGER& manager = Pgm().GetSettingsManager();
// TODO: this must load the schematic's project, not a default project. At the very minimum
// variable resolution won't work without the project, but there might also be issues with
// netclasses, etc.
manager.LoadProject( "" );
wxFileName pro( aFilename );
pro.SetExt( FILEEXT::ProjectFileExtension );
pro.MakeAbsolute();
wxString projectPath = pro.GetFullPath();
PROJECT* project = manager.GetProject( projectPath );
if( !project )
{
if( wxFileExists( projectPath ) )
{
// cli
manager.LoadProject( projectPath, true );
project = manager.GetProject( projectPath );
}
else
{
manager.LoadProject( "" );
}
}
schematic->Reset();
schematic->SetProject( &manager.Prj() );
schematic->SetProject( project );
SCH_SHEET* rootSheet = pi->LoadSchematicFile( aFilename, schematic.get() );
if( !rootSheet )
+6
View File
@@ -59,6 +59,7 @@
#include <jobs/job_pcb_import.h>
#include <jobs/job_pcb_upgrade.h>
#include <eda_units.h>
#include <footprint_library_adapter.h>
#include <lset.h>
#include <cli/exit_codes.h>
#include <exporters/place_file_exporter.h>
@@ -2288,6 +2289,11 @@ int PCBNEW_JOBS_HANDLER::JobExportDrc( JOB* aJob )
if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
// Running DRC requires libraries be loaded, so make sure they have been
FOOTPRINT_LIBRARY_ADAPTER* adapter = PROJECT_PCB::FootprintLibAdapter( brd->GetProject() );
adapter->AsyncLoad();
adapter->BlockUntilLoaded();
if( drcJob->GetConfiguredOutputPath().IsEmpty() )
{
wxFileName fn = brd->GetFileName();
@@ -159,18 +159,20 @@ BOARD* LoadBoard( const wxString& aFileName, PCB_IO_MGR::PCB_FILE_T aFormat, boo
// By default only the BMP handler is available.
wxInitAllImageHandlers();
PROJECT* project = GetSettingsManager()->GetProject( projectPath );
SETTINGS_MANAGER& settingsManager = PgmOrNull() ? Pgm().GetSettingsManager() : *GetSettingsManager();
PROJECT* project = settingsManager.GetProject( projectPath );
if( !project )
{
if( wxFileExists( projectPath ) )
{
// cli
GetSettingsManager()->LoadProject( projectPath, aSetActive );
project = GetSettingsManager()->GetProject( projectPath );
settingsManager.LoadProject( projectPath, aSetActive );
project = settingsManager.GetProject( projectPath );
}
}
else if( s_PcbEditFrame && project == &GetSettingsManager()->Prj() )
else if( s_PcbEditFrame && project == &settingsManager.Prj() )
{
// Project is already loaded? Then so is the board
return s_PcbEditFrame->GetBoard();