Commit 8f853800 authored by dickelbeck's avatar dickelbeck

Topo-R specctra import fix

parent d188bf5a
......@@ -4,6 +4,14 @@ KiCad ChangeLog 2009
Please add newer entries at the top, list the date and your name with
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>
================================================================================
++Eeschema:
......
......@@ -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 )
{
DSN_T tok = nextTok();
......@@ -3303,11 +3346,11 @@ void SPECCTRA_DB::doROUTE( ROUTE* growth ) throw( IOError )
doPARSER( growth->parser );
break;
case T_structure:
if( growth->structure )
case T_structure_out:
if( growth->structure_out )
unexpected( tok );
growth->structure = new STRUCTURE( growth );
doSTRUCTURE( growth->structure );
growth->structure_out = new STRUCTURE_OUT( growth );
doSTRUCTURE_OUT( growth->structure_out );
break;
case T_library_out:
......
......@@ -1320,6 +1320,8 @@ public:
}
};
typedef boost::ptr_vector<LAYER> LAYERS;
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
{
friend class SPECCTRA_DB;
UNIT_RES* unit;
typedef boost::ptr_vector<LAYER> LAYERS;
LAYERS layers;
LAYER_NOISE_WEIGHT* layer_noise_weight;
......@@ -3435,7 +3466,7 @@ class ROUTE : public ELEM
UNIT_RES* resolution;
PARSER* parser;
STRUCTURE* structure;
STRUCTURE_OUT* structure_out;
LIBRARY* library;
NET_OUTS net_outs;
// TEST_POINTS* test_points;
......@@ -3447,14 +3478,14 @@ public:
{
resolution = 0;
parser = 0;
structure = 0;
structure_out = 0;
library = 0;
}
~ROUTE()
{
delete resolution;
delete parser;
delete structure;
delete structure_out;
delete library;
// delete test_points;
}
......@@ -3475,8 +3506,8 @@ public:
if( parser )
parser->Format( out, nestLevel );
if( structure )
structure->Format( out, nestLevel );
if( structure_out )
structure_out->Format( out, nestLevel );
if( library )
library->Format( out, nestLevel );
......@@ -3781,6 +3812,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
void doRESOLUTION( UNIT_RES* growth ) throw(IOError);
void doUNIT( UNIT_RES* 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_PAIR( LAYER_PAIR* growth ) throw( IOError );
void doBOUNDARY( BOUNDARY* growth ) throw( IOError );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment