Gerbview: fixed a serious bug when reading GERBER files with no trailing zeros
This commit is contained in:
commit
443534e758
|
@ -555,7 +555,7 @@ void GRResetPenAndBrush( wxDC* DC )
|
|||
* Function GRSetColorPen
|
||||
* sets a pen style, width, color, and alpha into the given device context.
|
||||
*/
|
||||
void GRSetColorPen( wxDC* DC, int Color, int width, int style )
|
||||
void GRSetColorPen( wxDC* DC, int Color, int width, wxPenStyle style )
|
||||
{
|
||||
if( width < 0 )
|
||||
width = 0;
|
||||
|
@ -733,7 +733,7 @@ void GRSDashedLine( EDA_Rect* ClipBox,
|
|||
GRLastMoveToX = x2;
|
||||
GRLastMoveToY = y2;
|
||||
s_DC_lastcolor = -1;
|
||||
GRSetColorPen( DC, Color, width, wxSHORT_DASH );
|
||||
GRSetColorPen( DC, Color, width, wxPENSTYLE_SHORT_DASH );
|
||||
GRSLine( ClipBox, DC, x1, y1, x2, y2, width, Color );
|
||||
s_DC_lastcolor = -1;
|
||||
GRSetColorPen( DC, Color, width );
|
||||
|
@ -748,7 +748,7 @@ void GRSDashedLineTo( EDA_Rect* ClipBox,
|
|||
int Color )
|
||||
{
|
||||
s_DC_lastcolor = -1;
|
||||
GRSetColorPen( DC, Color, width, wxSHORT_DASH );
|
||||
GRSetColorPen( DC, Color, width, wxPENSTYLE_SHORT_DASH );
|
||||
GRSLine( ClipBox, DC, GRLastMoveToX, GRLastMoveToY, x2, y2, width, Color );
|
||||
s_DC_lastcolor = -1;
|
||||
GRSetColorPen( DC, Color, width );
|
||||
|
@ -846,7 +846,7 @@ void GRSMixedLine( EDA_Rect* ClipBox,
|
|||
int width,
|
||||
int Color )
|
||||
{
|
||||
GRSetColorPen( DC, Color, width, wxDOT_DASH );
|
||||
GRSetColorPen( DC, Color, width, wxPENSTYLE_DOT_DASH );
|
||||
GRSLine( ClipBox, DC, x1, y1, x2, y2, width, Color );
|
||||
GRSetColorPen( DC, Color, width );
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ X0Y00100D03*
|
|||
|
||||
G04 Two, with round holes, slightly overlapping, centered at 0.1,0.1 *
|
||||
G54D11*
|
||||
X00100Y00090D03*
|
||||
X100Y90D03*
|
||||
X00100Y00110D03*
|
||||
|
||||
M02*
|
||||
|
|
|
@ -481,9 +481,11 @@ void WinEDA_GerberFrame::Liste_D_Codes( )
|
|||
|
||||
/** function UpdateTitleAndInfo
|
||||
* displays the short filename (if exists) of the selected layer
|
||||
* on the caption of the main gerbview window
|
||||
* and the name of the layer (found in the gerber file: LN <name> command)
|
||||
* in the status bar
|
||||
* on the caption of the main gerbview window
|
||||
* displays image name and the last layer name (found in the gerber file: LN <name> command)
|
||||
* in the status bar
|
||||
* Note layer name can change when reading a gerber file, and the layer name is the last found.
|
||||
* So, show the layer name is not very useful, and can be seen as a debug feature.
|
||||
*/
|
||||
void WinEDA_GerberFrame::UpdateTitleAndInfo()
|
||||
{
|
||||
|
@ -493,24 +495,28 @@ void WinEDA_GerberFrame::UpdateTitleAndInfo()
|
|||
if( gerber == NULL )
|
||||
{
|
||||
text = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
|
||||
SetTitle( text );
|
||||
SetStatusText( wxEmptyString, 0 );
|
||||
m_TextInfo->Clear();
|
||||
SetTitle( text );
|
||||
return;
|
||||
}
|
||||
|
||||
text = _( "File:" );
|
||||
text << wxT( " " ) << gerber->m_FileName;
|
||||
SetTitle( text );
|
||||
|
||||
|
||||
// Display Image Name and Layer Name (from the current gerber data):
|
||||
text.Printf( _("Image name: \"%s\" Layer name \"%s\""),
|
||||
GetChars(gerber->m_ImageName), GetChars(gerber->m_LayerName) );
|
||||
SetStatusText( text, 0 );
|
||||
|
||||
// Display data format like fmt in X3.4Y3.4 or fmt mm X2.3 Y3.5
|
||||
text.Printf(wxT("fmt %s X%d.%d Y%d.%d"),
|
||||
// Display data format like fmt in X3.4Y3.4 no LZ or fmt mm X2.3 Y3.5 no TZ in main toolbar
|
||||
text.Printf(wxT("fmt: %s X%d.%d Y%d.%d no %cZ"),
|
||||
gerber->m_GerbMetric ? wxT("mm") : wxT("in"),
|
||||
gerber->m_FmtLen.x - gerber->m_FmtScale.x, gerber->m_FmtScale.x,
|
||||
gerber->m_FmtLen.y - gerber->m_FmtScale.y, gerber->m_FmtScale.y );
|
||||
gerber->m_FmtLen.y - gerber->m_FmtScale.y, gerber->m_FmtScale.y,
|
||||
gerber->m_NoTrailingZeros ? 'T' : 'L');
|
||||
|
||||
m_TextInfo->SetValue( text );
|
||||
}
|
||||
|
|
|
@ -453,7 +453,7 @@ static void fillArcPOLY( BOARD* aPcb, GERBER_DRAW_ITEM* aGbrItem,
|
|||
wxPoint GERBER::ReadXYCoord( char*& Text )
|
||||
{
|
||||
wxPoint pos = m_CurrentPos;
|
||||
int type_coord = 0, current_coord, nbchar;
|
||||
int type_coord = 0, current_coord, nbdigits;
|
||||
bool is_float = false;
|
||||
char* text;
|
||||
char line[256];
|
||||
|
@ -475,15 +475,16 @@ wxPoint GERBER::ReadXYCoord( char*& Text )
|
|||
type_coord = *Text;
|
||||
Text++;
|
||||
text = line;
|
||||
nbchar = 0;
|
||||
nbdigits = 0;
|
||||
while( IsNumber( *Text ) )
|
||||
{
|
||||
if( *Text == '.' )
|
||||
is_float = true;
|
||||
*(text++) = *(Text++);
|
||||
// count digits only (sign and decimal point are not counted)
|
||||
if( (*Text >= '0') && (*Text <='9') )
|
||||
nbchar++;
|
||||
}
|
||||
nbdigits++;
|
||||
*(text++) = *(Text++);
|
||||
}
|
||||
|
||||
*text = 0;
|
||||
if( is_float )
|
||||
|
@ -495,24 +496,21 @@ wxPoint GERBER::ReadXYCoord( char*& Text )
|
|||
}
|
||||
else
|
||||
{
|
||||
int fmt_scale =
|
||||
(type_coord == 'X') ? m_FmtScale.x : m_FmtScale.y;
|
||||
int fmt_scale = (type_coord == 'X') ? m_FmtScale.x : m_FmtScale.y;
|
||||
if( m_NoTrailingZeros )
|
||||
{
|
||||
int min_digit =
|
||||
(type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y;
|
||||
while( nbchar < min_digit )
|
||||
while( nbdigits < min_digit )
|
||||
{
|
||||
*(text++) = '0';
|
||||
nbchar++;
|
||||
nbdigits++;
|
||||
}
|
||||
|
||||
*text = 0;
|
||||
}
|
||||
current_coord = atoi( line );
|
||||
double real_scale = 1.0;
|
||||
if( fmt_scale < 0 || fmt_scale > 9 )
|
||||
fmt_scale = 4;
|
||||
double scale_list[10] =
|
||||
{
|
||||
10000.0, 1000.0, 100.0, 10.0,
|
||||
|
@ -557,7 +555,7 @@ wxPoint GERBER::ReadIJCoord( char*& Text )
|
|||
{
|
||||
wxPoint pos( 0, 0 );
|
||||
|
||||
int type_coord = 0, current_coord, nbchar;
|
||||
int type_coord = 0, current_coord, nbdigits;
|
||||
bool is_float = false;
|
||||
char* text;
|
||||
char line[256];
|
||||
|
@ -573,14 +571,15 @@ wxPoint GERBER::ReadIJCoord( char*& Text )
|
|||
type_coord = *Text;
|
||||
Text++;
|
||||
text = line;
|
||||
nbchar = 0;
|
||||
nbdigits = 0;
|
||||
while( IsNumber( *Text ) )
|
||||
{
|
||||
if( *Text == '.' )
|
||||
is_float = true;
|
||||
*(text++) = *(Text++);
|
||||
// count digits only (sign and decimal point are not counted)
|
||||
if( (*Text >= '0') && (*Text <='9') )
|
||||
nbchar++;
|
||||
nbdigits++;
|
||||
*(text++) = *(Text++);
|
||||
}
|
||||
|
||||
*text = 0;
|
||||
|
@ -599,10 +598,10 @@ wxPoint GERBER::ReadIJCoord( char*& Text )
|
|||
{
|
||||
int min_digit =
|
||||
(type_coord == 'I') ? m_FmtLen.x : m_FmtLen.y;
|
||||
while( nbchar < min_digit )
|
||||
while( nbdigits < min_digit )
|
||||
{
|
||||
*(text++) = '0';
|
||||
nbchar++;
|
||||
nbdigits++;
|
||||
}
|
||||
|
||||
*text = 0;
|
||||
|
|
|
@ -225,11 +225,20 @@ bool GERBER::ExecuteRS274XCommand( int command,
|
|||
// number of digits after the decimal point
|
||||
m_FmtScale.x = *text - '0';
|
||||
m_FmtLen.x = ctmp + m_FmtScale.x;
|
||||
// m_FmtScale is 0 to 9
|
||||
if( m_FmtScale.x < 0 )
|
||||
m_FmtScale.x = 0;
|
||||
if( m_FmtScale.x > 9 )
|
||||
m_FmtScale.x = 9;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FmtScale.y = *text - '0';
|
||||
m_FmtLen.y = ctmp + m_FmtScale.y;
|
||||
if( m_FmtScale.y < 0 )
|
||||
m_FmtScale.y = 0;
|
||||
if( m_FmtScale.y > 9 )
|
||||
m_FmtScale.y = 9;
|
||||
}
|
||||
text++;
|
||||
}
|
||||
|
@ -285,6 +294,29 @@ bool GERBER::ExecuteRS274XCommand( int command,
|
|||
break;
|
||||
|
||||
case SCALE_FACTOR:
|
||||
m_LayerScale.x = m_LayerScale.y = 1.0;
|
||||
while( *text != '*' )
|
||||
{
|
||||
switch( *text )
|
||||
{
|
||||
case 'A': // A axis scale
|
||||
text++;
|
||||
m_LayerScale.x = ReadDouble( text );
|
||||
break;
|
||||
|
||||
case 'B': // B axis scale
|
||||
text++;
|
||||
m_LayerScale.y = ReadDouble( text );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( m_LayerScale.x != 1.0 || m_LayerScale.y != 1.0 )
|
||||
{
|
||||
msg.Printf( _( "RS274X: FS command: Gerbview uses 1.0 only scale factor") );
|
||||
ReportMessage( msg );
|
||||
}
|
||||
break;
|
||||
|
||||
case IMAGE_JUSTIFY:
|
||||
case IMAGE_ROTATION:
|
||||
case IMAGE_OFFSET:
|
||||
|
@ -292,11 +324,9 @@ bool GERBER::ExecuteRS274XCommand( int command,
|
|||
case KNOCKOUT:
|
||||
case STEP_AND_REPEAT:
|
||||
case ROTATE:
|
||||
{
|
||||
msg.Printf( _( "RS274X: Command \"%c%c\" ignored by Gerbview" ),
|
||||
(command >> 8) & 0xFF, command & 0xFF );
|
||||
ReportMessage( msg );
|
||||
}
|
||||
break;
|
||||
|
||||
case IMAGE_NAME:
|
||||
|
|
|
@ -27,6 +27,8 @@ class EDA_Rect;
|
|||
//wxWidgets 2.8 compatibility
|
||||
#if !wxCHECK_VERSION(2,9,0)
|
||||
#define wxPENSTYLE_SOLID wxSOLID
|
||||
#define wxPENSTYLE_SHORT_DASH wxSHORT_DASH
|
||||
#define wxPENSTYLE_DOT_DASH wxDOT_DASH
|
||||
typedef int wxPenStyle;
|
||||
#endif
|
||||
|
||||
|
@ -51,7 +53,7 @@ class WinEDA_DrawPanel;
|
|||
void GRSetDrawMode( wxDC* DC, int mode );
|
||||
int GRGetDrawMode( wxDC* DC );
|
||||
void GRResetPenAndBrush( wxDC* DC );
|
||||
void GRSetColorPen( wxDC* DC, int Color, int width = 1, int stype = wxSOLID );
|
||||
void GRSetColorPen( wxDC* DC, int Color, int width = 1, wxPenStyle stype = wxPENSTYLE_SOLID );
|
||||
void GRSetBrush( wxDC* DC, int Color, int fill = 0 );
|
||||
|
||||
/** function GRForceBlackPen
|
||||
|
@ -191,7 +193,7 @@ void GRRect( EDA_Rect* ClipBox, wxDC* DC,const EDA_Rect& aRect, int Color );
|
|||
void GRRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1,
|
||||
int x2, int y2, int width, int Color );
|
||||
void GRRectPs( EDA_Rect* aClipBox, wxDC* aDC,const EDA_Rect& aRect,
|
||||
int aWidth, int aColor, int aStyle = wxSOLID );
|
||||
int aWidth, int aColor, wxPenStyle aStyle = wxPENSTYLE_SOLID );
|
||||
|
||||
void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1,
|
||||
int x2, int y2, int width, int Color, int BgColor );
|
||||
|
|
Loading…
Reference in New Issue