Report fp library loading errors with libName & fpName.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16975
This commit is contained in:
Jeff Young 2024-02-19 12:24:13 +00:00
parent b6036f368e
commit 12922d9434
3 changed files with 174 additions and 41 deletions

View File

@ -262,14 +262,17 @@ std::vector<PCB_LAYER_ID> ALTIUM_PCB::GetKicadLayersToIterate( ALTIUM_LAYER aAlt
}
ALTIUM_PCB::ALTIUM_PCB( BOARD* aBoard, PROGRESS_REPORTER* aProgressReporter )
ALTIUM_PCB::ALTIUM_PCB( BOARD* aBoard, PROGRESS_REPORTER* aProgressReporter,
const wxString& aLibrary, const wxString& aFootprintName )
{
m_board = aBoard;
m_board = aBoard;
m_progressReporter = aProgressReporter;
m_doneCount = 0;
m_lastProgressCount = 0;
m_totalCount = 0;
m_highest_pour_index = 0;
m_library = aLibrary;
m_footprintName = aFootprintName;
}
ALTIUM_PCB::~ALTIUM_PCB()
@ -2134,10 +2137,23 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItem( FOOTPRINT* aFoot
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning(
_( "Dashed outline found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.layer );
if( !m_footprintName.IsEmpty() )
{
wxLogWarning( _( "Loading library '%s':\n"
"Footprint %s contains a dashed outline on Altium layer (%d) with "
"no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
m_library,
m_footprintName,
aElem.layer );
}
else
{
wxLogWarning( _( "Footprint %s contains a dashed outline on Altium layer (%d) with "
"no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
aFootprint->GetReference(),
aElem.layer );
}
klayer = Eco1_User;
}
@ -2168,7 +2184,20 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItem( FOOTPRINT* aFoot
}
else
{
wxLogError( _( "Ignored polygon shape of kind %d (not yet supported)." ), aElem.kind );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s contains polygon shape of kind %d (not yet supported)." ),
m_library,
m_footprintName,
aElem.kind );
}
else
{
wxLogError( _( "Footprint %s contains polygon shape of kind %d (not yet supported)." ),
aFootprint->GetReference(),
aElem.kind );
}
}
}
@ -2721,9 +2750,20 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
if( aElem.layer != ALTIUM_LAYER::MULTI_LAYER )
{
// TODO: I assume other values are possible as well?
wxLogError( _( "Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
aFootprint->GetReference(),
aElem.name );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
m_library,
m_footprintName,
aElem.name );
}
else
{
wxLogError( _( "Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
aFootprint->GetReference(),
aElem.name );
}
}
pad->SetAttribute( aElem.plated ? PAD_ATTRIB::PTH : PAD_ATTRIB::NPTH );
@ -2742,9 +2782,20 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
break;
case ALTIUM_PAD_HOLE_SHAPE::SQUARE:
wxLogWarning( _( "Footprint %s pad %s has a square hole (not yet supported)." ),
aFootprint->GetReference(),
aElem.name );
if( !m_footprintName.IsEmpty() )
{
wxLogWarning( _( "Loading library '%s':\n"
"Footprint %s pad %s has a square hole (not yet supported)." ),
m_library,
m_footprintName,
aElem.name );
}
else
{
wxLogWarning( _( "Footprint %s pad %s has a square hole (not yet supported)." ),
aFootprint->GetReference(),
aElem.name );
}
pad->SetDrillShape( PAD_DRILL_SHAPE_T::PAD_DRILL_SHAPE_CIRCLE );
pad->SetDrillSize( VECTOR2I( aElem.holesize, aElem.holesize ) ); // Workaround
@ -2769,11 +2820,24 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
}
else
{
wxLogWarning( _( "Footprint %s pad %s has a hole-rotation of %f degrees. "
"KiCad only supports 90 degree rotations." ),
aFootprint->GetReference(),
aElem.name,
slotRotation.AsDegrees() );
if( !m_footprintName.IsEmpty() )
{
wxLogWarning( _( "Loading library '%s':\n"
"Footprint %s pad %s has a hole-rotation of %f degrees. "
"KiCad only supports 90 degree rotations." ),
m_library,
m_footprintName,
aElem.name,
slotRotation.AsDegrees() );
}
else
{
wxLogWarning( _( "Footprint %s pad %s has a hole-rotation of %f degrees. "
"KiCad only supports 90 degree rotations." ),
aFootprint->GetReference(),
aElem.name,
slotRotation.AsDegrees() );
}
}
break;
@ -2781,10 +2845,22 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
default:
case ALTIUM_PAD_HOLE_SHAPE::UNKNOWN:
wxLogError( _( "Footprint %s pad %s uses a hole of unknown kind %d." ),
aFootprint->GetReference(),
aElem.name,
aElem.sizeAndShape->holeshape );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s pad %s uses a hole of unknown kind %d." ),
m_library,
m_footprintName,
aElem.name,
aElem.sizeAndShape->holeshape );
}
else
{
wxLogError( _( "Footprint %s pad %s uses a hole of unknown kind %d." ),
aFootprint->GetReference(),
aElem.name,
aElem.sizeAndShape->holeshape );
}
pad->SetDrillShape( PAD_DRILL_SHAPE_T::PAD_DRILL_SHAPE_CIRCLE );
pad->SetDrillSize( VECTOR2I( aElem.holesize, aElem.holesize ) ); // Workaround
@ -2798,8 +2874,20 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
if( aElem.padmode != ALTIUM_PAD_MODE::SIMPLE )
{
wxLogError( _( "Footprint %s pad %s uses a complex pad stack (not yet supported.)" ),
aFootprint->GetReference(), aElem.name );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s pad %s uses a complex pad stack (not yet supported)." ),
m_library,
m_footprintName,
aElem.name );
}
else
{
wxLogError( _( "Footprint %s pad %s uses a complex pad stack (not yet supported)." ),
aFootprint->GetReference(),
aElem.name );
}
}
switch( aElem.topshape )
@ -2835,8 +2923,20 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnCopper( FOOTPRINT* aFootprint, con
case ALTIUM_PAD_SHAPE::UNKNOWN:
default:
wxLogError( _( "Footprint %s pad %s uses an unknown pad-shape." ),
aFootprint->GetReference(), aElem.name );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s pad %s uses an unknown pad-shape." ),
m_library,
m_footprintName,
aElem.name );
}
else
{
wxLogError( _( "Footprint %s pad %s uses an unknown pad-shape." ),
aFootprint->GetReference(),
aElem.name );
}
break;
}
@ -2913,10 +3013,25 @@ void ALTIUM_PCB::ConvertPads6ToFootprintItemOnNonCopper( FOOTPRINT* aFootprint,
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning(
_( "Non-copper pad %s found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.name, aElem.layer );
if( !m_footprintName.IsEmpty() )
{
wxLogWarning( _( "Loading library '%s':\n"
"Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
"KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
m_library,
m_footprintName,
aElem.name,
aElem.layer );
}
else
{
wxLogWarning( _( "Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
"KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
aFootprint->GetReference(),
aElem.name,
aElem.layer );
}
klayer = Eco1_User;
}
@ -3420,7 +3535,21 @@ void ALTIUM_PCB::ConvertTexts6ToFootprintItem( FOOTPRINT* aFootprint, const ATEX
{
if( aElem.fonttype == ALTIUM_TEXT_TYPE::BARCODE )
{
wxLogError( _( "Ignored barcode on Altium layer %d (not yet supported)." ), aElem.layer );
if( !m_footprintName.IsEmpty() )
{
wxLogError( _( "Error loading library '%s':\n"
"Footprint %s contains barcode on Altium layer %d (not yet supported)." ),
m_library,
m_footprintName,
aElem.layer );
}
else
{
wxLogError( _( "Footprint %s contains barcode on Altium layer %d (not yet supported)." ),
aFootprint->GetReference(),
aElem.layer );
}
return;
}

View File

@ -106,7 +106,9 @@ typedef std::function<void( const ALTIUM_COMPOUND_FILE&, const CFB::COMPOUND_FIL
class ALTIUM_PCB
{
public:
explicit ALTIUM_PCB( BOARD* aBoard, PROGRESS_REPORTER* aProgressReporter );
explicit ALTIUM_PCB( BOARD* aBoard, PROGRESS_REPORTER* aProgressReporter,
const wxString& aLibrary = wxEmptyString,
const wxString& aFootprintName = wxEmptyString);
~ALTIUM_PCB();
void Parse( const ALTIUM_COMPOUND_FILE& aAltiumPcbFile,
@ -250,10 +252,13 @@ private:
std::map<ALTIUM_LAYER, ZONE*> m_outer_plane;
PROGRESS_REPORTER* m_progressReporter; ///< optional; may be nullptr
PROGRESS_REPORTER* m_progressReporter; ///< optional; may be nullptr
unsigned m_doneCount;
unsigned m_lastProgressCount;
unsigned m_totalCount; ///< for progress reporting
unsigned m_totalCount; ///< for progress reporting
wxString m_library; ///< for footprint library loading error reporting
wxString m_footprintName; ///< for footprint library loading error reporting
/// Altium stores pour order across all layers
int m_highest_pour_index;

View File

@ -266,11 +266,11 @@ FOOTPRINT* PCB_IO_ALTIUM_DESIGNER::FootprintLoad( const wxString& aLibraryPath,
auto it = m_fplibFiles.find( aLibraryPath );
if( it == m_fplibFiles.end() )
THROW_IO_ERROR( _( "No footprints in library" ) );
THROW_IO_ERROR( wxString::Format( _( "No footprints in library '%s'" ), aLibraryPath ) );
try
{
for( auto& altiumLibFile : it->second )
for( std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumLibFile : it->second )
{
auto [dirName, fpCfe] = altiumLibFile->FindLibFootprintDirName( aFootprintName );
@ -278,7 +278,7 @@ FOOTPRINT* PCB_IO_ALTIUM_DESIGNER::FootprintLoad( const wxString& aLibraryPath,
continue;
// Parse File
ALTIUM_PCB pcb( m_board, nullptr );
ALTIUM_PCB pcb( m_board, nullptr, aLibraryPath, aFootprintName );
return pcb.ParseFootprint( *altiumLibFile, aFootprintName );
}
}
@ -287,8 +287,7 @@ FOOTPRINT* PCB_IO_ALTIUM_DESIGNER::FootprintLoad( const wxString& aLibraryPath,
THROW_IO_ERROR( exception.what() );
}
THROW_IO_ERROR(
wxString::Format( _( "Footprint directory not found: '%s'." ), aFootprintName ) );
return nullptr;
THROW_IO_ERROR( wxString::Format( _( "Footprint '%s' not found in '%s'." ),
aFootprintName,
aLibraryPath ) );
}