diff --git a/change_log.txt b/change_log.txt index 3cff2f7c03..df4f71e0b7 100644 --- a/change_log.txt +++ b/change_log.txt @@ -9,7 +9,18 @@ email address. 2008-Jan-25 UPDATE Jean-Pierre Charras ================================================================================ +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 diff --git a/pcbnew/dialog_gendrill.h b/pcbnew/dialog_gendrill.h index e49f668a43..0fbaf1458f 100644 --- a/pcbnew/dialog_gendrill.h +++ b/pcbnew/dialog_gendrill.h @@ -153,7 +153,7 @@ private: void UpdatePrecisionOptions( wxCommandEvent& event ); void UpdateConfig(); void Write_Excellon_Header( FILE * aFile); - void GenDrillReport( const wxString aFileName, std::vector & buffer ); + void GenDrillReport( const wxString aFileName ); int Create_Drill_File_EXCELLON( std::vector & aHoleListBuffer, std::vector & aToolListBuffer ); int Gen_Liste_Tools( std::vector & buffer, bool print_header ); diff --git a/pcbnew/gen_drill_report_files.cpp b/pcbnew/gen_drill_report_files.cpp index 109035dffa..d217b1c0a1 100644 --- a/pcbnew/gen_drill_report_files.cpp +++ b/pcbnew/gen_drill_report_files.cpp @@ -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& aToolListBuffer, bool aUnit_Drill_is_Inch ) +void GenDrillReportFile( FILE* aFile, BOARD* aPcb, const wxString& aBoardFilename, + bool aUnit_Drill_is_Inch, + std::vector& aHoleListBuffer, + std::vector& 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 ); } diff --git a/pcbnew/gen_holes_and_tools_lists_for_drill.cpp b/pcbnew/gen_holes_and_tools_lists_for_drill.cpp index 1d87133f67..e6b6d56404 100644 --- a/pcbnew/gen_holes_and_tools_lists_for_drill.cpp +++ b/pcbnew/gen_holes_and_tools_lists_for_drill.cpp @@ -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 to fill with pcb holes info * @param aToolListBuffer : the std::vector 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& aHoleListBuffer, std::vector& 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 ); + } } } diff --git a/pcbnew/gendrill.cpp b/pcbnew/gendrill.cpp index 4a92ba507d..8b2cb228fe 100644 --- a/pcbnew/gendrill.cpp +++ b/pcbnew/gendrill.cpp @@ -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& buffer ) +void WinEDA_DrillFrame::GenDrillReport( const wxString aFileName ) /**************************************************************************************************/ /* @@ -780,6 +790,9 @@ void WinEDA_DrillFrame::GenDrillReport( const wxString aFileName, std::vectorm_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 ); } diff --git a/pcbnew/gendrill.h b/pcbnew/gendrill.h index 0739708f0f..669237045a 100644 --- a/pcbnew/gendrill.h +++ b/pcbnew/gendrill.h @@ -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 to fill with pcb info + * @param aHoleListBuffer : the std::vector to fill with pcb holes info * @param aToolListBuffer : the std::vector 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& aHoleListBuffer, std::vector& 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& aToolListBuffer, bool aUnit_Drill_is_Inch ); +void GenDrillReportFile( FILE* aFile, BOARD * aPcb, const wxString& aBoardFilename, + bool aUnit_Drill_is_Inch, + std::vector & aHoleListBuffer, + std::vector& aToolListBuffer + ); #endif // #ifndef GENDRILL_H