Gerbview exporter: fix a wxASSERT.

This commit is contained in:
jean-pierre charras 2018-12-21 13:48:00 +01:00
parent 5f3cbff977
commit 9dedbc74a3
3 changed files with 501 additions and 493 deletions

File diff suppressed because it is too large Load Diff

View File

@ -137,8 +137,11 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent,
}
// Build the layer list; build non copper layers list
for( ; ii < NB_PCB_LAYERS; ++ii )
for( ; ; ++ii )
{
if( GetPCBDefaultLayerName( ii ) == "" ) // End of list
break;
layerList.Add( GetPCBDefaultLayerName( ii ) );
if( ii == aDefaultLayer )
@ -260,17 +263,11 @@ const wxString GetPCBDefaultLayerName( int aLayerId )
case Eco1_User: txt = wxT( "Eco1.User" ); break;
case Eco2_User: txt = wxT( "Eco2.User" ); break;
case Edge_Cuts: txt = wxT( "Edge.Cuts" ); break;
case Margin: txt = wxT( "Margin" ); break;
// Footprint
case F_CrtYd: txt = wxT( "F.CrtYd" ); break;
case B_CrtYd: txt = wxT( "B.CrtYd" ); break;
case F_Fab: txt = wxT( "F.Fab" ); break;
case B_Fab: txt = wxT( "B.Fab" ); break;
// Pcbnew konws some oter layers. But any other layer is not suitable for export.
default:
wxASSERT_MSG( 0, wxT( "aLayerId out of range" ) );
txt = wxT( "BAD INDEX!" ); break;
default: // Sentinel
txt = wxT( "" ); break;
}
return wxString( txt );

View File

@ -46,7 +46,6 @@
// Imported function
extern const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber );
#define TO_PCB_UNIT( x ) ( x / IU_PER_MM)
/* A helper class to export a Gerber set of files to Pcbnew
*/
@ -137,6 +136,15 @@ private:
* Write a very basic header to the board file
*/
void writePcbHeader( LAYER_NUM* aLayerLookUpTable );
/** In Pcbnew files units are mm for coordinates.
* So MapToPcbUnits converts internal gerbview to mm any pcbnew value
* @param aValue is a coordinate value to convert in mm
*/
double MapToPcbUnits( int aValue )
{
return aValue / IU_PER_MM;
}
};
@ -362,11 +370,11 @@ void GBR_TO_PCB_EXPORTER::writeCopperLineItem( wxPoint& aStart, wxPoint& aEnd,
int aWidth, LAYER_NUM aLayer )
{
fprintf( m_fp, "(segment (start %s %s) (end %s %s) (width %s) (layer %s) (net 0))\n",
Double2Str( TO_PCB_UNIT(aStart.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aStart.y) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.y) ).c_str(),
Double2Str( TO_PCB_UNIT( aWidth ) ).c_str(),
Double2Str( MapToPcbUnits(aStart.x) ).c_str(),
Double2Str( MapToPcbUnits(aStart.y) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.x) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.y) ).c_str(),
Double2Str( MapToPcbUnits( aWidth ) ).c_str(),
TO_UTF8( GetPCBDefaultLayerName( aLayer ) ) );
}
@ -447,9 +455,9 @@ void GBR_TO_PCB_EXPORTER::export_flashed_copper_item( GERBER_DRAW_ITEM* aGbrItem
// Layers are Front to Back
fprintf( m_fp, " (via (at %s %s) (size %s)",
Double2Str( TO_PCB_UNIT(via_pos.x) ).c_str(),
Double2Str( TO_PCB_UNIT(via_pos.y) ).c_str(),
Double2Str( TO_PCB_UNIT( width ) ).c_str() );
Double2Str( MapToPcbUnits(via_pos.x) ).c_str(),
Double2Str( MapToPcbUnits(via_pos.y) ).c_str(),
Double2Str( MapToPcbUnits( width ) ).c_str() );
fprintf( m_fp, " (layers %s %s))\n",
TO_UTF8( GetPCBDefaultLayerName( F_Cu ) ),
@ -476,6 +484,9 @@ void GBR_TO_PCB_EXPORTER::writePcbHeader( LAYER_NUM* aLayerLookUpTable )
for( int ii = B_Adhes; ii < PCB_LAYER_ID_COUNT; ii++ )
{
if( GetPCBDefaultLayerName( ii ).IsEmpty() ) // Layer not available for export
continue;
fprintf( m_fp, " (%d %s user)\n", ii, TO_UTF8( GetPCBDefaultLayerName( ii ) ) );
}
@ -489,35 +500,35 @@ void GBR_TO_PCB_EXPORTER::writePcbLineItem( bool aIsArc, wxPoint& aStart, wxPoin
if( aIsArc && ( aAngle == 360.0 || aAngle == 0 ) )
{
fprintf( m_fp, "(gr_circle (center %s %s) (end %s %s)(layer %s) (width %s))\n",
Double2Str( TO_PCB_UNIT(aStart.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aStart.y) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.y) ).c_str(),
Double2Str( MapToPcbUnits(aStart.x) ).c_str(),
Double2Str( MapToPcbUnits(aStart.y) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.x) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.y) ).c_str(),
TO_UTF8( GetPCBDefaultLayerName( aLayer ) ),
Double2Str( TO_PCB_UNIT( aWidth ) ).c_str()
Double2Str( MapToPcbUnits( aWidth ) ).c_str()
);
}
else if( aIsArc )
{
fprintf( m_fp, "(gr_arc (start %s %s) (end %s %s) (angle %s)(layer %s) (width %s))\n",
Double2Str( TO_PCB_UNIT(aStart.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aStart.y) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.y) ).c_str(),
Double2Str( MapToPcbUnits(aStart.x) ).c_str(),
Double2Str( MapToPcbUnits(aStart.y) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.x) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.y) ).c_str(),
Double2Str( aAngle ).c_str(),
TO_UTF8( GetPCBDefaultLayerName( aLayer ) ),
Double2Str( TO_PCB_UNIT( aWidth ) ).c_str()
Double2Str( MapToPcbUnits( aWidth ) ).c_str()
);
}
else
{
fprintf( m_fp, "(gr_line (start %s %s) (end %s %s)(layer %s) (width %s))\n",
Double2Str( TO_PCB_UNIT(aStart.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aStart.y) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.x) ).c_str(),
Double2Str( TO_PCB_UNIT(aEnd.y) ).c_str(),
Double2Str( MapToPcbUnits(aStart.x) ).c_str(),
Double2Str( MapToPcbUnits(aStart.y) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.x) ).c_str(),
Double2Str( MapToPcbUnits(aEnd.y) ).c_str(),
TO_UTF8( GetPCBDefaultLayerName( aLayer ) ),
Double2Str( TO_PCB_UNIT( aWidth ) ).c_str()
Double2Str( MapToPcbUnits( aWidth ) ).c_str()
);
}
}
@ -547,8 +558,8 @@ void GBR_TO_PCB_EXPORTER::writePcbPolygonItem( GERBER_DRAW_ITEM* aGbrItem, LAYER
}
fprintf( m_fp, " (xy %s %s)",
Double2Str( TO_PCB_UNIT( poly.Point( ii ).x ) ).c_str(),
Double2Str( TO_PCB_UNIT( -poly.Point( ii ).y ) ).c_str() );
Double2Str( MapToPcbUnits( poly.Point( ii ).x ) ).c_str(),
Double2Str( MapToPcbUnits( -poly.Point( ii ).y ) ).c_str() );
}
fprintf( m_fp, ")" );