LibrePCB Developers Documentation
Loading...
Searching...
No Matches
boardclipboarddata.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_EDITOR_BOARDCLIPBOARDDATA_H
21#define LIBREPCB_EDITOR_BOARDCLIPBOARDDATA_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
41
42#include <QtCore>
43#include <QtWidgets>
44
45#include <memory>
46
47/*******************************************************************************
48 * Namespace / Forward Declarations
49 ******************************************************************************/
50namespace librepcb {
51
52class Layer;
53class TransactionalDirectory;
54class TransactionalFileSystem;
55
56namespace editor {
57
58/*******************************************************************************
59 * Class BoardClipboardData
60 ******************************************************************************/
61
65class BoardClipboardData final {
66public:
67 // Types
68 struct Device {
69 static constexpr const char* tagname = "device";
70
77 bool locked;
78 bool glue;
80 QList<BoardStrokeTextData> strokeTexts;
82
99
100 explicit Device(const SExpression& node)
101 : componentUuid(deserialize<Uuid>(node.getChild("@0"))),
102 libDeviceUuid(deserialize<Uuid>(node.getChild("lib_device/@0"))),
103 libFootprintUuid(deserialize<Uuid>(node.getChild("lib_footprint/@0"))),
104 position(node.getChild("position")),
105 rotation(deserialize<Angle>(node.getChild("rotation/@0"))),
106 mirrored(deserialize<bool>(node.getChild("flip/@0"))),
107 locked(deserialize<bool>(node.getChild("lock/@0"))),
108 glue(deserialize<bool>(node.getChild("glue/@0"))),
109 attributes(node),
110 strokeTexts(),
111 onEdited(*this) {
112 foreach (const SExpression* child, node.getChildren("stroke_text")) {
114 }
115 }
116
117 void serialize(SExpression& root) const {
119 root.ensureLineBreak();
120 root.appendChild("lib_device", libDeviceUuid);
121 root.ensureLineBreak();
122 root.appendChild("lib_footprint", libFootprintUuid);
123 root.ensureLineBreak();
124 position.serialize(root.appendList("position"));
125 root.appendChild("rotation", rotation);
126 root.appendChild("flip", mirrored);
127 root.appendChild("lock", locked);
128 root.appendChild("glue", glue);
129 root.ensureLineBreak();
130 attributes.serialize(root);
131 foreach (const BoardStrokeTextData& strokeText, strokeTexts) {
132 root.ensureLineBreak();
133 strokeText.serialize(root.appendList("stroke_text"));
134 }
135 root.ensureLineBreak();
136 }
137
138 bool operator!=(const Device& rhs) noexcept {
139 return (componentUuid != rhs.componentUuid) ||
140 (libDeviceUuid != rhs.libDeviceUuid) ||
141 (libFootprintUuid != rhs.libFootprintUuid) ||
142 (position != rhs.position) || (rotation != rhs.rotation) ||
143 (mirrored != rhs.mirrored) || (locked != rhs.locked) ||
144 (glue != rhs.glue) || (attributes != rhs.attributes) ||
145 (strokeTexts != rhs.strokeTexts);
146 }
147 };
148
149 struct NetSegment {
150 static constexpr const char* tagname = "netsegment";
151
152 std::optional<CircuitIdentifier> netName;
158
159 explicit NetSegment(const std::optional<CircuitIdentifier>& netName)
160 : netName(netName),
161 pads(),
162 vias(),
163 junctions(),
164 traces(),
165 onEdited(*this) {}
166
167 explicit NetSegment(const SExpression& node)
169 node.getChild("net/@0"))),
170 pads(node),
171 vias(node),
172 junctions(node),
173 traces(node),
174 onEdited(*this) {}
175
176 void serialize(SExpression& root) const {
177 root.ensureLineBreak();
178 root.appendChild("net", netName);
179 root.ensureLineBreak();
180 pads.serialize(root);
181 root.ensureLineBreak();
182 vias.serialize(root);
183 root.ensureLineBreak();
184 junctions.serialize(root);
185 root.ensureLineBreak();
186 traces.serialize(root);
187 root.ensureLineBreak();
188 }
189
190 bool operator!=(const NetSegment& rhs) noexcept {
191 return (netName != rhs.netName) || (pads != rhs.pads) ||
192 (vias != rhs.vias) || (junctions != rhs.junctions) ||
193 (traces != rhs.traces);
194 }
195 };
196
197 struct Plane {
198 static constexpr const char* tagname = "plane";
199
201 const Layer* layer;
202 std::optional<CircuitIdentifier> netSignalName;
213 bool locked;
215
240
241 explicit Plane(const SExpression& node)
242 : uuid(deserialize<Uuid>(node.getChild("@0"))),
243 layer(deserialize<const Layer*>(node.getChild("layer/@0"))),
245 node.getChild("net/@0"))),
246 outline(node),
247 minWidth(deserialize<UnsignedLength>(node.getChild("min_width/@0"))),
249 node.getChild("min_copper_clearance/@0"))),
251 node.getChild("min_board_clearance/@0"))),
253 node.getChild("min_npth_clearance/@0"))),
254 keepIslands(deserialize<bool>(node.getChild("keep_islands/@0"))),
255 priority(deserialize<int>(node.getChild("priority/@0"))),
256 connectStyle(deserialize<BI_Plane::ConnectStyle>(
257 node.getChild("connect_style/@0"))),
259 deserialize<PositiveLength>(node.getChild("thermal_gap/@0"))),
261 deserialize<PositiveLength>(node.getChild("thermal_spoke/@0"))),
262 locked(deserialize<bool>(node.getChild("lock/@0"))),
263 onEdited(*this) {}
264
265 void serialize(SExpression& root) const {
266 root.appendChild(uuid);
267 root.appendChild("layer", *layer);
268 root.ensureLineBreak();
269 root.appendChild("net", netSignalName);
270 root.appendChild("priority", priority);
271 root.appendChild("min_width", minWidth);
272 root.ensureLineBreak();
273 root.appendChild("min_copper_clearance", minClearanceToCopper);
274 root.appendChild("min_board_clearance", minClearanceToBoard);
275 root.appendChild("min_npth_clearance", minClearanceToNpth);
276 root.ensureLineBreak();
277 root.appendChild("connect_style", connectStyle);
278 root.appendChild("thermal_gap", thermalGap);
279 root.appendChild("thermal_spoke", thermalSpokeWidth);
280 root.ensureLineBreak();
281 root.appendChild("keep_islands", keepIslands);
282 root.appendChild("lock", locked);
283 root.ensureLineBreak();
284 outline.serialize(root);
285 root.ensureLineBreak();
286 }
287
288 bool operator!=(const Plane& rhs) noexcept {
289 return (uuid != rhs.uuid) || (layer != rhs.layer) ||
290 (netSignalName != rhs.netSignalName) || (outline != rhs.outline) ||
291 (minWidth != rhs.minWidth) ||
292 (minClearanceToCopper != rhs.minClearanceToCopper) ||
293 (minClearanceToBoard != rhs.minClearanceToBoard) ||
294 (minClearanceToNpth != rhs.minClearanceToNpth) ||
295 (keepIslands != rhs.keepIslands) || (priority != rhs.priority) ||
296 (connectStyle != rhs.connectStyle) ||
297 (thermalGap != rhs.thermalGap) ||
298 (thermalSpokeWidth != rhs.thermalSpokeWidth) ||
299 (locked != rhs.locked);
300 }
301 };
302
303 // Constructors / Destructor
306 BoardClipboardData(const Uuid& boardUuid, const Point& cursorPos) noexcept;
307 explicit BoardClipboardData(const QByteArray& mimeData);
308 ~BoardClipboardData() noexcept;
309
310 // Getters
311 bool isEmpty() const noexcept;
313 const QString& path = "") noexcept;
314 const Uuid& getBoardUuid() const noexcept { return mBoardUuid; }
315 const Point& getCursorPos() const noexcept { return mCursorPos; }
323 QList<BoardZoneData>& getZones() noexcept { return mZones; }
324 QList<BoardPolygonData>& getPolygons() noexcept { return mPolygons; }
325 QList<BoardStrokeTextData>& getStrokeTexts() noexcept { return mStrokeTexts; }
326 QList<BoardHoleData>& getHoles() noexcept { return mHoles; }
327 QMap<std::pair<Uuid, Uuid>, Point>& getPadPositions() noexcept {
328 return mPadPositions;
329 }
330
331 // General Methods
332 std::unique_ptr<QMimeData> toMimeData() const;
333 static std::unique_ptr<BoardClipboardData> fromMimeData(
334 const QMimeData* mime);
335 static bool isValid(const QMimeData* mime) noexcept;
336
337 // Operator Overloadings
339
340private: // Methods
341 static QString getMimeType() noexcept;
342
343private: // Data
355};
356
357/*******************************************************************************
358 * End of File
359 ******************************************************************************/
360
361} // namespace editor
362} // namespace librepcb
363
364#endif
The Angle class is used to represent an angle (for example 12.75 degrees)
Definition angle.h:76
The BI_Plane class.
Definition bi_plane.h:52
ConnectStyle
Definition bi_plane.h:68
The BoardHoleData class.
Definition boardholedata.h:45
The BoardPolygonData class.
Definition boardpolygondata.h:45
The BoardStrokeTextData class.
Definition boardstroketextdata.h:49
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition boardstroketextdata.cpp:242
The BoardZoneData class.
Definition boardzonedata.h:44
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:59
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition path.cpp:392
The Point class is used to represent a point/coordinate/vector, for example (1.2mm; 5....
Definition point.h:78
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition point.cpp:136
The SExpression class.
Definition sexpression.h:69
SExpression & appendList(const QString &name)
Definition sexpression.cpp:212
QList< SExpression * > getChildren(Type type) noexcept
Definition sexpression.cpp:94
void ensureLineBreak()
Definition sexpression.cpp:206
void appendChild(std::unique_ptr< SExpression > child)
Definition sexpression.cpp:217
int append(const std::shared_ptr< T > &obj) noexcept
Definition serializableobjectlist.h:343
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition serializableobjectlist.h:380
The Signal class is used to emit signals on non-QObject derived classes.
Definition signalslot.h:65
Helper class to access a subdirectory of TransactionalFileSystem.
Definition transactionaldirectory.h:51
Transactional librepcb::FileSystem implementation.
Definition transactionalfilesystem.h:70
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition uuid.h:56
The BoardClipboardData class.
Definition boardclipboarddata.h:65
QMap< std::pair< Uuid, Uuid >, Point > mPadPositions
Definition boardclipboarddata.h:354
Uuid mBoardUuid
Definition boardclipboarddata.h:345
static QString getMimeType() noexcept
Definition boardclipboarddata.cpp:197
std::unique_ptr< QMimeData > toMimeData() const
Definition boardclipboarddata.cpp:122
QMap< std::pair< Uuid, Uuid >, Point > & getPadPositions() noexcept
Definition boardclipboarddata.h:327
SerializableObjectList< Device, Device > & getDevices() noexcept
Definition boardclipboarddata.h:316
SerializableObjectList< NetSegment, NetSegment > & getNetSegments() noexcept
Definition boardclipboarddata.h:319
std::unique_ptr< TransactionalDirectory > getDirectory(const QString &path="") noexcept
Definition boardclipboarddata.cpp:112
BoardClipboardData & operator=(const BoardClipboardData &rhs)=delete
SerializableObjectList< Device, Device > mDevices
Definition boardclipboarddata.h:347
QList< BoardZoneData > & getZones() noexcept
Definition boardclipboarddata.h:323
SerializableObjectList< NetSegment, NetSegment > mNetSegments
Definition boardclipboarddata.h:348
QList< BoardHoleData > & getHoles() noexcept
Definition boardclipboarddata.h:326
const Uuid & getBoardUuid() const noexcept
Definition boardclipboarddata.h:314
SerializableObjectList< Plane, Plane > mPlanes
Definition boardclipboarddata.h:349
const Point & getCursorPos() const noexcept
Definition boardclipboarddata.h:315
QList< BoardZoneData > mZones
Definition boardclipboarddata.h:350
QList< BoardStrokeTextData > & getStrokeTexts() noexcept
Definition boardclipboarddata.h:325
QList< BoardPolygonData > & getPolygons() noexcept
Definition boardclipboarddata.h:324
QList< BoardStrokeTextData > mStrokeTexts
Definition boardclipboarddata.h:352
static std::unique_ptr< BoardClipboardData > fromMimeData(const QMimeData *mime)
Definition boardclipboarddata.cpp:178
std::shared_ptr< TransactionalFileSystem > mFileSystem
Definition boardclipboarddata.h:344
~BoardClipboardData() noexcept
Definition boardclipboarddata.cpp:94
bool isEmpty() const noexcept
Definition boardclipboarddata.cpp:106
BoardClipboardData(const BoardClipboardData &other)=delete
QList< BoardPolygonData > mPolygons
Definition boardclipboarddata.h:351
static bool isValid(const QMimeData *mime) noexcept
Definition boardclipboarddata.cpp:189
QList< BoardHoleData > mHoles
Definition boardclipboarddata.h:353
SerializableObjectList< Plane, Plane > & getPlanes() noexcept
Definition boardclipboarddata.h:322
Point mCursorPos
Definition boardclipboarddata.h:346
Definition occmodel.cpp:77
type_safe::constrained_type< Length, PositiveLengthConstraint, PositiveLengthVerifier > PositiveLength
Definition length.h:810
type_safe::constrained_type< QString, CircuitIdentifierConstraint, CircuitIdentifierVerifier > CircuitIdentifier
Definition circuitidentifier.h:88
type_safe::constrained_type< Length, UnsignedLengthConstraint, UnsignedLengthVerifier > UnsignedLength
Definition length.h:694
AttributeKey deserialize(const SExpression &node)
Definition attributekey.h:99
Definition uuid.h:186
Definition boardclipboarddata.h:68
bool locked
Definition boardclipboarddata.h:77
QList< BoardStrokeTextData > strokeTexts
Definition boardclipboarddata.h:80
Angle rotation
Definition boardclipboarddata.h:75
bool glue
Definition boardclipboarddata.h:78
Device(const SExpression &node)
Definition boardclipboarddata.h:100
Uuid componentUuid
Definition boardclipboarddata.h:71
bool mirrored
Definition boardclipboarddata.h:76
Device(const Uuid &componentUuid, const Uuid &libDeviceUuid, const Uuid &libFootprintUuid, const Point &position, const Angle &rotation, bool mirrored, bool locked, bool glue, const AttributeList &attributes, const QList< BoardStrokeTextData > &strokeTexts)
Definition boardclipboarddata.h:83
bool operator!=(const Device &rhs) noexcept
Definition boardclipboarddata.h:138
AttributeList attributes
Definition boardclipboarddata.h:79
void serialize(SExpression &root) const
Definition boardclipboarddata.h:117
static constexpr const char * tagname
Definition boardclipboarddata.h:69
Uuid libFootprintUuid
Definition boardclipboarddata.h:73
Signal< Device > onEdited
Dummy event, not used.
Definition boardclipboarddata.h:81
Point position
Definition boardclipboarddata.h:74
Uuid libDeviceUuid
Definition boardclipboarddata.h:72
Definition boardclipboarddata.h:149
BoardPadDataList pads
Definition boardclipboarddata.h:153
JunctionList junctions
Definition boardclipboarddata.h:155
std::optional< CircuitIdentifier > netName
Definition boardclipboarddata.h:152
TraceList traces
Definition boardclipboarddata.h:156
NetSegment(const std::optional< CircuitIdentifier > &netName)
Definition boardclipboarddata.h:159
ViaList vias
Definition boardclipboarddata.h:154
NetSegment(const SExpression &node)
Definition boardclipboarddata.h:167
void serialize(SExpression &root) const
Definition boardclipboarddata.h:176
static constexpr const char * tagname
Definition boardclipboarddata.h:150
bool operator!=(const NetSegment &rhs) noexcept
Definition boardclipboarddata.h:190
Signal< NetSegment > onEdited
Dummy event, not used.
Definition boardclipboarddata.h:157
Definition boardclipboarddata.h:197
UnsignedLength minClearanceToBoard
Definition boardclipboarddata.h:206
bool locked
Definition boardclipboarddata.h:213
UnsignedLength minClearanceToCopper
Definition boardclipboarddata.h:205
Plane(const Uuid &uuid, const Layer &layer, const std::optional< CircuitIdentifier > &netSignalName, const Path &outline, const UnsignedLength &minWidth, const UnsignedLength &minClearanceToCopper, const UnsignedLength &minClearanceToBoard, const UnsignedLength &minClearanceToNpth, bool keepIslands, int priority, BI_Plane::ConnectStyle connectStyle, const PositiveLength &thermalGap, const PositiveLength &thermalSpokeWidth, bool locked)
Definition boardclipboarddata.h:216
Uuid uuid
Definition boardclipboarddata.h:200
bool keepIslands
Definition boardclipboarddata.h:208
UnsignedLength minClearanceToNpth
Definition boardclipboarddata.h:207
Plane(const SExpression &node)
Definition boardclipboarddata.h:241
Path outline
Definition boardclipboarddata.h:203
bool operator!=(const Plane &rhs) noexcept
Definition boardclipboarddata.h:288
UnsignedLength minWidth
Definition boardclipboarddata.h:204
PositiveLength thermalSpokeWidth
Definition boardclipboarddata.h:212
void serialize(SExpression &root) const
Definition boardclipboarddata.h:265
static constexpr const char * tagname
Definition boardclipboarddata.h:198
BI_Plane::ConnectStyle connectStyle
Definition boardclipboarddata.h:210
int priority
Definition boardclipboarddata.h:209
const Layer * layer
Definition boardclipboarddata.h:201
PositiveLength thermalGap
Definition boardclipboarddata.h:211
std::optional< CircuitIdentifier > netSignalName
Definition boardclipboarddata.h:202
Signal< Plane > onEdited
Dummy event, not used.
Definition boardclipboarddata.h:214