Eclipse SUMO - Simulation of Urban MObility
GNECalibratorDialog.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 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 calibrators
19 /****************************************************************************/
20 
25 #include <netedit/GNENet.h>
26 #include <netedit/GNEViewNet.h>
27 #include <netedit/GNEUndoList.h>
32 
33 #include "GNECalibratorDialog.h"
35 #include "GNERouteDialog.h"
36 #include "GNEVehicleTypeDialog.h"
37 
38 // ===========================================================================
39 // FOX callback mapping
40 // ===========================================================================
41 
42 FXDEFMAP(GNECalibratorDialog) GNECalibratorDialogMap[] = {
49 };
50 
51 // Object implementation
52 FXIMPLEMENT(GNECalibratorDialog, GNEAdditionalDialog, GNECalibratorDialogMap, ARRAYNUMBER(GNECalibratorDialogMap))
53 
54 // ===========================================================================
55 // member method definitions
56 // ===========================================================================
57 
59  GNEAdditionalDialog(editedCalibrator, false, 640, 480) {
60 
61  // Create two columns, one for Routes and VehicleTypes, and other for Flows
62  FXHorizontalFrame* columns = new FXHorizontalFrame(myContentFrame, GUIDesignUniformHorizontalFrame);
63  FXVerticalFrame* columnLeft = new FXVerticalFrame(columns, GUIDesignAuxiliarFrame);
64  FXVerticalFrame* columnRight = new FXVerticalFrame(columns, GUIDesignAuxiliarFrame);
65 
66  // create add button and label for routes
67  FXHorizontalFrame* buttonAndLabelRoute = new FXHorizontalFrame(columnLeft, GUIDesignAuxiliarHorizontalFrame);
68  myAddRoute = new FXButton(buttonAndLabelRoute, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_CALIBRATORDIALOG_ADD_ROUTE, GUIDesignButtonIcon);
69  new FXLabel(buttonAndLabelRoute, ("Add new " + toString(SUMO_TAG_ROUTE) + "s").c_str(), nullptr, GUIDesignLabelThick);
70 
71  // Create table in left frame
72  myRouteList = new FXTable(columnLeft, this, MID_GNE_CALIBRATORDIALOG_TABLE_ROUTE, GUIDesignTableAdditionals);
73  myRouteList->setSelBackColor(FXRGBA(255, 255, 255, 255));
74  myRouteList->setSelTextColor(FXRGBA(0, 0, 0, 255));
75  myRouteList->setEditable(false);
76 
77  // create add button and label for vehicle types
78  FXHorizontalFrame* buttonAndLabelVehicleType = new FXHorizontalFrame(columnLeft, GUIDesignAuxiliarHorizontalFrame);
79  myAddVehicleType = new FXButton(buttonAndLabelVehicleType, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_CALIBRATORDIALOG_ADD_VEHICLETYPE, GUIDesignButtonIcon);
80  new FXLabel(buttonAndLabelVehicleType, ("Add new " + toString(SUMO_TAG_VTYPE) + "s").c_str(), nullptr, GUIDesignLabelThick);
81 
82  // Create table in left frame
83  myVehicleTypeList = new FXTable(columnLeft, this, MID_GNE_CALIBRATORDIALOG_TABLE_VEHICLETYPE, GUIDesignTableAdditionals);
84  myVehicleTypeList->setSelBackColor(FXRGBA(255, 255, 255, 255));
85  myVehicleTypeList->setSelTextColor(FXRGBA(0, 0, 0, 255));
86  myVehicleTypeList->setEditable(false);
87 
88  // create add button and label for flows in right frame
89  FXHorizontalFrame* buttonAndLabelFlow = new FXHorizontalFrame(columnRight, GUIDesignAuxiliarHorizontalFrame);
90  myAddFlow = new FXButton(buttonAndLabelFlow, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_CALIBRATORDIALOG_ADD_FLOW, GUIDesignButtonIcon);
91  myLabelFlow = new FXLabel(buttonAndLabelFlow, ("Add new " + toString(GNE_TAG_CALIBRATOR_FLOW) + "s").c_str(), nullptr, GUIDesignLabelThick);
92 
93  // Create table in right frame
94  myFlowList = new FXTable(columnRight, this, MID_GNE_CALIBRATORDIALOG_TABLE_FLOW, GUIDesignTableAdditionals);
95  myFlowList->setSelBackColor(FXRGBA(255, 255, 255, 255));
96  myFlowList->setSelTextColor(FXRGBA(0, 0, 0, 255));
97  myFlowList->setEditable(false);
98 
99  // update tables
100  updateRouteTable();
101  updateVehicleTypeTable();
102  updateFlowTable();
103 
104  // start a undo list for editing local to this additional
105  initChanges();
106 
107  // Open dialog as modal
108  openAsModalDialog();
109 }
110 
111 
113 
114 
115 long
116 GNECalibratorDialog::onCmdAccept(FXObject*, FXSelector, void*) {
117  // accept changes before closing dialog
118  acceptChanges();
119  // Stop Modal
120  getApp()->stopModal(this, TRUE);
121  return 1;
122 }
123 
124 
125 long
126 GNECalibratorDialog::onCmdCancel(FXObject*, FXSelector, void*) {
127  // cancel changes
128  cancelChanges();
129  // Stop Modal
130  getApp()->stopModal(this, FALSE);
131  return 1;
132 }
133 
134 
135 long
136 GNECalibratorDialog::onCmdReset(FXObject*, FXSelector, void*) {
137  // reset changes
138  resetChanges();
139  // update tables
142  updateFlowTable();
143  return 1;
144 }
145 
146 
147 long
148 GNECalibratorDialog::onCmdAddRoute(FXObject*, FXSelector, void*) {
149  // create new calibrator route and configure it with modal GNERouteDialog
150  GNERouteDialog(new GNERoute(myEditedAdditional->getNet()), false); // NOSONAR, constructor returns after dialog has been closed
151  // update routes table
153  return 1;
154 }
155 
156 
157 long
158 GNECalibratorDialog::onCmdClickedRoute(FXObject*, FXSelector, void*) {
159  // check if some delete button was pressed
160  for (int i = 0; i < (int)myEditedAdditional->getNet()->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE).size(); i++) {
161  // obtain rerouter
163  if (myRouteList->getItem(i, 2)->hasFocus()) {
164  // find all flows that contains route to delete as "route" parameter
165  std::vector<GNEAdditional*> calibratorFlowsToErase;
166  for (auto j : myEditedAdditional->getChildAdditionals()) {
167  if (j->getAttribute(SUMO_ATTR_ROUTE) == myRouteList->getItem(i, 0)->getText().text()) {
168  calibratorFlowsToErase.push_back(j);
169  }
170  }
171  // if there are flows that has route to remove as "route" parameter
172  if (calibratorFlowsToErase.size() > 0) {
173  // write warning if netedit is running in testing mode
174  WRITE_DEBUG("Opening FXMessageBox of type 'question'");
175  // open question dialog box
176  const std::string msg = ("Deletion of " + toString(SUMO_TAG_ROUTE) + " '" + myRouteList->getItem(i, 0)->getText().text() + "' will remove " +
177  toString(calibratorFlowsToErase.size()) + " " + toString(GNE_TAG_CALIBRATOR_FLOW) + (calibratorFlowsToErase.size() > 1 ? ("s") : ("")) + ". Continue?");
178  FXuint answer = FXMessageBox::question(getApp(), MBOX_YES_NO, ("Remove " + toString(GNE_TAG_CALIBRATOR_FLOW) + "s").c_str(), "%s", msg.c_str());
179  if (answer != 1) { //1:yes, 2:no, 4:esc
180  // write warning if netedit is running in testing mode
181  if (answer == 2) {
182  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'No'");
183  } else if (answer == 4) {
184  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'ESC'");
185  }
186  // abort deletion of route
187  return 0;
188  } else {
189  // write warning if netedit is running in testing mode
190  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'Yes'");
191  // remove affected flows of calibrator flows
192  for (auto j : calibratorFlowsToErase) {
194  }
195  // remove route of calibrator routes
196  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(routeToEdit, false), true);
197  // update flows and route table
198  updateFlowTable();
200  return 1;
201  }
202  } else {
203  // remove route
204  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(routeToEdit, false), true);
205  // update routes table
207  return 1;
208  }
209  } else if (myRouteList->getItem(i, 0)->hasFocus() || myRouteList->getItem(i, 1)->hasFocus()) {
210  // modify route of calibrator routes with modal dialog
211  GNERouteDialog(routeToEdit, true); // NOSONAR, constructor returns after dialog has been closed
212  // update routes table
214  // update Flows routes also because Route ID could be changed
215  updateFlowTable();
216  return 1;
217  }
218  }
219  // nothing to do
220  return 0;
221 }
222 
223 
224 long
225 GNECalibratorDialog::onCmdAddFlow(FXObject*, FXSelector, void*) {
226  // get routes and vTypes
229  // only add flow if there is at least a GNERoute (There is always a Vehicle Type)
230  if (routes.size() > 0) {
231  // create new calibrator and configure it with modal GNECalibratorFlowDialog
232  GNECalibratorFlowDialog(new GNECalibratorFlow(myEditedAdditional, defaultVType, *routes.begin()), false); // NOSONAR, constructor returns after dialog has been closed
233  // update flows table
234  updateFlowTable();
235  return 1;
236  } else {
237  throw ProcessError("routes cannot be empty");
238  }
239 }
240 
241 
242 long
243 GNECalibratorDialog::onCmdClickedFlow(FXObject*, FXSelector, void*) {
244  // check if some delete button was pressed
245  for (int i = 0; i < (int)myEditedAdditional->getChildAdditionals().size(); i++) {
246  if (myFlowList->getItem(i, 2)->hasFocus()) {
247  // remove flow of calibrator flows
249  // update flows table
250  updateFlowTable();
251  return 1;
252  } else if (myFlowList->getItem(i, 0)->hasFocus() || myFlowList->getItem(i, 1)->hasFocus()) {
253  // modify flow of calibrator flows (temporal) with modal dialog
254  GNECalibratorFlowDialog(myEditedAdditional->getChildAdditionals().at(i), true); // NOSONAR, constructor returns after dialog has been closed
255  // update flows table
256  updateFlowTable();
257  return 1;
258  }
259  }
260  // nothing to do
261  return 0;
262 }
263 
264 
265 long
266 GNECalibratorDialog::onCmdAddVehicleType(FXObject*, FXSelector, void*) {
267  // create a new Vehicle Type and configure it with modal GNEVehicleTypeDialog
269  GNEVehicleTypeDialog(new GNEVType(myEditedAdditional->getNet(), vehicleTypeID, SVC_PASSENGER), false); // NOSONAR, constructor returns after dialog has been closed
270  // update vehicle types table
272  return 1;
273 }
274 
275 
276 long
277 GNECalibratorDialog::onCmdClickedVehicleType(FXObject*, FXSelector, void*) {
278  // check if some delete button was pressed
279  for (int i = 0; i < (int)myEditedAdditional->getNet()->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE).size(); i++) {
280  // obtain vehicle type
282  // Make sure that default vehicle isn't edited
283  if ((i == 0) && (myVehicleTypeList->getItem(i, 0)->hasFocus() || myVehicleTypeList->getItem(i, 1)->hasFocus() || myVehicleTypeList->getItem(i, 2)->hasFocus())) {
284  FXMessageBox::warning(getApp(), MBOX_OK,
285  ("Error editing default " + toString(SUMO_TAG_VTYPE)).c_str(), "%s",
286  ("Default " + toString(SUMO_TAG_VTYPE) + " cannot be either edited or deleted.").c_str());
287  } else if (myVehicleTypeList->getItem(i, 2)->hasFocus()) {
288  // find all flows that contains vehicle type to delete as "vehicle type" parameter
289  std::vector<GNEAdditional*> calibratorFlowsToErase;
290  for (auto j : myEditedAdditional->getChildAdditionals()) {
291  if (j->getAttribute(SUMO_ATTR_TYPE) == myVehicleTypeList->getItem(i, 0)->getText().text()) {
292  calibratorFlowsToErase.push_back(j);
293  }
294  }
295  // if there are flows that has vehicle type to remove as "vehicle type" parameter
296  if (calibratorFlowsToErase.size() > 0) {
297  const std::string msg = ("Deletion of " + toString(SUMO_TAG_VTYPE) + " '" + myVehicleTypeList->getItem(i, 0)->getText().text() + "' will remove " +
298  toString(calibratorFlowsToErase.size()) + " " + toString(GNE_TAG_CALIBRATOR_FLOW) + (calibratorFlowsToErase.size() > 1 ? ("s") : ("")) + ". Continue?");
299  FXuint answer = FXMessageBox::question(getApp(), MBOX_YES_NO, ("Remove " + toString(GNE_TAG_CALIBRATOR_FLOW) + "s").c_str(), "%s", msg.c_str());
300  if (answer != 1) { //1:yes, 2:no, 4:esc
301  // write warning if netedit is running in testing mode
302  if (answer == 2) {
303  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'No'");
304  } else if (answer == 4) {
305  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'ESC'");
306  }
307  // abort deletion of vehicle type
308  return 0;
309  } else {
310  // write warning if netedit is running in testing mode
311  WRITE_DEBUG("Closed FXMessageBox of type 'question' with 'Yes'");
312  // remove affected flows of calibrator flows
313  for (auto j : calibratorFlowsToErase) {
315  }
316  // remove vehicle type of calibrator vehicle types
317  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vType, false), true);
318  // update flows and vehicle types table
319  updateFlowTable();
321  return 1;
322  }
323  } else {
324  // remove vehicle type of calibrator vehicle types
325  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(vType, false), true);
326  // update vehicle types table
328  return 1;
329  }
330  } else if (myVehicleTypeList->getItem(i, 0)->hasFocus() || myVehicleTypeList->getItem(i, 1)->hasFocus()) {
331  // modify vehicle type with modal dialog
332  GNEVehicleTypeDialog(vType, true); // NOSONAR, constructor returns after dialog has been closed
333  // update vehicle types table
335  // update Flows routes also because VType ID could be changed
336  updateFlowTable();
337  return 1;
338  }
339  }
340  // nothing to do
341  return 0;
342 }
343 
344 
345 void
347  // clear table
348  myRouteList->clearItems();
349  // set number of rows
351  // Configure list
352  myRouteList->setVisibleColumns(4);
353  myRouteList->setColumnWidth(0, 136);
354  myRouteList->setColumnWidth(1, 136);
355  myRouteList->setColumnWidth(2, GUIDesignHeight);
356  myRouteList->setColumnText(0, toString(SUMO_ATTR_ID).c_str());
357  myRouteList->setColumnText(1, toString(SUMO_ATTR_EDGES).c_str());
358  myRouteList->setColumnText(2, "");
359  myRouteList->getRowHeader()->setWidth(0);
360  // Declare index for rows and pointer to FXTableItem
361  int indexRow = 0;
362  FXTableItem* item = nullptr;
363  // iterate over routes
365  // Set ID
366  item = new FXTableItem(toString(route->getAttribute(SUMO_ATTR_ID)).c_str());
367  myRouteList->setItem(indexRow, 0, item);
368  // Set edges
369  item = new FXTableItem(toString(route->getAttribute(SUMO_ATTR_EDGES)).c_str());
370  myRouteList->setItem(indexRow, 1, item);
371  // set remove
372  item = new FXTableItem("", GUIIconSubSys::getIcon(GUIIcon::REMOVE));
373  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
374  item->setEnabled(false);
375  myRouteList->setItem(indexRow, 2, item);
376  // Update index
377  indexRow++;
378  }
379  // enable or disable flow and label button
381 }
382 
383 
384 void
386  // clear table
387  myFlowList->clearItems();
388  // set number of rows
389  myFlowList->setTableSize(int(myEditedAdditional->getChildAdditionals().size()), 3);
390  // Configure list
391  myFlowList->setVisibleColumns(3);
392  myFlowList->setColumnWidth(0, 136);
393  myFlowList->setColumnWidth(1, 136);
394  myFlowList->setColumnWidth(2, GUIDesignHeight);
395  myFlowList->setColumnText(0, toString(SUMO_ATTR_TYPE).c_str());
396  myFlowList->setColumnText(1, toString(SUMO_ATTR_VCLASS).c_str());
397  myFlowList->setColumnText(2, "");
398  myFlowList->getRowHeader()->setWidth(0);
399  // Declare index for rows and pointer to FXTableItem
400  int indexRow = 0;
401  FXTableItem* item = nullptr;
402  // iterate over flows
403  for (auto i : myEditedAdditional->getChildAdditionals()) {
404  // Set vehicle type
405  item = new FXTableItem(i->getAttribute(SUMO_ATTR_TYPE).c_str());
406  myFlowList->setItem(indexRow, 0, item);
407  // Set route
408  item = new FXTableItem(i->getAttribute(SUMO_ATTR_ROUTE).c_str());
409  myFlowList->setItem(indexRow, 1, item);
410  // set remove
411  item = new FXTableItem("", GUIIconSubSys::getIcon(GUIIcon::REMOVE));
412  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
413  item->setEnabled(false);
414  myFlowList->setItem(indexRow, 2, item);
415  // Update index
416  indexRow++;
417  }
418  // enable or disable flow and label button
420 }
421 
422 
423 void
425  // clear table
426  myVehicleTypeList->clearItems();
427  // set number of rows
429  // Configure list
430  myVehicleTypeList->setVisibleColumns(4);
431  myVehicleTypeList->setColumnWidth(0, 136);
432  myVehicleTypeList->setColumnWidth(1, 136);
433  myVehicleTypeList->setColumnWidth(2, GUIDesignHeight);
434  myVehicleTypeList->setColumnText(0, toString(SUMO_ATTR_ID).c_str());
435  myVehicleTypeList->setColumnText(1, toString(SUMO_ATTR_VCLASS).c_str());
436  myVehicleTypeList->setColumnText(2, "");
437  myVehicleTypeList->getRowHeader()->setWidth(0);
438  // Declare index for rows and pointer to FXTableItem
439  int indexRow = 0;
440  FXTableItem* item = nullptr;
441  // iterate over vehicle types
443  // Set id
444  item = new FXTableItem(vType->getAttribute(SUMO_ATTR_ID).c_str());
445  myVehicleTypeList->setItem(indexRow, 0, item);
446  // Set VClass
447  item = new FXTableItem(vType->getAttribute(SUMO_ATTR_VCLASS).c_str());
448  myVehicleTypeList->setItem(indexRow, 1, item);
449  // set remove icon except for default vehicle type
450  if (indexRow != 0) {
451  item = new FXTableItem("", GUIIconSubSys::getIcon(GUIIcon::REMOVE));
452  } else {
453  item = new FXTableItem("");
454  }
455  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
456  item->setEnabled(false);
457  myVehicleTypeList->setItem(indexRow, 2, item);
458  // Update index
459  indexRow++;
460  }
461  // enable or disable flow and label button
463 }
464 
465 
466 void
468  // disable AddFlow button if no route is defined
470  myAddFlow->disable();
471  myFlowList->disable();
472  myLabelFlow->setText(TL("No routes defined"));
473  } else {
474  myAddFlow->enable();
475  myFlowList->enable();
476  myLabelFlow->setText(("Add new " + toString(GNE_TAG_CALIBRATOR_FLOW) + "s").c_str());
477  }
478 }
479 
480 
481 /****************************************************************************/
FXDEFMAP(GNECalibratorDialog) GNECalibratorDialogMap[]
@ MID_GNE_CALIBRATORDIALOG_TABLE_FLOW
change table flow
Definition: GUIAppEnum.h:1368
@ MID_GNE_CALIBRATORDIALOG_ADD_ROUTE
add new route
Definition: GUIAppEnum.h:1366
@ MID_GNE_CALIBRATORDIALOG_ADD_FLOW
Definition: GUIAppEnum.h:1369
@ MID_GNE_CALIBRATORDIALOG_ADD_VEHICLETYPE
add vehicle type
Definition: GUIAppEnum.h:1373
@ MID_GNE_CALIBRATORDIALOG_TABLE_ROUTE
change table route
Definition: GUIAppEnum.h:1364
@ MID_GNE_CALIBRATORDIALOG_TABLE_VEHICLETYPE
change table route
Definition: GUIAppEnum.h:1371
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:86
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:616
#define GUIDesignHeight
define a standard height for all elements (Change it carefully)
Definition: GUIDesigns.h:37
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:397
#define GUIDesignUniformHorizontalFrame
design for horizontal frame used to pack another frames with a uniform width
Definition: GUIDesigns.h:406
#define GUIDesignLabelThick
label extended over frame with thick and with text justify to left
Definition: GUIDesigns.h:226
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions
Definition: GUIDesigns.h:394
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:276
#define TL(string)
Definition: MsgHandler.h:282
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ GNE_TAG_CALIBRATOR_FLOW
a flow definition within in Calibrator
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_VCLASS
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ROUTE
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
Dialog to edit sequences, parameters, etc.. of Additionals.
void acceptChanges()
Accept changes did in this dialog.
void cancelChanges()
Cancel changes did in this dialog.
GNEAdditional * myEditedAdditional
pointer to edited additional
void resetChanges()
reset changes did in this dialog.
GNENet * getNet() const
get pointer to net
Dialog for edit calibrators.
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
FXTable * myFlowList
list with flows
long onCmdClickedFlow(FXObject *, FXSelector, void *)
remove or edit flow
FXLabel * myLabelFlow
label for flows
long onCmdClickedVehicleType(FXObject *, FXSelector, void *)
remove or edit vehicle type
FXTable * myVehicleTypeList
list with vehicle types
long onCmdAccept(FXObject *, FXSelector, void *)
long onCmdAddVehicleType(FXObject *, FXSelector, void *)
add new vehicle type
long onCmdClickedRoute(FXObject *, FXSelector, void *)
remove or edit route
void updateRouteTable()
update data table with routes
void updateFlowAndLabelButton()
update flow and label button
FXTable * myRouteList
list with routes
long onCmdAddFlow(FXObject *, FXSelector, void *)
add new flow
long onCmdAddRoute(FXObject *, FXSelector, void *)
add new route
FXButton * myAddFlow
button for add new flow
void updateFlowTable()
update data table with flows
void updateVehicleTypeTable()
update data table with vehicle types
Dialog for editing calibrator flows.
An Element which don't belong to GNENet but has influence in the simulation.
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
const std::map< SumoXMLTag, std::set< GNEDemandElement * > > & getDemandElements() const
get demand elements
std::string generateDemandElementID(SumoXMLTag tag) const
generate demand element id
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
GNEDemandElement * getDefaultType() const
get default type
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:132
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:1987
Dialog for editing Calibrator Routes.
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...
Dialog for editing calibrator vehicle types.
GNENet * getNet() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon