Performance: better sharing of zone fills.
This commit is contained in:
parent
d8c4f2cb09
commit
2172810600
|
@ -644,7 +644,7 @@ void BOARD_ADAPTER::addSolidAreasShapes( const ZONE* aZone, CONTAINER_2D_BASE* a
|
||||||
PCB_LAYER_ID aLayerId )
|
PCB_LAYER_ID aLayerId )
|
||||||
{
|
{
|
||||||
// Copy the polys list because we have to simplify it
|
// Copy the polys list because we have to simplify it
|
||||||
SHAPE_POLY_SET polyList = SHAPE_POLY_SET( aZone->GetFilledPolysList( aLayerId ) );
|
SHAPE_POLY_SET polyList = SHAPE_POLY_SET( *aZone->GetFilledPolysList( aLayerId ) );
|
||||||
|
|
||||||
// This convert the poly in outline and holes
|
// This convert the poly in outline and holes
|
||||||
ConvertPolygonToTriangles( polyList, *aContainer, m_biuTo3Dunits, *aZone );
|
ConvertPolygonToTriangles( polyList, *aContainer, m_biuTo3Dunits, *aZone );
|
||||||
|
|
|
@ -592,7 +592,7 @@ void CN_CONNECTIVITY_ALGO::PropagateNets( BOARD_COMMIT* aCommit, PROPAGATE_MODE
|
||||||
void CN_CONNECTIVITY_ALGO::FindIsolatedCopperIslands( ZONE* aZone, PCB_LAYER_ID aLayer,
|
void CN_CONNECTIVITY_ALGO::FindIsolatedCopperIslands( ZONE* aZone, PCB_LAYER_ID aLayer,
|
||||||
std::vector<int>& aIslands )
|
std::vector<int>& aIslands )
|
||||||
{
|
{
|
||||||
if( aZone->GetFilledPolysList( aLayer ).IsEmpty() )
|
if( aZone->GetFilledPolysList( aLayer )->IsEmpty() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
aIslands.clear();
|
aIslands.clear();
|
||||||
|
@ -644,7 +644,7 @@ void CN_CONNECTIVITY_ALGO::FindIsolatedCopperIslands( std::vector<CN_ZONE_ISOLAT
|
||||||
{
|
{
|
||||||
for( PCB_LAYER_ID layer : zone.m_zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : zone.m_zone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
if( zone.m_zone->GetFilledPolysList( layer ).IsEmpty() )
|
if( zone.m_zone->GetFilledPolysList( layer )->IsEmpty() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for( const std::shared_ptr<CN_CLUSTER>& cluster : m_connClusters )
|
for( const std::shared_ptr<CN_CLUSTER>& cluster : m_connClusters )
|
||||||
|
@ -732,7 +732,7 @@ void CN_VISITOR::checkZoneZoneConnection( CN_ZONE_LAYER* aZoneLayerA, CN_ZONE_LA
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN& outline =
|
const SHAPE_LINE_CHAIN& outline =
|
||||||
zoneA->GetFilledPolysList( layer ).COutline( aZoneLayerA->SubpolyIndex() );
|
zoneA->GetFilledPolysList( layer )->COutline( aZoneLayerA->SubpolyIndex() );
|
||||||
|
|
||||||
for( int i = 0; i < outline.PointCount(); i++ )
|
for( int i = 0; i < outline.PointCount(); i++ )
|
||||||
{
|
{
|
||||||
|
@ -748,7 +748,7 @@ void CN_VISITOR::checkZoneZoneConnection( CN_ZONE_LAYER* aZoneLayerA, CN_ZONE_LA
|
||||||
}
|
}
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN& outline2 =
|
const SHAPE_LINE_CHAIN& outline2 =
|
||||||
zoneB->GetFilledPolysList( layer ).COutline( aZoneLayerB->SubpolyIndex() );
|
zoneB->GetFilledPolysList( layer )->COutline( aZoneLayerB->SubpolyIndex() );
|
||||||
|
|
||||||
for( int i = 0; i < outline2.PointCount(); i++ )
|
for( int i = 0; i < outline2.PointCount(); i++ )
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,7 +93,7 @@ int CN_ZONE_LAYER::AnchorCount() const
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const ZONE* zone = static_cast<const ZONE*>( Parent() );
|
const ZONE* zone = static_cast<const ZONE*>( Parent() );
|
||||||
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( m_layer ).COutline( m_subpolyIndex );
|
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( m_layer )->COutline( m_subpolyIndex );
|
||||||
|
|
||||||
return outline.PointCount() ? 1 : 0;
|
return outline.PointCount() ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ const VECTOR2I CN_ZONE_LAYER::GetAnchor( int n ) const
|
||||||
return VECTOR2I();
|
return VECTOR2I();
|
||||||
|
|
||||||
const ZONE* zone = static_cast<const ZONE*>( Parent() );
|
const ZONE* zone = static_cast<const ZONE*>( Parent() );
|
||||||
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( m_layer ).COutline( m_subpolyIndex );
|
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( m_layer )->COutline( m_subpolyIndex );
|
||||||
|
|
||||||
return outline.CPoint( 0 );
|
return outline.CPoint( 0 );
|
||||||
}
|
}
|
||||||
|
@ -199,14 +199,14 @@ CN_ITEM* CN_LIST::Add( PCB_ARC* aArc )
|
||||||
|
|
||||||
const std::vector<CN_ITEM*> CN_LIST::Add( ZONE* zone, PCB_LAYER_ID aLayer )
|
const std::vector<CN_ITEM*> CN_LIST::Add( ZONE* zone, PCB_LAYER_ID aLayer )
|
||||||
{
|
{
|
||||||
const auto& polys = zone->GetFilledPolysList( aLayer );
|
const std::shared_ptr<SHAPE_POLY_SET>& polys = zone->GetFilledPolysList( aLayer );
|
||||||
|
|
||||||
std::vector<CN_ITEM*> rv;
|
std::vector<CN_ITEM*> rv;
|
||||||
|
|
||||||
for( int j = 0; j < polys.OutlineCount(); j++ )
|
for( int j = 0; j < polys->OutlineCount(); j++ )
|
||||||
{
|
{
|
||||||
CN_ZONE_LAYER* zitem = new CN_ZONE_LAYER( zone, aLayer, false, j );
|
CN_ZONE_LAYER* zitem = new CN_ZONE_LAYER( zone, aLayer, false, j );
|
||||||
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( aLayer ).COutline( j );
|
const SHAPE_LINE_CHAIN& outline = zone->GetFilledPolysList( aLayer )->COutline( j );
|
||||||
|
|
||||||
for( int k = 0; k < outline.PointCount(); k++ )
|
for( int k = 0; k < outline.PointCount(); k++ )
|
||||||
zitem->AddAnchor( outline.CPoint( k ) );
|
zitem->AddAnchor( outline.CPoint( k ) );
|
||||||
|
|
|
@ -290,13 +290,11 @@ public:
|
||||||
m_subpolyIndex( aSubpolyIndex ),
|
m_subpolyIndex( aSubpolyIndex ),
|
||||||
m_layer( aLayer )
|
m_layer( aLayer )
|
||||||
{
|
{
|
||||||
const SHAPE_POLY_SET& fill = aParent->GetFilledPolysList( aLayer );
|
m_triangulatedPoly = aParent->GetFilledPolysList( aLayer );
|
||||||
|
|
||||||
m_triangulatedPoly = fill;
|
for( unsigned int ii = 0; ii < m_triangulatedPoly->TriangulatedPolyCount(); ++ii )
|
||||||
|
|
||||||
for( unsigned int ii = 0; ii < m_triangulatedPoly.TriangulatedPolyCount(); ++ii )
|
|
||||||
{
|
{
|
||||||
const auto* triangleSet = m_triangulatedPoly.TriangulatedPolygon( ii );
|
const auto* triangleSet = m_triangulatedPoly->TriangulatedPolygon( ii );
|
||||||
|
|
||||||
if( triangleSet->GetSourceOutlineIndex() != aSubpolyIndex )
|
if( triangleSet->GetSourceOutlineIndex() != aSubpolyIndex )
|
||||||
continue;
|
continue;
|
||||||
|
@ -373,7 +371,7 @@ private:
|
||||||
std::vector<VECTOR2I> m_testOutlinePoints;
|
std::vector<VECTOR2I> m_testOutlinePoints;
|
||||||
int m_subpolyIndex;
|
int m_subpolyIndex;
|
||||||
PCB_LAYER_ID m_layer;
|
PCB_LAYER_ID m_layer;
|
||||||
SHAPE_POLY_SET m_triangulatedPoly;
|
std::shared_ptr<SHAPE_POLY_SET> m_triangulatedPoly;
|
||||||
RTree<const SHAPE*, int, 2, double> m_rTree;
|
RTree<const SHAPE*, int, 2, double> m_rTree;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -519,7 +519,7 @@ void DRC_TEST_PROVIDER_MECHANICAL_CLEARANCE::testZoneLayer( ZONE* aZone, PCB_LAY
|
||||||
{
|
{
|
||||||
int epsilon = m_board->GetDesignSettings().GetDRCEpsilon();
|
int epsilon = m_board->GetDesignSettings().GetDRCEpsilon();
|
||||||
int clearance = aConstraint.GetValue().Min();
|
int clearance = aConstraint.GetValue().Min();
|
||||||
SHAPE_POLY_SET fill = aZone->GetFilledPolysList( aLayer );
|
SHAPE_POLY_SET fill = *aZone->GetFilledPolysList( aLayer );
|
||||||
|
|
||||||
if( aConstraint.GetSeverity() == RPT_SEVERITY_IGNORE || clearance - epsilon <= 0 )
|
if( aConstraint.GetSeverity() == RPT_SEVERITY_IGNORE || clearance - epsilon <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -115,7 +115,7 @@ bool DRC_TEST_PROVIDER_SLIVER_CHECKER::Run()
|
||||||
{
|
{
|
||||||
ZONE* zone = static_cast<ZONE*>( item );
|
ZONE* zone = static_cast<ZONE*>( item );
|
||||||
|
|
||||||
poly.BooleanAdd( zone->GetFilledPolysList( layer ),
|
poly.BooleanAdd( *zone->GetFilledPolysList( layer ),
|
||||||
SHAPE_POLY_SET::PM_FAST );
|
SHAPE_POLY_SET::PM_FAST );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -117,7 +117,7 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::addItemToRTrees( BOARD_ITEM* item )
|
||||||
{
|
{
|
||||||
if( zone->IsOnLayer( layer ) )
|
if( zone->IsOnLayer( layer ) )
|
||||||
{
|
{
|
||||||
solderMask->GetFill( layer )->BooleanAdd( zone->GetFilledPolysList( layer ),
|
solderMask->GetFill( layer )->BooleanAdd( *zone->GetFilledPolysList( layer ),
|
||||||
SHAPE_POLY_SET::PM_FAST );
|
SHAPE_POLY_SET::PM_FAST );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ bool DRC_TEST_PROVIDER_ZONE_CONNECTIONS::Run()
|
||||||
|
|
||||||
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
const SHAPE_POLY_SET& zoneFill = zone->GetFilledPolysList( layer );
|
const std::shared_ptr<SHAPE_POLY_SET>& zoneFill = zone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
for( FOOTPRINT* footprint : board->Footprints() )
|
for( FOOTPRINT* footprint : board->Footprints() )
|
||||||
{
|
{
|
||||||
|
@ -142,8 +142,8 @@ bool DRC_TEST_PROVIDER_ZONE_CONNECTIONS::Run()
|
||||||
std::vector<SHAPE_LINE_CHAIN::INTERSECTION> intersections;
|
std::vector<SHAPE_LINE_CHAIN::INTERSECTION> intersections;
|
||||||
int spokes = 0;
|
int spokes = 0;
|
||||||
|
|
||||||
for( int jj = 0; jj < zoneFill.OutlineCount(); ++jj )
|
for( int jj = 0; jj < zoneFill->OutlineCount(); ++jj )
|
||||||
padOutline.Intersect( zoneFill.Outline( jj ), intersections, true );
|
padOutline.Intersect( zoneFill->Outline( jj ), intersections, true );
|
||||||
|
|
||||||
spokes += intersections.size() / 2;
|
spokes += intersections.size() / 2;
|
||||||
|
|
||||||
|
@ -157,12 +157,12 @@ bool DRC_TEST_PROVIDER_ZONE_CONNECTIONS::Run()
|
||||||
{
|
{
|
||||||
if( padOutline.PointInside( track->GetStart() ) )
|
if( padOutline.PointInside( track->GetStart() ) )
|
||||||
{
|
{
|
||||||
if( zone->GetFilledPolysList( layer ).Collide( track->GetEnd() ) )
|
if( zone->GetFilledPolysList( layer )->Collide( track->GetEnd() ) )
|
||||||
spokes++;
|
spokes++;
|
||||||
}
|
}
|
||||||
else if( padOutline.PointInside( track->GetEnd() ) )
|
else if( padOutline.PointInside( track->GetEnd() ) )
|
||||||
{
|
{
|
||||||
if( zone->GetFilledPolysList( layer ).Collide( track->GetStart() ) )
|
if( zone->GetFilledPolysList( layer )->Collide( track->GetStart() ) )
|
||||||
spokes++;
|
spokes++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,7 +485,7 @@ bool HYPERLYNX_EXPORTER::writeNetObjects( const std::vector<BOARD_ITEM*>& aObjec
|
||||||
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
const wxString layerName = m_board->GetLayerName( layer );
|
const wxString layerName = m_board->GetLayerName( layer );
|
||||||
SHAPE_POLY_SET filledShape = zone->GetFilledPolysList( layer );
|
SHAPE_POLY_SET filledShape = *zone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
filledShape.Simplify( SHAPE_POLY_SET::PM_FAST );
|
filledShape.Simplify( SHAPE_POLY_SET::PM_FAST );
|
||||||
|
|
||||||
|
|
|
@ -894,7 +894,7 @@ SHAPE_POLY_SET FOOTPRINT::GetBoundingHull() const
|
||||||
{
|
{
|
||||||
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET layerPoly = zone->GetFilledPolysList( layer );
|
SHAPE_POLY_SET layerPoly = *zone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
for( int ii = 0; ii < layerPoly.OutlineCount(); ii++ )
|
for( int ii = 0; ii < layerPoly.OutlineCount(); ii++ )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1916,9 +1916,9 @@ void PCB_PAINTER::draw( const ZONE* aZone, int aLayer )
|
||||||
|| displayMode == ZONE_DISPLAY_MODE::SHOW_FRACTURE_BORDERS
|
|| displayMode == ZONE_DISPLAY_MODE::SHOW_FRACTURE_BORDERS
|
||||||
|| displayMode == ZONE_DISPLAY_MODE::SHOW_TRIANGULATION )
|
|| displayMode == ZONE_DISPLAY_MODE::SHOW_TRIANGULATION )
|
||||||
{
|
{
|
||||||
const SHAPE_POLY_SET& polySet = aZone->GetFilledPolysList( layer );
|
const std::shared_ptr<SHAPE_POLY_SET>& polySet = aZone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
if( polySet.OutlineCount() == 0 ) // Nothing to draw
|
if( polySet->OutlineCount() == 0 ) // Nothing to draw
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_gal->SetStrokeColor( color );
|
m_gal->SetStrokeColor( color );
|
||||||
|
@ -1936,7 +1936,7 @@ void PCB_PAINTER::draw( const ZONE* aZone, int aLayer )
|
||||||
m_gal->SetIsStroke( true );
|
m_gal->SetIsStroke( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_gal->DrawPolygon( polySet, displayMode == ZONE_DISPLAY_MODE::SHOW_TRIANGULATION );
|
m_gal->DrawPolygon( *polySet, displayMode == ZONE_DISPLAY_MODE::SHOW_TRIANGULATION );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -608,7 +608,7 @@ void PlotStandardLayer( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
|
||||||
if( !aLayerMask[layer] )
|
if( !aLayerMask[layer] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SHAPE_POLY_SET mainArea = zone->GetFilledPolysList( layer );
|
SHAPE_POLY_SET mainArea = *zone->GetFilledPolysList( layer );
|
||||||
SHAPE_POLY_SET islands;
|
SHAPE_POLY_SET islands;
|
||||||
|
|
||||||
for( int i = mainArea.OutlineCount() - 1; i >= 0; i-- )
|
for( int i = mainArea.OutlineCount() - 1; i >= 0; i-- )
|
||||||
|
|
|
@ -3692,15 +3692,12 @@ bool CADSTAR_PCB_ARCHIVE_LOADER::calculateZonePriorities( PCB_LAYER_ID& aLayer )
|
||||||
SHAPE_POLY_SET intersectShape( *aHigherZone->Outline() );
|
SHAPE_POLY_SET intersectShape( *aHigherZone->Outline() );
|
||||||
intersectShape.Inflate( inflateValue( aLowerZone, aHigherZone ) , 32 );
|
intersectShape.Inflate( inflateValue( aLowerZone, aHigherZone ) , 32 );
|
||||||
|
|
||||||
SHAPE_POLY_SET lowerZoneFill( aLowerZone->GetFilledPolysList( aLayer ) );
|
SHAPE_POLY_SET lowerZoneFill( *aLowerZone->GetFilledPolysList( aLayer ) );
|
||||||
|
|
||||||
SHAPE_POLY_SET lowerZoneOutline( *aLowerZone->Outline() );
|
SHAPE_POLY_SET lowerZoneOutline( *aLowerZone->Outline() );
|
||||||
|
|
||||||
lowerZoneOutline.BooleanSubtract( intersectShape,
|
lowerZoneOutline.BooleanSubtract( intersectShape, SHAPE_POLY_SET::PM_FAST );
|
||||||
SHAPE_POLY_SET::PM_FAST );
|
|
||||||
|
|
||||||
lowerZoneFill.BooleanSubtract( lowerZoneOutline,
|
lowerZoneFill.BooleanSubtract( lowerZoneOutline, SHAPE_POLY_SET::PM_FAST );
|
||||||
SHAPE_POLY_SET::PM_FAST );
|
|
||||||
|
|
||||||
double leftOverArea = lowerZoneFill.Area();
|
double leftOverArea = lowerZoneFill.Area();
|
||||||
|
|
||||||
|
@ -3758,8 +3755,8 @@ bool CADSTAR_PCB_ARCHIVE_LOADER::calculateZonePriorities( PCB_LAYER_ID& aLayer )
|
||||||
continue; // The zones do not interact in any way
|
continue; // The zones do not interact in any way
|
||||||
}
|
}
|
||||||
|
|
||||||
SHAPE_POLY_SET thisZonePolyFill = thisZone->GetFilledPolysList( aLayer );
|
SHAPE_POLY_SET thisZonePolyFill = *thisZone->GetFilledPolysList( aLayer );
|
||||||
SHAPE_POLY_SET otherZonePolyFill = otherZone->GetFilledPolysList( aLayer );
|
SHAPE_POLY_SET otherZonePolyFill = *otherZone->GetFilledPolysList( aLayer );
|
||||||
|
|
||||||
if( thisZonePolyFill.Area() > 0.0 && otherZonePolyFill.Area() > 0.0 )
|
if( thisZonePolyFill.Area() > 0.0 && otherZonePolyFill.Area() > 0.0 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -2215,9 +2215,9 @@ void PCB_PLUGIN::format( const ZONE* aZone, int aNestLevel ) const
|
||||||
// Save the PolysList (filled areas)
|
// Save the PolysList (filled areas)
|
||||||
for( PCB_LAYER_ID layer : aZone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : aZone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList( layer );
|
const std::shared_ptr<SHAPE_POLY_SET>& fv = aZone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
for( int ii = 0; ii < fv.OutlineCount(); ++ii )
|
for( int ii = 0; ii < fv->OutlineCount(); ++ii )
|
||||||
{
|
{
|
||||||
m_out->Print( aNestLevel + 1, "(filled_polygon\n" );
|
m_out->Print( aNestLevel + 1, "(filled_polygon\n" );
|
||||||
m_out->Print( aNestLevel + 2, "(layer %s)\n",
|
m_out->Print( aNestLevel + 2, "(layer %s)\n",
|
||||||
|
@ -2226,7 +2226,7 @@ void PCB_PLUGIN::format( const ZONE* aZone, int aNestLevel ) const
|
||||||
if( aZone->IsIsland( layer, ii ) )
|
if( aZone->IsIsland( layer, ii ) )
|
||||||
m_out->Print( aNestLevel + 2, "(island)\n" );
|
m_out->Print( aNestLevel + 2, "(island)\n" );
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN& chain = fv.COutline( ii );
|
const SHAPE_LINE_CHAIN& chain = fv->COutline( ii );
|
||||||
|
|
||||||
formatPolyPts( chain, aNestLevel + 1, ADVANCED_CFG::GetCfg().m_CompactSave );
|
formatPolyPts( chain, aNestLevel + 1, ADVANCED_CFG::GetCfg().m_CompactSave );
|
||||||
m_out->Print( aNestLevel + 1, ")\n" );
|
m_out->Print( aNestLevel + 1, ")\n" );
|
||||||
|
|
|
@ -149,7 +149,13 @@ void ZONE::InitDataFromSrcInCopyCtor( const ZONE& aZone )
|
||||||
|
|
||||||
for( PCB_LAYER_ID layer : aZone.GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : aZone.GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
m_FilledPolysList[layer] = aZone.m_FilledPolysList.at( layer );
|
std::shared_ptr<SHAPE_POLY_SET> fill = aZone.m_FilledPolysList.at( layer );
|
||||||
|
|
||||||
|
if( fill )
|
||||||
|
m_FilledPolysList[layer] = std::make_shared<SHAPE_POLY_SET>( *fill );
|
||||||
|
else
|
||||||
|
m_FilledPolysList[layer] = std::make_shared<SHAPE_POLY_SET>();
|
||||||
|
|
||||||
m_RawPolysList[layer] = aZone.m_RawPolysList.at( layer );
|
m_RawPolysList[layer] = aZone.m_RawPolysList.at( layer );
|
||||||
m_filledPolysHash[layer] = aZone.m_filledPolysHash.at( layer );
|
m_filledPolysHash[layer] = aZone.m_filledPolysHash.at( layer );
|
||||||
m_insulatedIslands[layer] = aZone.m_insulatedIslands.at( layer );
|
m_insulatedIslands[layer] = aZone.m_insulatedIslands.at( layer );
|
||||||
|
@ -178,11 +184,11 @@ bool ZONE::UnFill()
|
||||||
{
|
{
|
||||||
bool change = false;
|
bool change = false;
|
||||||
|
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
{
|
{
|
||||||
change |= !pair.second.IsEmpty();
|
change |= !pair.second->IsEmpty();
|
||||||
m_insulatedIslands[pair.first].clear();
|
m_insulatedIslands[pair.first].clear();
|
||||||
pair.second.RemoveAllContours();
|
pair.second->RemoveAllContours();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_isFilled = false;
|
m_isFilled = false;
|
||||||
|
@ -250,7 +256,7 @@ void ZONE::SetLayerSet( LSET aLayerSet )
|
||||||
|
|
||||||
for( PCB_LAYER_ID layer : aLayerSet.Seq() )
|
for( PCB_LAYER_ID layer : aLayerSet.Seq() )
|
||||||
{
|
{
|
||||||
m_FilledPolysList[layer] = {};
|
m_FilledPolysList[layer] = std::make_shared<SHAPE_POLY_SET>();
|
||||||
m_RawPolysList[layer] = {};
|
m_RawPolysList[layer] = {};
|
||||||
m_filledPolysHash[layer] = {};
|
m_filledPolysHash[layer] = {};
|
||||||
m_insulatedIslands[layer] = {};
|
m_insulatedIslands[layer] = {};
|
||||||
|
@ -351,7 +357,7 @@ void ZONE::BuildHashValue( PCB_LAYER_ID aLayer )
|
||||||
if( !m_FilledPolysList.count( aLayer ) )
|
if( !m_FilledPolysList.count( aLayer ) )
|
||||||
m_filledPolysHash[aLayer] = g_nullPoly.GetHash();
|
m_filledPolysHash[aLayer] = g_nullPoly.GetHash();
|
||||||
else
|
else
|
||||||
m_filledPolysHash[aLayer] = m_FilledPolysList.at( aLayer ).GetHash();
|
m_filledPolysHash[aLayer] = m_FilledPolysList.at( aLayer )->GetHash();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -466,13 +472,12 @@ bool ZONE::HitTestFilledArea( PCB_LAYER_ID aLayer, const VECTOR2I& aRefPos, int
|
||||||
// Rule areas have no filled area, but it's generally nice to treat their interior as if it were
|
// Rule areas have no filled area, but it's generally nice to treat their interior as if it were
|
||||||
// filled so that people don't have to select them by their outline (which is min-width)
|
// filled so that people don't have to select them by their outline (which is min-width)
|
||||||
if( GetIsRuleArea() )
|
if( GetIsRuleArea() )
|
||||||
return m_Poly->Contains( VECTOR2I( aRefPos.x, aRefPos.y ), -1, aAccuracy );
|
return m_Poly->Contains( aRefPos, -1, aAccuracy );
|
||||||
|
|
||||||
if( !m_FilledPolysList.count( aLayer ) )
|
if( !m_FilledPolysList.count( aLayer ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return m_FilledPolysList.at( aLayer ).Contains( VECTOR2I( aRefPos.x, aRefPos.y ), -1,
|
return m_FilledPolysList.at( aLayer )->Contains( aRefPos, -1, aAccuracy );
|
||||||
aAccuracy );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -622,7 +627,7 @@ void ZONE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
|
||||||
|
|
||||||
if( layer_it != m_FilledPolysList.end() )
|
if( layer_it != m_FilledPolysList.end() )
|
||||||
{
|
{
|
||||||
msg.Printf( wxT( "%d" ), layer_it->second.TotalVertices() );
|
msg.Printf( wxT( "%d" ), layer_it->second->TotalVertices() );
|
||||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Corner Count" ), msg ) );
|
aList.emplace_back( MSG_PANEL_ITEM( _( "Corner Count" ), msg ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -636,8 +641,8 @@ void ZONE::Move( const VECTOR2I& offset )
|
||||||
|
|
||||||
HatchBorder();
|
HatchBorder();
|
||||||
|
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
pair.second.Move( offset );
|
pair.second->Move( offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -662,8 +667,8 @@ void ZONE::Rotate( const VECTOR2I& aCentre, const EDA_ANGLE& aAngle )
|
||||||
HatchBorder();
|
HatchBorder();
|
||||||
|
|
||||||
/* rotate filled areas: */
|
/* rotate filled areas: */
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
pair.second.Rotate( aAngle, aCentre );
|
pair.second->Rotate( aAngle, aCentre );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -686,8 +691,8 @@ void ZONE::Mirror( const VECTOR2I& aMirrorRef, bool aMirrorLeftRight )
|
||||||
|
|
||||||
HatchBorder();
|
HatchBorder();
|
||||||
|
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
pair.second.Mirror( aMirrorLeftRight, !aMirrorLeftRight, aMirrorRef );
|
pair.second->Mirror( aMirrorLeftRight, !aMirrorLeftRight, aMirrorRef );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1018,13 +1023,13 @@ void ZONE::CacheTriangulation( PCB_LAYER_ID aLayer )
|
||||||
{
|
{
|
||||||
if( aLayer == UNDEFINED_LAYER )
|
if( aLayer == UNDEFINED_LAYER )
|
||||||
{
|
{
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
pair.second.CacheTriangulation();
|
pair.second->CacheTriangulation();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( m_FilledPolysList.count( aLayer ) )
|
if( m_FilledPolysList.count( aLayer ) )
|
||||||
m_FilledPolysList[ aLayer ].CacheTriangulation();
|
m_FilledPolysList[ aLayer ]->CacheTriangulation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1175,16 +1180,16 @@ double ZONE::CalculateFilledArea()
|
||||||
|
|
||||||
// Iterate over each outline polygon in the zone and then iterate over
|
// Iterate over each outline polygon in the zone and then iterate over
|
||||||
// each hole it has to compute the total area.
|
// each hole it has to compute the total area.
|
||||||
for( std::pair<const PCB_LAYER_ID, SHAPE_POLY_SET>& pair : m_FilledPolysList )
|
for( std::pair<const PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>>& pair : m_FilledPolysList )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET& poly = pair.second;
|
std::shared_ptr<SHAPE_POLY_SET>& poly = pair.second;
|
||||||
|
|
||||||
for( int i = 0; i < poly.OutlineCount(); i++ )
|
for( int i = 0; i < poly->OutlineCount(); i++ )
|
||||||
{
|
{
|
||||||
m_area += poly.Outline( i ).Area();
|
m_area += poly->Outline( i ).Area();
|
||||||
|
|
||||||
for( int j = 0; j < poly.HoleCount( i ); j++ )
|
for( int j = 0; j < poly->HoleCount( i ); j++ )
|
||||||
m_area -= poly.Hole( i, j ).Area();
|
m_area -= poly->Hole( i, j ).Area();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1302,7 +1307,7 @@ std::shared_ptr<SHAPE> ZONE::GetEffectiveShape( PCB_LAYER_ID aLayer ) const
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
shape.reset( m_FilledPolysList.at( aLayer ).Clone() );
|
shape.reset( m_FilledPolysList.at( aLayer )->Clone() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
@ -1318,7 +1323,7 @@ void ZONE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
|
||||||
if( !m_FilledPolysList.count( aLayer ) )
|
if( !m_FilledPolysList.count( aLayer ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
aCornerBuffer = m_FilledPolysList.at( aLayer );
|
aCornerBuffer = *m_FilledPolysList.at( aLayer );
|
||||||
|
|
||||||
// Rebuild filled areas only if clearance is not 0
|
// Rebuild filled areas only if clearance is not 0
|
||||||
if( aClearance )
|
if( aClearance )
|
||||||
|
@ -1332,8 +1337,8 @@ void ZONE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
|
||||||
void ZONE::TransformSolidAreasShapesToPolygon( PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aCornerBuffer,
|
void ZONE::TransformSolidAreasShapesToPolygon( PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aCornerBuffer,
|
||||||
int aError ) const
|
int aError ) const
|
||||||
{
|
{
|
||||||
if( m_FilledPolysList.count( aLayer ) && !m_FilledPolysList.at( aLayer ).IsEmpty() )
|
if( m_FilledPolysList.count( aLayer ) && !m_FilledPolysList.at( aLayer )->IsEmpty() )
|
||||||
aCornerBuffer.Append( m_FilledPolysList.at( aLayer ) );
|
aCornerBuffer.Append( *m_FilledPolysList.at( aLayer ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -639,7 +639,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @return a reference to the list of filled polygons.
|
* @return a reference to the list of filled polygons.
|
||||||
*/
|
*/
|
||||||
const SHAPE_POLY_SET& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
|
const std::shared_ptr<SHAPE_POLY_SET>& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
|
||||||
{
|
{
|
||||||
wxASSERT( m_FilledPolysList.count( aLayer ) );
|
wxASSERT( m_FilledPolysList.count( aLayer ) );
|
||||||
return m_FilledPolysList.at( aLayer );
|
return m_FilledPolysList.at( aLayer );
|
||||||
|
@ -648,7 +648,7 @@ public:
|
||||||
SHAPE_POLY_SET* GetFill( PCB_LAYER_ID aLayer )
|
SHAPE_POLY_SET* GetFill( PCB_LAYER_ID aLayer )
|
||||||
{
|
{
|
||||||
wxASSERT( m_FilledPolysList.count( aLayer ) );
|
wxASSERT( m_FilledPolysList.count( aLayer ) );
|
||||||
return &m_FilledPolysList.at( aLayer );
|
return m_FilledPolysList.at( aLayer ).get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -662,7 +662,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
|
void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
|
||||||
{
|
{
|
||||||
m_FilledPolysList[aLayer] = aPolysList;
|
m_FilledPolysList[aLayer] = std::make_shared<SHAPE_POLY_SET>( aPolysList );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -931,7 +931,7 @@ protected:
|
||||||
* connecting "holes" with external main outline. In complex cases an outline
|
* connecting "holes" with external main outline. In complex cases an outline
|
||||||
* described by m_Poly can have many filled areas
|
* described by m_Poly can have many filled areas
|
||||||
*/
|
*/
|
||||||
std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_FilledPolysList;
|
std::map<PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>> m_FilledPolysList;
|
||||||
std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_RawPolysList;
|
std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_RawPolysList;
|
||||||
|
|
||||||
/// Temp variables used while filling
|
/// Temp variables used while filling
|
||||||
|
|
|
@ -339,23 +339,22 @@ bool ZONE_FILLER::Fill( std::vector<ZONE*>& aZones, bool aCheck, wxWindow* aPare
|
||||||
// to allow deleting a polygon from list without breaking the remaining of the list
|
// to allow deleting a polygon from list without breaking the remaining of the list
|
||||||
std::sort( islands.begin(), islands.end(), std::greater<int>() );
|
std::sort( islands.begin(), islands.end(), std::greater<int>() );
|
||||||
|
|
||||||
SHAPE_POLY_SET poly = zone.m_zone->GetFilledPolysList( layer );
|
std::shared_ptr<SHAPE_POLY_SET> poly = zone.m_zone->GetFilledPolysList( layer );
|
||||||
long long int minArea = zone.m_zone->GetMinIslandArea();
|
long long int minArea = zone.m_zone->GetMinIslandArea();
|
||||||
ISLAND_REMOVAL_MODE mode = zone.m_zone->GetIslandRemovalMode();
|
ISLAND_REMOVAL_MODE mode = zone.m_zone->GetIslandRemovalMode();
|
||||||
|
|
||||||
for( int idx : islands )
|
for( int idx : islands )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN& outline = poly.Outline( idx );
|
SHAPE_LINE_CHAIN& outline = poly->Outline( idx );
|
||||||
|
|
||||||
if( mode == ISLAND_REMOVAL_MODE::ALWAYS )
|
if( mode == ISLAND_REMOVAL_MODE::ALWAYS )
|
||||||
poly.DeletePolygon( idx );
|
poly->DeletePolygon( idx );
|
||||||
else if ( mode == ISLAND_REMOVAL_MODE::AREA && outline.Area() < minArea )
|
else if ( mode == ISLAND_REMOVAL_MODE::AREA && outline.Area() < minArea )
|
||||||
poly.DeletePolygon( idx );
|
poly->DeletePolygon( idx );
|
||||||
else
|
else
|
||||||
zone.m_zone->SetIsIsland( layer, idx );
|
zone.m_zone->SetIsIsland( layer, idx );
|
||||||
}
|
}
|
||||||
|
|
||||||
zone.m_zone->SetFilledPolysList( layer, poly );
|
|
||||||
zone.m_zone->CalculateFilledArea();
|
zone.m_zone->CalculateFilledArea();
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
|
@ -373,17 +372,16 @@ bool ZONE_FILLER::Fill( std::vector<ZONE*>& aZones, bool aCheck, wxWindow* aPare
|
||||||
if( m_debugZoneFiller && LSET::InternalCuMask().Contains( layer ) )
|
if( m_debugZoneFiller && LSET::InternalCuMask().Contains( layer ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SHAPE_POLY_SET poly = zone->GetFilledPolysList( layer );
|
std::shared_ptr<SHAPE_POLY_SET> poly = zone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
for( int ii = poly.OutlineCount() - 1; ii >= 0; ii-- )
|
for( int ii = poly->OutlineCount() - 1; ii >= 0; ii-- )
|
||||||
{
|
{
|
||||||
std::vector<SHAPE_LINE_CHAIN>& island = poly.Polygon( ii );
|
std::vector<SHAPE_LINE_CHAIN>& island = poly->Polygon( ii );
|
||||||
|
|
||||||
if( island.empty() || !m_boardOutline.Contains( island.front().CPoint( 0 ) ) )
|
if( island.empty() || !m_boardOutline.Contains( island.front().CPoint( 0 ) ) )
|
||||||
poly.DeletePolygon( ii );
|
poly->DeletePolygon( ii );
|
||||||
}
|
}
|
||||||
|
|
||||||
zone->SetFilledPolysList( layer, poly );
|
|
||||||
zone->CalculateFilledArea();
|
zone->CalculateFilledArea();
|
||||||
|
|
||||||
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
if( m_progressReporter && m_progressReporter->IsCancelled() )
|
||||||
|
|
|
@ -151,7 +151,7 @@ BOOST_FIXTURE_TEST_CASE( NotchedZones, ZONE_FILL_TEST_FIXTURE )
|
||||||
{
|
{
|
||||||
if( zone->GetLayerSet().Contains( F_Cu ) )
|
if( zone->GetLayerSet().Contains( F_Cu ) )
|
||||||
{
|
{
|
||||||
frontCopper.BooleanAdd( zone->GetFilledPolysList( F_Cu ),
|
frontCopper.BooleanAdd( *zone->GetFilledPolysList( F_Cu ),
|
||||||
SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ BOOST_FIXTURE_TEST_CASE( NotchedZones, ZONE_FILL_TEST_FIXTURE )
|
||||||
{
|
{
|
||||||
if( zone->GetLayerSet().Contains( F_Cu ) )
|
if( zone->GetLayerSet().Contains( F_Cu ) )
|
||||||
{
|
{
|
||||||
frontCopper.BooleanAdd( zone->GetFilledPolysList( F_Cu ),
|
frontCopper.BooleanAdd( *zone->GetFilledPolysList( F_Cu ),
|
||||||
SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ int polygon_triangulation_main( int argc, char *argv[] )
|
||||||
// to do that right now.
|
// to do that right now.
|
||||||
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET poly = zone->GetFilledPolysList( layer );
|
SHAPE_POLY_SET poly = *zone->GetFilledPolysList( layer );
|
||||||
|
|
||||||
poly.CacheTriangulation();
|
poly.CacheTriangulation();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue