Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
64f12ffe
Commit
64f12ffe
authored
Sep 25, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gerberview & pcbnew fixes
parent
5e448ec4
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1003 additions
and
889 deletions
+1003
-889
change_log.txt
change_log.txt
+15
-0
files.cpp
gerbview/files.cpp
+191
-183
readgerb.cpp
gerbview/readgerb.cpp
+259
-249
rs274x.cpp
gerbview/rs274x.cpp
+475
-416
class_collector.h
include/class_collector.h
+3
-3
wxstruct.h
include/wxstruct.h
+5
-1
collectors.cpp
pcbnew/collectors.cpp
+25
-18
collectors.h
pcbnew/collectors.h
+7
-0
controle.cpp
pcbnew/controle.cpp
+23
-19
No files found.
change_log.txt
View file @
64f12ffe
...
@@ -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:
...
...
gerbview/files.cpp
View file @
64f12ffe
/******************************************************/
/******************************************************/
/* 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
;
}
}
gerbview/readgerb.cpp
View file @
64f12ffe
/********************************************************/
/********************************************************/
/**** 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
;
}
}
gerbview/rs274x.cpp
View file @
64f12ffe
/********************************************************/
/********************************************************/
/* 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
;
}
}
include/class_collector.h
View file @
64f12ffe
...
@@ -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
);
}
}
/**
/**
...
...
include/wxstruct.h
View file @
64f12ffe
...
@@ -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
);
...
...
pcbnew/collectors.cpp
View file @
64f12ffe
...
@@ -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
;
}
}
}
}
...
...
pcbnew/collectors.h
View file @
64f12ffe
...
@@ -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.
...
...
pcbnew/controle.cpp
View file @
64f12ffe
...
@@ -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;
*/
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment