Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEConnectorFrame.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2011-2026 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// The Widget for modifying lane-to-lane connections
19/****************************************************************************/
20
26#include <netedit/GNENet.h>
27#include <netedit/GNEUndoList.h>
32
33#include "GNEConnectorFrame.h"
34
35// ===========================================================================
36// FOX callback mapping
37// ===========================================================================
38
43
52
53// Object implementation
54FXIMPLEMENT(GNEConnectorFrame::ConnectionModifications, GNEGroupBoxModule, ConnectionModificationsMap, ARRAYNUMBER(ConnectionModificationsMap))
55FXIMPLEMENT(GNEConnectorFrame::ConnectionOperations, GNEGroupBoxModule, ConnectionOperationsMap, ARRAYNUMBER(ConnectionOperationsMap))
56
57
58// ===========================================================================
59// method definitions
60// ===========================================================================
61
62// ---------------------------------------------------------------------------
63// GNEConnectorFrame::CurrentLane - methods
64// ---------------------------------------------------------------------------
65
67 GNEGroupBoxModule(connectorFrameParent, TL("Lane")) {
68 // create lane label
69 myCurrentLaneLabel = new FXLabel(getCollapsableFrame(), TL("No lane selected"), 0, GUIDesignLabel(JUSTIFY_LEFT));
70}
71
72
74
75
76void
78 if (laneID.empty()) {
79 myCurrentLaneLabel->setText(TL("No lane selected"));
80 } else {
81 myCurrentLaneLabel->setText((std::string(TL("Current Lane: ")) + laneID).c_str());
82 }
83}
84
85// ---------------------------------------------------------------------------
86// GNEConnectorFrame::ConnectionModifications - methods
87// ---------------------------------------------------------------------------
88
90 GNEGroupBoxModule(connectorFrameParent, TL("Modifications")),
91 myConnectorFrameParent(connectorFrameParent) {
92
93 // Create "Cancel" button
94 myCancelButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Cancel"), "", TL("Discard connection modifications (Esc)"),
96 // Create "OK" button
97 mySaveButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("OK"), "", TL("Save connection modifications (Enter)"),
99
100 // Create checkbox for protect routes
101 myProtectRoutesCheckBox = new FXCheckButton(getCollapsableFrame(), TL("Protect routes"), this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
102}
103
104
106
107
108long
110 if (myConnectorFrameParent->myCurrentEditedLane != 0) {
111 myConnectorFrameParent->getViewNet()->getUndoList()->abortAllChangeGroups();
112 if (myConnectorFrameParent->myNumChanges) {
113 myConnectorFrameParent->getViewNet()->setStatusBarText(TL("Changes reverted"));
114 }
115 myConnectorFrameParent->cleanup();
116 myConnectorFrameParent->getViewNet()->updateViewNet();
117 }
118 return 1;
119}
120
121
122long
124 if (myConnectorFrameParent->myCurrentEditedLane != 0) {
125 // check if routes has to be protected
126 if (myProtectRoutesCheckBox->isEnabled() && (myProtectRoutesCheckBox->getCheck() == TRUE)) {
127 for (const auto& demandElement : myConnectorFrameParent->myCurrentEditedLane->getParentEdge()->getChildDemandElements()) {
128 if (demandElement->isDemandElementValid() != GNEDemandElement::Problem::OK) {
129 // open warning dialog
130 GNEWarningBasicDialog(myConnectorFrameParent->getViewNet()->getViewParent()->getGNEAppWindows(),
131 TL("Error saving connection operations"),
132 TLF("Connection edition cannot be saved because route '%s' is broken.", demandElement->getID()));
133 return 1;
134 }
135 }
136 }
137 // finish route editing
138 myConnectorFrameParent->getViewNet()->getUndoList()->end();
139 if (myConnectorFrameParent->myNumChanges) {
140 myConnectorFrameParent->getViewNet()->setStatusBarText(TL("Changes accepted"));
141 }
142 myConnectorFrameParent->cleanup();
143 // mark network for recomputing
144 myConnectorFrameParent->getViewNet()->getNet()->requireRecompute();
145 }
146 return 1;
147}
148
149// ---------------------------------------------------------------------------
150// GNEConnectorFrame::ConnectionOperations - methods
151// ---------------------------------------------------------------------------
152
154 GNEGroupBoxModule(connectorFrameParent, TL("Operations")),
155 myConnectorFrameParent(connectorFrameParent) {
156
157 // Create "Select Dead Ends" button
158 mySelectDeadEndsButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Select Dead Ends"), "", TL("Selects all lanes that have no outgoing connection (clears previous selection)"),
160 // Create "Select Dead Starts" button
161 mySelectDeadStartsButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Select Dead Starts"), "", TL("Selects all lanes that have no incoming connection (clears previous selection)"),
163 // Create "Select Conflicts" button
164 mySelectConflictsButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Select Conflicts"), "", TL("Selects all lanes with more than one incoming connection from the same edge (clears previous selection)"),
166 // Create "Select Edges which may always pass" button
167 mySelectPassingButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Select Passing"), "", TL("Selects all lanes with a connection that has the 'pass' attribute set"),
169 // Create "Clear Selected" button
170 myClearSelectedButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Clear Selected"), "", TL("Clears all connections of all selected objects"),
172 // Create "Reset Selected" button
173 myResetSelectedButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Reset Selected"), "", TL("Recomputes connections at all selected junctions"),
175}
176
177
179
180
181long
183 // select all lanes that have no successor lane
184 std::vector<GNEAttributeCarrier*> deadEnds;
185 // every edge knows its outgoing connections so we can look at each edge in isolation
186 for (const auto& edge : myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
187 for (const auto& lane : edge.second->getChildLanes()) {
188 if (edge.second->getNBEdge()->getConnectionsFromLane(lane->getIndex()).size() == 0) {
189 deadEnds.push_back(lane);
190 }
191 }
192 }
193 myConnectorFrameParent->getViewNet()->getViewParent()->getSelectorFrame()->handleIDs(deadEnds, GNESelectorFrame::ModificationMode::Operation::REPLACE);
194 myConnectorFrameParent->getViewNet()->updateViewNet();
195 return 1;
196}
197
198
199long
201 // select all lanes that have no predecessor lane
202 std::set<GNEAttributeCarrier*> deadStarts;
203 GNENet* net = myConnectorFrameParent->getViewNet()->getNet();
204 // every edge knows only its outgoing connections so we look at whole junctions
205 for (const auto& junction : myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
206 // first collect all outgoing lanes
207 for (const auto& outgoingEdge : junction.second->getGNEOutgoingEdges()) {
208 for (const auto& lane : outgoingEdge->getChildLanes()) {
209 deadStarts.insert(lane);
210 }
211 }
212 // then remove all approached lanes
213 for (const auto& incomingEdge : junction.second->getGNEIncomingEdges()) {
214 for (const auto& connection : incomingEdge->getNBEdge()->getConnections()) {
215 deadStarts.erase(net->getAttributeCarriers()->retrieveEdge(connection.toEdge->getID())->getChildLanes()[connection.toLane]);
216 }
217 }
218 }
219 std::vector<GNEAttributeCarrier*> selectObjects(deadStarts.begin(), deadStarts.end());
220 myConnectorFrameParent->getViewNet()->getViewParent()->getSelectorFrame()->handleIDs(selectObjects, GNESelectorFrame::ModificationMode::Operation::REPLACE);
221 myConnectorFrameParent->getViewNet()->updateViewNet();
222 return 1;
223}
224
225
226long
228 std::vector<GNEAttributeCarrier*> conflicts;
229 // conflicts happen per edge so we can look at each edge in isolation
230 for (const auto& edge : myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
231 const EdgeVector destinations = edge.second->getNBEdge()->getConnectedEdges();
232 for (const auto& destination : destinations) {
233 GNEEdge* dest = myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdge(destination->getID());
234 for (const auto& lane : dest->getChildLanes()) {
235 const bool isConflicted = count_if(edge.second->getNBEdge()->getConnections().begin(), edge.second->getNBEdge()->getConnections().end(),
236 NBEdge::connections_toedgelane_finder(destination, (int)lane->getIndex(), -1)) > 1;
237 if (isConflicted) {
238 conflicts.push_back(lane);
239 }
240 }
241 }
242
243 }
244 myConnectorFrameParent->getViewNet()->getViewParent()->getSelectorFrame()->handleIDs(conflicts, GNESelectorFrame::ModificationMode::Operation::REPLACE);
245 myConnectorFrameParent->getViewNet()->updateViewNet();
246 return 1;
247}
248
249
250long
252 std::vector<GNEAttributeCarrier*> pass;
253 for (const auto& edge : myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
254 for (const auto& connection : edge.second->getNBEdge()->getConnections()) {
255 if (connection.mayDefinitelyPass) {
256 pass.push_back(edge.second->getChildLanes()[connection.fromLane]);
257 }
258 }
259 }
260 myConnectorFrameParent->getViewNet()->getViewParent()->getSelectorFrame()->handleIDs(pass, GNESelectorFrame::ModificationMode::Operation::REPLACE);
261 myConnectorFrameParent->getViewNet()->updateViewNet();
262 return 1;
263}
264
265
266long
268 myConnectorFrameParent->myConnectionModifications->onCmdCancelModifications(0, 0, 0);
269 myConnectorFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::CONNECTION, TL("clear connections from selected lanes, edges and junctions"));
270 // clear junction's connection
271 const auto selectedJunctions = myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getSelectedJunctions();
272 for (const auto& junction : selectedJunctions) {
273 junction->setLogicValid(false, myConnectorFrameParent->getViewNet()->getUndoList()); // clear connections
274 junction->setLogicValid(false, myConnectorFrameParent->getViewNet()->getUndoList(), GNEAttributeCarrier::FEATURE_MODIFIED); // prevent re-guessing
275 }
276 // clear edge's connection
277 const auto selectedEdges = myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getSelectedEdges();
278 for (const auto& edge : selectedEdges) {
279 for (const auto& lane : edge->getChildLanes()) {
280 myConnectorFrameParent->removeConnections(lane);
281 }
282 }
283 // clear lane's connection
284 const auto selectedLanes = myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getSelectedLanes();
285 for (const auto& lane : selectedLanes) {
286 myConnectorFrameParent->removeConnections(lane);
287 }
288 myConnectorFrameParent->getViewNet()->getUndoList()->end();
289 myConnectorFrameParent->getViewNet()->updateViewNet();
290 return 1;
291}
292
293
294long
296 myConnectorFrameParent->myConnectionModifications->onCmdCancelModifications(0, 0, 0);
297 myConnectorFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::CONNECTION, TL("reset connections from selected lanes"));
298 const auto selectedJunctions = myConnectorFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getSelectedJunctions();
299 for (const auto& junction : selectedJunctions) {
300 junction->setLogicValid(false, myConnectorFrameParent->getViewNet()->getUndoList());
301 }
302 myConnectorFrameParent->getViewNet()->getUndoList()->end();
303 if (selectedJunctions.size() > 0) {
304 auto viewNet = myConnectorFrameParent->getViewNet();
305 viewNet->getNet()->requireRecompute();
306 viewNet->getNet()->computeNetwork(viewNet->getViewParent()->getGNEAppWindows());
307 }
308 myConnectorFrameParent->getViewNet()->updateViewNet();
309 return 1;
310}
311
312// ---------------------------------------------------------------------------
313// GNEConnectorFrame::ConnectionSelection - methods
314// ---------------------------------------------------------------------------
315
317 GNEGroupBoxModule(connectorFrameParent, TL("Selection")) {
318 // create label
319 new MFXDynamicLabel(getCollapsableFrame(), (std::string("- ") + TL("Hold <SHIFT> while clicking to create unyielding connections (pass=true).")).c_str(), 0, GUIDesignLabelFrameInformation);
320 new MFXDynamicLabel(getCollapsableFrame(), (std::string("- ") + TL("Hold <CTRL> while clicking to create conflicting connections (i.e. at zipper nodes or with incompatible permissions)")).c_str(), 0, GUIDesignLabelFrameInformation);
321}
322
323
325
326// ---------------------------------------------------------------------------
327// GNEConnectorFrame::ConnectionLegend - methods
328// ---------------------------------------------------------------------------
329
331 GNEGroupBoxModule(connectorFrameParent, TL("Information")) {
332
333 // create possible target label
334 FXLabel* possibleTargetLabel = new FXLabel(getCollapsableFrame(), TL("Possible Target"), 0, GUIDesignLabel(JUSTIFY_LEFT));
335 possibleTargetLabel->setBackColor(MFXUtils::getFXColor(connectorFrameParent->getViewNet()->getVisualisationSettings().candidateColorSettings.possible));
336 possibleTargetLabel->setTextColor(MFXUtils::getFXColor(RGBColor::WHITE));
337
338 // create source label
339 FXLabel* sourceLabel = new FXLabel(getCollapsableFrame(), TL("Source lane"), 0, GUIDesignLabel(JUSTIFY_LEFT));
340 sourceLabel->setBackColor(MFXUtils::getFXColor(connectorFrameParent->getViewNet()->getVisualisationSettings().candidateColorSettings.source));
341
342 // create target label
343 FXLabel* targetLabel = new FXLabel(getCollapsableFrame(), TL("Target lane"), 0, GUIDesignLabel(JUSTIFY_LEFT));
344 targetLabel->setBackColor(MFXUtils::getFXColor(connectorFrameParent->getViewNet()->getVisualisationSettings().candidateColorSettings.target));
345
346 // create target (pass) label
347 FXLabel* targetPassLabel = new FXLabel(getCollapsableFrame(), TL("Target (pass)"), 0, GUIDesignLabel(JUSTIFY_LEFT));
348 targetPassLabel->setBackColor(MFXUtils::getFXColor(connectorFrameParent->getViewNet()->getVisualisationSettings().candidateColorSettings.special));
349
350 // create conflict label
351 FXLabel* conflictLabel = new FXLabel(getCollapsableFrame(), TL("Conflict"), 0, GUIDesignLabel(JUSTIFY_LEFT));
352 conflictLabel->setBackColor(MFXUtils::getFXColor(connectorFrameParent->getViewNet()->getVisualisationSettings().candidateColorSettings.conflict));
353}
354
355
357
358// ---------------------------------------------------------------------------
359// GNEConnectorFrame - methods
360// ---------------------------------------------------------------------------
361
363 GNEFrame(viewParent, viewNet, TL("Edit Connections")),
365 myNumChanges(0) {
366 // create current lane module
367 myCurrentLane = new CurrentLane(this);
368
369 // create connection modifications module
371
372 // create connection operations module
374
375 // create connection selection module
377
378 // create connection legend module
379 myLegend = new Legend(this);
380}
381
382
384
385
386void
388 // get lane front
389 GNELane* clickedLane = viewObjects.getLaneFrontNonLocked();
390 // iterate over lanes
391 for (const auto& lane : viewObjects.getLanes()) {
392 // if parent edge of lane is front element, update clickedLane
393 if (lane->getParentEdge()->isMarkedForDrawingFront()) {
394 clickedLane = lane;
395 }
396 }
397 // build connection
398 buildConnection(clickedLane, myViewNet->getMouseButtonKeyPressed().shiftKeyPressed(), myViewNet->getMouseButtonKeyPressed().controlKeyPressed(), true);
399}
400
401
406
407
408void
410 // select lane as current lane
411 buildConnection(lane, false, false, true); // select as current lane
412 // iterate over all potential targets
413 for (const auto& potentialTarget : myPotentialTargets) {
414 // remove connections using the appropiate parameters in function "buildConnection"
415 buildConnection(potentialTarget, false, false, false);
416 }
417 // save modifications
418 myConnectionModifications->onCmdSaveModifications(0, 0, 0);
419}
420
421
422void
423GNEConnectorFrame::buildConnection(GNELane* lane, const bool mayDefinitelyPass, const bool allowConflict, const bool toggle) {
424 if (myCurrentEditedLane == 0) {
425 myCurrentEditedLane = lane;
426 myCurrentEditedLane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.source);
427 initTargets();
428 myNumChanges = 0;
429 myViewNet->getUndoList()->begin(GUIIcon::CONNECTION, TL("modify connections"));
430 } else if (myPotentialTargets.count(lane)
431 || (allowConflict && lane->getParentEdge()->getFromJunction() == myCurrentEditedLane->getParentEdge()->getToJunction())) {
432 const int fromIndex = myCurrentEditedLane->getIndex();
433 GNEEdge* srcEdge = myCurrentEditedLane->getParentEdge();
434 GNEEdge* destEdge = lane->getParentEdge();
435 std::vector<NBEdge::Connection> connections = srcEdge->getNBEdge()->getConnectionsFromLane(fromIndex);
436 bool changed = false;
437 // get lane status
438 LaneStatus status = getLaneStatus(connections, lane);
439 if (status == LaneStatus::CONFLICTED && allowConflict) {
441 }
442 // create depending of status
443 switch (status) {
445 if (toggle) {
446 // create new connection
447 NBEdge::Connection newCon(fromIndex, destEdge->getNBEdge(), lane->getIndex(), mayDefinitelyPass);
448 // if the connection was previously deleted (by clicking the same lane twice), restore all values
450 // fromLane must be the same, only check toLane
451 if (c.toEdge == destEdge->getNBEdge() && c.toLane == lane->getIndex()) {
452 newCon = c;
453 newCon.mayDefinitelyPass = mayDefinitelyPass;
454 }
455 }
456 NBConnection newNBCon(srcEdge->getNBEdge(), fromIndex, destEdge->getNBEdge(), lane->getIndex(), newCon.tlLinkIndex);
457 myViewNet->getUndoList()->add(new GNEChange_Connection(srcEdge, newCon, false, true), true);
458 if (mayDefinitelyPass) {
459 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.special);
460 } else {
461 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.target);
462 }
463 srcEdge->getToJunction()->invalidateTLS(myViewNet->getUndoList(), NBConnection::InvalidConnection, newNBCon);
464 }
465 break;
468 // remove connection
469 GNEConnection* con = srcEdge->retrieveGNEConnection(fromIndex, destEdge->getNBEdge(), lane->getIndex());
471 myViewNet->getNet()->deleteConnection(con, myViewNet->getUndoList());
472 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.possible);
473 changed = true;
474 break;
475 }
477 SVCPermissions fromPermissions = srcEdge->getNBEdge()->getPermissions(fromIndex);
478 SVCPermissions toPermissions = destEdge->getNBEdge()->getPermissions(lane->getIndex());
479 if ((fromPermissions & toPermissions) == SVC_PEDESTRIAN) {
480 myViewNet->setStatusBarText(TL("Pedestrian connections are generated automatically"));
481 } else if ((fromPermissions & toPermissions) == 0) {
482 myViewNet->setStatusBarText(TL("Incompatible vehicle class permissions"));
483 } else {
484 myViewNet->setStatusBarText(TL("Another lane from the same edge already connects to that lane"));
485 }
486 break;
487 }
488 default:
489 break;
490 }
491 if (changed) {
492 myNumChanges += 1;
493 }
494 } else {
495 myViewNet->setStatusBarText(TL("Invalid target for connection"));
496 }
497 myCurrentLane->updateCurrentLaneLabel(myCurrentEditedLane->getID());
498}
499
500
501void
503 // gather potential targets
504 NBNode* nbn = myCurrentEditedLane->getParentEdge()->getToJunction()->getNBNode();
505 // get potential targets
506 for (const auto& NBEEdge : nbn->getOutgoingEdges()) {
507 GNEEdge* edge = myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(NBEEdge->getID());
508 for (const auto& lane : edge->getChildLanes()) {
509 myPotentialTargets.insert(lane);
510 }
511 }
512 // set color for existing connections
513 std::vector<NBEdge::Connection> connections = myCurrentEditedLane->getParentEdge()->getNBEdge()->getConnectionsFromLane(myCurrentEditedLane->getIndex());
514 for (const auto& lane : myPotentialTargets) {
515 switch (getLaneStatus(connections, lane)) {
517 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.target);
518 break;
520 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.special);
521 break;
523 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.conflict);
524 break;
526 lane->setSpecialColor(&myViewNet->getVisualisationSettings().candidateColorSettings.possible);
527 break;
528 }
529 }
530}
531
532
533void
535 // restore colors of potential targets
536 for (auto it : myPotentialTargets) {
537 it->setSpecialColor(0);
538 }
539 // clear attributes
540 myPotentialTargets.clear();
541 myNumChanges = 0;
542 myCurrentEditedLane->setSpecialColor(0);
543 myCurrentEditedLane = nullptr;
544 myDeletedConnections.clear();
545 myCurrentLane->updateCurrentLaneLabel("");
546}
547
548
550GNEConnectorFrame::getLaneStatus(const std::vector<NBEdge::Connection>& connections, const GNELane* targetLane) const {
551 NBEdge* srcEdge = myCurrentEditedLane->getParentEdge()->getNBEdge();
552 const int fromIndex = myCurrentEditedLane->getIndex();
553 NBEdge* destEdge = targetLane->getParentEdge()->getNBEdge();
554 const int toIndex = targetLane->getIndex();
555 std::vector<NBEdge::Connection>::const_iterator con_it = find_if(
556 connections.begin(), connections.end(),
557 NBEdge::connections_finder(fromIndex, destEdge, toIndex));
558 const bool isConnected = con_it != connections.end();
559 if (isConnected) {
560 if (con_it->mayDefinitelyPass) {
562 } else {
564 }
565 } else if (srcEdge->hasConnectionTo(destEdge, toIndex)
566 || (srcEdge->getPermissions(fromIndex) & destEdge->getPermissions(toIndex) & ~SVC_PEDESTRIAN) == 0) {
568 } else {
570 }
571}
572
573
574/****************************************************************************/
FXDEFMAP(GNEConnectorFrame::ConnectionModifications) ConnectionModificationsMap[]
@ MID_GNE_CONNECTORFRAME_SELECTDEADENDS
select dead end lanes
@ MID_GNE_SET_ATTRIBUTE
attribute edited
@ MID_CANCEL
Cancel-button pressed.
Definition GUIAppEnum.h:310
@ MID_CHOOSEN_CLEAR
Clear set.
Definition GUIAppEnum.h:607
@ MID_OK
Ok-button pressed.
Definition GUIAppEnum.h:308
@ MID_GNE_CONNECTORFRAME_SELECTDEADSTARTS
select lanes that have no connection leading to it
@ MID_GNE_CONNECTORFRAME_SELECTCONFLICTS
select lanes that are connected from concurrent lanes
@ MID_CHOOSEN_RESET
Reset set.
Definition GUIAppEnum.h:611
@ MID_GNE_CONNECTORFRAME_SELECTPASS
select lanes with connections that have the pass attribute set to 'true'
#define GUIDesignButton
Definition GUIDesigns.h:100
#define GUIDesignLabel(justify)
Definition GUIDesigns.h:245
#define GUIDesignCheckButton
checkButton placed in left position
Definition GUIDesigns.h:194
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition GUIDesigns.h:281
@ CONNECTION
Definition GUIIcons.h:419
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition NBCont.h:42
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
@ SVC_PEDESTRIAN
pedestrian
static const std::string FEATURE_MODIFIED
feature has been manually modified (implies approval)
NBEdge::Connection & getNBEdgeConnection() const
get Edge::Connection
long onCmdSaveModifications(FXObject *, FXSelector, void *)
Called when the user presses the OK-Button saves any connection modifications.
ConnectionModifications(GNEConnectorFrame *connectorFrameParent)
FOX-declaration.
long onCmdCancelModifications(FXObject *, FXSelector, void *)
Called when the user presses the Cancel-button discards any connection modifications.
FXCheckButton * myProtectRoutesCheckBox
protect routes checkbox
GNEConnectorFrame * myConnectorFrameParent
pointer to connectorFrame parent
FXButton * mySelectDeadStartsButton
"Select Dead Starts" button
GNEConnectorFrame * myConnectorFrameParent
pointer to connectorFrame parent
FXButton * mySelectConflictsButton
"Select Conflicts" button
long onCmdSelectDeadEnds(FXObject *, FXSelector, void *)
Called when the user presses the select dead ends button.
long onCmdResetSelectedConnections(FXObject *, FXSelector, void *)
Called when the user presses the reset selected connections button.
long onCmdSelectDeadStarts(FXObject *, FXSelector, void *)
Called when the user presses the select dead starts button.
long onCmdSelectPass(FXObject *, FXSelector, void *)
Called when the user presses the select pass button.
FXButton * mySelectDeadEndsButton
"Select Dead Ends" button
long onCmdClearSelectedConnections(FXObject *, FXSelector, void *)
Called when the user presses the clear selected connections button.
FXButton * myClearSelectedButton
"Clear Selected"
long onCmdSelectConflicts(FXObject *, FXSelector, void *)
Called when the user presses the select conflicts button.
ConnectionOperations(GNEConnectorFrame *connectorFrameParent)
FOX-declaration.
FXButton * myResetSelectedButton
"Reset Selected"
FXButton * mySelectPassingButton
"Select Edges which may always pass"
ConnectionSelection(GNEConnectorFrame *connectorFrameParent)
constructor
FXLabel * myCurrentLaneLabel
Label for current Lane.
void updateCurrentLaneLabel(const std::string &laneID)
set current junction label
CurrentLane(GNEConnectorFrame *connectorFrameParent)
constructor
Legend(GNEConnectorFrame *connectorFrameParent)
constructor
int myNumChanges
number of changes
std::vector< NBEdge::Connection > myDeletedConnections
vector of connections deleted in the current editing step
void cleanup()
clean up when deselecting current lane
void initTargets()
init targets
GNEConnectorFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
ConnectionModifications * getConnectionModifications() const
get pointer to ConnectionModifications module
GNEConnectorFrame::ConnectionOperations * myConnectionOperations
ConnectionOperations module.
GNEConnectorFrame::Legend * myLegend
Legend module.
void buildConnection(GNELane *lane, const bool mayDefinitelyPass, const bool allowConflict, const bool toggle)
either sets the current lane or toggles the connection of the current lane to this lane (if they shar...
~GNEConnectorFrame()
Destructor.
void removeConnections(GNELane *lane)
remove connections
std::set< GNELane * > myPotentialTargets
the set of lanes to which the current lane may be connected
LaneStatus getLaneStatus(const std::vector< NBEdge::Connection > &connections, const GNELane *targetLane) const
return the status of toLane
GNEConnectorFrame::ConnectionModifications * myConnectionModifications
ConnectionModifications module.
void handleLaneClick(const GNEViewNetHelper::ViewObjectsSelector &viewObjects)
either sets the current lane or toggles the connection of the
GNELane * myCurrentEditedLane
the lane of which connections are to be modified
LaneStatus
the status of a target lane
GNEConnectorFrame::ConnectionSelection * myConnectionSelection
ConnectionSelection module.
CurrentLane * myCurrentLane
CurrentLane module.
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:766
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:87
GNEConnection * retrieveGNEConnection(int fromLane, NBEdge *to, int toLane, bool createIfNoExist=true)
get GNEConnection if exist, and if not create it if create is enabled
Definition GNEEdge.cpp:2226
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:92
GNEViewNet * getViewNet() const
get view net
Definition GNEFrame.cpp:145
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:122
GNEFrame(GNEViewParent *viewParent, GNEViewNet *viewNet, const std::string &frameLabel)
Constructor.
Definition GNEFrame.cpp:42
GNEGroupBoxModule (based on FXGroupBox).
GNEGroupBoxModule(GNEFrame *frame, const std::string &text, const int options=Options::COLLAPSIBLE)
constructor for frames
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
void invalidateTLS(GNEUndoList *undoList, const NBConnection &deletedConnection=NBConnection::InvalidConnection, const NBConnection &addedConnection=NBConnection::InvalidConnection)
int getIndex() const
returns the index of the lane
Definition GNELane.cpp:624
void setSpecialColor(const RGBColor *Color2, double colorValue=std::numeric_limits< double >::max())
Definition GNELane.cpp:886
GNEEdge * getParentEdge() const
get parent edge
Definition GNELane.cpp:214
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:174
class used to group all variables related with objects under cursor after a click over view
GNELane * getLaneFrontNonLocked() const
get front lane or a pointer to nullptr checking if is locked
const std::vector< GNELane * > & getLanes() const
get lanes
A single child window which contains a view of the simulation area.
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
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
GUIVisualizationCandidateColorSettings candidateColorSettings
candidate color settings
A list item which allows for custom coloring.
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition MFXUtils.cpp:146
static const NBConnection InvalidConnection
The representation of a single edge during network building.
Definition NBEdge.h:92
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
Definition NBEdge.cpp:4541
std::vector< Connection > getConnectionsFromLane(int lane, const NBEdge *to=nullptr, int toLane=-1) const
Returns connections from a given lane.
Definition NBEdge.cpp:1310
bool hasConnectionTo(const NBEdge *destEdge, int destLane, int fromLane=-1) const
Retrieves info about a connection to a certain lane of a certain edge.
Definition NBEdge.cpp:1348
Represents a single node (junction) during network building.
Definition NBNode.h:66
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node).
Definition NBNode.h:273
static const RGBColor WHITE
Definition RGBColor.h:199
static const RGBColor special
color for selected special candidate element (Usually selected using shift+click)
static const RGBColor conflict
color for selected conflict candidate element (Usually selected using ctrl+click)
static const RGBColor target
color for selected candidate target
static const RGBColor possible
color for possible candidate element
static const RGBColor source
color for selected candidate source
A structure which describes a connection between edges or lanes.
Definition NBEdge.h:201
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps).
Definition NBEdge.h:228
int tlLinkIndex
The index of this connection within the controlling traffic light.
Definition NBEdge.h:222