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;
|
return bbox;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateBBoxCache()
|
void GenerateBBoxCache() const
|
||||||
{
|
{
|
||||||
m_bbox.Compute( m_points );
|
m_bbox.Compute( m_points );
|
||||||
|
|
||||||
|
@ -787,7 +787,7 @@ private:
|
||||||
int m_width;
|
int m_width;
|
||||||
|
|
||||||
/// cached bounding box
|
/// 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
|
* @note These caches **must** be built before a group of calls to Contains(). They are
|
||||||
* **not** kept up-to-date by editing actions.
|
* **not** kept up-to-date by editing actions.
|
||||||
*/
|
*/
|
||||||
void BuildBBoxCaches();
|
void BuildBBoxCaches() const;
|
||||||
|
|
||||||
const BOX2I BBoxFromCaches() 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++ )
|
for( int polygonIdx = 0; polygonIdx < OutlineCount(); polygonIdx++ )
|
||||||
{
|
{
|
||||||
Outline( polygonIdx ).GenerateBBoxCache();
|
COutline( polygonIdx ).GenerateBBoxCache();
|
||||||
|
|
||||||
for( int holeIdx = 0; holeIdx < HoleCount( polygonIdx ); holeIdx++ )
|
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_rule_condition.h>
|
||||||
#include <drc/drc_test_provider.h>
|
#include <drc/drc_test_provider.h>
|
||||||
#include <track.h>
|
#include <track.h>
|
||||||
|
#include <footprint.h>
|
||||||
#include <geometry/shape.h>
|
#include <geometry/shape.h>
|
||||||
#include <geometry/shape_segment.h>
|
#include <geometry/shape_segment.h>
|
||||||
#include <geometry/shape_null.h>
|
#include <geometry/shape_null.h>
|
||||||
|
@ -867,7 +868,20 @@ DRC_CONSTRAINT DRC_ENGINE::EvalRules( DRC_CONSTRAINT_T aConstraintId, const BOAR
|
||||||
return false;
|
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 )
|
if( implicit )
|
||||||
{
|
{
|
||||||
|
|
|
@ -140,9 +140,9 @@ void DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances()
|
||||||
if( m_drcEngine->IsErrorLimitExceeded( DRCE_OVERLAPPING_FOOTPRINTS) )
|
if( m_drcEngine->IsErrorLimitExceeded( DRCE_OVERLAPPING_FOOTPRINTS) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
FOOTPRINT* footprint = *it1;
|
FOOTPRINT* footprint = *it1;
|
||||||
SHAPE_POLY_SET& footprintFront = footprint->GetPolyCourtyardFront();
|
const SHAPE_POLY_SET& footprintFront = footprint->GetPolyCourtyardFront();
|
||||||
SHAPE_POLY_SET& footprintBack = footprint->GetPolyCourtyardBack();
|
const SHAPE_POLY_SET& footprintBack = footprint->GetPolyCourtyardBack();
|
||||||
|
|
||||||
if( footprintFront.OutlineCount() == 0 && footprintBack.OutlineCount() == 0 )
|
if( footprintFront.OutlineCount() == 0 && footprintBack.OutlineCount() == 0 )
|
||||||
continue; // No courtyards defined
|
continue; // No courtyards defined
|
||||||
|
@ -155,13 +155,13 @@ void DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances()
|
||||||
|
|
||||||
for( auto it2 = it1 + 1; it2 != m_board->Footprints().end(); it2++ )
|
for( auto it2 = it1 + 1; it2 != m_board->Footprints().end(); it2++ )
|
||||||
{
|
{
|
||||||
FOOTPRINT* test = *it2;
|
FOOTPRINT* test = *it2;
|
||||||
SHAPE_POLY_SET& testFront = test->GetPolyCourtyardFront();
|
const SHAPE_POLY_SET& testFront = test->GetPolyCourtyardFront();
|
||||||
SHAPE_POLY_SET& testBack = test->GetPolyCourtyardBack();
|
const SHAPE_POLY_SET& testBack = test->GetPolyCourtyardBack();
|
||||||
DRC_CONSTRAINT constraint;
|
DRC_CONSTRAINT constraint;
|
||||||
int clearance;
|
int clearance;
|
||||||
int actual;
|
int actual;
|
||||||
VECTOR2I pos;
|
VECTOR2I pos;
|
||||||
|
|
||||||
if( footprintFront.OutlineCount() > 0 && testFront.OutlineCount() > 0
|
if( footprintFront.OutlineCount() > 0 && testFront.OutlineCount() > 0
|
||||||
&& frontBBox.Intersects( testFront.BBoxFromCaches() ) )
|
&& frontBBox.Intersects( testFront.BBoxFromCaches() ) )
|
||||||
|
|
|
@ -184,8 +184,8 @@ int PLACEFILE_GERBER_WRITER::CreatePlaceFile( wxString& aFullFilename, PCB_LAYER
|
||||||
{
|
{
|
||||||
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CMP_COURTYARD );
|
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();
|
: footprint->GetPolyCourtyardFront();
|
||||||
|
|
||||||
for( int ii = 0; ii < courtyard.OutlineCount(); ii++ )
|
for( int ii = 0; ii < courtyard.OutlineCount(); ii++ )
|
||||||
{
|
{
|
||||||
|
|
|
@ -673,8 +673,8 @@ public:
|
||||||
*
|
*
|
||||||
* @return the courtyard polygon.
|
* @return the courtyard polygon.
|
||||||
*/
|
*/
|
||||||
SHAPE_POLY_SET& GetPolyCourtyardFront() { return m_poly_courtyard_front; }
|
const SHAPE_POLY_SET& GetPolyCourtyardFront() const { return m_poly_courtyard_front; }
|
||||||
SHAPE_POLY_SET& GetPolyCourtyardBack() { return m_poly_courtyard_back; }
|
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.
|
* Build complex polygons of the courtyard areas from graphic items on the courtyard layers.
|
||||||
|
|
Loading…
Reference in New Issue