kicad-cli, layer names: allows using both names used in GUI and in board files

Fixes #14455
https://gitlab.com/kicad/code/kicad/issues/14455
This commit is contained in:
jean-pierre charras 2023-03-30 13:17:24 +02:00
parent e0d983e0d8
commit cd90887e06
2 changed files with 25 additions and 0 deletions

View File

@ -51,14 +51,20 @@ CLI::EXPORT_PCB_BASE_COMMAND::EXPORT_PCB_BASE_COMMAND( const std::string& aName,
m_argParser.add_argument( ARG_INPUT ).help( UTF8STDSTR( _( "Input file" ) ) ); m_argParser.add_argument( ARG_INPUT ).help( UTF8STDSTR( _( "Input file" ) ) );
// Build list of layer names and their layer mask:
for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer ) for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
{ {
std::string untranslated = TO_UTF8( wxString( LSET::Name( PCB_LAYER_ID( layer ) ) ) ); std::string untranslated = TO_UTF8( wxString( LSET::Name( PCB_LAYER_ID( layer ) ) ) );
//m_layerIndices[untranslated] = PCB_LAYER_ID( layer ); //m_layerIndices[untranslated] = PCB_LAYER_ID( layer );
// Add layer name used in pcb files
m_layerMasks[untranslated] = LSET( PCB_LAYER_ID( layer ) ); m_layerMasks[untranslated] = LSET( PCB_LAYER_ID( layer ) );
// Add layer name using GUI canonical layer name
m_layerGuiMasks[ TO_UTF8(LayerName( layer ) ) ] = LSET( PCB_LAYER_ID( layer ) );
} }
// Add list of grouped layer names used in pcb files
m_layerMasks["*"] = LSET::AllLayersMask(); m_layerMasks["*"] = LSET::AllLayersMask();
m_layerMasks["*.Cu"] = LSET::AllCuMask(); m_layerMasks["*.Cu"] = LSET::AllCuMask();
m_layerMasks["*In.Cu"] = LSET::InternalCuMask(); m_layerMasks["*In.Cu"] = LSET::InternalCuMask();
@ -69,6 +75,11 @@ CLI::EXPORT_PCB_BASE_COMMAND::EXPORT_PCB_BASE_COMMAND( const std::string& aName,
m_layerMasks["*.SilkS"] = LSET( 2, B_SilkS, F_SilkS ); m_layerMasks["*.SilkS"] = LSET( 2, B_SilkS, F_SilkS );
m_layerMasks["*.Fab"] = LSET( 2, B_Fab, F_Fab ); m_layerMasks["*.Fab"] = LSET( 2, B_Fab, F_Fab );
m_layerMasks["*.CrtYd"] = LSET( 2, B_CrtYd, F_CrtYd ); m_layerMasks["*.CrtYd"] = LSET( 2, B_CrtYd, F_CrtYd );
// Add list of grouped layer names using GUI canonical layer names
m_layerGuiMasks["*.Adhesive"] = LSET( 2, B_Adhes, F_Adhes );
m_layerGuiMasks["*.Silkscreen"] = LSET( 2, B_SilkS, F_SilkS );
m_layerGuiMasks["*.Courtyard"] = LSET( 2, B_CrtYd, F_CrtYd );
} }
@ -80,14 +91,23 @@ LSET CLI::EXPORT_PCB_BASE_COMMAND::convertLayerStringList( wxString& aLayerStrin
{ {
layerMask.reset(); layerMask.reset();
wxStringTokenizer layerTokens( aLayerString, "," ); wxStringTokenizer layerTokens( aLayerString, "," );
while( layerTokens.HasMoreTokens() ) while( layerTokens.HasMoreTokens() )
{ {
std::string token = TO_UTF8( layerTokens.GetNextToken() ); std::string token = TO_UTF8( layerTokens.GetNextToken() );
// Search for a layer name in canonical layer name used in .kicad_pcb files:
if( m_layerMasks.count( token ) ) if( m_layerMasks.count( token ) )
{ {
layerMask |= m_layerMasks.at(token); layerMask |= m_layerMasks.at(token);
aLayerArgSet = true; aLayerArgSet = true;
} }
// Search for a layer name in canonical layer name used in GUI (not translated):
else if( m_layerGuiMasks.count( token ) )
{
layerMask |= m_layerMasks.at(token);
aLayerArgSet = true;
}
else else
{ {
wxFprintf( stderr, _( "Invalid layer name \"%s\"\n" ), token ); wxFprintf( stderr, _( "Invalid layer name \"%s\"\n" ), token );

View File

@ -47,7 +47,12 @@ protected:
LSET convertLayerStringList( wxString& aLayerString, bool& aLayerArgSet ) const; LSET convertLayerStringList( wxString& aLayerString, bool& aLayerArgSet ) const;
void addLayerArg( bool aRequire ); void addLayerArg( bool aRequire );
// The list of canonical layer names used in .kicad_pcb files:
std::map<std::string, LSET> m_layerMasks; std::map<std::string, LSET> m_layerMasks;
// The list of canonical layer names used in GUI (not translated):
std::map<std::string, LSET> m_layerGuiMasks;
LSET m_selectedLayers; LSET m_selectedLayers;
bool m_selectedLayersSet; bool m_selectedLayersSet;