Sort PCAD layers
Better fix for 11750. Instead of figeting with layer values, we sort our map based on the layer numbers in the PCAD file. F_Cu is always layer 1 and B_Cu is always layer 2. Fixes https://gitlab.com/kicad/code/kicad/issues/11750
This commit is contained in:
parent
b712c2c0da
commit
ac0f95683f
|
@ -102,9 +102,6 @@ PCB::PCB( BOARD* aBoard ) :
|
||||||
m_LayersMap[3].KiCadLayer = Eco2_User;
|
m_LayersMap[3].KiCadLayer = Eco2_User;
|
||||||
m_LayersMap[6].KiCadLayer = F_SilkS;
|
m_LayersMap[6].KiCadLayer = F_SilkS;
|
||||||
m_LayersMap[7].KiCadLayer = B_SilkS;
|
m_LayersMap[7].KiCadLayer = B_SilkS;
|
||||||
|
|
||||||
m_mappedBottom = false;
|
|
||||||
m_mappedTop = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -459,7 +456,7 @@ int PCB::FindLayer( const wxString& aLayerName ) const
|
||||||
{
|
{
|
||||||
for( int i = 0; i < (int) m_layersStackup.size(); ++i )
|
for( int i = 0; i < (int) m_layersStackup.size(); ++i )
|
||||||
{
|
{
|
||||||
if( m_layersStackup[i] == aLayerName )
|
if( m_layersStackup[i].first == aLayerName )
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,12 +492,10 @@ void PCB::MapLayer( XNODE* aNode )
|
||||||
else if( lName == wxT( "TOP" ) )
|
else if( lName == wxT( "TOP" ) )
|
||||||
{
|
{
|
||||||
KiCadLayer = F_Cu;
|
KiCadLayer = F_Cu;
|
||||||
m_mappedTop = true;
|
|
||||||
}
|
}
|
||||||
else if( lName == wxT( "BOTTOM" ) )
|
else if( lName == wxT( "BOTTOM" ) )
|
||||||
{
|
{
|
||||||
KiCadLayer = B_Cu;
|
KiCadLayer = B_Cu;
|
||||||
m_mappedBottom = true;
|
|
||||||
}
|
}
|
||||||
else if( lName == wxT( "BOT MASK" ) )
|
else if( lName == wxT( "BOT MASK" ) )
|
||||||
{
|
{
|
||||||
|
@ -529,14 +524,6 @@ void PCB::MapLayer( XNODE* aNode )
|
||||||
if( layernum == -1 )
|
if( layernum == -1 )
|
||||||
KiCadLayer = Dwgs_User; // default
|
KiCadLayer = Dwgs_User; // default
|
||||||
else
|
else
|
||||||
// Account for ordering (leave room for F.Cu and B.Cu
|
|
||||||
// TODO: Add layer mapping widget
|
|
||||||
if( !m_mappedTop )
|
|
||||||
++layernum;
|
|
||||||
|
|
||||||
if( m_mappedBottom )
|
|
||||||
--layernum;
|
|
||||||
|
|
||||||
KiCadLayer = ToLAYER_ID( layernum );
|
KiCadLayer = ToLAYER_ID( layernum );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,15 +737,20 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc,
|
||||||
{
|
{
|
||||||
if( FindNode( aNode, wxT( "layerType" ) ) )
|
if( FindNode( aNode, wxT( "layerType" ) ) )
|
||||||
{
|
{
|
||||||
|
long num = -1;
|
||||||
|
|
||||||
|
if( FindNode( aNode, wxT( "layerNum" ) ) )
|
||||||
|
FindNode( aNode, wxT( "layerNum" ) )->GetNodeContent().ToLong( &num );
|
||||||
|
|
||||||
layerType = FindNode( aNode, wxT( "layerType" ) )->GetNodeContent().Trim(
|
layerType = FindNode( aNode, wxT( "layerType" ) )->GetNodeContent().Trim(
|
||||||
false );
|
false );
|
||||||
|
|
||||||
if( layerType.IsSameAs( wxT( "Signal" ), false )
|
if( num > 0 && ( layerType.IsSameAs( wxT( "Signal" ), false )
|
||||||
|| layerType.IsSameAs( wxT( "Plane" ), false ) )
|
|| layerType.IsSameAs( wxT( "Plane" ), false ) ) )
|
||||||
{
|
{
|
||||||
aNode->GetAttribute( wxT( "Name" ), &layerName );
|
aNode->GetAttribute( wxT( "Name" ), &layerName );
|
||||||
layerName = layerName.MakeUpper();
|
layerName = layerName.MakeUpper();
|
||||||
m_layersStackup.emplace_back( layerName );
|
m_layersStackup.emplace_back( layerName, num );
|
||||||
|
|
||||||
if( m_layersStackup.size() > 32 )
|
if( m_layersStackup.size() > 32 )
|
||||||
THROW_IO_ERROR( _( "KiCad only supports 32 signal layers." ) );
|
THROW_IO_ERROR( _( "KiCad only supports 32 signal layers." ) );
|
||||||
|
@ -768,6 +760,16 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc,
|
||||||
|
|
||||||
aNode = aNode->GetNext();
|
aNode = aNode->GetNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that the layers are properly mapped to their order with the bottom
|
||||||
|
// copper (layer 2 in PCAD) at the end
|
||||||
|
std::sort( m_layersStackup.begin(), m_layersStackup.end(),
|
||||||
|
[&]( const std::pair<wxString, long>& a, const std::pair<wxString, long>& b ) {
|
||||||
|
long lhs = a.second == 2 ? std::numeric_limits<long>::max() : a.second;
|
||||||
|
long rhs = b.second == 2 ? std::numeric_limits<long>::max() : b.second;
|
||||||
|
|
||||||
|
return lhs < rhs;
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Layers mapping
|
// Layers mapping
|
||||||
|
|
|
@ -83,9 +83,7 @@ private:
|
||||||
double GetDistance( const wxRealPoint* aPoint1, const wxRealPoint* aPoint2 ) const;
|
double GetDistance( const wxRealPoint* aPoint1, const wxRealPoint* aPoint2 ) const;
|
||||||
void GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConversion );
|
void GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConversion );
|
||||||
|
|
||||||
std::vector<wxString> m_layersStackup;
|
std::vector<std::pair<wxString, long>> m_layersStackup;
|
||||||
bool m_mappedTop;
|
|
||||||
bool m_mappedBottom;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace PCAD2KICAD
|
} // namespace PCAD2KICAD
|
||||||
|
|
Loading…
Reference in New Issue