From 59c527c40cc1ec23a89255dddddfab041fcecdc2 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 20 Dec 2017 17:48:53 +0100 Subject: [PATCH] Excellon drill file generation: allows 4 digits in mantissa in Tool Information command when units are inches. Fixes: lp:1738657 https://bugs.launchpad.net/kicad/+bug/1738657 --- pcbnew/exporters/gendrill_Excellon_writer.cpp | 21 +++++++++++-------- pcbnew/exporters/gendrill_file_writer_base.h | 4 ++-- pcbnew/exporters/gendrill_gerber_writer.cpp | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/pcbnew/exporters/gendrill_Excellon_writer.cpp b/pcbnew/exporters/gendrill_Excellon_writer.cpp index 889ab5a647..301046ac75 100644 --- a/pcbnew/exporters/gendrill_Excellon_writer.cpp +++ b/pcbnew/exporters/gendrill_Excellon_writer.cpp @@ -172,7 +172,10 @@ int EXCELLON_WRITER::createDrillFile( FILE* aFile ) } #endif - fprintf( m_file, "T%dC%.3f\n", ii + 1, tool_descr.m_Diameter * m_conversionUnits ); + if( m_unitsMetric ) // if units are mm, the resolution is 0.001 mm (3 digits in mantissa) + fprintf( m_file, "T%dC%.3f\n", ii + 1, tool_descr.m_Diameter * m_conversionUnits ); + else // if units are inches, the resolution is 0.1 mil (4 digits in mantissa) + fprintf( m_file, "T%dC%.4f\n", ii + 1, tool_descr.m_Diameter * m_conversionUnits ); } fputs( "%\n", m_file ); // End of header info @@ -182,7 +185,7 @@ int EXCELLON_WRITER::createDrillFile( FILE* aFile ) // Units : if( !m_minimalHeader ) { - if( m_unitsDecimal ) + if( m_unitsMetric ) fputs( "M71\n", m_file ); /* M71 = metric mode */ else fputs( "M72\n", m_file ); /* M72 = inch mode */ @@ -303,11 +306,11 @@ void EXCELLON_WRITER::SetFormat( bool aMetric, int aLeftDigits, int aRightDigits ) { - m_unitsDecimal = aMetric; + m_unitsMetric = aMetric; m_zeroFormat = aZerosFmt; /* Set conversion scale depending on drill file units */ - if( m_unitsDecimal ) + if( m_unitsMetric ) m_conversionUnits = 1.0 / IU_PER_MM; // EXCELLON units = mm else m_conversionUnits = 0.001 / IU_PER_MILS; // EXCELLON units = INCHES @@ -315,10 +318,10 @@ void EXCELLON_WRITER::SetFormat( bool aMetric, // Set the zero counts. if aZerosFmt == DECIMAL_FORMAT, these values // will be set, but not used. if( aLeftDigits <= 0 ) - aLeftDigits = m_unitsDecimal ? 3 : 2; + aLeftDigits = m_unitsMetric ? 3 : 2; if( aRightDigits <= 0 ) - aRightDigits = m_unitsDecimal ? 3 : 4; + aRightDigits = m_unitsMetric ? 3 : 4; m_precision.m_lhs = aLeftDigits; m_precision.m_rhs = aRightDigits; @@ -342,7 +345,7 @@ void EXCELLON_WRITER::writeCoordinates( char* aLine, double aCoordX, double aCoo * Decimal format just prohibit useless leading 0: * 0.45 or .45 is right, but 00.54 is incorrect. */ - if( m_unitsDecimal ) + if( m_unitsMetric ) { // resolution is 1/1000 mm xs.Printf( wxT( "%.3f" ), aCoordX ); @@ -445,7 +448,7 @@ void EXCELLON_WRITER::writeEXCELLONHeader() msg << wxT( "-:-" ); // in decimal format the precision is irrelevant msg << wxT( "/ absolute / " ); - msg << ( m_unitsDecimal ? wxT( "metric" ) : wxT( "inch" ) ); + msg << ( m_unitsMetric ? wxT( "metric" ) : wxT( "inch" ) ); /* Adding numbers notation format. * this is same as m_Choice_Zeros_Format strings, but NOT translated @@ -470,7 +473,7 @@ void EXCELLON_WRITER::writeEXCELLONHeader() fputs( "FMAT,2\n", m_file ); // Use Format 2 commands (version used since 1979) } - fputs( m_unitsDecimal ? "METRIC" : "INCH", m_file ); + fputs( m_unitsMetric ? "METRIC" : "INCH", m_file ); switch( m_zeroFormat ) { diff --git a/pcbnew/exporters/gendrill_file_writer_base.h b/pcbnew/exporters/gendrill_file_writer_base.h index 745ba7d65f..e4c6e6da72 100644 --- a/pcbnew/exporters/gendrill_file_writer_base.h +++ b/pcbnew/exporters/gendrill_file_writer_base.h @@ -136,7 +136,7 @@ public: protected: BOARD* m_pcb; wxString m_drillFileExtension; // .drl or .gbr, depending on format - bool m_unitsDecimal; // true = decimal, false = inches + bool m_unitsMetric; // true = mm, false = inches ZEROS_FMT m_zeroFormat; // the zero format option for output file DRILL_PRECISION m_precision; // The current coordinate precision (not used in decimal format) double m_conversionUnits; // scaling factor to convert the board unites to @@ -156,7 +156,7 @@ protected: { m_pcb = aPcb; m_conversionUnits = 1.0; - m_unitsDecimal = true; + m_unitsMetric = true; m_mapFileFmt = PLOT_FORMAT_PDF; m_pageInfo = NULL; m_merge_PTH_NPTH = false; diff --git a/pcbnew/exporters/gendrill_gerber_writer.cpp b/pcbnew/exporters/gendrill_gerber_writer.cpp index b8c2da3cf3..a04b9422b2 100644 --- a/pcbnew/exporters/gendrill_gerber_writer.cpp +++ b/pcbnew/exporters/gendrill_gerber_writer.cpp @@ -53,7 +53,7 @@ GERBER_WRITER::GERBER_WRITER( BOARD* aPcb ) { m_zeroFormat = SUPPRESS_LEADING; m_conversionUnits = 1.0; - m_unitsDecimal = true; + m_unitsMetric = true; m_drillFileExtension = "gbr"; m_merge_PTH_NPTH = false; }