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