Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEParametersDialog.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-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/****************************************************************************/
18// Dialog for edit parameters
19/****************************************************************************/
20
23#include <netedit/GNENet.h>
24#include <netedit/GNEUndoList.h>
30#include <utils/xml/XMLSubSys.h>
31
32#include "GNEParametersDialog.h"
33
34// ===========================================================================
35// FOX callback mapping
36// ===========================================================================
37
38FXDEFMAP(GNEParametersDialog) GNEParametersDialogMap[] = {
42 FXMAPFUNC(SEL_CHORE, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
43 FXMAPFUNC(SEL_TIMEOUT, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
44 FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
45 FXMAPFUNC(SEL_CLOSE, 0, GNEParametersDialog::onCmdCancel),
46};
47
53
61
62// Object implementation
63FXIMPLEMENT(GNEParametersDialog, GNEDialog, GNEParametersDialogMap, ARRAYNUMBER(GNEParametersDialogMap))
64FXIMPLEMENT(GNEParametersDialog::ParametersValues, FXGroupBox, ParametersValuesMap, ARRAYNUMBER(ParametersValuesMap))
65FXIMPLEMENT(GNEParametersDialog::ParametersOperations, FXGroupBox, ParametersOperationsMap, ARRAYNUMBER(ParametersOperationsMap))
66
67// ===========================================================================
68// member method definitions
69// ===========================================================================
70
71// ---------------------------------------------------------------------------
72// GNEParametersDialog::ParametersValues - methods
73// ---------------------------------------------------------------------------
74
75GNEParametersDialog::ParametersValues::ParametersValues(FXHorizontalFrame* frame, const std::string& name) :
76 FXGroupBox(frame, name.c_str(), GUIDesignGroupBoxFrameFill) {
77 // create labels for keys and values
78 FXHorizontalFrame* horizontalFrameLabels = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
79 myKeyLabel = new FXLabel(horizontalFrameLabels, "key", nullptr, GUIDesignLabelThickedFixed(100));
80 new FXLabel(horizontalFrameLabels, "value", nullptr, GUIDesignLabelThick(JUSTIFY_NORMAL));
81 // create scroll windows
82 FXScrollWindow* scrollWindow = new FXScrollWindow(this, LAYOUT_FILL);
83 // create vertical frame for rows
84 myVerticalFrameRow = new FXVerticalFrame(scrollWindow, GUIDesignAuxiliarFrame);
85}
86
87
89
90
91void
93 // clear rows
94 clearParameters();
95 // iterate over parameters
96 for (const auto& newParameter : newParameters) {
97 addParameter(newParameter);
98 }
99}
100
101
102void
103GNEParametersDialog::ParametersValues::setParameters(const std::vector<std::pair<std::string, std::string> >& newParameters) {
104 // clear rows
105 clearParameters();
106 // iterate over parameters
107 for (const auto& newParameter : newParameters) {
108 addParameter(newParameter);
109 }
110}
111
112
113void
114GNEParametersDialog::ParametersValues::addParameter(std::pair<std::string, std::string> newParameter) {
115 // enable last row
116 myParameterRows.back()->enableRow(newParameter.first, newParameter.second);
117 // add row
118 myParameterRows.push_back(new ParameterRow(this, myVerticalFrameRow));
119 // enable add button in the last row
120 myParameterRows.back()->toggleAddButton();
121}
122
123
124void
126 // iterate over all rows
127 for (const auto& parameterRow : myParameterRows) {
128 delete parameterRow;
129 }
130 //clear myParameterRows;
131 myParameterRows.clear();
132 // add row
133 myParameterRows.push_back(new ParameterRow(this, myVerticalFrameRow));
134 // enable add button in the last row
135 myParameterRows.back()->toggleAddButton();
136}
137
138
139const std::vector<GNEParametersDialog::ParametersValues::ParameterRow*>
141 return myParameterRows;
142}
143
144
145bool
147 // just iterate over myParameterRows and compare key
148 for (const auto& row : myParameterRows) {
149 if (row->keyField->getText().text() == key) {
150 return true;
151 }
152 }
153 return false;
154}
155
156
157long
158GNEParametersDialog::ParametersValues::onPaint(FXObject* o, FXSelector f, void* p) {
159 // size of key label has to be updated in every interation
160 if (myParameterRows.size() > 0) {
161 myKeyLabel->setWidth(myParameterRows.front()->keyField->getWidth());
162 }
163 return FXGroupBox::onPaint(o, f, p);
164}
165
166
167long
169 // find what value was changed
170 for (int i = 0; i < (int)myParameterRows.size(); i++) {
171 if (myParameterRows.at(i)->keyField == obj) {
172 // change color of text field depending if key is valid or empty
173 if (myParameterRows.at(i)->keyField->getText().empty() || SUMOXMLDefinitions::isValidParameterKey(myParameterRows.at(i)->keyField->getText().text())) {
174 myParameterRows.at(i)->keyField->setTextColor(GUIDesignTextColorBlack);
175 } else {
176 myParameterRows.at(i)->keyField->setTextColor(GUIDesignTextColorRed);
177 myParameterRows.at(i)->keyField->killFocus();
178 }
179 }
180 }
181 return 1;
182}
183
184
185long
187 // first check if add button was pressed
188 if (myParameterRows.back()->button == obj) {
189 // create new parameter
190 addParameter(std::make_pair("", ""));
191 return 1;
192 } else {
193 // in other case, button press was a "remove button". Find id and remove the Parameter
194 for (int i = 0; i < (int)myParameterRows.size(); i++) {
195 if (myParameterRows.at(i)->button == obj) {
196 // delete row
197 delete myParameterRows.at(i);
198 // just remove row
199 myParameterRows.erase(myParameterRows.begin() + i);
200 return 1;
201 }
202 }
203 }
204 // Nothing to do
205 return 1;
206}
207
208
210 horizontalFrame = new FXHorizontalFrame(verticalFrameParent, GUIDesignAuxiliarHorizontalFrame);
211 keyField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, ParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
212 valueField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, ParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
214 // only create elements if vertical frame was previously created
215 if (verticalFrameParent->id()) {
216 horizontalFrame->create();
217 }
218 // by defaults rows are disabled
219 disableRow();
220}
221
222
224 // simply delete horizontalFrame (rest of elements will be automatic deleted due they are children of horizontal frame)
225 delete horizontalFrame;
226}
227
228
229void
231 // hide all
232 keyField->setText("");
233 keyField->disable();
234 valueField->setText("");
235 valueField->disable();
236 button->disable();
237 button->setIcon(GUIIconSubSys::getIcon(GUIIcon::REMOVE));
238}
239
240
241void
242GNEParametersDialog::ParametersValues::ParameterRow::enableRow(const std::string& parameter, const std::string& value) const {
243 // restore color and enable key field
244 keyField->setText(parameter.c_str());
245 if (parameter.empty() || SUMOXMLDefinitions::isValidParameterKey(parameter)) {
246 keyField->setTextColor(GUIDesignTextColorBlack);
247 } else {
248 keyField->setTextColor(GUIDesignTextColorRed);
249 }
250 keyField->enable();
251 // restore color and enable value field
252 valueField->setText(value.c_str());
253 valueField->enable();
254 // enable button and set icon remove
255 button->enable();
256 button->setIcon(GUIIconSubSys::getIcon(GUIIcon::REMOVE));
257}
258
259
260void
262 // clear and disable parameter and value fields
263 keyField->setText("");
264 keyField->disable();
265 valueField->setText("");
266 valueField->disable();
267 // enable remove button and set "add" icon and focus
268 button->enable();
269 button->setIcon(GUIIconSubSys::getIcon(GUIIcon::ADD));
270 button->setFocus();
271}
272
273
274bool
278
279
280void
282 keyField->setText(other.keyField->getText());
283 valueField->setText(other.valueField->getText());
284}
285
286// ---------------------------------------------------------------------------
287// GNEParametersDialog::ParametersOperations - methods
288// ---------------------------------------------------------------------------
289
300
301
303
304
305long
307 // get the Additional file name
308 FXFileDialog opendialog(this, TL("Open Parameter Template"));
310 opendialog.setSelectMode(SELECTFILE_EXISTING);
311 opendialog.setPatternList(SUMOXMLDefinitions::XMLFileExtensions.getMultilineString().c_str());
312 if (gCurrentFolder.length() != 0) {
313 opendialog.setDirectory(gCurrentFolder);
314 }
315 if (opendialog.execute()) {
316 gCurrentFolder = opendialog.getDirectory();
317 std::string file = opendialog.getFilename().text();
318 // save current number of parameters
319 const int numberOfParametersbeforeLoad = (int)myParameterDialogParent->myParametersValues->getParameterRows().size();
320 // Create additional handler and run parser
321 GNEParameterHandler handler(this, file);
322 if (!XMLSubSys::runParser(handler, file, false)) {
323 WRITE_MESSAGEF(TL("Loading of Parameters From % failed."), file);
324 }
325 // show loaded attributes
326 WRITE_MESSAGEF(TL("Loaded % Parameters."), toString((int)myParameterDialogParent->myParametersValues->getParameterRows().size() - numberOfParametersbeforeLoad));
327 }
328 return 1;
329}
330
331
332long
334 // obtain file to save parameters
335 FXString file = MFXUtils::getFilename2Write(this,
336 TL("Save Parameter Template file"),
337 SUMOXMLDefinitions::XMLFileExtensions.getMultilineString().c_str(),
340 if (file == "") {
341 // None parameter file was selected, then stop function
342 return 1;
343 } else {
344 // open device
345 OutputDevice& device = OutputDevice::getDevice(file.text());
346 // write header
347 device.writeXMLHeader("Parameter", "parameter_file.xsd");
348 // iterate over all parameters and save it in the filename
349 for (const auto& row : myParameterDialogParent->myParametersValues->getParameterRows()) {
350 // write all except last
351 if (row != myParameterDialogParent->myParametersValues->getParameterRows().back()) {
352 // open tag
353 device.openTag(SUMO_TAG_PARAM);
354 // write key
355 device.writeAttr(SUMO_ATTR_KEY, row->keyField->getText().text());
356 // write value
357 device.writeAttr(SUMO_ATTR_VALUE, row->valueField->getText().text());
358 // close tag
359 device.closeTag();
360 }
361 }
362 // close device
363 device.close();
364 }
365 return 1;
366}
367
368
369long
371 // simply clear parameters from ParametersValues
372 myParameterDialogParent->myParametersValues->clearParameters();
373 return 1;
374}
375
376
377long
379 // declare two containers for parameters
380 std::vector<std::pair<std::string, std::string> > nonEmptyKeyValues;
381 std::vector<std::string> emptyKeyValues;
382 // first extract empty values
383 for (const auto& parameterRow : myParameterDialogParent->myParametersValues->getParameterRows()) {
384 // check if key is empty
385 if (!parameterRow->keyField->getText().empty()) {
386 nonEmptyKeyValues.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
387 } else if (!parameterRow->valueField->getText().empty()) {
388 emptyKeyValues.push_back(parameterRow->valueField->getText().text());
389 }
390 }
391 // sort non-empty parameters
392 std::sort(nonEmptyKeyValues.begin(), nonEmptyKeyValues.end());
393 // sort non-empty parameters
394 std::sort(emptyKeyValues.begin(), emptyKeyValues.end());
395 // add values without key
396 for (const auto& emptyKeyValue : emptyKeyValues) {
397 nonEmptyKeyValues.push_back(std::make_pair("", emptyKeyValue));
398 }
399 // finally setparameters in myParametersValues
400 myParameterDialogParent->myParametersValues->setParameters(nonEmptyKeyValues);
401 return 1;
402}
403
404
405long
407 // set help text
408 std::ostringstream help;
409 help
410 << TL("- Parameters are defined by a Key and a Value.") << "\n"
411 << TL("- In Netedit can be defined using format key1=parameter1|key2=parameter2|...") << "\n"
412 << TL("- Duplicated and empty Keys aren't valid.") << "\n"
413 << TL("- Whitespace and certain characters aren't allowed (@$%^&/|\\....)");
414 // create and open dialog
415 GNEHelpBasicDialog(myParameterDialogParent->getApplicationWindow(),
416 TL("Parameters Help"), help);
417 return 1;
418}
419
420
422 SUMOSAXHandler(file),
423 myParametersOperationsParent(ParametersOperationsParent) {
424}
425
426
428
429
430void
432 // only continue if tag is valid
433 if (element != SUMO_TAG_NOTHING) {
434 // Call parse and build depending of tag
435 switch (element) {
436 case SUMO_TAG_PARAM:
437 // Check that format of Parameter is correct
438 if (!attrs.hasAttribute(SUMO_ATTR_KEY)) {
439 WRITE_WARNING(TL("Key of Parameter not defined"));
440 } else if (!attrs.hasAttribute(SUMO_ATTR_VALUE)) {
441 WRITE_WARNING(TL("Value of Parameter not defined"));
442 } else {
443 // obtain Key and value
444 std::string key = attrs.getString(SUMO_ATTR_KEY);
445 std::string value = attrs.getString(SUMO_ATTR_VALUE);
446 // check that parsed values are correct
448 if (key.size() == 0) {
449 WRITE_WARNING(TL("Key of Parameter cannot be empty"));
450 } else {
451 WRITE_WARNINGF(TL("Key '%' of Parameter contains invalid characters"), key);
452 }
453 } else if (myParametersOperationsParent->myParameterDialogParent->myParametersValues->keyExist(key)) {
454 WRITE_WARNINGF(TL("Key '%' already exist"), key);
455 } else {
456 // add parameter to vector of myParameterDialogParent
457 myParametersOperationsParent->myParameterDialogParent->myParametersValues->addParameter(std::make_pair(key, value));
458 }
459 }
460 break;
461 default:
462 break;
463 }
464 }
465}
466
467// ---------------------------------------------------------------------------
468// GNEParametersDialog - methods
469// ---------------------------------------------------------------------------
470
472 GNEDialog(applicationWindow, TL("Edit parameters"), GUIIcon::APP_TABLE, GNEDialog::Buttons::ACCEPT_CANCEL_RESET,
474 myOriginalParameters(parameters) {
475 // create frame for Parameters and operations
476 FXHorizontalFrame* horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarFrame);
477 // create parameters values
478 myParametersValues = new ParametersValues(horizontalFrame, TL("Parameters"));
479 // create parameters operations
480 myParametersOperations = new ParametersOperations(horizontalFrame, this);
481 // fill myParametersValues
483 // open modal dialog
484 openDialog();
485}
486
488
489
490void
492 // nothing to do (yet)
493}
494
495
496std::vector<std::pair<std::string, std::string> >
498 std::vector<std::pair<std::string, std::string> > parameters;
499 for (const auto& parameterRow : myParametersValues->getParameterRows()) {
500 // ignore last row (the row with + button)
501 if (parameterRow != myParametersValues->getParameterRows().back()) {
502 // insert in parameters
503 parameters.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
504 }
505 }
506 return parameters;
507}
508
509
510long
511GNEParametersDialog::onCmdAccept(FXObject*, FXSelector, void*) {
512 // declare vector for parameters in stringvector format
513 std::vector<std::pair<std::string, std::string> > editedParameters = getEditedParameters();
514 // check keys
515 for (const auto& editedParameter : editedParameters) {
516 if (editedParameter.first.empty()) {
517 // open warning Box
518 GNEWarningBasicDialog(myApplicationWindow, TL("Empty Parameter key"), TL("Parameters with empty keys aren't allowed"));
519 return 1;
520 } else if (!SUMOXMLDefinitions::isValidParameterKey(editedParameter.first)) {
521 // open warning Box
522 GNEWarningBasicDialog(myApplicationWindow, TL("Invalid Parameter key"), TL("There are keys with invalid characters"));
523 return 1;
524 }
525 }
526 // sort sortedParameters
527 std::sort(editedParameters.begin(), editedParameters.end());
528 // check if there is duplicated keys
529 for (auto i = editedParameters.begin(); (i + 1) != editedParameters.end(); i++) {
530 if ((i->first) == (i + 1)->first) {
531 // open warning Box
532 GNEWarningBasicDialog(myApplicationWindow, TL("Duplicated Parameters"), TL("Parameters with the same key aren't allowed"));
533 return 1;
534 }
535 }
536 // close dialog accepting
537 return closeDialogAccepting();
538}
539
540
541long
542GNEParametersDialog::onCmdReset(FXObject*, FXSelector, void*) {
543 // restore original parameters
545 return 1;
546}
547
548/****************************************************************************/
FXDEFMAP(GNEParametersDialog) GNEParametersDialogMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition GUIAppEnum.h:991
@ MID_GNE_REMOVE_ATTRIBUTE
attribute removed
Definition GUIAppEnum.h:989
@ MID_GNE_BUTTON_CANCEL
cancel button
@ MID_GNE_BUTTON_RESET
reset button
@ MID_GNE_BUTTON_SAVE
save button
@ MID_GNE_BUTTON_SORT
sort button
@ MID_HELP
help button
Definition GUIAppEnum.h:653
@ MID_GNE_BUTTON_LOAD
load button
@ MID_GNE_BUTTON_CLEAR
clear button
@ MID_GNE_BUTTON_ACCEPT
accept button
#define GUIDesignGroupBoxFrame100
Group box design for elements of width 100.
Definition GUIDesigns.h:371
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButtonIcon
button only with icon
Definition GUIDesigns.h:109
#define GUIDesignTextField
Definition GUIDesigns.h:74
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:430
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:92
#define GUIDesignLabelThick(justify)
label extended over frame with thick and with text justify to left
Definition GUIDesigns.h:251
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
#define GUIDesignGroupBoxFrameFill
Group box design extended over frame (X and Y)
Definition GUIDesigns.h:368
#define GUIDesignButtonFixed(width)
button rectangular with thick and raise frame with the given width
Definition GUIDesigns.h:115
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
Definition GUIDesigns.h:409
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:254
FXString gCurrentFolder
The folder used as last.
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
@ CLEANJUNCTIONS
@ GREENVEHICLE
@ OPEN
open icons
@ SAVE
save icons
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define WRITE_MESSAGEF(...)
Definition MsgHandler.h:290
#define WRITE_WARNING(msg)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:305
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_KEY
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
The main window of Netedit.
FXVerticalFrame * myContentFrame
content frame
Definition GNEDialog.h:135
GNEApplicationWindow * myApplicationWindow
FOX needs this.
Definition GNEDialog.h:132
void openDialog(FXWindow *focusableElement=nullptr)
open dialog
long closeDialogAccepting()
close dialog accepting the changes
OpenType
Open dialog type.
Definition GNEDialog.h:55
virtual long onCmdCancel(FXObject *, FXSelector, void *)
called when cancel or no button is pressed (can be reimplemented in children)
GNEParameterHandler(ParametersOperations *ParametersOperationsParent, const std::string &file)
Constructor.
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
long onCmdSortParameters(FXObject *, FXSelector, void *)
event when user press sort parameters button
ParametersOperations(FXHorizontalFrame *frame, GNEParametersDialog *ParameterDialogParent)
FOX-declaration.
long onCmdHelpParameter(FXObject *, FXSelector, void *)
event when user press help parameters button
long onCmdClearParameters(FXObject *, FXSelector, void *)
event when user press clear parameters button
long onCmdSaveParameters(FXObject *, FXSelector, void *)
event when user press save parameters button
long onCmdLoadParameters(FXObject *, FXSelector, void *)
ParameterRow(ParametersValues *ParametersValues, FXVerticalFrame *verticalFrameParent)
constructor
void copyValues(const ParameterRow &other)
copy values of other parameter Row
bool isButtonInAddMode() const
check if remove button is in mode "add"
void enableRow(const std::string &parameter, const std::string &value) const
enable row
bool keyExist(const std::string &key) const
check if given key exist already
long onCmdSetAttribute(FXObject *, FXSelector, void *)
event when user change an attribute
const std::vector< ParameterRow * > getParameterRows() const
get vector with the ParameterRows
void setParameters(const Parameterised::Map &newParameters)
set parameters map
void addParameter(std::pair< std::string, std::string > newParameter)
add a single parameter
long onPaint(FXObject *o, FXSelector f, void *p)
long onCmdButtonPress(FXObject *, FXSelector, void *)
event when user press a remove (or add) button
ParametersOperations * myParametersOperations
pointer to parameters operations
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
const Parameterised::Map myOriginalParameters
FOX need this.
GNEParametersDialog(GNEApplicationWindow *applicationWindow, const Parameterised::Map &parameters)
constructor
std::vector< std::pair< std::string, std::string > > getEditedParameters() const
get edited parameters
ParametersValues * myParametersValues
pointer to parameters values
void runInternalTest(const InternalTestStep::DialogArgument *dialogArgument)
run internal test
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
dialog arguments, used for certain modal dialogs that can not be edited using tab
static FXString getFilename2Write(FXWindow *parent, const FXString &header, const FXString &extensions, FXIcon *icon, FXString &currentFolder)
Returns the file name to write.
Definition MFXUtils.cpp:116
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
void close()
Closes the device and removes it from the dictionary.
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.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >(), bool includeConfig=true)
Writes an XML header with optional configuration.
std::map< std::string, std::string > Map
parameters map
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SAX-handler base for SUMO-files.
static StringBijection< XMLFileExtension > XMLFileExtensions
XML file Extensions.
static bool isValidParameterKey(const std::string &value)
whether the given string is a valid key for a parameter
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.
Definition json.hpp:4471