Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/gui/div/GUIViewObjectsHandler.h
193678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GUIViewObjectsHandler.h
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 22
17
///
18
// class used for handle objects over view
19
/****************************************************************************/
20
#pragma once
21
#include <config.h>
22
23
#include <vector>
24
#include <unordered_map>
25
#include <utils/geom/Triangle.h>
26
#include <utils/gui/globjects/GUIGlObject.h>
27
#include <utils/gui/settings/GUIVisualizationSettings.h>
28
29
// ===========================================================================
30
// class declaration
31
// ===========================================================================
32
33
class GNEJunction;
34
class GNEEdge;
35
class GNELane;
36
class GNERoute;
37
class GNEPathElement;
38
class GNESegment;
39
40
// ===========================================================================
41
// class definitions
42
// ===========================================================================
43
44
class GUIViewObjectsHandler {
45
46
public:
47
/// @brief object container
48
struct ObjectContainer {
49
50
/// @brief parameter constructor
51
ObjectContainer(const GUIGlObject* object_) :
52
object(object_) {}
53
54
/// @brief object
55
const GUIGlObject* object = nullptr;
56
57
/// @brief vector with geometry points
58
std::vector<int> geometryPoints;
59
60
/// @brief position over shape
61
Position posOverShape = Position::INVALID;
62
63
/// @brief offset of position over shape
64
double offset = 0;
65
};
66
67
/// @brief object container layer
68
struct ObjectContainerLayer : public std::vector<ObjectContainer> {
69
70
/// @brief parameter constructor
71
ObjectContainerLayer() {}
72
73
// @brief append object container and resize if neccesary
74
void append(const ObjectContainer& objectContainer);
75
};
76
77
/// @brief typedef for pack elements sorted by layer
78
typedef std::map<double, ObjectContainerLayer > GLObjectsSortedContainer;
79
80
/// @brief constructor
81
GUIViewObjectsHandler();
82
83
/// @brief reset view objects handler
84
void reset();
85
86
/// @name position and boundary functions. used for defining the posion that will be check (usually the mouse position)
87
/// @{
88
/// @brief get selection position
89
const Position& getSelectionPosition() const;
90
91
/// @brief get selection triangle
92
const Triangle& getSelectionTriangle() const;
93
94
/// @brief set selection position
95
void setSelectionPosition(const Position& pos);
96
97
/// @brief set selection triangle
98
void setSelectionTriangle(const Triangle& triangle);
99
100
/// @brief return true if we're selecting using a triangle
101
bool selectingUsingRectangle() const;
102
103
/// @}
104
105
/// @name check functions. If the result is positive, the given GLObject will be added to elementUnderCursor
106
/// @{
107
/// @brief check boundary parent element
108
bool checkBoundaryParentObject(const GUIGlObject* GLObject, const double layer, const GUIGlObject* parent);
109
110
/// @brief check if mouse is within elements geometry (for circles)
111
bool checkCircleObject(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject,
112
const Position& center, const double radius, const double layer);
113
114
/// @brief check if mouse is within geometry point
115
bool checkGeometryPoint(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject,
116
const PositionVector& shape, const int index, const double layer, const double radius);
117
118
/// @brief check if mouse is within geometry point
119
bool checkPositionOverShape(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject,
120
const PositionVector& shape, const double layer, const double distance);
121
122
/// @brief check (closed) shape element
123
bool checkShapeObject(const GUIGlObject* GLObject, const PositionVector& shape, const Boundary& shapeBoundary,
124
const double layer, const GNESegment* segment);
125
/// @}
126
127
/// @name functions used for mark (select) elements
128
/// @{
129
///
130
/// @brief add element into list of elements under cursor
131
bool selectObject(const GUIGlObject* GLObject, const double layer, const bool checkDuplicated,
132
const GNESegment* segment);
133
134
/// @brief add geometryPoint into list of elements under cursor
135
bool selectGeometryPoint(const GUIGlObject* GLObject, const int newIndex, const double layer);
136
137
/// @brief select position over shape (for example, the position over a lane shape)
138
bool selectPositionOverShape(const GUIGlObject* GLObject, const Position& pos, const double layer, const double offset);
139
140
/// @brief check if element was already selected
141
bool isObjectSelected(const GUIGlObject* GLObject) const;
142
143
/// @brief check rectangle selection
144
bool checkRectangleSelection(const GUIVisualizationSettings& s, const GUIGlObject* GLObject,
145
const double layer, const GUIGlObject* parent);
146
147
/// @brief get all elements under cursor sorted by layer
148
const GLObjectsSortedContainer& getSelectedObjects() const;
149
150
/// @brief get segment associated with the given GLObject (if exist)
151
const GNESegment* getSelectedSegment(const GUIGlObject* GLObject) const;
152
153
/// @brief get geometry points for the given glObject
154
const std::vector<int>& getSelectedGeometryPoints(const GUIGlObject* GLObject) const;
155
156
/// @brief get position over shape
157
const Position& getSelectedPositionOverShape(const GUIGlObject* GLObject) const;
158
159
/// @brief get number of selected objects
160
int getNumberOfSelectedObjects() const;
161
162
/// @brief reverse selected objects
163
void reverseSelectedObjects();
164
165
/// @}
166
167
/// @name functions related with redrawing path elements
168
/// @{
169
/// @brief get redrawing objects
170
const std::set<const GNEPathElement*>& getRedrawPathElements() const;
171
172
/// @brief check if the given path element has to be redraw again
173
bool isPathElementMarkForRedraw(const GNEPathElement* pathElement) const;
174
175
/// @brief add path element to redrawing set
176
void addToRedrawPathElements(const GNEPathElement* pathElement);
177
178
/// @}
179
180
/// @name functions related with merging junctions
181
/// @{
182
/// @brief get merging junctions
183
const std::vector<const GNEJunction*>& getMergingJunctions() const;
184
185
/// @brief add to merging junctions (used for marking junctions to merge)
186
bool addMergingJunctions(const GNEJunction* junction);
187
188
/// @}
189
190
/// @brief move the given object to the front (currently used only in netedit)
191
void updateFrontObject(const GUIGlObject* GLObject);
192
193
/// @brief isolate edge geometry points (used for moving)
194
void isolateEdgeGeometryPoints();
195
196
/// @brief recompute boundaries
197
GUIGlObjectType recomputeBoundaries = GLO_NETWORK;
198
199
/// @brief marked edge (used in create edge mode, for splitting)
200
const GNEEdge* markedEdge = nullptr;
201
202
/// @brief marked lane (used in create edge mode, for splitting)
203
const GNELane* markedLane = nullptr;
204
205
/// @brief marked TAZ (used in create TAZRel mode)
206
const GUIGlObject* markedTAZ = nullptr;
207
208
/// @brief marked route (used in create vehicle mode)
209
const GNERoute* markedRoute = nullptr;
210
211
/// @brief marked first geometry point (used for moving/delete geometry points)
212
const GUIGlObject* markedFirstGeometryPoint = nullptr;
213
214
/// @brief marked first geometry point (used for moving/delete geometry points)
215
const GUIGlObject* markedSecondGeometryPoint = nullptr;
216
217
protected:
218
/// @brief selected element sorted by layer
219
GLObjectsSortedContainer mySortedSelectedObjects;
220
221
/// @brief map with selected elements and if was selected with full boundary (used only to avoid double selections)
222
std::unordered_map<const GUIGlObject*, const GNESegment*> mySelectedObjects;
223
224
/// @brief number of selected objects
225
int myNumberOfSelectedObjects = 0;
226
227
/// @brief set with path elements marked for redrawing
228
std::set<const GNEPathElement*> myRedrawPathElements;
229
230
/// @brief selection triangle
231
Triangle mySelectionTriangle;
232
233
/// @brief position
234
Position mySelectionPosition;
235
236
/// @brief empty geometry points
237
std::vector<int> myEmptyGeometryPoints;
238
239
/// @brief merging junctions
240
std::vector<const GNEJunction*> myMergingJunctions;
241
242
private:
243
/// @brief set copy constructor private
244
GUIViewObjectsHandler(const GUIViewObjectsHandler&) = default;
245
246
/// @brief set assignment operator private
247
GUIViewObjectsHandler& operator=(const GUIViewObjectsHandler&) = default;
248
};
249
250