LibrePCB Developers Documentation
Loading...
Searching...
No Matches
boarddesignrulecheck.h
Go to the documentation of this file.
1/*
2 * LibrePCB - Professional EDA for everyone!
3 * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4 * https://librepcb.org/
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (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, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef LIBREPCB_CORE_BOARDDESIGNRULECHECK_H
21#define LIBREPCB_CORE_BOARDDESIGNRULECHECK_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
26#include "../../../rulecheck/rulecheckmessage.h"
27#include "../../../utils/transform.h"
29
30#include <polyclipping/clipper.hpp>
31
32#include <QtCore>
33
34/*******************************************************************************
35 * Namespace / Forward Declarations
36 ******************************************************************************/
37namespace librepcb {
38
39/*******************************************************************************
40 * Class BoardDesignRuleCheck
41 ******************************************************************************/
42
47class BoardDesignRuleCheck final : public QObject {
48 Q_OBJECT
49
50public:
51 // Types
54 // This structure is filled by stage 1 jobs and read by stage 2 jobs.
55 // Each stage 2 job gets a copy of this structure, so no synchronization
56 // is needed for thread-safety. Stage 1 jobs however all get the same
57 // instance, thus require to lock it with the contained mutex.
58
59 mutable QMutex mutex; // To be used by stage 1 jobs.
60
61 QHash<const Layer*, ClipperLib::Paths> copperPathsPerLayer;
62 };
63
64 struct Result {
66 QStringList errors; // Empty on success.
67 bool quick = false;
68 qint64 elapsedTimeMs = 0;
69 };
70
71 // Constructors / Destructor
72 explicit BoardDesignRuleCheck(QObject* parent = nullptr) noexcept;
73 ~BoardDesignRuleCheck() noexcept;
74
75 // General Methods
76 void start(Board& board, const BoardDesignRuleCheckSettings& settings,
77 bool quick) noexcept;
78
79 bool isRunning() const noexcept;
80
86 Result waitForFinished() const noexcept;
87
91 void cancel() noexcept;
92
93signals:
94 void started();
95 void progressPercent(int percent);
96 void progressStatus(const QString& msg);
97 void finished(Result result);
98
99private: // Methods
100 typedef std::function<RuleCheckMessageList()> JobFunc;
101 typedef std::function<void(const Data&, CalculatedJobData&)> Stage1Func;
103 const Data&, const CalculatedJobData&);
105 const Data&);
106
107 Result tryRunJob(JobFunc function, int weight) noexcept;
108 Result run(std::shared_ptr<const Data> data,
109 std::shared_ptr<QElapsedTimer> timer) noexcept;
110 void prepareCopperPaths(const Data& data, CalculatedJobData& calcData,
111 const Layer& layer);
115 const Data& data, const CalculatedJobData& calcData);
121 const Data& data, const CalculatedJobData& calcData);
139 static void checkMinimumWidth(RuleCheckMessageList& messages,
140 const Data& data,
141 const UnsignedLength& minWidth,
142 std::function<bool(const Layer&)> layerFilter);
143 static bool requiresHoleSlotWarning(
144 const Data::Hole& hole,
145 BoardDesignRuleCheckSettings::AllowedSlots allowed);
146 static ClipperLib::Paths getBoardClearanceArea(
147 const Data& data, const UnsignedLength& clearance);
148 static QVector<Path> getBoardOutlines(
149 const Data& data, const QSet<const Layer*>& layers) noexcept;
150 static ClipperLib::Paths getDeviceOutlinePaths(const Data::Device& device,
151 const Layer& layer);
152 static QVector<Path> getDeviceLocation(const Data::Device& device);
153 static QVector<Path> getViaLocation(const Data::Via& via) noexcept;
154 static bool isViaUseless(const Data& data, const Data::Segment& ns,
155 const Data::Via& via) noexcept;
156 static QVector<Path> getTraceLocation(const Data::Trace& trace) noexcept;
157 static QVector<Path> getHoleLocation(
158 const Data::Hole& hole,
159 const Transform& transform = Transform()) noexcept;
160 void emitProgress(int percent) noexcept;
161 void emitStatus(const QString& status) noexcept;
162
166 static PositiveLength maxArcTolerance() noexcept {
167 return PositiveLength(5000);
168 }
169
170private: // Data
171 QMutex mMutex;
172 int mProgressTotal = 0; // Only for progress range 20..100%
173 int mProgressCounter = 0; // 0..mProgressTotal
174 QFuture<Result> mFuture;
175 bool mAbort = false;
176};
177
178/*******************************************************************************
179 * End of File
180 ******************************************************************************/
181
182} // namespace librepcb
183
184#endif
The BoardDesignRuleCheck class checks a librepcb::Board for design rule violations.
Definition boarddesignrulecheck.h:47
int mProgressCounter
Definition boarddesignrulecheck.h:173
QMutex mMutex
Definition boarddesignrulecheck.h:171
RuleCheckMessageList checkVias(const Data &data)
Definition boarddesignrulecheck.cpp:1655
RuleCheckMessageList checkCopperBoardClearances(const Data &data)
Definition boarddesignrulecheck.cpp:672
RuleCheckMessageList checkBoardOutline(const Data &data)
Definition boarddesignrulecheck.cpp:1830
RuleCheckMessageList checkMinimumSilkscreenWidth(const Data &data)
Definition boarddesignrulecheck.cpp:1362
void cancel() noexcept
Cancel the current asynchronous job.
Definition boarddesignrulecheck.cpp:117
void emitProgress(int percent) noexcept
Definition boarddesignrulecheck.cpp:2401
RuleCheckMessageList checkMinimumPthSlotWidth(const Data &data)
Definition boarddesignrulecheck.cpp:1333
bool mAbort
Definition boarddesignrulecheck.h:175
static bool isViaUseless(const Data &data, const Data::Segment &ns, const Data::Via &via) noexcept
Definition boarddesignrulecheck.cpp:2319
RuleCheckMessageList checkMinimumNpthDrillDiameter(const Data &data)
Definition boarddesignrulecheck.cpp:1220
static ClipperLib::Paths getBoardClearanceArea(const Data &data, const UnsignedLength &clearance)
Definition boarddesignrulecheck.cpp:2183
RuleCheckMessageList checkZones(const Data &data)
Definition boarddesignrulecheck.cpp:1410
Result waitForFinished() const noexcept
Wait until the asynchronous operation is finished.
Definition boarddesignrulecheck.cpp:105
void prepareCopperPaths(const Data &data, CalculatedJobData &calcData, const Layer &layer)
Definition boarddesignrulecheck.cpp:352
RuleCheckMessageList checkCopperCopperClearances(const Data &data)
Definition boarddesignrulecheck.cpp:362
static ClipperLib::Paths getDeviceOutlinePaths(const Data::Device &device, const Layer &layer)
Definition boarddesignrulecheck.cpp:2230
RuleCheckMessageList checkMinimumPthDrillDiameter(const Data &data)
Definition boarddesignrulecheck.cpp:1291
void emitStatus(const QString &status) noexcept
Definition boarddesignrulecheck.cpp:2406
RuleCheckMessageList checkMinimumSilkscreenTextHeight(const Data &data)
Definition boarddesignrulecheck.cpp:1380
void progressStatus(const QString &msg)
static PositiveLength maxArcTolerance() noexcept
Definition boarddesignrulecheck.h:166
RuleCheckMessageList checkMinimumPthAnnularRing(const Data &data, const CalculatedJobData &calcData)
Definition boarddesignrulecheck.cpp:1151
RuleCheckMessageList(BoardDesignRuleCheck::* Stage2Func)(const Data &, const CalculatedJobData &)
Definition boarddesignrulecheck.h:102
static QVector< Path > getViaLocation(const Data::Via &via) noexcept
Definition boarddesignrulecheck.cpp:2314
RuleCheckMessageList checkForMissingConnections(const Data &data)
Definition boarddesignrulecheck.cpp:1980
std::function< void(const Data &, CalculatedJobData &)> Stage1Func
Definition boarddesignrulecheck.h:101
Result run(std::shared_ptr< const Data > data, std::shared_ptr< QElapsedTimer > timer) noexcept
Definition boarddesignrulecheck.cpp:149
RuleCheckMessageList checkDrillDrillClearances(const Data &data)
Definition boarddesignrulecheck.cpp:878
void progressPercent(int percent)
RuleCheckMessageList checkUsedLayers(const Data &data)
Definition boarddesignrulecheck.cpp:1907
RuleCheckMessageList(BoardDesignRuleCheck::* IndependentStageFunc)(const Data &)
Definition boarddesignrulecheck.h:104
int mProgressTotal
Definition boarddesignrulecheck.h:172
RuleCheckMessageList checkDrillBoardClearances(const Data &data)
Definition boarddesignrulecheck.cpp:965
static QVector< Path > getDeviceLocation(const Data::Device &device)
Definition boarddesignrulecheck.cpp:2260
RuleCheckMessageList checkForUnplacedComponents(const Data &data)
Definition boarddesignrulecheck.cpp:1966
void finished(Result result)
static QVector< Path > getBoardOutlines(const Data &data, const QSet< const Layer * > &layers) noexcept
Definition boarddesignrulecheck.cpp:2205
QFuture< Result > mFuture
Definition boarddesignrulecheck.h:174
RuleCheckMessageList checkMinimumCopperWidth(const Data &data)
Definition boarddesignrulecheck.cpp:1135
bool isRunning() const noexcept
Definition boarddesignrulecheck.cpp:101
std::function< RuleCheckMessageList()> JobFunc
Definition boarddesignrulecheck.h:100
RuleCheckMessageList checkAllowedNpthSlots(const Data &data)
Definition boarddesignrulecheck.cpp:1687
static QVector< Path > getTraceLocation(const Data::Trace &trace) noexcept
Definition boarddesignrulecheck.cpp:2391
void start(Board &board, const BoardDesignRuleCheckSettings &settings, bool quick) noexcept
Definition boarddesignrulecheck.cpp:59
RuleCheckMessageList checkDeviceClearances(const Data &data)
Definition boarddesignrulecheck.cpp:1774
static void checkMinimumWidth(RuleCheckMessageList &messages, const Data &data, const UnsignedLength &minWidth, std::function< bool(const Layer &)> layerFilter)
Definition boarddesignrulecheck.cpp:2043
RuleCheckMessageList checkSilkscreenStopmaskClearances(const Data &data)
Definition boarddesignrulecheck.cpp:1042
RuleCheckMessageList checkForStaleObjects(const Data &data)
Definition boarddesignrulecheck.cpp:2020
RuleCheckMessageList checkAllowedPthSlots(const Data &data)
Definition boarddesignrulecheck.cpp:1720
static bool requiresHoleSlotWarning(const Data::Hole &hole, BoardDesignRuleCheckSettings::AllowedSlots allowed)
Definition boarddesignrulecheck.cpp:2164
RuleCheckMessageList checkCopperHoleClearances(const Data &data, const CalculatedJobData &calcData)
Definition boarddesignrulecheck.cpp:821
RuleCheckMessageList checkMinimumNpthSlotWidth(const Data &data)
Definition boarddesignrulecheck.cpp:1256
RuleCheckMessageList checkInvalidPadConnections(const Data &data)
Definition boarddesignrulecheck.cpp:1747
Result tryRunJob(JobFunc function, int weight) noexcept
Definition boarddesignrulecheck.cpp:127
static QVector< Path > getHoleLocation(const Data::Hole &hole, const Transform &transform=Transform()) noexcept
Definition boarddesignrulecheck.cpp:2396
The BoardDesignRuleCheckSettings class.
Definition boarddesignrulechecksettings.h:44
The Board class represents a PCB of a project and is always part of a circuit.
Definition board.h:73
The Device class represents an instance of a component (a "real" component)
Definition device.h:55
The Hole class.
Definition hole.h:45
The Layer class provides all supported geometry layers.
Definition layer.h:42
The Path class represents a list of vertices connected by straight lines or circular arc segments.
Definition path.h:57
The Trace class represents a trace within a board.
Definition trace.h:113
Helper class to perform coordinate transformation with various types.
Definition transform.h:59
The Via class represents a via of a board.
Definition via.h:52
Definition occmodel.cpp:77
type_safe::constrained_type< Length, PositiveLengthConstraint, PositiveLengthVerifier > PositiveLength
Definition length.h:810
type_safe::constrained_type< Length, UnsignedLengthConstraint, UnsignedLengthVerifier > UnsignedLength
Definition length.h:694
QVector< std::shared_ptr< const RuleCheckMessage > > RuleCheckMessageList
Definition rulecheckmessage.h:104
Definition uuid.h:186
Definition boarddesignrulecheck.h:53
QHash< const Layer *, ClipperLib::Paths > copperPathsPerLayer
Definition boarddesignrulecheck.h:61
QMutex mutex
Definition boarddesignrulecheck.h:59
Definition boarddesignrulecheck.h:64
RuleCheckMessageList messages
Definition boarddesignrulecheck.h:65
QStringList errors
Definition boarddesignrulecheck.h:66
qint64 elapsedTimeMs
Definition boarddesignrulecheck.h:68
bool quick
Definition boarddesignrulecheck.h:67
Input data structure for librepcb::BoardDesignRuleCheck.
Definition boarddesignrulecheckdata.h:48