KiCad PCB EDA Suite
Loading...
Searching...
No Matches
drc_test_provider_misc.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
26#include <drc/drc_engine.h>
27#include <drc/drc_item.h>
28#include <drc/drc_rule.h>
31#include <collectors.h>
32#include <pcb_shape.h>
33#include <pad.h>
34#include <pcb_track.h>
35
38
39#include <limits>
42
43/*
44 Miscellaneous tests:
45
46 - DRCE_DISABLED_LAYER_ITEM, ///< item on a disabled layer
47 - DRCE_INVALID_OUTLINE, ///< invalid board outline
48 - DRCE_UNRESOLVED_VARIABLE,
49 - DRCE_ASSERTION_FAILURE, ///< user-defined assertions
50 - DRCE_GENERIC_WARNING ///< user-defined warnings
51 - DRCE_GENERIC_ERROR ///< user-defined errors
52 - DRCE_MISSING_TUNING_PROFILES ///< tuning profile for netc lass not defined
53*/
54
55static void findClosestOutlineGap( BOARD* aBoard, PCB_SHAPE*& aItemA, PCB_SHAPE*& aItemB,
56 VECTOR2I& aMidpoint, int& aDistance )
57{
59 items.Collect( aBoard, { PCB_SHAPE_T } );
60
61 std::vector<PCB_SHAPE*> shapes;
62
63 for( int ii = 0; ii < items.GetCount(); ++ii )
64 {
65 PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( items[ii] );
66
67 if( shape->GetLayer() == Edge_Cuts )
68 shapes.push_back( shape );
69 }
70
71 int best = std::numeric_limits<int>::max();
72 VECTOR2I bestA;
73 VECTOR2I bestB;
74
75 for( size_t ii = 0; ii < shapes.size(); ++ii )
76 {
77 std::shared_ptr<SHAPE> shapeA = shapes[ii]->GetEffectiveShape();
78
79 for( size_t jj = ii + 1; jj < shapes.size(); ++jj )
80 {
81 std::shared_ptr<SHAPE> shapeB = shapes[jj]->GetEffectiveShape();
82 VECTOR2I ptA;
83 VECTOR2I ptB;
84
85 if( shapeA && shapeB && shapeA->NearestPoints( shapeB.get(), ptA, ptB ) )
86 {
87 int dist = ( ptA - ptB ).EuclideanNorm();
88
89 if( dist < best )
90 {
91 best = dist;
92 bestA = ptA;
93 bestB = ptB;
94 aItemA = shapes[ii];
95 aItemB = shapes[jj];
96 }
97 }
98 }
99 }
100
101 if( aItemA && aItemB )
102 {
103 aDistance = best;
104 aMidpoint = ( bestA + bestB ) / 2;
105 }
106 else
107 {
108 aDistance = 0;
109 aMidpoint = VECTOR2I();
110 }
111}
112
114{
115public:
117 m_board( nullptr )
118 {
119 m_isRuleDriven = false;
120 }
121
122 virtual ~DRC_TEST_PROVIDER_MISC() = default;
123
124 virtual bool Run() override;
125
126 virtual const wxString GetName() const override { return wxT( "miscellaneous" ); };
127
128private:
129 void testOutline();
130 void testDisabledLayers();
131 void testTextVars();
132 void testAssertions();
134
136};
137
138
140{
141 SHAPE_POLY_SET dummyOutline;
142 bool errorHandled = false;
143
144 OUTLINE_ERROR_HANDLER errorHandler =
145 [&]( const wxString& msg, BOARD_ITEM* itemA, BOARD_ITEM* itemB, const VECTOR2I& pt )
146 {
147 errorHandled = true;
148
149 if( m_drcEngine->IsErrorLimitExceeded( DRCE_INVALID_OUTLINE ) )
150 return;
151
152 if( !itemA )
153 std::swap( itemA, itemB );
154
155 VECTOR2I markerPos = pt;
156 int gap = 0;
157 PCB_SHAPE* shapeA = nullptr;
158 PCB_SHAPE* shapeB = nullptr;
159 bool usedGap = false;
160
161 if( itemA && itemB && itemA->Type() == PCB_SHAPE_T && itemB->Type() == PCB_SHAPE_T )
162 {
163 shapeA = static_cast<PCB_SHAPE*>( itemA );
164 shapeB = static_cast<PCB_SHAPE*>( itemB );
165 }
166 else
167 {
168 findClosestOutlineGap( m_board, shapeA, shapeB, markerPos, gap );
169 itemA = shapeA;
170 itemB = shapeB;
171 usedGap = shapeA && shapeB;
172 }
173
174 if( shapeA && shapeB )
175 {
176 std::shared_ptr<SHAPE> effectiveShapeA = shapeA->GetEffectiveShape();
177 std::shared_ptr<SHAPE> effectiveShapeB = shapeB->GetEffectiveShape();
178
179 if( effectiveShapeA && effectiveShapeB )
180 {
181 BOX2I bboxA = effectiveShapeA->BBox();
182 BOX2I bboxB = effectiveShapeB->BBox();
183 BOX2I overlap = bboxA.Intersect( bboxB );
184
185 if( overlap.GetWidth() > 0 && overlap.GetHeight() > 0 )
186 {
187 markerPos = overlap.Centre();
188 usedGap = false;
189 }
190 else
191 {
192 VECTOR2I ptA, ptB;
193
194 if( effectiveShapeA->NearestPoints( effectiveShapeB.get(), ptA, ptB ) )
195 {
196 gap = ( ptA - ptB ).EuclideanNorm();
197 markerPos = ( ptA + ptB ) / 2;
198 usedGap = true;
199 }
200 }
201 }
202 }
203
204 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_INVALID_OUTLINE );
205
206 if( itemA && itemB && usedGap )
207 {
208 drcItem->SetErrorDetail( wxString::Format( _( "%s (gap %s)" ), msg, MessageTextFromValue( gap ) ) );
209 }
210 else
211 {
212 drcItem->SetErrorDetail( msg );
213 }
214
215 drcItem->SetItems( itemA, itemB );
216
217 reportViolation( drcItem, markerPos, Edge_Cuts );
218 };
219
220 // Test for very small graphic items (a few nm size) that can create issues
221 // when trying to build the board outlines, and they are not easy to locate on screen.
222 const int minSizeForValideGraphics = pcbIUScale.mmToIU( 0.001 );
223
224 if( !TestBoardOutlinesGraphicItems(m_board, minSizeForValideGraphics, &errorHandler ) )
225 {
226 if( errorHandled )
227 {
228 // if there are invalid items on Edge.Cuts, they are already reported
229 }
230 else
231 {
232 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_INVALID_OUTLINE );
233 drcItem->SetErrorDetail( _( "(Suspicious items found on Edge.Cuts layer)" ) );
234 drcItem->SetItems( m_board );
235
236 reportViolation( drcItem, m_board->GetBoundingBox().Centre(), Edge_Cuts );
237 }
238 }
239
240
241 // Use the standard chaining epsilon here so that we report errors that might affect
242 // other tools (such as 3D viewer).
243 int chainingEpsilon = m_board->GetOutlinesChainingEpsilon();
244
245 // Arc to segment approximation error (not critical here: we do not use the outline shape):
246 int maxError = pcbIUScale.mmToIU( 0.05 );
247
248 if( !BuildBoardPolygonOutlines( m_board, dummyOutline, maxError, chainingEpsilon, true, &errorHandler ) )
249 {
250 if( errorHandled )
251 {
252 // if there is an invalid outline, then there must be an outline
253 }
254 else
255 {
256 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_INVALID_OUTLINE );
257 drcItem->SetErrorDetail( _( "(no edges found on Edge.Cuts layer)" ) );
258 drcItem->SetItems( m_board );
259
260 reportViolation( drcItem, m_board->GetBoundingBox().Centre(), Edge_Cuts );
261 }
262 }
263}
264
265
267{
268 const int progressDelta = 2000;
269 int ii = 0;
270 int items = 0;
271
272 auto countItems =
273 [&]( BOARD_ITEM* item ) -> bool
274 {
275 ++items;
276 return true;
277 };
278
279 LSET disabledLayers = LSET( m_board->GetEnabledLayers() ).flip();
280
281 // Perform the test only for copper layers
282 disabledLayers &= LSET::AllCuMask();
283
284 auto checkDisabledLayers =
285 [&]( BOARD_ITEM* item ) -> bool
286 {
287 if( m_drcEngine->IsErrorLimitExceeded( DRCE_DISABLED_LAYER_ITEM ) )
288 return false;
289
290 if( !reportProgress( ii++, items, progressDelta ) )
291 return false;
292
293 PCB_LAYER_ID badLayer = UNDEFINED_LAYER;
294
295 if( item->Type() == PCB_PAD_T )
296 {
297 PAD* pad = static_cast<PAD*>( item );
298
299 if( pad->GetAttribute() == PAD_ATTRIB::SMD
300 || pad->GetAttribute() == PAD_ATTRIB::CONN )
301 {
302 if( disabledLayers.test( pad->GetPrincipalLayer() ) )
303 badLayer = item->GetLayer();
304 }
305 else
306 {
307 // Through hole pad pierces all physical layers.
308 }
309 }
310 else if( item->Type() == PCB_VIA_T )
311 {
312 PCB_VIA* via = static_cast<PCB_VIA*>( item );
314 PCB_LAYER_ID bottom;
315
316 via->LayerPair( &top, &bottom );
317
318 if( disabledLayers.test( top ) )
319 badLayer = top;
320 else if( disabledLayers.test( bottom ) )
321 badLayer = bottom;
322 }
323 else if( item->Type() == PCB_ZONE_T )
324 {
325 // Footprint zones just get a top/bottom/inner setting, so they're on
326 // whatever inner layers there are.
327 }
328 else
329 {
330 LSET badLayers = disabledLayers & item->GetLayerSet();
331
332 if( badLayers.any() )
333 badLayer = badLayers.Seq().front();
334 }
335
336 if( badLayer != UNDEFINED_LAYER )
337 {
338 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_DISABLED_LAYER_ITEM );
339 drcItem->SetErrorDetail( wxString::Format( _( "(layer %s)" ), LayerName( badLayer ) ) );
340 drcItem->SetItems( item );
341
342 reportViolation( drcItem, item->GetPosition(), UNDEFINED_LAYER );
343 }
344
345 return true;
346 };
347
350}
351
352
354{
355 const int progressDelta = 2000;
356 int ii = 0;
357 int items = 0;
358
359 auto countItems =
360 [&]( BOARD_ITEM* item ) -> bool
361 {
362 ++items;
363 return true;
364 };
365
366 auto checkAssertions =
367 [&]( BOARD_ITEM* item ) -> bool
368 {
369 if( !reportProgress( ii++, items, progressDelta ) )
370 return false;
371
372 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_ASSERTION_FAILURE ) )
373 {
374 m_drcEngine->ProcessAssertions( item,
375 [&]( const DRC_CONSTRAINT* c )
376 {
377 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_ASSERTION_FAILURE );
378 drcItem->SetErrorDetail( wxString::Format( wxS( "(%s)" ), c->GetName() ) );
379 drcItem->SetItems( item );
380 drcItem->SetViolatingRule( c->GetParentRule() );
381
382 reportViolation( drcItem, item->GetPosition(), item->GetLayer() );
383 } );
384 }
385
386 return true;
387 };
388
389 forEachGeometryItem( {}, LSET::AllLayersMask(), countItems );
390 forEachGeometryItem( {}, LSET::AllLayersMask(), checkAssertions );
391}
392
393
395{
396 const int progressDelta = 2000;
397 int ii = 0;
398 int items = 0;
399
400 static const std::vector<KICAD_T> itemTypes = {
404 };
405
406 auto testAssertion =
407 [&]( BOARD_ITEM* item, const wxString& text, const VECTOR2I& pos, int layer )
408 {
409 static wxRegEx warningExpr( wxS( "^\\$\\{DRC_WARNING\\s*([^}]*)\\}(.*)$" ) );
410 static wxRegEx errorExpr( wxS( "^\\$\\{DRC_ERROR\\s*([^}]*)\\}(.*)$" ) );
411
412 if( warningExpr.Matches( text ) )
413 {
414 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_GENERIC_WARNING ) )
415 {
416 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_GENERIC_WARNING );
417 wxString drcText = warningExpr.GetMatch( text, 1 );
418
419 if( item )
420 drcItem->SetItems( item );
421 else
422 drcText += _( " (in drawing sheet)" );
423
424 drcItem->SetErrorMessage( drcText );
425
426 reportViolation( drcItem, pos, layer );
427 }
428
429 return true;
430 }
431
432 if( errorExpr.Matches( text ) )
433 {
434 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_GENERIC_ERROR ) )
435 {
436 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_GENERIC_ERROR );
437 wxString drcText = errorExpr.GetMatch( text, 1 );
438
439 if( item )
440 drcItem->SetItems( item );
441 else
442 drcText += _( " (in drawing sheet)" );
443
444 drcItem->SetErrorMessage( drcText );
445
446 reportViolation( drcItem, pos, layer );
447 }
448
449 return true;
450 }
451
452 return false;
453 };
454
456 [&]( BOARD_ITEM* item ) -> bool
457 {
458 ++items;
459 return true;
460 } );
461
463 [&]( BOARD_ITEM* item ) -> bool
464 {
465 if( m_drcEngine->IsErrorLimitExceeded( DRCE_UNRESOLVED_VARIABLE ) )
466 return false;
467
468 if( !reportProgress( ii++, items, progressDelta ) )
469 return false;
470
471 if( EDA_TEXT* textItem = dynamic_cast<EDA_TEXT*>( item ) )
472 {
473 wxString result = ExpandEnvVarSubstitutions( textItem->GetShownText( true ),
474 nullptr /*project already done*/ );
475
476 if( result.Matches( wxT( "*${*}*" ) ) )
477 {
479 drcItem->SetItems( item );
480
481 reportViolation( drcItem, item->GetPosition(), item->GetLayer() );
482 }
483
484 testAssertion( item, textItem->GetText(), item->GetPosition(), item->GetLayer() );
485 }
486
487 return true;
488 } );
489
490 DS_PROXY_VIEW_ITEM* drawingSheet = m_drcEngine->GetDrawingSheet();
492
493 if( !drawingSheet || m_drcEngine->IsErrorLimitExceeded( DRCE_UNRESOLVED_VARIABLE ) )
494 return;
495
496 drawItems.SetPageNumber( wxT( "1" ) );
497 drawItems.SetSheetCount( 1 );
498 drawItems.SetFileName( wxT( "dummyFilename" ) );
499 drawItems.SetSheetName( wxT( "dummySheet" ) );
500 drawItems.SetSheetLayer( wxT( "dummyLayer" ) );
501 drawItems.SetProject( m_board->GetProject() );
502 drawItems.BuildDrawItemsList( drawingSheet->GetPageInfo(), drawingSheet->GetTitleBlock() );
503
504 for( DS_DRAW_ITEM_BASE* item = drawItems.GetFirst(); item; item = drawItems.GetNext() )
505 {
506 if( m_drcEngine->IsErrorLimitExceeded( DRCE_UNRESOLVED_VARIABLE ) )
507 break;
508
509 if( m_drcEngine->IsCancelled() )
510 return;
511
512 if( DS_DRAW_ITEM_TEXT* text = dynamic_cast<DS_DRAW_ITEM_TEXT*>( item ) )
513 {
514 if( testAssertion( nullptr, text->GetText(), text->GetPosition(), LAYER_DRAWINGSHEET ) )
515 {
516 // Don't run unresolved test
517 }
518 else if( text->GetShownText( true ).Matches( wxT( "*${*}*" ) ) )
519 {
520 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_UNRESOLVED_VARIABLE );
521 drcItem->SetItems( drawingSheet );
522
523 reportViolation( drcItem, text->GetPosition(), LAYER_DRAWINGSHEET );
524 }
525 }
526 }
527}
528
529
531{
532 if( !m_board->GetProject() )
533 return;
534
535 std::shared_ptr<NET_SETTINGS> netSettings = m_board->GetProject()->GetProjectFile().NetSettings();
536 const std::shared_ptr<TUNING_PROFILES> tuningProfiles =
537 m_board->GetProject()->GetProjectFile().TuningProfileParameters();
538
539 std::set<wxString> profileNames;
540 std::ranges::for_each( tuningProfiles->GetTuningProfiles(),
541 [&profileNames]( const TUNING_PROFILE& tuningProfile )
542 {
543 if( const wxString name = tuningProfile.m_ProfileName; name != wxEmptyString )
544 profileNames.insert( name );
545 } );
546
547 for( const auto& [name, netclass] : netSettings->GetNetclasses() )
548 {
549 if( m_drcEngine->IsErrorLimitExceeded( DRCE_MISSING_TUNING_PROFILE ) )
550 return;
551
552 const wxString profileName = netclass->GetTuningProfile();
553
554 if( netclass->HasTuningProfile() && !profileNames.contains( profileName ) )
555 {
556 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( DRCE_MISSING_TUNING_PROFILE );
557 drcItem->SetErrorDetail( wxString::Format( "(Net Class: %s, Tuning Profile: %s)",
558 name,
559 profileName ) );
560
562 }
563 }
564}
565
566
568{
569 m_board = m_drcEngine->GetBoard();
570
571 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_INVALID_OUTLINE ) )
572 {
573 if( !reportPhase( _( "Checking board outline..." ) ) )
574 return false; // DRC cancelled
575
576 testOutline();
577 }
578
579 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_DISABLED_LAYER_ITEM ) )
580 {
581 if( !reportPhase( _( "Checking disabled layers..." ) ) )
582 return false; // DRC cancelled
583
585 }
586
587 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_UNRESOLVED_VARIABLE ) )
588 {
589 if( !reportPhase( _( "Checking text variables..." ) ) )
590 return false; // DRC cancelled
591
592 testTextVars();
593 }
594
595 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_ASSERTION_FAILURE )
596 || !m_drcEngine->IsErrorLimitExceeded( DRCE_GENERIC_WARNING )
597 || !m_drcEngine->IsErrorLimitExceeded( DRCE_GENERIC_ERROR ) )
598 {
599 if( !reportPhase( _( "Checking assertions..." ) ) )
600 return false; // DRC cancelled
601
603 }
604
605 if( !m_drcEngine->IsErrorLimitExceeded( DRCE_MISSING_TUNING_PROFILE ) )
606 {
607 if( !reportPhase( _( "Checking for missing tuning profiles..." ) ) )
608 return false; // DRC cancelled
609
611 }
612
613 return !m_drcEngine->IsCancelled();
614}
615
616
617namespace detail
618{
620}
const char * name
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BASE_SET & flip(size_t pos)
Definition base_set.h:160
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition board_item.h:268
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
constexpr BOX2< Vec > Intersect(const BOX2< Vec > &aRect)
Definition box2.h:347
constexpr size_type GetWidth() const
Definition box2.h:214
constexpr Vec Centre() const
Definition box2.h:97
constexpr size_type GetHeight() const
Definition box2.h:215
int GetCount() const
Return the number of objects in the list.
Definition collector.h:83
wxString GetName() const
Definition drc_rule.h:204
DRC_RULE * GetParentRule() const
Definition drc_rule.h:200
static std::shared_ptr< DRC_ITEM > Create(int aErrorCode)
Constructs a DRC_ITEM for the given error code.
Definition drc_item.cpp:407
virtual const wxString GetName() const override
virtual ~DRC_TEST_PROVIDER_MISC()=default
virtual bool Run() override
Run this provider against the given PCB with configured options (if any).
virtual bool reportPhase(const wxString &aStageName)
int forEachGeometryItem(const std::vector< KICAD_T > &aTypes, const LSET &aLayers, const std::function< bool(BOARD_ITEM *)> &aFunc)
void reportViolation(std::shared_ptr< DRC_ITEM > &item, const VECTOR2I &aMarkerPos, int aMarkerLayer, const std::function< void(PCB_MARKER *)> &aPathGenerator=[](PCB_MARKER *){})
static std::vector< KICAD_T > s_allBasicItems
virtual bool reportProgress(size_t aCount, size_t aSize, size_t aDelta=1)
Base class to handle basic graphic items.
Store the list of graphic items: rect, lines, polygons and texts to draw/plot the title block and fra...
DS_DRAW_ITEM_BASE * GetFirst()
void BuildDrawItemsList(const PAGE_INFO &aPageInfo, const TITLE_BLOCK &aTitleBlock)
Drawing or plot the drawing sheet.
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
void SetSheetName(const wxString &aSheetName)
Set the sheet name to draw/plot.
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
DS_DRAW_ITEM_BASE * GetNext()
void SetProject(const PROJECT *aProject)
A graphic text.
virtual VECTOR2I GetPosition() const
Definition eda_item.h:279
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:91
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
Definition lset.cpp:608
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition lset.cpp:313
static const LSET & AllLayersMask()
Definition lset.cpp:641
Definition pad.h:55
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Make a set of SHAPE objects representing the PCB_SHAPE.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition pcb_shape.h:71
Collect all BOARD_ITEM objects of a given set of KICAD_T type(s).
Definition collectors.h:521
void Collect(BOARD_ITEM *aBoard, const std::vector< KICAD_T > &aTypes)
Collect BOARD_ITEM objects using this class's Inspector method, which does the collection.
Represent a set of closed polygons.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
Definition common.cpp:558
#define FOR_ERC_DRC
Expand '${var-name}' templates in text.
Definition common.h:96
bool BuildBoardPolygonOutlines(BOARD *aBoard, SHAPE_POLY_SET &aOutlines, int aErrorMax, int aChainingEpsilon, bool aInferOutlineIfNecessary, OUTLINE_ERROR_HANDLER *aErrorHandler, bool aAllowUseArcsInPolygons)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
bool TestBoardOutlinesGraphicItems(BOARD *aBoard, int aMinDist, OUTLINE_ERROR_HANDLER *aErrorHandler)
Test a board graphic items on edge cut layer for validity.
const std::function< void(const wxString &msg, BOARD_ITEM *itemA, BOARD_ITEM *itemB, const VECTOR2I &pt)> OUTLINE_ERROR_HANDLER
@ DRCE_DISABLED_LAYER_ITEM
Definition drc_item.h:72
@ DRCE_INVALID_OUTLINE
Definition drc_item.h:73
@ DRCE_GENERIC_ERROR
Definition drc_item.h:91
@ DRCE_MISSING_TUNING_PROFILE
Definition drc_item.h:113
@ DRCE_UNRESOLVED_VARIABLE
Definition drc_item.h:88
@ DRCE_ASSERTION_FAILURE
Definition drc_item.h:89
@ DRCE_GENERIC_WARNING
Definition drc_item.h:90
static void findClosestOutlineGap(BOARD *aBoard, PCB_SHAPE *&aItemA, PCB_SHAPE *&aItemB, VECTOR2I &aMidpoint, int &aDistance)
#define _(s)
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
Definition layer_id.cpp:31
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
Definition layer_ids.h:278
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ Edge_Cuts
Definition layer_ids.h:112
@ UNDEFINED_LAYER
Definition layer_ids.h:61
static DRC_REGISTER_TEST_PROVIDER< DRC_TEST_PROVIDER_ANNULAR_WIDTH > dummy
@ SMD
Smd pad, appears on the solder paste layer (default)
Definition padstack.h:99
@ CONN
Like smd, does not appear on the solder paste layer (default) Note: also has a special attribute in G...
Definition padstack.h:100
Represents a single line in the tuning profile configuration grid.
KIBIS top(path, &reporter)
wxString result
Test unit parsing edge cases and error handling.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:85
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:94
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:90
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:105
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:89
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:87
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
Definition typeinfo.h:92
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:84
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition typeinfo.h:97
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687