mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-04 23:35:31 +00:00
forAllGeometryItems must account for PCB_GROUP descendants.
This commit is contained in:
parent
e163c40e54
commit
1f620e9cca
@ -28,6 +28,7 @@
|
||||
#include <pad.h>
|
||||
#include <zone.h>
|
||||
#include <pcb_text.h>
|
||||
#include <pcb_group.h>
|
||||
|
||||
|
||||
// A list of all basic (ie: non-compound) board geometry items
|
||||
@ -153,9 +154,11 @@ void DRC_TEST_PROVIDER::reportRuleStatistics()
|
||||
int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes, LSET aLayers,
|
||||
const std::function<bool( BOARD_ITEM*)>& aFunc )
|
||||
{
|
||||
BOARD *brd = m_drcEngine->GetBoard();
|
||||
BOARD* brd = m_drcEngine->GetBoard();
|
||||
bool cancelled = false;
|
||||
int n = 0;
|
||||
|
||||
std::bitset<MAX_STRUCT_TYPE_ID> typeMask;
|
||||
int n = 0;
|
||||
|
||||
if( aTypes.size() == 0 )
|
||||
{
|
||||
@ -168,68 +171,77 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
typeMask[ aType ] = true;
|
||||
}
|
||||
|
||||
auto processItem =
|
||||
[&]( BOARD_ITEM* item )
|
||||
{
|
||||
if( ( item->GetLayerSet() & aLayers ).any() )
|
||||
{
|
||||
if( typeMask[ PCB_TRACE_T ] && item->Type() == PCB_TRACE_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_VIA_T ] && item->Type() == PCB_VIA_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_ARC_T ] && item->Type() == PCB_ARC_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_DIMENSION_T ] && BaseType( item->Type() ) == PCB_DIMENSION_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_SHAPE_T ] && item->Type() == PCB_SHAPE_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXT_T ] && item->Type() == PCB_TEXT_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXTBOX_T ] && item->Type() == PCB_TEXTBOX_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TARGET_T ] && item->Type() == PCB_TARGET_T )
|
||||
{
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for( PCB_TRACK* item : brd->Tracks() )
|
||||
{
|
||||
if( (item->GetLayerSet() & aLayers).any() )
|
||||
{
|
||||
if( typeMask[ PCB_TRACE_T ] && item->Type() == PCB_TRACE_T )
|
||||
{
|
||||
aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_VIA_T ] && item->Type() == PCB_VIA_T )
|
||||
{
|
||||
aFunc( item );
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_ARC_T ] && item->Type() == PCB_ARC_T )
|
||||
{
|
||||
aFunc( item );
|
||||
n++;
|
||||
}
|
||||
}
|
||||
processItem( item );
|
||||
|
||||
if( cancelled )
|
||||
return n;
|
||||
}
|
||||
|
||||
for( BOARD_ITEM* item : brd->Drawings() )
|
||||
{
|
||||
if( (item->GetLayerSet() & aLayers).any() )
|
||||
processItem( item );
|
||||
|
||||
if( item->Type() == PCB_GROUP_T )
|
||||
{
|
||||
if( typeMask[ PCB_DIMENSION_T ] && BaseType( item->Type() ) == PCB_DIMENSION_T )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_SHAPE_T ] && item->Type() == PCB_SHAPE_T )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXT_T ] && item->Type() == PCB_TEXT_T )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXTBOX_T ] && item->Type() == PCB_TEXTBOX_T )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TARGET_T ] && item->Type() == PCB_TARGET_T )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
static_cast<PCB_GROUP*>( item )->RunOnDescendants(
|
||||
[&]( BOARD_ITEM* child )
|
||||
{
|
||||
processItem( child );
|
||||
} );
|
||||
}
|
||||
|
||||
if( cancelled )
|
||||
return n;
|
||||
}
|
||||
|
||||
if( typeMask[ PCB_ZONE_T ] )
|
||||
@ -238,11 +250,12 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
{
|
||||
if( ( item->GetLayerSet() & aLayers ).any() )
|
||||
{
|
||||
if( !aFunc( item ) )
|
||||
return n;
|
||||
|
||||
cancelled |= !aFunc( item );
|
||||
n++;
|
||||
}
|
||||
|
||||
if( cancelled )
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
@ -254,9 +267,7 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
{
|
||||
if( ( field->GetLayerSet() & aLayers ).any() )
|
||||
{
|
||||
if( !aFunc( field ) )
|
||||
return n;
|
||||
|
||||
cancelled |= !aFunc( field );
|
||||
n++;
|
||||
}
|
||||
}
|
||||
@ -269,9 +280,7 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
// Careful: if a pad has a hole then it pierces all layers
|
||||
if( pad->HasHole() || ( pad->GetLayerSet() & aLayers ).any() )
|
||||
{
|
||||
if( !aFunc( pad ) )
|
||||
return n;
|
||||
|
||||
cancelled |= !aFunc( pad );
|
||||
n++;
|
||||
}
|
||||
}
|
||||
@ -279,36 +288,15 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
|
||||
for( BOARD_ITEM* dwg : footprint->GraphicalItems() )
|
||||
{
|
||||
if( (dwg->GetLayerSet() & aLayers).any() )
|
||||
processItem( dwg );
|
||||
|
||||
if( dwg->Type() == PCB_GROUP_T )
|
||||
{
|
||||
if( typeMask[ PCB_DIMENSION_T ] && BaseType( dwg->Type() ) == PCB_DIMENSION_T )
|
||||
{
|
||||
if( !aFunc( dwg ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXT_T ] && dwg->Type() == PCB_TEXT_T )
|
||||
{
|
||||
if( !aFunc( dwg ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_TEXTBOX_T ] && dwg->Type() == PCB_TEXTBOX_T )
|
||||
{
|
||||
if( !aFunc( dwg ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
else if( typeMask[ PCB_SHAPE_T ] && dwg->Type() == PCB_SHAPE_T )
|
||||
{
|
||||
if( !aFunc( dwg ) )
|
||||
return n;
|
||||
|
||||
n++;
|
||||
}
|
||||
static_cast<PCB_GROUP*>( dwg )->RunOnDescendants(
|
||||
[&]( BOARD_ITEM* child )
|
||||
{
|
||||
processItem( child );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
@ -318,9 +306,7 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
{
|
||||
if( (zone->GetLayerSet() & aLayers).any() )
|
||||
{
|
||||
if( !aFunc( zone ) )
|
||||
return n;
|
||||
|
||||
cancelled |= !aFunc( zone );
|
||||
n++;
|
||||
}
|
||||
}
|
||||
@ -328,11 +314,12 @@ int DRC_TEST_PROVIDER::forEachGeometryItem( const std::vector<KICAD_T>& aTypes,
|
||||
|
||||
if( typeMask[ PCB_FOOTPRINT_T ] )
|
||||
{
|
||||
if( !aFunc( footprint ) )
|
||||
return n;
|
||||
|
||||
cancelled |= !aFunc( footprint );
|
||||
n++;
|
||||
}
|
||||
|
||||
if( cancelled )
|
||||
return n;
|
||||
}
|
||||
|
||||
return n;
|
||||
|
Loading…
Reference in New Issue
Block a user