Commit 4d9f87bf authored by Dick Hollenbeck's avatar Dick Hollenbeck
Browse files

fix BUG parsing the kicad_pcb (layers ..) declaration section. First non-cu was being dropped.

parent c6af2a79
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -89,11 +89,18 @@ enum LAYER_T
 */
struct LAYER
{
    LAYER() :
        m_type( LT_SIGNAL ),
        m_visible( true ),
        m_number( 0 )
    {}
    LAYER()
    {
        clear();
    }

    void clear()
    {
        m_type    = LT_SIGNAL;
        m_visible = true;
        m_number  = 0;
        m_name.clear();
    }

    /*
    LAYER( const wxString& aName = wxEmptyString,
+28 −27
Original line number Diff line number Diff line
@@ -703,6 +703,8 @@ void PCB_PARSER::parseLayer( LAYER* aLayer ) throw( IO_ERROR, PARSE_ERROR )
    std::string type;
    bool        isVisible = true;

    aLayer->clear();

    if( CurTok() != T_LEFT )
        Expecting( T_LEFT );

@@ -744,13 +746,12 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
    LSET    visibleLayers;
    LSET    enabledLayers;
    int     copperLayerCount = 0;
    LAYER   layer;

    std::vector<LAYER>  cu;

    for( token = NextTok();  token != T_RIGHT;  token = NextTok() )
    {
        LAYER   layer;

        parseLayer( &layer );

        if( layer.m_type == LT_UNDEFINED )     // it's a non-copper layer
@@ -794,15 +795,9 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
        copperLayerCount = cu.size();
    }

    if( token != T_RIGHT )
    // process non-copper layers
    while( token != T_RIGHT )
    {
        // read any non-copper layers
        for( token = NextTok(); token != T_RIGHT;  token = NextTok() )
        {
            LAYER   layer;

            parseLayer( &layer );

        LAYER_ID_MAP::const_iterator it = m_layerIndices.find( UTF8( layer.m_name ) );

        if( it == m_layerIndices.end() )
@@ -827,8 +822,14 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )

        // DBG( printf( "aux m_visible:%s\n", layer.m_visible ? "true" : "false" );)

            m_board->SetLayer( LAYER_ID( layer.m_number ), layer );
        }
        m_board->SetLayer( it->second, layer );

        token = NextTok();

        if( token != T_LEFT )
            break;

        parseLayer( &layer );
    }

    // We need at least 2 copper layers and there must be an even number of them.