Loading pcbnew/class_zone.h +16 −1 Original line number Original line Diff line number Diff line Loading @@ -194,6 +194,21 @@ public: */ */ void AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ); 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 * Function HitTestForCorner * tests if the given wxPoint near a corner, or near the segment define by 2 corners. * tests if the given wxPoint near a corner, or near the segment define by 2 corners. Loading pcbnew/zones_convert_brd_items_to_polygons.cpp +66 −63 Original line number Original line Diff line number Diff line Loading @@ -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 * 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) * 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 * 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. * with m_ZoneMinThickness/2 value. * The result is areas with a margin of m_ZoneMinThickness/2 * 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 * When drawing outline with segments having a thickness of m_ZoneMinThickness, the outlines wilm Loading Loading @@ -109,41 +109,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) * m_ZoneMinThickness * m_ZoneMinThickness * so m_ZoneMinThickness is the min thickness of the filled zones areas * so m_ZoneMinThickness is the min thickness of the filled zones areas */ */ unsigned corners_count = m_FilledPolysList.size(); CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); 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(); } booleng->SetCorrectionFactor( (double) -m_ZoneMinThickness/2 ); booleng->SetCorrectionFactor( (double) -m_ZoneMinThickness/2 ); booleng->Do_Operation( BOOL_CORRECTION ); booleng->Do_Operation( BOOL_CORRECTION ); /* No copy the new outline in m_FilledPolysList */ /* No copy the new outline in m_FilledPolysList */ m_FilledPolysList.clear(); m_FilledPolysList.clear(); while( booleng->StartPolygonGet() ) CopyPolygonsFromBoolengineToFilledPolysList( booleng ); { 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(); } delete booleng; delete booleng; /* Second, Add the main (corrected) polygon (i.e. the filled area using only one outline) /* Second, Add the main (corrected) polygon (i.e. the filled area using only one outline) Loading @@ -156,21 +128,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* Add the main corrected polygon (i.e. the filled area using only one outline) /* Add the main corrected polygon (i.e. the filled area using only one outline) * in GroupA in Bool_Engine * in GroupA in Bool_Engine */ */ corners_count = m_FilledPolysList.size(); CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); 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(); } // Calculates the clearance value that meet DRC requirements // Calculates the clearance value that meet DRC requirements int clearance = max( m_ZoneClearance, g_DesignSettings.m_TrackClearence ); int clearance = max( m_ZoneClearance, g_DesignSettings.m_TrackClearence ); Loading Loading @@ -274,23 +232,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* put these areas in m_FilledPolysList */ /* put these areas in m_FilledPolysList */ m_FilledPolysList.clear(); m_FilledPolysList.clear(); while( booleng->StartPolygonGet() ) CopyPolygonsFromBoolengineToFilledPolysList( booleng ); { 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(); } delete booleng; delete booleng; // Remove insulated islands: // Remove insulated islands: Loading Loading @@ -946,3 +888,64 @@ void AddTextBoxWithClearancePolygon( Bool_Engine* aBooleng, aBooleng->EndPolygonAdd(); 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; } polygon/PolyLine.cpp +4 −1 Original line number Original line Diff line number Diff line Loading @@ -545,7 +545,10 @@ void ArmBoolEng( Bool_Engine* aBooleng, bool aConvertHoles ) // should always be > DGRID a MARGE >= 10*DGRID is ok // should always be > DGRID a MARGE >= 10*DGRID is ok // this is also used to remove small segments and to decide when // this is also used to remove small segments and to decide when // two segments are in line. ( initial value = 0.001 ) // 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 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 ROUNDFACTOR = 1.5; // when will we round the correction shape to a circle double SMOOTHABER = 10.0; // accuracy when smoothing a polygon double SMOOTHABER = 10.0; // accuracy when smoothing a polygon Loading Loading
pcbnew/class_zone.h +16 −1 Original line number Original line Diff line number Diff line Loading @@ -194,6 +194,21 @@ public: */ */ void AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ); 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 * Function HitTestForCorner * tests if the given wxPoint near a corner, or near the segment define by 2 corners. * tests if the given wxPoint near a corner, or near the segment define by 2 corners. Loading
pcbnew/zones_convert_brd_items_to_polygons.cpp +66 −63 Original line number Original line Diff line number Diff line Loading @@ -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 * 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) * 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 * 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. * with m_ZoneMinThickness/2 value. * The result is areas with a margin of m_ZoneMinThickness/2 * 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 * When drawing outline with segments having a thickness of m_ZoneMinThickness, the outlines wilm Loading Loading @@ -109,41 +109,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) * m_ZoneMinThickness * m_ZoneMinThickness * so m_ZoneMinThickness is the min thickness of the filled zones areas * so m_ZoneMinThickness is the min thickness of the filled zones areas */ */ unsigned corners_count = m_FilledPolysList.size(); CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); 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(); } booleng->SetCorrectionFactor( (double) -m_ZoneMinThickness/2 ); booleng->SetCorrectionFactor( (double) -m_ZoneMinThickness/2 ); booleng->Do_Operation( BOOL_CORRECTION ); booleng->Do_Operation( BOOL_CORRECTION ); /* No copy the new outline in m_FilledPolysList */ /* No copy the new outline in m_FilledPolysList */ m_FilledPolysList.clear(); m_FilledPolysList.clear(); while( booleng->StartPolygonGet() ) CopyPolygonsFromBoolengineToFilledPolysList( booleng ); { 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(); } delete booleng; delete booleng; /* Second, Add the main (corrected) polygon (i.e. the filled area using only one outline) /* Second, Add the main (corrected) polygon (i.e. the filled area using only one outline) Loading @@ -156,21 +128,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* Add the main corrected polygon (i.e. the filled area using only one outline) /* Add the main corrected polygon (i.e. the filled area using only one outline) * in GroupA in Bool_Engine * in GroupA in Bool_Engine */ */ corners_count = m_FilledPolysList.size(); CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A ); 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(); } // Calculates the clearance value that meet DRC requirements // Calculates the clearance value that meet DRC requirements int clearance = max( m_ZoneClearance, g_DesignSettings.m_TrackClearence ); int clearance = max( m_ZoneClearance, g_DesignSettings.m_TrackClearence ); Loading Loading @@ -274,23 +232,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) /* put these areas in m_FilledPolysList */ /* put these areas in m_FilledPolysList */ m_FilledPolysList.clear(); m_FilledPolysList.clear(); while( booleng->StartPolygonGet() ) CopyPolygonsFromBoolengineToFilledPolysList( booleng ); { 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(); } delete booleng; delete booleng; // Remove insulated islands: // Remove insulated islands: Loading Loading @@ -946,3 +888,64 @@ void AddTextBoxWithClearancePolygon( Bool_Engine* aBooleng, aBooleng->EndPolygonAdd(); 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; }
polygon/PolyLine.cpp +4 −1 Original line number Original line Diff line number Diff line Loading @@ -545,7 +545,10 @@ void ArmBoolEng( Bool_Engine* aBooleng, bool aConvertHoles ) // should always be > DGRID a MARGE >= 10*DGRID is ok // should always be > DGRID a MARGE >= 10*DGRID is ok // this is also used to remove small segments and to decide when // this is also used to remove small segments and to decide when // two segments are in line. ( initial value = 0.001 ) // 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 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 ROUNDFACTOR = 1.5; // when will we round the correction shape to a circle double SMOOTHABER = 10.0; // accuracy when smoothing a polygon double SMOOTHABER = 10.0; // accuracy when smoothing a polygon Loading