CADSTAR PCB Importer: Ignore construction layers on outer surfaces

Fixes https://gitlab.com/kicad/code/kicad/-/issues/14443
This commit is contained in:
Roberto Fernandez Bautista 2023-03-29 23:46:22 +02:00
parent aaeb8ca739
commit d5bc223ff2
1 changed files with 43 additions and 18 deletions

View File

@ -232,8 +232,7 @@ std::vector<std::unique_ptr<FOOTPRINT>> CADSTAR_PCB_ARCHIVE_LOADER::LoadLibrary(
} }
void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning( void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning( const wxString& aCadstarLayerName,
const wxString& aCadstarLayerName,
const PCB_LAYER_ID& aKiCadLayer ) const PCB_LAYER_ID& aKiCadLayer )
{ {
if( m_logLayerWarnings ) if( m_logLayerWarnings )
@ -300,6 +299,7 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
std::vector<LAYER_BLOCK> cadstarBoardStackup; std::vector<LAYER_BLOCK> cadstarBoardStackup;
LAYER_BLOCK currentBlock; LAYER_BLOCK currentBlock;
bool first = true;
// Find the electrical and construction (dielectric) layers in the stackup // Find the electrical and construction (dielectric) layers in the stackup
for( LAYER_ID cadstarLayerID : Assignments.Layerdefs.LayerStack ) for( LAYER_ID cadstarLayerID : Assignments.Layerdefs.LayerStack )
@ -317,10 +317,21 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
} }
currentBlock.ElecLayerID = cadstarLayerID; currentBlock.ElecLayerID = cadstarLayerID;
first = false;
} }
else if( cadstarLayer.Type == LAYER_TYPE::CONSTRUCTION ) else if( cadstarLayer.Type == LAYER_TYPE::CONSTRUCTION )
{ {
currentBlock.ConstructionLayers.push_back( cadstarLayerID ); if( first )
{
wxLogWarning( wxString::Format( _( "The CADSTAR construction layer '%s' is on "
"the outer surface of the board. It has been "
"ignored." ),
cadstarLayer.Name ) );
}
else
{
currentBlock.ConstructionLayers.push_back( cadstarLayerID );
}
} }
} }
@ -329,12 +340,20 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
m_numCopperLayers = cadstarBoardStackup.size(); m_numCopperLayers = cadstarBoardStackup.size();
// Special case: last layer in the stackup is a construction layer, we need to use B.Cu as a // Special case: last layer in the stackup is a construction layer, drop it
// dummy layer
if( cadstarBoardStackup.back().ConstructionLayers.size() > 0 ) if( cadstarBoardStackup.back().ConstructionLayers.size() > 0 )
{ {
cadstarBoardStackup.push_back( LAYER_BLOCK() ); //Add dummy layer at the end for( const LAYER_ID& layerID : cadstarBoardStackup.back().ConstructionLayers )
++m_numCopperLayers; {
LAYER cadstarLayer = Assignments.Layerdefs.Layers.at( layerID );
wxLogWarning( wxString::Format( _( "The CADSTAR construction layer '%s' is on "
"the outer surface of the board. It has been "
"ignored." ),
cadstarLayer.Name ) );
}
cadstarBoardStackup.back().ConstructionLayers.clear();
} }
// Make sure it is an even number of layers (KiCad doesn't yet support unbalanced stack-ups) // Make sure it is an even number of layers (KiCad doesn't yet support unbalanced stack-ups)
@ -347,21 +366,27 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
cadstarBoardStackup.pop_back(); cadstarBoardStackup.pop_back();
LAYER_BLOCK dummyLayer; LAYER_BLOCK dummyLayer;
LAYER_ID lastConstruction = secondToLastLayer.ConstructionLayers.back();
if( secondToLastLayer.ConstructionLayers.size() > 1 ) if( secondToLastLayer.ConstructionLayers.size() > 0 )
{ {
// At least two construction layers, lets remove it here and use it in the dummy layer LAYER_ID lastConstruction = secondToLastLayer.ConstructionLayers.back();
secondToLastLayer.ConstructionLayers.pop_back();
} if( secondToLastLayer.ConstructionLayers.size() > 1 )
else {
{ // At least two construction layers, lets remove one here and use the
// There is only one construction layer, lets halve its thickness so it is split evenly // other in the dummy layer
// between this layer and the dummy layer secondToLastLayer.ConstructionLayers.pop_back();
Assignments.Layerdefs.Layers.at( lastConstruction ).Thickness /= 2; }
else
{
// There is only one construction layer, lets halve its thickness so it is split
// evenly between this layer and the dummy layer
Assignments.Layerdefs.Layers.at( lastConstruction ).Thickness /= 2;
}
dummyLayer.ConstructionLayers.push_back( lastConstruction );
} }
dummyLayer.ConstructionLayers.push_back( lastConstruction );
cadstarBoardStackup.push_back( secondToLastLayer ); cadstarBoardStackup.push_back( secondToLastLayer );
cadstarBoardStackup.push_back( dummyLayer ); cadstarBoardStackup.push_back( dummyLayer );
cadstarBoardStackup.push_back( bottomLayer ); cadstarBoardStackup.push_back( bottomLayer );