diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h index 0042999267..4ee595f9a2 100644 --- a/pcbnew/class_zone.h +++ b/pcbnew/class_zone.h @@ -261,6 +261,21 @@ public: */ int BuildFilledPolysListData( BOARD* aPcb, std::vector * aCornerBuffer = NULL ); + /** + * Function CopyPolygonsFromKiPolygonListToFilledPolysList + * Copy polygons stored in aKiPolyList to m_FilledPolysList + * The previous m_FilledPolysList contents is replaced. + * @param aKiPolyList = a KI_POLYGON_SET containing polygons. + */ + void CopyPolygonsFromKiPolygonListToFilledPolysList( KI_POLYGON_SET& aKiPolyList ); + + /** + * Function CopyPolygonsFromFilledPolysListToKiPolygonList + * Copy polygons from m_FilledPolysList to aKiPolyList + * @param aKiPolyList = a KI_POLYGON_SET to fill by polygons. + */ + void CopyPolygonsFromFilledPolysListToKiPolygonList( KI_POLYGON_SET& aKiPolyList ); + /** * Function AddClearanceAreasPolygonsToPolysList * Add non copper areas polygons (pads and tracks with clearance) diff --git a/pcbnew/zone_filling_algorithm.cpp b/pcbnew/zone_filling_algorithm.cpp index 48841414dc..904940ab4e 100644 --- a/pcbnew/zone_filling_algorithm.cpp +++ b/pcbnew/zone_filling_algorithm.cpp @@ -95,14 +95,35 @@ int ZONE_CONTAINER::BuildFilledPolysListData( BOARD* aPcb, std::vector else ConvertPolysListWithHolesToOnePolygon( m_smoothedPoly->m_CornersList, m_FilledPolysList ); + /* For copper layers, we now must add holes in the Polygon list. * holes are pads and tracks with their clearance area + * for non copper layers just recalculate the m_FilledPolysList + * with m_ZoneMinThickness taken in account */ if( ! aCornerBuffer ) { if( IsOnCopperLayer() ) AddClearanceAreasPolygonsToPolysList( aPcb ); + else + { + // This KI_POLYGON_SET is the area(s) to fill, with m_ZoneMinThickness/2 + KI_POLYGON_SET polyset_zone_solid_areas; + int margin = m_ZoneMinThickness / 2; + /* First, creates the main polygon (i.e. the filled area using only one outline) + * to reserve a m_ZoneMinThickness/2 margin around the outlines and holes + * this margin is the room to redraw outlines with segments having a width set to + * m_ZoneMinThickness + * so m_ZoneMinThickness is the min thickness of the filled zones areas + * the polygon is stored in polyset_zone_solid_areas + */ + CopyPolygonsFromFilledPolysListToKiPolygonList( polyset_zone_solid_areas ); + polyset_zone_solid_areas -= margin; + // put solid area in m_FilledPolysList: + m_FilledPolysList.clear(); + CopyPolygonsFromKiPolygonListToFilledPolysList( polyset_zone_solid_areas ); + } if ( m_FillMode ) // if fill mode uses segments, create them: Fill_Zone_Areas_With_Segments( ); } diff --git a/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp b/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp index f316a4d349..80baaea477 100644 --- a/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp +++ b/pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp @@ -79,17 +79,8 @@ extern void CreateThermalReliefPadPolygon( std::vector& aCornerBuffer, int aCircleToSegmentsCount, double aCorrectionFactor, int aThermalRot ); - -// Local Functions: helper function to calculate solid areas static void AddPolygonCornersToKiPolygonList( std::vector & aCornersBuffer, - KI_POLYGON_SET& aKiPolyList ); - -static int CopyPolygonsFromKiPolygonListToFilledPolysList( ZONE_CONTAINER* aZone, - KI_POLYGON_SET& aKiPolyList ); - -static int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, - KI_POLYGON_SET& aKiPolyList ); - + KI_POLYGON_SET& aKiPolyList ); // Local Variables: static int s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads @@ -160,7 +151,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) * the main polygon is stored in polyset_zone_solid_areas */ - CopyPolygonsFromFilledPolysListToKiPolygonList( this, polyset_zone_solid_areas ); + CopyPolygonsFromFilledPolysListToKiPolygonList( polyset_zone_solid_areas ); polyset_zone_solid_areas -= margin; if( polyset_zone_solid_areas.size() == 0 ) @@ -439,7 +430,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) // put solid areas in m_FilledPolysList: m_FilledPolysList.clear(); - CopyPolygonsFromKiPolygonListToFilledPolysList( this, polyset_zone_solid_areas ); + CopyPolygonsFromKiPolygonListToFilledPolysList( polyset_zone_solid_areas ); // Remove insulated islands: if( GetNet() > 0 ) @@ -461,7 +452,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) // put these areas in m_FilledPolysList m_FilledPolysList.clear(); - CopyPolygonsFromKiPolygonListToFilledPolysList( this, polyset_zone_solid_areas ); + CopyPolygonsFromKiPolygonListToFilledPolysList( polyset_zone_solid_areas ); if( GetNet() > 0 ) Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb ); @@ -507,11 +498,9 @@ void AddPolygonCornersToKiPolygonList( std::vector & aCornersBuffer, } -int CopyPolygonsFromKiPolygonListToFilledPolysList( ZONE_CONTAINER* aZone, - KI_POLYGON_SET& aKiPolyList ) +void ZONE_CONTAINER::CopyPolygonsFromKiPolygonListToFilledPolysList( KI_POLYGON_SET& aKiPolyList ) { - int count = 0; - std::vector polysList; + m_FilledPolysList.clear(); for( unsigned ii = 0; ii < aKiPolyList.size(); ii++ ) { @@ -524,33 +513,26 @@ int CopyPolygonsFromKiPolygonListToFilledPolysList( ZONE_CONTAINER* aZone, corner.x = point.x(); corner.y = point.y(); corner.end_contour = false; - polysList.push_back( corner ); - count++; + m_FilledPolysList.push_back( corner ); } corner.end_contour = true; - polysList.pop_back(); - polysList.push_back( corner ); + m_FilledPolysList.pop_back(); + m_FilledPolysList.push_back( corner ); } - aZone->AddFilledPolysList( polysList ); - - return count; } -int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, - KI_POLYGON_SET& aKiPolyList ) +void ZONE_CONTAINER::CopyPolygonsFromFilledPolysListToKiPolygonList( KI_POLYGON_SET& aKiPolyList ) { - const std::vector& polysList = aZone->GetFilledPolysList(); - unsigned corners_count = polysList.size(); - int count = 0; + unsigned corners_count = m_FilledPolysList.size(); unsigned ic = 0; int polycount = 0; for( unsigned ii = 0; ii < corners_count; ii++ ) { - const CPolyPt& corner = polysList[ii]; + const CPolyPt& corner = m_FilledPolysList[ii]; if( corner.end_contour ) polycount++; @@ -566,9 +548,8 @@ int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, { while( ic < corners_count ) { - const CPolyPt& corner = polysList[ic++]; + const CPolyPt& corner = m_FilledPolysList[ic++]; cornerslist.push_back( KI_POLY_POINT( corner.x, corner.y ) ); - count++; if( corner.end_contour ) break; @@ -578,6 +559,4 @@ int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, aKiPolyList.push_back( poly ); } } - - return count; }