Path: blob/main/src/netedit/elements/additional/GNEChargingStation.cpp
193674 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GNEChargingStation.cpp14/// @author Pablo Alvarez Lopez15/// @date Nov 201516///17// A class for visualizing chargingStation geometry (adapted from GUILaneWrapper)18/****************************************************************************/19#include <config.h>2021#include <netedit/changes/GNEChange_Attribute.h>22#include <netedit/GNENet.h>23#include <netedit/GNETagProperties.h>24#include <utils/gui/div/GLHelper.h>25#include <utils/options/OptionsCont.h>2627#include "GNEChargingStation.h"2829// ===========================================================================30// member method definitions31// ===========================================================================3233GNEChargingStation::GNEChargingStation(GNENet* net) :34GNEStoppingPlace(net, SUMO_TAG_CHARGING_STATION) {35}363738GNEChargingStation::GNEChargingStation(const std::string& id, GNENet* net, FileBucket* fileBucket, GNELane* lane,39const double startPos, const double endPos, const std::string& name, const double chargingPower,40const double totalPower, const double efficiency, const bool chargeInTransit, const SUMOTime chargeDelay,41const std::string& chargeType, const SUMOTime waitingTime, const std::string& parkingAreaID,42const bool friendlyPosition, const Parameterised::Map& parameters) :43GNEStoppingPlace(id, net, fileBucket, SUMO_TAG_CHARGING_STATION, lane, startPos, endPos, name, friendlyPosition, RGBColor::INVISIBLE, 0, parameters),44myChargingPower(chargingPower),45myTotalPower(totalPower),46myEfficiency(efficiency),47myChargeInTransit(chargeInTransit),48myChargeDelay(chargeDelay),49myChargeType(chargeType),50myWaitingTime(waitingTime),51myParkingAreaID(parkingAreaID) {52// update centering boundary without updating grid53updateCenteringBoundary(false);54}555657GNEChargingStation::~GNEChargingStation() {}585960void61GNEChargingStation::writeAdditional(OutputDevice& device) const {62device.openTag(getTagProperty()->getTag());63// write common attributes64writeStoppingPlaceAttributes(device);65// write specific attributes66if (myChargingPower != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_CHARGINGPOWER)) {67device.writeAttr(SUMO_ATTR_CHARGINGPOWER, toString(myChargingPower));68}69if (myTotalPower != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_TOTALPOWER)) {70device.writeAttr(SUMO_ATTR_TOTALPOWER, toString(myTotalPower));71}72if (myEfficiency != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_EFFICIENCY)) {73device.writeAttr(SUMO_ATTR_EFFICIENCY, myEfficiency);74}75if (myChargeInTransit != myTagProperty->getDefaultBoolValue(SUMO_ATTR_CHARGEINTRANSIT)) {76device.writeAttr(SUMO_ATTR_CHARGEINTRANSIT, myChargeInTransit);77}78if (myChargeDelay != myTagProperty->getDefaultTimeValue(SUMO_ATTR_CHARGEDELAY)) {79device.writeAttr(SUMO_ATTR_CHARGEDELAY, time2string(myChargeDelay));80}81if (myChargeType != myTagProperty->getDefaultStringValue(SUMO_ATTR_CHARGETYPE)) {82device.writeAttr(SUMO_ATTR_CHARGETYPE, myChargeType);83}84if (myWaitingTime != myTagProperty->getDefaultTimeValue(SUMO_ATTR_WAITINGTIME)) {85device.writeAttr(SUMO_ATTR_WAITINGTIME, time2string(myWaitingTime));86}87if (myParkingAreaID != myTagProperty->getDefaultStringValue(SUMO_ATTR_PARKING_AREA)) {88device.writeAttr(SUMO_ATTR_PARKING_AREA, myParkingAreaID);89}90// write parameters (Always after children to avoid problems with additionals.xsd)91writeParams(device);92device.closeTag();93}949596void97GNEChargingStation::updateGeometry() {98// Get value of option "lefthand"99const double offsetSign = OptionsCont::getOptions().getBool("lefthand") ? -1 : 1;100101// Update common geometry of stopping place102setStoppingPlaceGeometry(0);103104// Obtain a copy of the shape105PositionVector tmpShape = myAdditionalGeometry.getShape();106107// Move shape to side108tmpShape.move2side(myNet->getViewNet()->getVisualisationSettings().stoppingPlaceSettings.stoppingPlaceSignOffset * offsetSign);109110// Get position of the sign111mySymbolPosition = tmpShape.getLineCenter();112}113114115void116GNEChargingStation::drawGL(const GUIVisualizationSettings& s) const {117// first check if additional has to be drawn118if (myNet->getViewNet()->getDataViewOptions().showAdditionals()) {119// Obtain exaggeration of the draw120const double chargingStationExaggeration = getExaggeration(s);121// check if draw moving geometry points122const bool movingGeometryPoints = drawMovingGeometryPoints();123// get detail level124const auto d = s.getDetailLevel(chargingStationExaggeration);125// draw geometry only if we'rent in drawForObjectUnderCursor mode126if (s.checkDrawAdditional(d, isAttributeCarrierSelected())) {127// declare colors128RGBColor baseColor, signColor;129// set colors130if (mySpecialColor) {131baseColor = *mySpecialColor;132signColor = baseColor.changedBrightness(-32);133} else if (drawUsingSelectColor()) {134baseColor = s.colorSettings.selectedAdditionalColor;135signColor = baseColor.changedBrightness(-32);136} else {137baseColor = s.colorSettings.chargingStationColor;138signColor = s.colorSettings.chargingStationColorSign;139}140// draw parent and child lines141drawParentChildLines(s, s.additionalSettings.connectionColor);142// Add a layer matrix143GLHelper::pushMatrix();144// translate to front145drawInLayer(GLO_CHARGING_STATION);146// set base color147GLHelper::setColor(baseColor);148// Draw the area using shape, shapeRotations, shapeLengths and value of exaggeration149GUIGeometry::drawGeometry(d, myAdditionalGeometry, s.stoppingPlaceSettings.chargingStationWidth * MIN2(1.0, chargingStationExaggeration));150// draw charging power and efficiency151drawLines(d, {toString(myChargingPower)}, baseColor);152// draw sign153drawSign(s, d, chargingStationExaggeration, baseColor, signColor, "C");154// draw geometry points155if (movingGeometryPoints && (myStartPosOverLane != INVALID_DOUBLE)) {156drawLeftGeometryPoint(s, d, myAdditionalGeometry.getShape().front(), myAdditionalGeometry.getShapeRotations().front(), baseColor);157}158if (movingGeometryPoints && (myEndPosPosOverLane != INVALID_DOUBLE)) {159drawRightGeometryPoint(s, d, myAdditionalGeometry.getShape().back(), myAdditionalGeometry.getShapeRotations().back(), baseColor);160}161// pop layer matrix162GLHelper::popMatrix();163// draw lock icon164GNEViewNetHelper::LockIcon::drawLockIcon(d, this, getType(), myAdditionalGeometry.getShape().getCentroid(), chargingStationExaggeration);165// Draw additional ID166drawAdditionalID(s);167// draw additional name168drawAdditionalName(s);169// draw dotted contours170if (movingGeometryPoints) {171myAdditionalContour.drawDottedContourGeometryPoints(s, d, this, myAdditionalGeometry.getShape(), s.neteditSizeSettings.additionalGeometryPointRadius,1721, s.dottedContourSettings.segmentWidthSmall);173} else {174myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true);175mySymbolContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidthSmall, true);176}177}178// draw demand element children179drawDemandElementChildren(s);180// calculate contours181calculateStoppingPlaceContour(s, d, s.stoppingPlaceSettings.chargingStationWidth, chargingStationExaggeration, movingGeometryPoints);182}183}184185186std::string187GNEChargingStation::getAttribute(SumoXMLAttr key) const {188switch (key) {189case SUMO_ATTR_CHARGINGPOWER:190return toString(myChargingPower);191case SUMO_ATTR_TOTALPOWER:192return toString(myTotalPower);193case SUMO_ATTR_EFFICIENCY:194return toString(myEfficiency);195case SUMO_ATTR_CHARGEINTRANSIT:196return toString(myChargeInTransit);197case SUMO_ATTR_CHARGEDELAY:198return time2string(myChargeDelay);199case SUMO_ATTR_CHARGETYPE:200return myChargeType;201case SUMO_ATTR_WAITINGTIME:202return time2string(myWaitingTime);203case SUMO_ATTR_PARKING_AREA:204return myParkingAreaID;205default:206return getStoppingPlaceAttribute(key);207}208}209210211double212GNEChargingStation::getAttributeDouble(SumoXMLAttr key) const {213switch (key) {214case SUMO_ATTR_CHARGINGPOWER:215return myChargingPower;216case SUMO_ATTR_TOTALPOWER:217return myTotalPower;218case SUMO_ATTR_EFFICIENCY:219return myEfficiency;220default:221return getStoppingPlaceAttributeDouble(key);222}223}224225226void227GNEChargingStation::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {228switch (key) {229case SUMO_ATTR_CHARGINGPOWER:230case SUMO_ATTR_TOTALPOWER:231case SUMO_ATTR_EFFICIENCY:232case SUMO_ATTR_CHARGEINTRANSIT:233case SUMO_ATTR_CHARGEDELAY:234case SUMO_ATTR_CHARGETYPE:235case SUMO_ATTR_WAITINGTIME:236case SUMO_ATTR_PARKING_AREA:237GNEChange_Attribute::changeAttribute(this, key, value, undoList);238break;239default:240setStoppingPlaceAttribute(key, value, undoList);241break;242}243}244245246bool247GNEChargingStation::isValid(SumoXMLAttr key, const std::string& value) {248switch (key) {249case SUMO_ATTR_CHARGINGPOWER:250case SUMO_ATTR_TOTALPOWER:251return (canParse<double>(value) && parse<double>(value) >= 0);252case SUMO_ATTR_EFFICIENCY:253if (canParse<double>(value)) {254const double efficiency = parse<double>(value);255return (efficiency >= 0) && (efficiency <= 1);256} else {257return false;258}259case SUMO_ATTR_CHARGEINTRANSIT:260return canParse<bool>(value);261case SUMO_ATTR_CHARGEDELAY:262return canParse<SUMOTime>(value) && parse<SUMOTime>(value) >= 0;263case SUMO_ATTR_CHARGETYPE: {264return SUMOXMLDefinitions::ChargeTypes.hasString(value);265}266case SUMO_ATTR_WAITINGTIME:267return canParse<SUMOTime>(value) && parse<SUMOTime>(value) >= 0;268case SUMO_ATTR_PARKING_AREA:269return isValidAdditionalID(value);270default:271return isStoppingPlaceValid(key, value);272}273}274275// ===========================================================================276// private277// ===========================================================================278279void280GNEChargingStation::setAttribute(SumoXMLAttr key, const std::string& value) {281switch (key) {282case SUMO_ATTR_CHARGINGPOWER:283myChargingPower = parse<double>(value);284break;285case SUMO_ATTR_TOTALPOWER:286myTotalPower = parse<double>(value);287break;288case SUMO_ATTR_EFFICIENCY:289myEfficiency = parse<double>(value);290break;291case SUMO_ATTR_CHARGEINTRANSIT:292myChargeInTransit = parse<bool>(value);293break;294case SUMO_ATTR_CHARGEDELAY:295myChargeDelay = parse<SUMOTime>(value);296break;297case SUMO_ATTR_CHARGETYPE:298myChargeType = value;299break;300case SUMO_ATTR_WAITINGTIME:301myWaitingTime = parse<SUMOTime>(value);302break;303case SUMO_ATTR_PARKING_AREA:304myParkingAreaID = value;305break;306default:307setStoppingPlaceAttribute(key, value);308break;309}310}311312/****************************************************************************/313314315