Commit a26e59d8 authored by Dick Hollenbeck's avatar Dick Hollenbeck

pass round boards to freerouter via specctra_export

parent d55ab920
...@@ -855,6 +855,38 @@ PADSTACK* SPECCTRA_DB::makeVia( const SEGVIA* aVia ) ...@@ -855,6 +855,38 @@ PADSTACK* SPECCTRA_DB::makeVia( const SEGVIA* aVia )
} }
/**
* Function makeCircle
* does a line segmented circle into aPath.
*/
static void makeCircle( PATH* aPath, DRAWSEGMENT* aGraphic )
{
// do a circle segmentation
const int STEPS = 2 * 36;
wxPoint start;
wxPoint center = aGraphic->GetCenter();
int radius = aGraphic->GetRadius();
double angle = 3600.0;
start = center;
start.x += radius;
wxPoint nextPt;
for( int step = 0; step<STEPS; ++step )
{
double rotation = ( angle * step ) / STEPS;
nextPt = start;
RotatePoint( &nextPt.x, &nextPt.y, center.x, center.y, rotation );
aPath->AppendPoint( mapPt( nextPt ) );
}
}
void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ERROR ) void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ERROR )
{ {
TYPE_COLLECTOR items; TYPE_COLLECTOR items;
...@@ -948,10 +980,18 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -948,10 +980,18 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
break; break;
case S_CIRCLE: case S_CIRCLE:
// Freerouter does not understand circles. {
// This might be a mounting hole or something, ignore it without error wxPoint pt = graphic->GetCenter();
// because some of our demo boards have used the edges pcb layer to
// hold islanded circles, rather than simply using holes. // pt has minimum x point
pt.x -= graphic->GetRadius();
if( pt.x < xmin.x )
{
xmin = pt;
xmini = i;
}
}
break; break;
default: default:
...@@ -974,6 +1014,17 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -974,6 +1014,17 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
// The first DRAWSEGMENT is in 'graphic', ok to remove it from 'items' // The first DRAWSEGMENT is in 'graphic', ok to remove it from 'items'
items.Remove( xmini ); items.Remove( xmini );
// Set maximum proximity threshold for point to point nearness metric for
// board perimeter only, not interior keepouts yet.
prox = Mils2iu( 0 );
// Output the Edge.Cuts perimeter as circle or polygon.
if( graphic->GetShape() == S_CIRCLE )
{
makeCircle( path, graphic );
}
else
{
wxPoint startPt = wxPoint( graphic->GetEnd() ); wxPoint startPt = wxPoint( graphic->GetEnd() );
prevPt = graphic->GetEnd(); prevPt = graphic->GetEnd();
...@@ -982,11 +1033,6 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -982,11 +1033,6 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
// Do not append the other end point yet of this 'graphic', this first // Do not append the other end point yet of this 'graphic', this first
// 'graphic' might be an arc. // 'graphic' might be an arc.
// Set maximum proximity threshold for point to point nearness metric for
// board perimeter only, not interior keepouts yet.
prox = Mils2iu( 0 );
// Output the Edge.Cuts perimeter polygon.
for(;;) for(;;)
{ {
switch( graphic->GetShape() ) switch( graphic->GetShape() )
...@@ -1048,15 +1094,6 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -1048,15 +1094,6 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
} }
break; break;
case S_CIRCLE:
// Freerouter does not understand circles. And although we can mimic
// a circle for it by line segments, we'd have to ensure that the circle
// was the only graphic on the board's edge. @todo that.
//
// Tell user his board has a problem, this is better than silently
// ignoring the error.
// fall thru here to report the error.
default: default:
{ {
wxString error = wxString::Format( _( "Unsupported DRAWSEGMENT type %s" ), wxString error = wxString::Format( _( "Unsupported DRAWSEGMENT type %s" ),
...@@ -1082,6 +1119,7 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -1082,6 +1119,7 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
ThrowIOError( error ); ThrowIOError( error );
} }
} }
}
// Output the interior Edge.Cuts graphics as keepouts, using nearness metric // Output the interior Edge.Cuts graphics as keepouts, using nearness metric
// for sloppy graphical items. // for sloppy graphical items.
...@@ -1101,29 +1139,7 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER ...@@ -1101,29 +1139,7 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER
if( graphic->GetShape() == S_CIRCLE ) if( graphic->GetShape() == S_CIRCLE )
{ {
// do a circle segmentation makeCircle( poly_ko, graphic );
const int STEPS = 36;
wxPoint start;
wxPoint center = graphic->GetCenter();
int radius = graphic->GetRadius();
double angle = 3600.0;
start = center;
start.x += radius;
wxPoint nextPt;
for( int step = 0; step<STEPS; ++step )
{
double rotation = ( angle * step ) / STEPS;
nextPt = start;
RotatePoint( &nextPt.x, &nextPt.y, center.x, center.y, rotation );
poly_ko->AppendPoint( mapPt( nextPt ) );
}
} }
else else
{ {
......
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