LibrePCB Developers Documentation
Loading...
Searching...
No Matches
trace.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_TRACE_H
21#define LIBREPCB_CORE_TRACE_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
26#include "../serialization/serializableobjectlist.h"
27#include "../types/length.h"
28
29#include <QtCore>
30
31/*******************************************************************************
32 * Namespace / Forward Declarations
33 ******************************************************************************/
34namespace librepcb {
35
36class Layer;
37
38/*******************************************************************************
39 * Class TraceAnchor
40 ******************************************************************************/
41
45class TraceAnchor final {
46 Q_DECLARE_TR_FUNCTIONS(TraceAnchor)
47
48public:
49 // Types
50 struct PadAnchor {
53
54 bool operator==(const PadAnchor& rhs) const noexcept {
55 return (device == rhs.device) && (pad == rhs.pad);
56 }
57 };
58
59 // Constructors / Destructor
60 TraceAnchor() = delete;
61 TraceAnchor(const TraceAnchor& other) noexcept;
62 explicit TraceAnchor(const SExpression& node);
63 ~TraceAnchor() noexcept;
64
65 // Getters
66 const std::optional<Uuid>& tryGetJunction() const noexcept {
67 return mJunction;
68 }
69 const std::optional<Uuid>& tryGetVia() const noexcept { return mVia; }
70 const std::optional<PadAnchor>& tryGetPad() const noexcept { return mPad; }
71
72 // General Methods
73
79 void serialize(SExpression& root) const;
80
81 // Operator Overloadings
82 bool operator==(const TraceAnchor& rhs) const noexcept;
83 bool operator!=(const TraceAnchor& rhs) const noexcept {
84 return !(*this == rhs);
85 }
86 TraceAnchor& operator=(const TraceAnchor& rhs) noexcept;
87
88 // Static Methods
89 static TraceAnchor junction(const Uuid& junction) noexcept;
90 static TraceAnchor via(const Uuid& via) noexcept;
91 static TraceAnchor pad(const Uuid& device, const Uuid& pad) noexcept;
92
93private: // Methods
94 TraceAnchor(const std::optional<Uuid>& junction,
95 const std::optional<Uuid>& via,
96 const std::optional<PadAnchor>& pad) noexcept;
97
98private: // Data
99 std::optional<Uuid> mJunction;
100 std::optional<Uuid> mVia;
101 std::optional<PadAnchor> mPad;
102};
103
104/*******************************************************************************
105 * Class Trace
106 ******************************************************************************/
107
113class Trace final {
114 Q_DECLARE_TR_FUNCTIONS(Trace)
115
116public:
117 // Signals
118 enum class Event {
124 };
127
128 // Constructors / Destructor
129 Trace() = delete;
130 Trace(const Trace& other) noexcept;
131 Trace(const Uuid& uuid, const Trace& other) noexcept;
132 Trace(const Uuid& uuid, const Layer& layer, const PositiveLength& width,
133 const TraceAnchor& start, const TraceAnchor& end) noexcept;
134 explicit Trace(const SExpression& node);
135 ~Trace() noexcept;
136
137 // Getters
138 const Uuid& getUuid() const noexcept { return mUuid; }
139 const Layer& getLayer() const noexcept { return *mLayer; }
140 const PositiveLength& getWidth() const noexcept { return mWidth; }
141 const TraceAnchor& getStartPoint() const noexcept { return mStart; }
142 const TraceAnchor& getEndPoint() const noexcept { return mEnd; }
143
144 // Setters
145 bool setUuid(const Uuid& uuid) noexcept;
146 bool setLayer(const Layer& layer) noexcept;
147 bool setWidth(const PositiveLength& width) noexcept;
148 bool setStartPoint(const TraceAnchor& start) noexcept;
149 bool setEndPoint(const TraceAnchor& end) noexcept;
150
151 // General Methods
152
158 void serialize(SExpression& root) const;
159
160 // Operator Overloadings
161 bool operator==(const Trace& rhs) const noexcept;
162 bool operator!=(const Trace& rhs) const noexcept { return !(*this == rhs); }
163 Trace& operator=(const Trace& rhs) noexcept;
164
165private: // Data
167 const Layer* mLayer;
171};
172
173/*******************************************************************************
174 * Class TraceList
175 ******************************************************************************/
176
178 static constexpr const char* tagname = "trace";
179};
182
183/*******************************************************************************
184 * Non-Member Functions
185 ******************************************************************************/
186
187inline std::size_t qHash(const TraceAnchor& key,
188 std::size_t seed = 0) noexcept {
189 QString s;
190 if (std::optional<Uuid> anchor = key.tryGetJunction()) {
191 s += anchor->toStr();
192 }
193 if (std::optional<Uuid> anchor = key.tryGetVia()) {
194 s += anchor->toStr();
195 }
196 if (std::optional<TraceAnchor::PadAnchor> anchor = key.tryGetPad()) {
197 s += anchor->device.toStr();
198 s += anchor->pad.toStr();
199 }
200 Q_ASSERT(!s.isEmpty());
201
202 return ::qHash(s, seed);
203}
204
205/*******************************************************************************
206 * End of File
207 ******************************************************************************/
208
209} // namespace librepcb
210
211#endif
The Layer class provides all supported geometry layers.
Definition layer.h:42
The SExpression class.
Definition sexpression.h:69
The Signal class is used to emit signals on non-QObject derived classes.
Definition signalslot.h:65
The Slot class is used to receive signals from non-QObject derived classes.
Definition signalslot.h:170
The TraceAnchor class.
Definition trace.h:45
const std::optional< Uuid > & tryGetVia() const noexcept
Definition trace.h:69
~TraceAnchor() noexcept
Definition trace.cpp:60
bool operator!=(const TraceAnchor &rhs) const noexcept
Definition trace.h:83
bool operator==(const TraceAnchor &rhs) const noexcept
Definition trace.cpp:76
static TraceAnchor pad(const Uuid &device, const Uuid &pad) noexcept
Definition trace.cpp:96
static TraceAnchor via(const Uuid &via) noexcept
Definition trace.cpp:92
std::optional< PadAnchor > mPad
Definition trace.h:101
std::optional< Uuid > mJunction
Definition trace.h:99
static TraceAnchor junction(const Uuid &junction) noexcept
Definition trace.cpp:88
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition trace.cpp:63
TraceAnchor & operator=(const TraceAnchor &rhs) noexcept
Definition trace.cpp:81
const std::optional< Uuid > & tryGetJunction() const noexcept
Definition trace.h:66
std::optional< Uuid > mVia
Definition trace.h:100
const std::optional< PadAnchor > & tryGetPad() const noexcept
Definition trace.h:70
The Trace class represents a trace within a board.
Definition trace.h:113
Signal< Trace, Event > onEdited
Definition trace.h:125
const TraceAnchor & getStartPoint() const noexcept
Definition trace.h:141
const PositiveLength & getWidth() const noexcept
Definition trace.h:140
bool setEndPoint(const TraceAnchor &end) noexcept
Definition trace.cpp:183
Uuid mUuid
Definition trace.h:166
Event
Definition trace.h:118
~Trace() noexcept
Definition trace.cpp:136
bool operator!=(const Trace &rhs) const noexcept
Definition trace.h:162
const Layer & getLayer() const noexcept
Definition trace.h:139
bool operator==(const Trace &rhs) const noexcept
Definition trace.cpp:212
const TraceAnchor & getEndPoint() const noexcept
Definition trace.h:142
bool setLayer(const Layer &layer) noexcept
Definition trace.cpp:153
Trace & operator=(const Trace &rhs) noexcept
Definition trace.cpp:221
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition trace.cpp:197
Slot< Trace, Event > OnEditedSlot
Definition trace.h:126
const Uuid & getUuid() const noexcept
Definition trace.h:138
bool setWidth(const PositiveLength &width) noexcept
Definition trace.cpp:163
const Layer * mLayer
Definition trace.h:167
TraceAnchor mStart
Definition trace.h:169
bool setUuid(const Uuid &uuid) noexcept
Definition trace.cpp:143
PositiveLength mWidth
Definition trace.h:168
bool setStartPoint(const TraceAnchor &start) noexcept
Definition trace.cpp:173
TraceAnchor mEnd
Definition trace.h:170
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition uuid.h:56
Definition occmodel.cpp:76
std::size_t qHash(const AttributeKey &key, std::size_t seed=0) noexcept
Definition attributekey.h:118
type_safe::constrained_type< Length, PositiveLengthConstraint, PositiveLengthVerifier > PositiveLength
Definition length.h:810
Definition uuid.h:186
Uuid device
Definition trace.h:51
bool operator==(const PadAnchor &rhs) const noexcept
Definition trace.h:54
Uuid pad
Definition trace.h:52
Definition trace.h:177
static constexpr const char * tagname
Definition trace.h:178