From a543f99eb30bff3f73189a2270c1be1dd6cbe102 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 30 Jun 2014 17:46:47 +0200 Subject: [PATCH] Enable technical layers when starting Pcbnew with no board. Use format 4.6 (full resolution of Pcbnew) in Gerber files to avoid the creation of self-intersecting polygons. --- common/common_plotGERBER_functions.cpp | 11 +++++++---- pcbnew/class_board_design_settings.cpp | 10 ++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/common/common_plotGERBER_functions.cpp b/common/common_plotGERBER_functions.cpp index 6937351149..fbed464092 100644 --- a/common/common_plotGERBER_functions.cpp +++ b/common/common_plotGERBER_functions.cpp @@ -29,10 +29,13 @@ void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil, m_gerberUnitInch = false; // Currently fixed, but could be an option // number of digits after the point (number of digits of the mantissa - // Be carefull: the coordinates are stored in an integer - // so 6 digits (inches) or 5 digits (mm) is the best value - // to avoid truncations and overflow - m_gerberUnitFmt = m_gerberUnitInch ? 6 : 5; + // Be carefull: the Gerber coordinates are stored in an integer + // so 6 digits (inches) or 5 digits (mm) is a good value + // To avoid overflow, 7 digits (inches) or 6 digits is a max. + // with lower values than 6 digits (inches) or 5 digits (mm), + // Creating self-intersecting polygons from non-intersecting polygons + // happen easily. + m_gerberUnitFmt = m_gerberUnitInch ? 7 : 6; m_IUsPerDecimil = aIusPerDecimil; iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( aIusPerDecimil * 10000.0 ); diff --git a/pcbnew/class_board_design_settings.cpp b/pcbnew/class_board_design_settings.cpp index f3596ced4b..844eb4211f 100644 --- a/pcbnew/class_board_design_settings.cpp +++ b/pcbnew/class_board_design_settings.cpp @@ -56,14 +56,14 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() : { LSET all_set = LSET().set(); - m_enabledLayers = all_set; // All layers enabled at first. - // SetCopperLayerCount() will adjust this. + m_enabledLayers = all_set; // All layers enabled at first. + // SetCopperLayerCount() will adjust this. SetVisibleLayers( all_set ); // set all but hidden text as visible. m_visibleElements = ~( 1 << MOD_TEXT_INVISIBLE ); - SetCopperLayerCount( 2 ); // Default design is a double sided board + SetCopperLayerCount( 2 ); // Default design is a double sided board // via type (VIA_BLIND_BURIED, VIA_THROUGH VIA_MICROVIA). m_CurrentViaType = VIA_THROUGH; @@ -350,7 +350,9 @@ void BOARD_DESIGN_SETTINGS::SetCopperLayerCount( int aNewLayerCount ) for( LAYER_NUM ii = LAYER_N_2; ii < aNewLayerCount - 1; ++ii ) m_enabledLayers |= GetLayerSet( ii ); #else - m_enabledLayers = LSET::AllCuMask( aNewLayerCount ); + // Update only enabled copper layers mask + m_enabledLayers &= ~LSET::AllCuMask(); + m_enabledLayers |= LSET::AllCuMask( aNewLayerCount ); #endif }