SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
graphicsitems.h
Go to the documentation of this file.
1
8#ifndef GRAPHICSITEMS_H
9#define GRAPHICSITEMS_H
10
11#include <QGraphicsEllipseItem>
12#include <QGraphicsPathItem>
13#include <QGraphicsPolygonItem>
14#include <QGraphicsPixmapItem>
15#include <QGraphicsRectItem>
16#include <QGraphicsSimpleTextItem>
17#include <QPainterPath>
18#include <QPointF>
19#include <QVariantMap>
20#include <QVector>
21
23
25
26// ============================================================================
27// Item type IDs (QGraphicsItem::UserType + N)
28// ============================================================================
30{
31 NodeItemType = QGraphicsItem::UserType + 1,
32 LinkItemType = QGraphicsItem::UserType + 2,
33 CatchmentItemType = QGraphicsItem::UserType + 3,
34 VectorPointItemType = QGraphicsItem::UserType + 4,
35 VectorLineItemType = QGraphicsItem::UserType + 5,
36 VectorPolygonItemType = QGraphicsItem::UserType + 6,
37 RasterTileItemType = QGraphicsItem::UserType + 7,
38 MeasureVertexItemType = QGraphicsItem::UserType + 8,
39 MeasureSegmentItemType = QGraphicsItem::UserType + 9,
40 IdentifyCrossItemType = QGraphicsItem::UserType + 10,
41 ScaleBarItemType = QGraphicsItem::UserType + 11,
42 CoordDisplayItemType = QGraphicsItem::UserType + 12,
43 VectorPolygonPathItemType = QGraphicsItem::UserType + 13,
44};
45
46// ============================================================================
47// NodeGraphicsItem — SWMM nodes (junctions, outfalls, storages, dividers)
48// ============================================================================
49class NodeGraphicsItem : public QGraphicsEllipseItem
50{
51public:
53
54 explicit NodeGraphicsItem(const QString &name,
55 double sceneX, double sceneY,
56 double radius,
58 QGraphicsItem *parent = nullptr);
59
60 int type() const override { return NodeItemType; }
61
62 [[nodiscard]] QString elementName() const { return m_name; }
63 [[nodiscard]] NodeShape nodeShape() const { return m_shape; }
64
65 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
66 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
67
69 void setResultValue(double value, const QColor &color);
70 void clearResultValue();
71
72 void setElementRadius(double r);
73 void setHighlighted(bool on);
74
75 void paint(QPainter *painter,
76 const QStyleOptionGraphicsItem *option,
77 QWidget *widget) override;
78
79 [[nodiscard]] QPainterPath shape() const override;
80
81 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
82 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
83
84private:
85 QString m_name;
86 NodeShape m_shape = Circle;
87 QVariantMap m_attrs;
88 double m_radius = 4.0;
89 bool m_highlighted = false;
90 bool m_hasResult = false;
91 OpenSWMMVisLayer *m_ownerLayer = nullptr;
92};
93
94// ============================================================================
95// LinkGraphicsItem — SWMM links (conduits, pumps, orifices, weirs)
96// ============================================================================
97class LinkGraphicsItem : public QGraphicsPathItem
98{
99public:
100 explicit LinkGraphicsItem(const QString &name,
101 const QVector<QPointF> &vertices,
102 QGraphicsItem *parent = nullptr);
103
104 int type() const override { return LinkItemType; }
105
106 [[nodiscard]] QString elementName() const { return m_name; }
107
108 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
109 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
110
111 void setResultValue(double value, const QColor &color);
112 void clearResultValue();
113
114 void setHighlighted(bool on);
115 void setVertices(const QVector<QPointF> &vertices);
116
117 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
118 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
119
120private:
121 QString m_name;
122 QVariantMap m_attrs;
123 bool m_highlighted = false;
124 bool m_hasResult = false;
125 OpenSWMMVisLayer *m_ownerLayer = nullptr;
126};
127
128// ============================================================================
129// CatchmentGraphicsItem — SWMM subcatchments
130// ============================================================================
131class CatchmentGraphicsItem : public QGraphicsPolygonItem
132{
133public:
134 explicit CatchmentGraphicsItem(const QString &name,
135 const QPolygonF &polygon,
136 QGraphicsItem *parent = nullptr);
137
138 int type() const override { return CatchmentItemType; }
139
140 [[nodiscard]] QString elementName() const { return m_name; }
141
142 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
143 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
144
145 void setResultValue(double value, const QColor &color);
146 void clearResultValue();
147
148 void setHighlighted(bool on);
149
150 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
151 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
152
153private:
154 QString m_name;
155 QVariantMap m_attrs;
156 bool m_highlighted = false;
157 OpenSWMMVisLayer *m_ownerLayer = nullptr;
158};
159
160// ============================================================================
161// VectorPointItem — OGR point feature
162// ============================================================================
163class VectorPointItem : public QGraphicsEllipseItem
164{
165public:
166 explicit VectorPointItem(qint64 fid,
167 double sceneX, double sceneY,
168 double radius,
169 QGraphicsItem *parent = nullptr);
170
171 int type() const override { return VectorPointItemType; }
172
173 [[nodiscard]] qint64 featureId() const { return m_fid; }
174
175 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
176 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
177
178 void setHighlighted(bool on);
179 void setElementRadius(double r);
180
184 void setMarkerShape(int shapeValue) { m_shape = shapeValue; update(); }
185 [[nodiscard]] int markerShape() const { return m_shape; }
186
187 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
188 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
189
190protected:
191 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
192 QWidget *widget) override;
193
194private:
195 qint64 m_fid;
196 QVariantMap m_attrs;
197 bool m_highlighted = false;
198 int m_shape = 0; // canonical MarkerShape::Circle
199 OpenSWMMVisLayer *m_ownerLayer = nullptr;
200};
201
202// ============================================================================
203// VectorLineItem — OGR line feature
204// ============================================================================
205class VectorLineItem : public QGraphicsPathItem
206{
207public:
208 explicit VectorLineItem(qint64 fid,
209 const QVector<QPointF> &vertices,
210 QGraphicsItem *parent = nullptr);
211
212 int type() const override { return VectorLineItemType; }
213
214 [[nodiscard]] qint64 featureId() const { return m_fid; }
215
216 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
217 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
218
219 void setHighlighted(bool on);
220 void setVertices(const QVector<QPointF> &vertices);
221
222 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
223 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
224
225private:
226 qint64 m_fid;
227 QVariantMap m_attrs;
228 bool m_highlighted = false;
229 OpenSWMMVisLayer *m_ownerLayer = nullptr;
230};
231
232// ============================================================================
233// VectorPolygonItem — OGR polygon feature
234// ============================================================================
235class VectorPolygonItem : public QGraphicsPolygonItem
236{
237public:
238 explicit VectorPolygonItem(qint64 fid,
239 const QPolygonF &polygon,
240 QGraphicsItem *parent = nullptr);
241
242 int type() const override { return VectorPolygonItemType; }
243
244 [[nodiscard]] qint64 featureId() const { return m_fid; }
245
246 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
247 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
248
249 void setHighlighted(bool on);
250
251 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
252 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
253
254private:
255 qint64 m_fid;
256 QVariantMap m_attrs;
257 bool m_highlighted = false;
258 OpenSWMMVisLayer *m_ownerLayer = nullptr;
259};
260
261// ============================================================================
262// VectorPolygonPathItem — OGR polygon feature WITH interior rings (holes)
263// ============================================================================
264// Path-based sibling of VectorPolygonItem: builds a QPainterPath from the
265// exterior ring plus every interior ring using the odd-even fill rule, so the
266// fill correctly excludes the holes and hit-testing misses points in a hole.
267// Takes rings as plain point vectors (scene coords) to avoid a header
268// dependency on core/editgeometry.h.
269class VectorPolygonPathItem : public QGraphicsPathItem
270{
271public:
272 explicit VectorPolygonPathItem(qint64 fid,
273 const QVector<QPointF> &exterior,
274 const QVector<QVector<QPointF>> &interiors = {},
275 QGraphicsItem *parent = nullptr);
276
277 int type() const override { return VectorPolygonPathItemType; }
278
279 [[nodiscard]] qint64 featureId() const { return m_fid; }
280
281 void setAttributes(const QVariantMap &attrs) { m_attrs = attrs; }
282 [[nodiscard]] QVariantMap attributes() const { return m_attrs; }
283
284 void setHighlighted(bool on);
285
286 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
287 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
288
289private:
290 qint64 m_fid;
291 QVariantMap m_attrs;
292 bool m_highlighted = false;
293 OpenSWMMVisLayer *m_ownerLayer = nullptr;
294};
295
296// ============================================================================
297// RasterTileItem — for raster / WMS / WMTS image tiles
298// ============================================================================
299class RasterTileItem : public QGraphicsPixmapItem
300{
301public:
302 explicit RasterTileItem(const QPixmap &pixmap,
303 const QRectF &sceneRect,
304 QGraphicsItem *parent = nullptr);
305
306 int type() const override { return RasterTileItemType; }
307
308 void updateTile(const QPixmap &pixmap, const QRectF &sceneRect);
309
310 void setOwnerLayer(OpenSWMMVisLayer *layer) { m_ownerLayer = layer; }
311 [[nodiscard]] OpenSWMMVisLayer *ownerLayer() const { return m_ownerLayer; }
312
313private:
314 OpenSWMMVisLayer *m_ownerLayer = nullptr;
315};
316
317// ============================================================================
318// ScaleBarItem — always-visible scale bar (painted in view coordinates)
319// ============================================================================
320class ScaleBarItem : public QGraphicsItem
321{
322public:
323 explicit ScaleBarItem(QGraphicsItem *parent = nullptr);
324
325 int type() const override { return ScaleBarItemType; }
326
327 QRectF boundingRect() const override;
328 void paint(QPainter *painter,
329 const QStyleOptionGraphicsItem *option,
330 QWidget *widget) override;
331
332 void setMapUnitsPerPixel(double mpp) { m_mapUnitsPerPixel = mpp; }
333 void setMetresPerPixel(double mpp) { m_metresPerPixel = mpp; }
334 void setSettings(ScaleBarSettings *settings) { m_settings = settings; }
335 void setRawCRS(bool raw) { m_rawCRS = raw; }
336
337private:
338 double m_mapUnitsPerPixel = 1.0;
339 double m_metresPerPixel = 1.0;
340 bool m_rawCRS = false;
341 ScaleBarSettings *m_settings = nullptr;
342};
343
344// ============================================================================
345// CoordDisplayItem — always-visible coordinate readout (view coordinates)
346// ============================================================================
347class CoordDisplayItem : public QGraphicsItem
348{
349public:
350 explicit CoordDisplayItem(QGraphicsItem *parent = nullptr);
351
352 int type() const override { return CoordDisplayItemType; }
353
354 QRectF boundingRect() const override;
355 void paint(QPainter *painter,
356 const QStyleOptionGraphicsItem *option,
357 QWidget *widget) override;
358
359 void setCoordinates(double x, double y);
360
361private:
362 double m_x = 0.0;
363 double m_y = 0.0;
364};
365
366#endif // GRAPHICSITEMS_H
Definition graphicsitems.h:132
QString elementName() const
Definition graphicsitems.h:140
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:150
void setResultValue(double value, const QColor &color)
Definition graphicsitems.cpp:197
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:151
void clearResultValue()
Definition graphicsitems.cpp:203
QVariantMap attributes() const
Definition graphicsitems.h:143
int type() const override
Definition graphicsitems.h:138
void setHighlighted(bool on)
Definition graphicsitems.cpp:208
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:142
Definition graphicsitems.h:348
void setCoordinates(double x, double y)
Definition graphicsitems.cpp:489
int type() const override
Definition graphicsitems.h:352
QRectF boundingRect() const override
Definition graphicsitems.cpp:465
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition graphicsitems.cpp:470
Definition graphicsitems.h:50
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:81
QPainterPath shape() const override
Definition graphicsitems.cpp:122
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:82
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition graphicsitems.cpp:66
void setResultValue(double value, const QColor &color)
Definition graphicsitems.cpp:47
int type() const override
Definition graphicsitems.h:60
QString elementName() const
Definition graphicsitems.h:62
void setHighlighted(bool on)
Definition graphicsitems.cpp:60
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:65
QVariantMap attributes() const
Definition graphicsitems.h:66
void clearResultValue()
Definition graphicsitems.cpp:54
NodeShape nodeShape() const
Definition graphicsitems.h:63
void setElementRadius(double r)
Definition graphicsitems.cpp:41
NodeShape
Definition graphicsitems.h:52
@ Circle
Definition graphicsitems.h:52
@ Square
Definition graphicsitems.h:52
@ Triangle
Definition graphicsitems.h:52
@ Diamond
Definition graphicsitems.h:52
Abstract base class for all layers displayed in the MapCanvas.
Definition openswmmvislayer.h:116
Definition graphicsitems.h:300
void updateTile(const QPixmap &pixmap, const QRectF &sceneRect)
Definition graphicsitems.cpp:391
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:311
int type() const override
Definition graphicsitems.h:306
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:310
Definition graphicsitems.h:321
void setRawCRS(bool raw)
Definition graphicsitems.h:335
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition graphicsitems.cpp:417
int type() const override
Definition graphicsitems.h:325
void setMapUnitsPerPixel(double mpp)
Definition graphicsitems.h:332
void setSettings(ScaleBarSettings *settings)
Definition graphicsitems.h:334
QRectF boundingRect() const override
Definition graphicsitems.cpp:412
void setMetresPerPixel(double mpp)
Definition graphicsitems.h:333
Holds all configurable appearance properties for the map scale bar.
Definition scalebarsettings.h:26
Definition graphicsitems.h:206
qint64 featureId() const
Definition graphicsitems.h:214
void setVertices(const QVector< QPointF > &vertices)
Definition graphicsitems.cpp:291
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:223
void setHighlighted(bool on)
Definition graphicsitems.cpp:283
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:222
QVariantMap attributes() const
Definition graphicsitems.h:217
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:216
int type() const override
Definition graphicsitems.h:212
Definition graphicsitems.h:164
void setMarkerShape(int shapeValue)
Definition graphicsitems.h:184
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:187
QVariantMap attributes() const
Definition graphicsitems.h:176
qint64 featureId() const
Definition graphicsitems.h:173
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:175
void setElementRadius(double r)
Definition graphicsitems.cpp:240
int type() const override
Definition graphicsitems.h:171
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition graphicsitems.cpp:247
int markerShape() const
Definition graphicsitems.h:185
void setHighlighted(bool on)
Definition graphicsitems.cpp:232
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:188
Definition graphicsitems.h:236
int type() const override
Definition graphicsitems.h:242
qint64 featureId() const
Definition graphicsitems.h:244
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:251
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:252
void setHighlighted(bool on)
Definition graphicsitems.cpp:317
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:246
QVariantMap attributes() const
Definition graphicsitems.h:247
Definition graphicsitems.h:270
void setOwnerLayer(OpenSWMMVisLayer *layer)
Definition graphicsitems.h:286
OpenSWMMVisLayer * ownerLayer() const
Definition graphicsitems.h:287
qint64 featureId() const
Definition graphicsitems.h:279
void setHighlighted(bool on)
Definition graphicsitems.cpp:364
int type() const override
Definition graphicsitems.h:277
QVariantMap attributes() const
Definition graphicsitems.h:282
void setAttributes(const QVariantMap &attrs)
Definition graphicsitems.h:281
OpenSWMMVisItemType
Definition graphicsitems.h:30
@ MeasureVertexItemType
Definition graphicsitems.h:38
@ ScaleBarItemType
Definition graphicsitems.h:41
@ CatchmentItemType
Definition graphicsitems.h:33
@ CoordDisplayItemType
Definition graphicsitems.h:42
@ MeasureSegmentItemType
Definition graphicsitems.h:39
@ VectorPolygonItemType
Definition graphicsitems.h:36
@ VectorLineItemType
Definition graphicsitems.h:35
@ RasterTileItemType
Definition graphicsitems.h:37
@ VectorPointItemType
Definition graphicsitems.h:34
@ LinkItemType
Definition graphicsitems.h:32
@ IdentifyCrossItemType
Definition graphicsitems.h:40
@ VectorPolygonPathItemType
Definition graphicsitems.h:43
@ NodeItemType
Definition graphicsitems.h:31
QVector< int > parent
union-find
Definition pslgminsize.cpp:176
Configurable appearance settings for the map scale bar.
QString name
Definition sectionmodelbuilders.cpp:474