Commit 8f853800 authored by dickelbeck's avatar dickelbeck
Browse files

Topo-R specctra import fix

parent d188bf5a
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,14 @@ KiCad ChangeLog 2009
Please add newer entries at the top, list the date and your name with
Please add newer entries at the top, list the date and your name with
email address.
email address.


2009-Jul-13 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
++pcbnew
    added support to specctra import for the <structure_out> descriptor.
    <route_descriptor> had confused <structure_descriptor> with the <structure_out_descriptor>
    The fix facillitates round tripping from the TOPO-R router.


2009-july-10 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
2009-july-10 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
================================================================================
++Eeschema:
++Eeschema:
+47 −4
Original line number Original line Diff line number Diff line
@@ -834,6 +834,49 @@ L_place:
}
}




void SPECCTRA_DB::doSTRUCTURE_OUT( STRUCTURE_OUT* growth ) throw( IOError )
{
    /*
    <structure_out_descriptor >::=
        (structure_out
            {<layer_descriptor> }
            [<rule_descriptor> ]
        )
    */

    DSN_T   tok = nextTok();

    while( tok != T_RIGHT )
    {
        if( tok != T_LEFT )
            expecting( T_LEFT );

        tok = nextTok();
        switch( tok )
        {
        case T_layer:
            LAYER* layer;
            layer = new LAYER( growth );
            growth->layers.push_back( layer );
            doLAYER( layer );
            break;

        case T_rule:
            if( growth->rules )
                unexpected( tok );
            growth->rules = new RULE( growth, T_rule );
            doRULE( growth->rules );
            break;

        default:
            unexpected( lexer->CurText() );
        }

        tok = nextTok();
    }
}


void SPECCTRA_DB::doKEEPOUT( KEEPOUT* growth ) throw( IOError )
void SPECCTRA_DB::doKEEPOUT( KEEPOUT* growth ) throw( IOError )
{
{
    DSN_T   tok = nextTok();
    DSN_T   tok = nextTok();
@@ -3303,11 +3346,11 @@ void SPECCTRA_DB::doROUTE( ROUTE* growth ) throw( IOError )
            doPARSER( growth->parser );
            doPARSER( growth->parser );
            break;
            break;


        case T_structure:
        case T_structure_out:
            if( growth->structure )
            if( growth->structure_out )
                unexpected( tok );
                unexpected( tok );
            growth->structure = new STRUCTURE( growth );
            growth->structure_out = new STRUCTURE_OUT( growth );
            doSTRUCTURE( growth->structure );
            doSTRUCTURE_OUT( growth->structure_out );
            break;
            break;


        case T_library_out:
        case T_library_out:
+38 −6
Original line number Original line Diff line number Diff line
@@ -1320,6 +1320,8 @@ public:
    }
    }
};
};


typedef boost::ptr_vector<LAYER>    LAYERS;



class LAYER_PAIR : public ELEM
class LAYER_PAIR : public ELEM
{
{
@@ -1552,13 +1554,42 @@ public:
};
};




class STRUCTURE_OUT : public ELEM
{
    friend class SPECCTRA_DB;

    LAYERS      layers;
    RULE*       rules;

public:
    STRUCTURE_OUT( ELEM* aParent ) :
        ELEM( T_structure_out, aParent )
    {
        rules = 0;
    }

    ~STRUCTURE_OUT()
    {
        delete rules;
    }

    void FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
    {
        for( LAYERS::iterator i=layers.begin();  i!=layers.end();  ++i )
            i->Format( out, nestLevel );

        if( rules )
            rules->Format( out, nestLevel );
    }
};


class STRUCTURE : public ELEM_HOLDER
class STRUCTURE : public ELEM_HOLDER
{
{
    friend class SPECCTRA_DB;
    friend class SPECCTRA_DB;


    UNIT_RES*   unit;
    UNIT_RES*   unit;


    typedef boost::ptr_vector<LAYER>    LAYERS;
    LAYERS      layers;
    LAYERS      layers;


    LAYER_NOISE_WEIGHT*  layer_noise_weight;
    LAYER_NOISE_WEIGHT*  layer_noise_weight;
@@ -3435,7 +3466,7 @@ class ROUTE : public ELEM


    UNIT_RES*       resolution;
    UNIT_RES*       resolution;
    PARSER*         parser;
    PARSER*         parser;
    STRUCTURE*      structure;
    STRUCTURE_OUT*  structure_out;
    LIBRARY*        library;
    LIBRARY*        library;
    NET_OUTS        net_outs;
    NET_OUTS        net_outs;
//    TEST_POINTS*    test_points;
//    TEST_POINTS*    test_points;
@@ -3447,14 +3478,14 @@ public:
    {
    {
        resolution = 0;
        resolution = 0;
        parser = 0;
        parser = 0;
        structure = 0;
        structure_out = 0;
        library = 0;
        library = 0;
    }
    }
    ~ROUTE()
    ~ROUTE()
    {
    {
        delete resolution;
        delete resolution;
        delete parser;
        delete parser;
        delete structure;
        delete structure_out;
        delete library;
        delete library;
//        delete test_points;
//        delete test_points;
    }
    }
@@ -3475,8 +3506,8 @@ public:
        if( parser )
        if( parser )
            parser->Format( out, nestLevel );
            parser->Format( out, nestLevel );


        if( structure )
        if( structure_out )
            structure->Format( out, nestLevel );
            structure_out->Format( out, nestLevel );


        if( library )
        if( library )
            library->Format( out, nestLevel );
            library->Format( out, nestLevel );
@@ -3781,6 +3812,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
    void doRESOLUTION( UNIT_RES* growth ) throw(IOError);
    void doRESOLUTION( UNIT_RES* growth ) throw(IOError);
    void doUNIT( UNIT_RES* growth ) throw( IOError );
    void doUNIT( UNIT_RES* growth ) throw( IOError );
    void doSTRUCTURE( STRUCTURE* growth ) throw( IOError );
    void doSTRUCTURE( STRUCTURE* growth ) throw( IOError );
    void doSTRUCTURE_OUT( STRUCTURE_OUT* growth ) throw( IOError );
    void doLAYER_NOISE_WEIGHT( LAYER_NOISE_WEIGHT* growth ) throw( IOError );
    void doLAYER_NOISE_WEIGHT( LAYER_NOISE_WEIGHT* growth ) throw( IOError );
    void doLAYER_PAIR( LAYER_PAIR* growth ) throw( IOError );
    void doLAYER_PAIR( LAYER_PAIR* growth ) throw( IOError );
    void doBOUNDARY( BOUNDARY* growth ) throw( IOError );
    void doBOUNDARY( BOUNDARY* growth ) throw( IOError );