Loading pcbnew/class_zone.h +15 −0 Original line number Diff line number Diff line Loading @@ -261,6 +261,21 @@ public: */ int BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt>* 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) Loading pcbnew/zone_filling_algorithm.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -95,14 +95,35 @@ int ZONE_CONTAINER::BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt> 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( ); } Loading pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp +13 −34 Original line number Diff line number Diff line Loading @@ -79,18 +79,9 @@ extern void CreateThermalReliefPadPolygon( std::vector<CPolyPt>& aCornerBuffer, int aCircleToSegmentsCount, double aCorrectionFactor, int aThermalRot ); // Local Functions: helper function to calculate solid areas static void AddPolygonCornersToKiPolygonList( std::vector <CPolyPt>& 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 ); // Local Variables: static int s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads Loading Loading @@ -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 ) Loading Loading @@ -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 ) Loading @@ -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 ); Loading Loading @@ -507,11 +498,9 @@ void AddPolygonCornersToKiPolygonList( std::vector <CPolyPt>& aCornersBuffer, } int CopyPolygonsFromKiPolygonListToFilledPolysList( ZONE_CONTAINER* aZone, KI_POLYGON_SET& aKiPolyList ) void ZONE_CONTAINER::CopyPolygonsFromKiPolygonListToFilledPolysList( KI_POLYGON_SET& aKiPolyList ) { int count = 0; std::vector<CPolyPt> polysList; m_FilledPolysList.clear(); for( unsigned ii = 0; ii < aKiPolyList.size(); ii++ ) { Loading @@ -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<CPolyPt>& 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++; Loading @@ -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; Loading @@ -578,6 +559,4 @@ int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, aKiPolyList.push_back( poly ); } } return count; } Loading
pcbnew/class_zone.h +15 −0 Original line number Diff line number Diff line Loading @@ -261,6 +261,21 @@ public: */ int BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt>* 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) Loading
pcbnew/zone_filling_algorithm.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -95,14 +95,35 @@ int ZONE_CONTAINER::BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt> 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( ); } Loading
pcbnew/zones_convert_brd_items_to_polygons_with_Boost.cpp +13 −34 Original line number Diff line number Diff line Loading @@ -79,18 +79,9 @@ extern void CreateThermalReliefPadPolygon( std::vector<CPolyPt>& aCornerBuffer, int aCircleToSegmentsCount, double aCorrectionFactor, int aThermalRot ); // Local Functions: helper function to calculate solid areas static void AddPolygonCornersToKiPolygonList( std::vector <CPolyPt>& 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 ); // Local Variables: static int s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads Loading Loading @@ -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 ) Loading Loading @@ -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 ) Loading @@ -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 ); Loading Loading @@ -507,11 +498,9 @@ void AddPolygonCornersToKiPolygonList( std::vector <CPolyPt>& aCornersBuffer, } int CopyPolygonsFromKiPolygonListToFilledPolysList( ZONE_CONTAINER* aZone, KI_POLYGON_SET& aKiPolyList ) void ZONE_CONTAINER::CopyPolygonsFromKiPolygonListToFilledPolysList( KI_POLYGON_SET& aKiPolyList ) { int count = 0; std::vector<CPolyPt> polysList; m_FilledPolysList.clear(); for( unsigned ii = 0; ii < aKiPolyList.size(); ii++ ) { Loading @@ -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<CPolyPt>& 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++; Loading @@ -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; Loading @@ -578,6 +559,4 @@ int CopyPolygonsFromFilledPolysListToKiPolygonList( ZONE_CONTAINER* aZone, aKiPolyList.push_back( poly ); } } return count; }