Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEFixAdditionalElements.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// Dialog used to fix additional elements
19/****************************************************************************/
20
23#include <netedit/GNENet.h>
24#include <netedit/GNEUndoList.h>
26
28
29// ===========================================================================
30// FOX callback mapping
31// ===========================================================================
32
38
39// Object implementation
40FXIMPLEMENT(GNEFixAdditionalElements, GNEFixElementsDialog, GNEFixAdditionalElementsMap, ARRAYNUMBER(GNEFixAdditionalElementsMap))
41
42// ===========================================================================
43// member method definitions
44// ===========================================================================
45
47 GNEFixElementsDialog(viewNet, TL("Fix additional problems"), GUIIcon::BUSSTOP, 500, 380) {
48 // create AdditionalList
49 myAdditionalList = new AdditionalList(this);
50 // create position options
51 myPositionOptions = new PositionOptions(this);
52 // create consecutive lane options
53 myConsecutiveLaneOptions = new ConsecutiveLaneOptions(this);
54 // create buttons
55 myButtons = new Buttons(this);
56}
57
58
61
62
63FXuint
64GNEFixAdditionalElements::openDialog(const std::vector<GNEAdditional*>& invalidSingleLaneAdditionals, const std::vector<GNEAdditional*>& invalidMultiLaneAdditionals) {
65 myAdditionalList->updateList(invalidSingleLaneAdditionals, invalidMultiLaneAdditionals);
66 // check if position options has to be disabled
69 }
70 // check if consecutive lane options has to be disabled
73 }
74 // set focus in accept button
75 myButtons->myAcceptButton->setFocus();
76 // open modal dialog
77 return openFixDialog();
78}
79
80
81void
83 // chooose solution
84 if (dialogTest->fixSolution == "savePositionInvalids") {
85 myPositionOptions->saveInvalids->setCheck(TRUE, TRUE);
86 } else if (dialogTest->fixSolution == "fixPositions") {
87 myPositionOptions->fixPositions->setCheck(TRUE, TRUE);
88 } else if (dialogTest->fixSolution == "selectPositionInvalids") {
89 myPositionOptions->selectInvalids->setCheck(TRUE, TRUE);
90 } else if (dialogTest->fixSolution == "activatePositionFriendlyPos") {
91 myPositionOptions->activateFriendlyPosition->setCheck(TRUE, TRUE);
92 }
93 // accept changes
94 onCmdAccept(nullptr, 0, nullptr);
95}
96
97
98long
99GNEFixAdditionalElements::onCmdSelectOption(FXObject* obj, FXSelector, void*) {
102 return 1;
103}
104
105
106long
107GNEFixAdditionalElements::onCmdAccept(FXObject*, FXSelector, void*) {
108 bool continueSaving = true;
109 // first check options from single lane additionals
111 if (myPositionOptions->activateFriendlyPosition->getCheck() == TRUE) {
113 "change " + toString(SUMO_ATTR_FRIENDLY_POS) + " of invalid additionals");
114 // iterate over invalid single lane elements to enable friendly position
115 for (const auto& invalidSingleLaneAdditional : myAdditionalList->myInvalidSingleLaneAdditionals) {
116 invalidSingleLaneAdditional->setAttribute(SUMO_ATTR_FRIENDLY_POS, "true", myViewNet->getUndoList());
117 }
119 } else if (myPositionOptions->fixPositions->getCheck() == TRUE) {
121 "fix positions of invalid additionals");
122 // iterate over invalid single lane elements to fix positions
123 for (const auto& invalidSingleLaneAdditional : myAdditionalList->myInvalidSingleLaneAdditionals) {
124 invalidSingleLaneAdditional->fixAdditionalProblem();
125 }
127 } else if (myPositionOptions->selectInvalids->getCheck() == TRUE) {
129 "select invalid additionals");
130 // iterate over invalid single lane elements to select all elements
131 for (const auto& invalidSingleLaneAdditional : myAdditionalList->myInvalidSingleLaneAdditionals) {
132 invalidSingleLaneAdditional->setAttribute(GNE_ATTR_SELECTED, "true", myViewNet->getUndoList());
133 }
135 // abort saving
136 continueSaving = false;
137 }
138 }
139 // now check options from multi lane additionals
142 "fix multilane additionals problems");
143 // fix problems of consecutive lanes
144 if (myConsecutiveLaneOptions->buildConnectionBetweenLanes->getCheck() == TRUE) {
145 // iterate over invalid single lane elements to enable friendly position
146 for (const auto& invalidMultiLaneAdditional : myAdditionalList->myInvalidMultiLaneAdditionals) {
147 invalidMultiLaneAdditional->fixAdditionalProblem();
148 }
149 // we need to check if after first fix there is still Invalid MultiL-ane Additionals with errors
150 const auto copyOfInvalidMultiLaneAdditionals = myAdditionalList->myInvalidMultiLaneAdditionals;
152 for (const auto& invalidMultiLaneAdditional : copyOfInvalidMultiLaneAdditionals) {
153 if (!invalidMultiLaneAdditional->isAdditionalValid()) {
154 myAdditionalList->myInvalidMultiLaneAdditionals.push_back(invalidMultiLaneAdditional);
155 }
156 }
157 } else if (myConsecutiveLaneOptions->removeInvalidElements->getCheck() == TRUE) {
158 // iterate over invalid single lane elements to fix positions
159 for (const auto& invalidMultiLaneAdditional : myAdditionalList->myInvalidMultiLaneAdditionals) {
160 myViewNet->getNet()->deleteAdditional(invalidMultiLaneAdditional, myViewNet->getUndoList());
161 }
162 // clear myInvalidMultiLaneAdditionals due there isn't more invalid multi lane additionals
164 }
165 // fix problem of positions
166 if (myPositionOptions->activateFriendlyPosition->getCheck() == TRUE) {
167 // iterate over invalid single lane elements to enable friendly position
168 for (const auto& invalidSingleLaneAdditional : myAdditionalList->myInvalidSingleLaneAdditionals) {
169 invalidSingleLaneAdditional->setAttribute(SUMO_ATTR_FRIENDLY_POS, "true", myViewNet->getUndoList());
170 }
171 } else if (myPositionOptions->fixPositions->getCheck() == TRUE) {
172 // iterate over invalid single lane elements to fix positions
173 for (const auto& invalidSingleLaneAdditional : myAdditionalList->myInvalidSingleLaneAdditionals) {
174 invalidSingleLaneAdditional->fixAdditionalProblem();
175 }
176 }
178 }
179 return closeFixDialog(continueSaving);
180}
181
182
183long
184GNEFixAdditionalElements::onCmdCancel(FXObject*, FXSelector, void*) {
185 return closeFixDialog(false);
186}
187
188// ---------------------------------------------------------------------------
189// GNEFixDemandElements::DemandList - methods
190// ---------------------------------------------------------------------------
191
193 FXGroupBox(fixAdditionalPositions->myMainFrame, "Stopping places and E2 detectors with conflicts", GUIDesignGroupBoxFrameFill) {
194 // Create table
196}
197
198
199void
200GNEFixAdditionalElements::AdditionalList::updateList(const std::vector<GNEAdditional*>& invalidSingleLaneAdditionals, const std::vector<GNEAdditional*>& invalidMultiLaneAdditionals) {
201 // update containers
202 myInvalidSingleLaneAdditionals = invalidSingleLaneAdditionals;
203 myInvalidMultiLaneAdditionals = invalidMultiLaneAdditionals;
204 // clear table
205 myTable->clearItems();
206 // set number of rows
207 myTable->setTableSize(int(myInvalidSingleLaneAdditionals.size() + myInvalidMultiLaneAdditionals.size()), 3);
208 // configure table
209 myTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
210 myTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
211 myTable->setEditable(false);
212 myTable->setVisibleColumns(4);
213 myTable->setColumnWidth(0, GUIDesignHeight);
214 myTable->setColumnWidth(1, 160);
215 myTable->setColumnWidth(2, 280);
216 myTable->setColumnText(0, "");
217 myTable->setColumnText(1, toString(SUMO_ATTR_ID).c_str());
218 myTable->setColumnText(2, "Conflict");
219 myTable->getRowHeader()->setWidth(0);
220 // Declare index for rows and pointer to FXTableItem
221 int indexRow = 0;
222 FXTableItem* item = nullptr;
223 // iterate over single lane additionals
224 for (const auto& invalidSingleLaneAdditional : myInvalidSingleLaneAdditionals) {
225 // Set icon
226 item = new FXTableItem("", invalidSingleLaneAdditional->getACIcon());
227 item->setIconPosition(FXTableItem::CENTER_X);
228 myTable->setItem(indexRow, 0, item);
229 // Set ID
230 item = new FXTableItem(invalidSingleLaneAdditional->getID().c_str());
231 item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
232 myTable->setItem(indexRow, 1, item);
233 // Set conflict
234 item = new FXTableItem(invalidSingleLaneAdditional->getAdditionalProblem().c_str());
235 item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
236 myTable->setItem(indexRow, 2, item);
237 // Update index
238 indexRow++;
239 }
240 // iterate over multi lane additionals
241 for (const auto& invalidMultiLaneAdditional : myInvalidMultiLaneAdditionals) {
242 // Set icon
243 item = new FXTableItem("", invalidMultiLaneAdditional->getACIcon());
244 item->setIconPosition(FXTableItem::CENTER_X);
245 myTable->setItem(indexRow, 0, item);
246 // Set ID
247 item = new FXTableItem(invalidMultiLaneAdditional->getID().c_str());
248 item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
249 myTable->setItem(indexRow, 1, item);
250 // set conflict
251 item = new FXTableItem((invalidMultiLaneAdditional->getAdditionalProblem()).c_str());
252 item->setJustify(FXTableItem::LEFT | FXTableItem::CENTER_Y);
253 myTable->setItem(indexRow, 2, item);
254 // Update index
255 indexRow++;
256 }
257}
258
259// ---------------------------------------------------------------------------
260// GNEFixAdditionalElements::PositionOptions - methods
261// ---------------------------------------------------------------------------
262
264 MFXGroupBoxModule(fixAdditionalPositions->myMainFrame, "Select a solution for StoppingPlaces and E2 detectors") {
265 // create horizontal frames for radio buttons
266 FXHorizontalFrame* RadioButtons = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
267 // create Vertical Frame for left options
268 FXVerticalFrame* RadioButtonsLeft = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
269 activateFriendlyPosition = GUIDesigns::buildFXRadioButton(RadioButtonsLeft, TL("Activate friendlyPos and save"), "", TL("Friendly pos parameter will be activated in all stopping places and E2 detectors"),
270 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
271 saveInvalids = GUIDesigns::buildFXRadioButton(RadioButtonsLeft, TL("Save invalid positions"), "", TL("Save stopping places and E2 detectors with invalid positions"),
272 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
273 // create Vertical Frame for right options
274 FXVerticalFrame* RadioButtonsRight = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
275 fixPositions = GUIDesigns::buildFXRadioButton(RadioButtonsRight, TL("Fix positions and save"), "", TL("Position of stopping places and E2 detectors will be fixed"),
276 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
277 selectInvalids = GUIDesigns::buildFXRadioButton(RadioButtonsRight, TL("Select invalid additionals"), "", TL("Cancel saving of additionals and select invalid stopping places and E2 detectors"),
278 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
279 // leave option "activateFriendlyPosition" as default
280 activateFriendlyPosition->setCheck(true);
281}
282
283
284void
286 if (option == activateFriendlyPosition) {
287 activateFriendlyPosition->setCheck(true);
288 fixPositions->setCheck(false);
289 saveInvalids->setCheck(false);
290 selectInvalids->setCheck(false);
291 } else if (option == fixPositions) {
292 activateFriendlyPosition->setCheck(false);
293 fixPositions->setCheck(true);
294 saveInvalids->setCheck(false);
295 selectInvalids->setCheck(false);
296 } else if (option == saveInvalids) {
297 activateFriendlyPosition->setCheck(false);
298 fixPositions->setCheck(false);
299 saveInvalids->setCheck(true);
300 selectInvalids->setCheck(false);
301 } else if (option == selectInvalids) {
302 activateFriendlyPosition->setCheck(false);
303 fixPositions->setCheck(false);
304 saveInvalids->setCheck(false);
305 selectInvalids->setCheck(true);
306 }
307}
308
309
310void
312 activateFriendlyPosition->enable();
313 fixPositions->enable();
314 saveInvalids->enable();
315 selectInvalids->enable();
316}
317
318
319void
321 activateFriendlyPosition->disable();
322 fixPositions->disable();
323 saveInvalids->disable();
324 selectInvalids->disable();
325}
326
327// ---------------------------------------------------------------------------
328// GNEFixAdditionalElements::ConsecutiveLaneOptions - methods
329// ---------------------------------------------------------------------------
330
332 MFXGroupBoxModule(fixAdditionalPositions->myMainFrame, "Select a solution for Multilane E2 detectors") {
333 // create horizontal frames for radio buttons
334 FXHorizontalFrame* RadioButtons = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
335 // create Vertical Frame for left options
336 FXVerticalFrame* RadioButtonsLeft = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
337 buildConnectionBetweenLanes = GUIDesigns::buildFXRadioButton(RadioButtonsLeft, TL("Build connections between lanes"), "", TL("New connections will be created between non-connected lanes"),
338 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
339 removeInvalidElements = GUIDesigns::buildFXRadioButton(RadioButtonsLeft, TL("Remove invalid E2 detectors"), "", TL("Remove Multilane E2 Detectors with non-connected lanes"),
340 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
341 // add a vertical separator between both options
342 new FXVerticalSeparator(RadioButtons, GUIDesignVerticalSeparator);
343 // create Vertical Frame for right options
344 FXVerticalFrame* RadioButtonsRight = new FXVerticalFrame(RadioButtons, GUIDesignAuxiliarVerticalFrame);
345 activateFriendlyPosition = GUIDesigns::buildFXRadioButton(RadioButtonsRight, TL("Activate friendlyPos and save"), "", TL("Friendly pos parameter will be activated in all stopping places and E2 detectors"),
346 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
347 fixPositions = GUIDesigns::buildFXRadioButton(RadioButtonsRight, TL("Fix positions and save"), "", TL("Position of stopping places and E2 detectors will be fixed"),
348 fixAdditionalPositions, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
349 // leave option "buildConnectionBetweenLanes" and "activateFriendlyPosition" as default
350 buildConnectionBetweenLanes->setCheck(true);
351 activateFriendlyPosition->setCheck(true);
352}
353
354
355void
357 // set top buttons
358 if (option == buildConnectionBetweenLanes) {
359 buildConnectionBetweenLanes->setCheck(true);
360 removeInvalidElements->setCheck(false);
361 } else if (option == removeInvalidElements) {
362 buildConnectionBetweenLanes->setCheck(false);
363 removeInvalidElements->setCheck(true);
364 }
365 // set down buttons
366 if (option == activateFriendlyPosition) {
367 activateFriendlyPosition->setCheck(true);
368 fixPositions->setCheck(false);
369 } else if (option == fixPositions) {
370 activateFriendlyPosition->setCheck(false);
371 fixPositions->setCheck(true);
372 }
373}
374
375
376void
378 buildConnectionBetweenLanes->enable();
379 removeInvalidElements->enable();
380 activateFriendlyPosition->enable();
381 fixPositions->enable();
382}
383
384
385void
387 buildConnectionBetweenLanes->disable();
388 removeInvalidElements->disable();
389 activateFriendlyPosition->disable();
390 fixPositions->disable();
391}
392
393/****************************************************************************/
FXDEFMAP(GNEFixAdditionalElements) GNEFixAdditionalElementsMap[]
@ MID_GNE_BUTTON_CANCEL
cancel button
@ MID_CHOOSEN_OPERATION
set type of selection
Definition GUIAppEnum.h:597
@ MID_GNE_FIXSTOPPINGPLACES_CHANGE
FixStoppingPlaces dialog.
@ MID_GNE_BUTTON_ACCEPT
accept button
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition GUIDesigns.h:634
#define GUIDesignVerticalSeparator
vertical separator
Definition GUIDesigns.h:466
#define GUIDesignAuxiliarVerticalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:408
#define GUIDesignGroupBoxFrameFill
Group box design extended over frame (X and Y)
Definition GUIDesigns.h:349
#define GUIDesignRadioButton
Definition GUIDesigns.h:229
#define GUIDesignHorizontalFrame
Horizontal frame extended over frame parent with padding and spacing.
Definition GUIDesigns.h:328
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
#define TL(string)
Definition MsgHandler.h:305
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_ID
int GUIDesignHeight
the default size for GUI elements
Definition StdDefs.cpp:36
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
std::vector< GNEAdditional * > myInvalidMultiLaneAdditionals
vector with the invalid multi-lane additionals
AdditionalList(GNEFixAdditionalElements *fixAdditionalPositions)
constructor
FXTable * myTable
list with the stoppingPlaces and detectors
std::vector< GNEAdditional * > myInvalidSingleLaneAdditionals
vector with the invalid single-lane additionals
void updateList(const std::vector< GNEAdditional * > &invalidSingleLaneAdditionals, const std::vector< GNEAdditional * > &invalidMultiLaneAdditionals)
update list with the invalid additionals
groupbox for group all radio buttons related to additionals with consecutive lanes
ConsecutiveLaneOptions(GNEFixAdditionalElements *fixAdditionalPositions)
build consecutive lane Options
FXRadioButton * removeInvalidElements
Option "remove invalid elements".
FXRadioButton * fixPositions
Option "Fix Positions and save".
FXRadioButton * buildConnectionBetweenLanes
Option "build connections between lanes".
FXRadioButton * activateFriendlyPosition
Option "Activate friendlyPos and save".
void disableConsecutiveLaneOptions()
disable consecutive lane options
void enableConsecutiveLaneOptions()
enable consecutive lane options
groupbox for group all radio buttons related to additionals with single lanes
FXRadioButton * fixPositions
Option "Fix Positions and save".
FXRadioButton * selectInvalids
Option "Select invalid stops and cancel".
FXRadioButton * activateFriendlyPosition
Option "Activate friendlyPos and save".
FXRadioButton * saveInvalids
Option "Save invalid".
PositionOptions(GNEFixAdditionalElements *fixAdditionalPositions)
build Position Options
void selectOption(FXObject *option)
select option
FXuint openDialog(const std::vector< GNEAdditional * > &invalidSingleLaneAdditionals, const std::vector< GNEAdditional * > &invalidMultiLaneAdditionals)
open fix additional dialog
PositionOptions * myPositionOptions
position options
long onCmdSelectOption(FXObject *obj, FXSelector, void *)
event when user select a option
ConsecutiveLaneOptions * myConsecutiveLaneOptions
consecutive lane options
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
AdditionalList * myAdditionalList
Additional List.
void runInternalTest(const InternalTestStep::DialogTest *modalArguments)
run internal test
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
FXButton * myAcceptButton
accept button
long openFixDialog()
open dialog
GNEViewNet * myViewNet
view net
long closeFixDialog(const bool success)
stop fix elements dialog accepting changes
FXVerticalFrame * myMainFrame
main
void deleteAdditional(GNEAdditional *additional, GNEUndoList *undoList)
remove additional
Definition GNENet.cpp:715
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 FXRadioButton * buildFXRadioButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXObject *tgt, FXSelector sel, FXuint opts=RADIOBUTTON_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 radio button
dialog arguments (used for certain functions that opens modal dialogs)
const std::string fixSolution
solution for fix dialogs
MFXGroupBoxModule (based on FXGroupBox)