KiCad PCB EDA Suite
DRC_TEST_PROVIDER_COURTYARD_CLEARANCE Class Reference
Inheritance diagram for DRC_TEST_PROVIDER_COURTYARD_CLEARANCE:
DRC_TEST_PROVIDER_CLEARANCE_BASE DRC_TEST_PROVIDER

Public Member Functions

 DRC_TEST_PROVIDER_COURTYARD_CLEARANCE ()
 
virtual ~DRC_TEST_PROVIDER_COURTYARD_CLEARANCE ()
 
virtual bool Run () override
 Runs this provider against the given PCB with configured options (if any). More...
 
virtual const wxString GetName () const override
 
virtual const wxString GetDescription () const override
 
virtual std::set< DRC_CONSTRAINT_TGetConstraintTypes () const override
 
int GetNumPhases () const override
 
void SetDRCEngine (DRC_ENGINE *engine)
 
virtual bool IsRuleDriven () const
 
bool IsEnabled () const
 
void Enable (bool aEnable)
 

Protected Member Functions

int forEachGeometryItem (const std::vector< KICAD_T > &aTypes, LSET aLayers, const std::function< bool(BOARD_ITEM *)> &aFunc)
 
virtual void reportAux (wxString fmt,...)
 
virtual void reportViolation (std::shared_ptr< DRC_ITEM > &item, wxPoint aMarkerPos)
 
virtual bool reportProgress (int aCount, int aSize, int aDelta)
 
virtual bool reportPhase (const wxString &aStageName)
 
virtual void reportRuleStatistics ()
 
virtual void accountCheck (const DRC_RULE *ruleToTest)
 
virtual void accountCheck (const DRC_CONSTRAINT &constraintToTest)
 
bool isInvisibleText (const BOARD_ITEM *aItem) const
 
EDA_UNITS userUnits () const
 

Protected Attributes

BOARDm_board
 
int m_largestClearance
 
bool m_boardOutlineValid
 
DRC_ENGINEm_drcEngine
 
std::unordered_map< const DRC_RULE *, int > m_stats
 
bool m_isRuleDriven = true
 
bool m_enabled = true
 
wxString m_msg
 

Static Protected Attributes

static std::vector< KICAD_Ts_allBasicItems
 
static std::vector< KICAD_Ts_allBasicItemsButZones
 

Private Member Functions

bool testFootprintCourtyardDefinitions ()
 
bool testCourtyardClearances ()
 

Detailed Description

Definition at line 40 of file drc_test_provider_courtyard_clearance.cpp.

Constructor & Destructor Documentation

◆ DRC_TEST_PROVIDER_COURTYARD_CLEARANCE()

DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::DRC_TEST_PROVIDER_COURTYARD_CLEARANCE ( )
inline

Definition at line 43 of file drc_test_provider_courtyard_clearance.cpp.

44  {
45  m_isRuleDriven = false;
46  }

References DRC_TEST_PROVIDER::m_isRuleDriven.

◆ ~DRC_TEST_PROVIDER_COURTYARD_CLEARANCE()

virtual DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::~DRC_TEST_PROVIDER_COURTYARD_CLEARANCE ( )
inlinevirtual

Definition at line 48 of file drc_test_provider_courtyard_clearance.cpp.

49  {
50  }

Member Function Documentation

◆ accountCheck() [1/2]

void DRC_TEST_PROVIDER::accountCheck ( const DRC_RULE ruleToTest)
protectedvirtualinherited

Definition at line 102 of file drc_test_provider.cpp.

103 {
104  auto it = m_stats.find( ruleToTest );
105 
106  if( it == m_stats.end() )
107  m_stats[ ruleToTest ] = 1;
108  else
109  m_stats[ ruleToTest ] += 1;
110 }
std::unordered_map< const DRC_RULE *, int > m_stats

References DRC_TEST_PROVIDER::m_stats.

Referenced by DRC_TEST_PROVIDER::accountCheck(), and DRC_TEST_PROVIDER::reportViolation().

◆ accountCheck() [2/2]

void DRC_TEST_PROVIDER::accountCheck ( const DRC_CONSTRAINT constraintToTest)
protectedvirtualinherited

Definition at line 113 of file drc_test_provider.cpp.

114 {
115  accountCheck( constraintToTest.GetParentRule() );
116 }
DRC_RULE * GetParentRule() const
Definition: drc_rule.h:125
virtual void accountCheck(const DRC_RULE *ruleToTest)

References DRC_TEST_PROVIDER::accountCheck(), and DRC_CONSTRAINT::GetParentRule().

◆ Enable()

void DRC_TEST_PROVIDER::Enable ( bool  aEnable)
inlineinherited

Definition at line 106 of file drc_test_provider.h.

107  {
108  m_enabled = aEnable;
109  }

References DRC_TEST_PROVIDER::m_enabled.

◆ forEachGeometryItem()

int DRC_TEST_PROVIDER::forEachGeometryItem ( const std::vector< KICAD_T > &  aTypes,
LSET  aLayers,
const std::function< bool(BOARD_ITEM *)> &  aFunc 
)
protectedinherited

Definition at line 138 of file drc_test_provider.cpp.

140 {
141  BOARD *brd = m_drcEngine->GetBoard();
142  std::bitset<MAX_STRUCT_TYPE_ID> typeMask;
143  int n = 0;
144 
145  if( s_allBasicItems.size() == 0 )
146  {
147  for( int i = 0; i < MAX_STRUCT_TYPE_ID; i++ )
148  {
149  if( i != PCB_FOOTPRINT_T && i != PCB_GROUP_T )
150  {
151  s_allBasicItems.push_back( (KICAD_T) i );
152 
153  if( i != PCB_ZONE_T && i != PCB_FP_ZONE_T )
154  s_allBasicItemsButZones.push_back( (KICAD_T) i );
155  }
156  }
157  }
158 
159  if( aTypes.size() == 0 )
160  {
161  for( int i = 0; i < MAX_STRUCT_TYPE_ID; i++ )
162  typeMask[ i ] = true;
163  }
164  else
165  {
166  for( KICAD_T aType : aTypes )
167  typeMask[ aType ] = true;
168  }
169 
170  for( TRACK* item : brd->Tracks() )
171  {
172  if( (item->GetLayerSet() & aLayers).any() )
173  {
174  if( typeMask[ PCB_TRACE_T ] && item->Type() == PCB_TRACE_T )
175  {
176  aFunc( item );
177  n++;
178  }
179  else if( typeMask[ PCB_VIA_T ] && item->Type() == PCB_VIA_T )
180  {
181  aFunc( item );
182  n++;
183  }
184  else if( typeMask[ PCB_ARC_T ] && item->Type() == PCB_ARC_T )
185  {
186  aFunc( item );
187  n++;
188  }
189  }
190  }
191 
192  for( BOARD_ITEM* item : brd->Drawings() )
193  {
194  if( (item->GetLayerSet() & aLayers).any() )
195  {
196  if( typeMask[PCB_DIMENSION_T] && BaseType( item->Type() ) == PCB_DIMENSION_T )
197  {
198  if( !aFunc( item ) )
199  return n;
200 
201  n++;
202  }
203  else if( typeMask[ PCB_SHAPE_T ] && item->Type() == PCB_SHAPE_T )
204  {
205  if( !aFunc( item ) )
206  return n;
207 
208  n++;
209  }
210  else if( typeMask[ PCB_TEXT_T ] && item->Type() == PCB_TEXT_T )
211  {
212  if( !aFunc( item ) )
213  return n;
214 
215  n++;
216  }
217  else if( typeMask[ PCB_TARGET_T ] && item->Type() == PCB_TARGET_T )
218  {
219  if( !aFunc( item ) )
220  return n;
221 
222  n++;
223  }
224  }
225  }
226 
227  if( typeMask[ PCB_ZONE_T ] )
228  {
229  for( ZONE* item : brd->Zones() )
230  {
231  if( ( item->GetLayerSet() & aLayers ).any() )
232  {
233  if( !aFunc( item ) )
234  return n;
235 
236  n++;
237  }
238  }
239  }
240 
241  for( FOOTPRINT* footprint : brd->Footprints() )
242  {
243  if( typeMask[ PCB_FP_TEXT_T ] )
244  {
245  if( ( footprint->Reference().GetLayerSet() & aLayers ).any() )
246  {
247  if( !aFunc( &footprint->Reference() ) )
248  return n;
249 
250  n++;
251  }
252 
253  if( ( footprint->Value().GetLayerSet() & aLayers ).any() )
254  {
255  if( !aFunc( &footprint->Value() ) )
256  return n;
257 
258  n++;
259  }
260  }
261 
262  if( typeMask[ PCB_PAD_T ] )
263  {
264  for( PAD* pad : footprint->Pads() )
265  {
266  // Careful: if a pad has a hole then it pierces all layers
267  if( ( pad->GetDrillSizeX() > 0 && pad->GetDrillSizeY() > 0 )
268  || ( pad->GetLayerSet() & aLayers ).any() )
269  {
270  if( !aFunc( pad ) )
271  return n;
272 
273  n++;
274  }
275  }
276  }
277 
278  for( BOARD_ITEM* dwg : footprint->GraphicalItems() )
279  {
280  if( (dwg->GetLayerSet() & aLayers).any() )
281  {
282  if( typeMask[ PCB_FP_TEXT_T ] && dwg->Type() == PCB_FP_TEXT_T )
283  {
284  if( !aFunc( dwg ) )
285  return n;
286 
287  n++;
288  }
289  else if( typeMask[ PCB_FP_SHAPE_T ] && dwg->Type() == PCB_FP_SHAPE_T )
290  {
291  if( !aFunc( dwg ) )
292  return n;
293 
294  n++;
295  }
296  }
297  }
298 
299  if( typeMask[ PCB_FP_ZONE_T ] )
300  {
301  for( ZONE* zone : footprint->Zones() )
302  {
303  if( (zone->GetLayerSet() & aLayers).any() )
304  {
305  if( !aFunc( zone ) )
306  return n;
307 
308  n++;
309  }
310  }
311  }
312 
313  if( typeMask[ PCB_FOOTPRINT_T ] )
314  {
315  if( !aFunc( footprint ) )
316  return n;
317 
318  n++;
319  }
320  }
321 
322  return n;
323 }
class FP_TEXT, text in a footprint
Definition: typeinfo.h:92
ZONES & Zones()
Definition: board.h:311
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:108
constexpr KICAD_T BaseType(const KICAD_T aType)
Returns the underlying type of the given type.
Definition: typeinfo.h:235
class PCB_TEXT, text on a layer
Definition: typeinfo.h:91
class ARC, an arc track segment on a copper layer
Definition: typeinfo.h:97
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class PAD, a pad in a footprint
Definition: typeinfo.h:89
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
BOARD * GetBoard() const
Definition: drc_engine.h:87
FOOTPRINTS & Footprints()
Definition: board.h:305
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
class ZONE, a copper pour area
Definition: typeinfo.h:105
class DIMENSION_BASE: abstract dimension meta-type
Definition: typeinfo.h:99
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:104
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
static std::vector< KICAD_T > s_allBasicItems
static std::vector< KICAD_T > s_allBasicItemsButZones
DRC_ENGINE * m_drcEngine
class ZONE, managed by a footprint
Definition: typeinfo.h:94
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
Definition: pad.h:60
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
DRAWINGS & Drawings()
Definition: board.h:308
TRACKS & Tracks()
Definition: board.h:302
Definition: track.h:83

References BaseType(), BOARD::Drawings(), BOARD::Footprints(), DRC_ENGINE::GetBoard(), DRC_TEST_PROVIDER::m_drcEngine, MAX_STRUCT_TYPE_ID, pad, PCB_ARC_T, PCB_DIMENSION_T, PCB_FOOTPRINT_T, PCB_FP_SHAPE_T, PCB_FP_TEXT_T, PCB_FP_ZONE_T, PCB_GROUP_T, PCB_PAD_T, PCB_SHAPE_T, PCB_TARGET_T, PCB_TEXT_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_T, DRC_TEST_PROVIDER::s_allBasicItems, DRC_TEST_PROVIDER::s_allBasicItemsButZones, BOARD::Tracks(), and BOARD::Zones().

Referenced by DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal(), DRC_TEST_PROVIDER_MISC::testDisabledLayers(), and DRC_TEST_PROVIDER_MISC::testTextVars().

◆ GetConstraintTypes()

std::set< DRC_CONSTRAINT_T > DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::GetConstraintTypes ( ) const
overridevirtual

◆ GetDescription()

virtual const wxString DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::GetDescription ( ) const
inlineoverridevirtual

Reimplemented from DRC_TEST_PROVIDER.

Definition at line 59 of file drc_test_provider_courtyard_clearance.cpp.

60  {
61  return "Tests footprints' courtyard clearance";
62  }

◆ GetName()

virtual const wxString DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::GetName ( void  ) const
inlineoverridevirtual

Reimplemented from DRC_TEST_PROVIDER.

Definition at line 54 of file drc_test_provider_courtyard_clearance.cpp.

55  {
56  return "courtyard_clearance";
57  }

◆ GetNumPhases()

int DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::GetNumPhases ( ) const
overridevirtual

Implements DRC_TEST_PROVIDER.

Definition at line 265 of file drc_test_provider_courtyard_clearance.cpp.

266 {
267  return 2;
268 }

◆ IsEnabled()

bool DRC_TEST_PROVIDER::IsEnabled ( ) const
inlineinherited

Definition at line 101 of file drc_test_provider.h.

102  {
103  return m_enabled;
104  }

References DRC_TEST_PROVIDER::m_enabled.

◆ isInvisibleText()

bool DRC_TEST_PROVIDER::isInvisibleText ( const BOARD_ITEM aItem) const
protectedinherited

Definition at line 326 of file drc_test_provider.cpp.

327 {
328 
329  if( const FP_TEXT* text = dyn_cast<const FP_TEXT*>( aItem ) )
330  {
331  if( !text->IsVisible() )
332  return true;
333  }
334 
335  if( const PCB_TEXT* text = dyn_cast<const PCB_TEXT*>( aItem ) )
336  {
337  if( !text->IsVisible() )
338  return true;
339  }
340 
341  return false;
342 }

References text.

Referenced by DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ IsRuleDriven()

virtual bool DRC_TEST_PROVIDER::IsRuleDriven ( ) const
inlinevirtualinherited

Definition at line 96 of file drc_test_provider.h.

97  {
98  return m_isRuleDriven;
99  }

References DRC_TEST_PROVIDER::m_isRuleDriven.

◆ reportAux()

◆ reportPhase()

◆ reportProgress()

◆ reportRuleStatistics()

void DRC_TEST_PROVIDER::reportRuleStatistics ( )
protectedvirtualinherited

Definition at line 119 of file drc_test_provider.cpp.

120 {
121  if( !m_isRuleDriven )
122  return;
123 
124  m_drcEngine->ReportAux( "Rule hit statistics: " );
125 
126  for( const std::pair<const DRC_RULE* const, int>& stat : m_stats )
127  {
128  if( stat.first )
129  {
130  m_drcEngine->ReportAux( wxString::Format( " - rule '%s': %d hits ",
131  stat.first->m_Name,
132  stat.second ) );
133  }
134  }
135 }
std::unordered_map< const DRC_RULE *, int > m_stats
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
void ReportAux(const wxString &aStr)
DRC_ENGINE * m_drcEngine

References Format(), DRC_TEST_PROVIDER::m_drcEngine, DRC_TEST_PROVIDER::m_isRuleDriven, DRC_TEST_PROVIDER::m_stats, and DRC_ENGINE::ReportAux().

Referenced by DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_HOLE_SIZE::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_LVS::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), and DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal().

◆ reportViolation()

void DRC_TEST_PROVIDER::reportViolation ( std::shared_ptr< DRC_ITEM > &  item,
wxPoint  aMarkerPos 
)
protectedvirtualinherited

Definition at line 56 of file drc_test_provider.cpp.

57 {
58  if( item->GetViolatingRule() )
59  accountCheck( item->GetViolatingRule() );
60 
61  item->SetViolatingTest( this );
62  m_drcEngine->ReportViolation( item, aMarkerPos );
63 }
virtual void accountCheck(const DRC_RULE *ruleToTest)
DRC_ENGINE * m_drcEngine
void ReportViolation(const std::shared_ptr< DRC_ITEM > &aItem, wxPoint aPos)

References DRC_TEST_PROVIDER::accountCheck(), DRC_TEST_PROVIDER::m_drcEngine, and DRC_ENGINE::ReportViolation().

Referenced by DRC_TEST_PROVIDER_MATCHED_LENGTH::checkLengthViolations(), DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkSkewViolations(), DRC_TEST_PROVIDER_HOLE_SIZE::checkVia(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkViaCountViolations(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), testCourtyardClearances(), DRC_TEST_PROVIDER_MISC::testDisabledLayers(), testFootprintCourtyardDefinitions(), DRC_TEST_PROVIDER_LVS::testFootprints(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_MISC::testOutline(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_MISC::testTextVars(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), and DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZones().

◆ Run()

bool DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::Run ( )
overridevirtual

Runs this provider against the given PCB with configured options (if any).

Implements DRC_TEST_PROVIDER.

Definition at line 245 of file drc_test_provider_courtyard_clearance.cpp.

246 {
248  DRC_CONSTRAINT constraint;
249 
251  m_largestClearance = constraint.GetValue().Min();
252 
253  reportAux( "Worst courtyard clearance : %d nm", m_largestClearance );
254 
256  return false;
257 
258  if( !testCourtyardClearances() )
259  return false;
260 
261  return true;
262 }
T Min() const
Definition: minoptmax.h:33
bool QueryWorstConstraint(DRC_CONSTRAINT_T aRuleId, DRC_CONSTRAINT &aConstraint)
BOARD * GetBoard() const
Definition: drc_engine.h:87
const MINOPTMAX< int > & GetValue() const
Definition: drc_rule.h:121
DRC_ENGINE * m_drcEngine
virtual void reportAux(wxString fmt,...)

References COURTYARD_CLEARANCE_CONSTRAINT, DRC_ENGINE::GetBoard(), DRC_CONSTRAINT::GetValue(), DRC_TEST_PROVIDER_CLEARANCE_BASE::m_board, DRC_TEST_PROVIDER::m_drcEngine, DRC_TEST_PROVIDER_CLEARANCE_BASE::m_largestClearance, MINOPTMAX< T >::Min(), DRC_ENGINE::QueryWorstConstraint(), DRC_TEST_PROVIDER::reportAux(), testCourtyardClearances(), and testFootprintCourtyardDefinitions().

◆ SetDRCEngine()

void DRC_TEST_PROVIDER::SetDRCEngine ( DRC_ENGINE engine)
inlineinherited

Definition at line 78 of file drc_test_provider.h.

79  {
80  m_drcEngine = engine;
81  m_stats.clear();
82  }
std::unordered_map< const DRC_RULE *, int > m_stats
DRC_ENGINE * m_drcEngine

References DRC_TEST_PROVIDER::m_drcEngine, and DRC_TEST_PROVIDER::m_stats.

◆ testCourtyardClearances()

bool DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances ( )
private

Definition at line 142 of file drc_test_provider_courtyard_clearance.cpp.

143 {
144  const int delta = 100; // This is the number of tests between 2 calls to the progress bar
145 
147  return true; // continue with other tests
148 
149  if( !reportPhase( _( "Checking footprints for overlapping courtyards..." ) ) )
150  return false; // DRC cancelled
151 
152  int ii = 0;
153 
154  for( auto it1 = m_board->Footprints().begin(); it1 != m_board->Footprints().end(); it1++ )
155  {
156  if( !reportProgress( ii++, m_board->Footprints().size(), delta ) )
157  return false; // DRC cancelled
158 
160  break;
161 
162  FOOTPRINT* footprint = *it1;
163  const SHAPE_POLY_SET& footprintFront = footprint->GetPolyCourtyardFront();
164  const SHAPE_POLY_SET& footprintBack = footprint->GetPolyCourtyardBack();
165 
166  if( footprintFront.OutlineCount() == 0 && footprintBack.OutlineCount() == 0 )
167  continue; // No courtyards defined
168 
169  BOX2I frontBBox = footprintFront.BBoxFromCaches();
170  BOX2I backBBox = footprintBack.BBoxFromCaches();
171 
172  frontBBox.Inflate( m_largestClearance );
173  backBBox.Inflate( m_largestClearance );
174 
175  for( auto it2 = it1 + 1; it2 != m_board->Footprints().end(); it2++ )
176  {
177  FOOTPRINT* test = *it2;
178  const SHAPE_POLY_SET& testFront = test->GetPolyCourtyardFront();
179  const SHAPE_POLY_SET& testBack = test->GetPolyCourtyardBack();
180  DRC_CONSTRAINT constraint;
181  int clearance;
182  int actual;
183  VECTOR2I pos;
184 
185  if( footprintFront.OutlineCount() > 0 && testFront.OutlineCount() > 0
186  && frontBBox.Intersects( testFront.BBoxFromCaches() ) )
187  {
188  constraint = m_drcEngine->EvalRules( COURTYARD_CLEARANCE_CONSTRAINT, footprint,
189  test, F_Cu );
190  clearance = constraint.GetValue().Min();
191 
192  if( clearance >= 0 && footprintFront.Collide( &testFront, clearance, &actual, &pos ) )
193  {
194  std::shared_ptr<DRC_ITEM> drce = DRC_ITEM::Create( DRCE_OVERLAPPING_FOOTPRINTS );
195 
196  if( clearance > 0 )
197  {
198  m_msg.Printf( _( "(%s clearance %s; actual %s)" ),
199  constraint.GetName(),
200  MessageTextFromValue( userUnits(), clearance ),
201  MessageTextFromValue( userUnits(), actual ) );
202 
203  drce->SetErrorMessage( drce->GetErrorText() + wxS( " " ) + m_msg );
204  drce->SetViolatingRule( constraint.GetParentRule() );
205  }
206 
207  drce->SetItems( footprint, test );
208  reportViolation( drce, (wxPoint) pos );
209  }
210  }
211 
212  if( footprintBack.OutlineCount() > 0 && testBack.OutlineCount() > 0
213  && backBBox.Intersects( testBack.BBoxFromCaches() ) )
214  {
215  constraint = m_drcEngine->EvalRules( COURTYARD_CLEARANCE_CONSTRAINT, footprint,
216  test, B_Cu );
217  clearance = constraint.GetValue().Min();
218 
219  if( clearance >= 0 && footprintBack.Collide( &testBack, clearance, &actual, &pos ) )
220  {
221  std::shared_ptr<DRC_ITEM> drce = DRC_ITEM::Create( DRCE_OVERLAPPING_FOOTPRINTS );
222 
223  if( clearance > 0 )
224  {
225  m_msg.Printf( _( "(%s clearance %s; actual %s)" ),
226  constraint.GetName(),
227  MessageTextFromValue( userUnits(), clearance ),
228  MessageTextFromValue( userUnits(), actual ) );
229 
230  drce->SetErrorMessage( drce->GetErrorText() + wxS( " " ) + m_msg );
231  drce->SetViolatingRule( constraint.GetParentRule() );
232  }
233 
234  drce->SetItems( footprint, test );
235  reportViolation( drce, (wxPoint) pos );
236  }
237  }
238  }
239  }
240 
241  return true;
242 }
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Convert a value to a string using double notation.
Definition: base_units.cpp:125
const SHAPE_POLY_SET & GetPolyCourtyardFront() const
Used in DRC to test the courtyard area (a complex polygon).
Definition: footprint.h:657
int OutlineCount() const
Return the number of vertices in a given outline/hole.
static std::shared_ptr< DRC_ITEM > Create(int aErrorCode)
Constructs a DRC_ITEM for the given error code.
Definition: drc_item.cpp:245
const BOX2I BBoxFromCaches() const
bool IsErrorLimitExceeded(int error_code)
virtual bool reportProgress(int aCount, int aSize, int aDelta)
T Min() const
Definition: minoptmax.h:33
wxString GetName() const
Definition: drc_rule.h:127
bool Intersects(const BOX2< Vec > &aRect) const
Function Intersects.
Definition: box2.h:236
DRC_RULE * GetParentRule() const
Definition: drc_rule.h:125
virtual bool reportPhase(const wxString &aStageName)
Represent a set of closed polygons.
FOOTPRINTS & Footprints()
Definition: board.h:305
const SHAPE_POLY_SET & GetPolyCourtyardBack() const
Definition: footprint.h:658
EDA_UNITS userUnits() const
DRC_CONSTRAINT EvalRules(DRC_CONSTRAINT_T aConstraintId, const BOARD_ITEM *a, const BOARD_ITEM *b, PCB_LAYER_ID aLayer, REPORTER *aReporter=nullptr)
Definition: drc_engine.cpp:758
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
virtual void reportViolation(std::shared_ptr< DRC_ITEM > &item, wxPoint aMarkerPos)
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:302
const MINOPTMAX< int > & GetValue() const
Definition: drc_rule.h:121
#define _(s)
Definition: 3d_actions.cpp:33
DRC_ENGINE * m_drcEngine

References _, B_Cu, SHAPE_POLY_SET::BBoxFromCaches(), SHAPE_POLY_SET::Collide(), COURTYARD_CLEARANCE_CONSTRAINT, DRC_ITEM::Create(), DRCE_OVERLAPPING_FOOTPRINTS, DRC_ENGINE::EvalRules(), F_Cu, BOARD::Footprints(), DRC_CONSTRAINT::GetName(), DRC_CONSTRAINT::GetParentRule(), FOOTPRINT::GetPolyCourtyardBack(), FOOTPRINT::GetPolyCourtyardFront(), DRC_CONSTRAINT::GetValue(), BOX2< Vec >::Inflate(), BOX2< Vec >::Intersects(), DRC_ENGINE::IsErrorLimitExceeded(), DRC_TEST_PROVIDER_CLEARANCE_BASE::m_board, DRC_TEST_PROVIDER::m_drcEngine, DRC_TEST_PROVIDER_CLEARANCE_BASE::m_largestClearance, DRC_TEST_PROVIDER::m_msg, MessageTextFromValue(), MINOPTMAX< T >::Min(), SHAPE_POLY_SET::OutlineCount(), DRC_TEST_PROVIDER::reportPhase(), DRC_TEST_PROVIDER::reportProgress(), DRC_TEST_PROVIDER::reportViolation(), and DRC_TEST_PROVIDER::userUnits().

Referenced by Run().

◆ testFootprintCourtyardDefinitions()

bool DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testFootprintCourtyardDefinitions ( )
private

Definition at line 75 of file drc_test_provider_courtyard_clearance.cpp.

76 {
77  const int delta = 100; // This is the number of tests between 2 calls to the progress bar
78 
79  // Detects missing (or malformed) footprint courtyards
82  {
83  if( !reportPhase( _( "Checking footprint courtyard definitions..." ) ) )
84  return false; // DRC cancelled
85  }
87  {
88  if( !reportPhase( _( "Gathering footprint courtyards..." ) ) )
89  return false; // DRC cancelled
90  }
91  else
92  {
93  reportAux( "All courtyard violations ignored. Tests not run." );
94  return true; // continue with other tests
95  }
96 
97  int ii = 0;
98 
99  for( FOOTPRINT* footprint : m_board->Footprints() )
100  {
101  if( !reportProgress( ii++, m_board->Footprints().size(), delta ) )
102  return false; // DRC cancelled
103 
104  if( ( footprint->GetFlags() & MALFORMED_COURTYARDS ) != 0 )
105  {
107  continue;
108 
109  OUTLINE_ERROR_HANDLER errorHandler =
110  [&]( const wxString& msg, BOARD_ITEM* , BOARD_ITEM* , const wxPoint& pt )
111  {
112  std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_MALFORMED_COURTYARD );
113  drcItem->SetErrorMessage( drcItem->GetErrorText() + wxS( " " ) + msg );
114  drcItem->SetItems( footprint );
115  reportViolation( drcItem, pt );
116  };
117 
118  // Re-run courtyard tests to generate DRC_ITEMs
119  footprint->BuildPolyCourtyards( &errorHandler );
120  }
121  else if( footprint->GetPolyCourtyardFront().OutlineCount() == 0
122  && footprint->GetPolyCourtyardBack().OutlineCount() == 0 )
123  {
125  continue;
126 
127  std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_MISSING_COURTYARD );
128  drcItem->SetItems( footprint );
129  reportViolation( drcItem, footprint->GetPosition() );
130  }
131  else
132  {
133  footprint->GetPolyCourtyardFront().BuildBBoxCaches();
134  footprint->GetPolyCourtyardBack().BuildBBoxCaches();
135  }
136  }
137 
138  return true;
139 }
static std::shared_ptr< DRC_ITEM > Create(int aErrorCode)
Constructs a DRC_ITEM for the given error code.
Definition: drc_item.cpp:245
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
bool IsErrorLimitExceeded(int error_code)
virtual bool reportProgress(int aCount, int aSize, int aDelta)
virtual bool reportPhase(const wxString &aStageName)
FOOTPRINTS & Footprints()
Definition: board.h:305
#define MALFORMED_COURTYARDS
Definition: eda_item.h:126
virtual void reportViolation(std::shared_ptr< DRC_ITEM > &item, wxPoint aMarkerPos)
#define _(s)
Definition: 3d_actions.cpp:33
DRC_ENGINE * m_drcEngine
const std::function< void(const wxString &msg, BOARD_ITEM *itemA, BOARD_ITEM *itemB, const wxPoint &pt)> OUTLINE_ERROR_HANDLER
virtual void reportAux(wxString fmt,...)

References _, DRC_ITEM::Create(), DRCE_MALFORMED_COURTYARD, DRCE_MISSING_COURTYARD, DRCE_OVERLAPPING_FOOTPRINTS, BOARD::Footprints(), DRC_ENGINE::IsErrorLimitExceeded(), DRC_TEST_PROVIDER_CLEARANCE_BASE::m_board, DRC_TEST_PROVIDER::m_drcEngine, MALFORMED_COURTYARDS, DRC_TEST_PROVIDER::reportAux(), DRC_TEST_PROVIDER::reportPhase(), DRC_TEST_PROVIDER::reportProgress(), and DRC_TEST_PROVIDER::reportViolation().

Referenced by Run().

◆ userUnits()

Member Data Documentation

◆ m_board

◆ m_boardOutlineValid

bool DRC_TEST_PROVIDER_CLEARANCE_BASE::m_boardOutlineValid
protectedinherited

Definition at line 53 of file drc_test_provider_clearance_base.h.

◆ m_drcEngine

DRC_ENGINE* DRC_TEST_PROVIDER::m_drcEngine
protectedinherited

Definition at line 131 of file drc_test_provider.h.

Referenced by DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_HOLE_SIZE::checkVia(), DRC_TEST_PROVIDER::forEachGeometryItem(), DRC_TEST_PROVIDER_LVS::GetNumPhases(), DRC_TEST_PROVIDER::reportAux(), DRC_TEST_PROVIDER::reportPhase(), DRC_TEST_PROVIDER::reportProgress(), DRC_TEST_PROVIDER::reportRuleStatistics(), DRC_TEST_PROVIDER::reportViolation(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_HOLE_SIZE::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_MISC::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_LVS::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal(), DRC_TEST_PROVIDER::SetDRCEngine(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), testCourtyardClearances(), testFootprintCourtyardDefinitions(), DRC_TEST_PROVIDER_LVS::testFootprints(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_MISC::testTextVars(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZones(), and DRC_TEST_PROVIDER::userUnits().

◆ m_enabled

bool DRC_TEST_PROVIDER::m_enabled = true
protectedinherited

Definition at line 134 of file drc_test_provider.h.

Referenced by DRC_TEST_PROVIDER::Enable(), and DRC_TEST_PROVIDER::IsEnabled().

◆ m_isRuleDriven

◆ m_largestClearance

◆ m_msg

◆ m_stats

std::unordered_map<const DRC_RULE*, int> DRC_TEST_PROVIDER::m_stats
protectedinherited

◆ s_allBasicItems

std::vector< KICAD_T > DRC_TEST_PROVIDER::s_allBasicItems
staticprotectedinherited

◆ s_allBasicItemsButZones

std::vector< KICAD_T > DRC_TEST_PROVIDER::s_allBasicItemsButZones
staticprotectedinherited

The documentation for this class was generated from the following file: