CADSTAR PCB Importer: Ignore construction layers on outer surfaces
Fixes https://gitlab.com/kicad/code/kicad/-/issues/14443
This commit is contained in:
parent
aaeb8ca739
commit
d5bc223ff2
|
@ -232,8 +232,7 @@ std::vector<std::unique_ptr<FOOTPRINT>> CADSTAR_PCB_ARCHIVE_LOADER::LoadLibrary(
|
|||
}
|
||||
|
||||
|
||||
void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning(
|
||||
const wxString& aCadstarLayerName,
|
||||
void CADSTAR_PCB_ARCHIVE_LOADER::logBoardStackupWarning( const wxString& aCadstarLayerName,
|
||||
const PCB_LAYER_ID& aKiCadLayer )
|
||||
{
|
||||
if( m_logLayerWarnings )
|
||||
|
@ -300,6 +299,7 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
|
|||
|
||||
std::vector<LAYER_BLOCK> cadstarBoardStackup;
|
||||
LAYER_BLOCK currentBlock;
|
||||
bool first = true;
|
||||
|
||||
// Find the electrical and construction (dielectric) layers in the stackup
|
||||
for( LAYER_ID cadstarLayerID : Assignments.Layerdefs.LayerStack )
|
||||
|
@ -317,24 +317,43 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
|
|||
}
|
||||
|
||||
currentBlock.ElecLayerID = cadstarLayerID;
|
||||
first = false;
|
||||
}
|
||||
else if( cadstarLayer.Type == LAYER_TYPE::CONSTRUCTION )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( currentBlock.IsInitialised() )
|
||||
cadstarBoardStackup.push_back( currentBlock );
|
||||
|
||||
m_numCopperLayers = cadstarBoardStackup.size();
|
||||
|
||||
// Special case: last layer in the stackup is a construction layer, we need to use B.Cu as a
|
||||
// dummy layer
|
||||
// Special case: last layer in the stackup is a construction layer, drop it
|
||||
if( cadstarBoardStackup.back().ConstructionLayers.size() > 0 )
|
||||
{
|
||||
cadstarBoardStackup.push_back( LAYER_BLOCK() ); //Add dummy layer at the end
|
||||
++m_numCopperLayers;
|
||||
for( const LAYER_ID& layerID : cadstarBoardStackup.back().ConstructionLayers )
|
||||
{
|
||||
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)
|
||||
|
@ -347,21 +366,27 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadBoardStackup()
|
|||
cadstarBoardStackup.pop_back();
|
||||
|
||||
LAYER_BLOCK dummyLayer;
|
||||
|
||||
if( secondToLastLayer.ConstructionLayers.size() > 0 )
|
||||
{
|
||||
LAYER_ID lastConstruction = secondToLastLayer.ConstructionLayers.back();
|
||||
|
||||
if( secondToLastLayer.ConstructionLayers.size() > 1 )
|
||||
{
|
||||
// At least two construction layers, lets remove it here and use it in the dummy layer
|
||||
// At least two construction layers, lets remove one here and use the
|
||||
// other in the dummy layer
|
||||
secondToLastLayer.ConstructionLayers.pop_back();
|
||||
}
|
||||
else
|
||||
{
|
||||
// There is only one construction layer, lets halve its thickness so it is split evenly
|
||||
// between this layer and the dummy layer
|
||||
// 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 );
|
||||
}
|
||||
|
||||
cadstarBoardStackup.push_back( secondToLastLayer );
|
||||
cadstarBoardStackup.push_back( dummyLayer );
|
||||
cadstarBoardStackup.push_back( bottomLayer );
|
||||
|
|
Loading…
Reference in New Issue