LibrePCB Developers Documentation
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  ******************************************************************************/
40 
41 #include <QtCore>
42 #include <QtWidgets>
43 
44 #include <memory>
45 
46 /*******************************************************************************
47  * Namespace / Forward Declarations
48  ******************************************************************************/
49 namespace librepcb {
50 
51 class Layer;
52 class TransactionalDirectory;
53 class TransactionalFileSystem;
54 
55 namespace editor {
56 
57 /*******************************************************************************
58  * Class BoardClipboardData
59  ******************************************************************************/
60 
64 class BoardClipboardData final {
65 public:
66  // Types
67  struct Device {
68  static constexpr const char* tagname = "device";
69 
75  bool mirrored;
76  bool locked;
78  QList<BoardStrokeTextData> strokeTexts;
80 
81  Device(const Uuid& componentUuid, const Uuid& libDeviceUuid,
82  const Uuid& libFootprintUuid, const Point& position,
83  const Angle& rotation, bool mirrored, bool locked,
84  const AttributeList& attributes,
85  const QList<BoardStrokeTextData>& strokeTexts)
86  : componentUuid(componentUuid),
87  libDeviceUuid(libDeviceUuid),
88  libFootprintUuid(libFootprintUuid),
89  position(position),
90  rotation(rotation),
91  mirrored(mirrored),
92  locked(locked),
93  attributes(attributes),
94  strokeTexts(strokeTexts),
95  onEdited(*this) {}
96 
97  explicit Device(const SExpression& node)
98  : componentUuid(deserialize<Uuid>(node.getChild("@0"))),
99  libDeviceUuid(deserialize<Uuid>(node.getChild("lib_device/@0"))),
100  libFootprintUuid(deserialize<Uuid>(node.getChild("lib_footprint/@0"))),
101  position(node.getChild("position")),
102  rotation(deserialize<Angle>(node.getChild("rotation/@0"))),
103  mirrored(deserialize<bool>(node.getChild("flip/@0"))),
104  locked(deserialize<bool>(node.getChild("lock/@0"))),
105  attributes(node),
106  strokeTexts(),
107  onEdited(*this) {
108  foreach (const SExpression* child, node.getChildren("stroke_text")) {
109  strokeTexts.append(BoardStrokeTextData(*child));
110  }
111  }
112 
113  void serialize(SExpression& root) const {
114  root.appendChild(componentUuid);
115  root.ensureLineBreak();
116  root.appendChild("lib_device", libDeviceUuid);
117  root.ensureLineBreak();
118  root.appendChild("lib_footprint", libFootprintUuid);
119  root.ensureLineBreak();
120  position.serialize(root.appendList("position"));
121  root.appendChild("rotation", rotation);
122  root.appendChild("flip", mirrored);
123  root.appendChild("lock", locked);
124  root.ensureLineBreak();
125  attributes.serialize(root);
126  foreach (const BoardStrokeTextData& strokeText, strokeTexts) {
127  root.ensureLineBreak();
128  strokeText.serialize(root.appendList("stroke_text"));
129  }
130  root.ensureLineBreak();
131  }
132 
133  bool operator!=(const Device& rhs) noexcept {
134  return (componentUuid != rhs.componentUuid) ||
135  (libDeviceUuid != rhs.libDeviceUuid) ||
136  (libFootprintUuid != rhs.libFootprintUuid) ||
137  (position != rhs.position) || (rotation != rhs.rotation) ||
138  (mirrored != rhs.mirrored) || (locked != rhs.locked) ||
139  (attributes != rhs.attributes) || (strokeTexts != rhs.strokeTexts);
140  }
141  };
142 
143  struct NetSegment {
144  static constexpr const char* tagname = "netsegment";
145 
146  tl::optional<CircuitIdentifier> netName;
151 
152  explicit NetSegment(const tl::optional<CircuitIdentifier>& netName)
153  : netName(netName), vias(), junctions(), traces(), onEdited(*this) {}
154 
155  explicit NetSegment(const SExpression& node)
156  : netName(deserialize<tl::optional<CircuitIdentifier>>(
157  node.getChild("net/@0"))),
158  vias(node),
159  junctions(node),
160  traces(node),
161  onEdited(*this) {}
162 
163  void serialize(SExpression& root) const {
164  root.ensureLineBreak();
165  root.appendChild("net", netName);
166  root.ensureLineBreak();
167  vias.serialize(root);
168  root.ensureLineBreak();
169  junctions.serialize(root);
170  root.ensureLineBreak();
171  traces.serialize(root);
172  root.ensureLineBreak();
173  }
174 
175  bool operator!=(const NetSegment& rhs) noexcept {
176  return (netName != rhs.netName) || (vias != rhs.vias) ||
177  (junctions != rhs.junctions) || (traces != rhs.traces);
178  }
179  };
180 
181  struct Plane {
182  static constexpr const char* tagname = "plane";
183 
185  const Layer* layer;
186  tl::optional<CircuitIdentifier> netSignalName;
191  int priority;
195  bool locked;
197 
198  Plane(const Uuid& uuid, const Layer& layer,
199  const tl::optional<CircuitIdentifier>& netSignalName,
200  const Path& outline, const UnsignedLength& minWidth,
201  const UnsignedLength& minClearance, bool keepIslands, int priority,
202  BI_Plane::ConnectStyle connectStyle, const PositiveLength& thermalGap,
203  const PositiveLength& thermalSpokeWidth, bool locked)
204  : uuid(uuid),
205  layer(&layer),
206  netSignalName(netSignalName),
207  outline(outline),
208  minWidth(minWidth),
209  minClearance(minClearance),
210  keepIslands(keepIslands),
211  priority(priority),
212  connectStyle(connectStyle),
213  thermalGap(thermalGap),
214  thermalSpokeWidth(thermalSpokeWidth),
215  locked(locked),
216  onEdited(*this) {}
217 
218  explicit Plane(const SExpression& node)
219  : uuid(deserialize<Uuid>(node.getChild("@0"))),
220  layer(deserialize<const Layer*>(node.getChild("layer/@0"))),
221  netSignalName(deserialize<tl::optional<CircuitIdentifier>>(
222  node.getChild("net/@0"))),
223  outline(node),
224  minWidth(deserialize<UnsignedLength>(node.getChild("min_width/@0"))),
225  minClearance(
226  deserialize<UnsignedLength>(node.getChild("min_clearance/@0"))),
227  keepIslands(deserialize<bool>(node.getChild("keep_islands/@0"))),
228  priority(deserialize<int>(node.getChild("priority/@0"))),
229  connectStyle(deserialize<BI_Plane::ConnectStyle>(
230  node.getChild("connect_style/@0"))),
231  thermalGap(
232  deserialize<PositiveLength>(node.getChild("thermal_gap/@0"))),
233  thermalSpokeWidth(
234  deserialize<PositiveLength>(node.getChild("thermal_spoke/@0"))),
235  locked(deserialize<bool>(node.getChild("lock/@0"))),
236  onEdited(*this) {}
237 
238  void serialize(SExpression& root) const {
239  root.appendChild(uuid);
240  root.appendChild("layer", *layer);
241  root.ensureLineBreak();
242  root.appendChild("net", netSignalName);
243  root.appendChild("priority", priority);
244  root.ensureLineBreak();
245  root.appendChild("min_width", minWidth);
246  root.appendChild("min_clearance", minClearance);
247  root.appendChild("thermal_gap", thermalGap);
248  root.appendChild("thermal_spoke", thermalSpokeWidth);
249  root.ensureLineBreak();
250  root.appendChild("connect_style", connectStyle);
251  root.appendChild("keep_islands", keepIslands);
252  root.appendChild("lock", locked);
253  root.ensureLineBreak();
254  outline.serialize(root);
255  root.ensureLineBreak();
256  }
257 
258  bool operator!=(const Plane& rhs) noexcept {
259  return (uuid != rhs.uuid) || (layer != rhs.layer) ||
260  (netSignalName != rhs.netSignalName) || (outline != rhs.outline) ||
261  (minWidth != rhs.minWidth) || (minClearance != rhs.minClearance) ||
262  (keepIslands != rhs.keepIslands) || (priority != rhs.priority) ||
263  (connectStyle != rhs.connectStyle) ||
264  (thermalGap != rhs.thermalGap) ||
265  (thermalSpokeWidth != rhs.thermalSpokeWidth) ||
266  (locked != rhs.locked);
267  }
268  };
269 
270  // Constructors / Destructor
271  BoardClipboardData() = delete;
272  BoardClipboardData(const BoardClipboardData& other) = delete;
273  BoardClipboardData(const Uuid& boardUuid, const Point& cursorPos) noexcept;
274  explicit BoardClipboardData(const QByteArray& mimeData);
275  ~BoardClipboardData() noexcept;
276 
277  // Getters
278  bool isEmpty() const noexcept;
279  std::unique_ptr<TransactionalDirectory> getDirectory(
280  const QString& path = "") noexcept;
281  const Uuid& getBoardUuid() const noexcept { return mBoardUuid; }
282  const Point& getCursorPos() const noexcept { return mCursorPos; }
284  return mDevices;
285  }
287  return mNetSegments;
288  }
290  QList<BoardZoneData>& getZones() noexcept { return mZones; }
291  QList<BoardPolygonData>& getPolygons() noexcept { return mPolygons; }
292  QList<BoardStrokeTextData>& getStrokeTexts() noexcept { return mStrokeTexts; }
293  QList<BoardHoleData>& getHoles() noexcept { return mHoles; }
294  QMap<std::pair<Uuid, Uuid>, Point>& getPadPositions() noexcept {
295  return mPadPositions;
296  }
297 
298  // General Methods
299  std::unique_ptr<QMimeData> toMimeData() const;
300  static std::unique_ptr<BoardClipboardData> fromMimeData(
301  const QMimeData* mime);
302 
303  // Operator Overloadings
304  BoardClipboardData& operator=(const BoardClipboardData& rhs) = delete;
305 
306 private: // Methods
307  static QString getMimeType() noexcept;
308 
309 private: // Data
310  std::shared_ptr<TransactionalFileSystem> mFileSystem;
316  QList<BoardZoneData> mZones;
317  QList<BoardPolygonData> mPolygons;
318  QList<BoardStrokeTextData> mStrokeTexts;
319  QList<BoardHoleData> mHoles;
320  QMap<std::pair<Uuid, Uuid>, Point> mPadPositions;
321 };
322 
323 /*******************************************************************************
324  * End of File
325  ******************************************************************************/
326 
327 } // namespace editor
328 } // namespace librepcb
329 
330 #endif
~BoardClipboardData() noexcept
Definition: boardclipboarddata.cpp:94
UnsignedLength minWidth
Definition: boardclipboarddata.h:188
void serialize(SExpression &root) const
Definition: boardclipboarddata.h:113
const Layer * layer
Definition: boardclipboarddata.h:185
Path outline
Definition: boardclipboarddata.h:187
bool operator!=(const Plane &rhs) noexcept
Definition: boardclipboarddata.h:258
void ensureLineBreak()
Definition: sexpression.cpp:206
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: point.cpp:136
const Uuid & getBoardUuid() const noexcept
Definition: boardclipboarddata.h:281
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: boardstroketextdata.cpp:242
Definition: boardclipboarddata.h:143
QList< BoardStrokeTextData > strokeTexts
Definition: boardclipboarddata.h:78
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: serializableobjectlist.h:379
Definition: occmodel.cpp:77
Angle rotation
Definition: boardclipboarddata.h:74
Plane(const Uuid &uuid, const Layer &layer, const tl::optional< CircuitIdentifier > &netSignalName, const Path &outline, const UnsignedLength &minWidth, const UnsignedLength &minClearance, bool keepIslands, int priority, BI_Plane::ConnectStyle connectStyle, const PositiveLength &thermalGap, const PositiveLength &thermalSpokeWidth, bool locked)
Definition: boardclipboarddata.h:198
The Layer class provides all supported geometry layers.
Definition: layer.h:40
Plane(const SExpression &node)
Definition: boardclipboarddata.h:218
TraceList traces
Definition: boardclipboarddata.h:149
const Point & getCursorPos() const noexcept
Definition: boardclipboarddata.h:282
QList< BoardZoneData > & getZones() noexcept
Definition: boardclipboarddata.h:290
Definition: boardclipboarddata.h:181
JunctionList junctions
Definition: boardclipboarddata.h:148
SExpression & appendList(const QString &name)
Definition: sexpression.cpp:212
bool operator!=(const NetSegment &rhs) noexcept
Definition: boardclipboarddata.h:175
AttributeList attributes
Definition: boardclipboarddata.h:77
The Angle class is used to represent an angle (for example 12.75 degrees)
Definition: angle.h:78
SerializableObjectList< NetSegment, NetSegment > & getNetSegments() noexcept
Definition: boardclipboarddata.h:286
PositiveLength thermalSpokeWidth
Definition: boardclipboarddata.h:194
NetSegment(const SExpression &node)
Definition: boardclipboarddata.h:155
Uuid componentUuid
Definition: boardclipboarddata.h:70
QList< BoardStrokeTextData > mStrokeTexts
Definition: boardclipboarddata.h:318
Signal< Plane > onEdited
Dummy event, not used.
Definition: boardclipboarddata.h:196
ViaList vias
Definition: boardclipboarddata.h:147
QList< BoardPolygonData > & getPolygons() noexcept
Definition: boardclipboarddata.h:291
SerializableObjectList< Plane, Plane > & getPlanes() noexcept
Definition: boardclipboarddata.h:289
std::shared_ptr< TransactionalFileSystem > mFileSystem
Definition: boardclipboarddata.h:310
The Point class is used to represent a point/coordinate/vector, for example (1.2mm; 5...
Definition: point.h:79
QList< BoardZoneData > mZones
Definition: boardclipboarddata.h:316
bool mirrored
Definition: boardclipboarddata.h:75
Uuid libFootprintUuid
Definition: boardclipboarddata.h:72
QList< BoardStrokeTextData > & getStrokeTexts() noexcept
Definition: boardclipboarddata.h:292
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: path.cpp:335
bool operator!=(const Device &rhs) noexcept
Definition: boardclipboarddata.h:133
void appendChild(std::unique_ptr< SExpression > child)
Definition: sexpression.cpp:217
Device(const Uuid &componentUuid, const Uuid &libDeviceUuid, const Uuid &libFootprintUuid, const Point &position, const Angle &rotation, bool mirrored, bool locked, const AttributeList &attributes, const QList< BoardStrokeTextData > &strokeTexts)
Definition: boardclipboarddata.h:81
The BoardClipboardData class.
Definition: boardclipboarddata.h:64
void serialize(SExpression &root) const
Definition: boardclipboarddata.h:163
static QString getMimeType() noexcept
Definition: boardclipboarddata.cpp:193
type_safe::constrained_type< QString, CircuitIdentifierConstraint, CircuitIdentifierVerifier > CircuitIdentifier
Definition: circuitidentifier.h:96
SerializableObjectList< Device, Device > & getDevices() noexcept
Definition: boardclipboarddata.h:283
The BI_Plane class.
Definition: bi_plane.h:52
Signal< NetSegment > onEdited
Dummy event, not used.
Definition: boardclipboarddata.h:150
QMap< std::pair< Uuid, Uuid >, Point > mPadPositions
Definition: boardclipboarddata.h:320
AttributeKey deserialize(const SExpression &node)
Definition: attributekey.h:105
void serialize(SExpression &root) const
Definition: boardclipboarddata.h:238
Signal< Device > onEdited
Dummy event, not used.
Definition: boardclipboarddata.h:79
Definition: uuid.h:183
SerializableObjectList< Plane, Plane > mPlanes
Definition: boardclipboarddata.h:315
tl::optional< CircuitIdentifier > netName
Definition: boardclipboarddata.h:146
The Path class represents a list of vertices connected by straight lines or circular arc segments...
Definition: path.h:58
static constexpr const char * tagname
Definition: boardclipboarddata.h:68
The Signal class is used to emit signals on non-QObject derived classes.
Definition: signalslot.h:65
QList< SExpression * > getChildren(Type type) noexcept
Definition: sexpression.cpp:94
static std::unique_ptr< BoardClipboardData > fromMimeData(const QMimeData *mime)
Definition: boardclipboarddata.cpp:178
bool locked
Definition: boardclipboarddata.h:195
ConnectStyle
Definition: bi_plane.h:68
Point mCursorPos
Definition: boardclipboarddata.h:312
type_safe::constrained_type< Length, PositiveLengthConstraint, PositiveLengthVerifier > PositiveLength
Definition: length.h:812
QList< BoardHoleData > & getHoles() noexcept
Definition: boardclipboarddata.h:293
tl::optional< CircuitIdentifier > netSignalName
Definition: boardclipboarddata.h:186
QList< BoardHoleData > mHoles
Definition: boardclipboarddata.h:319
SerializableObjectList< NetSegment, NetSegment > mNetSegments
Definition: boardclipboarddata.h:314
Uuid mBoardUuid
Definition: boardclipboarddata.h:311
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition: uuid.h:58
QMap< std::pair< Uuid, Uuid >, Point > & getPadPositions() noexcept
Definition: boardclipboarddata.h:294
bool keepIslands
Definition: boardclipboarddata.h:190
bool locked
Definition: boardclipboarddata.h:76
bool isEmpty() const noexcept
Definition: boardclipboarddata.cpp:106
SerializableObjectList< Device, Device > mDevices
Definition: boardclipboarddata.h:313
PositiveLength thermalGap
Definition: boardclipboarddata.h:193
BoardClipboardData & operator=(const BoardClipboardData &rhs)=delete
std::unique_ptr< TransactionalDirectory > getDirectory(const QString &path="") noexcept
Definition: boardclipboarddata.cpp:112
UnsignedLength minClearance
Definition: boardclipboarddata.h:189
The BoardStrokeTextData class.
Definition: boardstroketextdata.h:49
std::unique_ptr< QMimeData > toMimeData() const
Definition: boardclipboarddata.cpp:122
The SExpression class.
Definition: sexpression.h:69
Point position
Definition: boardclipboarddata.h:73
int priority
Definition: boardclipboarddata.h:191
Device(const SExpression &node)
Definition: boardclipboarddata.h:97
BI_Plane::ConnectStyle connectStyle
Definition: boardclipboarddata.h:192
type_safe::constrained_type< Length, UnsignedLengthConstraint, UnsignedLengthVerifier > UnsignedLength
Definition: length.h:696
Uuid libDeviceUuid
Definition: boardclipboarddata.h:71
QList< BoardPolygonData > mPolygons
Definition: boardclipboarddata.h:317
Uuid uuid
Definition: boardclipboarddata.h:184
NetSegment(const tl::optional< CircuitIdentifier > &netName)
Definition: boardclipboarddata.h:152
Definition: boardclipboarddata.h:67