Commit 64f12ffe authored by dickelbeck's avatar dickelbeck

gerberview & pcbnew fixes

parent 5e448ec4
...@@ -4,6 +4,21 @@ Started 2007-June-11 ...@@ -4,6 +4,21 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2007-Sep-25 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew
* got rid of reference to global display options DisplayOpt.DisplayZones from
collectors.cpp so collectors.cpp can continue to be used in multiple future
(non-display related) general contexts.
* Moved TYPEZONE to end of AllBoardItems, added GENERAL_COLLECTOR::AllButZones to
provide support of DisplayOpt.DisplayZones.
* Added aHotKeyCode to PcbGeneralLocateAndDisplay()
+ gerbview
* viewer was getting stuck in a loop when loading a bad gerber file. Fixed
the bug, but line 223 through 225 of readgerb.cpp need review.
* beautified a few files with uncrustify, (any I had to look at).
2007-sept-25 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> 2007-sept-25 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================ ================================================================================
+ pcbnew: + pcbnew:
......
/******************************************************/ /******************************************************/
/* Files.cp: Lecture / Sauvegarde des fichiers gerber */ /* Files.cp: Lecture / Sauvegarde des fichiers gerber */
/******************************************************/ /******************************************************/
#include "fctsys.h" #include "fctsys.h"
...@@ -12,27 +12,29 @@ ...@@ -12,27 +12,29 @@
/* Routines locales */ /* Routines locales */
static void LoadDCodeFile(WinEDA_GerberFrame * frame, const wxString & FullFileName, wxDC * DC); static void LoadDCodeFile( WinEDA_GerberFrame* frame, const wxString& FullFileName, wxDC* DC );
/********************************************************/ /********************************************************/
void WinEDA_GerberFrame::Files_io(wxCommandEvent& event) void WinEDA_GerberFrame::Files_io( wxCommandEvent& event )
/********************************************************/ /********************************************************/
/* Gestion generale des commandes de lecture de fichiers /* Gestion generale des commandes de lecture de fichiers
*/ */
{ {
int id = event.GetId(); int id = event.GetId();
wxClientDC dc(DrawPanel);
wxClientDC dc( DrawPanel );
DrawPanel->CursorOff(&dc); DrawPanel->CursorOff( &dc );
switch (id) switch( id )
{ {
case ID_MENU_LOAD_FILE: case ID_MENU_LOAD_FILE:
case ID_LOAD_FILE: case ID_LOAD_FILE:
if ( Clear_Pcb(&dc, TRUE) ) if( Clear_Pcb( &dc, TRUE ) )
{ {
LoadOneGerberFile(wxEmptyString, &dc, 0); LoadOneGerberFile( wxEmptyString, &dc, 0 );
} }
break; break;
...@@ -41,7 +43,7 @@ wxClientDC dc(DrawPanel); ...@@ -41,7 +43,7 @@ wxClientDC dc(DrawPanel);
{ {
int layer = GetScreen()->m_Active_Layer; int layer = GetScreen()->m_Active_Layer;
GetScreen()->m_Active_Layer++; GetScreen()->m_Active_Layer++;
if( ! LoadOneGerberFile(wxEmptyString, &dc, 0) ) if( !LoadOneGerberFile( wxEmptyString, &dc, 0 ) )
GetScreen()->m_Active_Layer = layer; GetScreen()->m_Active_Layer = layer;
SetToolbars(); SetToolbars();
} }
...@@ -49,13 +51,13 @@ wxClientDC dc(DrawPanel); ...@@ -49,13 +51,13 @@ wxClientDC dc(DrawPanel);
case ID_MENU_APPEND_FILE: case ID_MENU_APPEND_FILE:
case ID_APPEND_FILE: case ID_APPEND_FILE:
LoadOneGerberFile(wxEmptyString, &dc, 0); LoadOneGerberFile( wxEmptyString, &dc, 0 );
break; break;
case ID_MENU_NEW_BOARD: case ID_MENU_NEW_BOARD:
case ID_NEW_BOARD: case ID_NEW_BOARD:
Clear_Pcb(&dc, TRUE); Clear_Pcb( &dc, TRUE );
Zoom_Automatique(FALSE); Zoom_Automatique( FALSE );
GetScreen()->SetRefreshReq(); GetScreen()->SetRefreshReq();
break; break;
...@@ -69,63 +71,64 @@ wxClientDC dc(DrawPanel); ...@@ -69,63 +71,64 @@ wxClientDC dc(DrawPanel);
case ID_LOAD_FILE_8: case ID_LOAD_FILE_8:
case ID_LOAD_FILE_9: case ID_LOAD_FILE_9:
case ID_LOAD_FILE_10: case ID_LOAD_FILE_10:
if ( Clear_Pcb(&dc, TRUE) ) if( Clear_Pcb( &dc, TRUE ) )
{ {
LoadOneGerberFile( LoadOneGerberFile(
GetLastProject(id - ID_LOAD_FILE_1).GetData(), GetLastProject( id - ID_LOAD_FILE_1 ).GetData(),
&dc, FALSE); &dc, FALSE );
} }
break; break;
case ID_GERBVIEW_LOAD_DRILL_FILE: case ID_GERBVIEW_LOAD_DRILL_FILE:
DisplayError(this, _("Not yet available...")); DisplayError( this, _( "Not yet available..." ) );
break; break;
case ID_GERBVIEW_LOAD_DCODE_FILE: case ID_GERBVIEW_LOAD_DCODE_FILE:
LoadDCodeFile(this, wxEmptyString, &dc); LoadDCodeFile( this, wxEmptyString, &dc );
break; break;
case ID_SAVE_BOARD: case ID_SAVE_BOARD:
case ID_MENU_SAVE_BOARD: case ID_MENU_SAVE_BOARD:
SaveGerberFile(GetScreen()->m_FileName, &dc); SaveGerberFile( GetScreen()->m_FileName, &dc );
break; break;
case ID_MENU_SAVE_BOARD_AS: case ID_MENU_SAVE_BOARD_AS:
SaveGerberFile(wxEmptyString, &dc); SaveGerberFile( wxEmptyString, &dc );
break; break;
default: default:
DisplayError(this, wxT("File_io Internal Error") ); DisplayError( this, wxT( "File_io Internal Error" ) );
break; break;
} }
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
DrawPanel->CursorOn(&dc); DrawPanel->CursorOn( &dc );
} }
/*******************************************************************************************/ /*******************************************************************************************/
int WinEDA_GerberFrame::LoadOneGerberFile(const wxString & FullFileName, int WinEDA_GerberFrame::LoadOneGerberFile( const wxString& FullFileName,
wxDC * DC, int mode) wxDC* DC, int mode )
/*******************************************************************************************/ /*******************************************************************************************/
/* /*
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s * Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
retourne: * retourne:
0 si fichier non lu ( annulation de commande ... ) * 0 si fichier non lu ( annulation de commande ... )
1 si OK * 1 si OK
*/ */
{ {
wxString filename = FullFileName; wxString filename = FullFileName;
wxString path = wxPathOnly(FullFileName); wxString path = wxPathOnly( FullFileName );
ActiveScreen = GetScreen(); ActiveScreen = GetScreen();
if( filename == wxEmptyString) if( filename == wxEmptyString )
{ {
wxString mask = wxT("*") + g_PhotoFilenameExt; wxString mask = wxT( "*" ) + g_PhotoFilenameExt;
mask += wxT(";*.gbr;*.gbx;*.lgr;*.ger");
filename = EDA_FileSelector(_("Gerber files:"), mask += wxT( ";*.gbr;*.gbx;*.lgr;*.ger" );
filename = EDA_FileSelector( _( "Gerber files:" ),
path, /* Chemin par defaut */ path, /* Chemin par defaut */
wxEmptyString, /* nom fichier par defaut */ wxEmptyString, /* nom fichier par defaut */
g_PhotoFilenameExt, /* extension par defaut */ g_PhotoFilenameExt, /* extension par defaut */
...@@ -134,45 +137,50 @@ wxString path = wxPathOnly(FullFileName); ...@@ -134,45 +137,50 @@ wxString path = wxPathOnly(FullFileName);
0, 0,
FALSE FALSE
); );
if ( filename == wxEmptyString ) return FALSE; if( filename == wxEmptyString )
return FALSE;
} }
GetScreen()->m_FileName = filename; GetScreen()->m_FileName = filename;
wxSetWorkingDirectory(path);
ChangeFileNameExt(filename,g_PenFilenameExt);
if ( Read_GERBER_File(DC, GetScreen()->m_FileName, filename) ) wxSetWorkingDirectory( path );
SetLastProject(GetScreen()->m_FileName);
ChangeFileNameExt( filename, g_PenFilenameExt );
Zoom_Automatique(FALSE); if( Read_GERBER_File( DC, GetScreen()->m_FileName, filename ) )
SetLastProject( GetScreen()->m_FileName );
Zoom_Automatique( FALSE );
GetScreen()->SetRefreshReq(); GetScreen()->SetRefreshReq();
g_SaveTime = time(NULL); g_SaveTime = time( NULL );
return(1); return 1;
} }
/**********************************************************************************************/ /**********************************************************************************************/
static void LoadDCodeFile(WinEDA_GerberFrame * frame, const wxString & FullFileName, wxDC * DC) static void LoadDCodeFile( WinEDA_GerberFrame* frame, const wxString& FullFileName, wxDC* DC )
/**********************************************************************************************/ /**********************************************************************************************/
/* /*
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s * Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
retourne: * retourne:
0 si fichier non lu ( annulation de commande ... ) * 0 si fichier non lu ( annulation de commande ... )
1 si OK * 1 si OK
*/ */
{ {
wxString filename = FullFileName; wxString filename = FullFileName;
ActiveScreen = frame->GetScreen(); ActiveScreen = frame->GetScreen();
if( filename == wxEmptyString) if( filename == wxEmptyString )
{ {
wxString penfilesmask( wxT("*") ); wxString penfilesmask( wxT( "*" ) );
penfilesmask += g_PenFilenameExt; penfilesmask += g_PenFilenameExt;
filename = frame->GetScreen()->m_FileName; filename = frame->GetScreen()->m_FileName;
ChangeFileNameExt(filename,g_PenFilenameExt); ChangeFileNameExt( filename, g_PenFilenameExt );
filename = EDA_FileSelector(_("D codes files:"), filename = EDA_FileSelector( _( "D codes files:" ),
wxEmptyString, /* Chemin par defaut */ wxEmptyString, /* Chemin par defaut */
filename, /* nom fichier par defaut */ filename, /* nom fichier par defaut */
g_PenFilenameExt, /* extension par defaut */ g_PenFilenameExt, /* extension par defaut */
...@@ -181,29 +189,31 @@ wxString filename = FullFileName; ...@@ -181,29 +189,31 @@ wxString filename = FullFileName;
0, 0,
TRUE TRUE
); );
if ( filename == wxEmptyString ) return; if( filename == wxEmptyString )
return;
} }
frame->Read_D_Code_File(filename); frame->Read_D_Code_File( filename );
frame->CopyDCodesSizeToItems(); frame->CopyDCodesSizeToItems();
frame->GetScreen()->SetRefreshReq(); frame->GetScreen()->SetRefreshReq();
} }
/*******************************************************************************/ /*******************************************************************************/
bool WinEDA_GerberFrame::SaveGerberFile(const wxString & FullFileName, wxDC * DC) bool WinEDA_GerberFrame::SaveGerberFile( const wxString& FullFileName, wxDC* DC )
/*******************************************************************************/ /*******************************************************************************/
/* Sauvegarde du fichier PCB en format ASCII /* Sauvegarde du fichier PCB en format ASCII
*/ */
{ {
wxString filename = FullFileName; wxString filename = FullFileName;
if( filename == wxEmptyString ) if( filename == wxEmptyString )
{ {
wxString mask( wxT("*")); wxString mask( wxT( "*" ) );
mask += g_PhotoFilenameExt; mask += g_PhotoFilenameExt;
filename = EDA_FileSelector(_("Gerber files:"), filename = EDA_FileSelector( _( "Gerber files:" ),
wxEmptyString, /* Chemin par defaut */ wxEmptyString, /* Chemin par defaut */
GetScreen()->m_FileName, /* nom fichier par defaut */ GetScreen()->m_FileName, /* nom fichier par defaut */
g_PhotoFilenameExt, /* extension par defaut */ g_PhotoFilenameExt, /* extension par defaut */
...@@ -212,7 +222,8 @@ wxString filename = FullFileName; ...@@ -212,7 +222,8 @@ wxString filename = FullFileName;
wxFD_SAVE, wxFD_SAVE,
FALSE FALSE
); );
if ( filename.IsEmpty() ) return FALSE; if( filename.IsEmpty() )
return FALSE;
} }
GetScreen()->m_FileName = filename; GetScreen()->m_FileName = filename;
...@@ -221,6 +232,3 @@ wxString filename = FullFileName; ...@@ -221,6 +232,3 @@ wxString filename = FullFileName;
return TRUE; return TRUE;
} }
/********************************************************/ /********************************************************/
/**** Routine de lecture et visu d'un fichier GERBER ****/ /**** Routine de lecture et visu d'un fichier GERBER ****/
/********************************************************/ /********************************************************/
#include "fctsys.h" #include "fctsys.h"
...@@ -11,57 +11,57 @@ ...@@ -11,57 +11,57 @@
#include "protos.h" #include "protos.h"
/* Format Gerber : NOTES : /* Format Gerber : NOTES :
Fonctions preparatoires: * Fonctions preparatoires:
Gn = * Gn =
G01 interpolation lineaire ( trace de droites ) * G01 interpolation lineaire ( trace de droites )
G02,G20,G21 Interpolation circulaire , sens trigo < 0 * G02,G20,G21 Interpolation circulaire , sens trigo < 0
G03,G30,G31 Interpolation circulaire , sens trigo > 0 * G03,G30,G31 Interpolation circulaire , sens trigo > 0
G04 commentaire * G04 commentaire
G06 Interpolation parabolique * G06 Interpolation parabolique
G07 Interpolation cubique * G07 Interpolation cubique
G10 interpolation lineaire ( echelle 10x ) * G10 interpolation lineaire ( echelle 10x )
G11 interpolation lineaire ( echelle 0.1x ) * G11 interpolation lineaire ( echelle 0.1x )
G12 interpolation lineaire ( echelle 0.01x ) * G12 interpolation lineaire ( echelle 0.01x )
G52 plot symbole reference par Dnn code * G52 plot symbole reference par Dnn code
G53 plot symbole reference par Dnn ; symbole tourne de -90 degres * G53 plot symbole reference par Dnn ; symbole tourne de -90 degres
G54 Selection d'outil * G54 Selection d'outil
G55 Mode exposition photo * G55 Mode exposition photo
G56 plot symbole reference par Dnn A code * G56 plot symbole reference par Dnn A code
G57 affiche le symbole reference sur la console * G57 affiche le symbole reference sur la console
G58 plot et affiche le symbole reference sur la console * G58 plot et affiche le symbole reference sur la console
G60 interpolation lineaire ( echelle 100x ) * G60 interpolation lineaire ( echelle 100x )
G70 Unites = Inches * G70 Unites = Inches
G71 Unites = Millimetres * G71 Unites = Millimetres
G74 supprime interpolation circulaire sur 360 degre, revient a G01 * G74 supprime interpolation circulaire sur 360 degre, revient a G01
G75 Active interpolation circulaire sur 360 degre * G75 Active interpolation circulaire sur 360 degre
G90 Mode Coordonnees absolues * G90 Mode Coordonnees absolues
G91 Mode Coordonnees Relatives * G91 Mode Coordonnees Relatives
*
Coordonnees X,Y * Coordonnees X,Y
X,Y sont suivies de + ou - et de m+n chiffres (non separes) * X,Y sont suivies de + ou - et de m+n chiffres (non separes)
m = partie entiere * m = partie entiere
n = partie apres la virgule * n = partie apres la virgule
formats classiques : m = 2, n = 3 (format 2.3) * formats classiques : m = 2, n = 3 (format 2.3)
m = 3, n = 4 (format 3.4) * m = 3, n = 4 (format 3.4)
ex: * ex:
G__ X00345Y-06123 D__* * G__ X00345Y-06123 D__*
*
Outils et D_CODES * Outils et D_CODES
numero d'outil ( identification des formes ) * numero d'outil ( identification des formes )
1 a 99 (classique) * 1 a 99 (classique)
1 a 999 * 1 a 999
D_CODES: * D_CODES:
*
D01 ... D9 = codes d'action: * D01 ... D9 = codes d'action:
D01 = activation de lumiere (baisser de plume) lors du déplacement * D01 = activation de lumiere (baisser de plume) lors du déplacement
D02 = extinction de lumiere (lever de plume) lors du déplacement * D02 = extinction de lumiere (lever de plume) lors du déplacement
D03 = Flash * D03 = Flash
D09 = VAPE Flash * D09 = VAPE Flash
D51 = precede par G54 -> Select VAPE * D51 = precede par G54 -> Select VAPE
*
D10 ... D255 = Indentification d'outils ( d'ouvertures ) * D10 ... D255 = Indentification d'outils ( d'ouvertures )
Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H) * Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H)
*/ */
/* Variables locales : */ /* Variables locales : */
...@@ -69,187 +69,200 @@ Outils et D_CODES ...@@ -69,187 +69,200 @@ Outils et D_CODES
/* Routines Locales */ /* Routines Locales */
/* Routine de Lecture d'un fichier de D Codes. /* Routine de Lecture d'un fichier de D Codes.
Accepte format standard ou ALSPCB * Accepte format standard ou ALSPCB
un ';' demarre un commentaire. * un ';' demarre un commentaire.
*
Format Standard: * Format Standard:
tool, Horiz, Vert, drill, vitesse, acc. ,Type ; [DCODE (commentaire)] * tool, Horiz, Vert, drill, vitesse, acc. ,Type ; [DCODE (commentaire)]
ex: 1, 12, 12, 0, 0, 0, 3 ; D10 * ex: 1, 12, 12, 0, 0, 0, 3 ; D10
*
Format ALSPCB: * Format ALSPCB:
Ver , Hor , Type , Tool [,Drill] * Ver , Hor , Type , Tool [,Drill]
ex: 0.012, 0.012, L , D10 * ex: 0.012, 0.012, L , D10
*
Classe les caract en buf_tmp sous forme de tableau de structures D_CODE. * Classe les caract en buf_tmp sous forme de tableau de structures D_CODE.
Retourne: * Retourne:
< 0 si erreur: * < 0 si erreur:
-1 = Fichier non trouve * -1 = Fichier non trouve
-2 = Erreur lecture fichier * -2 = Erreur lecture fichier
Rang de D_code maxi lu ( nbr de dcodes ) * Rang de D_code maxi lu ( nbr de dcodes )
*
*
Representation interne: * Representation interne:
*
Les lignes sont représentées par des TRACKS standards * Les lignes sont représentées par des TRACKS standards
Les Flash sont représentées par des DRAWSEGMENTS * Les Flash sont représentées par des DRAWSEGMENTS
- ronds ou ovales: DRAWSEGMENTS * - ronds ou ovales: DRAWSEGMENTS
- rectangles: DRAWSEGMENTS * - rectangles: DRAWSEGMENTS
la reference aux D-CODES est placée dans le membre m_NetCode * la reference aux D-CODES est placée dans le membre m_NetCode
*/ */
/********************************************************/ /********************************************************/
bool WinEDA_GerberFrame::Read_GERBER_File(wxDC * DC, bool WinEDA_GerberFrame::Read_GERBER_File( wxDC* DC,
const wxString & GERBER_FullFileName, const wxString& GERBER_FullFileName,
const wxString & D_Code_FullFileName) const wxString& D_Code_FullFileName )
/********************************************************/ /********************************************************/
/* Lecture de 1 fichier gerber. /* Lecture de 1 fichier gerber.
Format * Format
Imperial * Imperial
Absolu * Absolu
fin de bloc = * * fin de bloc = *
CrLf apres chaque commande * CrLf apres chaque commande
G codes repetes * G codes repetes
*/ */
{ {
int G_commande = 0, D_commande = 0 ; /* Numero de commande G et D codes */ int G_commande = 0, D_commande = 0; /* Numero de commande G et D codes */
char Line[1024]; // Buffer des lignes du fichier gerber en cours char Line[1024]; // Buffer des lignes du fichier gerber en cours
wxString msg; wxString msg;
char * text; char* text;
int layer = GetScreen()->m_Active_Layer; int layer = GetScreen()->m_Active_Layer;
GERBER_Descr * gerber_layer; GERBER_Descr* gerber_layer;
wxPoint pos; wxPoint pos;
int error = 0; int error = 0;
if ( g_GERBER_Descr_List[layer] == NULL ) if( g_GERBER_Descr_List[layer] == NULL )
{ {
g_GERBER_Descr_List[layer] = new GERBER_Descr(layer); g_GERBER_Descr_List[layer] = new GERBER_Descr( layer );
} }
gerber_layer = g_GERBER_Descr_List[layer]; gerber_layer = g_GERBER_Descr_List[layer];
/* Mise a jour de l'echelle gerber : */ /* Mise a jour de l'echelle gerber : */
gerber_layer->ResetDefaultValues(); gerber_layer->ResetDefaultValues();
/* Lecture du fichier de Trace */ /* Lecture du fichier de Trace */
gerber_layer->m_Current_File = wxFopen(GERBER_FullFileName, wxT("rt") ); gerber_layer->m_Current_File = wxFopen( GERBER_FullFileName, wxT( "rt" ) );
if (gerber_layer->m_Current_File == 0) if( gerber_layer->m_Current_File == 0 )
{ {
msg = _("File ") + GERBER_FullFileName + _(" not found"); msg = _( "File " ) + GERBER_FullFileName + _( " not found" );
DisplayError(this, msg, 10); return FALSE; DisplayError( this, msg, 10 );
return FALSE;
} }
gerber_layer->m_FileName = GERBER_FullFileName; gerber_layer->m_FileName = GERBER_FullFileName;
wxSetWorkingDirectory(wxPathOnly(GERBER_FullFileName)); wxSetWorkingDirectory( wxPathOnly( GERBER_FullFileName ) );
wxBusyCursor show_wait; wxBusyCursor show_wait;
setlocale(LC_NUMERIC, "C"); setlocale( LC_NUMERIC, "C" );
while( TRUE ) while( TRUE )
{ {
if ( fgets(Line,255,gerber_layer->m_Current_File) == NULL ) // E.O.F if( fgets( Line, 255, gerber_layer->m_Current_File ) == NULL ) // E.O.F
{ {
if ( gerber_layer->m_FilesPtr == 0 ) break; if( gerber_layer->m_FilesPtr == 0 )
fclose(gerber_layer->m_Current_File); break;
gerber_layer->m_FilesPtr --;
fclose( gerber_layer->m_Current_File );
gerber_layer->m_FilesPtr--;
gerber_layer->m_Current_File = gerber_layer->m_Current_File =
gerber_layer->m_FilesList[gerber_layer->m_FilesPtr]; gerber_layer->m_FilesList[gerber_layer->m_FilesPtr];
continue; continue;
} }
text = StrPurge(Line);
while ( text && *text ) text = StrPurge( Line );
while( text && *text )
{ {
switch( *text ) switch( *text )
{ {
case ' ': case ' ':
case '\r': case '\r':
case '\n': case '\n':
text ++; text++;
break; break;
case '*': // End commande case '*': // End commande
gerber_layer->m_CommandState = END_BLOCK; gerber_layer->m_CommandState = END_BLOCK;
text ++; text++;
break; break;
case 'M': // End file case 'M': // End file
gerber_layer->m_CommandState = CMD_IDLE; gerber_layer->m_CommandState = CMD_IDLE;
while ( *text ) text ++; while( *text )
text++;
break; break;
case 'G': /* Ligne type Gxx : commande */ case 'G': /* Ligne type Gxx : commande */
G_commande = gerber_layer->ReturnGCodeNumber(text); G_commande = gerber_layer->ReturnGCodeNumber( text );
gerber_layer->Execute_G_Command(text, G_commande); gerber_layer->Execute_G_Command( text, G_commande );
break ; break;
case 'D': /* Ligne type Dxx : Selection d'un outil ou commande si xx = 0..9*/ case 'D': /* Ligne type Dxx : Selection d'un outil ou commande si xx = 0..9*/
D_commande = gerber_layer->ReturnDCodeNumber(text); D_commande = gerber_layer->ReturnDCodeNumber( text );
gerber_layer->Execute_DCODE_Command(this, DC, gerber_layer->Execute_DCODE_Command( this, DC,
text, D_commande); text, D_commande );
break ; break;
case 'X': case 'X':
case 'Y': /* Commande de deplacement ou de Trace */ case 'Y': /* Commande de deplacement ou de Trace */
pos = gerber_layer->ReadXYCoord(text); pos = gerber_layer->ReadXYCoord( text );
if ( *text == '*' ) // command like X12550Y19250* if( *text == '*' ) // command like X12550Y19250*
{ {
gerber_layer->Execute_DCODE_Command(this, DC, text, gerber_layer->Execute_DCODE_Command( this, DC, text,
gerber_layer->m_Last_Pen_Command); gerber_layer->m_Last_Pen_Command );
} }
break; break;
case 'I': case 'I':
case 'J': /* Commande de deplacement ou de Trace */ case 'J': /* Commande de deplacement ou de Trace */
pos = gerber_layer->ReadIJCoord(text); pos = gerber_layer->ReadIJCoord( text );
break; break;
case '%': case '%':
if (gerber_layer->m_CommandState != ENTER_RS274X_CMD ) if( gerber_layer->m_CommandState != ENTER_RS274X_CMD )
{ {
gerber_layer->m_CommandState = ENTER_RS274X_CMD; gerber_layer->m_CommandState = ENTER_RS274X_CMD;
gerber_layer->ReadRS274XCommand(this, DC, Line, text);
if( !gerber_layer->ReadRS274XCommand( this, DC, Line, text ) )
{
error++;
}
} }
else //Error else //Error
{ {
wxBell(); error++; wxBell();
error++;
gerber_layer->m_CommandState = CMD_IDLE; gerber_layer->m_CommandState = CMD_IDLE;
text++; text++;
} }
break; break;
default: default:
text ++; error++; text++;
error++;
break; break;
} // end switch (*text) }
} // end while (text }
} // end while (TRUE) }
if ( error ) if( error )
{ {
msg.Printf( _("%d errors while reading Gerber file [%s]"), msg.Printf( _( "%d errors while reading Gerber file [%s]" ),
error, GERBER_FullFileName.GetData()); error, GERBER_FullFileName.GetData() );
DisplayError(this, msg); DisplayError( this, msg );
} }
fclose(gerber_layer->m_Current_File) ; fclose( gerber_layer->m_Current_File );
setlocale(LC_NUMERIC, ""); setlocale( LC_NUMERIC, "" );
/* Init tableau des DCodes et Lecture fichier DCODES */ /* Init tableau des DCodes et Lecture fichier DCODES */
if ( !gerber_layer->m_As_DCode ) if( !gerber_layer->m_As_DCode )
{ {
wxString DCodeFileName; wxString DCodeFileName;
if( D_Code_FullFileName.IsEmpty()) if( D_Code_FullFileName.IsEmpty() )
{ {
wxString mask; wxString mask;
DCodeFileName = GERBER_FullFileName; DCodeFileName = GERBER_FullFileName;
ChangeFileNameExt(DCodeFileName, g_PenFilenameExt); ChangeFileNameExt( DCodeFileName, g_PenFilenameExt );
mask = wxT("*") + g_PenFilenameExt; mask = wxT( "*" ) + g_PenFilenameExt;
DCodeFileName = EDA_FileSelector( _("D codes files:"), DCodeFileName = EDA_FileSelector( _( "D codes files:" ),
wxEmptyString, /* Chemin par defaut */ wxEmptyString, /* Chemin par defaut */
DCodeFileName, /* nom fichier par defaut */ DCodeFileName, /* nom fichier par defaut */
g_PenFilenameExt, /* extension par defaut */ g_PenFilenameExt, /* extension par defaut */
...@@ -259,18 +272,15 @@ wxBusyCursor show_wait; ...@@ -259,18 +272,15 @@ wxBusyCursor show_wait;
TRUE TRUE
); );
} }
else DCodeFileName = D_Code_FullFileName; else
DCodeFileName = D_Code_FullFileName;
if ( ! DCodeFileName.IsEmpty() ) if( !DCodeFileName.IsEmpty() )
{ {
Read_D_Code_File(DCodeFileName); Read_D_Code_File( DCodeFileName );
CopyDCodesSizeToItems(); CopyDCodesSizeToItems();
} }
} }
return TRUE; return TRUE;
} }
/********************************************************/ /********************************************************/
/* Routine de lecture d'un fichier GERBER format RS274X */ /* Routine de lecture d'un fichier GERBER format RS274X */
/********************************************************/ /********************************************************/
#include "fctsys.h" #include "fctsys.h"
...@@ -10,134 +10,146 @@ ...@@ -10,134 +10,146 @@
#include "protos.h" #include "protos.h"
#define IsNumber(x) ( ( ((x) >= '0') && ((x) <='9') ) ||\ #define IsNumber( x ) ( ( ( (x) >= '0' ) && ( (x) <='9' ) ) \
((x) == '-') || ((x) == '+') || ((x) == '.') || ((x) == ',')) || ( (x) == '-' ) || ( (x) == '+' ) || ( (x) == '.' ) || ( (x) == ',' ) )
#define CODE(x,y) ((x<<8) + (y)) #define CODE( x, y ) ( (x << 8) + (y) )
enum rs274x_parameters enum rs274x_parameters {
{ FORMAT_STATEMENT_COMMAND = CODE( 'F', 'S' ),
FORMAT_STATEMENT_COMMAND = CODE('F','S'), AXIS_SELECT = CODE( 'A', 'S' ),
AXIS_SELECT = CODE('A','S'), MIRROR_IMAGE = CODE( 'M', 'I' ),
MIRROR_IMAGE = CODE('M','I'), MODE_OF_UNITS = CODE( 'M', 'O' ),
MODE_OF_UNITS = CODE('M','O'), INCH = CODE( 'I', 'N' ),
INCH = CODE('I','N'), MILLIMETER = CODE( 'M', 'M' ),
MILLIMETER = CODE('M','M'), OFFSET = CODE( 'O', 'F' ),
OFFSET = CODE('O','F'), SCALE_FACTOR = CODE( 'S', 'F' ),
SCALE_FACTOR = CODE('S','F'),
IMAGE_NAME = CODE( 'I', 'N' ),
IMAGE_NAME = CODE('I','N'), IMAGE_JUSTIFY = CODE( 'I', 'J' ),
IMAGE_JUSTIFY = CODE('I','J'), IMAGE_OFFSET = CODE( 'I', 'O' ),
IMAGE_OFFSET = CODE('I','O'), IMAGE_POLARITY = CODE( 'I', 'P' ),
IMAGE_POLARITY = CODE('I','P'), IMAGE_ROTATION = CODE( 'I', 'R' ),
IMAGE_ROTATION = CODE('I','R'), PLOTTER_FILM = CODE( 'P', 'M' ),
PLOTTER_FILM = CODE('P','M'), INCLUDE_FILE = CODE( 'I', 'F' ),
INCLUDE_FILE = CODE('I','F'),
APERTURE_DESCR = CODE( 'A', 'D' ),
APERTURE_DESCR = CODE('A','D'), APERTURE_MACRO = CODE( 'A', 'M' ),
APERTURE_MACRO = CODE('A','M'), LAYER_NAME = CODE( 'L', 'N' ),
LAYER_NAME = CODE('L','N'), LAYER_POLARITY = CODE( 'L', 'P' ),
LAYER_POLARITY = CODE('L','P'), KNOCKOUT = CODE( 'K', 'O' ),
KNOCKOUT = CODE('K','O'), STEP_AND_REPEAT = CODE( 'S', 'P' ),
STEP_AND_REPEAT = CODE('S','P'), ROTATE = CODE( 'R', 'O' )
ROTATE = CODE('R','O')
}; };
/* Variables locales : */ /* Variables locales : */
/* Routines Locales */ /* Routines Locales */
static bool ReadApertureMacro( char * buff, char * &text, FILE *gerber_file); static bool ReadApertureMacro( char* buff, char*& text, FILE* gerber_file );
/* Lit 2 codes ascii du texte point par text /* Lit 2 codes ascii du texte point par text
retourne le code correspondant ou -1 si erreur * retourne le code correspondant ou -1 si erreur
*/ */
static int ReadXCommand(char * &text) static int ReadXCommand( char*& text )
{ {
int result; int result;
if ( text && *text ) if( text && *text )
{ {
result = (*text) << 8; text ++; result = (*text) << 8; text++;
} }
else return -1; else
if ( text && *text ) return -1;
if( text && *text )
{ {
result += (*text) & 255; text ++; result += (*text) & 255; text++;
} }
else return -1; else
return -1;
return result; return result;
} }
/********************************/ /********************************/
static int ReadInt(char * &text) static int ReadInt( char*& text )
/********************************/ /********************************/
{ {
int nb = 0; int nb = 0;
while( text && *text == ' ' )
text++;
while ( text && *text == ' ' ) text++; // Skip blanks before number // Skip blanks before number
while ( text && *text) while( text && *text )
{ {
if ( (*text >= '0') && (*text <='9') ) if( (*text >= '0') && (*text <='9') )
{ {
nb *= 10; nb += *text & 0x0F; nb *= 10; nb += *text & 0x0F;
text++; text++;
} }
else break; else
break;
} }
return nb; return nb;
} }
/************************************/ /************************************/
static double ReadDouble(char * &text) static double ReadDouble( char*& text )
/************************************/ /************************************/
{ {
double nb = 0.0; double nb = 0.0;
char buf[256], * ptchar; char buf[256], * ptchar;
ptchar = buf; ptchar = buf;
while ( text && *text == ' ' ) text++; // Skip blanks before number while( text && *text == ' ' )
while ( text && *text) text++;
// Skip blanks before number
while( text && *text )
{ {
if ( IsNumber(*text) ) if( IsNumber( *text ) )
{ {
* ptchar = * text; *ptchar = *text;
text++; ptchar ++; text++; ptchar++;
} }
else break; else
break;
} }
*ptchar = 0; *ptchar = 0;
nb = atof(buf); nb = atof( buf );
return nb; return nb;
} }
/****************************************************************************/ /****************************************************************************/
bool GERBER_Descr::ReadRS274XCommand(WinEDA_GerberFrame * frame, wxDC * DC, bool GERBER_Descr::ReadRS274XCommand( WinEDA_GerberFrame* frame, wxDC* DC,
char * buff, char * &text) char* buff, char*& text )
/****************************************************************************/ /****************************************************************************/
/* Lit toutes les commandes RS274X jusqu'a trouver de code de fin % /* Lit toutes les commandes RS274X jusqu'a trouver de code de fin %
appelle ExecuteRS274XCommand() pour chaque commande trouve * appelle ExecuteRS274XCommand() pour chaque commande trouve
*/ */
{ {
int code_command; bool ok = true;
bool eof = FALSE; int code_command;
text++; text++;
do for(;;)
{ {
while ( *text ) while( *text )
{ {
switch( *text ) switch( *text )
{ {
case '%': // End commande case '%': // End commande
text ++; text++;
m_CommandState = CMD_IDLE; m_CommandState = CMD_IDLE;
return TRUE; goto exit; // success completion
case ' ': case ' ':
case '\r': case '\r':
...@@ -150,86 +162,102 @@ bool eof = FALSE; ...@@ -150,86 +162,102 @@ bool eof = FALSE;
break; break;
default: default:
code_command = ReadXCommand ( text ); code_command = ReadXCommand( text );
ExecuteRS274XCommand(code_command, ok = ExecuteRS274XCommand( code_command, buff, text );
buff, text); if( !ok )
goto exit;
break; break;
} }
} }
// End of current line // End of current line
if ( fgets(buff,255,m_Current_File) == NULL ) eof = TRUE; if( fgets( buff, 255, m_Current_File ) == NULL )
{
ok = false;
break;
}
text = buff; text = buff;
} while( !eof ); }
return FALSE; exit:
return ok;
} }
/*******************************************************************************/ /*******************************************************************************/
bool GERBER_Descr::ExecuteRS274XCommand(int command, char * buff, char * &text) bool GERBER_Descr::ExecuteRS274XCommand( int command, char* buff, char*& text )
/*******************************************************************************/ /*******************************************************************************/
/* Execute 1 commande RS274X /* Execute 1 commande RS274X
*/ */
{ {
int code; int code;
int xy_seq_len, xy_seq_char; int xy_seq_len, xy_seq_char;
char ctmp; char ctmp;
bool ok = TRUE; bool ok = TRUE;
D_CODE * dcode; D_CODE* dcode;
char Line[1024]; char Line[1024];
wxString msg; wxString msg;
double fcoord; double fcoord;
double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT / 25.4 : PCB_INTERNAL_UNIT;
switch( command ) switch( command )
{ {
case FORMAT_STATEMENT_COMMAND: case FORMAT_STATEMENT_COMMAND:
xy_seq_len = 2; xy_seq_len = 2;
while ( *text != '*' )
while( *text != '*' )
{ {
switch ( *text ) switch( *text )
{ {
case ' ': case ' ':
text++; text++;
break; break;
case'L': // No Leading 0
case 'L': // No Leading 0
m_NoTrailingZeros = FALSE; m_NoTrailingZeros = FALSE;
text ++; text++;
break; break;
case'T': // No trailing 0
case 'T': // No trailing 0
m_NoTrailingZeros = TRUE; m_NoTrailingZeros = TRUE;
text ++; text++;
break; break;
case 'A': // Absolute coord case 'A': // Absolute coord
m_Relative = FALSE; text++; m_Relative = FALSE; text++;
break; break;
case 'I': // Absolute coord case 'I': // Absolute coord
m_Relative = TRUE; text++; m_Relative = TRUE; text++;
break; break;
case 'N': // Sequence code (followed by the number of digits for the X,Y command case 'N': // Sequence code (followed by the number of digits for the X,Y command
text++; text++;
xy_seq_char = * text; text++; xy_seq_char = *text; text++;
if ( (xy_seq_char >= '0') && (xy_seq_char <= '9') ) if( (xy_seq_char >= '0') && (xy_seq_char <= '9') )
xy_seq_len = - '0'; xy_seq_len = -'0';
break; break;
case 'X': case 'X':
case 'Y': // Valeurs transmises :2 (really xy_seq_len : FIX ME) digits case 'Y': // Valeurs transmises :2 (really xy_seq_len : FIX ME) digits
code = *(text ++); ctmp = *(text++) - '0'; code = *(text++); ctmp = *(text++) - '0';
if ( code == 'X' ) if( code == 'X' )
{ {
m_FmtScale.x = * text - '0'; // = nb chiffres apres la virgule m_FmtScale.x = *text - '0'; // = nb chiffres apres la virgule
m_FmtLen.x = ctmp + m_FmtScale.x; // = nb total de chiffres m_FmtLen.x = ctmp + m_FmtScale.x; // = nb total de chiffres
} }
else { else
m_FmtScale.y = * text - '0'; {
m_FmtScale.y = *text - '0';
m_FmtLen.y = ctmp + m_FmtScale.y; m_FmtLen.y = ctmp + m_FmtScale.y;
} }
text++; text++;
break; break;
case'*': case '*':
break; break;
default: default:
...@@ -238,6 +266,7 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; ...@@ -238,6 +266,7 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
break; break;
} }
} }
break; break;
case AXIS_SELECT: case AXIS_SELECT:
...@@ -246,63 +275,72 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; ...@@ -246,63 +275,72 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
break; break;
case MODE_OF_UNITS: case MODE_OF_UNITS:
code = ReadXCommand ( text ); code = ReadXCommand( text );
if ( code == INCH ) m_GerbMetric = FALSE; if( code == INCH )
else if ( code == MILLIMETER ) m_GerbMetric = TRUE; m_GerbMetric = FALSE;
conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; else if( code == MILLIMETER )
m_GerbMetric = TRUE;
conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT / 25.4 : PCB_INTERNAL_UNIT;
break; break;
case OFFSET: // command: OFAnnBnn (nn = float number) case OFFSET: // command: OFAnnBnn (nn = float number)
m_Offset.x = m_Offset.y = 0; m_Offset.x = m_Offset.y = 0;
while ( *text != '*' ) while( *text != '*' )
{ {
switch ( *text ) switch( *text )
{ {
case'A': // A axis offset in current unit (inch ou mm) case 'A': // A axis offset in current unit (inch ou mm)
text ++; text++;
fcoord = ReadDouble(text); fcoord = ReadDouble( text );
m_Offset.x = (int) round(fcoord * conv_scale); m_Offset.x = (int) round( fcoord * conv_scale );
break; break;
case'B': // B axis offset in current unit (inch ou mm) case 'B': // B axis offset in current unit (inch ou mm)
text ++; text++;
fcoord = ReadDouble(text); fcoord = ReadDouble( text );
m_Offset.y = (int) round(fcoord * conv_scale); m_Offset.y = (int) round( fcoord * conv_scale );
break; break;
} }
} }
break; break;
case SCALE_FACTOR: case SCALE_FACTOR:
case IMAGE_JUSTIFY: case IMAGE_JUSTIFY:
case IMAGE_ROTATION : case IMAGE_ROTATION:
case IMAGE_OFFSET: case IMAGE_OFFSET:
case PLOTTER_FILM: case PLOTTER_FILM:
case LAYER_NAME: case LAYER_NAME:
case KNOCKOUT: case KNOCKOUT:
case STEP_AND_REPEAT: case STEP_AND_REPEAT:
case ROTATE: case ROTATE:
msg.Printf(_("Command <%c%c> ignored by Gerbview"), msg.Printf( _( "Command <%c%c> ignored by Gerbview" ),
(command>>8) & 0xFF, command & 0xFF); (command >> 8) & 0xFF, command & 0xFF );
if ( g_DebugLevel > 0 )wxMessageBox(msg); if( g_DebugLevel > 0 )
wxMessageBox( msg );
break; break;
case IMAGE_NAME: case IMAGE_NAME:
m_Name.Empty(); m_Name.Empty();
while ( *text != '*' ) while( *text != '*' )
{ {
m_Name.Append(*text); text++; m_Name.Append( *text ); text++;
} }
break; break;
case IMAGE_POLARITY: case IMAGE_POLARITY:
if ( strnicmp(text, "NEG", 3 ) == 0 ) m_ImageNegative = TRUE; if( strnicmp( text, "NEG", 3 ) == 0 )
else m_ImageNegative = FALSE; m_ImageNegative = TRUE;
else
m_ImageNegative = FALSE;
break; break;
case LAYER_POLARITY: case LAYER_POLARITY:
if ( * text == 'C' ) m_LayerNegative = TRUE; if( *text == 'C' )
else m_LayerNegative = FALSE; m_LayerNegative = TRUE;
else
m_LayerNegative = FALSE;
break; break;
case APERTURE_MACRO: case APERTURE_MACRO:
...@@ -310,62 +348,68 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; ...@@ -310,62 +348,68 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
break; break;
case INCLUDE_FILE: case INCLUDE_FILE:
if ( m_FilesPtr >= 10 ) if( m_FilesPtr >= 10 )
{ {
ok = FALSE; ok = FALSE;
DisplayError(NULL, _("Too many include files!!") ); DisplayError( NULL, _( "Too many include files!!" ) );
break; break;
} }
strcpy(Line, text); strcpy( Line, text );
strtok(Line,"*%%\n\r"); strtok( Line, "*%%\n\r" );
m_FilesList[m_FilesPtr] = m_Current_File; m_FilesList[m_FilesPtr] = m_Current_File;
m_Current_File = fopen(Line,"rt"); m_Current_File = fopen( Line, "rt" );
if (m_Current_File == 0) if( m_Current_File == 0 )
{ {
wxString msg; wxString msg;
msg.Printf( wxT("fichier <%s> non trouve"),Line); msg.Printf( wxT( "fichier <%s> non trouve" ), Line );
DisplayError(NULL, msg, 10); DisplayError( NULL, msg, 10 );
ok = FALSE; ok = FALSE;
m_Current_File = m_FilesList[m_FilesPtr]; m_Current_File = m_FilesList[m_FilesPtr];
break; break;
} }
m_FilesPtr ++; m_FilesPtr++;
break; break;
case APERTURE_DESCR: case APERTURE_DESCR:
if ( *text != 'D' ) if( *text != 'D' )
{ {
ok = FALSE; break; ok = FALSE; break;
} }
m_As_DCode = TRUE; m_As_DCode = TRUE;
text++; text++;
code = ReadInt(text); code = ReadInt( text );
ctmp = *text; ctmp = *text;
dcode = ReturnToolDescr(m_Layer, code); dcode = ReturnToolDescr( m_Layer, code );
if ( dcode == NULL ) break; if( dcode == NULL )
if ( text[1] == ',' ) // Tool usuel (C,R,O,P) break;
if( text[1] == ',' ) // Tool usuel (C,R,O,P)
{ {
text += 2; // text pointe size ( 1er modifier) text += 2; // text pointe size ( 1er modifier)
dcode->m_Size.x = dcode->m_Size.y = dcode->m_Size.x = dcode->m_Size.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
switch (ctmp )
switch( ctmp )
{ {
case 'C': // Circle case 'C': // Circle
dcode->m_Shape = GERB_CIRCLE; dcode->m_Shape = GERB_CIRCLE;
while ( * text == ' ' ) text++; while( *text == ' ' )
if ( * text == 'X' ) text++;
if( *text == 'X' )
{ {
text++; text++;
dcode->m_Drill.x = dcode->m_Drill.y = dcode->m_Drill.x = dcode->m_Drill.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
dcode->m_DrillShape = 1; dcode->m_DrillShape = 1;
} }
while ( * text == ' ' ) text++; while( *text == ' ' )
if ( * text == 'X' ) text++;
if( *text == 'X' )
{ {
text++; text++;
dcode->m_Drill.y = dcode->m_Drill.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
dcode->m_DrillShape = 2; dcode->m_DrillShape = 2;
} }
dcode->m_Defined = TRUE; dcode->m_Defined = TRUE;
...@@ -374,27 +418,33 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; ...@@ -374,27 +418,33 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
case 'O': // ovale case 'O': // ovale
case 'R': // rect case 'R': // rect
dcode->m_Shape = (ctmp == 'O') ? GERB_OVALE : GERB_RECT; dcode->m_Shape = (ctmp == 'O') ? GERB_OVALE : GERB_RECT;
while ( * text == ' ' ) text++; while( *text == ' ' )
if ( * text == 'X' ) text++;
if( *text == 'X' )
{ {
text++; text++;
dcode->m_Size.y = dcode->m_Size.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
} }
while ( * text == ' ' ) text++; while( *text == ' ' )
if ( * text == 'X' ) text++;
if( *text == 'X' )
{ {
text++; text++;
dcode->m_Drill.x = dcode->m_Drill.y = dcode->m_Drill.x = dcode->m_Drill.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
dcode->m_DrillShape = 1; dcode->m_DrillShape = 1;
} }
while ( * text == ' ' ) text++; while( *text == ' ' )
if ( * text == 'Y' ) text++;
if( *text == 'Y' )
{ {
text++; text++;
dcode->m_Drill.y = dcode->m_Drill.y =
(int) round(ReadDouble(text) * conv_scale); (int) round( ReadDouble( text ) * conv_scale );
dcode->m_DrillShape = 2; dcode->m_DrillShape = 2;
} }
dcode->m_Defined = TRUE; dcode->m_Defined = TRUE;
...@@ -414,58 +464,67 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT; ...@@ -414,58 +464,67 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
break; break;
} }
GetEndOfBlock( buff, text, m_Current_File ); ok = GetEndOfBlock( buff, text, m_Current_File );
return ok; return ok;
} }
/*****************************************************************/ /*****************************************************************/
bool GetEndOfBlock( char * buff, char * &text, FILE *gerber_file) bool GetEndOfBlock( char* buff, char*& text, FILE* gerber_file )
/*****************************************************************/ /*****************************************************************/
{ {
bool eof = FALSE; for(;;)
{
do { while( (text < buff + 255) && *text )
while ( (text < buff+255) && *text )
{ {
if ( *text == '*' ) return TRUE; if( *text == '*' )
if ( *text == '%' ) return TRUE; return TRUE;
text ++; if( *text == '%' )
return TRUE;
text++;
} }
if ( fgets(buff,255,gerber_file) == NULL ) eof = TRUE;
if( fgets( buff, 255, gerber_file ) == NULL )
break;
text = buff; text = buff;
} while( ! eof); }
return FALSE; return FALSE;
} }
/*******************************************************************/ /*******************************************************************/
bool ReadApertureMacro( char * buff, char * &text, FILE *gerber_file) bool ReadApertureMacro( char* buff, char*& text, FILE* gerber_file )
/*******************************************************************/ /*******************************************************************/
{ {
wxString macro_name; wxString macro_name;
int macro_type = 0; int macro_type = 0;
// Read macro name // Read macro name
while ( (text < buff+255) && *text ) while( (text < buff + 255) && *text )
{ {
if ( *text == '*' ) break; if( *text == '*' )
macro_name.Append(*text); break;
text ++; macro_name.Append( *text );
text++;
} }
if ( g_DebugLevel > 0 ) wxMessageBox(macro_name, wxT("macro name")); if( g_DebugLevel > 0 )
wxMessageBox( macro_name, wxT( "macro name" ) );
text = buff; text = buff;
fgets(buff,255,gerber_file); fgets( buff, 255, gerber_file );
// Read parameters // Read parameters
macro_type = ReadInt(text); macro_type = ReadInt( text );
while ( (text < buff+255) && *text ) while( (text < buff + 255) && *text )
{ {
if ( *text == '*' ) return TRUE; if( *text == '*' )
text ++; return TRUE;
text++;
} }
return FALSE; return FALSE;
} }
...@@ -112,11 +112,11 @@ public: ...@@ -112,11 +112,11 @@ public:
/** /**
* Function Remove * Function Remove
* removes the item at item_position (first position is 0); * removes the item at item_position (first position is 0);
* @param item_position index. * @param ndx The index into the list.
*/ */
void Remove( unsigned int item_position ) void Remove( int ndx )
{ {
m_List.erase( m_List.begin() + item_position ); m_List.erase( m_List.begin() + (unsigned) ndx );
} }
/** /**
......
...@@ -400,8 +400,12 @@ public: ...@@ -400,8 +400,12 @@ public:
* a popup menu is shown which allows the user to pick which item he/she is * a popup menu is shown which allows the user to pick which item he/she is
* interested in. Once an item is chosen, then it is make the "current item" * interested in. Once an item is chosen, then it is make the "current item"
* and the status window is updated to reflect this. * and the status window is updated to reflect this.
*
* @param aHotKeyCode The hotkey which relates to the caller and determines the
* type of search to be performed. If zero, then the mouse tools will be
* tested instead.
*/ */
BOARD_ITEM* PcbGeneralLocateAndDisplay(); BOARD_ITEM* PcbGeneralLocateAndDisplay( int aHotKeyCode = 0 );
BOARD_ITEM* Locate( int typeloc, int LayerSearch ); BOARD_ITEM* Locate( int typeloc, int LayerSearch );
void ProcessItemSelection( wxCommandEvent& event ); void ProcessItemSelection( wxCommandEvent& event );
......
...@@ -38,10 +38,10 @@ const KICAD_T GENERAL_COLLECTOR::AllBoardItems[] = { ...@@ -38,10 +38,10 @@ const KICAD_T GENERAL_COLLECTOR::AllBoardItems[] = {
TYPECOTATION, TYPECOTATION,
TYPEVIA, TYPEVIA,
TYPETRACK, TYPETRACK,
TYPEZONE,
TYPEPAD, TYPEPAD,
TYPETEXTEMODULE, TYPETEXTEMODULE,
TYPEMODULE, TYPEMODULE,
TYPEZONE,
EOT EOT
}; };
...@@ -52,8 +52,19 @@ const KICAD_T GENERAL_COLLECTOR::PrimaryItems[] = { ...@@ -52,8 +52,19 @@ const KICAD_T GENERAL_COLLECTOR::PrimaryItems[] = {
TYPECOTATION, TYPECOTATION,
TYPEVIA, TYPEVIA,
TYPETRACK, TYPETRACK,
// TYPEPAD, TYPEPAD and TYPETEXTEMODULE are handled in a subsearch TYPEMODULE,
// TYPETEXTEMODULE, EOT
};
const KICAD_T GENERAL_COLLECTOR::AllButZones[] = {
TYPETEXTE,
TYPEDRAWSEGMENT,
TYPECOTATION,
TYPEVIA,
TYPETRACK,
TYPEPAD,
TYPETEXTEMODULE,
TYPEMODULE, TYPEMODULE,
EOT EOT
}; };
...@@ -95,7 +106,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -95,7 +106,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
{ {
BOARD_ITEM* item = (BOARD_ITEM*) testItem; BOARD_ITEM* item = (BOARD_ITEM*) testItem;
MODULE* module = NULL; MODULE* module = NULL;
bool skip_item = false;
#if 0 // debugging #if 0 // debugging
static int breakhere = 0; static int breakhere = 0;
...@@ -173,7 +183,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -173,7 +183,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
case TYPETRACK: case TYPETRACK:
break; break;
case TYPEZONE: case TYPEZONE:
if( ! DisplayOpt.DisplayZones ) skip_item = true;
break; break;
case TYPETEXTE: case TYPETEXTE:
break; break;
...@@ -183,7 +192,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -183,7 +192,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
break; break;
case TYPETEXTEMODULE: case TYPETEXTEMODULE:
{
module = (MODULE*) item->GetParent(); module = (MODULE*) item->GetParent();
if( m_Guide->IgnoreMTextsMarkedNoShow() && ((TEXTE_MODULE*)item)->m_NoShow ) if( m_Guide->IgnoreMTextsMarkedNoShow() && ((TEXTE_MODULE*)item)->m_NoShow )
...@@ -197,7 +205,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -197,7 +205,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
if( m_Guide->IgnoreMTextsOnCmp() && module->GetLayer()==LAYER_CMP_N ) if( m_Guide->IgnoreMTextsOnCmp() && module->GetLayer()==LAYER_CMP_N )
goto exit; goto exit;
} }
}
break; break;
case TYPEMODULE: case TYPEMODULE:
...@@ -234,7 +241,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -234,7 +241,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
{ {
if( item->HitTest( m_RefPos ) ) if( item->HitTest( m_RefPos ) )
{ {
if ( ! skip_item ) Append( item ); Append( item );
goto exit; goto exit;
} }
} }
...@@ -261,7 +268,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* ...@@ -261,7 +268,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
{ {
if( item->HitTest( m_RefPos ) ) if( item->HitTest( m_RefPos ) )
{ {
if ( ! skip_item ) Append2nd( item ); Append2nd( item );
goto exit; goto exit;
} }
} }
......
...@@ -147,6 +147,7 @@ public: ...@@ -147,6 +147,7 @@ public:
*/ */
virtual bool IgnoreModulesOnCmp() const = 0; virtual bool IgnoreModulesOnCmp() const = 0;
/** /**
* Function UseHitTesting * Function UseHitTesting
* @return bool - true if Inspect() should use BOARD_ITEM::HitTest() * @return bool - true if Inspect() should use BOARD_ITEM::HitTest()
...@@ -201,6 +202,12 @@ public: ...@@ -201,6 +202,12 @@ public:
static const KICAD_T AllBoardItems[]; static const KICAD_T AllBoardItems[];
/**
* A scan list for all editable board items, except zones
*/
static const KICAD_T AllButZones[];
/** /**
* A scan list for all primary board items, omitting items which are subordinate to * A scan list for all primary board items, omitting items which are subordinate to
* a MODULE, such as D_PAD and TEXTEMODULE. * a MODULE, such as D_PAD and TEXTEMODULE.
......
...@@ -153,9 +153,9 @@ static BOARD_ITEM* AllAreModulesAndReturnSmallestIfSo( GENERAL_COLLECTOR* aColle ...@@ -153,9 +153,9 @@ static BOARD_ITEM* AllAreModulesAndReturnSmallestIfSo( GENERAL_COLLECTOR* aColle
} }
/*************************************************************/ /****************************************************************************/
BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode )
/*************************************************************/ /****************************************************************************/
{ {
BOARD_ITEM* item; BOARD_ITEM* item;
...@@ -166,7 +166,11 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() ...@@ -166,7 +166,11 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
const KICAD_T* scanList; const KICAD_T* scanList;
if( m_ID_current_state == 0 ) if( aHotKeyCode )
{
// switch here
}
else if( m_ID_current_state == 0 )
{ {
switch( m_HTOOL_current_state ) switch( m_HTOOL_current_state )
{ {
...@@ -175,7 +179,9 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() ...@@ -175,7 +179,9 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
break; break;
default: default:
scanList = GENERAL_COLLECTOR::AllBoardItems; scanList = DisplayOpt.DisplayZones ?
GENERAL_COLLECTOR::AllBoardItems :
GENERAL_COLLECTOR::AllButZones;
break; break;
} }
} }
...@@ -196,26 +202,32 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() ...@@ -196,26 +202,32 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
break; break;
default: default:
scanList = GENERAL_COLLECTOR::AllBoardItems; scanList = DisplayOpt.DisplayZones ?
GENERAL_COLLECTOR::AllBoardItems :
GENERAL_COLLECTOR::AllButZones;
} }
} }
m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide ); m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide );
/* debugging: print out the collected items, showing their priority order too. #if 0
* for( unsigned i=0; i<m_Collector->GetCount(); ++i ) // debugging: print out the collected items, showing their priority order too.
* (*m_Collector)[i]->Show( 0, std::cout ); for( unsigned i=0; i<m_Collector->GetCount(); ++i )
*/ (*m_Collector)[i]->Show( 0, std::cout );
#endif
/* Remove redundancies: most of time, zones are found twice, /* Remove redundancies: most of time, zones are found twice,
* because zones are filled twice ( once by by horizontal and once by vertical segments ) * because zones are filled twice ( once by by horizontal and once by vertical segments )
*/ */
unsigned long timestampzone = 0; unsigned long timestampzone = 0;
for( unsigned int ii = 0; ii < m_Collector->GetCount(); ii++ )
int limit = m_Collector->GetCount();
for( int ii = 0; ii < limit; ii++ )
{ {
item = (*m_Collector)[ii]; item = (*m_Collector)[ii];
if( item->Type() != TYPEZONE ) if( item->Type() != TYPEZONE )
continue; continue;
/* Found a TYPE ZONE */ /* Found a TYPE ZONE */
if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found
{ {
...@@ -282,14 +294,6 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() ...@@ -282,14 +294,6 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
} }
return item; return item;
/* old way:
*
* item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer );
* if( item == NULL )
* item = Locate( CURSEUR_OFF_GRILLE, -1 );
* return item;
*/
} }
......
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