Better support for micro vias. infos in changelog
This commit is contained in:
parent
48dc3d0695
commit
22affc6750
|
@ -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>
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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, "\ntotal holes count %d\n\n\n", TotalHoleCount );
|
||||
fputs( line, aFile );
|
||||
|
||||
TotalHoleCount += aToolListBuffer[ii].m_TotalCount;
|
||||
if( g_DesignSettings.m_CopperLayerCount <= 2 )
|
||||
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;
|
||||
}
|
||||
|
||||
sprintf( line, "\ntotal holes count %d\n", TotalHoleCount );
|
||||
fputs( line, aFile );
|
||||
|
||||
fclose( aFile );
|
||||
}
|
||||
|
|
|
@ -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 incraesin drill values
|
||||
* The list is sorted by increasing 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 )
|
||||
if( (new_hole.m_Hole_Top_Layer < aLastLayer) && (aLastLayer >= 0) )
|
||||
continue;
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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, driil files are created layer pair by layer pair
|
||||
bool ExistsBuriedVias = false; // If true, drill 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( ExistsBuriedVias )
|
||||
if( !gen_through_holes )
|
||||
{
|
||||
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( 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( 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( 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 );
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/*******************************************************************************/
|
||||
/* classes and functions declaration unsed 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 handles 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
|
||||
|
|
Loading…
Reference in New Issue