Commit afedb361 authored by dickelbeck's avatar dickelbeck

gerberview & pcbnew fixes

parent 9c5b539e
...@@ -7,15 +7,17 @@ email address. ...@@ -7,15 +7,17 @@ email address.
2007-Sep-25 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Sep-25 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
+ pcbnew + pcbnew
* got rid of reference to global display options DisplayOpt.DisplayZones from * removed reference to global display options DisplayOpt.DisplayZones in
collectors.cpp so collectors.cpp can continue to be used in multiple future collectors.cpp so collectors.cpp can continue to be used in multiple future
(non-display related) general contexts. (non-display related) general contexts. I don't want unnecessary dependencies
in there. The way to completely ignore a type is to exclude it from scanList.
The way to sometimes ignore a type is to add support for this in COLLECTORS_GUIDE.
* Moved TYPEZONE to end of AllBoardItems, added GENERAL_COLLECTOR::AllButZones to * Moved TYPEZONE to end of AllBoardItems, added GENERAL_COLLECTOR::AllButZones to
provide support of DisplayOpt.DisplayZones. provide support for DisplayOpt.DisplayZones.
* Added aHotKeyCode to PcbGeneralLocateAndDisplay() * Added aHotKeyCode to PcbGeneralLocateAndDisplay()
+ gerbview + gerbview
* viewer was getting stuck in a loop when loading a bad gerber file. Fixed * 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. the bug, but line 223 through 225 of readgerb.cpp needs review.
* beautified a few files with uncrustify, (any I had to look at). * beautified a few files with uncrustify, (any I had to look at).
......
/********************************************************/ /********************************************************/
/**** Routine de lecture et visu d'un fichier GERBER ****/ /**** Routine de lecture et visu d'un fichier GERBER ****/
/********************************************************/ /********************************************************/
#include "fctsys.h" #include "fctsys.h"
...@@ -10,218 +10,225 @@ ...@@ -10,218 +10,225 @@
#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) == '.' ) )
/* 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 dplacement * D01 = activation de lumiere (baisser de plume) lors du dplacement
D02 = extinction de lumiere (lever de plume) lors du dplacement * D02 = extinction de lumiere (lever de plume) lors du dplacement
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)
*/ */
// Type d'action du phototraceur: // Type d'action du phototraceur:
#define GERB_ACTIVE_DRAW 1 // activation de lumiere ( baisser de plume) #define GERB_ACTIVE_DRAW 1 // activation de lumiere ( baisser de plume)
#define GERB_STOP_DRAW 2 // extinction de lumiere ( lever de plume) #define GERB_STOP_DRAW 2 // extinction de lumiere ( lever de plume)
#define GERB_FLASH 3 // Flash #define GERB_FLASH 3 // Flash
#define NEGATE(nb) (nb) = -(nb) #define NEGATE( nb ) (nb) = -(nb)
/* Variables locales : */ /* Variables locales : */
static wxPoint LastPosition; static wxPoint LastPosition;
/* Routines Locales */ /* Routines Locales */
static void Append_1_Line_GERBER(int Dcode_index, WinEDA_GerberFrame * frame, wxDC * DC, static void Append_1_Line_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & startpoint,const wxPoint & endpoint, const wxPoint& startpoint, const wxPoint& endpoint,
int largeur); int largeur );
static void Append_1_Flash_GERBER(int Dcode_index, WinEDA_GerberFrame * frame, wxDC * DC, static void Append_1_Flash_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & pos,const wxSize & size, int forme); const wxPoint& pos, const wxSize& size, int forme );
static void Append_1_Flash_ROND_GERBER(int Dcode_index, WinEDA_GerberFrame * frame, wxDC * DC, static void Append_1_Flash_ROND_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & pos, int diametre); const wxPoint& pos, int diametre );
static void Append_1_SEG_ARC_GERBER(int Dcode_index, static void Append_1_SEG_ARC_GERBER( int Dcode_index,
WinEDA_GerberFrame * frame, wxDC * DC, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & startpoint, const wxPoint & endpoint, const wxPoint& startpoint, const wxPoint& endpoint,
const wxPoint & rel_center, int largeur, const wxPoint& rel_center, int largeur,
bool trigo_sens, bool multiquadrant); bool trigo_sens, bool multiquadrant );
/****************************************************************/ /****************************************************************/
static void Append_1_Flash_ROND_GERBER(int Dcode_tool, static void Append_1_Flash_ROND_GERBER( int Dcode_tool,
WinEDA_GerberFrame * frame, WinEDA_GerberFrame* frame,
wxDC * DC, const wxPoint & pos,int diametre) wxDC* DC, const wxPoint& pos, int diametre )
/****************************************************************/ /****************************************************************/
/* Trace 1 flash ROND en position pos /* Trace 1 flash ROND en position pos
*/ */
{ {
TRACK * track; TRACK* track;
track = new TRACK(frame->m_Pcb); track = new TRACK( frame->m_Pcb );
track->Insert(frame->m_Pcb, NULL);
track->Insert( frame->m_Pcb, NULL );
track->SetLayer( frame->GetScreen()->m_Active_Layer ); track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = diametre ; track->m_Width = diametre;
track->m_Start = track->m_End = pos; track->m_Start = track->m_End = pos;
NEGATE(track->m_Start.y); NEGATE( track->m_Start.y );
NEGATE(track->m_End.y); NEGATE( track->m_End.y );
track->m_NetCode = Dcode_tool; track->m_NetCode = Dcode_tool;
track->m_Shape = S_SPOT_CIRCLE; track->m_Shape = S_SPOT_CIRCLE;
Trace_Segment(frame->DrawPanel, DC, track, GR_OR) ; Trace_Segment( frame->DrawPanel, DC, track, GR_OR );
} }
/**********************************************************************/ /**********************************************************************/
static void Append_1_Flash_GERBER(int Dcode_index, static void Append_1_Flash_GERBER( int Dcode_index,
WinEDA_GerberFrame * frame, wxDC * DC, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & pos,const wxSize & size,int forme) const wxPoint& pos, const wxSize& size, int forme )
/*********************************************************************/ /*********************************************************************/
/* /*
Trace 1 flash rectangulaire ou ovale vertical ou horizontal * Trace 1 flash rectangulaire ou ovale vertical ou horizontal
donne par son centre et ses dimensions X et Y * donne par son centre et ses dimensions X et Y
*/ */
{ {
TRACK * track; TRACK* track;
int width, len; int width, len;
width = MIN( size.x, size.y ); width = MIN( size.x, size.y );
len = MAX( size.x, size.y ) - width; len = MAX( size.x, size.y ) - width;
track = new TRACK(frame->m_Pcb); track = new TRACK( frame->m_Pcb );
track->Insert(frame->m_Pcb, NULL);
track->Insert( frame->m_Pcb, NULL );
track->SetLayer( frame->GetScreen()->m_Active_Layer ); track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = width; track->m_Width = width;
track->m_Start = track->m_End = pos; track->m_Start = track->m_End = pos;
NEGATE(track->m_Start.y); NEGATE( track->m_Start.y );
NEGATE(track->m_End.y); NEGATE( track->m_End.y );
track->m_NetCode = Dcode_index; track->m_NetCode = Dcode_index;
if ( forme == OVALE ) if( forme == OVALE )
track->m_Shape = S_SPOT_OVALE; track->m_Shape = S_SPOT_OVALE;
else else
track->m_Shape = S_SPOT_RECT; // donc rectangle ou carr track->m_Shape = S_SPOT_RECT; // donc rectangle ou carr
len >>= 1; len >>= 1;
if ( size.x > size.y ) // ovale / rect horizontal if( size.x > size.y ) // ovale / rect horizontal
{ {
track->m_Start.x -= len ; track->m_Start.x -= len;
track->m_End.x += len; track->m_End.x += len;
} }
else // ovale / rect vertical else // ovale / rect vertical
{ {
track->m_Start.y -= len; track->m_Start.y -= len;
track->m_End.y += len; track->m_End.y += len;
} }
Trace_Segment(frame->DrawPanel, DC, track, GR_OR) ; Trace_Segment( frame->DrawPanel, DC, track, GR_OR );
} }
/******************************************************************/ /******************************************************************/
static void Append_1_Line_GERBER(int Dcode_index, static void Append_1_Line_GERBER( int Dcode_index,
WinEDA_GerberFrame * frame, wxDC * DC, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & startpoint, const wxPoint & endpoint, const wxPoint& startpoint, const wxPoint& endpoint,
int largeur) int largeur )
/********************************************************************/ /********************************************************************/
{ {
TRACK * track; TRACK* track;
track = new TRACK( frame->m_Pcb ); track = new TRACK( frame->m_Pcb );
track->Insert(frame->m_Pcb, NULL);
track->Insert( frame->m_Pcb, NULL );
track->SetLayer( frame->GetScreen()->m_Active_Layer ); track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = largeur ; track->m_Width = largeur;
track->m_Start = startpoint; track->m_Start = startpoint;
NEGATE(track->m_Start.y); NEGATE( track->m_Start.y );
track->m_End = endpoint; track->m_End = endpoint;
NEGATE(track->m_End.y); NEGATE( track->m_End.y );
track->m_NetCode = Dcode_index; track->m_NetCode = Dcode_index;
Trace_Segment(frame->DrawPanel, DC, track,GR_OR) ; Trace_Segment( frame->DrawPanel, DC, track, GR_OR );
} }
/*****************************************************************/ /*****************************************************************/
static void Append_1_SEG_ARC_GERBER(int Dcode_index, static void Append_1_SEG_ARC_GERBER( int Dcode_index,
WinEDA_GerberFrame * frame, wxDC * DC, WinEDA_GerberFrame* frame, wxDC* DC,
const wxPoint & startpoint, const wxPoint & endpoint, const wxPoint& startpoint, const wxPoint& endpoint,
const wxPoint & rel_center, int largeur, const wxPoint& rel_center, int largeur,
bool trigo_sens, bool multiquadrant) bool trigo_sens, bool multiquadrant )
/*****************************************************************/ /*****************************************************************/
/* creation d'un arc: /* creation d'un arc:
si multiquadrant == TRUE arc de 0 a 360 degres * si multiquadrant == TRUE arc de 0 a 360 degres
et rel_center est la coordonne du centre relativement au startpoint * et rel_center est la coordonne du centre relativement au startpoint
*
si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant * si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant
et rel_center est la coordonne du centre relativement au startpoint, * et rel_center est la coordonne du centre relativement au startpoint,
mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit * mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit
etre deduit de cette limite de 90 degres * etre deduit de cette limite de 90 degres
*
*/ */
{ {
TRACK * track; TRACK* track;
wxPoint center, delta; wxPoint center, delta;
track = new TRACK( frame->m_Pcb ); track = new TRACK( frame->m_Pcb );
track->Insert(frame->m_Pcb, NULL);
track->Insert( frame->m_Pcb, NULL );
track->m_Shape = S_ARC; track->m_Shape = S_ARC;
track->SetLayer( frame->GetScreen()->m_Active_Layer ); track->SetLayer( frame->GetScreen()->m_Active_Layer );
track->m_Width = largeur ; track->m_Width = largeur;
if ( multiquadrant ) if( multiquadrant )
{ {
center.x = startpoint.x + rel_center.x; center.x = startpoint.x + rel_center.x;
center.y = startpoint.y - rel_center.y; center.y = startpoint.y - rel_center.y;
if ( !trigo_sens ) if( !trigo_sens )
{ {
track->m_Start = startpoint; track->m_Start = startpoint;
track->m_End = endpoint; track->m_End = endpoint;
...@@ -237,31 +244,30 @@ wxPoint center, delta; ...@@ -237,31 +244,30 @@ wxPoint center, delta;
center = rel_center; center = rel_center;
delta.x = endpoint.x - startpoint.x; delta.x = endpoint.x - startpoint.x;
delta.y = endpoint.y - startpoint.y; delta.y = endpoint.y - startpoint.y;
// il faut corriger de signe de rel_center.x et rel_center.y // il faut corriger de signe de rel_center.x et rel_center.y
// selon le quadrant ou on se trouve // selon le quadrant ou on se trouve
if ( (delta.x >= 0) && (delta.y >= 0) ) // 1er quadrant if( (delta.x >= 0) && (delta.y >= 0) ) // 1er quadrant
{ {
center.x = - center.x; center.x = -center.x;
} }
else if( (delta.x < 0) && (delta.y >= 0) ) // 2eme quadrant
else if ( (delta.x < 0) && (delta.y >= 0) ) // 2eme quadrant
{ {
center.x = - center.x; center.x = -center.x;
center.y = - center.y; center.y = -center.y;
} }
else if( (delta.x < 0) && (delta.y < 0) ) // 3eme quadrant
else if ( (delta.x < 0) && (delta.y < 0) ) // 3eme quadrant
{ {
center.y = - center.y; center.y = -center.y;
} }
else // 4eme qadrant: les 2 coord sont >= 0! else // 4eme qadrant: les 2 coord sont >= 0!
{ {
} }
center.x += startpoint.x; center.x += startpoint.x;
center.y = startpoint.y + center.y ; center.y = startpoint.y + center.y;
if ( trigo_sens ) if( trigo_sens )
{ {
track->m_Start = startpoint; track->m_Start = startpoint;
track->m_End = endpoint; track->m_End = endpoint;
...@@ -277,106 +283,142 @@ wxPoint center, delta; ...@@ -277,106 +283,142 @@ wxPoint center, delta;
track->m_Param = center.x; track->m_Param = center.x;
track->m_Sous_Netcode = center.y; track->m_Sous_Netcode = center.y;
NEGATE(track->m_Start.y); NEGATE( track->m_Start.y );
NEGATE(track->m_End.y); NEGATE( track->m_End.y );
NEGATE(track->m_Sous_Netcode); NEGATE( track->m_Sous_Netcode );
Trace_Segment(frame->DrawPanel, DC, track,GR_OR); Trace_Segment( frame->DrawPanel, DC, track, GR_OR );
} }
/**************************************************/ /**************************************************/
/* Routines utilises en lecture de ficher gerber */ /* Routines utilises en lecture de ficher gerber */
/**************************************************/ /**************************************************/
/* ces routines lisent la chaine de texte pointe par Text. /* ces routines lisent la chaine de texte pointe par Text.
Apres appel, Text pointe le debut de la sequence non lue * Apres appel, Text pointe le debut de la sequence non lue
*/ */
/***********************************************/ /***********************************************/
wxPoint GERBER_Descr::ReadXYCoord(char * &Text) wxPoint GERBER_Descr::ReadXYCoord( char*& Text )
/***********************************************/ /***********************************************/
/* Retourne la coord courante pointee par Text (XnnnnYmmmm) /* Retourne la coord courante pointee par Text (XnnnnYmmmm)
*/ */
{ {
wxPoint pos = m_CurrentPos; wxPoint pos = m_CurrentPos;
int type_coord = 0, current_coord, nbchar; int type_coord = 0, current_coord, nbchar;
bool is_float = FALSE; bool is_float = FALSE;
char * text; char* text;
char line[256]; char line[256];
if ( m_Relative ) pos.x = pos.y = 0; if( m_Relative )
else pos = m_CurrentPos; pos.x = pos.y = 0;
else
pos = m_CurrentPos;
if ( Text == NULL ) return pos; if( Text == NULL )
return pos;
text = line; text = line;
while ( * Text ) while( *Text )
{ {
if ( (* Text == 'X') || (* Text == 'Y') ) if( (*Text == 'X') || (*Text == 'Y') )
{ {
type_coord = * Text; type_coord = *Text;
Text++; Text++;
text = line; nbchar = 0; text = line; nbchar = 0;
while( IsNumber(*Text) ) while( IsNumber( *Text ) )
{ {
if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' )
is_float = TRUE;
*(text++) = *(Text++); *(text++) = *(Text++);
if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') )
nbchar++;
} }
*text = 0; *text = 0;
if ( is_float ) if( is_float )
{ {
if ( m_GerbMetric ) if( m_GerbMetric )
current_coord = (int) round(atof(line) / 0.00254); current_coord = (int) round( atof( line ) / 0.00254 );
else else
current_coord = (int) round(atof(line) * PCB_INTERNAL_UNIT); current_coord = (int) round( atof( line ) * PCB_INTERNAL_UNIT );
} }
else 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 ) if( m_NoTrailingZeros )
{ {
int min_digit = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y; int min_digit = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y;
while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit )
*text=0; {
*(text++) = '0'; nbchar++;
}
*text = 0;
} }
current_coord = atoi(line); current_coord = atoi( line );
double real_scale = 1.0; double real_scale = 1.0;
switch( fmt_scale)
switch( fmt_scale )
{ {
case 0: real_scale = 10000.0; case 0:
real_scale = 10000.0;
break; break;
case 1: real_scale = 1000.0;
case 1:
real_scale = 1000.0;
break; break;
case 2: real_scale = 100.0;
case 2:
real_scale = 100.0;
break; break;
case 3: real_scale = 10.0;
case 3:
real_scale = 10.0;
break; break;
case 4: case 4:
break; break;
case 5: real_scale = 0.1;
case 5:
real_scale = 0.1;
break; break;
case 6: real_scale = 0.01;
case 6:
real_scale = 0.01;
break; break;
case 7: real_scale = 0.001;
case 7:
real_scale = 0.001;
break; break;
case 8: real_scale = 0.0001;
case 8:
real_scale = 0.0001;
break; break;
case 9: real_scale = 0.00001;
case 9:
real_scale = 0.00001;
break; break;
} }
if ( m_GerbMetric ) real_scale = real_scale / 25.4;
current_coord = (int) round(current_coord * real_scale); if( m_GerbMetric )
real_scale = real_scale / 25.4;
current_coord = (int) round( current_coord * real_scale );
} }
if ( type_coord == 'X' ) pos.x = current_coord; if( type_coord == 'X' )
else if ( type_coord == 'Y' ) pos.y = current_coord; pos.x = current_coord;
else if( type_coord == 'Y' )
pos.y = current_coord;
continue; continue;
} }
else break; else
break;
} }
if ( m_Relative ) if( m_Relative )
{ {
pos.x += m_CurrentPos.x; pos.x += m_CurrentPos.x;
pos.y += m_CurrentPos.y; pos.y += m_CurrentPos.y;
...@@ -386,140 +428,184 @@ char line[256]; ...@@ -386,140 +428,184 @@ char line[256];
return pos; return pos;
} }
/************************************************/ /************************************************/
wxPoint GERBER_Descr::ReadIJCoord(char * &Text) wxPoint GERBER_Descr::ReadIJCoord( char*& Text )
/************************************************/ /************************************************/
/* Retourne la coord type InnJnn courante pointee par Text (InnnnJmmmm) /* Retourne la coord type InnJnn courante pointee par Text (InnnnJmmmm)
Ces coordonnes sont relatives, donc si une coord est absente, sa valeur * Ces coordonnes sont relatives, donc si une coord est absente, sa valeur
par defaut est 0 * par defaut est 0
*/ */
{ {
wxPoint pos(0,0); wxPoint pos( 0, 0 );
int type_coord = 0, current_coord, nbchar;
bool is_float = FALSE;
char * text;
char line[256];
if ( Text == NULL ) return pos; int type_coord = 0, current_coord, nbchar;
bool is_float = FALSE;
char* text;
char line[256];
if( Text == NULL )
return pos;
text = line; text = line;
while ( * Text ) while( *Text )
{ {
if ( (* Text == 'I') || (* Text == 'J') ) if( (*Text == 'I') || (*Text == 'J') )
{ {
type_coord = * Text; type_coord = *Text;
Text++; Text++;
text = line; nbchar = 0; text = line; nbchar = 0;
while( IsNumber(*Text) ) while( IsNumber( *Text ) )
{ {
if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' )
is_float = TRUE;
*(text++) = *(Text++); *(text++) = *(Text++);
if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') )
nbchar++;
} }
*text = 0; *text = 0;
if ( is_float ) if( is_float )
{ {
if ( m_GerbMetric ) if( m_GerbMetric )
current_coord = (int) round(atof(line) / 0.00254); current_coord = (int) round( atof( line ) / 0.00254 );
else else
current_coord = (int) round(atof(line) * PCB_INTERNAL_UNIT); current_coord = (int) round( atof( line ) * PCB_INTERNAL_UNIT );
} }
else else
{ {
int fmt_scale = (type_coord == 'I') ? m_FmtScale.x : m_FmtScale.y; int fmt_scale = (type_coord == 'I') ? m_FmtScale.x : m_FmtScale.y;
if ( m_NoTrailingZeros ) if( m_NoTrailingZeros )
{ {
int min_digit = (type_coord == 'I') ? m_FmtLen.x : m_FmtLen.y; int min_digit = (type_coord == 'I') ? m_FmtLen.x : m_FmtLen.y;
while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit )
*text=0; {
*(text++) = '0'; nbchar++;
}
*text = 0;
} }
current_coord = atoi(line); current_coord = atoi( line );
double real_scale = 1.0; double real_scale = 1.0;
switch( fmt_scale)
switch( fmt_scale )
{ {
case 0: real_scale = 10000.0; case 0:
real_scale = 10000.0;
break; break;
case 1: real_scale = 1000.0;
case 1:
real_scale = 1000.0;
break; break;
case 2: real_scale = 100.0;
case 2:
real_scale = 100.0;
break; break;
case 3: real_scale = 10.0;
case 3:
real_scale = 10.0;
break; break;
case 4: case 4:
break; break;
case 5: real_scale = 0.1;
case 5:
real_scale = 0.1;
break; break;
case 6: real_scale = 0.01;
case 6:
real_scale = 0.01;
break; break;
case 7: real_scale = 0.001;
case 7:
real_scale = 0.001;
break; break;
case 8: real_scale = 0.0001;
case 8:
real_scale = 0.0001;
break; break;
case 9: real_scale = 0.00001;
case 9:
real_scale = 0.00001;
break; break;
} }
if ( m_GerbMetric ) real_scale = real_scale / 25.4;
current_coord = (int) round(current_coord * real_scale); if( m_GerbMetric )
real_scale = real_scale / 25.4;
current_coord = (int) round( current_coord * real_scale );
} }
if ( type_coord == 'I' ) pos.x = current_coord; if( type_coord == 'I' )
else if ( type_coord == 'J' ) pos.y = current_coord; pos.x = current_coord;
else if( type_coord == 'J' )
pos.y = current_coord;
continue; continue;
} }
else break; else
break;
} }
m_IJPos = pos; m_IJPos = pos;
return pos; return pos;
} }
/*****************************************************/ /*****************************************************/
int GERBER_Descr::ReturnGCodeNumber(char * &Text) int GERBER_Descr::ReturnGCodeNumber( char*& Text )
/*****************************************************/ /*****************************************************/
/* Lit la sequence Gnn et retourne la valeur nn /* Lit la sequence Gnn et retourne la valeur nn
*/ */
{ {
int ii = 0; int ii = 0;
char * text; char* text;
char line[1024]; char line[1024];
if ( Text == NULL ) return 0; if( Text == NULL )
return 0;
Text++; Text++;
text = line; text = line;
while( IsNumber(*Text) ) while( IsNumber( *Text ) )
{ {
*(text++) = *(Text++); *(text++) = *(Text++);
} }
*text = 0; *text = 0;
ii = atoi(line); ii = atoi( line );
return ii; return ii;
} }
/**************************************************/ /**************************************************/
int GERBER_Descr::ReturnDCodeNumber(char * &Text) int GERBER_Descr::ReturnDCodeNumber( char*& Text )
/**************************************************/ /**************************************************/
/* Lit la sequence Dnn et retourne la valeur nn /* Lit la sequence Dnn et retourne la valeur nn
*/ */
{ {
int ii = 0; int ii = 0;
char * text; char* text;
char line[1024]; char line[1024];
if ( Text == NULL ) return 0; if( Text == NULL )
Text ++; return 0;
Text++;
text = line; text = line;
while( IsNumber(*Text) ) *(text++) = *(Text++); while( IsNumber( *Text ) )
*(text++) = *(Text++);
*text = 0; *text = 0;
ii = atoi(line); ii = atoi( line );
return ii; return ii;
} }
/******************************************************************/ /******************************************************************/
bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) bool GERBER_Descr::Execute_G_Command( char*& text, int G_commande )
/******************************************************************/ /******************************************************************/
{ {
switch (G_commande) switch( G_commande )
{ {
case GC_LINEAR_INTERPOL_1X: case GC_LINEAR_INTERPOL_1X:
m_Iterpolation = GERB_INTERPOL_LINEAR_1X; m_Iterpolation = GERB_INTERPOL_LINEAR_1X;
...@@ -535,7 +621,7 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) ...@@ -535,7 +621,7 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande)
case GC_COMMENT: case GC_COMMENT:
text = NULL; text = NULL;
break ; break;
case GC_LINEAR_INTERPOL_10X: case GC_LINEAR_INTERPOL_10X:
m_Iterpolation = GERB_INTERPOL_LINEAR_10X; m_Iterpolation = GERB_INTERPOL_LINEAR_10X;
...@@ -551,12 +637,15 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) ...@@ -551,12 +637,15 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande)
case GC_SELECT_TOOL: case GC_SELECT_TOOL:
{ {
int D_commande = ReturnDCodeNumber(text); int D_commande = ReturnDCodeNumber( text );
if ( D_commande < FIRST_DCODE) return FALSE; if( D_commande < FIRST_DCODE )
if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; return FALSE;
if( D_commande > (MAX_TOOLS - 1) )
D_commande = MAX_TOOLS - 1;
m_Current_Tool = D_commande; m_Current_Tool = D_commande;
D_CODE * pt_Dcode = ReturnToolDescr( m_Layer, D_commande ); D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande );
if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; if( pt_Dcode )
pt_Dcode->m_InUse = TRUE;
break; break;
} }
...@@ -596,8 +685,8 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) ...@@ -596,8 +685,8 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande)
case GC_MOVE: // Non existant case GC_MOVE: // Non existant
default: default:
{ {
wxString msg; msg.Printf( wxT("G%.2d command not handled"),G_commande); wxString msg; msg.Printf( wxT( "G%.2d command not handled" ), G_commande );
DisplayError(NULL, msg); DisplayError( NULL, msg );
return FALSE; return FALSE;
} }
} }
...@@ -606,49 +695,56 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) ...@@ -606,49 +695,56 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande)
return TRUE; return TRUE;
} }
/*****************************************************************************/ /*****************************************************************************/
bool GERBER_Descr::Execute_DCODE_Command(WinEDA_GerberFrame * frame, wxDC * DC, bool GERBER_Descr::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC,
char * &text, int D_commande) char*& text, int D_commande )
/*****************************************************************************/ /*****************************************************************************/
{ {
wxSize size(15, 15); wxSize size( 15, 15 );
int shape = 1, dcode = 0;
D_CODE * pt_Tool = NULL; int shape = 1, dcode = 0;
wxString msg; D_CODE* pt_Tool = NULL;
wxString msg;
if(D_commande >= FIRST_DCODE ) // This is a "Set tool" command if( D_commande >= FIRST_DCODE ) // This is a "Set tool" command
{ {
if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; if( D_commande > (MAX_TOOLS - 1) )
D_commande = MAX_TOOLS - 1;
m_Current_Tool = D_commande; m_Current_Tool = D_commande;
D_CODE * pt_Dcode = ReturnToolDescr(m_Layer, D_commande); D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande );
if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; if( pt_Dcode )
pt_Dcode->m_InUse = TRUE;
return TRUE; return TRUE;
} }
else // D_commande = 0..9: this is a pen command (usualy D1, D2 or D3) else // D_commande = 0..9: this is a pen command (usualy D1, D2 or D3)
{ {
m_Last_Pen_Command = D_commande; m_Last_Pen_Command = D_commande;
} }
if ( m_PolygonFillMode ) // Enter a polygon description: if( m_PolygonFillMode ) // Enter a polygon description:
{ {
switch ( D_commande ) switch( D_commande )
{ {
case 1: //code D01 Draw line, exposure ON case 1: //code D01 Draw line, exposure ON
{ {
SEGZONE * edge_poly, *last; SEGZONE* edge_poly, * last;
edge_poly = new SEGZONE( frame->m_Pcb ); edge_poly = new SEGZONE( frame->m_Pcb );
last = (SEGZONE*)frame->m_Pcb->m_Zone;
if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext; last = (SEGZONE*) frame->m_Pcb->m_Zone;
edge_poly->Insert(frame->m_Pcb, last); if( last )
while( last->Pnext )
last = (SEGZONE*) last->Pnext;
edge_poly->Insert( frame->m_Pcb, last );
edge_poly->SetLayer( frame->GetScreen()->m_Active_Layer ); edge_poly->SetLayer( frame->GetScreen()->m_Active_Layer );
edge_poly->m_Width = 1; edge_poly->m_Width = 1;
edge_poly->m_Start = m_PreviousPos; edge_poly->m_Start = m_PreviousPos;
NEGATE(edge_poly->m_Start.y); NEGATE( edge_poly->m_Start.y );
edge_poly->m_End = m_CurrentPos; edge_poly->m_End = m_CurrentPos;
NEGATE(edge_poly->m_End.y); NEGATE( edge_poly->m_End.y );
edge_poly->m_NetCode = m_PolygonFillModeState; edge_poly->m_NetCode = m_PolygonFillModeState;
m_PreviousPos = m_CurrentPos; m_PreviousPos = m_CurrentPos;
m_PolygonFillModeState = 1; m_PolygonFillModeState = 1;
...@@ -664,25 +760,25 @@ wxString msg; ...@@ -664,25 +760,25 @@ wxString msg;
return FALSE; return FALSE;
} }
} }
else
switch( D_commande )
else switch ( D_commande )
{ {
case 1: //code D01 Draw line, exposure ON case 1: //code D01 Draw line, exposure ON
pt_Tool = ReturnToolDescr(m_Layer, m_Current_Tool); pt_Tool = ReturnToolDescr( m_Layer, m_Current_Tool );
if ( pt_Tool ) if( pt_Tool )
{ {
size = pt_Tool->m_Size; size = pt_Tool->m_Size;
dcode = pt_Tool->m_Num_Dcode; dcode = pt_Tool->m_Num_Dcode;
shape = pt_Tool->m_Shape; shape = pt_Tool->m_Shape;
} }
switch ( m_Iterpolation )
switch( m_Iterpolation )
{ {
case GERB_INTERPOL_LINEAR_1X: case GERB_INTERPOL_LINEAR_1X:
Append_1_Line_GERBER(dcode, Append_1_Line_GERBER( dcode,
frame, DC, frame, DC,
m_PreviousPos, m_CurrentPos, m_PreviousPos, m_CurrentPos,
size.x); size.x );
break; break;
case GERB_INTERPOL_LINEAR_01X: case GERB_INTERPOL_LINEAR_01X:
...@@ -692,25 +788,26 @@ wxString msg; ...@@ -692,25 +788,26 @@ wxString msg;
break; break;
case GERB_INTERPOL_ARC_NEG: case GERB_INTERPOL_ARC_NEG:
Append_1_SEG_ARC_GERBER(dcode, Append_1_SEG_ARC_GERBER( dcode,
frame, DC, frame, DC,
m_PreviousPos, m_CurrentPos, m_IJPos, m_PreviousPos, m_CurrentPos, m_IJPos,
size.x, FALSE, m_360Arc_enbl); size.x, FALSE, m_360Arc_enbl );
break; break;
case GERB_INTERPOL_ARC_POS: case GERB_INTERPOL_ARC_POS:
Append_1_SEG_ARC_GERBER(dcode, Append_1_SEG_ARC_GERBER( dcode,
frame, DC, frame, DC,
m_PreviousPos, m_CurrentPos, m_IJPos, m_PreviousPos, m_CurrentPos, m_IJPos,
size.x, TRUE, m_360Arc_enbl); size.x, TRUE, m_360Arc_enbl );
break; break;
default: default:
msg.Printf( wxT("Execute_DCODE_Command: interpol error (type %X)"), msg.Printf( wxT( "Execute_DCODE_Command: interpol error (type %X)" ),
m_Iterpolation); m_Iterpolation );
DisplayError(frame, msg); DisplayError( frame, msg );
break; break;
} }
m_PreviousPos = m_CurrentPos; m_PreviousPos = m_CurrentPos;
break; break;
...@@ -719,42 +816,42 @@ wxString msg; ...@@ -719,42 +816,42 @@ wxString msg;
break; break;
case 3: // code D3: flash aperture case 3: // code D3: flash aperture
pt_Tool = ReturnToolDescr(m_Layer, m_Current_Tool); pt_Tool = ReturnToolDescr( m_Layer, m_Current_Tool );
if ( pt_Tool ) if( pt_Tool )
{ {
size = pt_Tool->m_Size; size = pt_Tool->m_Size;
dcode = pt_Tool->m_Num_Dcode; dcode = pt_Tool->m_Num_Dcode;
shape = pt_Tool->m_Shape; shape = pt_Tool->m_Shape;
} }
switch (shape) switch( shape )
{ {
case GERB_LINE: case GERB_LINE:
case GERB_CIRCLE : case GERB_CIRCLE:
Append_1_Flash_ROND_GERBER(dcode, Append_1_Flash_ROND_GERBER( dcode,
frame, DC, frame, DC,
m_CurrentPos, m_CurrentPos,
size.x); size.x );
break ; break;
case GERB_OVALE : case GERB_OVALE:
Append_1_Flash_GERBER( dcode, Append_1_Flash_GERBER( dcode,
frame, DC, m_CurrentPos, frame, DC, m_CurrentPos,
size, size,
OVALE); OVALE );
break ; break;
case GERB_RECT: case GERB_RECT:
Append_1_Flash_GERBER( dcode, Append_1_Flash_GERBER( dcode,
frame, DC, m_CurrentPos, frame, DC, m_CurrentPos,
size, size,
RECT); RECT );
break ; break;
default: // Special (Macro) : Non implant default: // Special (Macro) : Non implant
break; break;
} }
m_PreviousPos = m_CurrentPos; m_PreviousPos = m_CurrentPos;
break; break;
...@@ -764,4 +861,3 @@ wxString msg; ...@@ -764,4 +861,3 @@ wxString msg;
return TRUE; return TRUE;
} }
...@@ -246,7 +246,8 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer ) ...@@ -246,7 +246,8 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer )
if( via_type == VIA_NORMALE ) if( via_type == VIA_NORMALE )
{ {
top_layer = LAYER_CMP_N; bottom_layer = LAYER_CUIVRE_N; top_layer = LAYER_CMP_N;
bottom_layer = LAYER_CUIVRE_N;
} }
if( bottom_layer > top_layer ) if( bottom_layer > top_layer )
...@@ -695,12 +696,12 @@ void TRACK::Display_Infos( WinEDA_DrawFrame* frame ) ...@@ -695,12 +696,12 @@ void TRACK::Display_Infos( WinEDA_DrawFrame* frame )
|| Type() == TYPEVIA ) || Type() == TYPEVIA )
{ {
EQUIPOT* equipot = ((WinEDA_PcbFrame*)frame)->m_Pcb->FindNet( m_NetCode ); EQUIPOT* equipot = ((WinEDA_PcbFrame*)frame)->m_Pcb->FindNet( m_NetCode );
if( equipot ) if( equipot )
{
msg = equipot->m_Netname; msg = equipot->m_Netname;
}
else else
msg = wxT( "<noname>" ); msg = wxT( "<noname>" );
Affiche_1_Parametre( frame, text_pos, _( "NetName" ), msg, RED ); Affiche_1_Parametre( frame, text_pos, _( "NetName" ), msg, RED );
/* Affiche net code :*/ /* Affiche net code :*/
......
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