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.dev/sumo
3 // Copyright (C) 2001-2024 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);
69  new FXLabel(buttonAndLabelRoute, ("Add new " + toString(SUMO_TAG_ROUTE) + "s").c_str(), nullptr, GUIDesignLabelThick(JUSTIFY_NORMAL));
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 = GUIDesigns::buildFXButton(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(JUSTIFY_NORMAL));
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);
91  myLabelFlow = new FXLabel(buttonAndLabelFlow, ("Add new " + toString(GNE_TAG_CALIBRATOR_FLOW) + "s").c_str(), nullptr, GUIDesignLabelThick(JUSTIFY_NORMAL));
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()->second), false); // NOSONAR, constructor returns after dialog has been closed
233  // update flows table
234  updateFlowTable();
235  return 1;
236  } else {
237  throw ProcessError(TL("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.second->getAttribute(SUMO_ATTR_ID)).c_str());
367  myRouteList->setItem(indexRow, 0, item);
368  // Set edges
369  item = new FXTableItem(toString(route.second->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.second->getAttribute(SUMO_ATTR_ID).c_str());
445  myVehicleTypeList->setItem(indexRow, 0, item);
446  // Set VClass
447  item = new FXTableItem(vType.second->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:1480
@ MID_GNE_CALIBRATORDIALOG_ADD_ROUTE
add new route
Definition: GUIAppEnum.h:1478
@ MID_GNE_CALIBRATORDIALOG_ADD_FLOW
Definition: GUIAppEnum.h:1481
@ MID_GNE_CALIBRATORDIALOG_ADD_VEHICLETYPE
add vehicle type
Definition: GUIAppEnum.h:1485
@ MID_GNE_CALIBRATORDIALOG_TABLE_ROUTE
change table route
Definition: GUIAppEnum.h:1476
@ MID_GNE_CALIBRATORDIALOG_TABLE_VEHICLETYPE
change table route
Definition: GUIAppEnum.h:1483
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:97
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:637
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:405
#define GUIDesignUniformHorizontalFrame
design for horizontal frame used to pack another frames with a uniform width
Definition: GUIDesigns.h:414
#define GUIDesignLabelThick(justify)
label extended over frame with thick and with text justify to left
Definition: GUIDesigns.h:255
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
Definition: GUIDesigns.h:396
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:306
#define TL(string)
Definition: MsgHandler.h:315
@ 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
int GUIDesignHeight
the default size for GUI elements
Definition: StdDefs.cpp:34
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.
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
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.
const std::map< SumoXMLTag, std::map< const GUIGlObject *, GNEDemandElement * > > & getDemandElements() const
get demand elements
GNEDemandElement * getDefaultType() const
get default type
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:121
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:2056
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 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
Definition: GUIDesigns.cpp:128
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon