Back out zone layer misunderstanding and make types clearer.

This commit is contained in:
Jeff Young 2020-09-23 20:02:21 +01:00
parent 1f284111b0
commit 4a0d469cec
6 changed files with 59 additions and 58 deletions

View File

@ -550,7 +550,7 @@ void CN_CONNECTIVITY_ALGO::FindIsolatedCopperIslands( ZONE_CONTAINER* aZone,
{
if( z->Parent() == aZone && z->Layer() == aLayer )
{
aIslands.push_back( static_cast<CN_ZONE*>(z)->SubpolyIndex() );
aIslands.push_back( static_cast<CN_ZONE_LAYER*>(z)->SubpolyIndex() );
}
}
}
@ -585,7 +585,7 @@ void CN_CONNECTIVITY_ALGO::FindIsolatedCopperIslands( std::vector<CN_ZONE_ISOLAT
if( z->Parent() == zone.m_zone && z->Layer() == layer )
{
zone.m_islands[layer].push_back(
static_cast<CN_ZONE*>( z )->SubpolyIndex() );
static_cast<CN_ZONE_LAYER*>( z )->SubpolyIndex() );
}
}
}
@ -624,85 +624,85 @@ void CN_CONNECTIVITY_ALGO::MarkNetAsDirty( int aNet )
}
void CN_VISITOR::checkZoneItemConnection( CN_ZONE* aZone, CN_ITEM* aItem )
void CN_VISITOR::checkZoneItemConnection( CN_ZONE_LAYER* aZoneLayer, CN_ITEM* aItem )
{
if( aZone->Net() != aItem->Net() && !aItem->CanChangeNet() )
if( aZoneLayer->Net() != aItem->Net() && !aItem->CanChangeNet() )
return;
if( !aZone->BBox().Intersects( aItem->BBox() ) )
if( !aZoneLayer->BBox().Intersects( aItem->BBox() ) )
return;
CN_ZONE* zoneItem = static_cast<CN_ZONE*> ( aZone );
int accuracy = 0;
int accuracy = 0;
if( aItem->Parent()->Type() == PCB_VIA_T
|| aItem->Parent()->Type() == PCB_TRACE_T
|| aItem->Parent()->Type() == PCB_ARC_T )
{
accuracy = ( static_cast<TRACK*>( aItem->Parent() )->GetWidth() + 1 ) / 2;
}
for( int i = 0; i < aItem->AnchorCount(); ++i )
{
if( zoneItem->ContainsPoint( aItem->GetAnchor( i ), accuracy ) )
if( aZoneLayer->ContainsPoint( aItem->GetAnchor( i ), accuracy ) )
{
zoneItem->Connect( aItem );
aItem->Connect( zoneItem );
aZoneLayer->Connect( aItem );
aItem->Connect( aZoneLayer );
return;
}
}
}
void CN_VISITOR::checkZoneZoneConnection( CN_ZONE* aZoneA, CN_ZONE* aZoneB )
void CN_VISITOR::checkZoneZoneConnection( CN_ZONE_LAYER* aZoneLayerA, CN_ZONE_LAYER* aZoneLayerB )
{
const auto parentA = static_cast<const ZONE_CONTAINER*>( aZoneA->Parent() );
const auto parentB = static_cast<const ZONE_CONTAINER*>( aZoneB->Parent() );
const auto zoneA = static_cast<const ZONE_CONTAINER*>( aZoneLayerA->Parent() );
const auto zoneB = static_cast<const ZONE_CONTAINER*>( aZoneLayerB->Parent() );
if( aZoneB->Net() != aZoneA->Net() )
if( aZoneLayerB->Net() != aZoneLayerA->Net() )
return; // we only test zones belonging to the same net
const BOX2I& boxA = aZoneA->BBox();
const BOX2I& boxB = aZoneB->BBox();
const BOX2I& boxA = aZoneLayerA->BBox();
const BOX2I& boxB = aZoneLayerB->BBox();
int radiusA = 0;
int radiusB = 0;
if( parentA->GetFilledPolysUseThickness() )
radiusA = ( parentA->GetMinThickness() + 1 ) / 2;
if( zoneA->GetFilledPolysUseThickness() )
radiusA = ( zoneA->GetMinThickness() + 1 ) / 2;
if( parentB->GetFilledPolysUseThickness() )
radiusB = ( parentB->GetMinThickness() + 1 ) / 2;
if( zoneB->GetFilledPolysUseThickness() )
radiusB = ( zoneB->GetMinThickness() + 1 ) / 2;
for( PCB_LAYER_ID layer : LSET( parentA->GetLayerSet() & parentB->GetLayerSet() ).Seq() )
PCB_LAYER_ID layer = static_cast<PCB_LAYER_ID>( aZoneLayerA->Layer() );
const SHAPE_LINE_CHAIN& outline =
zoneA->GetFilledPolysList( layer ).COutline( aZoneLayerA->SubpolyIndex() );
for( int i = 0; i < outline.PointCount(); i++ )
{
const SHAPE_LINE_CHAIN& outline =
parentA->GetFilledPolysList( layer ).COutline( aZoneA->SubpolyIndex() );
if( !boxB.Contains( outline.CPoint( i ) ) )
continue;
for( int i = 0; i < outline.PointCount(); i++ )
if( aZoneLayerB->ContainsPoint( outline.CPoint( i ), radiusA ) )
{
if( !boxB.Contains( outline.CPoint( i ) ) )
continue;
if( aZoneB->ContainsPoint( outline.CPoint( i ), radiusA ) )
{
aZoneA->Connect( aZoneB );
aZoneB->Connect( aZoneA );
return;
}
aZoneLayerA->Connect( aZoneLayerB );
aZoneLayerB->Connect( aZoneLayerA );
return;
}
}
const SHAPE_LINE_CHAIN& outline2 =
parentB->GetFilledPolysList( layer ).COutline( aZoneB->SubpolyIndex() );
const SHAPE_LINE_CHAIN& outline2 =
zoneB->GetFilledPolysList( layer ).COutline( aZoneLayerB->SubpolyIndex() );
for( int i = 0; i < outline2.PointCount(); i++ )
for( int i = 0; i < outline2.PointCount(); i++ )
{
if( !boxA.Contains( outline2.CPoint( i ) ) )
continue;
if( aZoneLayerA->ContainsPoint( outline2.CPoint( i ), radiusB ) )
{
if( !boxA.Contains( outline2.CPoint( i ) ) )
continue;
if( aZoneA->ContainsPoint( outline2.CPoint( i ), radiusB ) )
{
aZoneA->Connect( aZoneB );
aZoneB->Connect( aZoneA );
return;
}
aZoneLayerA->Connect( aZoneLayerB );
aZoneLayerB->Connect( aZoneLayerA );
return;
}
}
}
@ -731,20 +731,20 @@ bool CN_VISITOR::operator()( CN_ITEM* aCandidate )
// We should handle zone-zone connection separately
if ( parentA->Type() == PCB_ZONE_AREA_T && parentB->Type() == PCB_ZONE_AREA_T )
{
checkZoneZoneConnection( static_cast<CN_ZONE*>( m_item ),
static_cast<CN_ZONE*>( aCandidate ) );
checkZoneZoneConnection( static_cast<CN_ZONE_LAYER*>( m_item ),
static_cast<CN_ZONE_LAYER*>( aCandidate ) );
return true;
}
if( parentA->Type() == PCB_ZONE_AREA_T )
{
checkZoneItemConnection( static_cast<CN_ZONE*>( aCandidate ), m_item );
checkZoneItemConnection( static_cast<CN_ZONE_LAYER*>( aCandidate ), m_item );
return true;
}
if( parentB->Type() == PCB_ZONE_AREA_T )
{
checkZoneItemConnection( static_cast<CN_ZONE*>( m_item ), aCandidate );
checkZoneItemConnection( static_cast<CN_ZONE_LAYER*>( m_item ), aCandidate );
return true;
}

View File

@ -296,9 +296,9 @@ public:
protected:
void checkZoneItemConnection( CN_ZONE* aZone, CN_ITEM* aItem );
void checkZoneItemConnection( CN_ZONE_LAYER* aZoneLayer, CN_ITEM* aItem );
void checkZoneZoneConnection( CN_ZONE* aZoneA, CN_ZONE* aZoneB );
void checkZoneZoneConnection( CN_ZONE_LAYER* aZoneLayerA, CN_ZONE_LAYER* aZoneLayerB );
///> the item we are looking for connections to
CN_ITEM* m_item;

View File

@ -196,7 +196,7 @@ void CONNECTIVITY_DATA::RecalculateRatsnest( BOARD_COMMIT* aCommit )
// Don't add intentionally-kept zone islands to the ratsnest
if( c->IsOrphaned() && c->Size() == 1 )
{
if( dynamic_cast<CN_ZONE*>( *c->begin() ) )
if( dynamic_cast<CN_ZONE_LAYER*>( *c->begin() ) )
continue;
}

View File

@ -160,7 +160,7 @@ void CN_ITEM::Dump()
}
int CN_ZONE::AnchorCount() const
int CN_ZONE_LAYER::AnchorCount() const
{
if( !Valid() )
return 0;
@ -172,7 +172,7 @@ int CN_ZONE::AnchorCount() const
}
const VECTOR2I CN_ZONE::GetAnchor( int n ) const
const VECTOR2I CN_ZONE_LAYER::GetAnchor( int n ) const
{
if( !Valid() )
return VECTOR2I();
@ -278,7 +278,7 @@ CN_ITEM* CN_LIST::Add( ARC* aArc )
for( int j = 0; j < polys.OutlineCount(); j++ )
{
CN_ZONE* zitem = new CN_ZONE( zone, aLayer, false, j );
CN_ZONE_LAYER* zitem = new CN_ZONE_LAYER( zone, aLayer, false, j );
const auto& outline = zone->GetFilledPolysList( aLayer ).COutline( j );
for( int k = 0; k < outline.PointCount(); k++ )

View File

@ -354,10 +354,11 @@ public:
typedef std::shared_ptr<CN_ITEM> CN_ITEM_PTR;
class CN_ZONE : public CN_ITEM
class CN_ZONE_LAYER : public CN_ITEM
{
public:
CN_ZONE( ZONE_CONTAINER* aParent, PCB_LAYER_ID aLayer, bool aCanChangeNet, int aSubpolyIndex ) :
CN_ZONE_LAYER( ZONE_CONTAINER* aParent, PCB_LAYER_ID aLayer, bool aCanChangeNet,
int aSubpolyIndex ) :
CN_ITEM( aParent, aCanChangeNet ),
m_subpolyIndex( aSubpolyIndex ),
m_layer( aLayer )

View File

@ -364,7 +364,7 @@ void RN_NET::AddCluster( CN_CLUSTER_PTR aCluster )
for( auto item : *aCluster )
{
bool isZone = dynamic_cast<CN_ZONE*>(item) != nullptr;
bool isZone = dynamic_cast<CN_ZONE_LAYER*>(item) != nullptr;
auto& anchors = item->Anchors();
unsigned int nAnchors = isZone ? 1 : anchors.size();