KiCad PCB EDA Suite
Loading...
Searching...
No Matches
drc_test_provider.h
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, see AUTHORS.txt for contributors.
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
24
25#ifndef DRC_TEST_PROVIDER__H
26#define DRC_TEST_PROVIDER__H
27
28#include <board.h>
29#include <board_commit.h>
30#include <drc/drc_engine.h>
31#include <pcb_marker.h>
32
33#include <functional>
34#include <set>
35
36class DRC_ENGINE;
38class DRC_RULE;
39class DRC_CONSTRAINT;
40
42{
43public:
45
47
49 {
51 return self;
52 }
53
54 void RegisterTestProvider( DRC_TEST_PROVIDER* provider ) { m_providers.push_back( provider ); }
55 std::vector<DRC_TEST_PROVIDER*> GetTestProviders() const { return m_providers; }
56
57private:
58 std::vector<DRC_TEST_PROVIDER*> m_providers;
59};
60
61template<class T> class DRC_REGISTER_TEST_PROVIDER
62{
63public:
65 {
66 T* provider = new T;
68 }
69};
70
71
77{
78public:
80 virtual ~DRC_TEST_PROVIDER() = default;
81
82 static void Init();
83
84 void SetDRCEngine( DRC_ENGINE *engine )
85 {
86 m_drcEngine = engine;
87 m_stats.clear();
88 }
89
90 bool RunTests( EDA_UNITS aUnits )
91 {
92 SetUserUnits( aUnits );
93 return Run();
94 }
95
99 virtual bool Run() = 0;
100
101 virtual const wxString GetName() const;
102 virtual const wxString GetDescription() const;
103
104protected:
105 int forEachGeometryItem( const std::vector<KICAD_T>& aTypes, LSET aLayers,
106 const std::function<bool(BOARD_ITEM*)>& aFunc );
107
108 // Do not use a wxString with a vararg list: it is a complex thing and can create issues.
109 // So prefer using a wxChar* item in this case:
110 void reportAux( const wxString& aMsg ) { reportAux( (const wxChar*) aMsg.wchar_str() ); }
111 virtual void reportAux( const wxChar* fmt, ... );
112
113 virtual void reportViolation( std::shared_ptr<DRC_ITEM>& item, const VECTOR2I& aMarkerPos,
114 int aMarkerLayer,
115 DRC_CUSTOM_MARKER_HANDLER* aCustomHandler = nullptr );
116 virtual bool reportProgress( size_t aCount, size_t aSize, size_t aDelta = 1 );
117 virtual bool reportPhase( const wxString& aStageName );
118
119 virtual void reportRuleStatistics();
120 virtual void accountCheck( const DRC_RULE* ruleToTest );
121 virtual void accountCheck( const DRC_CONSTRAINT& constraintToTest );
122
123 bool isInvisibleText( const BOARD_ITEM* aItem ) const;
124
125 wxString formatMsg( const wxString& aFormatString, const wxString& aSource, double aConstraint,
126 double aActual );
127 wxString formatMsg( const wxString& aFormatString, const wxString& aSource,
128 const EDA_ANGLE& aConstraint, const EDA_ANGLE& aActual );
129
130 // List of basic (ie: non-compound) geometry items
131 static std::vector<KICAD_T> s_allBasicItems;
132 static std::vector<KICAD_T> s_allBasicItemsButZones;
133
135
136protected:
138 std::unordered_map<const DRC_RULE*, int> m_stats;
139 bool m_isRuleDriven = true;
140 std::mutex m_statsMutex;
141};
142
143#endif // DRC_TEST_PROVIDER__H
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
Design Rule Checker object that performs all the DRC tests.
Definition: drc_engine.h:86
std::vector< DRC_TEST_PROVIDER * > GetTestProviders() const
static DRC_TEST_PROVIDER_REGISTRY & Instance()
void RegisterTestProvider(DRC_TEST_PROVIDER *provider)
std::vector< DRC_TEST_PROVIDER * > m_providers
Represent a DRC "provider" which runs some DRC functions over a BOARD and spits out DRC_ITEM and posi...
wxString formatMsg(const wxString &aFormatString, const wxString &aSource, double aConstraint, double aActual)
static std::vector< KICAD_T > s_allBasicItemsButZones
virtual bool reportPhase(const wxString &aStageName)
int forEachGeometryItem(const std::vector< KICAD_T > &aTypes, LSET aLayers, const std::function< bool(BOARD_ITEM *)> &aFunc)
virtual void reportViolation(std::shared_ptr< DRC_ITEM > &item, const VECTOR2I &aMarkerPos, int aMarkerLayer, DRC_CUSTOM_MARKER_HANDLER *aCustomHandler=nullptr)
bool RunTests(EDA_UNITS aUnits)
static std::vector< KICAD_T > s_allBasicItems
virtual const wxString GetDescription() const
EDA_UNITS userUnits() const
DRC_ENGINE * m_drcEngine
bool isInvisibleText(const BOARD_ITEM *aItem) const
std::unordered_map< const DRC_RULE *, int > m_stats
virtual ~DRC_TEST_PROVIDER()=default
void reportAux(const wxString &aMsg)
virtual void accountCheck(const DRC_RULE *ruleToTest)
virtual bool Run()=0
Run this provider against the given PCB with configured options (if any).
void SetDRCEngine(DRC_ENGINE *engine)
virtual const wxString GetName() const
virtual void reportRuleStatistics()
virtual bool reportProgress(size_t aCount, size_t aSize, size_t aDelta=1)
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:37
void SetUserUnits(EDA_UNITS aUnits)
std::function< void(PCB_MARKER *aMarker)> DRC_CUSTOM_MARKER_HANDLER
Definition: drc_engine.h:69
EDA_UNITS
Definition: eda_units.h:46