Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEVariableSpeedSign.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2023 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/****************************************************************************/
18//
19/****************************************************************************/
20#include <config.h>
21
25#include <netedit/GNEViewNet.h>
26#include <netedit/GNEUndoList.h>
27#include <netedit/GNENet.h>
28
31
32
33// ===========================================================================
34// member method definitions
35// ===========================================================================
36
38 GNEAdditional("", net, GLO_VSS, SUMO_TAG_VSS, GUIIconSubSys::getIcon(GUIIcon::VARIABLESPEEDSIGN), "", {}, {}, {}, {}, {}, {}) {
39 // reset default values
40 resetDefaultValues();
41}
42
43
44GNEVariableSpeedSign::GNEVariableSpeedSign(const std::string& id, GNENet* net, const Position& pos, const std::string& name,
45 const std::vector<std::string>& vTypes, const Parameterised::Map& parameters) :
46 GNEAdditional(id, net, GLO_VSS, SUMO_TAG_VSS, GUIIconSubSys::getIcon(GUIIcon::VARIABLESPEEDSIGN), name, {}, {}, {}, {}, {}, {}),
47 Parameterised(parameters),
48 myPosition(pos),
49myVehicleTypes(vTypes) {
50 // update centering boundary without updating grid
51 updateCenteringBoundary(false);
52}
53
54
57
58
59void
61 device.openTag(SUMO_TAG_VSS);
62 device.writeAttr(SUMO_ATTR_ID, getID());
65 if (!myAdditionalName.empty()) {
67 }
68 if (!myVehicleTypes.empty()) {
70 }
71 // write all rerouter interval
72 for (const auto& step : getChildAdditionals()) {
73 if (!step->getTagProperty().isSymbol()) {
74 step->writeAdditional(device);
75 }
76 }
77 // write parameters (Always after children to avoid problems with additionals.xsd)
78 writeParams(device);
79 device.closeTag();
80}
81
82
83bool
84GNEVariableSpeedSign::GNEVariableSpeedSign::isAdditionalValid() const {
85 return true;
86}
87
88
89std::string
90GNEVariableSpeedSign::GNEVariableSpeedSign::getAdditionalProblem() const {
91 return "";
92}
93
94
95void
96GNEVariableSpeedSign::GNEVariableSpeedSign::fixAdditionalProblem() {
97 // nothing to fix
98}
99
100
103 // return move operation for additional placed in view
104 return new GNEMoveOperation(this, myPosition);
105}
106
107
108void
110 // update additional geometry
112 // update geometries (boundaries of all children)
113 for (const auto& additionalChildren : getChildAdditionals()) {
114 additionalChildren->updateGeometry();
115 }
116}
117
118
123
124
125void
127 // remove additional from grid
128 if (updateGrid) {
130 }
131 // update geometry
133 // add shape boundary
135 // add positions of all childrens (symbols and steps)
136 for (const auto& additionalChildren : getChildAdditionals()) {
137 myAdditionalBoundary.add(additionalChildren->getPositionInView());
138 // also update centering boundary
139 additionalChildren->updateCenteringBoundary(false);
140 }
141 // grow
143 // add additional into RTREE again
144 if (updateGrid) {
146 }
147}
148
149
150void
151GNEVariableSpeedSign::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {
152 // geometry of this element cannot be splitted
153}
154
155
156void
161
162
163std::string
167
168
169void
171 // draw parent and child lines
173 // draw VSS
175 // iterate over additionals and check if drawn
176 for (const auto& step : getChildAdditionals()) {
177 // if rerouter or their intevals are selected, then draw
180 step->isAttributeCarrierSelected() || myNet->getViewNet()->isAttributeCarrierInspected(step) ||
181 (myNet->getViewNet()->getFrontAttributeCarrier() == step)) {
182 step->drawGL(s);
183 }
184 }
185}
186
187
188std::string
190 switch (key) {
191 case SUMO_ATTR_ID:
192 return getMicrosimID();
193 case SUMO_ATTR_LANES: {
194 std::vector<std::string> lanes;
195 for (const auto& VSSSymbol : getChildAdditionals()) {
196 if (VSSSymbol->getTagProperty().isSymbol()) {
197 lanes.push_back(VSSSymbol->getAttribute(SUMO_ATTR_LANE));
198 }
199 }
200 return toString(lanes);
201 }
203 return toString(myPosition);
204 case SUMO_ATTR_NAME:
205 return myAdditionalName;
206 case SUMO_ATTR_VTYPES:
207 return toString(myVehicleTypes);
211 return getParametersStr();
212 default:
213 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
214 }
215}
216
217
218double
220 throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");
221}
222
223
228
229
230void
231GNEVariableSpeedSign::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
232 if (value == getAttribute(key)) {
233 return; //avoid needless changes, later logic relies on the fact that attributes have changed
234 }
235 switch (key) {
236 // special case for lanes due VSS Symbols
237 case SUMO_ATTR_LANES:
238 // rebuild VSS Symbols
239 rebuildVSSSymbols(value, undoList);
240 break;
241 case SUMO_ATTR_ID:
243 case SUMO_ATTR_NAME:
244 case SUMO_ATTR_VTYPES:
247 undoList->changeAttribute(new GNEChange_Attribute(this, key, value));
248 break;
249 default:
250 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
251 }
252}
253
254
255bool
256GNEVariableSpeedSign::isValid(SumoXMLAttr key, const std::string& value) {
257 switch (key) {
258 case SUMO_ATTR_ID:
259 return isValidAdditionalID(value);
261 return canParse<Position>(value);
262 case SUMO_ATTR_LANES:
263 return canParse<std::vector<GNELane*> >(myNet, value, false);
264 case SUMO_ATTR_NAME:
266 case SUMO_ATTR_VTYPES:
267 if (value.empty()) {
268 return true;
269 } else {
271 }
273 return canParse<bool>(value);
275 return areParametersValid(value);
276 default:
277 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
278 }
279}
280
281
282std::string
284 return getTagStr() + ": " + getID();
285}
286
287
288std::string
292
293// ===========================================================================
294// private
295// ===========================================================================
296
297void
298GNEVariableSpeedSign::setAttribute(SumoXMLAttr key, const std::string& value) {
299 switch (key) {
300 case SUMO_ATTR_LANES:
301 throw InvalidArgument(getTagStr() + " cannot be edited");
302 case SUMO_ATTR_ID:
303 // update microsimID
304 setMicrosimID(value);
305 break;
307 myPosition = parse<Position>(value);
308 // update boundary (except for template)
309 if (getID().size() > 0) {
311 }
312 break;
313 case SUMO_ATTR_NAME:
314 myAdditionalName = value;
315 break;
316 case SUMO_ATTR_VTYPES:
317 myVehicleTypes = parse<std::vector<std::string> >(value);
318 break;
320 if (parse<bool>(value)) {
322 } else {
324 }
325 break;
327 setParametersStr(value);
328 break;
329 default:
330 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
331 }
332}
333
334
335void
337 // update position
338 myPosition = moveResult.shapeToUpdate.front();
339 // update geometry
341}
342
343
344void
346 undoList->begin(GUIIcon::VARIABLESPEEDSIGN, "position of " + getTagStr());
347 undoList->changeAttribute(new GNEChange_Attribute(this, SUMO_ATTR_POSITION, toString(moveResult.shapeToUpdate.front())));
348 undoList->end();
349}
350
351
352void
353GNEVariableSpeedSign::rebuildVSSSymbols(const std::string& value, GNEUndoList* undoList) {
354 undoList->begin(GUIIcon::VARIABLESPEEDSIGN, ("change " + getTagStr() + " attribute").c_str());
355 // drop all additional children
356 while (getChildAdditionals().size() > 0) {
357 undoList->add(new GNEChange_Additional(getChildAdditionals().front(), false), true);
358 }
359 // get lane vector
360 const std::vector<GNELane*> lanes = parse<std::vector<GNELane*> >(myNet, value);
361 // create new VSS Symbols
362 for (const auto& lane : lanes) {
363 // create VSS Symbol
364 GNEAdditional* VSSSymbol = new GNEVariableSpeedSignSymbol(this, lane);
365 // add it using GNEChange_Additional
366 myNet->getViewNet()->getUndoList()->add(new GNEChange_Additional(VSSSymbol, true), true);
367 }
368 undoList->end();
369}
370
371/****************************************************************************/
@ GLO_VSS
a Variable Speed Sign
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
@ VARIABLESPEEDSIGN
@ VARIABLESPEEDSIGN_SELECTED
@ SUMO_TAG_VSS
A variable speed sign.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_LANE
@ GNE_ATTR_SELECTED
element is selected
@ GNE_ATTR_PARAMETERS
parameters "key1=value1|key2=value2|...|keyN=valueN"
@ SUMO_ATTR_LANES
@ SUMO_ATTR_VTYPES
@ SUMO_ATTR_NAME
@ SUMO_ATTR_ID
@ SUMO_ATTR_POSITION
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:78
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:300
An Element which don't belong to GNENet but has influence in the simulation.
GUIGeometry myAdditionalGeometry
geometry to be precomputed in updateGeometry(...)
std::string myAdditionalName
name of additional
void drawSquaredAdditional(const GUIVisualizationSettings &s, const Position &pos, const double size, GUITexture texture, GUITexture selectedTexture) const
draw squared additional
Boundary myAdditionalBoundary
Additional Boundary.
bool isValidAdditionalID(const std::string &newID) const
check if a new additional ID is valid
void drawParentChildLines(const GUIVisualizationSettings &s, const RGBColor &color, const bool onlySymbols=false) const
draw parent and child lines
const std::string getID() const
get ID (all Attribute Carriers have one)
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
friend class GNEChange_Attribute
declare friend class
const std::string & getTagStr() const
get tag assigned to this object in string format
void unselectAttributeCarrier(const bool changeFlag=true)
unselect attribute carrier using GUIGlobalSelection
GNENet * myNet
pointer to net
void selectAttributeCarrier(const bool changeFlag=true)
select attribute carrier using GUIGlobalSelection
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
move operation
move result
PositionVector shapeToUpdate
shape to update (edited in moveElement)
A NBNetBuilder extended by visualisation and editing capabilities.
Definition GNENet.h:42
void addGLObjectIntoGrid(GNEAttributeCarrier *AC)
add GL Object into net
Definition GNENet.cpp:1248
void removeGLObjectFromGrid(GNEAttributeCarrier *AC)
add GL Object into net
Definition GNENet.cpp:1260
GNEViewNet * getViewNet() const
get view net
Definition GNENet.cpp:2030
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
void changeAttribute(GNEChange_Attribute *change)
special method for change attributes, avoid empty changes, always execute
std::string getHierarchyName() const
get Hierarchy Name (Used in AC Hierarchy)
void splitEdgeGeometry(const double splitPosition, const GNENetworkElement *originalElement, const GNENetworkElement *newElement, GNEUndoList *undoList)
split geometry
Position getPositionInView() const
Returns position of additional in view.
void setMoveShape(const GNEMoveResult &moveResult)
set move shape
std::string getParentName() const
Returns the name of the parent object.
double getAttributeDouble(SumoXMLAttr key) const
GNEVariableSpeedSign(GNENet *net)
default Constructor
GNEMoveOperation * getMoveOperation()
get move operation
std::string getPopUpID() const
get PopPup ID (Used in AC Hierarchy)
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
method for setting the attribute and letting the object perform additional changes
void commitMoveShape(const GNEMoveResult &moveResult, GNEUndoList *undoList)
commit move shape
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
bool isValid(SumoXMLAttr key, const std::string &value)
method for checking if the key and their correspondent attribute are valids
void rebuildVSSSymbols(const std::string &value, GNEUndoList *undoList)
rebuild VSS Symbols
Position myPosition
position of VSS in view
void writeAdditional(OutputDevice &device) const
write additional element into a xml file
const Parameterised::Map & getACParametersMap() const
get parameters map
std::string getAttribute(SumoXMLAttr key) const
void updateGeometry()
update pre-computed geometry information
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
void openAdditionalDialog()
open GNEVariableSpeedSignDialog
std::vector< std::string > myVehicleTypes
attribute vehicle types
const GNEAttributeCarrier * getFrontAttributeCarrier() const
get front attributeCarrier
const GNEViewNetHelper::NetworkViewOptions & getNetworkViewOptions() const
get network view options
GNEUndoList * getUndoList() const
get the undoList object
bool isAttributeCarrierInspected(const GNEAttributeCarrier *AC) const
check if attribute carrier is being inspected
void updateSinglePosGeometry(const Position &position, const double rotation)
update position and rotation
const PositionVector & getShape() const
The shape of the additional element.
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
virtual void setMicrosimID(const std::string &newID)
Changes the microsimID of the object.
Stores the information about how to visualize structures.
GUIVisualizationAdditionalSettings additionalSettings
Additional settings.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
An upper class for objects with additional parameters.
static bool areParametersValid(const std::string &value, bool report=false, const std::string kvsep="=", const std::string sep="|")
check if given string can be parsed to a parameters map "key1=value1|key2=value2|....
std::map< std::string, std::string > Map
parameters map
void setParametersStr(const std::string &paramsString, const std::string kvsep="=", const std::string sep="|")
set the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN"
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
std::string getParametersStr(const std::string kvsep="=", const std::string sep="|") const
Returns the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN".
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
static bool isValidListOfTypeID(const std::string &value)
whether the given string is a valid list of ids for an edge or vehicle type (empty aren't allowed)
static bool isValidAttribute(const std::string &value)
whether the given string is a valid attribute for a certain key (for example, a name)
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
bool showSubAdditionals() const
check if show sub-additionals
static const RGBColor connectionColor
connection color