Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/additional/GNEChargingStation.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 GNEChargingStation.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Nov 2015
17
///
18
// A class for visualizing chargingStation geometry (adapted from GUILaneWrapper)
19
/****************************************************************************/
20
21
#include <netedit/GNENet.h>
22
#include <netedit/GNETagProperties.h>
23
#include <netedit/changes/GNEChange_Attribute.h>
24
#include <utils/gui/div/GLHelper.h>
25
#include <utils/options/OptionsCont.h>
26
27
#include "GNEChargingStation.h"
28
29
// ===========================================================================
30
// member method definitions
31
// ===========================================================================
32
33
GNEChargingStation::GNEChargingStation(GNENet* net) :
34
GNEStoppingPlace(net, SUMO_TAG_CHARGING_STATION) {
35
}
36
37
38
GNEChargingStation::GNEChargingStation(const std::string& id, GNENet* net, const std::string& filename, GNELane* lane,
39
const double startPos, const double endPos, const std::string& name, const double chargingPower,
40
const double efficiency, const bool chargeInTransit, const SUMOTime chargeDelay,
41
const std::string& chargeType, const SUMOTime waitingTime, const std::string& parkingAreaID,
42
const bool friendlyPosition, const Parameterised::Map& parameters) :
43
GNEStoppingPlace(id, net, filename, SUMO_TAG_CHARGING_STATION, lane, startPos, endPos, name, friendlyPosition, RGBColor::INVISIBLE, 0, parameters),
44
myChargingPower(chargingPower),
45
myEfficiency(efficiency),
46
myChargeInTransit(chargeInTransit),
47
myChargeDelay(chargeDelay),
48
myChargeType(chargeType),
49
myWaitingTime(waitingTime),
50
myParkingAreaID(parkingAreaID) {
51
// update centering boundary without updating grid
52
updateCenteringBoundary(false);
53
}
54
55
56
GNEChargingStation::~GNEChargingStation() {}
57
58
59
void
60
GNEChargingStation::writeAdditional(OutputDevice& device) const {
61
device.openTag(getTagProperty()->getTag());
62
// write common attributes
63
writeStoppingPlaceAttributes(device);
64
// write specific attributes
65
if (myChargingPower != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_CHARGINGPOWER)) {
66
device.writeAttr(SUMO_ATTR_CHARGINGPOWER, toString(myChargingPower));
67
}
68
if (myEfficiency != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_EFFICIENCY)) {
69
device.writeAttr(SUMO_ATTR_EFFICIENCY, myEfficiency);
70
}
71
if (myChargeInTransit != myTagProperty->getDefaultBoolValue(SUMO_ATTR_CHARGEINTRANSIT)) {
72
device.writeAttr(SUMO_ATTR_CHARGEINTRANSIT, myChargeInTransit);
73
}
74
if (myChargeDelay != myTagProperty->getDefaultTimeValue(SUMO_ATTR_CHARGEDELAY)) {
75
device.writeAttr(SUMO_ATTR_CHARGEDELAY, time2string(myChargeDelay));
76
}
77
if (myChargeType != myTagProperty->getDefaultStringValue(SUMO_ATTR_CHARGETYPE)) {
78
device.writeAttr(SUMO_ATTR_CHARGETYPE, myChargeType);
79
}
80
if (myWaitingTime != myTagProperty->getDefaultTimeValue(SUMO_ATTR_WAITINGTIME)) {
81
device.writeAttr(SUMO_ATTR_WAITINGTIME, time2string(myWaitingTime));
82
}
83
if (myParkingAreaID != myTagProperty->getDefaultStringValue(SUMO_ATTR_PARKING_AREA)) {
84
device.writeAttr(SUMO_ATTR_PARKING_AREA, myParkingAreaID);
85
}
86
// write parameters (Always after children to avoid problems with additionals.xsd)
87
writeParams(device);
88
device.closeTag();
89
}
90
91
92
void
93
GNEChargingStation::updateGeometry() {
94
// Get value of option "lefthand"
95
const double offsetSign = OptionsCont::getOptions().getBool("lefthand") ? -1 : 1;
96
97
// Update common geometry of stopping place
98
setStoppingPlaceGeometry(0);
99
100
// Obtain a copy of the shape
101
PositionVector tmpShape = myAdditionalGeometry.getShape();
102
103
// Move shape to side
104
tmpShape.move2side(myNet->getViewNet()->getVisualisationSettings().stoppingPlaceSettings.stoppingPlaceSignOffset * offsetSign);
105
106
// Get position of the sign
107
mySymbolPosition = tmpShape.getLineCenter();
108
}
109
110
111
void
112
GNEChargingStation::drawGL(const GUIVisualizationSettings& s) const {
113
// first check if additional has to be drawn
114
if (myNet->getViewNet()->getDataViewOptions().showAdditionals()) {
115
// Obtain exaggeration of the draw
116
const double chargingStationExaggeration = getExaggeration(s);
117
// check if draw moving geometry points
118
const bool movingGeometryPoints = drawMovingGeometryPoints(false);
119
// get detail level
120
const auto d = s.getDetailLevel(chargingStationExaggeration);
121
// draw geometry only if we'rent in drawForObjectUnderCursor mode
122
if (s.checkDrawAdditional(d, isAttributeCarrierSelected())) {
123
// declare colors
124
RGBColor baseColor, signColor;
125
// set colors
126
if (mySpecialColor) {
127
baseColor = *mySpecialColor;
128
signColor = baseColor.changedBrightness(-32);
129
} else if (drawUsingSelectColor()) {
130
baseColor = s.colorSettings.selectedAdditionalColor;
131
signColor = baseColor.changedBrightness(-32);
132
} else {
133
baseColor = s.colorSettings.chargingStationColor;
134
signColor = s.colorSettings.chargingStationColorSign;
135
}
136
// draw parent and child lines
137
drawParentChildLines(s, s.additionalSettings.connectionColor);
138
// Add a layer matrix
139
GLHelper::pushMatrix();
140
// translate to front
141
drawInLayer(GLO_CHARGING_STATION);
142
// set base color
143
GLHelper::setColor(baseColor);
144
// Draw the area using shape, shapeRotations, shapeLengths and value of exaggeration
145
GUIGeometry::drawGeometry(d, myAdditionalGeometry, s.stoppingPlaceSettings.chargingStationWidth * MIN2(1.0, chargingStationExaggeration));
146
// draw charging power and efficiency
147
drawLines(d, {toString(myChargingPower)}, baseColor);
148
// draw sign
149
drawSign(s, d, chargingStationExaggeration, baseColor, signColor, "C");
150
// draw geometry points
151
if (movingGeometryPoints && (myStartPosition != INVALID_DOUBLE)) {
152
drawLeftGeometryPoint(s, d, myAdditionalGeometry.getShape().front(), myAdditionalGeometry.getShapeRotations().front(), baseColor);
153
}
154
if (movingGeometryPoints && (myEndPosition != INVALID_DOUBLE)) {
155
drawRightGeometryPoint(s, d, myAdditionalGeometry.getShape().back(), myAdditionalGeometry.getShapeRotations().back(), baseColor);
156
}
157
// pop layer matrix
158
GLHelper::popMatrix();
159
// draw lock icon
160
GNEViewNetHelper::LockIcon::drawLockIcon(d, this, getType(), myAdditionalGeometry.getShape().getCentroid(), chargingStationExaggeration);
161
// Draw additional ID
162
drawAdditionalID(s);
163
// draw additional name
164
drawAdditionalName(s);
165
// draw dotted contours
166
if (movingGeometryPoints) {
167
myAdditionalContour.drawDottedContourGeometryPoints(s, d, this, myAdditionalGeometry.getShape(), s.neteditSizeSettings.additionalGeometryPointRadius,
168
1, s.dottedContourSettings.segmentWidthSmall);
169
} else {
170
myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true);
171
mySymbolContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidthSmall, true);
172
}
173
}
174
// draw demand element children
175
drawDemandElementChildren(s);
176
// calculate contours
177
calculateStoppingPlaceContour(s, d, s.stoppingPlaceSettings.chargingStationWidth, chargingStationExaggeration, movingGeometryPoints);
178
}
179
}
180
181
182
std::string
183
GNEChargingStation::getAttribute(SumoXMLAttr key) const {
184
switch (key) {
185
case SUMO_ATTR_CHARGINGPOWER:
186
return toString(myChargingPower);
187
case SUMO_ATTR_EFFICIENCY:
188
return toString(myEfficiency);
189
case SUMO_ATTR_CHARGEINTRANSIT:
190
return toString(myChargeInTransit);
191
case SUMO_ATTR_CHARGEDELAY:
192
return time2string(myChargeDelay);
193
case SUMO_ATTR_CHARGETYPE:
194
return myChargeType;
195
case SUMO_ATTR_WAITINGTIME:
196
return time2string(myWaitingTime);
197
case SUMO_ATTR_PARKING_AREA:
198
return myParkingAreaID;
199
default:
200
return getStoppingPlaceAttribute(this, key);
201
}
202
}
203
204
205
double
206
GNEChargingStation::getAttributeDouble(SumoXMLAttr key) const {
207
switch (key) {
208
case SUMO_ATTR_CHARGINGPOWER:
209
return myChargingPower;
210
case SUMO_ATTR_EFFICIENCY:
211
return myEfficiency;
212
default:
213
return getStoppingPlaceAttributeDouble(key);
214
}
215
}
216
217
218
void
219
GNEChargingStation::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
220
switch (key) {
221
case SUMO_ATTR_CHARGINGPOWER:
222
case SUMO_ATTR_EFFICIENCY:
223
case SUMO_ATTR_CHARGEINTRANSIT:
224
case SUMO_ATTR_CHARGEDELAY:
225
case SUMO_ATTR_CHARGETYPE:
226
case SUMO_ATTR_WAITINGTIME:
227
case SUMO_ATTR_PARKING_AREA:
228
GNEChange_Attribute::changeAttribute(this, key, value, undoList);
229
break;
230
default:
231
setStoppingPlaceAttribute(key, value, undoList);
232
break;
233
}
234
}
235
236
237
bool
238
GNEChargingStation::isValid(SumoXMLAttr key, const std::string& value) {
239
switch (key) {
240
case SUMO_ATTR_CHARGINGPOWER:
241
return (canParse<double>(value) && parse<double>(value) >= 0);
242
case SUMO_ATTR_EFFICIENCY:
243
if (canParse<double>(value)) {
244
const double efficiency = parse<double>(value);
245
return (efficiency >= 0) && (efficiency <= 1);
246
} else {
247
return false;
248
}
249
case SUMO_ATTR_CHARGEINTRANSIT:
250
return canParse<bool>(value);
251
case SUMO_ATTR_CHARGEDELAY:
252
return canParse<SUMOTime>(value) && parse<SUMOTime>(value) >= 0;
253
case SUMO_ATTR_CHARGETYPE: {
254
return SUMOXMLDefinitions::ChargeTypes.hasString(value);
255
}
256
case SUMO_ATTR_WAITINGTIME:
257
return canParse<SUMOTime>(value) && parse<SUMOTime>(value) >= 0;
258
case SUMO_ATTR_PARKING_AREA:
259
return isValidAdditionalID(value);
260
default:
261
return isStoppingPlaceValid(key, value);
262
}
263
}
264
265
// ===========================================================================
266
// private
267
// ===========================================================================
268
269
void
270
GNEChargingStation::setAttribute(SumoXMLAttr key, const std::string& value) {
271
switch (key) {
272
case SUMO_ATTR_CHARGINGPOWER:
273
myChargingPower = parse<double>(value);
274
break;
275
case SUMO_ATTR_EFFICIENCY:
276
myEfficiency = parse<double>(value);
277
break;
278
case SUMO_ATTR_CHARGEINTRANSIT:
279
myChargeInTransit = parse<bool>(value);
280
break;
281
case SUMO_ATTR_CHARGEDELAY:
282
myChargeDelay = parse<SUMOTime>(value);
283
break;
284
case SUMO_ATTR_CHARGETYPE:
285
myChargeType = value;
286
break;
287
case SUMO_ATTR_WAITINGTIME:
288
myWaitingTime = parse<SUMOTime>(value);
289
break;
290
case SUMO_ATTR_PARKING_AREA:
291
myParkingAreaID = value;
292
break;
293
default:
294
setStoppingPlaceAttribute(this, key, value);
295
break;
296
}
297
}
298
299
300
/****************************************************************************/
301
302