Eclipse SUMO - Simulation of Urban MObility
GNEFixDemandElements.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 used to fix demand elements during saving
19 /****************************************************************************/
20 
23 #include <netedit/GNENet.h>
24 #include <netedit/GNEViewNet.h>
25 #include <netedit/GNEUndoList.h>
26 
27 #include "GNEFixDemandElements.h"
28 
29 
30 // ===========================================================================
31 // FOX callback mapping
32 // ===========================================================================
33 
34 FXDEFMAP(GNEFixDemandElements) GNEFixDemandElementsMap[] = {
38 };
39 
40 // Object implementation
41 FXIMPLEMENT(GNEFixDemandElements, FXDialogBox, GNEFixDemandElementsMap, ARRAYNUMBER(GNEFixDemandElementsMap))
42 
43 // ===========================================================================
44 // member method definitions
45 // ===========================================================================
46 
47 // ---------------------------------------------------------------------------
48 // GNEFixDemandElements - methods
49 // ---------------------------------------------------------------------------
50 
51 GNEFixDemandElements::GNEFixDemandElements(GNEViewNet* viewNet, const std::vector<GNEDemandElement*>& invalidDemandElements) :
52  FXDialogBox(viewNet->getApp(), "Fix demand elements problems", GUIDesignDialogBoxExplicitStretchable(800, 620)),
53  myViewNet(viewNet) {
54  // set busStop icon for this dialog
56  // create main frame
57  myMainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
58  // create frames for options
59  FXHorizontalFrame* optionsFrame = new FXHorizontalFrame(myMainFrame, GUIDesignAuxiliarFrame);
60  myLeftFrame = new FXVerticalFrame(optionsFrame, GUIDesignAuxiliarFrame);
61  myRightFrame = new FXVerticalFrame(optionsFrame, GUIDesignAuxiliarFrame);
62  // create fix route options
63  myFixRouteOptions = new FixRouteOptions(this, viewNet);
64  // create fix vehicle options
65  myFixVehicleOptions = new FixVehicleOptions(this, viewNet);
66  // create fix stops options
67  myFixStopPositionOptions = new FixStopPositionOptions(this, viewNet);
68  // create fix person plans options
69  myFixPersonPlanOptions = new FixPersonPlanOptions(this, viewNet);
70  // create buttons
71  myButtons = new Buttons(this);
72  // split invalidDemandElements in four groups
73  std::vector<GNEDemandElement*> invalidRoutes, invalidVehicles, invalidStops, invalidPlans;
74  // fill groups
75  for (const auto& invalidDemandElement : invalidDemandElements) {
76  if (invalidDemandElement->getTagProperty().isRoute()) {
77  invalidRoutes.push_back(invalidDemandElement);
78  } else if (invalidDemandElement->getTagProperty().isVehicle()) {
79  invalidVehicles.push_back(invalidDemandElement);
80  } else if (invalidDemandElement->getTagProperty().isVehicleStop()) {
81  invalidStops.push_back(invalidDemandElement);
82  } else {
83  invalidPlans.push_back(invalidDemandElement);
84  }
85  }
86  // fill options
87  myFixRouteOptions->setInvalidElements(invalidRoutes);
88  myFixVehicleOptions->setInvalidElements(invalidVehicles);
89  myFixStopPositionOptions->setInvalidElements(invalidStops);
90  myFixPersonPlanOptions->setInvalidElements(invalidPlans);
91 }
92 
93 
95 }
96 
97 
98 long
99 GNEFixDemandElements::onCmdSelectOption(FXObject* obj, FXSelector, void*) {
100  // select options
105  return 1;
106 }
107 
108 
109 long
110 GNEFixDemandElements::onCmdAccept(FXObject*, FXSelector, void*) {
111  bool abortSaving = false;
112  // fix elements
113  myFixRouteOptions->fixElements(abortSaving);
114  myFixVehicleOptions->fixElements(abortSaving);
116  myFixPersonPlanOptions->fixElements(abortSaving);
117  // check if abort saving
118  if (abortSaving) {
119  // stop modal with TRUE (abort saving)
120  getApp()->stopModal(this, FALSE);
121  } else {
122  // stop modal with TRUE (continue saving)
123  getApp()->stopModal(this, TRUE);
124  }
125  return 1;
126 }
127 
128 
129 long
130 GNEFixDemandElements::onCmdCancel(FXObject*, FXSelector, void*) {
131  // Stop Modal (abort saving)
132  getApp()->stopModal(this, FALSE);
133  return 1;
134 }
135 
136 // ---------------------------------------------------------------------------
137 // GNEFixDemandElements::FixOptions - methods
138 // ---------------------------------------------------------------------------
139 
140 GNEFixDemandElements::FixOptions::FixOptions(FXVerticalFrame* frameParent, const std::string& title, GNEViewNet* viewNet) :
141  MFXGroupBoxModule(frameParent, title, MFXGroupBoxModule::Options::SAVE),
142  myViewNet(viewNet) {
143  // Create table
144  myTable = new FXTable(this, this, MID_TABLE, GUIDesignTableFixElements);
145  myTable->disable();
146  // create horizontal frame
147  FXHorizontalFrame* horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
148  // create vertical frames
149  myLeftFrame = new FXVerticalFrame(horizontalFrame, GUIDesignAuxiliarVerticalFrame);
150  myRightFrame = new FXVerticalFrame(horizontalFrame, GUIDesignAuxiliarVerticalFrame);
151 }
152 
153 
154 void
155 GNEFixDemandElements::FixOptions::setInvalidElements(const std::vector<GNEDemandElement*>& invalidElements) {
156  // update invalid elements
157  myInvalidElements = invalidElements;
158  // configure table
159  myTable->setTableSize((int)(myInvalidElements.size()), 3);
160  myTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
161  myTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
162  myTable->setEditable(false);
163  // configure header
164  myTable->setVisibleColumns(4);
165  myTable->setColumnWidth(0, GUIDesignHeight);
166  myTable->setColumnWidth(1, 150);
167  myTable->setColumnWidth(2, 200);
168  myTable->setColumnText(0, "");
169  myTable->setColumnText(1, toString(SUMO_ATTR_ID).c_str());
170  myTable->setColumnText(2, "Conflict");
171  myTable->getRowHeader()->setWidth(0);
172  // Declare pointer to FXTableItem
173  FXTableItem* item = nullptr;
174  // iterate over invalid routes
175  for (int i = 0; i < (int)myInvalidElements.size(); i++) {
176  // Set icon
177  item = new FXTableItem("", myInvalidElements.at(i)->getACIcon());
178  item->setIconPosition(FXTableItem::CENTER_X);
179  myTable->setItem(i, 0, item);
180  // Set ID
181  item = new FXTableItem(myInvalidElements.at(i)->getID().c_str());
182  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
183  myTable->setItem(i, 1, item);
184  // Set conflict
185  item = new FXTableItem(myInvalidElements.at(i)->getDemandElementProblem().c_str());
186  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
187  myTable->setItem(i, 2, item);
188  }
189  // check if enable or disable options
190  if (invalidElements.size() > 0) {
191  enableOptions();
192  toggleSaveButton(true);
193  } else {
194  disableOptions();
195  toggleSaveButton(false);
196  }
197 }
198 
199 bool
201  const FXString file = MFXUtils::getFilename2Write(myTable,
202  TL("Save list of conflicted items"), ".txt",
204  if (file == "") {
205  return false;
206  }
207  try {
208  // open output device
209  OutputDevice& dev = OutputDevice::getDevice(file.text());
210  // get invalid element ID and problem
211  for (const auto& invalidElement : myInvalidElements) {
212  dev << invalidElement->getID() << ":" << invalidElement->getDemandElementProblem() << "\n";
213  }
214  // close output device
215  dev.close();
216  // write warning if netedit is running in testing mode
217  WRITE_DEBUG("Opening FXMessageBox 'Saving list of conflicted items successfully'");
218  // open message box error
219  FXMessageBox::information(myTable, MBOX_OK, "Saving successfully", "%s", "List of conflicted items was successfully saved");
220  // write warning if netedit is running in testing mode
221  WRITE_DEBUG("Closed FXMessageBox 'Saving list of conflicted items successfully' with 'OK'");
222  } catch (IOError& e) {
223  // write warning if netedit is running in testing mode
224  WRITE_DEBUG("Opening FXMessageBox 'error saving list of conflicted items'");
225  // open message box error
226  FXMessageBox::error(myTable, MBOX_OK, "Saving list of conflicted items failed", "%s", e.what());
227  // write warning if netedit is running in testing mode
228  WRITE_DEBUG("Closed FXMessageBox 'error saving list of conflicted items' with 'OK'");
229  }
230  return true;
231 }
232 
233 // ---------------------------------------------------------------------------
234 // GNEFixDemandElements::FixRouteOptions - methods
235 // ---------------------------------------------------------------------------
236 
238  FixOptions(fixDemandElementsParent->myLeftFrame, "Routes", viewNet) {
239  // Remove invalid routes
240  removeInvalidRoutes = new FXRadioButton(myLeftFrame, TL("Remove invalid routes"),
241  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
242  // Save invalid routes
243  saveInvalidRoutes = new FXRadioButton(myLeftFrame, TL("Save invalid routes"),
244  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
245  // Select invalid routes
246  selectInvalidRoutesAndCancel = new FXRadioButton(myRightFrame, TL("Select conflicted routes"),
247  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
248  // Remove stops out of route
249  removeStopsOutOfRoute = new FXCheckButton(myRightFrame, TL("Remove stops out of route"),
250  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignCheckButtonFix);
251  // leave option "removeInvalidRoutes" as default
252  removeInvalidRoutes->setCheck(true);
253  // ... and remove stops out of route
254  removeStopsOutOfRoute->setCheck(TRUE);
255 }
256 
257 
258 void
260  if (option == removeInvalidRoutes) {
261  removeInvalidRoutes->setCheck(true);
262  saveInvalidRoutes->setCheck(false);
263  selectInvalidRoutesAndCancel->setCheck(false);
264  } else if (option == saveInvalidRoutes) {
265  removeInvalidRoutes->setCheck(false);
266  saveInvalidRoutes->setCheck(true);
267  selectInvalidRoutesAndCancel->setCheck(false);
268  } else if (option == selectInvalidRoutesAndCancel) {
269  removeInvalidRoutes->setCheck(false);
270  saveInvalidRoutes->setCheck(false);
271  selectInvalidRoutesAndCancel->setCheck(true);
272  }
273 }
274 
275 
276 void
278  if (myInvalidElements.size() > 0) {
279  if (removeInvalidRoutes->getCheck() == TRUE) {
280  // begin undo list
281  myViewNet->getUndoList()->begin(GUIIcon::ROUTE, "delete invalid routes");
282  // iterate over invalid routes to delete it
283  for (const auto& invalidRoute : myInvalidElements) {
284  // special case for embedded routes
285  if (invalidRoute->getTagProperty().getTag() == GNE_TAG_ROUTE_EMBEDDED) {
286  myViewNet->getNet()->deleteDemandElement(invalidRoute->getParentDemandElements().front(), myViewNet->getUndoList());
287  } else {
289  }
290  }
291  // end undo list
292  myViewNet->getUndoList()->end();
293  } else if (selectInvalidRoutesAndCancel->getCheck() == TRUE) {
294  // begin undo list
295  myViewNet->getUndoList()->begin(GUIIcon::ROUTE, "select invalid routes");
296  // iterate over invalid single lane elements to select all elements
297  for (const auto& invalidRoute : myInvalidElements) {
298  invalidRoute->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
299  }
300  // end undo list
301  myViewNet->getUndoList()->end();
302  // abort saving
303  abortSaving = true;
304  }
305  // check if remove stops
306  if (removeStopsOutOfRoute->getCheck() == TRUE) {
307  // get all stops to remove
308  std::vector<GNEDemandElement*> stopsToRemove;
309  for (const auto& invalidRoute : myInvalidElements) {
310  const auto invaldstops = invalidRoute->getInvalidStops();
311  // append to stopsToRemove
312  stopsToRemove.insert(stopsToRemove.end(), invaldstops.begin(), invaldstops.end());
313  }
314  // begin undo list
315  myViewNet->getUndoList()->begin(GUIIcon::STOP, "delete invalid stops");
316  // remove all
317  for (const auto& stopToRemove : stopsToRemove) {
319  }
320  // end undo list
321  myViewNet->getUndoList()->end();
322  }
323  }
324 }
325 
326 
327 void
329  removeInvalidRoutes->enable();
330  saveInvalidRoutes->enable();
331  selectInvalidRoutesAndCancel->enable();
332  removeStopsOutOfRoute->enable();
333 }
334 
335 
336 void
338  removeInvalidRoutes->disable();
339  saveInvalidRoutes->disable();
340  selectInvalidRoutesAndCancel->disable();
341  removeStopsOutOfRoute->disable();
342 }
343 
344 // ---------------------------------------------------------------------------
345 // GNEFixDemandElements::FixVehicleOptions - methods
346 // ---------------------------------------------------------------------------
347 
349  FixOptions(fixDemandElementsParent->myLeftFrame, "Vehicles", viewNet) {
350  // Remove invalid vehicles
351  removeInvalidVehicles = new FXRadioButton(myLeftFrame, TL("Remove invalid vehicles"),
352  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
353  // Save invalid vehicles
354  saveInvalidVehicles = new FXRadioButton(myLeftFrame, TL("Save invalid vehicles"),
355  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
356  // Select invalid vehicle
357  selectInvalidVehiclesAndCancel = new FXRadioButton(myRightFrame, TL("Select conflicted vehicle"),
358  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
359  // Remove stops out of route
360  removeStopsOutOfVehicle = new FXCheckButton(myRightFrame, TL("Remove stops out of vehicle's route"),
361  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignCheckButtonFix);
362  // by default remove invalid vehicles
363  removeInvalidVehicles->setCheck(TRUE);
364  // ... and remove stops out of route
365  removeStopsOutOfVehicle->setCheck(TRUE);
366 }
367 
368 
369 void
371  if (option == removeInvalidVehicles) {
372  removeInvalidVehicles->setCheck(true);
373  saveInvalidVehicles->setCheck(false);
374  selectInvalidVehiclesAndCancel->setCheck(false);
375  } else if (option == saveInvalidVehicles) {
376  removeInvalidVehicles->setCheck(false);
377  saveInvalidVehicles->setCheck(true);
378  selectInvalidVehiclesAndCancel->setCheck(false);
379  } else if (option == selectInvalidVehiclesAndCancel) {
380  removeInvalidVehicles->setCheck(false);
381  saveInvalidVehicles->setCheck(false);
382  selectInvalidVehiclesAndCancel->setCheck(true);
383  }
384 }
385 
386 
387 void
389  if (myInvalidElements.size() > 0) {
390  if (removeInvalidVehicles->getCheck() == TRUE) {
391  // begin undo list
392  myViewNet->getUndoList()->begin(GUIIcon::VEHICLE, "delete invalid vehicles");
393  // iterate over invalid vehicles to delete it
394  for (const auto& invalidVehicle : myInvalidElements) {
395  myViewNet->getNet()->deleteDemandElement(invalidVehicle, myViewNet->getUndoList());
396  }
397  // end undo list
398  myViewNet->getUndoList()->end();
399  } else if (selectInvalidVehiclesAndCancel->getCheck() == TRUE) {
400  // begin undo list
401  myViewNet->getUndoList()->begin(GUIIcon::ROUTE, "select invalid routes");
402  // iterate over invalid single lane elements to select all elements
403  for (const auto& invalidVehicle : myInvalidElements) {
404  invalidVehicle->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
405  }
406  // end undo list
407  myViewNet->getUndoList()->end();
408  // abort saving
409  abortSaving = true;
410  }
411  // check if remove stops
412  if (removeStopsOutOfVehicle->getCheck() == TRUE) {
413  // get all stops to remove
414  std::vector<GNEDemandElement*> stopsToRemove;
415  for (const auto& invalidVehicle : myInvalidElements) {
416  const auto invaldstops = invalidVehicle->getInvalidStops();
417  // append to stopsToRemove
418  stopsToRemove.insert(stopsToRemove.end(), invaldstops.begin(), invaldstops.end());
419  }
420  // begin undo list
421  myViewNet->getUndoList()->begin(GUIIcon::STOP, "delete invalid stops");
422  // remove all
423  for (const auto& stopToRemove : stopsToRemove) {
425  }
426  // end undo list
427  myViewNet->getUndoList()->end();
428  }
429  }
430 }
431 
432 
433 void
435  removeInvalidVehicles->enable();
436  saveInvalidVehicles->enable();
437  selectInvalidVehiclesAndCancel->enable();
438  removeStopsOutOfVehicle->enable();
439 }
440 
441 
442 void
444  removeInvalidVehicles->disable();
445  saveInvalidVehicles->disable();
446  selectInvalidVehiclesAndCancel->disable();
447  removeStopsOutOfVehicle->disable();
448 }
449 
450 // ---------------------------------------------------------------------------
451 // GNEFixDemandElements::FixStopPositionOptions - methods
452 // ---------------------------------------------------------------------------
453 
455  FixOptions(fixDemandElementsParent->myRightFrame, "Stop positions", viewNet) {
456  // Activate friendlyPos and save
457  activateFriendlyPositionAndSave = new FXRadioButton(myLeftFrame, TL("Activate friendlyPos and save"),
458  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
459  // Save invalid position
460  saveInvalid = new FXRadioButton(myLeftFrame, TL("Save invalid positions"),
461  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
462  // Select invalid Stops
463  selectInvalidStopsAndCancel = new FXRadioButton(myRightFrame, TL("Select conflicted Stops"),
464  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
465  // Fix positions and save
466  fixPositionsAndSave = new FXRadioButton(myRightFrame, TL("Fix positions and save"),
467  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
468  // leave option "activateFriendlyPositionAndSave" as default
469  activateFriendlyPositionAndSave->setCheck(true);
470 }
471 
472 
473 void
475  if (option == activateFriendlyPositionAndSave) {
476  activateFriendlyPositionAndSave->setCheck(true);
477  fixPositionsAndSave->setCheck(false);
478  saveInvalid->setCheck(false);
479  selectInvalidStopsAndCancel->setCheck(false);
480  } else if (option == fixPositionsAndSave) {
481  activateFriendlyPositionAndSave->setCheck(false);
482  fixPositionsAndSave->setCheck(true);
483  saveInvalid->setCheck(false);
484  selectInvalidStopsAndCancel->setCheck(false);
485  } else if (option == saveInvalid) {
486  activateFriendlyPositionAndSave->setCheck(false);
487  fixPositionsAndSave->setCheck(false);
488  saveInvalid->setCheck(true);
489  selectInvalidStopsAndCancel->setCheck(false);
490  } else if (option == selectInvalidStopsAndCancel) {
491  activateFriendlyPositionAndSave->setCheck(false);
492  fixPositionsAndSave->setCheck(false);
493  saveInvalid->setCheck(false);
494  selectInvalidStopsAndCancel->setCheck(true);
495  }
496 }
497 
498 
499 void
501  // check options for stops
502  if (myInvalidElements.size() > 0) {
503  if (activateFriendlyPositionAndSave->getCheck() == TRUE) {
504  // begin undo list
505  myViewNet->getUndoList()->begin(GUIIcon::STOP, "change " + toString(SUMO_ATTR_FRIENDLY_POS) + " of invalid stops");
506  // iterate over invalid stops to enable friendly position
507  for (const auto& stop : myInvalidElements) {
508  stop->setAttribute(SUMO_ATTR_FRIENDLY_POS, "true", myViewNet->getUndoList());
509  }
510  myViewNet->getUndoList()->end();
511  } else if (fixPositionsAndSave->getCheck() == TRUE) {
512  myViewNet->getUndoList()->begin(GUIIcon::STOP, "fix positions of invalid stops");
513  // iterate over invalid stops to fix positions
514  for (const auto& stop : myInvalidElements) {
515  stop->fixDemandElementProblem();
516  }
517  myViewNet->getUndoList()->end();
518  } else if (selectInvalidStopsAndCancel->getCheck() == TRUE) {
519  myViewNet->getUndoList()->begin(GUIIcon::STOP, "select invalid stops");
520  // iterate over invalid stops to select all elements
521  for (const auto& stop : myInvalidElements) {
522  stop->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
523  }
524  // end undo list
525  myViewNet->getUndoList()->end();
526  // abort saving
527  abortSaving = true;
528  }
529  }
530 }
531 
532 
533 void
535  activateFriendlyPositionAndSave->enable();
536  fixPositionsAndSave->enable();
537  saveInvalid->enable();
538  selectInvalidStopsAndCancel->enable();
539 }
540 
541 
542 void
544  activateFriendlyPositionAndSave->disable();
545  fixPositionsAndSave->disable();
546  saveInvalid->disable();
547  selectInvalidStopsAndCancel->disable();
548 }
549 
550 // ---------------------------------------------------------------------------
551 // GNEFixDemandElements::FixPersonPlanOptions - methods
552 // ---------------------------------------------------------------------------
553 
555  FixOptions(fixDemandElementsParent->myRightFrame, "Person/container plans", viewNet) {
556  // Delete person plan
557  deletePersonPlan = new FXRadioButton(myLeftFrame, TL("Delete person plan"),
558  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
559  // Save invalid person plans
560  saveInvalid = new FXRadioButton(myLeftFrame, TL("Save invalid person plans"),
561  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
562  // Select invalid person plans
563  selectInvalidPersonPlansAndCancel = new FXRadioButton(myRightFrame, TL("Select conflicted person plans"),
564  fixDemandElementsParent, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
565  // leave option "activateFriendlyPositionAndSave" as default
566  deletePersonPlan->setCheck(true);
567 }
568 
569 
570 void
572  if (option == deletePersonPlan) {
573  deletePersonPlan->setCheck(true);
574  saveInvalid->setCheck(false);
575  selectInvalidPersonPlansAndCancel->setCheck(false);
576  selectInvalidPersonPlansAndCancel->setCheck(false);
577  } else if (option == saveInvalid) {
578  deletePersonPlan->setCheck(false);
579  saveInvalid->setCheck(true);
580  selectInvalidPersonPlansAndCancel->setCheck(false);
581  } else if (option == selectInvalidPersonPlansAndCancel) {
582  deletePersonPlan->setCheck(false);
583  saveInvalid->setCheck(false);
584  selectInvalidPersonPlansAndCancel->setCheck(true);
585  }
586 }
587 
588 
589 void
591  // check options for person plans
592  if (myInvalidElements.size() > 0) {
593  if (deletePersonPlan->getCheck() == TRUE) {
594  // begin undo list
595  myViewNet->getUndoList()->begin(GUIIcon::MODEPERSONPLAN, "delete invalid person plans");
596  // remove all invalid person plans
597  for (const auto& personPlan : myInvalidElements) {
599  }
600  myViewNet->getUndoList()->end();
601  } else if (selectInvalidPersonPlansAndCancel->getCheck() == TRUE) {
602  myViewNet->getUndoList()->begin(GUIIcon::MODEPERSONPLAN, "select invalid person plans");
603  // iterate over invalid person plans to select all elements
604  for (const auto& personPlan : myInvalidElements) {
605  personPlan->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
606  }
607  // end undo list
608  myViewNet->getUndoList()->end();
609  // abort saving
610  abortSaving = false;
611  }
612  }
613 }
614 
615 
616 void
618  deletePersonPlan->enable();
619  saveInvalid->enable();
620  selectInvalidPersonPlansAndCancel->enable();
621 }
622 
623 
624 void
626  deletePersonPlan->disable();
627  saveInvalid->disable();
628  selectInvalidPersonPlansAndCancel->disable();
629 }
630 
631 // ---------------------------------------------------------------------------
632 // GNEFixDemandElements::Buttons - methods
633 // ---------------------------------------------------------------------------
634 
636  FXHorizontalFrame(fixDemandElementsParent->myMainFrame, GUIDesignHorizontalFrame) {
637  new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
640  new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
641  // set focus in accept button
642  myAcceptButton->setFocus();
643 }
644 
645 /****************************************************************************/
FXDEFMAP(GNEFixDemandElements) GNEFixDemandElementsMap[]
@ MID_GNE_BUTTON_CANCEL
cancel button
Definition: GUIAppEnum.h:1394
@ MID_TABLE
The Table.
Definition: GUIAppEnum.h:535
@ MID_CHOOSEN_OPERATION
set type of selection
Definition: GUIAppEnum.h:593
@ MID_GNE_BUTTON_ACCEPT
accept button
Definition: GUIAppEnum.h:1392
#define GUIDesignRadioButtonFix
design for radio button with fixed height (used in fix elements dialogs)
Definition: GUIDesigns.h:241
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:162
#define GUIDesignButtonCancel
Cancel Button.
Definition: GUIDesigns.h:168
#define GUIDesignCheckButtonFix
design for check button with fixed height (used in fix elements dialogs)
Definition: GUIDesigns.h:216
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:405
#define GUIDesignAuxiliarVerticalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:411
#define GUIDesignTableFixElements
design for tables used in GNEFixDemandElements dialogs
Definition: GUIDesigns.h:640
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
Definition: GUIDesigns.h:396
#define GUIDesignHorizontalFrame
Horizontal frame extended over frame parent with padding and spacing.
Definition: GUIDesigns.h:334
#define GUIDesignDialogBoxExplicitStretchable(width, height)
design for dialog box with specific width and height that can be stretched (But not shrunk)
Definition: GUIDesigns.h:620
FXString gCurrentFolder
The folder used as last.
@ MODEPERSONPLAN
@ SUPERMODEDEMAND
@ SAVE
save icons
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:306
#define TL(string)
Definition: MsgHandler.h:315
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_FRIENDLY_POS
@ 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
horizontal frame for buttons
FXButton * myAcceptButton
accept button
FXButton * myCancelButton
cancel button
Buttons(GNEFixDemandElements *fixDemandElementsParent)
build Position Options
bool saveContents() const
save contents
FXVerticalFrame * myRightFrame
vertical right frame
FXTable * myTable
Table with the demand elements.
void setInvalidElements(const std::vector< GNEDemandElement * > &invalidElements)
set invalid demand elements
FXVerticalFrame * myLeftFrame
vertical left frame
FixOptions(FXVerticalFrame *frameParent, const std::string &title, GNEViewNet *viewNet)
constructor
groupbox for all radio buttons related with fix person plan options
FXRadioButton * deletePersonPlan
Option "delete person plan".
FixPersonPlanOptions(GNEFixDemandElements *fixDemandElementsParent, GNEViewNet *viewNet)
build Position Options
void disableOptions()
disable personPlan options
void selectOption(FXObject *option)
select option
FXRadioButton * selectInvalidPersonPlansAndCancel
Option "Select invalid person plans and cancel".
void enableOptions()
enable personPlan options
void fixElements(bool &abortSaving)
fix elements
FXRadioButton * saveInvalid
Option "Save invalid".
groupbox for all radio buttons related with fix route options
void selectOption(FXObject *option)
select option
void fixElements(bool &abortSaving)
fix elements
FXRadioButton * removeInvalidRoutes
Option "Remove invalid routes".
FXRadioButton * saveInvalidRoutes
Option "Save invalid routes".
FXRadioButton * selectInvalidRoutesAndCancel
Option "Select invalid routes and cancel".
FXCheckButton * removeStopsOutOfRoute
Option "Remove stops out of route".
void disableOptions()
disable route options
FixRouteOptions(GNEFixDemandElements *fixDemandElementsParent, GNEViewNet *viewNet)
constructor
groupbox for all radio buttons related with fix stop options
FXRadioButton * saveInvalid
Option "Save invalid".
void fixElements(bool &abortSaving)
fix elements
FixStopPositionOptions(GNEFixDemandElements *fixDemandElementsParent, GNEViewNet *viewNet)
build Position Options
FXRadioButton * fixPositionsAndSave
Option "Fix Positions and save".
FXRadioButton * selectInvalidStopsAndCancel
Option "Select invalid stops and cancel".
void selectOption(FXObject *option)
select option
FXRadioButton * activateFriendlyPositionAndSave
Option "Activate friendlyPos and save".
groupbox for all radio buttons related with fix vehicle options
FXRadioButton * saveInvalidVehicles
Option "save invalid vehicles".
FXCheckButton * removeStopsOutOfVehicle
Option "Remove stops out of vehicle".
void selectOption(FXObject *option)
select option
FXRadioButton * selectInvalidVehiclesAndCancel
Option "Select invalid vehicles and cancel".
void fixElements(bool &abortSaving)
fix elements
FXRadioButton * removeInvalidVehicles
Option "remove invalid elements".
FixVehicleOptions(GNEFixDemandElements *fixDemandElementsParent, GNEViewNet *viewNet)
constructor
void disableOptions()
disable vehicle options
Dialog for edit rerouters.
FixStopPositionOptions * myFixStopPositionOptions
fix stop options
long onCmdSelectOption(FXObject *obj, FXSelector, void *)
FixRouteOptions * myFixRouteOptions
fix route options
FXVerticalFrame * myRightFrame
vertical right frame
FXVerticalFrame * myMainFrame
main frame
FixVehicleOptions * myFixVehicleOptions
fix vehicle options
GNEViewNet * myViewNet
view net
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
FixPersonPlanOptions * myFixPersonPlanOptions
fix person plan options
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
FXVerticalFrame * myLeftFrame
vertical left frame
void deleteDemandElement(GNEDemandElement *demandElement, GNEUndoList *undoList)
remove demand element
Definition: GNENet.cpp:671
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...
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
MFXGroupBoxModule (based on FXGroupBox)
Options
GroupBoxModule options.
static FXString getFilename2Write(FXWindow *parent, const FXString &header, const FXString &extension, FXIcon *icon, FXString &currentFolder)
Returns the file name to write.
Definition: MFXUtils.cpp:82
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
void close()
Closes the device and removes it from the dictionary.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
Definition: json.hpp:4471