Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/gui/globjects/GUIPointOfInterest.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 GUIPointOfInterest.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date June 2006
19
///
20
// The GUI-version of a point of interest
21
/****************************************************************************/
22
23
#include <utils/common/StringTokenizer.h>
24
#include <utils/gui/div/GUIParameterTableWindow.h>
25
#include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
26
#include <utils/gui/div/GUIGlobalSelection.h>
27
#include <utils/gui/images/GUITextureSubSys.h>
28
#include <utils/gui/div/GLHelper.h>
29
#include <utils/gui/globjects/GLIncludes.h>
30
31
#include "GUIPointOfInterest.h"
32
33
34
// ===========================================================================
35
// method definitions
36
// ===========================================================================
37
38
GUIPointOfInterest::GUIPointOfInterest(const std::string& id, const std::string& type, const RGBColor& color, const Position& pos,
39
bool geo, const std::string& lane, double posOverLane, bool friendlyPos, double posLat,
40
const std::string& icon, double layer, double angle, const std::string& imgFile,
41
double width, double height) :
42
PointOfInterest(id, type, color, pos, geo, lane, posOverLane, friendlyPos, posLat, icon, layer, angle, imgFile, width, height),
43
GUIGlObject_AbstractAdd(GLO_POI, id,
44
(lane.size() > 0) ? GUIIconSubSys::getIcon(GUIIcon::POILANE) : geo ? GUIIconSubSys::getIcon(GUIIcon::POIGEO) : GUIIconSubSys::getIcon(GUIIcon::POI)) {
45
}
46
47
48
GUIPointOfInterest::~GUIPointOfInterest() {}
49
50
51
GUIGLObjectPopupMenu*
52
GUIPointOfInterest::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {
53
GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, this);
54
// build shape header
55
buildShapePopupOptions(app, ret, getShapeType());
56
return ret;
57
}
58
59
60
GUIParameterTableWindow*
61
GUIPointOfInterest::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView&) {
62
GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
63
// add items
64
ret->mkItem("type", false, getShapeType());
65
ret->mkItem("icon", false, getIconStr());
66
ret->mkItem("layer", false, getShapeLayer());
67
ret->closeBuilding(this);
68
return ret;
69
}
70
71
72
double
73
GUIPointOfInterest::getExaggeration(const GUIVisualizationSettings& s) const {
74
return s.poiSize.getExaggeration(s, this);
75
}
76
77
78
Boundary
79
GUIPointOfInterest::getCenteringBoundary() const {
80
Boundary b;
81
b.add(x(), y());
82
if (getShapeImgFile() != DEFAULT_IMG_FILE) {
83
b.growWidth(myHalfImgWidth);
84
b.growHeight(myHalfImgHeight);
85
} else {
86
b.grow(3);
87
}
88
return b;
89
}
90
91
92
void
93
GUIPointOfInterest::drawGL(const GUIVisualizationSettings& s) const {
94
// check if POI can be drawn
95
if (checkDraw(s, this)) {
96
// push name (needed for getGUIGlObjectsUnderCursor(...)
97
GLHelper::pushName(getGlID());
98
// draw inner polygon
99
drawInnerPOI(s, this, this, false, s.poiUseCustomLayer ? s.poiCustomLayer : getShapeLayer(), getWidth(), getHeight());
100
// pop name
101
GLHelper::popName();
102
}
103
}
104
105
106
bool
107
GUIPointOfInterest::checkDraw(const GUIVisualizationSettings& s, const GUIGlObject* o) {
108
// only continue if scale is valid
109
if (s.scale * (1.3 / 3.0) * o->getExaggeration(s) < s.poiSize.minSize) {
110
return false;
111
}
112
return true;
113
}
114
115
116
void
117
GUIPointOfInterest::setColor(const GUIVisualizationSettings& s, const PointOfInterest* POI, const GUIGlObject* o, bool disableSelectionColor) {
118
const GUIColorer& c = s.poiColorer;
119
const int active = c.getActive();
120
if (s.netedit && active != 1 && gSelected.isSelected(o->getType(), o->getGlID()) && disableSelectionColor) {
121
// override with special colors (unless the color scheme is based on selection)
122
GLHelper::setColor(RGBColor(0, 0, 204));
123
} else if (active == 0) {
124
GLHelper::setColor(POI->getShapeColor());
125
} else if (active == 1) {
126
GLHelper::setColor(c.getScheme().getColor(gSelected.isSelected(o->getType(), o->getGlID())));
127
} else {
128
GLHelper::setColor(c.getScheme().getColor(0));
129
}
130
}
131
132
133
void
134
GUIPointOfInterest::drawInnerPOI(const GUIVisualizationSettings& s, const PointOfInterest* POI, const GUIGlObject* o,
135
const bool disableSelectionColor, const double layer, const double width, const double height) {
136
const double exaggeration = o->getExaggeration(s);
137
GLHelper::pushMatrix();
138
setColor(s, POI, o, disableSelectionColor);
139
// add extra offset z provided by icon to avoid overlapping
140
glTranslated(POI->x(), POI->y(), layer + (double)POI->getIcon());
141
glRotated(-POI->getShapeNaviDegree(), 0, 0, 1);
142
// check if has to be drawn as a circle or with an image
143
if (POI->getShapeImgFile() != DEFAULT_IMG_FILE) {
144
int textureID = GUITexturesHelper::getTextureID(POI->getShapeImgFile());
145
if (textureID > 0) {
146
GUITexturesHelper::drawTexturedBox(textureID,
147
width * -0.5 * exaggeration, height * -0.5 * exaggeration,
148
width * 0.5 * exaggeration, height * 0.5 * exaggeration);
149
}
150
} else {
151
// fallback if no image is defined
152
GLHelper::drawFilledCircle(width * 0.5 * exaggeration, s.poiDetail);
153
// check if draw polygon
154
if (POI->getIcon() != POIIcon::NONE) {
155
// translate
156
glTranslated(0, 0, 0.1);
157
// rotate
158
glRotated(180, 0, 0, 1);
159
// draw texture
160
GUITexturesHelper::drawTexturedBox(GUITextureSubSys::getPOITexture(POI->getIcon()), exaggeration * 0.8);
161
}
162
}
163
GLHelper::popMatrix();
164
if (!s.drawForRectangleSelection) {
165
const Position namePos = *POI;
166
o->drawName(namePos, s.scale, s.poiName, s.angle);
167
if (s.poiType.show(o)) {
168
const Position p = namePos + Position(0, -0.6 * s.poiType.size / s.scale);
169
GLHelper::drawTextSettings(s.poiType, POI->getShapeType(), p, s.scale, s.angle);
170
}
171
if (s.poiText.show(o)) {
172
GLHelper::pushMatrix();
173
glTranslated(POI->x(), POI->y(), 0);
174
std::string value = POI->getParameter(s.poiTextParam, "");
175
if (value != "") {
176
auto lines = StringTokenizer(value, StringTokenizer::NEWLINE).getVector();
177
glRotated(-s.angle, 0, 0, 1);
178
glTranslated(0, 0.7 * s.poiText.scaledSize(s.scale) * (double)lines.size(), 0);
179
glRotated(s.angle, 0, 0, 1);
180
// FONS_ALIGN_LEFT = 1
181
// FONS_ALIGN_CENTER = 2
182
// FONS_ALIGN_MIDDLE = 16
183
const int align = (lines.size() > 1 ? 1 : 2) | 16;
184
for (std::string& line : lines) {
185
GLHelper::drawTextSettings(s.poiText, line, Position(0, 0), s.scale, s.angle, GLO_MAX, align);
186
glRotated(-s.angle, 0, 0, 1);
187
glTranslated(0, -0.7 * s.poiText.scaledSize(s.scale), 0);
188
glRotated(s.angle, 0, 0, 1);
189
}
190
}
191
GLHelper::popMatrix();
192
}
193
}
194
}
195
196
197
/****************************************************************************/
198
199