Loading pcbnew/exporters/gen_drill_report_files.cpp +56 −110 Original line number Original line Diff line number Diff line Loading @@ -55,12 +55,6 @@ inline double diameter_in_mm( double ius ) } } /* Creates a hole map of the board in HPGL, POSTSCRIPT or other supported formats * Each hole size has a the drill mark symbol (circle, cross X, cross + ...) up to * PLOTTER::MARKER_COUNT different values. * If more than PLOTTER::MARKER_COUNT different values, * these other vaules share the same mark */ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, const PAGE_INFO& aSheet, const PAGE_INFO& aSheet, PlotFormat aFormat ) PlotFormat aFormat ) Loading Loading @@ -239,8 +233,7 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, plotY += intervalle; plotY += intervalle; plot_diam = KiROUND( m_toolListBuffer[ii].m_Diameter ); plot_diam = KiROUND( m_toolListBuffer[ii].m_Diameter ); x = KiROUND( plotX - textmarginaftersymbol * charScale x = KiROUND( plotX - textmarginaftersymbol * charScale - plot_diam / 2.0 ); - plot_diam / 2.0 ); y = KiROUND( plotY + charSize * charScale ); y = KiROUND( plotY + charSize * charScale ); plotter->Marker( wxPoint( x, y ), plot_diam, ii ); plotter->Marker( wxPoint( x, y ), plot_diam, ii ); Loading @@ -267,9 +260,8 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, m_toolListBuffer[ii].m_OvalCount ); m_toolListBuffer[ii].m_OvalCount ); msg += FROM_UTF8( line ); msg += FROM_UTF8( line ); plotter->Text( wxPoint( plotX, y ), UNSPECIFIED_COLOR, plotter->Text( wxPoint( plotX, y ), UNSPECIFIED_COLOR, msg, 0, msg, wxSize( KiROUND( charSize * charScale ), 0, wxSize( KiROUND( charSize * charScale ), KiROUND( charSize * charScale ) ), KiROUND( charSize * charScale ) ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, TextWidth, false, false ); TextWidth, false, false ); Loading @@ -287,52 +279,6 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, } } /* * Create a plain text report file giving a list of drill values and drill count * for through holes, oblong holes, and for buried vias, * drill values and drill count per layer pair */ /* Here is a sample created by this function: * Drill report for F:/tmp/interf_u/interf_u.brd * Created on 04/10/2012 20:48:38 * Selected Drill Unit: Imperial (inches) * * Drill report for plated through holes : * T1 0,025" 0,64mm (88 holes) * T2 0,031" 0,79mm (120 holes) * T3 0,032" 0,81mm (151 holes) (with 1 slot) * T4 0,040" 1,02mm (43 holes) * T5 0,079" 2,00mm (1 hole) (with 1 slot) * T6 0,120" 3,05mm (1 hole) (with 1 slot) * * Total plated holes count 404 * * * Drill report for buried and blind vias : * * Drill report for holes from layer Soudure to layer Interne1 : * * Total plated holes count 0 * * * Drill report for holes from layer Interne1 to layer Interne2 : * T1 0,025" 0,64mm (3 holes) * * Total plated holes count 3 * * * Drill report for holes from layer Interne2 to layer Composant : * T1 0,025" 0,64mm (1 hole) * * Total plated holes count 1 * * * Drill report for unplated through holes : * T1 0,120" 3,05mm (1 hole) (with 1 slot) * * Total unplated holes count 1 * */ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) { { unsigned totalHoleCount; unsigned totalHoleCount; Loading Loading @@ -461,17 +407,17 @@ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) return true; return true; } } // Helper function to plot drill marks: bool EXCELLON_WRITER::PlotDrillMarks( PLOTTER* aPlotter ) bool EXCELLON_WRITER::PlotDrillMarks( PLOTTER* aPlotter ) { { // Plot the drill map: // Plot the drill map: wxPoint pos; wxPoint pos; for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { pos = m_holeListBuffer[ii].m_Hole_Pos; pos = m_holeListBuffer[ii].m_Hole_Pos; /* Always plot the drill symbol (for slots identifies the needed // Always plot the drill symbol (for slots identifies the needed cutter! * cutter!) */ aPlotter->Marker( pos, m_holeListBuffer[ii].m_Hole_Diameter, aPlotter->Marker( pos, m_holeListBuffer[ii].m_Hole_Diameter, m_holeListBuffer[ii].m_Tool_Reference - 1 ); m_holeListBuffer[ii].m_Tool_Reference - 1 ); Loading pcbnew/exporters/gendrill_Excellon_writer.cpp +35 −54 Original line number Original line Diff line number Diff line Loading @@ -69,10 +69,6 @@ */ */ /* * Create the drill file in EXCELLON format * return hole count */ int EXCELLON_WRITER::CreateDrillFile( FILE* aFile ) int EXCELLON_WRITER::CreateDrillFile( FILE* aFile ) { { m_file = aFile; m_file = aFile; Loading Loading @@ -100,7 +96,8 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) fputs( "G90\n", m_file ); // Absolute mode fputs( "G90\n", m_file ); // Absolute mode fputs( "G05\n", m_file ); // Drill mode fputs( "G05\n", m_file ); // Drill mode /* Units : */ // Units : if( !m_minimalHeader ) if( !m_minimalHeader ) { { if( m_unitsDecimal ) if( m_unitsDecimal ) Loading @@ -112,12 +109,14 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) /* Read the hole file and generate lines for normal holes (oblong /* Read the hole file and generate lines for normal holes (oblong * holes will be created later) */ * holes will be created later) */ int tool_reference = -2; int tool_reference = -2; for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { HOLE_INFO& hole_descr = m_holeListBuffer[ii]; HOLE_INFO& hole_descr = m_holeListBuffer[ii]; if( hole_descr.m_Hole_Shape ) if( hole_descr.m_Hole_Shape ) continue; // oblong holes will be created later continue; // oblong holes will be created later if( tool_reference != hole_descr.m_Tool_Reference ) if( tool_reference != hole_descr.m_Tool_Reference ) { { tool_reference = hole_descr.m_Tool_Reference; tool_reference = hole_descr.m_Tool_Reference; Loading Loading @@ -145,16 +144,18 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { HOLE_INFO& hole_descr = m_holeListBuffer[ii]; HOLE_INFO& hole_descr = m_holeListBuffer[ii]; if( hole_descr.m_Hole_Shape == 0 ) if( hole_descr.m_Hole_Shape == 0 ) continue; // wait for oblong holes continue; // wait for oblong holes if( tool_reference != hole_descr.m_Tool_Reference ) if( tool_reference != hole_descr.m_Tool_Reference ) { { tool_reference = hole_descr.m_Tool_Reference; tool_reference = hole_descr.m_Tool_Reference; fprintf( m_file, "T%d\n", tool_reference ); fprintf( m_file, "T%d\n", tool_reference ); } } diam = std::min( hole_descr.m_Hole_Size.x, diam = std::min( hole_descr.m_Hole_Size.x, hole_descr.m_Hole_Size.y ); hole_descr.m_Hole_Size.y ); if( diam == 0 ) if( diam == 0 ) continue; continue; Loading @@ -166,20 +167,23 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) if( hole_descr.m_Hole_Size.x < hole_descr.m_Hole_Size.y ) if( hole_descr.m_Hole_Size.x < hole_descr.m_Hole_Size.y ) { { int delta = ( hole_descr.m_Hole_Size.y - hole_descr.m_Hole_Size.x ) / 2; int delta = ( hole_descr.m_Hole_Size.y - hole_descr.m_Hole_Size.x ) / 2; y0 -= delta; yf += delta; y0 -= delta; yf += delta; } } else else { { int delta = ( hole_descr.m_Hole_Size.x - hole_descr.m_Hole_Size.y ) / 2; int delta = ( hole_descr.m_Hole_Size.x - hole_descr.m_Hole_Size.y ) / 2; x0 -= delta; xf += delta; x0 -= delta; xf += delta; } } RotatePoint( &x0, &y0, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &x0, &y0, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &xf, &yf, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &xf, &yf, xc, yc, hole_descr.m_Hole_Orient ); if( !m_mirror ) if( !m_mirror ) { { y0 *= -1; yf *= -1; y0 *= -1; yf *= -1; } } xt = x0 * m_conversionUnits; xt = x0 * m_conversionUnits; Loading @@ -189,11 +193,12 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) /* remove the '\n' from end of line, because we must add the "G85" /* remove the '\n' from end of line, because we must add the "G85" * command to the line: */ * command to the line: */ for( int kk = 0; line[kk] != 0; kk++ ) for( int kk = 0; line[kk] != 0; kk++ ) { if( line[kk] == '\n' || line[kk] =='\r' ) if( line[kk] == '\n' || line[kk] =='\r' ) line[kk] = 0; line[kk] = 0; } fputs( line, m_file ); fputs( line, m_file ); fputs( "G85", m_file ); // add the "G85" command fputs( "G85", m_file ); // add the "G85" command xt = xf * m_conversionUnits; xt = xf * m_conversionUnits; Loading @@ -213,14 +218,6 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) } } /** * SetFormat * Initialize internal parameters to match the given format * @param aMetric = true for metric coordinates, false for imperial units * @param aZerosFmt = DECIMAL_FORMAT, SUPPRESS_LEADING, SUPPRESS_TRAILING, KEEP_ZEROS * @param aLeftDigits = number of digits for integer part of coordinates * @param aRightDigits = number of digits for mantissa part of coordinates */ void EXCELLON_WRITER::SetFormat( bool aMetric, void EXCELLON_WRITER::SetFormat( bool aMetric, zeros_fmt aZerosFmt, zeros_fmt aZerosFmt, int aLeftDigits, int aLeftDigits, Loading @@ -240,10 +237,6 @@ void EXCELLON_WRITER::SetFormat( bool aMetric, } } /* Created a line like: * X48000Y19500 * According to the selected format */ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoordY ) void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoordY ) { { wxString xs, ys; wxString xs, ys; Loading Loading @@ -277,8 +270,10 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo //Remove useless trailing 0 //Remove useless trailing 0 while( xs.Last() == '0' ) while( xs.Last() == '0' ) xs.RemoveLast(); xs.RemoveLast(); while( ys.Last() == '0' ) while( ys.Last() == '0' ) ys.RemoveLast(); ys.RemoveLast(); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); break; break; Loading @@ -301,6 +296,7 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo if( aCoordX < 0 ) if( aCoordX < 0 ) xpad++; xpad++; if( aCoordY < 0 ) if( aCoordY < 0 ) ypad++; ypad++; Loading @@ -308,10 +304,12 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); size_t j = xs.Len() - 1; size_t j = xs.Len() - 1; while( xs[j] == '0' && j ) while( xs[j] == '0' && j ) xs.Truncate( j-- ); xs.Truncate( j-- ); j = ys.Len() - 1; j = ys.Len() - 1; while( ys[j] == '0' && j ) while( ys[j] == '0' && j ) ys.Truncate( j-- ); ys.Truncate( j-- ); Loading @@ -327,8 +325,10 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo if( aCoordX < 0 ) if( aCoordX < 0 ) xpad++; xpad++; if( aCoordY < 0 ) if( aCoordY < 0 ) ypad++; ypad++; xs.Printf( wxT( "%0*d" ), xpad, KiROUND( aCoordX ) ); xs.Printf( wxT( "%0*d" ), xpad, KiROUND( aCoordX ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); Loading @@ -337,13 +337,6 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo } } /* Print the DRILL file header. The full header is: * M48 * ;DRILL file {PCBNEW (2007-11-29-b)} date 17/1/2008-21:02:35 * ;FORMAT={ <precision> / absolute / <units> / <numbers format>} * FMAT,2 * INCH,TZ */ void EXCELLON_WRITER::WriteEXCELLONHeader() void EXCELLON_WRITER::WriteEXCELLONHeader() { { fputs( "M48\n", m_file ); // The beginning of a header fputs( "M48\n", m_file ); // The beginning of a header Loading @@ -361,13 +354,14 @@ void EXCELLON_WRITER::WriteEXCELLONHeader() msg << m_precision.GetPrecisionString(); msg << m_precision.GetPrecisionString(); else else msg << wxT( "-:-" ); // in decimal format the precision is irrelevant msg << wxT( "-:-" ); // in decimal format the precision is irrelevant msg << wxT( "/ absolute / " ); msg << wxT( "/ absolute / " ); msg << ( m_unitsDecimal ? wxT( "metric" ) : wxT( "inch" ) ); msg << ( m_unitsDecimal ? wxT( "metric" ) : wxT( "inch" ) ); /* Adding numbers notation format. /* Adding numbers notation format. * this is same as m_Choice_Zeros_Format strings, but NOT translated * this is same as m_Choice_Zeros_Format strings, but NOT translated * because some EXCELLON parsers do not like non ascii values * because some EXCELLON parsers do not like non ASCII values * so we use ONLY english (ascii) strings. * so we use ONLY English (ASCII) strings. * if new options are added in m_Choice_Zeros_Format, they must also * if new options are added in m_Choice_Zeros_Format, they must also * be added here * be added here */ */ Loading Loading @@ -432,18 +426,6 @@ static bool CmpHoleDiameterValue( const HOLE_INFO& a, const HOLE_INFO& b ) } } /* * Create the list of holes and tools for a given board * 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 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 aExcludeThroughHoles : if true, exclude through holes ( pads and vias through ) * param aGenerateNPTH_list : * true to create NPTH only list (with no plated holes) * false to created plated holes list (with no NPTH ) * param aMergePTHNPTH : if true, merge PTH and NPTH holes into one file by treating all holes as PTH */ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, int aLastLayer, int aLastLayer, bool aExcludeThroughHoles, bool aExcludeThroughHoles, Loading @@ -467,8 +449,7 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, return; return; } } /* build hole list for vias // build hole list for vias */ if( ! aGenerateNPTH_list ) // vias are always plated ! if( ! aGenerateNPTH_list ) // vias are always plated ! { { for( TRACK* track = m_pcb->m_Track; track; track = track->Next() ) for( TRACK* track = m_pcb->m_Track; track; track = track->Next() ) Loading Loading @@ -546,7 +527,7 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, sort( m_holeListBuffer.begin(), m_holeListBuffer.end(), CmpHoleDiameterValue ); sort( m_holeListBuffer.begin(), m_holeListBuffer.end(), CmpHoleDiameterValue ); // build the tool list // build the tool list int LastHole = -1; /* Set to not initialised (this is a value not used int LastHole = -1; /* Set to not initialized (this is a value not used * for m_holeListBuffer[ii].m_Hole_Diameter) */ * for m_holeListBuffer[ii].m_Hole_Diameter) */ DRILL_TOOL new_tool( 0 ); DRILL_TOOL new_tool( 0 ); unsigned jj; unsigned jj; Loading pcbnew/exporters/gendrill_Excellon_writer.h +72 −18 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ public: LAYER_NUM m_Hole_Top_Layer; // hole ending layer (usually front layer): LAYER_NUM m_Hole_Top_Layer; // hole ending layer (usually front layer): // m_Hole_First_Layer < m_Hole_Last_Layer // m_Hole_First_Layer < m_Hole_Last_Layer bool m_Hole_NotPlated; // hole not plated. Must be in a specific drill file bool m_Hole_NotPlated; // hole not plated. Must be in a specific drill file public: public: HOLE_INFO() HOLE_INFO() { { Loading @@ -88,7 +89,7 @@ class DRILL_PRECISION { { public: public: int m_lhs; // Left digit number (integer value of coordinates) int m_lhs; // Left digit number (integer value of coordinates) int m_rhs; // Right digit number (deciam value of coordinates) int m_rhs; // Right digit number (decimal value of coordinates) public: DRILL_PRECISION( int l = 2, int r = 4 ) public: DRILL_PRECISION( int l = 2, int r = 4 ) { { Loading Loading @@ -120,26 +121,28 @@ public: SUPPRESS_TRAILING, SUPPRESS_TRAILING, KEEP_ZEROS KEEP_ZEROS }; }; wxPoint m_Offset; // offset coordinates wxPoint m_Offset; // offset coordinates bool m_ShortHeader; // true to generate the smallest header (strip comments) bool m_ShortHeader; // true to generate the smallest header (strip comments) private: private: FILE* m_file; // The output file FILE* m_file; // The output file BOARD* m_pcb; BOARD* m_pcb; bool m_minimalHeader; // True to use minimal haeder bool m_minimalHeader; // True to use minimal header // in excellon file (strip comments) // in excellon file (strip comments) bool m_unitsDecimal; // true = decimal, false = inches bool m_unitsDecimal; // true = decimal, false = inches zeros_fmt m_zeroFormat; // the zero format option for output file zeros_fmt m_zeroFormat; // the zero format option for output file DRILL_PRECISION m_precision; // The current coordinate precision (not used in decimat format) DRILL_PRECISION m_precision; // The current coordinate precision (not used in decimal format) double m_conversionUnits; // scaling factor to convert the board unites to Excellon units double m_conversionUnits; // scaling factor to convert the board unites to Excellon units // (i.e inches or mm) // (i.e inches or mm) bool m_mirror; bool m_mirror; wxPoint m_offset; // Drill offset ooordinates wxPoint m_offset; // Drill offset coordinates bool m_mergePTHNPTH; bool m_mergePTHNPTH; std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) { { m_file = NULL; m_file = NULL; m_pcb = aPcb; m_pcb = aPcb; Loading @@ -158,7 +161,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) /** /** * Return the plot offset (usually the position * Return the plot offset (usually the position * of the auxiliaty axis * of the auxiliary axis */ */ const wxPoint GetOffset() { return m_offset; } const wxPoint GetOffset() { return m_offset; } Loading Loading @@ -210,8 +213,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) /** /** * Function CreateDrillFile * Function CreateDrillFile * Creates an Excellon drill file * Creates an Excellon drill file * @param aFile = an opened file to write to * @param aFile = an opened file to write to will be closed by CreateDrillFile * will be closed by CreateDrillFile * @return hole count * @return hole count */ */ int CreateDrillFile( FILE * aFile ); int CreateDrillFile( FILE * aFile ); Loading @@ -222,6 +224,47 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) * for through holes, oblong holes, and for buried vias, * for through holes, oblong holes, and for buried vias, * drill values and drill count per layer pair * drill values and drill count per layer pair * there is only one report for all drill files even when buried or blinds vias exist * there is only one report for all drill files even when buried or blinds vias exist * * Here is a sample created by this function: * Drill report for F:/tmp/interf_u/interf_u.brd * Created on 04/10/2012 20:48:38 * Selected Drill Unit: Imperial (inches) * * Drill report for plated through holes : * T1 0,025" 0,64mm (88 holes) * T2 0,031" 0,79mm (120 holes) * T3 0,032" 0,81mm (151 holes) (with 1 slot) * T4 0,040" 1,02mm (43 holes) * T5 0,079" 2,00mm (1 hole) (with 1 slot) * T6 0,120" 3,05mm (1 hole) (with 1 slot) * * Total plated holes count 404 * * * Drill report for buried and blind vias : * * Drill report for holes from layer Soudure to layer Interne1 : * * Total plated holes count 0 * * * Drill report for holes from layer Interne1 to layer Interne2 : * T1 0,025" 0,64mm (3 holes) * * Total plated holes count 3 * * * Drill report for holes from layer Interne2 to layer Composant : * T1 0,025" 0,64mm (1 hole) * * Total plated holes count 1 * * * Drill report for unplated through holes : * T1 0,120" 3,05mm (1 hole) (with 1 slot) * * Total unplated holes count 1 * * @param aFullFileName : the name of the file to create * @param aFullFileName : the name of the file to create * m_unitsDecimal = false tu use inches, true to use mm in report file * m_unitsDecimal = false tu use inches, true to use mm in report file * * Loading @@ -233,7 +276,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) * Function GenDrillMapFile * Function GenDrillMapFile * Plot a map of drill marks for holes. * Plot a map of drill marks for holes. * @param aFullFileNameWithoutExt : the full filename of the file to create, * @param aFullFileNameWithoutExt : the full filename of the file to create, * without extension (will be added accordint ti the format) * without extension (will be added according to the format) * @param aSheet : the paper sheet to use for plot * @param aSheet : the paper sheet to use for plot * @param aFormat : one of the supported plot formats (see enum PlotFormat ) * @param aFormat : one of the supported plot formats (see enum PlotFormat ) */ */ Loading @@ -241,8 +284,21 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) const PAGE_INFO& aSheet, const PAGE_INFO& aSheet, PlotFormat aFormat ); PlotFormat aFormat ); private: private: /* Print the DRILL file header. The full header is: * M48 * ;DRILL file {PCBNEW (2007-11-29-b)} date 17/1/2008-21:02:35 * ;FORMAT={ <precision> / absolute / <units> / <numbers format>} * FMAT,2 * INCH,TZ */ void WriteEXCELLONHeader(); void WriteEXCELLONHeader(); void WriteEXCELLONEndOfFile(); void WriteEXCELLONEndOfFile(); /* Created a line like: * X48000Y19500 * According to the selected format */ void WriteCoordinates( char* aLine, double aCoordX, double aCoordY ); void WriteCoordinates( char* aLine, double aCoordX, double aCoordY ); /** Helper function. /** Helper function. Loading @@ -257,6 +313,4 @@ private: }; }; #endif // #ifndef _GENDRILL_EXCELLON_WRITER_ #endif // #ifndef _GENDRILL_EXCELLON_WRITER_ Loading
pcbnew/exporters/gen_drill_report_files.cpp +56 −110 Original line number Original line Diff line number Diff line Loading @@ -55,12 +55,6 @@ inline double diameter_in_mm( double ius ) } } /* Creates a hole map of the board in HPGL, POSTSCRIPT or other supported formats * Each hole size has a the drill mark symbol (circle, cross X, cross + ...) up to * PLOTTER::MARKER_COUNT different values. * If more than PLOTTER::MARKER_COUNT different values, * these other vaules share the same mark */ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, const PAGE_INFO& aSheet, const PAGE_INFO& aSheet, PlotFormat aFormat ) PlotFormat aFormat ) Loading Loading @@ -239,8 +233,7 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, plotY += intervalle; plotY += intervalle; plot_diam = KiROUND( m_toolListBuffer[ii].m_Diameter ); plot_diam = KiROUND( m_toolListBuffer[ii].m_Diameter ); x = KiROUND( plotX - textmarginaftersymbol * charScale x = KiROUND( plotX - textmarginaftersymbol * charScale - plot_diam / 2.0 ); - plot_diam / 2.0 ); y = KiROUND( plotY + charSize * charScale ); y = KiROUND( plotY + charSize * charScale ); plotter->Marker( wxPoint( x, y ), plot_diam, ii ); plotter->Marker( wxPoint( x, y ), plot_diam, ii ); Loading @@ -267,9 +260,8 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, m_toolListBuffer[ii].m_OvalCount ); m_toolListBuffer[ii].m_OvalCount ); msg += FROM_UTF8( line ); msg += FROM_UTF8( line ); plotter->Text( wxPoint( plotX, y ), UNSPECIFIED_COLOR, plotter->Text( wxPoint( plotX, y ), UNSPECIFIED_COLOR, msg, 0, msg, wxSize( KiROUND( charSize * charScale ), 0, wxSize( KiROUND( charSize * charScale ), KiROUND( charSize * charScale ) ), KiROUND( charSize * charScale ) ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, TextWidth, false, false ); TextWidth, false, false ); Loading @@ -287,52 +279,6 @@ bool EXCELLON_WRITER::GenDrillMapFile( const wxString& aFullFileName, } } /* * Create a plain text report file giving a list of drill values and drill count * for through holes, oblong holes, and for buried vias, * drill values and drill count per layer pair */ /* Here is a sample created by this function: * Drill report for F:/tmp/interf_u/interf_u.brd * Created on 04/10/2012 20:48:38 * Selected Drill Unit: Imperial (inches) * * Drill report for plated through holes : * T1 0,025" 0,64mm (88 holes) * T2 0,031" 0,79mm (120 holes) * T3 0,032" 0,81mm (151 holes) (with 1 slot) * T4 0,040" 1,02mm (43 holes) * T5 0,079" 2,00mm (1 hole) (with 1 slot) * T6 0,120" 3,05mm (1 hole) (with 1 slot) * * Total plated holes count 404 * * * Drill report for buried and blind vias : * * Drill report for holes from layer Soudure to layer Interne1 : * * Total plated holes count 0 * * * Drill report for holes from layer Interne1 to layer Interne2 : * T1 0,025" 0,64mm (3 holes) * * Total plated holes count 3 * * * Drill report for holes from layer Interne2 to layer Composant : * T1 0,025" 0,64mm (1 hole) * * Total plated holes count 1 * * * Drill report for unplated through holes : * T1 0,120" 3,05mm (1 hole) (with 1 slot) * * Total unplated holes count 1 * */ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) { { unsigned totalHoleCount; unsigned totalHoleCount; Loading Loading @@ -461,17 +407,17 @@ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName ) return true; return true; } } // Helper function to plot drill marks: bool EXCELLON_WRITER::PlotDrillMarks( PLOTTER* aPlotter ) bool EXCELLON_WRITER::PlotDrillMarks( PLOTTER* aPlotter ) { { // Plot the drill map: // Plot the drill map: wxPoint pos; wxPoint pos; for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { pos = m_holeListBuffer[ii].m_Hole_Pos; pos = m_holeListBuffer[ii].m_Hole_Pos; /* Always plot the drill symbol (for slots identifies the needed // Always plot the drill symbol (for slots identifies the needed cutter! * cutter!) */ aPlotter->Marker( pos, m_holeListBuffer[ii].m_Hole_Diameter, aPlotter->Marker( pos, m_holeListBuffer[ii].m_Hole_Diameter, m_holeListBuffer[ii].m_Tool_Reference - 1 ); m_holeListBuffer[ii].m_Tool_Reference - 1 ); Loading
pcbnew/exporters/gendrill_Excellon_writer.cpp +35 −54 Original line number Original line Diff line number Diff line Loading @@ -69,10 +69,6 @@ */ */ /* * Create the drill file in EXCELLON format * return hole count */ int EXCELLON_WRITER::CreateDrillFile( FILE* aFile ) int EXCELLON_WRITER::CreateDrillFile( FILE* aFile ) { { m_file = aFile; m_file = aFile; Loading Loading @@ -100,7 +96,8 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) fputs( "G90\n", m_file ); // Absolute mode fputs( "G90\n", m_file ); // Absolute mode fputs( "G05\n", m_file ); // Drill mode fputs( "G05\n", m_file ); // Drill mode /* Units : */ // Units : if( !m_minimalHeader ) if( !m_minimalHeader ) { { if( m_unitsDecimal ) if( m_unitsDecimal ) Loading @@ -112,12 +109,14 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) /* Read the hole file and generate lines for normal holes (oblong /* Read the hole file and generate lines for normal holes (oblong * holes will be created later) */ * holes will be created later) */ int tool_reference = -2; int tool_reference = -2; for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { HOLE_INFO& hole_descr = m_holeListBuffer[ii]; HOLE_INFO& hole_descr = m_holeListBuffer[ii]; if( hole_descr.m_Hole_Shape ) if( hole_descr.m_Hole_Shape ) continue; // oblong holes will be created later continue; // oblong holes will be created later if( tool_reference != hole_descr.m_Tool_Reference ) if( tool_reference != hole_descr.m_Tool_Reference ) { { tool_reference = hole_descr.m_Tool_Reference; tool_reference = hole_descr.m_Tool_Reference; Loading Loading @@ -145,16 +144,18 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) for( unsigned ii = 0; ii < m_holeListBuffer.size(); ii++ ) { { HOLE_INFO& hole_descr = m_holeListBuffer[ii]; HOLE_INFO& hole_descr = m_holeListBuffer[ii]; if( hole_descr.m_Hole_Shape == 0 ) if( hole_descr.m_Hole_Shape == 0 ) continue; // wait for oblong holes continue; // wait for oblong holes if( tool_reference != hole_descr.m_Tool_Reference ) if( tool_reference != hole_descr.m_Tool_Reference ) { { tool_reference = hole_descr.m_Tool_Reference; tool_reference = hole_descr.m_Tool_Reference; fprintf( m_file, "T%d\n", tool_reference ); fprintf( m_file, "T%d\n", tool_reference ); } } diam = std::min( hole_descr.m_Hole_Size.x, diam = std::min( hole_descr.m_Hole_Size.x, hole_descr.m_Hole_Size.y ); hole_descr.m_Hole_Size.y ); if( diam == 0 ) if( diam == 0 ) continue; continue; Loading @@ -166,20 +167,23 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) if( hole_descr.m_Hole_Size.x < hole_descr.m_Hole_Size.y ) if( hole_descr.m_Hole_Size.x < hole_descr.m_Hole_Size.y ) { { int delta = ( hole_descr.m_Hole_Size.y - hole_descr.m_Hole_Size.x ) / 2; int delta = ( hole_descr.m_Hole_Size.y - hole_descr.m_Hole_Size.x ) / 2; y0 -= delta; yf += delta; y0 -= delta; yf += delta; } } else else { { int delta = ( hole_descr.m_Hole_Size.x - hole_descr.m_Hole_Size.y ) / 2; int delta = ( hole_descr.m_Hole_Size.x - hole_descr.m_Hole_Size.y ) / 2; x0 -= delta; xf += delta; x0 -= delta; xf += delta; } } RotatePoint( &x0, &y0, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &x0, &y0, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &xf, &yf, xc, yc, hole_descr.m_Hole_Orient ); RotatePoint( &xf, &yf, xc, yc, hole_descr.m_Hole_Orient ); if( !m_mirror ) if( !m_mirror ) { { y0 *= -1; yf *= -1; y0 *= -1; yf *= -1; } } xt = x0 * m_conversionUnits; xt = x0 * m_conversionUnits; Loading @@ -189,11 +193,12 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) /* remove the '\n' from end of line, because we must add the "G85" /* remove the '\n' from end of line, because we must add the "G85" * command to the line: */ * command to the line: */ for( int kk = 0; line[kk] != 0; kk++ ) for( int kk = 0; line[kk] != 0; kk++ ) { if( line[kk] == '\n' || line[kk] =='\r' ) if( line[kk] == '\n' || line[kk] =='\r' ) line[kk] = 0; line[kk] = 0; } fputs( line, m_file ); fputs( line, m_file ); fputs( "G85", m_file ); // add the "G85" command fputs( "G85", m_file ); // add the "G85" command xt = xf * m_conversionUnits; xt = xf * m_conversionUnits; Loading @@ -213,14 +218,6 @@ int EXCELLON_WRITER::CreateDrillFile( FILE * aFile ) } } /** * SetFormat * Initialize internal parameters to match the given format * @param aMetric = true for metric coordinates, false for imperial units * @param aZerosFmt = DECIMAL_FORMAT, SUPPRESS_LEADING, SUPPRESS_TRAILING, KEEP_ZEROS * @param aLeftDigits = number of digits for integer part of coordinates * @param aRightDigits = number of digits for mantissa part of coordinates */ void EXCELLON_WRITER::SetFormat( bool aMetric, void EXCELLON_WRITER::SetFormat( bool aMetric, zeros_fmt aZerosFmt, zeros_fmt aZerosFmt, int aLeftDigits, int aLeftDigits, Loading @@ -240,10 +237,6 @@ void EXCELLON_WRITER::SetFormat( bool aMetric, } } /* Created a line like: * X48000Y19500 * According to the selected format */ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoordY ) void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoordY ) { { wxString xs, ys; wxString xs, ys; Loading Loading @@ -277,8 +270,10 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo //Remove useless trailing 0 //Remove useless trailing 0 while( xs.Last() == '0' ) while( xs.Last() == '0' ) xs.RemoveLast(); xs.RemoveLast(); while( ys.Last() == '0' ) while( ys.Last() == '0' ) ys.RemoveLast(); ys.RemoveLast(); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); break; break; Loading @@ -301,6 +296,7 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo if( aCoordX < 0 ) if( aCoordX < 0 ) xpad++; xpad++; if( aCoordY < 0 ) if( aCoordY < 0 ) ypad++; ypad++; Loading @@ -308,10 +304,12 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); size_t j = xs.Len() - 1; size_t j = xs.Len() - 1; while( xs[j] == '0' && j ) while( xs[j] == '0' && j ) xs.Truncate( j-- ); xs.Truncate( j-- ); j = ys.Len() - 1; j = ys.Len() - 1; while( ys[j] == '0' && j ) while( ys[j] == '0' && j ) ys.Truncate( j-- ); ys.Truncate( j-- ); Loading @@ -327,8 +325,10 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo if( aCoordX < 0 ) if( aCoordX < 0 ) xpad++; xpad++; if( aCoordY < 0 ) if( aCoordY < 0 ) ypad++; ypad++; xs.Printf( wxT( "%0*d" ), xpad, KiROUND( aCoordX ) ); xs.Printf( wxT( "%0*d" ), xpad, KiROUND( aCoordX ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); ys.Printf( wxT( "%0*d" ), ypad, KiROUND( aCoordY ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) ); Loading @@ -337,13 +337,6 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo } } /* Print the DRILL file header. The full header is: * M48 * ;DRILL file {PCBNEW (2007-11-29-b)} date 17/1/2008-21:02:35 * ;FORMAT={ <precision> / absolute / <units> / <numbers format>} * FMAT,2 * INCH,TZ */ void EXCELLON_WRITER::WriteEXCELLONHeader() void EXCELLON_WRITER::WriteEXCELLONHeader() { { fputs( "M48\n", m_file ); // The beginning of a header fputs( "M48\n", m_file ); // The beginning of a header Loading @@ -361,13 +354,14 @@ void EXCELLON_WRITER::WriteEXCELLONHeader() msg << m_precision.GetPrecisionString(); msg << m_precision.GetPrecisionString(); else else msg << wxT( "-:-" ); // in decimal format the precision is irrelevant msg << wxT( "-:-" ); // in decimal format the precision is irrelevant msg << wxT( "/ absolute / " ); msg << wxT( "/ absolute / " ); msg << ( m_unitsDecimal ? wxT( "metric" ) : wxT( "inch" ) ); msg << ( m_unitsDecimal ? wxT( "metric" ) : wxT( "inch" ) ); /* Adding numbers notation format. /* Adding numbers notation format. * this is same as m_Choice_Zeros_Format strings, but NOT translated * this is same as m_Choice_Zeros_Format strings, but NOT translated * because some EXCELLON parsers do not like non ascii values * because some EXCELLON parsers do not like non ASCII values * so we use ONLY english (ascii) strings. * so we use ONLY English (ASCII) strings. * if new options are added in m_Choice_Zeros_Format, they must also * if new options are added in m_Choice_Zeros_Format, they must also * be added here * be added here */ */ Loading Loading @@ -432,18 +426,6 @@ static bool CmpHoleDiameterValue( const HOLE_INFO& a, const HOLE_INFO& b ) } } /* * Create the list of holes and tools for a given board * 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 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 aExcludeThroughHoles : if true, exclude through holes ( pads and vias through ) * param aGenerateNPTH_list : * true to create NPTH only list (with no plated holes) * false to created plated holes list (with no NPTH ) * param aMergePTHNPTH : if true, merge PTH and NPTH holes into one file by treating all holes as PTH */ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, int aLastLayer, int aLastLayer, bool aExcludeThroughHoles, bool aExcludeThroughHoles, Loading @@ -467,8 +449,7 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, return; return; } } /* build hole list for vias // build hole list for vias */ if( ! aGenerateNPTH_list ) // vias are always plated ! if( ! aGenerateNPTH_list ) // vias are always plated ! { { for( TRACK* track = m_pcb->m_Track; track; track = track->Next() ) for( TRACK* track = m_pcb->m_Track; track; track = track->Next() ) Loading Loading @@ -546,7 +527,7 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, sort( m_holeListBuffer.begin(), m_holeListBuffer.end(), CmpHoleDiameterValue ); sort( m_holeListBuffer.begin(), m_holeListBuffer.end(), CmpHoleDiameterValue ); // build the tool list // build the tool list int LastHole = -1; /* Set to not initialised (this is a value not used int LastHole = -1; /* Set to not initialized (this is a value not used * for m_holeListBuffer[ii].m_Hole_Diameter) */ * for m_holeListBuffer[ii].m_Hole_Diameter) */ DRILL_TOOL new_tool( 0 ); DRILL_TOOL new_tool( 0 ); unsigned jj; unsigned jj; Loading
pcbnew/exporters/gendrill_Excellon_writer.h +72 −18 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ public: LAYER_NUM m_Hole_Top_Layer; // hole ending layer (usually front layer): LAYER_NUM m_Hole_Top_Layer; // hole ending layer (usually front layer): // m_Hole_First_Layer < m_Hole_Last_Layer // m_Hole_First_Layer < m_Hole_Last_Layer bool m_Hole_NotPlated; // hole not plated. Must be in a specific drill file bool m_Hole_NotPlated; // hole not plated. Must be in a specific drill file public: public: HOLE_INFO() HOLE_INFO() { { Loading @@ -88,7 +89,7 @@ class DRILL_PRECISION { { public: public: int m_lhs; // Left digit number (integer value of coordinates) int m_lhs; // Left digit number (integer value of coordinates) int m_rhs; // Right digit number (deciam value of coordinates) int m_rhs; // Right digit number (decimal value of coordinates) public: DRILL_PRECISION( int l = 2, int r = 4 ) public: DRILL_PRECISION( int l = 2, int r = 4 ) { { Loading Loading @@ -120,26 +121,28 @@ public: SUPPRESS_TRAILING, SUPPRESS_TRAILING, KEEP_ZEROS KEEP_ZEROS }; }; wxPoint m_Offset; // offset coordinates wxPoint m_Offset; // offset coordinates bool m_ShortHeader; // true to generate the smallest header (strip comments) bool m_ShortHeader; // true to generate the smallest header (strip comments) private: private: FILE* m_file; // The output file FILE* m_file; // The output file BOARD* m_pcb; BOARD* m_pcb; bool m_minimalHeader; // True to use minimal haeder bool m_minimalHeader; // True to use minimal header // in excellon file (strip comments) // in excellon file (strip comments) bool m_unitsDecimal; // true = decimal, false = inches bool m_unitsDecimal; // true = decimal, false = inches zeros_fmt m_zeroFormat; // the zero format option for output file zeros_fmt m_zeroFormat; // the zero format option for output file DRILL_PRECISION m_precision; // The current coordinate precision (not used in decimat format) DRILL_PRECISION m_precision; // The current coordinate precision (not used in decimal format) double m_conversionUnits; // scaling factor to convert the board unites to Excellon units double m_conversionUnits; // scaling factor to convert the board unites to Excellon units // (i.e inches or mm) // (i.e inches or mm) bool m_mirror; bool m_mirror; wxPoint m_offset; // Drill offset ooordinates wxPoint m_offset; // Drill offset coordinates bool m_mergePTHNPTH; bool m_mergePTHNPTH; std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) { { m_file = NULL; m_file = NULL; m_pcb = aPcb; m_pcb = aPcb; Loading @@ -158,7 +161,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) /** /** * Return the plot offset (usually the position * Return the plot offset (usually the position * of the auxiliaty axis * of the auxiliary axis */ */ const wxPoint GetOffset() { return m_offset; } const wxPoint GetOffset() { return m_offset; } Loading Loading @@ -210,8 +213,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) /** /** * Function CreateDrillFile * Function CreateDrillFile * Creates an Excellon drill file * Creates an Excellon drill file * @param aFile = an opened file to write to * @param aFile = an opened file to write to will be closed by CreateDrillFile * will be closed by CreateDrillFile * @return hole count * @return hole count */ */ int CreateDrillFile( FILE * aFile ); int CreateDrillFile( FILE * aFile ); Loading @@ -222,6 +224,47 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) * for through holes, oblong holes, and for buried vias, * for through holes, oblong holes, and for buried vias, * drill values and drill count per layer pair * drill values and drill count per layer pair * there is only one report for all drill files even when buried or blinds vias exist * there is only one report for all drill files even when buried or blinds vias exist * * Here is a sample created by this function: * Drill report for F:/tmp/interf_u/interf_u.brd * Created on 04/10/2012 20:48:38 * Selected Drill Unit: Imperial (inches) * * Drill report for plated through holes : * T1 0,025" 0,64mm (88 holes) * T2 0,031" 0,79mm (120 holes) * T3 0,032" 0,81mm (151 holes) (with 1 slot) * T4 0,040" 1,02mm (43 holes) * T5 0,079" 2,00mm (1 hole) (with 1 slot) * T6 0,120" 3,05mm (1 hole) (with 1 slot) * * Total plated holes count 404 * * * Drill report for buried and blind vias : * * Drill report for holes from layer Soudure to layer Interne1 : * * Total plated holes count 0 * * * Drill report for holes from layer Interne1 to layer Interne2 : * T1 0,025" 0,64mm (3 holes) * * Total plated holes count 3 * * * Drill report for holes from layer Interne2 to layer Composant : * T1 0,025" 0,64mm (1 hole) * * Total plated holes count 1 * * * Drill report for unplated through holes : * T1 0,120" 3,05mm (1 hole) (with 1 slot) * * Total unplated holes count 1 * * @param aFullFileName : the name of the file to create * @param aFullFileName : the name of the file to create * m_unitsDecimal = false tu use inches, true to use mm in report file * m_unitsDecimal = false tu use inches, true to use mm in report file * * Loading @@ -233,7 +276,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) * Function GenDrillMapFile * Function GenDrillMapFile * Plot a map of drill marks for holes. * Plot a map of drill marks for holes. * @param aFullFileNameWithoutExt : the full filename of the file to create, * @param aFullFileNameWithoutExt : the full filename of the file to create, * without extension (will be added accordint ti the format) * without extension (will be added according to the format) * @param aSheet : the paper sheet to use for plot * @param aSheet : the paper sheet to use for plot * @param aFormat : one of the supported plot formats (see enum PlotFormat ) * @param aFormat : one of the supported plot formats (see enum PlotFormat ) */ */ Loading @@ -241,8 +284,21 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset ) const PAGE_INFO& aSheet, const PAGE_INFO& aSheet, PlotFormat aFormat ); PlotFormat aFormat ); private: private: /* Print the DRILL file header. The full header is: * M48 * ;DRILL file {PCBNEW (2007-11-29-b)} date 17/1/2008-21:02:35 * ;FORMAT={ <precision> / absolute / <units> / <numbers format>} * FMAT,2 * INCH,TZ */ void WriteEXCELLONHeader(); void WriteEXCELLONHeader(); void WriteEXCELLONEndOfFile(); void WriteEXCELLONEndOfFile(); /* Created a line like: * X48000Y19500 * According to the selected format */ void WriteCoordinates( char* aLine, double aCoordX, double aCoordY ); void WriteCoordinates( char* aLine, double aCoordX, double aCoordY ); /** Helper function. /** Helper function. Loading @@ -257,6 +313,4 @@ private: }; }; #endif // #ifndef _GENDRILL_EXCELLON_WRITER_ #endif // #ifndef _GENDRILL_EXCELLON_WRITER_