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
22affc67
Commit
22affc67
authored
Jan 25, 2008
by
CHARRAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better support for micro vias. infos in changelog
parent
48dc3d06
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
226 additions
and
121 deletions
+226
-121
change_log.txt
change_log.txt
+12
-1
dialog_gendrill.h
pcbnew/dialog_gendrill.h
+1
-1
gen_drill_report_files.cpp
pcbnew/gen_drill_report_files.cpp
+100
-43
gen_holes_and_tools_lists_for_drill.cpp
pcbnew/gen_holes_and_tools_lists_for_drill.cpp
+54
-39
gendrill.cpp
pcbnew/gendrill.cpp
+42
-29
gendrill.h
pcbnew/gendrill.h
+17
-8
No files found.
change_log.txt
View file @
22affc67
...
...
@@ -9,7 +9,18 @@ email address.
2008-Jan-25 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+pcbnew:
void Change_Side_Module( MODULE* Module, wxDC* DC ) is now member of class BOARD.
- void Change_Side_Module( MODULE* Module, wxDC* DC ) is now member of class BOARD.
- Better support for micro vias and buried vias (drill files now are useable for board manufacturers)
But not yet tested by a board manufacturer. Be carefull.
Todo: tools to conversion between via through and buried via and buried viad optimisation.
But must works for micro vias (needed for my next board)
(in pcbnew micro vias are blind vias between 2 adjacent layers: micro vias must be enabled
in Dimensions/track and via menu, and placed by ctrl v.
They are intended to connect small pitch BGA pins to the inner layer, and can be drilled by laser
if the hole diameter is small < 0.2mm. A laser can only drill a hole between 2 adjacent layers ).
** Currently use buried via for tests only, not for production **.
2008-Jan-24 UPDATE Dick Hollenbeck <dick@softplc.com>
...
...
pcbnew/dialog_gendrill.h
View file @
22affc67
...
...
@@ -153,7 +153,7 @@ private:
void
UpdatePrecisionOptions
(
wxCommandEvent
&
event
);
void
UpdateConfig
();
void
Write_Excellon_Header
(
FILE
*
aFile
);
void
GenDrillReport
(
const
wxString
aFileName
,
std
::
vector
<
DRILL_TOOL
>
&
buffer
);
void
GenDrillReport
(
const
wxString
aFileName
);
int
Create_Drill_File_EXCELLON
(
std
::
vector
<
HOLE_INFO
>
&
aHoleListBuffer
,
std
::
vector
<
DRILL_TOOL
>
&
aToolListBuffer
);
int
Gen_Liste_Tools
(
std
::
vector
<
DRILL_TOOL
>
&
buffer
,
bool
print_header
);
...
...
pcbnew/gen_drill_report_files.cpp
View file @
22affc67
...
...
@@ -285,10 +285,10 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, w
fputs
(
line
,
aFile
);
// Now list how many holes and ovals are associated with each drill.
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
sprintf
(
line
,
"(1 hole)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
// && ( buffer[ii]m_OvalCount == 1 )
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
// && ( buffer[ii]m_OvalCount == 1 )
sprintf
(
line
,
"(1 hole) (with 1 oblong)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
sprintf
(
line
,
"(%d holes)
\n
"
,
...
...
@@ -296,7 +296,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, w
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
1
)
sprintf
(
line
,
"(%d holes) (with 1 oblong)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
// if ( aToolListBuffer[ii]m_OvalCount > 1 )
else
// if ( aToolListBuffer[ii]m_OvalCount > 1 )
sprintf
(
line
,
"(%d holes) (with %d oblongs)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
,
aToolListBuffer
[
ii
].
m_OvalCount
);
...
...
@@ -319,10 +319,10 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, w
msg
=
CONV_FROM_UTF8
(
line
);
// Now list how many holes and ovals are associated with each drill.
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
sprintf
(
line
,
"(1 hole)"
);
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
// && ( aToolListBuffer[ii]m_OvalCount == 1 )
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
// && ( aToolListBuffer[ii]m_OvalCount == 1 )
sprintf
(
line
,
"(1 hole) (with 1 oblong)"
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
sprintf
(
line
,
"(%d holes)"
,
...
...
@@ -330,7 +330,7 @@ void GenDrillMapFile( BOARD* aPcb, FILE* aFile, const wxString& aFullFileName, w
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
1
)
sprintf
(
line
,
"(%d holes) (with 1 oblong)"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
// if ( aToolListBuffer[ii]m_OvalCount > 1 )
else
// if ( aToolListBuffer[ii]m_OvalCount > 1 )
sprintf
(
line
,
"(%d holes) (with %d oblongs)"
,
aToolListBuffer
[
ii
].
m_TotalCount
,
aToolListBuffer
[
ii
].
m_OvalCount
);
...
...
@@ -610,8 +610,11 @@ void PlotOvalDrillSymbol( const wxPoint& position, const wxSize& size, int orien
/**************************************************************************************************/
void
GenDrillReportFile
(
FILE
*
aFile
,
const
wxString
&
aBoardFilename
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
,
bool
aUnit_Drill_is_Inch
)
void
GenDrillReportFile
(
FILE
*
aFile
,
BOARD
*
aPcb
,
const
wxString
&
aBoardFilename
,
bool
aUnit_Drill_is_Inch
,
std
::
vector
<
HOLE_INFO
>&
aHoleListBuffer
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
)
/*************************************************************************************************/
/*
...
...
@@ -620,6 +623,10 @@ void GenDrillReportFile( FILE* aFile, const wxString& aBoardFilename,
{
unsigned
TotalHoleCount
;
char
line
[
1024
];
int
layer1
=
COPPER_LAYER_N
;
int
layer2
=
LAYER_CMP_N
;
bool
gen_through_holes
=
true
;
fprintf
(
aFile
,
"Drill report for %s
\n
"
,
CONV_TO_UTF8
(
aBoardFilename
)
);
fprintf
(
aFile
,
"Created on %s
\n
"
,
DateAndTime
(
line
)
);
...
...
@@ -630,47 +637,97 @@ void GenDrillReportFile( FILE* aFile, const wxString& aBoardFilename,
else
fputs
(
"Selected Drill Unit: Metric (mm)
\n\n
"
,
aFile
);
TotalHoleCount
=
0
;
/* build hole lists:
* 1 - through holes
* 2 - for partial holes only: by layer pair
*/
for
(
unsigned
ii
=
0
;
ii
<
aToolListBuffer
.
size
();
ii
++
)
for
(
;
;
)
{
// List the tool number assigned to each drill,
// then its diameter in the selected Drill Unit,
// and then its diameter in the other Drill Unit.
if
(
aUnit_Drill_is_Inch
)
sprintf
(
line
,
"T%d %2.3f
\"
%2.2fmm "
,
ii
+
1
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.0001
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.00254
);
Build_Holes_List
(
aPcb
,
aHoleListBuffer
,
aToolListBuffer
,
layer1
,
layer2
,
gen_through_holes
?
false
:
true
);
TotalHoleCount
=
0
;
if
(
gen_through_holes
)
{
sprintf
(
line
,
"Drill report for through holes :
\n
"
);
}
else
sprintf
(
line
,
"T%d %2.2fmm %2.3f
\"
"
,
ii
+
1
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.00254
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.0001
);
{
if
(
layer1
==
COPPER_LAYER_N
)
// First partial hole list
{
sprintf
(
line
,
"Drill report for buried and blind vias :
\n\n
"
);
fputs
(
line
,
aFile
);
}
sprintf
(
line
,
"Drill report for holes from layer %s to layer %s
\n
"
,
CONV_TO_UTF8
(
aPcb
->
GetLayerName
(
layer1
)
),
CONV_TO_UTF8
(
aPcb
->
GetLayerName
(
layer2
)
)
);
}
fputs
(
line
,
aFile
);
// Now list how many holes and ovals are associated with each drill.
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
sprintf
(
line
,
"(1 hole)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
sprintf
(
line
,
"(1 hole) (with 1 oblong)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
sprintf
(
line
,
"(%d holes)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
1
)
sprintf
(
line
,
"(%d holes) (with 1 oblong)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
// if ( buffer[ii]m_OvalCount > 1 )
sprintf
(
line
,
"(%d holes) (with %d oblongs)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
,
aToolListBuffer
[
ii
].
m_OvalCount
);
for
(
unsigned
ii
=
0
;
ii
<
aToolListBuffer
.
size
();
ii
++
)
{
// List the tool number assigned to each drill,
// then its diameter in the selected Drill Unit,
// and then its diameter in the other Drill Unit.
if
(
aUnit_Drill_is_Inch
)
sprintf
(
line
,
"T%d %2.3f
\"
%2.2fmm "
,
ii
+
1
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.0001
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.00254
);
else
sprintf
(
line
,
"T%d %2.2fmm %2.3f
\"
"
,
ii
+
1
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.00254
,
float
(
aToolListBuffer
[
ii
].
m_Diameter
)
*
0.0001
);
fputs
(
line
,
aFile
);
// Now list how many holes and ovals are associated with each drill.
if
(
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
&&
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
)
sprintf
(
line
,
"(1 hole)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_TotalCount
==
1
)
sprintf
(
line
,
"(1 hole) (with 1 oblong)
\n
"
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
0
)
sprintf
(
line
,
"(%d holes)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
if
(
aToolListBuffer
[
ii
].
m_OvalCount
==
1
)
sprintf
(
line
,
"(%d holes) (with 1 oblong)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
);
else
// if ( buffer[ii]m_OvalCount > 1 )
sprintf
(
line
,
"(%d holes) (with %d oblongs)
\n
"
,
aToolListBuffer
[
ii
].
m_TotalCount
,
aToolListBuffer
[
ii
].
m_OvalCount
);
fputs
(
line
,
aFile
);
TotalHoleCount
+=
aToolListBuffer
[
ii
].
m_TotalCount
;
}
sprintf
(
line
,
"
\n
total holes count %d
\n\n\n
"
,
TotalHoleCount
);
fputs
(
line
,
aFile
);
TotalHoleCount
+=
aToolListBuffer
[
ii
].
m_TotalCount
;
}
if
(
g_DesignSettings
.
m_CopperLayerCount
<=
2
)
break
;
sprintf
(
line
,
"
\n
total holes count %d
\n
"
,
TotalHoleCount
);
fputs
(
line
,
aFile
);
if
(
gen_through_holes
)
layer2
=
layer1
+
1
;
else
{
if
(
layer2
>=
LAYER_CMP_N
)
// no more layer pair to consider
break
;
layer1
++
;
layer2
++
;
// use next layer pair
if
(
layer2
==
g_DesignSettings
.
m_CopperLayerCount
-
1
)
// The last layer is reached
layer2
=
LAYER_CMP_N
;
// the last layer is always the component layer
}
gen_through_holes
=
false
;
}
fclose
(
aFile
);
}
pcbnew/gen_holes_and_tools_lists_for_drill.cpp
View file @
22affc67
...
...
@@ -17,34 +17,37 @@ using namespace std;
/* Local Functions */
/* Compare function used for sorting holes by increasing diameter value
/* Compare function used for sorting holes by increasing diameter value
* and X value
*/
*/
static
bool
CmpHoleDiameterValue
(
const
HOLE_INFO
&
a
,
const
HOLE_INFO
&
b
)
{
if
(
a
.
m_Hole_Diameter
!=
b
.
m_Hole_Diameter
)
return
a
.
m_Hole_Diameter
<
b
.
m_Hole_Diameter
;
if
(
a
.
m_Hole_Pos_X
!=
b
.
m_Hole_Pos_X
)
return
a
.
m_Hole_Pos_X
<
b
.
m_Hole_Pos_X
;
return
a
.
m_Hole_Pos_Y
<
b
.
m_Hole_Pos_Y
;
if
(
a
.
m_Hole_Diameter
!=
b
.
m_Hole_Diameter
)
return
a
.
m_Hole_Diameter
<
b
.
m_Hole_Diameter
;
if
(
a
.
m_Hole_Pos_X
!=
b
.
m_Hole_Pos_X
)
return
a
.
m_Hole_Pos_X
<
b
.
m_Hole_Pos_X
;
return
a
.
m_Hole_Pos_Y
<
b
.
m_Hole_Pos_Y
;
}
/**
* Function BuildHolesList
* Create the list of holes and tools for a given board
* The list is sorted by incr
aesin
drill values
* The list is sorted by incr
easing
drill values
* Only holes from aFirstLayer to aLastLayer copper layers are listed (for vias, because pad holes are always through holes)
* @param Pcb : the given board
* @param aHoleListBuffer : the std::vector<HOLE_INFO> to fill with pcb holes info
* @param aToolListBuffer : the std::vector<DRILL_TOOL> to fill with tools to use
* @param aFirstLayer = first layer to consider
* @param aLastLayer = last layer to consider
* @param aFirstLayer = first layer to consider. if < 0 aFirstLayer is ignored (used to creates report file)
* @param aLastLayer = last layer to consider. if < 0 aLastLayer is ignored
* @param aLastLayer = last layer to consider. if < 0 aLastLayer is ignored
* @param aExcludeThroughHoles : if true, exclude through holes ( pads and vias through )
*/
void
Build_Holes_List
(
BOARD
*
aPcb
,
std
::
vector
<
HOLE_INFO
>&
aHoleListBuffer
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
,
int
aFirstLayer
,
int
aLastLayer
)
int
aFirstLayer
,
int
aLastLayer
,
bool
aExcludeThroughHoles
)
{
HOLE_INFO
new_hole
;
int
hole_value
;
...
...
@@ -52,11 +55,14 @@ void Build_Holes_List( BOARD* aPcb,
aHoleListBuffer
.
clear
();
aToolListBuffer
.
clear
();
if
(
aFirstLayer
>
aLastLayer
)
EXCHG
(
aFirstLayer
,
aLastLayer
);
if
(
(
aFirstLayer
>=
0
)
&&
(
aLastLayer
>=
0
)
)
{
if
(
aFirstLayer
>
aLastLayer
)
EXCHG
(
aFirstLayer
,
aLastLayer
);
}
/* build hole list for vias */
TRACK
*
track
=
aPcb
->
m_Track
;
TRACK
*
track
=
aPcb
->
m_Track
;
for
(
;
track
!=
NULL
;
track
=
track
->
Next
()
)
{
if
(
track
->
Type
()
!=
TYPEVIA
)
...
...
@@ -73,38 +79,47 @@ void Build_Holes_List( BOARD* aPcb,
new_hole
.
m_Hole_Pos_X
=
via
->
m_Start
.
x
;
new_hole
.
m_Hole_Pos_Y
=
via
->
m_Start
.
y
;
// hole position
via
->
ReturnLayerPair
(
&
new_hole
.
m_Hole_Top_Layer
,
&
new_hole
.
m_Hole_Bottom_Layer
);
// ReturnLayerPair return params with m_Hole_Bottom_Layer < m_Hole_Top_Layer
if
(
new_hole
.
m_Hole_Bottom_Layer
>
aFirstLayer
)
// ReturnLayerPair return params with m_Hole_Bottom_Layer < m_Hole_Top_Layer
if
(
(
new_hole
.
m_Hole_Bottom_Layer
>
aFirstLayer
)
&&
(
aFirstLayer
>=
0
)
)
continue
;
if
(
(
new_hole
.
m_Hole_Top_Layer
<
aLastLayer
)
&&
(
aLastLayer
>=
0
)
)
continue
;
if
(
new_hole
.
m_Hole_Top_Layer
<
aLastLayer
)
if
(
aExcludeThroughHoles
&&
(
new_hole
.
m_Hole_Bottom_Layer
==
COPPER_LAYER_N
)
&&
(
new_hole
.
m_Hole_Top_Layer
==
LAYER_CMP_N
)
)
continue
;
aHoleListBuffer
.
push_back
(
new_hole
);
}
/* build hole list for pads */
MODULE
*
Module
=
aPcb
->
m_Modules
;
for
(
;
Module
!=
NULL
;
Module
=
Module
->
Next
()
)
/* build hole list for pads (assumed always through holes) */
if
(
!
aExcludeThroughHoles
)
{
/* Read and analyse pads */
D_PAD
*
pad
=
Module
->
m_Pads
;
for
(
;
pad
!=
NULL
;
pad
=
pad
->
Next
()
)
MODULE
*
Module
=
aPcb
->
m_Modules
;
for
(
;
Module
!=
NULL
;
Module
=
Module
->
Next
()
)
{
if
(
pad
->
m_Drill
.
x
==
0
)
continue
;
new_hole
.
m_Tool_Reference
=
-
1
;
// Flag is: Not initialized
new_hole
.
m_Hole_Orient
=
pad
->
m_Orient
;
new_hole
.
m_Hole_Shape
=
0
;
// hole shape: round
new_hole
.
m_Hole_Diameter
=
min
(
pad
->
m_Drill
.
x
,
pad
->
m_Drill
.
x
);
new_hole
.
m_Hole_SizeX
=
new_hole
.
m_Hole_SizeY
=
new_hole
.
m_Hole_Diameter
;
if
(
pad
->
m_DrillShape
!=
PAD_CIRCLE
)
new_hole
.
m_Hole_Shape
=
1
;
// oval flag set
new_hole
.
m_Hole_SizeX
=
pad
->
m_Drill
.
x
;
new_hole
.
m_Hole_SizeY
=
pad
->
m_Drill
.
y
;
new_hole
.
m_Hole_Pos_X
=
pad
->
m_Pos
.
x
;
new_hole
.
m_Hole_Pos_Y
=
pad
->
m_Pos
.
y
;
// hole position
new_hole
.
m_Hole_Bottom_Layer
=
COPPER_LAYER_N
;
new_hole
.
m_Hole_Top_Layer
=
LAYER_CMP_N
;
// pad holes are through holes
aHoleListBuffer
.
push_back
(
new_hole
);
/* Read and analyse pads */
D_PAD
*
pad
=
Module
->
m_Pads
;
for
(
;
pad
!=
NULL
;
pad
=
pad
->
Next
()
)
{
if
(
pad
->
m_Drill
.
x
==
0
)
continue
;
new_hole
.
m_Tool_Reference
=
-
1
;
// Flag is: Not initialized
new_hole
.
m_Hole_Orient
=
pad
->
m_Orient
;
new_hole
.
m_Hole_Shape
=
0
;
// hole shape: round
new_hole
.
m_Hole_Diameter
=
min
(
pad
->
m_Drill
.
x
,
pad
->
m_Drill
.
x
);
new_hole
.
m_Hole_SizeX
=
new_hole
.
m_Hole_SizeY
=
new_hole
.
m_Hole_Diameter
;
if
(
pad
->
m_DrillShape
!=
PAD_CIRCLE
)
new_hole
.
m_Hole_Shape
=
1
;
// oval flag set
new_hole
.
m_Hole_SizeX
=
pad
->
m_Drill
.
x
;
new_hole
.
m_Hole_SizeY
=
pad
->
m_Drill
.
y
;
new_hole
.
m_Hole_Pos_X
=
pad
->
m_Pos
.
x
;
new_hole
.
m_Hole_Pos_Y
=
pad
->
m_Pos
.
y
;
// hole position
new_hole
.
m_Hole_Bottom_Layer
=
COPPER_LAYER_N
;
new_hole
.
m_Hole_Top_Layer
=
LAYER_CMP_N
;
// pad holes are through holes
aHoleListBuffer
.
push_back
(
new_hole
);
}
}
}
...
...
pcbnew/gendrill.cpp
View file @
22affc67
...
...
@@ -251,14 +251,23 @@ void WinEDA_DrillFrame::UpdateConfig()
void
WinEDA_DrillFrame
::
GenDrillFiles
(
wxCommandEvent
&
event
)
/*************************************************************/
/* Calls the functions to create EXCELLON drill files and/od drill map files
/**
* Function GenDrillFiles
* Calls the functions to create EXCELLON drill files and/od drill map files
* When all holes are through, one excellon file is created
* when there are some partial holes (some blind or buried vias:
* One excellon file is created, for all through holes.
* And one file per layer pair, which have one or more holes, excluding through holes, already in the first file.
*/
{
wxString
FullFileName
,
Mask
(
wxT
(
"*"
)
),
Ext
(
wxT
(
".drl"
)
);
wxString
BaseFileName
;
wxString
layer_extend
;
// added to the Board FileName to create FullFileName (= Board FileName + layer pair names)
wxString
msg
;
bool
ExistsBuriedVias
=
false
;
// If true, dri
il files are created layer pair by layer pair
bool
ExistsBuriedVias
=
false
;
// If true, dri
ll files are created layer pair by layer pair for buried vias
int
layer1
=
COPPER_LAYER_N
;
int
layer2
=
LAYER_CMP_N
;
bool
gen_through_holes
=
true
;
UpdateConfig
();
/* set params and Save drill options */
...
...
@@ -272,16 +281,17 @@ void WinEDA_DrillFrame::GenDrillFiles( wxCommandEvent& event )
if
(
m_MicroViasCount
||
m_BlindOrBuriedViasCount
)
ExistsBuriedVias
=
true
;
if
(
ExistsBuriedVias
)
layer2
=
layer1
+
1
;;
/* Get the file name */
Mask
+=
Ext
;
for
(
;
;
)
{
Build_Holes_List
(
m_Parent
->
m_Pcb
,
s_HoleListBuffer
,
s_ToolListBuffer
,
layer1
,
layer2
,
gen_through_holes
?
false
:
true
);
if
(
s_ToolListBuffer
.
size
()
==
0
)
// No holes !
continue
;
FullFileName
=
m_Parent
->
m_CurrentScreen
->
m_FileName
;
wxString
layer_extend
;
layer_extend
.
Empty
();
if
(
ExistsBuriedVia
s
)
if
(
!
gen_through_hole
s
)
{
if
(
layer1
==
COPPER_LAYER_N
)
layer_extend
<<
wxT
(
"-copper"
);
...
...
@@ -305,9 +315,6 @@ void WinEDA_DrillFrame::GenDrillFiles( wxCommandEvent& event )
TRUE
);
Build_Holes_List
(
m_Parent
->
m_Pcb
,
s_HoleListBuffer
,
s_ToolListBuffer
,
layer1
,
layer2
);
if
(
FullFileName
!=
wxEmptyString
)
{
dest
=
wxFopen
(
FullFileName
,
wxT
(
"w"
)
);
...
...
@@ -328,33 +335,36 @@ void WinEDA_DrillFrame::GenDrillFiles( wxCommandEvent& event )
break
;
case
1
:
GenDrillMap
(
FullFileName
,
s_HoleListBuffer
,
s_ToolListBuffer
,
PLOT_FORMAT_HPGL
);
GenDrillMap
(
FullFileName
,
s_HoleListBuffer
,
s_ToolListBuffer
,
PLOT_FORMAT_HPGL
);
break
;
case
2
:
GenDrillMap
(
FullFileName
,
s_HoleListBuffer
,
s_ToolListBuffer
,
PLOT_FORMAT_POST
);
GenDrillMap
(
FullFileName
,
s_HoleListBuffer
,
s_ToolListBuffer
,
PLOT_FORMAT_POST
);
break
;
}
if
(
m_Choice_Drill_Report
->
GetSelection
()
>
0
)
GenDrillReport
(
FullFileName
,
s_ToolListBuffer
);
if
(
!
ExistsBuriedVias
)
break
;
if
(
gen_through_holes
)
layer2
=
layer1
+
1
;
else
{
if
(
layer2
>=
LAYER_CMP_N
)
// no more layer pair to consider
break
;
layer1
++
;
layer2
++
;
// use next layer pair
if
(
layer2
==
g_DesignSettings
.
m_CopperLayerCount
-
1
)
// The last layer is reached
layer2
=
LAYER_CMP_N
;
// the last layer is always the component layer
}
gen_through_holes
=
false
;
}
if
(
layer2
>=
LAYER_CMP_N
)
// no more layer pair to consider
break
;
layer1
++
;
layer2
++
;
// use next layer pair
if
(
layer2
==
g_DesignSettings
.
m_CopperLayerCount
-
1
)
// The last layer is reached
layer2
=
LAYER_CMP_N
;
// the last layer is always the component layer
if
(
m_Choice_Drill_Report
->
GetSelection
()
>
0
)
{
FullFileName
=
m_Parent
->
m_CurrentScreen
->
m_FileName
;
GenDrillReport
(
FullFileName
);
}
EndModal
(
0
);
}
...
...
@@ -747,7 +757,7 @@ void WinEDA_DrillFrame::GenDrillMap( const wxString aFileName,
/**************************************************************************************************/
void
WinEDA_DrillFrame
::
GenDrillReport
(
const
wxString
aFileName
,
std
::
vector
<
DRILL_TOOL
>&
buffer
)
void
WinEDA_DrillFrame
::
GenDrillReport
(
const
wxString
aFileName
)
/**************************************************************************************************/
/*
...
...
@@ -780,6 +790,9 @@ void WinEDA_DrillFrame::GenDrillReport( const wxString aFileName, std::vector<DR
DisplayError
(
this
,
msg
);
return
;
}
GenDrillReportFile
(
dest
,
m_Parent
->
m_CurrentScreen
->
m_FileName
,
buffer
,
s_Unit_Drill_is_Inch
);
GenDrillReportFile
(
dest
,
m_Parent
->
m_Pcb
,
m_Parent
->
m_CurrentScreen
->
m_FileName
,
s_Unit_Drill_is_Inch
,
s_HoleListBuffer
,
s_ToolListBuffer
);
}
pcbnew/gendrill.h
View file @
22affc67
/******************************************************************************
*
/
/* classes and functions declaration u
n
sed in drill file and report generation */
/******************************************************************************
*
/
/******************************************************************************/
/* classes and functions declaration used in drill file and report generation */
/******************************************************************************/
#ifndef GENDRILL_H
#define GENDRILL_H
/* the DRILL_TOOL class handle tools used in the excellon drill file */
/* the DRILL_TOOL class handle
s
tools used in the excellon drill file */
class
DRILL_TOOL
{
public
:
...
...
@@ -62,13 +62,18 @@ enum zeros_fmt {
/**
* Function BuildHolesList
* Create the list of holes and tools for a given board
* The list is sorted by incraesin drill values
* Only holes from aFirstLayer to aLastLayer copper layers are listed (for vias, because pad holes are always through holes)
* @param Pcb : the given board
* @param aHoleListBuffer : the std::vector<HOLE_INFO> to fill with pcb info
* @param aHoleListBuffer : the std::vector<HOLE_INFO> to fill with pcb
holes
info
* @param aToolListBuffer : the std::vector<DRILL_TOOL> to fill with tools to use
* @param aFirstLayer = first layer to consider. if < 0 aFirstLayer is ignored
* @param aLastLayer = last layer to consider. if < 0 aLastLayer is ignored
* @param aExcludeThroughHoles : if true, exclude through holes ( pads and vias through )
*/
void
Build_Holes_List
(
BOARD
*
Pcb
,
std
::
vector
<
HOLE_INFO
>&
aHoleListBuffer
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
,
int
aFirstLayer
,
int
aLastLayer
);
int
aFirstLayer
,
int
aLastLayer
,
bool
aExcludeThroughHoles
);
void
GenDrillMapFile
(
BOARD
*
aPcb
,
...
...
@@ -87,8 +92,12 @@ void Gen_Drill_PcbMap( BOARD* aPcb, FILE* aFile,
/*
* Create a list of drill values and drill count
* there is only one report for all drill files even when buried or blinds vias exist
*/
void
GenDrillReportFile
(
FILE
*
aFile
,
const
wxString
&
aBoardFilename
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
,
bool
aUnit_Drill_is_Inch
);
void
GenDrillReportFile
(
FILE
*
aFile
,
BOARD
*
aPcb
,
const
wxString
&
aBoardFilename
,
bool
aUnit_Drill_is_Inch
,
std
::
vector
<
HOLE_INFO
>
&
aHoleListBuffer
,
std
::
vector
<
DRILL_TOOL
>&
aToolListBuffer
);
#endif // #ifndef GENDRILL_H
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