Eclipse SUMO - Simulation of Urban MObility
GNEDialog_FixAdditionalElements.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-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
15 // Dialog used to fix additional elements
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
26 #include <netedit/GNENet.h>
27 #include <netedit/GNEViewNet.h>
28 #include <netedit/GNEUndoList.h>
29 
31 
32 
33 // ===========================================================================
34 // FOX callback mapping
35 // ===========================================================================
36 
37 FXDEFMAP(GNEDialog_FixAdditionalElements) GNEDialog_FixAdditionalElementsMap[] = {
41 };
42 
43 // Object implementation
44 FXIMPLEMENT(GNEDialog_FixAdditionalElements, FXDialogBox, GNEDialog_FixAdditionalElementsMap, ARRAYNUMBER(GNEDialog_FixAdditionalElementsMap))
45 
46 // ===========================================================================
47 // member method definitions
48 // ===========================================================================
49 
50 GNEDialog_FixAdditionalElements::GNEDialog_FixAdditionalElements(GNEViewNet* viewNet, const std::vector<GNEAdditional*>& invalidSingleLaneAdditionals, const std::vector<GNEAdditional*>& invalidMultiLaneAdditionals) :
51  FXDialogBox(viewNet->getApp(), ("Fix additional problems"), GUIDesignDialogBoxExplicit(500, 380)),
52  myViewNet(viewNet) {
53  // set busStop icon for this dialog
55  // create main frame
56  myMainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
57  // create AdditionalList
58  myAdditionalList = new AdditionalList(this, invalidSingleLaneAdditionals, invalidMultiLaneAdditionals);
59  // create position options
60  myPositionOptions = new PositionOptions(this);
61  // create consecutive lane options
62  myConsecutiveLaneOptions = new ConsecutiveLaneOptions(this);
63  // check if position options has to be disabled
64  if (myAdditionalList->myInvalidSingleLaneAdditionals.empty()) {
65  myPositionOptions->disablePositionOptions();
66  }
67  // check if consecutive lane options has to be disabled
68  if (myAdditionalList->myInvalidMultiLaneAdditionals.empty()) {
69  myConsecutiveLaneOptions->disableConsecutiveLaneOptions();
70  }
71  // create dialog buttons bot centered
72  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(myMainFrame, GUIDesignHorizontalFrame);
73  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
74  myAcceptButton = new FXButton(buttonsFrame, FXWindow::tr("&Accept"), GUIIconSubSys::getIcon(ICON_ACCEPT), this, MID_GNE_ADDITIONALDIALOG_BUTTONACCEPT, GUIDesignButtonAccept);
75  myCancelButton = new FXButton(buttonsFrame, FXWindow::tr("&Cancel"), GUIIconSubSys::getIcon(ICON_CANCEL), this, MID_GNE_ADDITIONALDIALOG_BUTTONCANCEL, GUIDesignButtonCancel);
76  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
77  // set focus in accept button
78  myAcceptButton->setFocus();
79 }
80 
81 
83 }
84 
85 
86 long
87 GNEDialog_FixAdditionalElements::onCmdSelectOption(FXObject* obj, FXSelector, void*) {
90  return 1;
91 }
92 
93 
94 long
95 GNEDialog_FixAdditionalElements::onCmdAccept(FXObject*, FXSelector, void*) {
96  bool continueSaving = true;
97  // first check options from single lane additionals
99  if (myPositionOptions->activateFriendlyPositionAndSave->getCheck() == TRUE) {
100  myViewNet->getUndoList()->p_begin("change " + toString(SUMO_ATTR_FRIENDLY_POS) + " of invalid additionals");
101  // iterate over invalid single lane elements to enable friendly position
103  i->setAttribute(SUMO_ATTR_FRIENDLY_POS, "true", myViewNet->getUndoList());
104  }
106  } else if (myPositionOptions->fixPositionsAndSave->getCheck() == TRUE) {
107  myViewNet->getUndoList()->p_begin("fix positions of invalid additionals");
108  // iterate over invalid single lane elements to fix positions
110  i->fixAdditionalProblem();
111  }
113  } else if (myPositionOptions->selectInvalidStopsAndCancel->getCheck() == TRUE) {
114  myViewNet->getUndoList()->p_begin("select invalid additionals");
115  // iterate over invalid single lane elements to select all elements
117  i->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
118  }
120  // abort saving
121  continueSaving = false;
122  }
123  }
124  // now check options from multi lane additionals
126  myViewNet->getUndoList()->p_begin("fix multilane additionals problems");
127  // fix problems of consecutive lanes
128  if (myConsecutiveLaneOptions->buildConnectionBetweenLanes->getCheck() == TRUE) {
129  // iterate over invalid single lane elements to enable friendly position
131  i->fixAdditionalProblem();
132  }
133  // we need to check if after first fix there is still Invalid MultiL-ane Additionals with errors
134  auto copyOfInvalidMultiLaneAdditionals = myAdditionalList->myInvalidMultiLaneAdditionals;
136  for (auto i : copyOfInvalidMultiLaneAdditionals) {
137  if (!i->isAdditionalValid()) {
139  }
140  }
141  } else if (myConsecutiveLaneOptions->removeInvalidElements->getCheck() == TRUE) {
142  // iterate over invalid single lane elements to fix positions
145  }
146  // clear myInvalidMultiLaneAdditionals due there isn't more invalid multi lane additionals
148  }
149  // fix problem of positions
150  if (myPositionOptions->activateFriendlyPositionAndSave->getCheck() == TRUE) {
151  // iterate over invalid single lane elements to enable friendly position
153  i->setAttribute(SUMO_ATTR_FRIENDLY_POS, "true", myViewNet->getUndoList());
154  }
155  } else if (myPositionOptions->fixPositionsAndSave->getCheck() == TRUE) {
156  // iterate over invalid single lane elements to fix positions
158  i->fixAdditionalProblem();
159  }
160  }
162  }
163  if (continueSaving) {
164  // stop modal with TRUE (continue saving)
165  getApp()->stopModal(this, TRUE);
166  } else {
167  // stop modal with TRUE (abort saving)
168  getApp()->stopModal(this, FALSE);
169  }
170  return 1;
171 }
172 
173 
174 long
175 GNEDialog_FixAdditionalElements::onCmdCancel(FXObject*, FXSelector, void*) {
176  // Stop Modal (abort saving)
177  getApp()->stopModal(this, FALSE);
178  return 1;
179 }
180 
181 // ---------------------------------------------------------------------------
182 // GNEDialog_FixDemandElements::DemandList - methods
183 // ---------------------------------------------------------------------------
184 
185 GNEDialog_FixAdditionalElements::AdditionalList::AdditionalList(GNEDialog_FixAdditionalElements* fixAdditionalPositions, const std::vector<GNEAdditional*>& invalidSingleLaneAdditionals, const std::vector<GNEAdditional*>& invalidMultiLaneAdditionals) :
186  FXGroupBox(fixAdditionalPositions->myMainFrame, "Stopping places and E2 detectors with conflicts", GUIDesignGroupBoxFrameFill),
187  myInvalidSingleLaneAdditionals(invalidSingleLaneAdditionals),
188  myInvalidMultiLaneAdditionals(invalidMultiLaneAdditionals) {
189  // Create table, copy intervals and update table
191  myTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
192  myTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
193  myTable->setEditable(false);
194  // clear table
195  myTable->clearItems();
196  // set number of rows
197  myTable->setTableSize(int(myInvalidSingleLaneAdditionals.size() + myInvalidMultiLaneAdditionals.size()), 3);
198  // Configure list
199  myTable->setVisibleColumns(4);
200  myTable->setColumnWidth(0, GUIDesignTableIconCellWidth);
201  myTable->setColumnWidth(1, 160);
202  myTable->setColumnWidth(2, 280);
203  myTable->setColumnText(0, "");
204  myTable->setColumnText(1, toString(SUMO_ATTR_ID).c_str());
205  myTable->setColumnText(2, "Conflict");
206  myTable->getRowHeader()->setWidth(0);
207  // Declare index for rows and pointer to FXTableItem
208  int indexRow = 0;
209  FXTableItem* item = nullptr;
210  // iterate over single lane additionals
211  for (auto i : myInvalidSingleLaneAdditionals) {
212  // Set icon
213  item = new FXTableItem("", i->getIcon());
214  item->setIconPosition(FXTableItem::CENTER_X);
215  myTable->setItem(indexRow, 0, item);
216  // Set ID
217  item = new FXTableItem(i->getID().c_str());
218  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
219  myTable->setItem(indexRow, 1, item);
220  // Set conflict
221  item = new FXTableItem(i->getAdditionalProblem().c_str());
222  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
223  myTable->setItem(indexRow, 2, item);
224  // Update index
225  indexRow++;
226  }
227  // iterate over multi lane additionals
228  for (auto i : myInvalidMultiLaneAdditionals) {
229  // Set icon
230  item = new FXTableItem("", i->getIcon());
231  item->setIconPosition(FXTableItem::CENTER_X);
232  myTable->setItem(indexRow, 0, item);
233  // Set ID
234  item = new FXTableItem(i->getID().c_str());
235  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
236  myTable->setItem(indexRow, 1, item);
237  // set conflict
238  item = new FXTableItem((i->getAdditionalProblem()).c_str());
239  item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
240  myTable->setItem(indexRow, 2, item);
241  // Update index
242  indexRow++;
243  }
244 }
245 
246 // ---------------------------------------------------------------------------
247 // GNEDialog_FixAdditionalElements::PositionOptions - methods
248 // ---------------------------------------------------------------------------
249 
251  FXGroupBox(fixAdditionalPositions->myMainFrame, "Select a solution for StoppingPlaces and E2 detectors", GUIDesignGroupBoxFrame) {
252  // create horizontal frames for radio buttons
253  FXHorizontalFrame* RadioButtons = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
254  // create Vertical Frame for left options
255  FXVerticalFrame* RadioButtonsLeft = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
256  activateFriendlyPositionAndSave = new FXRadioButton(RadioButtonsLeft, "Activate friendlyPos and save\t\tFriendly pos parameter will be activated in all stopping places and E2 detectors",
257  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
258  saveInvalid = new FXRadioButton(RadioButtonsLeft, "Save invalid positions\t\tSave stopping places and E2 detectors with invalid positions",
259  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
260  // create Vertical Frame for right options
261  FXVerticalFrame* RadioButtonsRight = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
262  fixPositionsAndSave = new FXRadioButton(RadioButtonsRight, "Fix positions and save\t\tPosition of stopping places and E2 detectors will be fixed",
263  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
264  selectInvalidStopsAndCancel = new FXRadioButton(RadioButtonsRight, "Select invalid additionals\t\tCancel saving of additionals and select invalid stopping places and E2 detectors",
265  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
266  // leave option "activateFriendlyPositionAndSave" as default
267  activateFriendlyPositionAndSave->setCheck(true);
268 }
269 
270 
271 void
273  if (option == activateFriendlyPositionAndSave) {
274  activateFriendlyPositionAndSave->setCheck(true);
275  fixPositionsAndSave->setCheck(false);
276  saveInvalid->setCheck(false);
277  selectInvalidStopsAndCancel->setCheck(false);
278  } else if (option == fixPositionsAndSave) {
279  activateFriendlyPositionAndSave->setCheck(false);
280  fixPositionsAndSave->setCheck(true);
281  saveInvalid->setCheck(false);
282  selectInvalidStopsAndCancel->setCheck(false);
283  } else if (option == saveInvalid) {
284  activateFriendlyPositionAndSave->setCheck(false);
285  fixPositionsAndSave->setCheck(false);
286  saveInvalid->setCheck(true);
287  selectInvalidStopsAndCancel->setCheck(false);
288  } else if (option == selectInvalidStopsAndCancel) {
289  activateFriendlyPositionAndSave->setCheck(false);
290  fixPositionsAndSave->setCheck(false);
291  saveInvalid->setCheck(false);
292  selectInvalidStopsAndCancel->setCheck(true);
293  }
294 }
295 
296 
297 void
300  fixPositionsAndSave->enable();
301  saveInvalid->enable();
302  selectInvalidStopsAndCancel->enable();
303 }
304 
305 
306 void
309  fixPositionsAndSave->disable();
310  saveInvalid->disable();
311  selectInvalidStopsAndCancel->disable();
312 }
313 
314 // ---------------------------------------------------------------------------
315 // GNEDialog_FixAdditionalElements::ConsecutiveLaneOptions - methods
316 // ---------------------------------------------------------------------------
317 
319  FXGroupBox(fixAdditionalPositions->myMainFrame, "Select a solution for Multilane E2 detectors", GUIDesignGroupBoxFrame) {
320  // create horizontal frames for radio buttons
321  FXHorizontalFrame* RadioButtons = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
322  // create Vertical Frame for left options
323  FXVerticalFrame* RadioButtonsLeft = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
324  buildConnectionBetweenLanes = new FXRadioButton(RadioButtonsLeft, "Build connections between lanes\t\tNew connections will be created between non-connected lanes",
325  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
326  removeInvalidElements = new FXRadioButton(RadioButtonsLeft, "Remove invalid E2 detectors\t\tRemove Multilane E2 Detectors with non-connected lanes",
327  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
328  // add a vertical separator beween both options
329  new FXVerticalSeparator(RadioButtons, GUIDesignVerticalSeparator);
330  // create Vertical Frame for right options
331  FXVerticalFrame* RadioButtonsRight = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
332  activateFriendlyPositionAndSave = new FXRadioButton(RadioButtonsRight, "Activate friendlyPos and save\t\tFriendly pos parameter will be activated in all stopping places and E2 detectors",
333  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
334  fixPositionsAndSave = new FXRadioButton(RadioButtonsRight, "Fix positions and save\t\tPosition of stopping places and E2 detectors will be fixed",
335  fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
336  // leave option "buildConnectionBetweenLanes" and "activateFriendlyPositionAndSave" as default
337  buildConnectionBetweenLanes->setCheck(true);
338  activateFriendlyPositionAndSave->setCheck(true);
339 }
340 
341 
342 void
344  // set top buttons
345  if (option == buildConnectionBetweenLanes) {
346  buildConnectionBetweenLanes->setCheck(true);
347  removeInvalidElements->setCheck(false);
348  } else if (option == removeInvalidElements) {
349  buildConnectionBetweenLanes->setCheck(false);
350  removeInvalidElements->setCheck(true);
351  }
352  // set down buttons
353  if (option == activateFriendlyPositionAndSave) {
354  activateFriendlyPositionAndSave->setCheck(true);
355  fixPositionsAndSave->setCheck(false);
356  } else if (option == fixPositionsAndSave) {
357  activateFriendlyPositionAndSave->setCheck(false);
358  fixPositionsAndSave->setCheck(true);
359  }
360 }
361 
362 
363 void
365  buildConnectionBetweenLanes->enable();
366  removeInvalidElements->enable();
368  fixPositionsAndSave->enable();
369 }
370 
371 
372 void
374  buildConnectionBetweenLanes->disable();
375  removeInvalidElements->disable();
377  fixPositionsAndSave->disable();
378 }
379 
380 /****************************************************************************/
#define GUIDesignTableIconCellWidth
width of cells that only contains an Icon
Definition: GUIDesigns.h:483
#define GUIDesignHorizontalFrame
Definition: GUIDesigns.h:240
#define GUIDesignVerticalSeparator
vertical separator
Definition: GUIDesigns.h:340
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
#define GUIDesignButtonCancel
Cancel Button.
Definition: GUIDesigns.h:120
FXDEFMAP(GNEDialog_FixAdditionalElements) GNEDialog_FixAdditionalElementsMap[]
void p_begin(const std::string &description)
Begin undo command sub-group. This begins a new group of commands that are treated as a single comman...
Definition: GNEUndoList.cpp:73
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
long onCmdSelectOption(FXObject *obj, FXSelector, void *)
groupbox for group all radio buttons related to additionals with consecutive lanes ...
PositionOptions(GNEDialog_FixAdditionalElements *fixAdditionalPositions)
build Position Options
FixStoppingPlaces dialog.
Definition: GUIAppEnum.h:1035
FXRadioButton * fixPositionsAndSave
Option "Fix Positions and save".
GNEUndoList * getUndoList() const
get the undoList object
Definition: GNEViewNet.cpp:933
set type of selection
Definition: GUIAppEnum.h:493
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions ...
Definition: GUIDesigns.h:286
groupbox for group all radio buttons related to additionals with single lanes
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:48
void deleteAdditional(GNEAdditional *additional, GNEUndoList *undoList)
remove additional
Definition: GNENet.cpp:625
AdditionalList(GNEDialog_FixAdditionalElements *fixAdditionalPositions, const std::vector< GNEAdditional *> &invalidSingleLaneAdditionals, const std::vector< GNEAdditional *> &invalidMultiLaneAdditionals)
constructor
#define GUIDesignDialogBoxExplicit(width, height)
design for dialog box with specift width and height (for example, additional dialogs) ...
Definition: GUIDesigns.h:461
void p_end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise, the sub-group will be added as a new command into parent group. A matching begin() must have been called previously.
Definition: GNEUndoList.cpp:80
FXRadioButton * activateFriendlyPositionAndSave
Option "Activate friendlyPos and save".
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:289
FXRadioButton * fixPositionsAndSave
Option "Fix Positions and save".
FXRadioButton * removeInvalidElements
Option "remove invalid elements".
FXRadioButton * buildConnectionBetweenLanes
Option "build connections between lanes".
FXRadioButton * selectInvalidStopsAndCancel
Option "Select invalid stops and cancel".
ConsecutiveLaneOptions(GNEDialog_FixAdditionalElements *fixAdditionalPositions)
build consecutive lane Options
FXTable * myTable
list with the stoppingPlaces and detectors
std::vector< GNEAdditional * > myInvalidMultiLaneAdditionals
vector with the invalid multi-lane additionals
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:480
#define GUIDesignGroupBoxFrameFill
Group box design extended over frame (X and Y)
Definition: GUIDesigns.h:258
#define GUIDesignAuxiliarVerticalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:292
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:117
PositionOptions * myPositionOptions
position options
ConsecutiveLaneOptions * myConsecutiveLaneOptions
consecutive lane options
An Element which don&#39;t belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:47
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:255
element is selected
GNENet * getNet() const
get the net object
Definition: GNEViewNet.cpp:927
FXRadioButton * activateFriendlyPositionAndSave
Option "Activate friendlyPos and save".
#define GUIDesignRadioButton
Definition: GUIDesigns.h:155
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
AdditionalList * myAdditionalList
Additional List.
std::vector< GNEAdditional * > myInvalidSingleLaneAdditionals
vector with the invalid single-lane additionals