Commit 8c72db66 authored by Wayne Stambaugh's avatar Wayne Stambaugh

Pcbnew s-expression file parser bug fixes and file size improvements.

* Use index when saving layers to handle translated layer names.
* Add LOCALE_IO switcher when loading s-expression format.
* Make SEGVIA default to through hole to improve file size.
* Don't save default orientation of 0 degrees in TEXTE_MODULE and TEXTE_PCB.
* Don't save default zone configuration parameters.
* Save multiple zone corners on a single line.
* Fixed missing ( check in graphic and module arc parsers.
* Consistency improvements for DRAWSEGMENT and EDGE_MODULE objects.
* Minor tweaks to D_PAD formatting.
parent d9ed8a30
...@@ -129,8 +129,8 @@ priority ...@@ -129,8 +129,8 @@ priority
pts pts
radius radius
rev rev
rect
rect_delta rect_delta
rectangle
reference reference
right right
rotate rotate
...@@ -165,7 +165,6 @@ trapezoid ...@@ -165,7 +165,6 @@ trapezoid
thru thru
thru_hole thru_hole
tstamp tstamp
use_thermal
user user
user_trace_width user_trace_width
user_via user_via
......
...@@ -74,10 +74,14 @@ BOARD::BOARD() : ...@@ -74,10 +74,14 @@ BOARD::BOARD() :
BuildListOfNets(); // prepare pad and netlist containers. BuildListOfNets(); // prepare pad and netlist containers.
for( int layer = 0; layer < NB_COPPER_LAYERS; ++layer ) for( int layer = 0; layer < LAYER_COUNT; ++layer )
{ {
m_Layer[layer].m_Name = GetDefaultLayerName( layer ); m_Layer[layer].m_Name = GetDefaultLayerName( layer );
m_Layer[layer].m_Type = LT_SIGNAL;
if( layer <= LAST_COPPER_LAYER )
m_Layer[layer].m_Type = LT_SIGNAL;
else
m_Layer[layer].m_Type = LT_UNDEFINED;
} }
m_NetClasses.GetDefault()->SetDescription( _( "This is the default net class." ) ); m_NetClasses.GetDefault()->SetDescription( _( "This is the default net class." ) );
...@@ -356,8 +360,8 @@ wxString BOARD::GetLayerName( int aLayerIndex ) const ...@@ -356,8 +360,8 @@ wxString BOARD::GetLayerName( int aLayerIndex ) const
if( !IsValidLayerIndex( aLayerIndex ) ) if( !IsValidLayerIndex( aLayerIndex ) )
return wxEmptyString; return wxEmptyString;
// copper layer names are stored in the BOARD. // All layer names are stored in the BOARD.
if( IsValidCopperLayerIndex( aLayerIndex ) && IsLayerEnabled( aLayerIndex ) ) if( IsLayerEnabled( aLayerIndex ) )
{ {
// default names were set in BOARD::BOARD() but they may be // default names were set in BOARD::BOARD() but they may be
// over-ridden by BOARD::SetLayerName() // over-ridden by BOARD::SetLayerName()
......
...@@ -199,7 +199,7 @@ private: ...@@ -199,7 +199,7 @@ private:
/// edge zone descriptors, owned by pointer. /// edge zone descriptors, owned by pointer.
ZONE_CONTAINERS m_ZoneDescriptorList; ZONE_CONTAINERS m_ZoneDescriptorList;
LAYER m_Layer[NB_COPPER_LAYERS]; LAYER m_Layer[LAYER_COUNT];
// if true m_highLight_NetCode is used // if true m_highLight_NetCode is used
HIGH_LIGHT_INFO m_highLight; // current high light data HIGH_LIGHT_INFO m_highLight; // current high light data
HIGH_LIGHT_INFO m_highLightPrevious; // a previously stored high light data HIGH_LIGHT_INFO m_highLightPrevious; // a previously stored high light data
......
...@@ -186,6 +186,7 @@ wxString SEGZONE::GetSelectMenuText() const ...@@ -186,6 +186,7 @@ wxString SEGZONE::GetSelectMenuText() const
SEGVIA::SEGVIA( BOARD_ITEM* aParent ) : SEGVIA::SEGVIA( BOARD_ITEM* aParent ) :
TRACK( aParent, PCB_VIA_T ) TRACK( aParent, PCB_VIA_T )
{ {
SetShape( VIA_THROUGH );
} }
......
...@@ -134,7 +134,7 @@ void PCB_IO::Format( BOARD_ITEM* aItem, int aNestLevel ) const ...@@ -134,7 +134,7 @@ void PCB_IO::Format( BOARD_ITEM* aItem, int aNestLevel ) const
void PCB_IO::formatLayer( const BOARD_ITEM* aItem ) const void PCB_IO::formatLayer( const BOARD_ITEM* aItem ) const
{ {
#if USE_LAYER_NAMES #if 1
m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() ); m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
#else #else
m_out->Print( 0, " (layer %d)", aItem->GetLayer() ); m_out->Print( 0, " (layer %d)", aItem->GetLayer() );
...@@ -182,7 +182,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const ...@@ -182,7 +182,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
if( mask & aBoard->GetEnabledLayers() ) if( mask & aBoard->GetEnabledLayers() )
{ {
#if USE_LAYER_NAMES #if USE_LAYER_NAMES
m_out->Print( aNestLevel+1, "(%s %s", m_out->Print( aNestLevel+1, "(%d %s %s", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(), m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
LAYER::ShowType( aBoard->GetLayerType( layer ) ) ); LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
#else #else
...@@ -210,7 +210,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const ...@@ -210,7 +210,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
if( mask & aBoard->GetEnabledLayers() ) if( mask & aBoard->GetEnabledLayers() )
{ {
#if USE_LAYER_NAMES #if USE_LAYER_NAMES
m_out->Print( aNestLevel+1, "(%s user", m_out->Print( aNestLevel+1, "(%d %s user", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() ); m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
#else #else
m_out->Print( aNestLevel+1, "(%d %s user", layer, m_out->Print( aNestLevel+1, "(%d %s user", layer,
...@@ -454,20 +454,23 @@ void PCB_IO::format( DRAWSEGMENT* aSegment, int aNestLevel ) const ...@@ -454,20 +454,23 @@ void PCB_IO::format( DRAWSEGMENT* aSegment, int aNestLevel ) const
switch( aSegment->GetShape() ) switch( aSegment->GetShape() )
{ {
case S_SEGMENT: // Line case S_SEGMENT: // Line
m_out->Print( aNestLevel, "(gr_line (pts (xy %s) (xy %s)) (angle %s)", m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
FMT_IU( aSegment->GetStart() ).c_str(), FMT_IU( aSegment->GetStart() ).c_str(),
FMT_IU( aSegment->GetEnd() ).c_str(), FMT_IU( aSegment->GetEnd() ).c_str() );
FMT_ANGLE( aSegment->GetAngle() ).c_str() );
if( aSegment->GetAngle() != 0.0 )
m_out->Print( 0, " (angle %s)", FMT_ANGLE( aSegment->GetAngle() ).c_str() );
break; break;
case S_CIRCLE: // Circle case S_CIRCLE: // Circle
m_out->Print( aNestLevel, "(gr_circle (center (xy %s)) (end (xy %s))", m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
FMT_IU( aSegment->GetStart() ).c_str(), FMT_IU( aSegment->GetStart() ).c_str(),
FMT_IU( aSegment->GetEnd() ).c_str() ); FMT_IU( aSegment->GetEnd() ).c_str() );
break; break;
case S_ARC: // Arc case S_ARC: // Arc
m_out->Print( aNestLevel, "(gr_arc (start (xy %s)) (end (xy %s)) (angle %s)", m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
FMT_IU( aSegment->GetStart() ).c_str(), FMT_IU( aSegment->GetStart() ).c_str(),
FMT_IU( aSegment->GetEnd() ).c_str(), FMT_IU( aSegment->GetEnd() ).c_str(),
FMT_ANGLE( aSegment->GetAngle() ).c_str() ); FMT_ANGLE( aSegment->GetAngle() ).c_str() );
...@@ -515,19 +518,19 @@ void PCB_IO::format( EDGE_MODULE* aModuleDrawing, int aNestLevel ) const ...@@ -515,19 +518,19 @@ void PCB_IO::format( EDGE_MODULE* aModuleDrawing, int aNestLevel ) const
switch( aModuleDrawing->GetShape() ) switch( aModuleDrawing->GetShape() )
{ {
case S_SEGMENT: // Line case S_SEGMENT: // Line
m_out->Print( aNestLevel, "(fp_line (pts (xy %s) (xy %s))", m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
FMT_IU( aModuleDrawing->GetStart0() ).c_str(), FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
FMT_IU( aModuleDrawing->GetEnd0() ).c_str() ); FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
break; break;
case S_CIRCLE: // Circle case S_CIRCLE: // Circle
m_out->Print( aNestLevel, "(fp_circle (center (xy %s)) (end (xy %s))", m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
FMT_IU( aModuleDrawing->GetStart0() ).c_str(), FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
FMT_IU( aModuleDrawing->GetEnd0() ).c_str() ); FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
break; break;
case S_ARC: // Arc case S_ARC: // Arc
m_out->Print( aNestLevel, "(fp_arc (start (xy %s)) (end (xy %s)) (angle %s)", m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
FMT_IU( aModuleDrawing->GetStart0() ).c_str(), FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
FMT_IU( aModuleDrawing->GetEnd0() ).c_str(), FMT_IU( aModuleDrawing->GetEnd0() ).c_str(),
FMT_ANGLE( aModuleDrawing->GetAngle() ).c_str() ); FMT_ANGLE( aModuleDrawing->GetAngle() ).c_str() );
...@@ -722,7 +725,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const ...@@ -722,7 +725,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
switch( aPad->GetShape() ) switch( aPad->GetShape() )
{ {
case PAD_CIRCLE: shape = "circle"; break; case PAD_CIRCLE: shape = "circle"; break;
case PAD_RECT: shape = "rectangle"; break; case PAD_RECT: shape = "rect"; break;
case PAD_OVAL: shape = "oval"; break; case PAD_OVAL: shape = "oval"; break;
case PAD_TRAPEZOID: shape = "trapezoid"; break; case PAD_TRAPEZOID: shape = "trapezoid"; break;
...@@ -744,27 +747,25 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const ...@@ -744,27 +747,25 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
aPad->GetAttribute() ) ); aPad->GetAttribute() ) );
} }
m_out->Print( aNestLevel, "(pad %s %s %s (size %s)", m_out->Print( aNestLevel, "(pad %s %s %s",
m_out->Quotew( aPad->GetPadName() ).c_str(), m_out->Quotew( aPad->GetPadName() ).c_str(),
type.c_str(), shape.c_str(), type.c_str(), shape.c_str() );
FMT_IU( aPad->GetSize() ).c_str() ); m_out->Print( 0, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
m_out->Print( aNestLevel+1, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
if( aPad->GetOrientation() != 0.0 ) if( aPad->GetOrientation() != 0.0 )
m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() ); m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() );
m_out->Print( 0, ")" ); m_out->Print( 0, ")" );
m_out->Print( 0, " (size %s)", FMT_IU( aPad->GetSize() ).c_str() );
if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) ) if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() ); m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() );
m_out->Print( 0, "\n" );
wxSize sz = aPad->GetDrillSize(); wxSize sz = aPad->GetDrillSize();
if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ) if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) )
{ {
m_out->Print( aNestLevel+1, "(drill" ); m_out->Print( 0, " (drill" );
if( aPad->GetDrillShape() == PAD_OVAL ) if( aPad->GetDrillShape() == PAD_OVAL )
m_out->Print( 0, " oval" ); m_out->Print( 0, " oval" );
...@@ -775,9 +776,10 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const ...@@ -775,9 +776,10 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
if( (aPad->GetOffset().x != 0) || (aPad->GetOffset().y != 0) ) if( (aPad->GetOffset().x != 0) || (aPad->GetOffset().y != 0) )
m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() ); m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
m_out->Print( 0, ")\n" ); m_out->Print( 0, ")" );
} }
m_out->Print( 0, "\n" );
m_out->Print( aNestLevel+1, "(layers" ); m_out->Print( aNestLevel+1, "(layers" );
...@@ -787,7 +789,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const ...@@ -787,7 +789,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
{ {
if( layerMask & 1 ) if( layerMask & 1 )
{ {
#if USE_LAYER_NAMES #if 1
m_out->Print( 0, " %s", m_out->Quotew( m_board->GetLayerName( layer ) ).c_str() ); m_out->Print( 0, " %s", m_out->Quotew( m_board->GetLayerName( layer ) ).c_str() );
#else #else
m_out->Print( 0, " %d", layer ); m_out->Print( 0, " %d", layer );
...@@ -838,10 +840,14 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const ...@@ -838,10 +840,14 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
void PCB_IO::format( TEXTE_PCB* aText, int aNestLevel ) const void PCB_IO::format( TEXTE_PCB* aText, int aNestLevel ) const
throw( IO_ERROR ) throw( IO_ERROR )
{ {
m_out->Print( aNestLevel, "(gr_text %s (at %s %s)", m_out->Print( aNestLevel, "(gr_text %s (at %s",
m_out->Quotew( aText->GetText() ).c_str(), m_out->Quotew( aText->GetText() ).c_str(),
FMT_IU( aText->GetPosition() ).c_str(), FMT_IU( aText->GetPosition() ).c_str() );
FMT_ANGLE( aText->GetOrientation() ).c_str() );
if( aText->GetOrientation() != 0.0 )
m_out->Print( 0, " %s", FMT_ANGLE( aText->GetOrientation() ).c_str() );
m_out->Print( 0, ")" );
formatLayer( aText ); formatLayer( aText );
...@@ -875,11 +881,15 @@ void PCB_IO::format( TEXTE_MODULE* aText, int aNestLevel ) const ...@@ -875,11 +881,15 @@ void PCB_IO::format( TEXTE_MODULE* aText, int aNestLevel ) const
if( parent ) if( parent )
orient += parent->GetOrientation(); orient += parent->GetOrientation();
m_out->Print( aNestLevel, "(fp_text %s %s (at %s %s)", m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
m_out->Quotew( type ).c_str(), m_out->Quotew( type ).c_str(),
m_out->Quotew( aText->GetText() ).c_str(), m_out->Quotew( aText->GetText() ).c_str(),
FMT_IU( aText->GetPos0() ).c_str(), FMT_ANGLE( orient ).c_str() ); FMT_IU( aText->GetPos0() ).c_str() );
if( orient != 0.0 )
m_out->Print( 0, " %s", FMT_ANGLE( orient ).c_str() );
m_out->Print( 0, ")" );
formatLayer( aText ); formatLayer( aText );
if( !aText->IsVisible() ) if( !aText->IsVisible() )
...@@ -898,7 +908,6 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const ...@@ -898,7 +908,6 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
{ {
if( aTrack->Type() == PCB_VIA_T ) if( aTrack->Type() == PCB_VIA_T )
{ {
std::string type;
int layer1, layer2; int layer1, layer2;
SEGVIA* via = (SEGVIA*) aTrack; SEGVIA* via = (SEGVIA*) aTrack;
...@@ -907,25 +916,35 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const ...@@ -907,25 +916,35 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText() + wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText() +
wxT( " has no parent." ) ); wxT( " has no parent." ) );
m_out->Print( aNestLevel, "(via" );
via->ReturnLayerPair( &layer1, &layer2 ); via->ReturnLayerPair( &layer1, &layer2 );
switch( aTrack->GetShape() ) switch( aTrack->GetShape() )
{ {
case VIA_THROUGH: type = "thru"; break; case VIA_THROUGH: // Default shape not saved.
case VIA_BLIND_BURIED: type = "blind"; break; break;
case VIA_MICROVIA: type = "micro"; break;
case VIA_BLIND_BURIED:
m_out->Print( 0, " blind" );
break;
case VIA_MICROVIA:
m_out->Print( 0, " micro" );
break;
default: default:
THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), aTrack->GetShape() ) ); THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), aTrack->GetShape() ) );
} }
m_out->Print( aNestLevel, "(via %s (at %s) (size %s)", type.c_str(), m_out->Print( 0, " (at %s) (size %s)",
FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetStart() ).c_str(),
FMT_IU( aTrack->GetWidth() ).c_str() ); FMT_IU( aTrack->GetWidth() ).c_str() );
if( aTrack->GetDrill() != UNDEFINED_DRILL_DIAMETER ) if( aTrack->GetDrill() != UNDEFINED_DRILL_DIAMETER )
m_out->Print( 0, " (drill %s)", FMT_IU( aTrack->GetDrill() ).c_str() ); m_out->Print( 0, " (drill %s)", FMT_IU( aTrack->GetDrill() ).c_str() );
#if USE_LAYER_NAMES #if 1
m_out->Print( 0, " (layers %s %s)", m_out->Print( 0, " (layers %s %s)",
m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(), m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() ); m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
...@@ -939,7 +958,7 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const ...@@ -939,7 +958,7 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(), FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
FMT_IU( aTrack->GetWidth() ).c_str() ); FMT_IU( aTrack->GetWidth() ).c_str() );
#if USE_LAYER_NAMES #if 1
m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() ); m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
#else #else
m_out->Print( 0, " (layer %d)", aTrack->GetLayer() ); m_out->Print( 0, " (layer %d)", aTrack->GetLayer() );
...@@ -985,47 +1004,72 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const ...@@ -985,47 +1004,72 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
if( aZone->GetPriority() > 0 ) if( aZone->GetPriority() > 0 )
m_out->Print( aNestLevel+1, " (priority %d)\n", aZone->GetPriority() ); m_out->Print( aNestLevel+1, " (priority %d)\n", aZone->GetPriority() );
// Save pad option and clearance m_out->Print( aNestLevel+1, "(connect_pads" );
std::string padoption;
switch( aZone->GetPadConnection() ) switch( aZone->GetPadConnection() )
{ {
default: default:
case PAD_IN_ZONE: padoption = "yes"; break; case THERMAL_PAD: // Default option not saved or loaded.
case THERMAL_PAD: padoption = "use_thermal"; break; break;
case PAD_NOT_IN_ZONE: padoption = "no"; break;
case PAD_IN_ZONE:
m_out->Print( 0, " yes" );
break;
case PAD_NOT_IN_ZONE:
m_out->Print( 0, " no" );
break;
} }
m_out->Print( aNestLevel+1, "(connect_pads %s (clearance %s))\n", m_out->Print( 0, " (clearance %s))\n",
padoption.c_str(), FMT_IU( aZone->GetZoneClearance() ).c_str() ); FMT_IU( aZone->GetZoneClearance() ).c_str() );
m_out->Print( aNestLevel+1, "(min_thickness %s)\n", m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
FMT_IU( aZone->GetMinThickness() ).c_str() ); FMT_IU( aZone->GetMinThickness() ).c_str() );
m_out->Print( aNestLevel+1, m_out->Print( aNestLevel+1, "(fill" );
"(fill %s (mode %s) (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)\n",
(aZone->IsFilled()) ? "yes" : "no", // Default is not filled.
(aZone->GetFillMode()) ? "segment" : "polygon", if( aZone->IsFilled() )
m_out->Print( 0, " yes" );
// Default is polygon filled.
if( aZone->GetFillMode() )
m_out->Print( 0, " (mode polygon)" );
m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)\n",
aZone->GetArcSegCount(), aZone->GetArcSegCount(),
FMT_IU( aZone->GetThermalReliefGap() ).c_str(), FMT_IU( aZone->GetThermalReliefGap() ).c_str(),
FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() ); FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() );
std::string smoothing; if( aZone->GetCornerSmoothingType() != ZONE_SETTINGS::SMOOTHING_NONE )
switch( aZone->GetCornerSmoothingType() )
{ {
case ZONE_SETTINGS::SMOOTHING_NONE: smoothing = "none"; break; m_out->Print( aNestLevel+1, "(smoothing" );
case ZONE_SETTINGS::SMOOTHING_CHAMFER: smoothing = "chamfer"; break;
case ZONE_SETTINGS::SMOOTHING_FILLET: smoothing = "fillet"; break; switch( aZone->GetCornerSmoothingType() )
default: {
THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ), case ZONE_SETTINGS::SMOOTHING_CHAMFER:
aZone->GetCornerSmoothingType() ) ); m_out->Print( 0, " chamfer" );
break;
case ZONE_SETTINGS::SMOOTHING_FILLET:
m_out->Print( 0, " fillet" );
break;
default:
THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
aZone->GetCornerSmoothingType() ) );
}
if( aZone->GetCornerRadius() != 0 )
m_out->Print( aNestLevel+1, " (radius %s))\n",
FMT_IU( aZone->GetCornerRadius() ).c_str() );
} }
m_out->Print( aNestLevel+1, "(smoothing %s) (radius %s))\n", m_out->Print( 0, ")\n" );
smoothing.c_str(), FMT_IU( aZone->GetCornerRadius() ).c_str() );
const std::vector< CPolyPt >& cv = aZone->m_Poly->corner; const std::vector< CPolyPt >& cv = aZone->m_Poly->corner;
int newLine = 0;
if( cv.size() ) if( cv.size() )
{ {
...@@ -1034,18 +1078,36 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const ...@@ -1034,18 +1078,36 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
for( std::vector< CPolyPt >::const_iterator it = cv.begin(); it != cv.end(); ++it ) for( std::vector< CPolyPt >::const_iterator it = cv.begin(); it != cv.end(); ++it )
{ {
m_out->Print( aNestLevel+3, "(xy %s %s)\n", if( newLine == 0 )
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() ); m_out->Print( aNestLevel+3, "(xy %s %s)",
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
else
m_out->Print( 0, " (xy %s %s)",
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
if( newLine < 4 )
{
newLine += 1;
}
else
{
newLine = 0;
m_out->Print( 0, "\n" );
}
if( it->end_contour ) if( it->end_contour )
{ {
if( newLine != 0 )
m_out->Print( 0, "\n" );
m_out->Print( aNestLevel+2, ")\n" ); m_out->Print( aNestLevel+2, ")\n" );
if( it+1 != cv.end() ) if( it+1 != cv.end() )
{ {
newLine = 0;
m_out->Print( aNestLevel+1, ")\n" ); m_out->Print( aNestLevel+1, ")\n" );
m_out->Print( aNestLevel+1, "(polygon\n" ); m_out->Print( aNestLevel+1, "(polygon\n" );
m_out->Print( aNestLevel+2, "(pts\n" ); m_out->Print( aNestLevel+2, "(pts" );
} }
} }
} }
...@@ -1055,6 +1117,7 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const ...@@ -1055,6 +1117,7 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
// Save the PolysList // Save the PolysList
const std::vector< CPolyPt >& fv = aZone->GetFilledPolysList(); const std::vector< CPolyPt >& fv = aZone->GetFilledPolysList();
newLine = 0;
if( fv.size() ) if( fv.size() )
{ {
...@@ -1063,15 +1126,33 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const ...@@ -1063,15 +1126,33 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
for( std::vector< CPolyPt >::const_iterator it = fv.begin(); it != fv.end(); ++it ) for( std::vector< CPolyPt >::const_iterator it = fv.begin(); it != fv.end(); ++it )
{ {
m_out->Print( aNestLevel+3, "(xy %s %s)\n", if( newLine == 0 )
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() ); m_out->Print( aNestLevel+3, "(xy %s %s)",
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
else
m_out->Print( 0, " (xy %s %s)",
FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
if( newLine < 4 )
{
newLine += 1;
}
else
{
newLine = 0;
m_out->Print( 0, "\n" );
}
if( it->end_contour ) if( it->end_contour )
{ {
if( newLine != 0 )
m_out->Print( 0, "\n" );
m_out->Print( aNestLevel+2, ")\n" ); m_out->Print( aNestLevel+2, ")\n" );
if( it+1 != fv.end() ) if( it+1 != fv.end() )
{ {
newLine = 0;
m_out->Print( aNestLevel+1, ")\n" ); m_out->Print( aNestLevel+1, ")\n" );
m_out->Print( aNestLevel+1, "(filled_polygon\n" ); m_out->Print( aNestLevel+1, "(filled_polygon\n" );
m_out->Print( aNestLevel+2, "(pts\n" ); m_out->Print( aNestLevel+2, "(pts\n" );
......
...@@ -301,6 +301,7 @@ BOARD_ITEM* PCB_PARSER::Parse() throw( IO_ERROR, PARSE_ERROR ) ...@@ -301,6 +301,7 @@ BOARD_ITEM* PCB_PARSER::Parse() throw( IO_ERROR, PARSE_ERROR )
{ {
T token; T token;
BOARD_ITEM* item; BOARD_ITEM* item;
LOCALE_IO toggle; // toggles on, then off, the C locale.
token = NextTok(); token = NextTok();
...@@ -617,19 +618,18 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR ) ...@@ -617,19 +618,18 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
T token; T token;
wxString name; wxString name;
wxString type; wxString type;
int layerIndex;
bool isVisible = true; bool isVisible = true;
int visibleLayers = 0; int visibleLayers = 0;
int enabledLayers = 0; int enabledLayers = 0;
std::vector< LAYER > layers; int copperLayerCount = 0;
for( token = NextTok(); token != T_RIGHT; token = NextTok() ) for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{ {
if( token != T_LEFT ) if( token != T_LEFT )
Expecting( T_LEFT ); Expecting( T_LEFT );
#if !USE_LAYER_NAMES layerIndex = parseInt( "layer index" );
NeedNUMBER( "layer index" );
#endif
NeedSYMBOL(); NeedSYMBOL();
name = FromUTF8(); name = FromUTF8();
...@@ -652,14 +652,20 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR ) ...@@ -652,14 +652,20 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
Expecting( "hide or )" ); Expecting( "hide or )" );
} }
layers.push_back( LAYER( name, LAYER::ParseType( TO_UTF8( type ) ), isVisible ) ); enabledLayers |= 1 << layerIndex;
}
int copperLayerCount = 0; if( isVisible )
visibleLayers |= 1 << layerIndex;
for( unsigned i = 0; i < layers.size(); i++ ) enum LAYER_T layerType = LAYER::ParseType( TO_UTF8( type ) );
{ LAYER layer( name, layerType, isVisible );
if( layers[i].m_Type != LT_UNDEFINED ) layer.SetFixedListIndex( layerIndex );
m_board->SetLayer( layerIndex, layer );
m_layerMap[ name ] = layerIndex;
wxLogDebug( wxT( "Mapping layer %s index index %d" ),
GetChars( name ), layerIndex );
if( layerType != LT_UNDEFINED )
copperLayerCount++; copperLayerCount++;
} }
...@@ -667,54 +673,11 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR ) ...@@ -667,54 +673,11 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
if( (copperLayerCount < 2) || ((copperLayerCount % 2) != 0) ) if( (copperLayerCount < 2) || ((copperLayerCount % 2) != 0) )
{ {
wxString err; wxString err;
err.Printf( _( "%d is not a valid layer count" ), layers.size() ); err.Printf( _( "%d is not a valid layer count" ), copperLayerCount );
THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() ); THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
} }
m_board->SetCopperLayerCount( copperLayerCount ); m_board->SetCopperLayerCount( copperLayerCount );
// Copper layers are sequential from front to back in the file but the current layer
// design uses sequential layers from back to front except for the front layer which
// is always vector index 15.
for( unsigned i = 0; i < layers.size(); i++ )
{
int layerIndex = i;
// The copper layers can have different names but they always are at the beginning
// and have a valid layer type. Non-copper layer name cannot be changed so the
// list index can be looked up by name.
if( layers[i].m_Type != LT_UNDEFINED )
{
if( i == 0 )
layerIndex = LAYER_N_FRONT;
else
layerIndex = copperLayerCount - 1 - i;
}
else
{
layerIndex = LAYER::GetDefaultIndex( layers[i].m_Name );
if( layerIndex == UNDEFINED_LAYER )
{
wxString error;
error.Printf( _( "Cannot determine fixed layer list index of layer name \"%s\"" ),
GetChars( layers[i].m_Name ) );
THROW_IO_ERROR( error );
}
}
enabledLayers |= 1 << layerIndex;
if( layers[i].IsVisible() )
visibleLayers |= 1 << layerIndex;
layers[i].SetFixedListIndex( layerIndex );
m_board->SetLayer( layerIndex, layers[i] );
m_layerMap[ layers[i].m_Name ] = layerIndex;
wxLogDebug( wxT( "Mapping layer %s index index %d" ),
GetChars( layers[i].m_Name ), layerIndex );
}
m_board->SetVisibleLayers( visibleLayers ); m_board->SetVisibleLayers( visibleLayers );
m_board->SetEnabledLayers( enabledLayers ); m_board->SetEnabledLayers( enabledLayers );
} }
...@@ -1119,7 +1082,7 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1119,7 +1082,7 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as DRAWSEGMENT." ) ); wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as DRAWSEGMENT." ) );
T token; T token;
wxPoint pt;
auto_ptr< DRAWSEGMENT > segment( new DRAWSEGMENT( NULL ) ); auto_ptr< DRAWSEGMENT > segment( new DRAWSEGMENT( NULL ) );
switch( CurTok() ) switch( CurTok() )
...@@ -1132,7 +1095,9 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1132,7 +1095,9 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
if( token != T_start ) if( token != T_start )
Expecting( T_start ); Expecting( T_start );
segment->SetStart( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
...@@ -1140,14 +1105,9 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1140,14 +1105,9 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
if( token != T_end ) if( token != T_end )
Expecting( T_end ); Expecting( T_end );
segment->SetEnd( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
NeedRIGHT(); pt.y = parseBoardUnits( "Y coordinate" );
token = NextTok(); segment->SetEnd( pt );
if( token != T_angle )
Expecting( T_angle );
segment->SetAngle( parseDouble( "segment angle" ) );
NeedRIGHT(); NeedRIGHT();
break; break;
...@@ -1159,15 +1119,20 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1159,15 +1119,20 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
if( token != T_center ) if( token != T_center )
Expecting( T_center ); Expecting( T_center );
segment->SetStart( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_end ) if( token != T_end )
Expecting( T_end ); Expecting( T_end );
segment->SetEnd( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetEnd( pt );
NeedRIGHT(); NeedRIGHT();
break; break;
...@@ -1191,19 +1156,22 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1191,19 +1156,22 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_pts ) if( token != T_start )
Expecting( T_pts ); Expecting( T_start );
segment->SetStart( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
segment->SetEnd( parseXY() ); pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_angle ) if( token != T_end )
Expecting( T_angle ); Expecting( T_end );
segment->SetAngle( parseDouble( "segment angle" ) * 10.0 ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetEnd( pt );
NeedRIGHT(); NeedRIGHT();
break; break;
...@@ -1238,6 +1206,10 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1238,6 +1206,10 @@ DRAWSEGMENT* PCB_PARSER::parseDRAWSEGMENT() throw( IO_ERROR, PARSE_ERROR )
switch( token ) switch( token )
{ {
case T_angle:
segment->SetAngle( parseDouble( "segment angle" ) * 10.0 );
break;
case T_layer: case T_layer:
segment->SetLayer( parseBoardItemLayer() ); segment->SetLayer( parseBoardItemLayer() );
break; break;
...@@ -1287,8 +1259,19 @@ TEXTE_PCB* PCB_PARSER::parseTEXTE_PCB() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1287,8 +1259,19 @@ TEXTE_PCB* PCB_PARSER::parseTEXTE_PCB() throw( IO_ERROR, PARSE_ERROR )
pt.x = parseBoardUnits( "X coordinate" ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" ); pt.y = parseBoardUnits( "Y coordinate" );
text->SetPosition( pt ); text->SetPosition( pt );
text->SetOrientation( parseDouble( "angle" ) * 10.0 );
NeedRIGHT(); // If there is no orientation defined, then it is the default value of 0 degrees.
token = NextTok();
if( token == T_NUMBER )
{
text->SetOrientation( parseDouble() * 10.0 );
NeedRIGHT();
}
else if( token != T_RIGHT )
{
Unexpected( CurText() );
}
for( token = NextTok(); token != T_RIGHT; token = NextTok() ) for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{ {
...@@ -1725,8 +1708,18 @@ TEXTE_MODULE* PCB_PARSER::parseTEXTE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1725,8 +1708,18 @@ TEXTE_MODULE* PCB_PARSER::parseTEXTE_MODULE() throw( IO_ERROR, PARSE_ERROR )
pt.x = parseBoardUnits( "X coordinate" ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" ); pt.y = parseBoardUnits( "Y coordinate" );
text->SetPos0( pt ); text->SetPos0( pt );
text->SetOrientation( parseDouble( "angle" ) * 10.0 ); token = NextTok();
NeedRIGHT();
// If there is no orientation defined, then it is the default value of 0 degrees.
if( token == T_NUMBER )
{
text->SetOrientation( parseDouble() * 10.0 );
NeedRIGHT();
}
else if( token != T_RIGHT )
{
Unexpected( CurText() );
}
for( token = NextTok(); token != T_RIGHT; token = NextTok() ) for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{ {
...@@ -1763,6 +1756,7 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1763,6 +1756,7 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
CurTok() == T_fp_line || CurTok() == T_fp_poly, NULL, CurTok() == T_fp_line || CurTok() == T_fp_poly, NULL,
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as EDGE_MODULE." ) ); wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as EDGE_MODULE." ) );
wxPoint pt;
T token; T token;
auto_ptr< EDGE_MODULE > segment( new EDGE_MODULE( NULL ) ); auto_ptr< EDGE_MODULE > segment( new EDGE_MODULE( NULL ) );
...@@ -1777,15 +1771,20 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1777,15 +1771,20 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
if( token != T_start ) if( token != T_start )
Expecting( T_start ); Expecting( T_start );
segment->SetStart0( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart0( pt );
NeedRIGHT(); NeedRIGHT();
token = NextTok(); token = NextTok();
if( token != T_end ) if( token != T_end )
Expecting( T_end ); Expecting( T_end );
segment->SetEnd0( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetEnd0( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_angle ) if( token != T_angle )
...@@ -1803,7 +1802,9 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1803,7 +1802,9 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
if( token != T_center ) if( token != T_center )
Expecting( T_center ); Expecting( T_center );
segment->SetStart0( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart0( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
...@@ -1811,7 +1812,9 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1811,7 +1812,9 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
if( token != T_end ) if( token != T_end )
Expecting( T_end ); Expecting( T_end );
segment->SetEnd0( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetEnd0( pt );
NeedRIGHT(); NeedRIGHT();
break; break;
...@@ -1835,11 +1838,23 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1835,11 +1838,23 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
NeedLEFT(); NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_pts ) if( token != T_start )
Expecting( T_pts ); Expecting( T_start );
segment->SetStart0( parseXY() ); pt.x = parseBoardUnits( "X coordinate" );
segment->SetEnd0( parseXY() ); pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart0( pt );
NeedRIGHT();
NeedLEFT();
token = NextTok();
if( token != T_end )
Expecting( T_end );
pt.x = parseBoardUnits( "X coordinate" );
pt.y = parseBoardUnits( "Y coordinate" );
segment->SetEnd0( pt );
NeedRIGHT(); NeedRIGHT();
break; break;
...@@ -1945,7 +1960,7 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR ) ...@@ -1945,7 +1960,7 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR )
pad->SetShape( PAD_CIRCLE ); pad->SetShape( PAD_CIRCLE );
break; break;
case T_rectangle: case T_rect:
pad->SetShape( PAD_RECT ); pad->SetShape( PAD_RECT );
break; break;
...@@ -2203,10 +2218,6 @@ SEGVIA* PCB_PARSER::parseSEGVIA() throw( IO_ERROR, PARSE_ERROR ) ...@@ -2203,10 +2218,6 @@ SEGVIA* PCB_PARSER::parseSEGVIA() throw( IO_ERROR, PARSE_ERROR )
switch( token ) switch( token )
{ {
case T_thru:
via->SetShape( VIA_THROUGH );
break;
case T_blind: case T_blind:
via->SetShape( VIA_BLIND_BURIED ); via->SetShape( VIA_BLIND_BURIED );
break; break;
...@@ -2261,7 +2272,7 @@ SEGVIA* PCB_PARSER::parseSEGVIA() throw( IO_ERROR, PARSE_ERROR ) ...@@ -2261,7 +2272,7 @@ SEGVIA* PCB_PARSER::parseSEGVIA() throw( IO_ERROR, PARSE_ERROR )
break; break;
default: default:
Expecting( "at, size, drill, layers, net, tstamp, or status" ); Expecting( "blind, micro, at, size, drill, layers, net, tstamp, or status" );
} }
} }
...@@ -2339,25 +2350,31 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR ) ...@@ -2339,25 +2350,31 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
break; break;
case T_connect_pads: case T_connect_pads:
token = NextTok(); for( token = NextTok(); token != T_RIGHT; token = NextTok() )
switch( token )
{ {
case T_yes: zone->SetPadConnection( PAD_IN_ZONE ); break; if( token == T_LEFT )
case T_use_thermal: zone->SetPadConnection( THERMAL_PAD ); break; token = NextTok();
case T_no: zone->SetPadConnection( PAD_NOT_IN_ZONE ); break;
default: Expecting( "yes, no, or use_thermal" );
}
NeedLEFT(); switch( token )
token = NextTok(); {
case T_yes:
zone->SetPadConnection( PAD_IN_ZONE );
break;
if( token != T_clearance ) case T_no:
Expecting( T_clearance ); zone->SetPadConnection( PAD_NOT_IN_ZONE );
break;
case T_clearance:
zone->SetZoneClearance( parseBoardUnits( "zone clearance" ) );
NeedRIGHT();
break;
default:
Expecting( "yes, no, or clearance" );
}
}
zone->SetZoneClearance( parseBoardUnits( "zone clearance" ) );
NeedRIGHT();
NeedRIGHT();
break; break;
case T_min_thickness: case T_min_thickness:
...@@ -2366,22 +2383,17 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR ) ...@@ -2366,22 +2383,17 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
break; break;
case T_fill: case T_fill:
token = NextTok();
if( token != T_yes && token != T_no )
Expecting( "yes or no" );
zone->SetIsFilled( token == T_yes );
for( token = NextTok(); token != T_RIGHT; token = NextTok() ) for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{ {
if( token != T_LEFT ) if( token == T_LEFT )
Expecting( T_LEFT ); token = NextTok();
token = NextTok();
switch( token ) switch( token )
{ {
case T_yes:
zone->SetIsFilled( true );
break;
case T_mode: case T_mode:
token = NextTok(); token = NextTok();
......
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