Pcbnew: enhancements:

Plot Gerber format default values:  X2 attributes enabled.
Gerber job file: use a trick to truncate floating values to 4 digits in mantissa.
It gives a much better readability and 0.1 micron is enough for
mechanical dimensions
This commit is contained in:
jean-pierre charras 2020-03-29 15:35:47 +02:00
parent d30fb79706
commit 259d7a47d4
3 changed files with 42 additions and 19 deletions

View File

@ -215,6 +215,23 @@ bool GERBER_JOBFILE_WRITER::WriteJSONJobFile( const wxString& aFullFilename )
} }
double GERBER_JOBFILE_WRITER::mapValue( double aUiValue )
{
// A helper function to convert aUiValue in Json units (mm) and to have
// 4 digits in Json in mantissa when using %g to print it
// i.e. displays values truncated in 0.1 microns.
// This is enough for a Json file
char buffer[128];
sprintf( buffer, "%.4f", aUiValue * m_conversionUnits );
long double output;
sscanf( buffer, "%Lg", &output );
return output;
}
void GERBER_JOBFILE_WRITER::addJSONGeneralSpecs() void GERBER_JOBFILE_WRITER::addJSONGeneralSpecs()
{ {
m_json["GeneralSpecs"] = json( {} ); m_json["GeneralSpecs"] = json( {} );
@ -252,8 +269,8 @@ void GERBER_JOBFILE_WRITER::addJSONGeneralSpecs()
// output the bord size in mm: // output the bord size in mm:
EDA_RECT brect = m_pcb->GetBoardEdgesBoundingBox(); EDA_RECT brect = m_pcb->GetBoardEdgesBoundingBox();
m_json["GeneralSpecs"]["Size"]["X"] = brect.GetWidth() * m_conversionUnits; m_json["GeneralSpecs"]["Size"]["X"] = mapValue( brect.GetWidth() );
m_json["GeneralSpecs"]["Size"]["Y"] = brect.GetHeight() * m_conversionUnits; m_json["GeneralSpecs"]["Size"]["Y"] = mapValue( brect.GetHeight() );
// Add some data to the JSON header, GeneralSpecs: // Add some data to the JSON header, GeneralSpecs:
@ -262,7 +279,7 @@ void GERBER_JOBFILE_WRITER::addJSONGeneralSpecs()
// Board thickness // Board thickness
m_json["GeneralSpecs"]["BoardThickness"] = m_json["GeneralSpecs"]["BoardThickness"] =
m_pcb->GetDesignSettings().GetBoardThickness() * m_conversionUnits; mapValue( m_pcb->GetDesignSettings().GetBoardThickness() );
// Copper finish // Copper finish
BOARD_STACKUP brd_stackup = m_pcb->GetDesignSettings().GetStackupDescriptor(); BOARD_STACKUP brd_stackup = m_pcb->GetDesignSettings().GetStackupDescriptor();
@ -466,9 +483,9 @@ void GERBER_JOBFILE_WRITER::addJSONDesignRules()
m_json["DesignRules"] = { { m_json["DesignRules"] = { {
{ "Layers", "Outer" }, { "Layers", "Outer" },
{ "PadToPad", minPadClearanceOuter * m_conversionUnits }, { "PadToPad", mapValue( minPadClearanceOuter ) },
{ "PadToTrack", minPadClearanceOuter * m_conversionUnits }, { "PadToTrack", mapValue( minPadClearanceOuter ) },
{ "TrackToTrack", minclearance_track2track * m_conversionUnits } { "TrackToTrack", mapValue( minclearance_track2track ) }
} }; } };
// Until this is changed in Kicad, use the same value for internal tracks // Until this is changed in Kicad, use the same value for internal tracks
@ -490,7 +507,7 @@ void GERBER_JOBFILE_WRITER::addJSONDesignRules()
} }
if( mintrackWidthOuter != INT_MAX ) if( mintrackWidthOuter != INT_MAX )
m_json["DesignRules"][0]["MinLineWidth"] = mintrackWidthOuter * m_conversionUnits; m_json["DesignRules"][0]["MinLineWidth"] = mapValue( mintrackWidthOuter );
// Output the minimal zone to xx clearance // Output the minimal zone to xx clearance
// Note: zones can have a zone clearance set to 0 // Note: zones can have a zone clearance set to 0
@ -514,28 +531,28 @@ void GERBER_JOBFILE_WRITER::addJSONDesignRules()
} }
if( minclearanceOuter != INT_MAX ) if( minclearanceOuter != INT_MAX )
m_json["DesignRules"][0]["TrackToRegion"] = minclearanceOuter * m_conversionUnits; m_json["DesignRules"][0]["TrackToRegion"] = mapValue( minclearanceOuter );
if( minclearanceOuter != INT_MAX ) if( minclearanceOuter != INT_MAX )
m_json["DesignRules"][0]["RegionToRegion"] = minclearanceOuter * m_conversionUnits; m_json["DesignRules"][0]["RegionToRegion"] = mapValue( minclearanceOuter );
if( hasInnerLayers ) if( hasInnerLayers )
{ {
m_json["DesignRules"] += json( { m_json["DesignRules"] += json( {
{ "Layers", "Inner" }, { "Layers", "Inner" },
{ "PadToPad", minPadClearanceInner * m_conversionUnits }, { "PadToPad", mapValue( minPadClearanceInner ) },
{ "PadToTrack", minPadClearanceInner * m_conversionUnits }, { "PadToTrack", mapValue( minPadClearanceInner ) },
{ "TrackToTrack", minclearance_track2track * m_conversionUnits } { "TrackToTrack", mapValue( minclearance_track2track ) }
} ); } );
if( mintrackWidthInner != INT_MAX ) if( mintrackWidthInner != INT_MAX )
m_json["DesignRules"][1]["MinLineWidth"] = mintrackWidthInner * m_conversionUnits; m_json["DesignRules"][1]["MinLineWidth"] = mapValue( mintrackWidthInner );
if( minclearanceInner != INT_MAX ) if( minclearanceInner != INT_MAX )
m_json["DesignRules"][1]["TrackToRegion"] = minclearanceInner * m_conversionUnits; m_json["DesignRules"][1]["TrackToRegion"] = mapValue( minclearanceInner );
if( minclearanceInner != INT_MAX ) if( minclearanceInner != INT_MAX )
m_json["DesignRules"][1]["RegionToRegion"] = minclearanceInner * m_conversionUnits; m_json["DesignRules"][1]["RegionToRegion"] = mapValue( minclearanceInner );
} }
} }
@ -570,7 +587,7 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup()
for( int sub_idx = 0; sub_idx < sub_layer_count; sub_idx++ ) for( int sub_idx = 0; sub_idx < sub_layer_count; sub_idx++ )
{ {
// layer thickness is always in mm // layer thickness is always in mm
double thickness = item->GetThickness( sub_idx ) * m_conversionUnits; double thickness = mapValue( item->GetThickness( sub_idx ) );
wxString layer_type; wxString layer_type;
std::string layer_name; // for comment std::string layer_name; // for comment
json layer_json; json layer_json;

View File

@ -157,6 +157,12 @@ private:
*/ */
std::string formatStringFromUTF32( const wxString& aText ); std::string formatStringFromUTF32( const wxString& aText );
/** A helper function to convert a double in Pcbnew internal units to
* a JSON double value (in mm), with only 4 digits in mantissa for a better readability
* when printed using %g or equivalent format.
*/
double mapValue( double aUiValue );
private: private:
BOARD* m_pcb; // The board BOARD* m_pcb; // The board
REPORTER* m_reporter; // a reporter for messages (can be null) REPORTER* m_reporter; // a reporter for messages (can be null)

View File

@ -97,9 +97,9 @@ static bool setDouble( double* aTarget, double aValue, double aMin, double aMax
PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() PCB_PLOT_PARAMS::PCB_PLOT_PARAMS()
{ {
m_useGerberProtelExtensions = false; m_useGerberProtelExtensions = false;
m_useGerberX2format = false; m_useGerberX2format = true;
m_includeGerberNetlistInfo = false; m_includeGerberNetlistInfo = true;
m_createGerberJobFile = false; m_createGerberJobFile = true;
m_gerberPrecision = gbrDefaultPrecision; m_gerberPrecision = gbrDefaultPrecision;
m_excludeEdgeLayer = true; m_excludeEdgeLayer = true;
m_lineWidth = g_DrawDefaultLineThickness; m_lineWidth = g_DrawDefaultLineThickness;