gerberview & pcbnew fixes
This commit is contained in:
parent
5e448ec475
commit
64f12ffe5d
|
@ -4,6 +4,21 @@ Started 2007-June-11
|
|||
Please add newer entries at the top, list the date and your name with
|
||||
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>
|
||||
================================================================================
|
||||
+ pcbnew:
|
||||
|
|
|
@ -18,10 +18,12 @@ static void LoadDCodeFile(WinEDA_GerberFrame * frame, const wxString & FullFileN
|
|||
/********************************************************/
|
||||
void WinEDA_GerberFrame::Files_io( wxCommandEvent& event )
|
||||
/********************************************************/
|
||||
|
||||
/* Gestion generale des commandes de lecture de fichiers
|
||||
*/
|
||||
{
|
||||
int id = event.GetId();
|
||||
|
||||
wxClientDC dc( DrawPanel );
|
||||
|
||||
DrawPanel->CursorOff( &dc );
|
||||
|
@ -104,17 +106,16 @@ wxClientDC dc(DrawPanel);
|
|||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************************/
|
||||
int WinEDA_GerberFrame::LoadOneGerberFile( const wxString& FullFileName,
|
||||
wxDC* DC, int mode )
|
||||
/*******************************************************************************************/
|
||||
|
||||
/*
|
||||
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
|
||||
retourne:
|
||||
0 si fichier non lu ( annulation de commande ... )
|
||||
1 si OK
|
||||
* Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
|
||||
* retourne:
|
||||
* 0 si fichier non lu ( annulation de commande ... )
|
||||
* 1 si OK
|
||||
*/
|
||||
{
|
||||
wxString filename = FullFileName;
|
||||
|
@ -124,7 +125,9 @@ wxString path = wxPathOnly(FullFileName);
|
|||
if( filename == wxEmptyString )
|
||||
{
|
||||
wxString mask = wxT( "*" ) + g_PhotoFilenameExt;
|
||||
|
||||
mask += wxT( ";*.gbr;*.gbx;*.lgr;*.ger" );
|
||||
|
||||
filename = EDA_FileSelector( _( "Gerber files:" ),
|
||||
path, /* Chemin par defaut */
|
||||
wxEmptyString, /* nom fichier par defaut */
|
||||
|
@ -134,11 +137,14 @@ wxString path = wxPathOnly(FullFileName);
|
|||
0,
|
||||
FALSE
|
||||
);
|
||||
if ( filename == wxEmptyString ) return FALSE;
|
||||
if( filename == wxEmptyString )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GetScreen()->m_FileName = filename;
|
||||
|
||||
wxSetWorkingDirectory( path );
|
||||
|
||||
ChangeFileNameExt( filename, g_PenFilenameExt );
|
||||
|
||||
if( Read_GERBER_File( DC, GetScreen()->m_FileName, filename ) )
|
||||
|
@ -148,18 +154,19 @@ wxString path = wxPathOnly(FullFileName);
|
|||
GetScreen()->SetRefreshReq();
|
||||
g_SaveTime = time( NULL );
|
||||
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************************************/
|
||||
static void LoadDCodeFile( WinEDA_GerberFrame* frame, const wxString& FullFileName, wxDC* DC )
|
||||
/**********************************************************************************************/
|
||||
|
||||
/*
|
||||
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
|
||||
retourne:
|
||||
0 si fichier non lu ( annulation de commande ... )
|
||||
1 si OK
|
||||
* Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
|
||||
* retourne:
|
||||
* 0 si fichier non lu ( annulation de commande ... )
|
||||
* 1 si OK
|
||||
*/
|
||||
{
|
||||
wxString filename = FullFileName;
|
||||
|
@ -169,6 +176,7 @@ wxString filename = FullFileName;
|
|||
if( filename == wxEmptyString )
|
||||
{
|
||||
wxString penfilesmask( wxT( "*" ) );
|
||||
|
||||
penfilesmask += g_PenFilenameExt;
|
||||
filename = frame->GetScreen()->m_FileName;
|
||||
ChangeFileNameExt( filename, g_PenFilenameExt );
|
||||
|
@ -181,7 +189,8 @@ wxString filename = FullFileName;
|
|||
0,
|
||||
TRUE
|
||||
);
|
||||
if ( filename == wxEmptyString ) return;
|
||||
if( filename == wxEmptyString )
|
||||
return;
|
||||
}
|
||||
|
||||
frame->Read_D_Code_File( filename );
|
||||
|
@ -190,10 +199,10 @@ wxString filename = FullFileName;
|
|||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool WinEDA_GerberFrame::SaveGerberFile( const wxString& FullFileName, wxDC* DC )
|
||||
/*******************************************************************************/
|
||||
|
||||
/* Sauvegarde du fichier PCB en format ASCII
|
||||
*/
|
||||
{
|
||||
|
@ -202,6 +211,7 @@ wxString filename = FullFileName;
|
|||
if( filename == wxEmptyString )
|
||||
{
|
||||
wxString mask( wxT( "*" ) );
|
||||
|
||||
mask += g_PhotoFilenameExt;
|
||||
filename = EDA_FileSelector( _( "Gerber files:" ),
|
||||
wxEmptyString, /* Chemin par defaut */
|
||||
|
@ -212,7 +222,8 @@ wxString filename = FullFileName;
|
|||
wxFD_SAVE,
|
||||
FALSE
|
||||
);
|
||||
if ( filename.IsEmpty() ) return FALSE;
|
||||
if( filename.IsEmpty() )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GetScreen()->m_FileName = filename;
|
||||
|
@ -221,6 +232,3 @@ wxString filename = FullFileName;
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -11,56 +11,56 @@
|
|||
#include "protos.h"
|
||||
|
||||
/* Format Gerber : NOTES :
|
||||
Fonctions preparatoires:
|
||||
Gn =
|
||||
G01 interpolation lineaire ( trace de droites )
|
||||
G02,G20,G21 Interpolation circulaire , sens trigo < 0
|
||||
G03,G30,G31 Interpolation circulaire , sens trigo > 0
|
||||
G04 commentaire
|
||||
G06 Interpolation parabolique
|
||||
G07 Interpolation cubique
|
||||
G10 interpolation lineaire ( echelle 10x )
|
||||
G11 interpolation lineaire ( echelle 0.1x )
|
||||
G12 interpolation lineaire ( echelle 0.01x )
|
||||
G52 plot symbole reference par Dnn code
|
||||
G53 plot symbole reference par Dnn ; symbole tourne de -90 degres
|
||||
G54 Selection d'outil
|
||||
G55 Mode exposition photo
|
||||
G56 plot symbole reference par Dnn A code
|
||||
G57 affiche le symbole reference sur la console
|
||||
G58 plot et affiche le symbole reference sur la console
|
||||
G60 interpolation lineaire ( echelle 100x )
|
||||
G70 Unites = Inches
|
||||
G71 Unites = Millimetres
|
||||
G74 supprime interpolation circulaire sur 360 degre, revient a G01
|
||||
G75 Active interpolation circulaire sur 360 degre
|
||||
G90 Mode Coordonnees absolues
|
||||
G91 Mode Coordonnees Relatives
|
||||
|
||||
Coordonnees X,Y
|
||||
X,Y sont suivies de + ou - et de m+n chiffres (non separes)
|
||||
m = partie entiere
|
||||
n = partie apres la virgule
|
||||
formats classiques : m = 2, n = 3 (format 2.3)
|
||||
m = 3, n = 4 (format 3.4)
|
||||
ex:
|
||||
G__ X00345Y-06123 D__*
|
||||
|
||||
Outils et D_CODES
|
||||
numero d'outil ( identification des formes )
|
||||
1 a 99 (classique)
|
||||
1 a 999
|
||||
D_CODES:
|
||||
|
||||
D01 ... D9 = codes d'action:
|
||||
D01 = activation de lumiere (baisser de plume) lors du déplacement
|
||||
D02 = extinction de lumiere (lever de plume) lors du déplacement
|
||||
D03 = Flash
|
||||
D09 = VAPE Flash
|
||||
D51 = precede par G54 -> Select VAPE
|
||||
|
||||
D10 ... D255 = Indentification d'outils ( d'ouvertures )
|
||||
Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H)
|
||||
* Fonctions preparatoires:
|
||||
* Gn =
|
||||
* G01 interpolation lineaire ( trace de droites )
|
||||
* G02,G20,G21 Interpolation circulaire , sens trigo < 0
|
||||
* G03,G30,G31 Interpolation circulaire , sens trigo > 0
|
||||
* G04 commentaire
|
||||
* G06 Interpolation parabolique
|
||||
* G07 Interpolation cubique
|
||||
* G10 interpolation lineaire ( echelle 10x )
|
||||
* G11 interpolation lineaire ( echelle 0.1x )
|
||||
* G12 interpolation lineaire ( echelle 0.01x )
|
||||
* G52 plot symbole reference par Dnn code
|
||||
* G53 plot symbole reference par Dnn ; symbole tourne de -90 degres
|
||||
* G54 Selection d'outil
|
||||
* G55 Mode exposition photo
|
||||
* G56 plot symbole reference par Dnn A code
|
||||
* G57 affiche le symbole reference sur la console
|
||||
* G58 plot et affiche le symbole reference sur la console
|
||||
* G60 interpolation lineaire ( echelle 100x )
|
||||
* G70 Unites = Inches
|
||||
* G71 Unites = Millimetres
|
||||
* G74 supprime interpolation circulaire sur 360 degre, revient a G01
|
||||
* G75 Active interpolation circulaire sur 360 degre
|
||||
* G90 Mode Coordonnees absolues
|
||||
* G91 Mode Coordonnees Relatives
|
||||
*
|
||||
* Coordonnees X,Y
|
||||
* X,Y sont suivies de + ou - et de m+n chiffres (non separes)
|
||||
* m = partie entiere
|
||||
* n = partie apres la virgule
|
||||
* formats classiques : m = 2, n = 3 (format 2.3)
|
||||
* m = 3, n = 4 (format 3.4)
|
||||
* ex:
|
||||
* G__ X00345Y-06123 D__*
|
||||
*
|
||||
* Outils et D_CODES
|
||||
* numero d'outil ( identification des formes )
|
||||
* 1 a 99 (classique)
|
||||
* 1 a 999
|
||||
* D_CODES:
|
||||
*
|
||||
* D01 ... D9 = codes d'action:
|
||||
* D01 = activation de lumiere (baisser de plume) lors du déplacement
|
||||
* D02 = extinction de lumiere (lever de plume) lors du déplacement
|
||||
* D03 = Flash
|
||||
* D09 = VAPE Flash
|
||||
* D51 = precede par G54 -> Select VAPE
|
||||
*
|
||||
* D10 ... D255 = Indentification d'outils ( d'ouvertures )
|
||||
* Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H)
|
||||
*/
|
||||
|
||||
|
||||
|
@ -69,34 +69,33 @@ Outils et D_CODES
|
|||
/* Routines Locales */
|
||||
|
||||
|
||||
|
||||
/* Routine de Lecture d'un fichier de D Codes.
|
||||
Accepte format standard ou ALSPCB
|
||||
un ';' demarre un commentaire.
|
||||
|
||||
Format Standard:
|
||||
tool, Horiz, Vert, drill, vitesse, acc. ,Type ; [DCODE (commentaire)]
|
||||
ex: 1, 12, 12, 0, 0, 0, 3 ; D10
|
||||
|
||||
Format ALSPCB:
|
||||
Ver , Hor , Type , Tool [,Drill]
|
||||
ex: 0.012, 0.012, L , D10
|
||||
|
||||
Classe les caract en buf_tmp sous forme de tableau de structures D_CODE.
|
||||
Retourne:
|
||||
< 0 si erreur:
|
||||
-1 = Fichier non trouve
|
||||
-2 = Erreur lecture fichier
|
||||
Rang de D_code maxi lu ( nbr de dcodes )
|
||||
|
||||
|
||||
Representation interne:
|
||||
|
||||
Les lignes sont représentées par des TRACKS standards
|
||||
Les Flash sont représentées par des DRAWSEGMENTS
|
||||
- ronds ou ovales: DRAWSEGMENTS
|
||||
- rectangles: DRAWSEGMENTS
|
||||
la reference aux D-CODES est placée dans le membre m_NetCode
|
||||
* Accepte format standard ou ALSPCB
|
||||
* un ';' demarre un commentaire.
|
||||
*
|
||||
* Format Standard:
|
||||
* tool, Horiz, Vert, drill, vitesse, acc. ,Type ; [DCODE (commentaire)]
|
||||
* ex: 1, 12, 12, 0, 0, 0, 3 ; D10
|
||||
*
|
||||
* Format ALSPCB:
|
||||
* Ver , Hor , Type , Tool [,Drill]
|
||||
* ex: 0.012, 0.012, L , D10
|
||||
*
|
||||
* Classe les caract en buf_tmp sous forme de tableau de structures D_CODE.
|
||||
* Retourne:
|
||||
* < 0 si erreur:
|
||||
* -1 = Fichier non trouve
|
||||
* -2 = Erreur lecture fichier
|
||||
* Rang de D_code maxi lu ( nbr de dcodes )
|
||||
*
|
||||
*
|
||||
* Representation interne:
|
||||
*
|
||||
* Les lignes sont représentées par des TRACKS standards
|
||||
* Les Flash sont représentées par des DRAWSEGMENTS
|
||||
* - ronds ou ovales: DRAWSEGMENTS
|
||||
* - rectangles: DRAWSEGMENTS
|
||||
* la reference aux D-CODES est placée dans le membre m_NetCode
|
||||
*/
|
||||
|
||||
|
||||
|
@ -107,12 +106,12 @@ bool WinEDA_GerberFrame::Read_GERBER_File(wxDC * DC,
|
|||
/********************************************************/
|
||||
|
||||
/* Lecture de 1 fichier gerber.
|
||||
Format
|
||||
Imperial
|
||||
Absolu
|
||||
fin de bloc = *
|
||||
CrLf apres chaque commande
|
||||
G codes repetes
|
||||
* Format
|
||||
* Imperial
|
||||
* Absolu
|
||||
* fin de bloc = *
|
||||
* CrLf apres chaque commande
|
||||
* G codes repetes
|
||||
*/
|
||||
{
|
||||
int G_commande = 0, D_commande = 0; /* Numero de commande G et D codes */
|
||||
|
@ -131,6 +130,7 @@ int error = 0;
|
|||
}
|
||||
|
||||
gerber_layer = g_GERBER_Descr_List[layer];
|
||||
|
||||
/* Mise a jour de l'echelle gerber : */
|
||||
gerber_layer->ResetDefaultValues();
|
||||
|
||||
|
@ -139,7 +139,8 @@ int error = 0;
|
|||
if( gerber_layer->m_Current_File == 0 )
|
||||
{
|
||||
msg = _( "File " ) + GERBER_FullFileName + _( " not found" );
|
||||
DisplayError(this, msg, 10); return FALSE;
|
||||
DisplayError( this, msg, 10 );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gerber_layer->m_FileName = GERBER_FullFileName;
|
||||
|
@ -153,13 +154,18 @@ wxBusyCursor show_wait;
|
|||
{
|
||||
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 )
|
||||
break;
|
||||
|
||||
fclose( gerber_layer->m_Current_File );
|
||||
|
||||
gerber_layer->m_FilesPtr--;
|
||||
gerber_layer->m_Current_File =
|
||||
gerber_layer->m_FilesList[gerber_layer->m_FilesPtr];
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
text = StrPurge( Line );
|
||||
|
||||
while( text && *text )
|
||||
|
@ -179,7 +185,8 @@ wxBusyCursor show_wait;
|
|||
|
||||
case 'M': // End file
|
||||
gerber_layer->m_CommandState = CMD_IDLE;
|
||||
while ( *text ) text ++;
|
||||
while( *text )
|
||||
text++;
|
||||
break;
|
||||
|
||||
case 'G': /* Ligne type Gxx : commande */
|
||||
|
@ -212,22 +219,28 @@ wxBusyCursor show_wait;
|
|||
if( 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
|
||||
{
|
||||
wxBell(); error++;
|
||||
wxBell();
|
||||
error++;
|
||||
gerber_layer->m_CommandState = CMD_IDLE;
|
||||
text++;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
text ++; error++;
|
||||
text++;
|
||||
error++;
|
||||
break;
|
||||
} // end switch (*text)
|
||||
} // end while (text
|
||||
} // end while (TRUE)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( error )
|
||||
{
|
||||
|
@ -259,7 +272,8 @@ wxBusyCursor show_wait;
|
|||
TRUE
|
||||
);
|
||||
}
|
||||
else DCodeFileName = D_Code_FullFileName;
|
||||
else
|
||||
DCodeFileName = D_Code_FullFileName;
|
||||
|
||||
if( !DCodeFileName.IsEmpty() )
|
||||
{
|
||||
|
@ -270,7 +284,3 @@ wxBusyCursor show_wait;
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -10,13 +10,12 @@
|
|||
|
||||
#include "protos.h"
|
||||
|
||||
#define IsNumber(x) ( ( ((x) >= '0') && ((x) <='9') ) ||\
|
||||
((x) == '-') || ((x) == '+') || ((x) == '.') || ((x) == ','))
|
||||
#define IsNumber( x ) ( ( ( (x) >= '0' ) && ( (x) <='9' ) ) \
|
||||
|| ( (x) == '-' ) || ( (x) == '+' ) || ( (x) == '.' ) || ( (x) == ',' ) )
|
||||
|
||||
#define CODE( x, y ) ( (x << 8) + (y) )
|
||||
|
||||
enum rs274x_parameters
|
||||
{
|
||||
enum rs274x_parameters {
|
||||
FORMAT_STATEMENT_COMMAND = CODE( 'F', 'S' ),
|
||||
AXIS_SELECT = CODE( 'A', 'S' ),
|
||||
MIRROR_IMAGE = CODE( 'M', 'I' ),
|
||||
|
@ -41,7 +40,6 @@ enum rs274x_parameters
|
|||
KNOCKOUT = CODE( 'K', 'O' ),
|
||||
STEP_AND_REPEAT = CODE( 'S', 'P' ),
|
||||
ROTATE = CODE( 'R', 'O' )
|
||||
|
||||
};
|
||||
|
||||
/* Variables locales : */
|
||||
|
@ -50,7 +48,7 @@ enum rs274x_parameters
|
|||
static bool ReadApertureMacro( char* buff, char*& text, FILE* gerber_file );
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
|
@ -60,12 +58,14 @@ int result;
|
|||
{
|
||||
result = (*text) << 8; text++;
|
||||
}
|
||||
else return -1;
|
||||
else
|
||||
return -1;
|
||||
if( text && *text )
|
||||
{
|
||||
result += (*text) & 255; text++;
|
||||
}
|
||||
else return -1;
|
||||
else
|
||||
return -1;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,10 @@ static int ReadInt(char * &text)
|
|||
{
|
||||
int nb = 0;
|
||||
|
||||
while ( text && *text == ' ' ) text++; // Skip blanks before number
|
||||
while( text && *text == ' ' )
|
||||
text++;
|
||||
|
||||
// Skip blanks before number
|
||||
|
||||
while( text && *text )
|
||||
{
|
||||
|
@ -85,8 +88,10 @@ int nb = 0;
|
|||
nb *= 10; nb += *text & 0x0F;
|
||||
text++;
|
||||
}
|
||||
else break;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return nb;
|
||||
}
|
||||
|
||||
|
@ -99,7 +104,10 @@ double nb = 0.0;
|
|||
char buf[256], * ptchar;
|
||||
|
||||
ptchar = buf;
|
||||
while ( text && *text == ' ' ) text++; // Skip blanks before number
|
||||
while( text && *text == ' ' )
|
||||
text++;
|
||||
|
||||
// Skip blanks before number
|
||||
while( text && *text )
|
||||
{
|
||||
if( IsNumber( *text ) )
|
||||
|
@ -107,28 +115,32 @@ char buf[256], * ptchar;
|
|||
*ptchar = *text;
|
||||
text++; ptchar++;
|
||||
}
|
||||
else break;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
*ptchar = 0;
|
||||
|
||||
nb = atof( buf );
|
||||
return nb;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
bool GERBER_Descr::ReadRS274XCommand( WinEDA_GerberFrame* frame, wxDC* DC,
|
||||
char* buff, char*& text )
|
||||
/****************************************************************************/
|
||||
|
||||
/* Lit toutes les commandes RS274X jusqu'a trouver de code de fin %
|
||||
appelle ExecuteRS274XCommand() pour chaque commande trouvée
|
||||
* appelle ExecuteRS274XCommand() pour chaque commande trouvée
|
||||
*/
|
||||
{
|
||||
bool ok = true;
|
||||
int code_command;
|
||||
bool eof = FALSE;
|
||||
|
||||
text++;
|
||||
|
||||
do
|
||||
for(;;)
|
||||
{
|
||||
while( *text )
|
||||
{
|
||||
|
@ -137,7 +149,7 @@ bool eof = FALSE;
|
|||
case '%': // End commande
|
||||
text++;
|
||||
m_CommandState = CMD_IDLE;
|
||||
return TRUE;
|
||||
goto exit; // success completion
|
||||
|
||||
case ' ':
|
||||
case '\r':
|
||||
|
@ -151,23 +163,32 @@ bool eof = FALSE;
|
|||
|
||||
default:
|
||||
code_command = ReadXCommand( text );
|
||||
ExecuteRS274XCommand(code_command,
|
||||
buff, text);
|
||||
ok = ExecuteRS274XCommand( code_command, buff, text );
|
||||
if( !ok )
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// End of current line
|
||||
if ( fgets(buff,255,m_Current_File) == NULL ) eof = TRUE;
|
||||
text = buff;
|
||||
} while( !eof );
|
||||
|
||||
return FALSE;
|
||||
// End of current line
|
||||
if( fgets( buff, 255, m_Current_File ) == NULL )
|
||||
{
|
||||
ok = false;
|
||||
break;
|
||||
}
|
||||
|
||||
text = buff;
|
||||
}
|
||||
|
||||
exit:
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool GERBER_Descr::ExecuteRS274XCommand( int command, char* buff, char*& text )
|
||||
/*******************************************************************************/
|
||||
|
||||
/* Execute 1 commande RS274X
|
||||
*/
|
||||
{
|
||||
|
@ -186,6 +207,7 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
{
|
||||
case FORMAT_STATEMENT_COMMAND:
|
||||
xy_seq_len = 2;
|
||||
|
||||
while( *text != '*' )
|
||||
{
|
||||
switch( *text )
|
||||
|
@ -193,20 +215,25 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
case ' ':
|
||||
text++;
|
||||
break;
|
||||
|
||||
case 'L': // No Leading 0
|
||||
m_NoTrailingZeros = FALSE;
|
||||
text++;
|
||||
break;
|
||||
|
||||
case 'T': // No trailing 0
|
||||
m_NoTrailingZeros = TRUE;
|
||||
text++;
|
||||
break;
|
||||
|
||||
case 'A': // Absolute coord
|
||||
m_Relative = FALSE; text++;
|
||||
break;
|
||||
|
||||
case 'I': // Absolute coord
|
||||
m_Relative = TRUE; text++;
|
||||
break;
|
||||
|
||||
case 'N': // Sequence code (followed by the number of digits for the X,Y command
|
||||
text++;
|
||||
xy_seq_char = *text; text++;
|
||||
|
@ -222,7 +249,8 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
m_FmtScale.x = *text - '0'; // = nb chiffres apres la virgule
|
||||
m_FmtLen.x = ctmp + m_FmtScale.x; // = nb total de chiffres
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
m_FmtScale.y = *text - '0';
|
||||
m_FmtLen.y = ctmp + m_FmtScale.y;
|
||||
}
|
||||
|
@ -238,6 +266,7 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case AXIS_SELECT:
|
||||
|
@ -247,8 +276,10 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
|
||||
case MODE_OF_UNITS:
|
||||
code = ReadXCommand( text );
|
||||
if ( code == INCH ) m_GerbMetric = FALSE;
|
||||
else if ( code == MILLIMETER ) m_GerbMetric = TRUE;
|
||||
if( code == INCH )
|
||||
m_GerbMetric = FALSE;
|
||||
else if( code == MILLIMETER )
|
||||
m_GerbMetric = TRUE;
|
||||
conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT / 25.4 : PCB_INTERNAL_UNIT;
|
||||
break;
|
||||
|
||||
|
@ -271,6 +302,7 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SCALE_FACTOR:
|
||||
|
@ -284,7 +316,8 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
case ROTATE:
|
||||
msg.Printf( _( "Command <%c%c> ignored by Gerbview" ),
|
||||
(command >> 8) & 0xFF, command & 0xFF );
|
||||
if ( g_DebugLevel > 0 )wxMessageBox(msg);
|
||||
if( g_DebugLevel > 0 )
|
||||
wxMessageBox( msg );
|
||||
break;
|
||||
|
||||
case IMAGE_NAME:
|
||||
|
@ -293,16 +326,21 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
{
|
||||
m_Name.Append( *text ); text++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case IMAGE_POLARITY:
|
||||
if ( strnicmp(text, "NEG", 3 ) == 0 ) m_ImageNegative = TRUE;
|
||||
else m_ImageNegative = FALSE;
|
||||
if( strnicmp( text, "NEG", 3 ) == 0 )
|
||||
m_ImageNegative = TRUE;
|
||||
else
|
||||
m_ImageNegative = FALSE;
|
||||
break;
|
||||
|
||||
case LAYER_POLARITY:
|
||||
if ( * text == 'C' ) m_LayerNegative = TRUE;
|
||||
else m_LayerNegative = FALSE;
|
||||
if( *text == 'C' )
|
||||
m_LayerNegative = TRUE;
|
||||
else
|
||||
m_LayerNegative = FALSE;
|
||||
break;
|
||||
|
||||
case APERTURE_MACRO:
|
||||
|
@ -342,17 +380,21 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
code = ReadInt( text );
|
||||
ctmp = *text;
|
||||
dcode = ReturnToolDescr( m_Layer, code );
|
||||
if ( dcode == NULL ) break;
|
||||
if( dcode == NULL )
|
||||
break;
|
||||
if( text[1] == ',' ) // Tool usuel (C,R,O,P)
|
||||
{
|
||||
text += 2; // text pointe size ( 1er modifier)
|
||||
dcode->m_Size.x = dcode->m_Size.y =
|
||||
(int) round( ReadDouble( text ) * conv_scale );
|
||||
|
||||
switch( ctmp )
|
||||
{
|
||||
case 'C': // Circle
|
||||
dcode->m_Shape = GERB_CIRCLE;
|
||||
while ( * text == ' ' ) text++;
|
||||
while( *text == ' ' )
|
||||
text++;
|
||||
|
||||
if( *text == 'X' )
|
||||
{
|
||||
text++;
|
||||
|
@ -360,7 +402,9 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
(int) round( ReadDouble( text ) * conv_scale );
|
||||
dcode->m_DrillShape = 1;
|
||||
}
|
||||
while ( * text == ' ' ) text++;
|
||||
while( *text == ' ' )
|
||||
text++;
|
||||
|
||||
if( *text == 'X' )
|
||||
{
|
||||
text++;
|
||||
|
@ -374,14 +418,18 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
case 'O': // ovale
|
||||
case 'R': // rect
|
||||
dcode->m_Shape = (ctmp == 'O') ? GERB_OVALE : GERB_RECT;
|
||||
while ( * text == ' ' ) text++;
|
||||
while( *text == ' ' )
|
||||
text++;
|
||||
|
||||
if( *text == 'X' )
|
||||
{
|
||||
text++;
|
||||
dcode->m_Size.y =
|
||||
(int) round( ReadDouble( text ) * conv_scale );
|
||||
}
|
||||
while ( * text == ' ' ) text++;
|
||||
while( *text == ' ' )
|
||||
text++;
|
||||
|
||||
if( *text == 'X' )
|
||||
{
|
||||
text++;
|
||||
|
@ -389,7 +437,9 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
(int) round( ReadDouble( text ) * conv_scale );
|
||||
dcode->m_DrillShape = 1;
|
||||
}
|
||||
while ( * text == ' ' ) text++;
|
||||
while( *text == ' ' )
|
||||
text++;
|
||||
|
||||
if( *text == 'Y' )
|
||||
{
|
||||
text++;
|
||||
|
@ -414,26 +464,32 @@ double conv_scale = m_GerbMetric ? PCB_INTERNAL_UNIT/25.4 : PCB_INTERNAL_UNIT;
|
|||
break;
|
||||
}
|
||||
|
||||
GetEndOfBlock( buff, text, m_Current_File );
|
||||
ok = GetEndOfBlock( buff, text, m_Current_File );
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************/
|
||||
bool GetEndOfBlock( char* buff, char*& text, FILE* gerber_file )
|
||||
/*****************************************************************/
|
||||
{
|
||||
bool eof = FALSE;
|
||||
|
||||
do {
|
||||
for(;;)
|
||||
{
|
||||
while( (text < buff + 255) && *text )
|
||||
{
|
||||
if ( *text == '*' ) return TRUE;
|
||||
if ( *text == '%' ) return TRUE;
|
||||
if( *text == '*' )
|
||||
return TRUE;
|
||||
if( *text == '%' )
|
||||
return TRUE;
|
||||
text++;
|
||||
}
|
||||
if ( fgets(buff,255,gerber_file) == NULL ) eof = TRUE;
|
||||
|
||||
if( fgets( buff, 255, gerber_file ) == NULL )
|
||||
break;
|
||||
|
||||
text = buff;
|
||||
} while( ! eof);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -449,12 +505,14 @@ int macro_type = 0;
|
|||
// Read macro name
|
||||
while( (text < buff + 255) && *text )
|
||||
{
|
||||
if ( *text == '*' ) break;
|
||||
if( *text == '*' )
|
||||
break;
|
||||
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;
|
||||
fgets( buff, 255, gerber_file );
|
||||
|
||||
|
@ -463,9 +521,10 @@ int macro_type = 0;
|
|||
|
||||
while( (text < buff + 255) && *text )
|
||||
{
|
||||
if ( *text == '*' ) return TRUE;
|
||||
if( *text == '*' )
|
||||
return TRUE;
|
||||
text++;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -112,11 +112,11 @@ public:
|
|||
/**
|
||||
* Function Remove
|
||||
* 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:
|
|||
* 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"
|
||||
* 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 );
|
||||
void ProcessItemSelection( wxCommandEvent& event );
|
||||
|
|
|
@ -38,10 +38,10 @@ const KICAD_T GENERAL_COLLECTOR::AllBoardItems[] = {
|
|||
TYPECOTATION,
|
||||
TYPEVIA,
|
||||
TYPETRACK,
|
||||
TYPEZONE,
|
||||
TYPEPAD,
|
||||
TYPETEXTEMODULE,
|
||||
TYPEMODULE,
|
||||
TYPEZONE,
|
||||
EOT
|
||||
};
|
||||
|
||||
|
@ -52,8 +52,19 @@ const KICAD_T GENERAL_COLLECTOR::PrimaryItems[] = {
|
|||
TYPECOTATION,
|
||||
TYPEVIA,
|
||||
TYPETRACK,
|
||||
// TYPEPAD, TYPEPAD and TYPETEXTEMODULE are handled in a subsearch
|
||||
// TYPETEXTEMODULE,
|
||||
TYPEMODULE,
|
||||
EOT
|
||||
};
|
||||
|
||||
|
||||
const KICAD_T GENERAL_COLLECTOR::AllButZones[] = {
|
||||
TYPETEXTE,
|
||||
TYPEDRAWSEGMENT,
|
||||
TYPECOTATION,
|
||||
TYPEVIA,
|
||||
TYPETRACK,
|
||||
TYPEPAD,
|
||||
TYPETEXTEMODULE,
|
||||
TYPEMODULE,
|
||||
EOT
|
||||
};
|
||||
|
@ -95,7 +106,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
{
|
||||
BOARD_ITEM* item = (BOARD_ITEM*) testItem;
|
||||
MODULE* module = NULL;
|
||||
bool skip_item = false;
|
||||
|
||||
#if 0 // debugging
|
||||
static int breakhere = 0;
|
||||
|
@ -173,7 +183,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
case TYPETRACK:
|
||||
break;
|
||||
case TYPEZONE:
|
||||
if( ! DisplayOpt.DisplayZones ) skip_item = true;
|
||||
break;
|
||||
case TYPETEXTE:
|
||||
break;
|
||||
|
@ -183,7 +192,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
break;
|
||||
|
||||
case TYPETEXTEMODULE:
|
||||
{
|
||||
module = (MODULE*) item->GetParent();
|
||||
|
||||
if( m_Guide->IgnoreMTextsMarkedNoShow() && ((TEXTE_MODULE*)item)->m_NoShow )
|
||||
|
@ -197,7 +205,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
if( m_Guide->IgnoreMTextsOnCmp() && module->GetLayer()==LAYER_CMP_N )
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TYPEMODULE:
|
||||
|
@ -234,7 +241,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
{
|
||||
if( item->HitTest( m_RefPos ) )
|
||||
{
|
||||
if ( ! skip_item ) Append( item );
|
||||
Append( item );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
@ -261,7 +268,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void*
|
|||
{
|
||||
if( item->HitTest( m_RefPos ) )
|
||||
{
|
||||
if ( ! skip_item ) Append2nd( item );
|
||||
Append2nd( item );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,6 +147,7 @@ public:
|
|||
*/
|
||||
virtual bool IgnoreModulesOnCmp() const = 0;
|
||||
|
||||
|
||||
/**
|
||||
* Function UseHitTesting
|
||||
* @return bool - true if Inspect() should use BOARD_ITEM::HitTest()
|
||||
|
@ -201,6 +202,12 @@ public:
|
|||
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 MODULE, such as D_PAD and TEXTEMODULE.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -166,7 +166,11 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
|
|||
|
||||
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 )
|
||||
{
|
||||
|
@ -175,7 +179,9 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
|
|||
break;
|
||||
|
||||
default:
|
||||
scanList = GENERAL_COLLECTOR::AllBoardItems;
|
||||
scanList = DisplayOpt.DisplayZones ?
|
||||
GENERAL_COLLECTOR::AllBoardItems :
|
||||
GENERAL_COLLECTOR::AllButZones;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -196,26 +202,32 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
|
|||
break;
|
||||
|
||||
default:
|
||||
scanList = GENERAL_COLLECTOR::AllBoardItems;
|
||||
scanList = DisplayOpt.DisplayZones ?
|
||||
GENERAL_COLLECTOR::AllBoardItems :
|
||||
GENERAL_COLLECTOR::AllButZones;
|
||||
}
|
||||
}
|
||||
|
||||
m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide );
|
||||
|
||||
/* debugging: print out the collected items, showing their priority order too.
|
||||
* for( unsigned i=0; i<m_Collector->GetCount(); ++i )
|
||||
* (*m_Collector)[i]->Show( 0, std::cout );
|
||||
*/
|
||||
#if 0
|
||||
// debugging: print out the collected items, showing their priority order too.
|
||||
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,
|
||||
* because zones are filled twice ( once by by horizontal and once by vertical segments )
|
||||
*/
|
||||
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];
|
||||
if( item->Type() != TYPEZONE )
|
||||
continue;
|
||||
|
||||
/* Found a TYPE ZONE */
|
||||
if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found
|
||||
{
|
||||
|
@ -282,14 +294,6 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
|
|||
}
|
||||
|
||||
return item;
|
||||
|
||||
/* old way:
|
||||
*
|
||||
* item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer );
|
||||
* if( item == NULL )
|
||||
* item = Locate( CURSEUR_OFF_GRILLE, -1 );
|
||||
* return item;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue