From 43f75cda0ddf189a2d9b66a49a8b6b2d714c4f6e Mon Sep 17 00:00:00 2001 From: charras Date: Sun, 23 Nov 2008 17:43:53 +0000 Subject: [PATCH] code cleaning --- pcbnew/class_zone.h | 17 ++- .../zones_convert_brd_items_to_polygons.cpp | 129 +++++++++--------- polygon/PolyLine.cpp | 5 +- 3 files changed, 86 insertions(+), 65 deletions(-) diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h index 894ae08d7a..a08bd6af80 100644 --- a/pcbnew/class_zone.h +++ b/pcbnew/class_zone.h @@ -194,7 +194,22 @@ public: */ void AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ); - /** + /** Function CopyPolygonsFromBoolengineToFilledPolysList + * Copy (Add) polygons created by kbool (after Do_Operation) to m_FilledPolysList + * @param aBoolengine = the kbool engine used in Do_Operation + * @return the corner count + */ + int CopyPolygonsFromBoolengineToFilledPolysList( Bool_Engine* aBoolengine ); + + /** Function CopyPolygonsFromFilledPolysListToBoolengine + * Copy (Add) polygons created by kbool (after Do_Operation) to m_FilledPolysList + * @param aBoolengine = kbool engine + * @param aGroup = group in kbool engine (GROUP_A or GROUP_B only) + * @return the corner count + */ + int CopyPolygonsFromFilledPolysListToBoolengine( Bool_Engine* aBoolengine, GroupType aGroup = GROUP_A); + + /** * Function HitTestForCorner * tests if the given wxPoint near a corner, or near the segment define by 2 corners. * @return -1 if none, corner index in .corner diff --git a/pcbnew/zones_convert_brd_items_to_polygons.cpp b/pcbnew/zones_convert_brd_items_to_polygons.cpp index 94791ae57b..9449e5a0d8 100644 --- a/pcbnew/zones_convert_brd_items_to_polygons.cpp +++ b/pcbnew/zones_convert_brd_items_to_polygons.cpp @@ -65,7 +65,7 @@ double s_Correction; /* mult coeff used to enlarge rounded and oval pads (an * this means the created polygons have no holes (hole are linked to outer outline by double overlapped segments * and are therefore compatible with draw functions (DC draw polygons and Gerber or PS outputs) * 2 - Add the main outline (zone outline) in group A - * 3 - Creates a correction using BOOL_CORRECTION operation to inflate the resulting area + * 3 - Creates a correction using BOOL_CORRECTION operation to shrink the resulting area * with m_ZoneMinThickness/2 value. * The result is areas with a margin of m_ZoneMinThickness/2 * When drawing outline with segments having a thickness of m_ZoneMinThickness, the outlines wilm @@ -109,41 +109,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) * m_ZoneMinThickness * so m_ZoneMinThickness is the min thickness of the filled zones areas */ - unsigned corners_count = m_FilledPolysList.size(); - unsigned ic = 0; - if( booleng->StartPolygonAdd( GROUP_A ) ) - { - for( ; ic < corners_count; ic++ ) - { - CPolyPt* corner = &m_FilledPolysList[ic]; - booleng->AddPoint( corner->x, corner->y ); - if( corner->end_contour ) - break; - } - - booleng->EndPolygonAdd(); - } + CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); booleng->SetCorrectionFactor( (double) -m_ZoneMinThickness/2 ); booleng->Do_Operation( BOOL_CORRECTION ); /* No copy the new outline in m_FilledPolysList */ m_FilledPolysList.clear(); - while( booleng->StartPolygonGet() ) - { - CPolyPt corner( 0, 0, false ); - while( booleng->PolygonHasMorePoints() ) - { - corner.x = (int) booleng->GetPolygonXPoint(); - corner.y = (int) booleng->GetPolygonYPoint(); - corner.end_contour = false; - m_FilledPolysList.push_back( corner ); - } - - corner.end_contour = true; - m_FilledPolysList.pop_back(); - m_FilledPolysList.push_back( corner ); - booleng->EndPolygonGet(); - } + CopyPolygonsFromBoolengineToFilledPolysList( booleng ); delete booleng; /* Second, Add the main (corrected) polygon (i.e. the filled area using only one outline) @@ -156,21 +128,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* Add the main corrected polygon (i.e. the filled area using only one outline) * in GroupA in Bool_Engine */ - corners_count = m_FilledPolysList.size(); - ic = 0; - if( booleng->StartPolygonAdd( GROUP_A ) ) - { - for( ; ic < corners_count; ic++ ) - { - CPolyPt* corner = &m_FilledPolysList[ic]; - booleng->AddPoint( corner->x, corner->y ); - if( corner->end_contour ) - break; - } - - booleng->EndPolygonAdd(); - } - + CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); // Calculates the clearance value that meet DRC requirements int clearance = max( m_ZoneClearance, g_DesignSettings.m_TrackClearence ); @@ -274,23 +232,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* put these areas in m_FilledPolysList */ m_FilledPolysList.clear(); - while( booleng->StartPolygonGet() ) - { - CPolyPt corner( 0, 0, false ); - while( booleng->PolygonHasMorePoints() ) - { - corner.x = (int) booleng->GetPolygonXPoint(); - corner.y = (int) booleng->GetPolygonYPoint(); - corner.end_contour = false; - m_FilledPolysList.push_back( corner ); - } - - corner.end_contour = true; - m_FilledPolysList.pop_back(); - m_FilledPolysList.push_back( corner ); - booleng->EndPolygonGet(); - } - + CopyPolygonsFromBoolengineToFilledPolysList( booleng ); delete booleng; // Remove insulated islands: @@ -946,3 +888,64 @@ void AddTextBoxWithClearancePolygon( Bool_Engine* aBooleng, aBooleng->EndPolygonAdd(); } } + + +/***********************************************************************************************************/ +int ZONE_CONTAINER::CopyPolygonsFromFilledPolysListToBoolengine( Bool_Engine* aBoolengine, GroupType aGroup ) +/************************************************************************************************************/ +/** Function CopyPolygonsFromFilledPolysListToBoolengine + * Copy (Add) polygons created by kbool (after Do_Operation) to m_FilledPolysList + * @param aBoolengine = kbool engine + * @param aGroup = group in kbool engine (GROUP_A or GROUP_B only) + * @return the corner count +*/ +{ + unsigned corners_count = m_FilledPolysList.size(); + int count = 0; + unsigned ic = 0; + if( aBoolengine->StartPolygonAdd( aGroup ) ) + { + for( ; ic < corners_count; ic++ ) + { + CPolyPt* corner = &m_FilledPolysList[ic]; + aBoolengine->AddPoint( corner->x, corner->y ); + count++; + if( corner->end_contour ) + break; + } + + aBoolengine->EndPolygonAdd(); + } + + return count; +} +/*****************************************************************************************/ +int ZONE_CONTAINER::CopyPolygonsFromBoolengineToFilledPolysList( Bool_Engine* aBoolengine ) +/*****************************************************************************************/ +/** Function CopyPolygonsFromBoolengineToFilledPolysList + * Copy (Add) polygons created by kbool (after Do_Operation) to m_FilledPolysList + * @param aBoolengine = kbool engine + * @return the corner count +*/ +{ + int count = 0; + while( aBoolengine->StartPolygonGet() ) + { + CPolyPt corner( 0, 0, false ); + while( aBoolengine->PolygonHasMorePoints() ) + { + corner.x = (int) aBoolengine->GetPolygonXPoint(); + corner.y = (int) aBoolengine->GetPolygonYPoint(); + corner.end_contour = false; + m_FilledPolysList.push_back( corner ); + count++; + } + + corner.end_contour = true; + m_FilledPolysList.pop_back(); + m_FilledPolysList.push_back( corner ); + aBoolengine->EndPolygonGet(); + } + + return count; +} diff --git a/polygon/PolyLine.cpp b/polygon/PolyLine.cpp index c07fb88481..03f6c26d9a 100644 --- a/polygon/PolyLine.cpp +++ b/polygon/PolyLine.cpp @@ -545,7 +545,10 @@ void ArmBoolEng( Bool_Engine* aBooleng, bool aConvertHoles ) // should always be > DGRID a MARGE >= 10*DGRID is ok // this is also used to remove small segments and to decide when // two segments are in line. ( initial value = 0.001 ) - double CORRECTIONFACTOR = 500.0; // correct the polygons by this number + double CORRECTIONFACTOR = 0.0; // correct the polygons by this number: used in BOOL_CORRECTION operation + // this operation shrinks a polygon if CORRECTIONFACTOR < 0 + // or stretch it if CORRECTIONFACTOR > 0 + // the size change is CORRECTIONFACTOR (holes are correctly handled) double CORRECTIONABER = 1.0; // the accuracy for the rounded shapes used in correction double ROUNDFACTOR = 1.5; // when will we round the correction shape to a circle double SMOOTHABER = 10.0; // accuracy when smoothing a polygon