Footprint disallow layer checking needs to be based on courtyards.
Fixes https://gitlab.com/kicad/code/kicad/issues/7620
This commit is contained in:
parent
0337c42d25
commit
e89f9db438
|
@ -380,7 +380,7 @@ public:
|
|||
return bbox;
|
||||
}
|
||||
|
||||
void GenerateBBoxCache()
|
||||
void GenerateBBoxCache() const
|
||||
{
|
||||
m_bbox.Compute( m_points );
|
||||
|
||||
|
@ -787,7 +787,7 @@ private:
|
|||
int m_width;
|
||||
|
||||
/// cached bounding box
|
||||
BOX2I m_bbox;
|
||||
mutable BOX2I m_bbox;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1141,7 +1141,7 @@ public:
|
|||
* @note These caches **must** be built before a group of calls to Contains(). They are
|
||||
* **not** kept up-to-date by editing actions.
|
||||
*/
|
||||
void BuildBBoxCaches();
|
||||
void BuildBBoxCaches() const;
|
||||
|
||||
const BOX2I BBoxFromCaches() const;
|
||||
|
||||
|
|
|
@ -1525,14 +1525,14 @@ bool SHAPE_POLY_SET::CollideEdge( const VECTOR2I& aPoint,
|
|||
}
|
||||
|
||||
|
||||
void SHAPE_POLY_SET::BuildBBoxCaches()
|
||||
void SHAPE_POLY_SET::BuildBBoxCaches() const
|
||||
{
|
||||
for( int polygonIdx = 0; polygonIdx < OutlineCount(); polygonIdx++ )
|
||||
{
|
||||
Outline( polygonIdx ).GenerateBBoxCache();
|
||||
COutline( polygonIdx ).GenerateBBoxCache();
|
||||
|
||||
for( int holeIdx = 0; holeIdx < HoleCount( polygonIdx ); holeIdx++ )
|
||||
Hole( polygonIdx, holeIdx ).GenerateBBoxCache();
|
||||
CHole( polygonIdx, holeIdx ).GenerateBBoxCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <drc/drc_rule_condition.h>
|
||||
#include <drc/drc_test_provider.h>
|
||||
#include <track.h>
|
||||
#include <footprint.h>
|
||||
#include <geometry/shape.h>
|
||||
#include <geometry/shape_segment.h>
|
||||
#include <geometry/shape_null.h>
|
||||
|
@ -867,7 +868,20 @@ DRC_CONSTRAINT DRC_ENGINE::EvalRules( DRC_CONSTRAINT_T aConstraintId, const BOAR
|
|||
return false;
|
||||
}
|
||||
|
||||
if( !( c->layerTest & a->GetLayerSet() ).any() )
|
||||
LSET itemLayers = a->GetLayerSet();
|
||||
|
||||
if( a->Type() == PCB_FOOTPRINT_T )
|
||||
{
|
||||
const FOOTPRINT* footprint = static_cast<const FOOTPRINT*>( a );
|
||||
|
||||
if( !footprint->GetPolyCourtyardFront().IsEmpty() )
|
||||
itemLayers |= LSET::FrontMask();
|
||||
|
||||
if( !footprint->GetPolyCourtyardBack().IsEmpty() )
|
||||
itemLayers |= LSET::BackMask();
|
||||
}
|
||||
|
||||
if( !( c->layerTest & itemLayers ).any() )
|
||||
{
|
||||
if( implicit )
|
||||
{
|
||||
|
|
|
@ -141,8 +141,8 @@ void DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances()
|
|||
break;
|
||||
|
||||
FOOTPRINT* footprint = *it1;
|
||||
SHAPE_POLY_SET& footprintFront = footprint->GetPolyCourtyardFront();
|
||||
SHAPE_POLY_SET& footprintBack = footprint->GetPolyCourtyardBack();
|
||||
const SHAPE_POLY_SET& footprintFront = footprint->GetPolyCourtyardFront();
|
||||
const SHAPE_POLY_SET& footprintBack = footprint->GetPolyCourtyardBack();
|
||||
|
||||
if( footprintFront.OutlineCount() == 0 && footprintBack.OutlineCount() == 0 )
|
||||
continue; // No courtyards defined
|
||||
|
@ -156,8 +156,8 @@ void DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances()
|
|||
for( auto it2 = it1 + 1; it2 != m_board->Footprints().end(); it2++ )
|
||||
{
|
||||
FOOTPRINT* test = *it2;
|
||||
SHAPE_POLY_SET& testFront = test->GetPolyCourtyardFront();
|
||||
SHAPE_POLY_SET& testBack = test->GetPolyCourtyardBack();
|
||||
const SHAPE_POLY_SET& testFront = test->GetPolyCourtyardFront();
|
||||
const SHAPE_POLY_SET& testBack = test->GetPolyCourtyardBack();
|
||||
DRC_CONSTRAINT constraint;
|
||||
int clearance;
|
||||
int actual;
|
||||
|
|
|
@ -184,7 +184,7 @@ int PLACEFILE_GERBER_WRITER::CreatePlaceFile( wxString& aFullFilename, PCB_LAYER
|
|||
{
|
||||
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CMP_COURTYARD );
|
||||
|
||||
SHAPE_POLY_SET& courtyard = onBack ? footprint->GetPolyCourtyardBack()
|
||||
const SHAPE_POLY_SET& courtyard = onBack ? footprint->GetPolyCourtyardBack()
|
||||
: footprint->GetPolyCourtyardFront();
|
||||
|
||||
for( int ii = 0; ii < courtyard.OutlineCount(); ii++ )
|
||||
|
|
|
@ -673,8 +673,8 @@ public:
|
|||
*
|
||||
* @return the courtyard polygon.
|
||||
*/
|
||||
SHAPE_POLY_SET& GetPolyCourtyardFront() { return m_poly_courtyard_front; }
|
||||
SHAPE_POLY_SET& GetPolyCourtyardBack() { return m_poly_courtyard_back; }
|
||||
const SHAPE_POLY_SET& GetPolyCourtyardFront() const { return m_poly_courtyard_front; }
|
||||
const SHAPE_POLY_SET& GetPolyCourtyardBack() const { return m_poly_courtyard_back; }
|
||||
|
||||
/**
|
||||
* Build complex polygons of the courtyard areas from graphic items on the courtyard layers.
|
||||
|
|
Loading…
Reference in New Issue