Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNELane.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// A class for visualizing Lane geometry (adapted from GNELaneWrapper)
19/****************************************************************************/
20#include <config.h>
21
22#include <netedit/GNENet.h>
23#include <netedit/GNEUndoList.h>
24#include <netedit/GNEViewNet.h>
37#include <netbuild/NBEdgeCont.h>
47
48#include "GNELane.h"
49#include "GNEInternalLane.h"
50#include "GNEConnection.h"
51#include "GNEEdgeTemplate.h"
52
53// ===========================================================================
54// FOX callback mapping
55// ===========================================================================
56
57// Object implementation
58FXIMPLEMENT(GNELane, FXDelegator, 0, 0)
59
60// ===========================================================================
61// method definitions
62// ===========================================================================
63
64// ---------------------------------------------------------------------------
65// GNELane::LaneDrawingConstants - methods
66// ---------------------------------------------------------------------------
67
69 myLane(lane) {
70}
71
72
73void
75 // get NBEdge
76 const auto& NBEdge = myLane->getParentEdge()->getNBEdge();
77 // get lane struct
78 const auto& laneStruct = myLane->myParentEdge->getNBEdge()->getLaneStruct(myLane->getIndex());
79 // get selection scale
81 // get lane width
82 const double laneWidth = (laneStruct.width == -1 ? SUMO_const_laneWidth : laneStruct.width);
83 // calculate exaggeration
84 myExaggeration = selectionScale * s.laneWidthExaggeration;
85 // get detail level
87 // check if draw lane as railway
88 myDrawAsRailway = isRailway(laneStruct.permissions) && ((laneStruct.permissions & SVC_BUS) == 0) && s.showRails;
89 // adjust rest of parameters depending if draw as railway
90 if (myDrawAsRailway) {
91 // draw as railway: assume standard gauge of 1435mm when lane width is not set
92 myDrawingWidth = (laneWidth == SUMO_const_laneWidth ? 1.4350 : laneWidth) * myExaggeration;
93 // calculate internal drawing width
95 } else {
96 // calculate exaggerated drawing width
97 myDrawingWidth = laneWidth * myExaggeration * 0.5;
98 // calculate internal drawing width
100 }
101 // check if draw superposed
103 // adjust parameters depending of superposing
104 if (myDrawSuperposed) {
105 // apply offset
106 myOffset = myDrawingWidth * 0.5;
107 // reduce width
108 myDrawingWidth *= 0.4;
110 } else {
111 // restore offset
112 myOffset = 0;
113 }
114}
115
116
117double
119 return myExaggeration;
120}
121
122
123double
125 return myDrawingWidth;
126}
127
128
129double
131 return myInternalDrawingWidth;
132}
133
134
135double
137 return myOffset;
138}
139
140
143 return myDetail;
144}
145
146
147bool
149 return myDrawAsRailway;
150}
151
152
153bool
155 return myDrawSuperposed;
156}
157
158// ---------------------------------------------------------------------------
159// GNELane - methods
160// ---------------------------------------------------------------------------
161
162GNELane::GNELane(GNEEdge* edge, const int index) :
163 GNENetworkElement(edge->getNet(), edge->getNBEdge()->getLaneID(index), GLO_LANE, SUMO_TAG_LANE,
164 GUIIconSubSys::getIcon(GUIIcon::LANE), {}, {}, {}, {}, {}, {}),
165 myParentEdge(edge),
166 myIndex(index),
167 myDrawingConstants(new DrawingConstants(this)),
168 mySpecialColor(nullptr),
169 mySpecialColorValue(-1),
170myLane2laneConnections(this) {
171 // update centering boundary without updating grid
172 updateCenteringBoundary(false);
173}
174
175
177 GNENetworkElement(nullptr, "dummyConstructorGNELane", GLO_LANE, SUMO_TAG_LANE,
178 GUIIconSubSys::getIcon(GUIIcon::LANE), {}, {}, {}, {}, {}, {}),
179myParentEdge(nullptr),
180myIndex(-1),
181myDrawingConstants(nullptr),
182mySpecialColor(nullptr),
183mySpecialColorValue(-1),
184myLane2laneConnections(this) {
185}
186
187
189 if (myDrawingConstants) {
190 delete myDrawingConstants;
191 }
192}
193
194
195GNEEdge*
197 return myParentEdge;
198}
199
200
201bool
205
206
207const GUIGeometry&
209 return myLaneGeometry;
210}
211
212
213const PositionVector&
221
222
223const std::vector<double>&
227
228
229const std::vector<double>&
233
234
239
240
241void
243 // Clear texture containers
246 // get lane shape and extend if is too short
247 auto laneShape = getLaneShape();
248 if (laneShape.length2D() < 1) {
249 laneShape.extrapolate2D(1 - laneShape.length2D());
250 }
251 // Obtain lane shape of NBEdge
253 // update connections
255 // update additionals children associated with this lane
256 for (const auto& additional : getParentAdditionals()) {
257 additional->updateGeometry();
258 }
259 // update additionals parents associated with this lane
260 for (const auto& additional : getChildAdditionals()) {
261 additional->updateGeometry();
262 }
263 // update partial demand elements parents associated with this lane
264 for (const auto& demandElement : getParentDemandElements()) {
265 demandElement->updateGeometry();
266 }
267 // update partial demand elements children associated with this lane
268 for (const auto& demandElement : getChildDemandElements()) {
269 demandElement->updateGeometry();
270 }
271 // Update geometry of parent generic datas that have this edge as parent
272 for (const auto& additionalParent : getParentGenericDatas()) {
273 additionalParent->updateGeometry();
274 }
275 // Update geometry of additionals generic datas vinculated to this edge
276 for (const auto& childAdditionals : getChildGenericDatas()) {
277 childAdditionals->updateGeometry();
278 }
279 // compute geometry of path elements elements vinculated with this lane (depending of showDemandElements)
281 for (const auto& childAdditional : getChildAdditionals()) {
282 childAdditional->computePathElement();
283 }
284 for (const auto& childDemandElement : getChildDemandElements()) {
285 childDemandElement->computePathElement();
286 }
287 for (const auto& childGenericData : getChildGenericDatas()) {
288 childGenericData->computePathElement();
289 }
290 }
291 // in Move mode, connections aren't updated
293 // Update incoming connections of this lane
294 const auto incomingConnections = getGNEIncomingConnections();
295 for (const auto& connection : incomingConnections) {
296 connection->updateGeometry();
297 }
298 // Update outgoings connections of this lane
299 const auto outGoingConnections = getGNEOutcomingConnections();
300 for (const auto& connection : outGoingConnections) {
301 connection->updateGeometry();
302 }
303 }
304 // if lane has enought length for show textures of restricted lanes
305 if ((getLaneShapeLength() > 4)) {
306 // if lane is restricted
308 // get values for position and rotation of icons
309 for (int i = 2; i < getLaneShapeLength() - 1; i += 15) {
312 }
313 }
314 }
315}
316
317
320 return getLaneShape().positionAtOffset2D(getLaneShape().length2D() * 0.5);
321}
322
323
324bool
326 // get inspected ACs
327 const auto& inspectedACs = myNet->getViewNet()->getInspectedAttributeCarriers();
328 // check if we're inspecting a connection
329 if ((inspectedACs.size() == 1) && (inspectedACs.front()->getTagProperty().getTag() == SUMO_TAG_CONNECTION) &&
330 inspectedACs.front()->getAttribute(GNE_ATTR_FROM_LANEID) == getID()) {
331 return true;
332 } else {
333 return false;
334 }
335}
336
337
338bool
340 // get inspected ACs
341 const auto& inspectedACs = myNet->getViewNet()->getInspectedAttributeCarriers();
342 // check if we're inspecting a connection
343 if ((inspectedACs.size() == 1) && (inspectedACs.front()->getTagProperty().getTag() == SUMO_TAG_CONNECTION) &&
344 inspectedACs.front()->getAttribute(GNE_ATTR_TO_LANEID) == getID()) {
345 return true;
346 } else {
347 return false;
348 }
349}
350
351
352bool
354 return false;
355}
356
357
358bool
360 return false;
361}
362
363
364bool
366 // first check if we're selecting edges or lanes
368 return false;
369 } else {
370 // get edit modes
371 const auto& editModes = myNet->getViewNet()->getEditModes();
372 // check if we're in delete mode
373 if (editModes.isCurrentSupermodeNetwork() && (editModes.networkEditMode == NetworkEditMode::NETWORK_DELETE)) {
375 } else {
376 return false;
377 }
378 }
379}
380
381
382bool
384 // first check if we're selecting edges or lanes
386 return false;
387 } else {
388 // get edit modes
389 const auto& editModes = myNet->getViewNet()->getEditModes();
390 // check if we're in select mode
391 if (editModes.isCurrentSupermodeNetwork() && (editModes.networkEditMode == NetworkEditMode::NETWORK_SELECT)) {
393 } else {
394 return false;
395 }
396 }
397}
398
399
400bool
402 // check if we're editing this network element
404 if (editedNetworkElement) {
405 return editedNetworkElement == this;
406 } else {
407 return false;
408 }
409}
410
411
414 // edit depending if shape is being edited
415 if (isShapeEdited()) {
416 // calculate move shape operation
417 return calculateMoveShapeOperation(this, getLaneShape(), false);
418 } else {
419 return nullptr;
420 }
421}
422
423
424void
425GNELane::removeGeometryPoint(const Position clickedPosition, GNEUndoList* undoList) {
426 // edit depending if shape is being edited
427 if (isShapeEdited()) {
428 // get original shape
430 // check shape size
431 if (shape.size() > 2) {
432 // obtain index
433 int index = shape.indexOfClosest(clickedPosition);
434 // get snap radius
436 // check if we have to create a new index
437 if ((index != -1) && shape[index].distanceSquaredTo2D(clickedPosition) < (snap_radius * snap_radius)) {
438 // remove geometry point
439 shape.erase(shape.begin() + index);
440 // commit new shape
441 undoList->begin(this, "remove geometry point of " + getTagStr());
443 undoList->end();
444 }
445 }
446 }
447}
448
449
450void
452 // update lane drawing constan
454 // calculate layer
455 double layer = GLO_LANE;
457 layer = GLO_FRONTELEMENT;
459 layer = GLO_JUNCTION + 2;
460 }
461 // check drawing conditions
463 // draw lane
464 drawLane(s, layer);
465 // draw lock icon
467 // draw dotted contour
469 }
470 // calculate contour (always before children)
471 calculateLaneContour(s, layer);
472 // draw children
473 drawChildren(s);
474}
475
476
477void
479 // Check if edge can be deleted
481 myNet->deleteLane(this, myNet->getViewNet()->getUndoList(), false);
482 }
483}
484
485
486void
490
491
492
495 // first obtain edit mode (needed because certain Commands depend of current edit mode)
497 // get mouse position
498 const auto mousePosition = myNet->getViewNet()->getPositionInformation();
499 GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
500 buildPopupHeader(ret, app);
502 // build copy names entry
503 if (editMode != NetworkEditMode::NETWORK_TLS) {
504 GUIDesigns::buildFXMenuCommand(ret, TL("Copy parent edge name to clipboard"), nullptr, ret, MID_COPY_EDGE_NAME);
506 }
507 // stop if we're in data mode
509 return ret;
510 }
511 // build lane selection
514 } else {
516 }
517 // build edge selection
520 } else {
522 }
523 // stop if we're in data mode
525 return ret;
526 }
527 // add separator
528 new FXMenuSeparator(ret);
529 if (editMode != NetworkEditMode::NETWORK_TLS) {
530 // build show parameters menu
532 // build position copy entry
533 buildPositionCopyEntry(ret, app);
534 }
535 // check if we're in supermode network
537 // create end point
538 FXMenuCommand* resetEndPoints = GUIDesigns::buildFXMenuCommand(ret, TL("Reset edge end points"), nullptr, &parent, MID_GNE_RESET_GEOMETRYPOINT);
539 // enable or disable reset end points
541 resetEndPoints->enable();
542 } else {
543 resetEndPoints->disable();
544 }
545 // check if we clicked over a geometry point
546 if ((editMode == NetworkEditMode::NETWORK_MOVE) && myParentEdge->clickedOverGeometryPoint(mousePosition)) {
547 GUIDesigns::buildFXMenuCommand(ret, TL("Set custom Geometry Point"), nullptr, &parent, MID_GNE_CUSTOM_GEOMETRYPOINT);
548 }
549 // add separator
550 new FXMenuSeparator(ret);
551 //build operations
552 if ((editMode != NetworkEditMode::NETWORK_CONNECT) && (editMode != NetworkEditMode::NETWORK_TLS)) {
553 // build edge operations
554 buildEdgeOperations(parent, ret);
555 // build lane operations
556 buildLaneOperations(parent, ret);
557 // build template operations
558 buildTemplateOperations(parent, ret);
559 // add separator
560 new FXMenuSeparator(ret);
561 // build rechable operations
562 buildRechableOperations(parent, ret);
563 } else if (editMode == NetworkEditMode::NETWORK_TLS) {
565 GUIDesigns::buildFXMenuCommand(ret, TL("Select state for all links from this edge:"), nullptr, nullptr, 0);
566 const std::vector<std::string> names = GNEInternalLane::LinkStateNames.getStrings();
567 for (auto it : names) {
568 FXuint state = GNEInternalLane::LinkStateNames.get(it);
569 FXMenuRadio* mc = new FXMenuRadio(ret, it.c_str(), this, FXDataTarget::ID_OPTION + state);
572 }
573 }
574 } else {
575 FXMenuCommand* mc = GUIDesigns::buildFXMenuCommand(ret, TL("Additional options available in 'Inspect Mode'"), nullptr, nullptr, 0);
576 mc->handle(&parent, FXSEL(SEL_COMMAND, FXWindow::ID_DISABLE), nullptr);
577 }
578 // build shape positions menu
579 if (editMode != NetworkEditMode::NETWORK_TLS) {
580 new FXMenuSeparator(ret);
581 // get lane shape
582 const auto& laneShape = myLaneGeometry.getShape();
583 // get variables
584 const double pos = laneShape.nearest_offset_to_point2D(mousePosition);
585 const Position firstAnglePos = laneShape.positionAtOffset2D(pos - 0.001);
586 const Position secondAnglePos = laneShape.positionAtOffset2D(pos);
587 const double angle = firstAnglePos.angleTo2D(secondAnglePos);
588
589 // build menu commands
590 GUIDesigns::buildFXMenuCommand(ret, TL("Shape pos: ") + toString(pos), nullptr, nullptr, 0);
591 GUIDesigns::buildFXMenuCommand(ret, TL("Length pos: ") + toString(pos * getLaneParametricLength() / getLaneShapeLength()), nullptr, nullptr, 0);
592 if (myParentEdge->getNBEdge()->getDistance() != 0) {
593 GUIDesigns::buildFXMenuCommand(ret, TL("Distance: ") + toString(myParentEdge->getNBEdge()->getDistancAt(pos)), nullptr, nullptr, 0);
594 }
595 GUIDesigns::buildFXMenuCommand(ret, TL("Height: ") + toString(firstAnglePos.z()), nullptr, nullptr, 0);
596 GUIDesigns::buildFXMenuCommand(ret, TL("Angle: ") + toString((GeomHelper::naviDegree(angle))), nullptr, nullptr, 0);
597 }
598 }
599 return ret;
600}
601
602
603double
605 return s.addSize.getExaggeration(s, this);
606}
607
608
613
614
615void
616GNELane::updateCenteringBoundary(const bool /*updateGrid*/) {
617 // nothing to update
618}
619
620
621int
623 return myIndex;
624}
625
626
627void
629 myIndex = index;
631}
632
633
634double
638
639
640double
642 double laneParametricLength = myParentEdge->getNBEdge()->getLoadedLength();
643 if (laneParametricLength > 0) {
644 return laneParametricLength;
645 } else {
646 throw ProcessError(TL("Lane Parametric Length cannot be never 0"));
647 }
648}
649
650
651double
655
656
657bool
661
662
667
668
669std::string
671 const NBEdge* edge = myParentEdge->getNBEdge();
672 switch (key) {
673 case SUMO_ATTR_ID:
674 return getMicrosimID();
678 return myParentEdge->getToJunction()->getID();
679 case SUMO_ATTR_SPEED:
680 return toString(edge->getLaneSpeed(myIndex));
681 case SUMO_ATTR_ALLOW:
689 case SUMO_ATTR_WIDTH:
691 return "default";
692 } else {
693 return toString(edge->getLaneStruct(myIndex).width);
694 }
696 return toString(edge->getLaneStruct(myIndex).friction);
701 case SUMO_ATTR_SHAPE:
706 case SUMO_ATTR_TYPE:
707 return edge->getLaneStruct(myIndex).type;
708 case SUMO_ATTR_INDEX:
709 return toString(myIndex);
715 } else {
716 return "";
717 }
718 case GNE_ATTR_PARENT:
719 return myParentEdge->getID();
724 default:
725 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
726 }
727}
728
729
732 switch (key) {
733 case SUMO_ATTR_SHAPE:
736 default:
737 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
738 }
739}
740
741
742std::string
744 std::string result = getAttribute(key);
745 if ((key == SUMO_ATTR_ALLOW || key == SUMO_ATTR_DISALLOW) && result.find("all") != std::string::npos) {
746 result += " " + getVehicleClassNames(SVCAll, true);
747 }
748 return result;
749}
750
751
752void
753GNELane::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
754 switch (key) {
755 case SUMO_ATTR_ID:
756 throw InvalidArgument("Modifying attribute '" + toString(key) + "' of " + getTagStr() + " isn't allowed");
757 case SUMO_ATTR_SPEED:
758 case SUMO_ATTR_ALLOW:
762 case SUMO_ATTR_WIDTH:
766 case SUMO_ATTR_SHAPE:
769 case SUMO_ATTR_TYPE:
770 case SUMO_ATTR_INDEX:
772 // special case for stop offset, because affects to stopOffsetExceptions (#15297)
773 if (canParse<double>(value) && (parse<double>(value) == 0)) {
775 }
776 GNEChange_Attribute::changeAttribute(this, key, value, undoList);
777 break;
781 // no special handling
782 GNEChange_Attribute::changeAttribute(this, key, value, undoList);
783 break;
784 default:
785 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
786 }
787}
788
789
790bool
791GNELane::isValid(SumoXMLAttr key, const std::string& value) {
792 switch (key) {
793 case SUMO_ATTR_ID:
794 case SUMO_ATTR_INDEX:
795 return false;
796 case SUMO_ATTR_SPEED:
797 return canParse<double>(value);
798 case SUMO_ATTR_ALLOW:
802 return canParseVehicleClasses(value);
803 case SUMO_ATTR_WIDTH:
804 if (value.empty() || (value == "default")) {
805 return true;
806 } else {
807 return canParse<double>(value) && ((parse<double>(value) > 0) || (parse<double>(value) == NBEdge::UNSPECIFIED_WIDTH));
808 }
811 return canParse<double>(value) && (parse<double>(value) >= 0);
813 return canParse<bool>(value);
814 case SUMO_ATTR_SHAPE:
816 // A lane shape can either be empty or have more than 1 element
817 if (value.empty()) {
818 return true;
819 } else if (canParse<PositionVector>(value)) {
820 return parse<PositionVector>(value).size() > 1;
821 }
822 return false;
823 case GNE_ATTR_OPPOSITE: {
824 if (value.empty()) {
825 return true;
826 } else {
827 NBEdge* oppEdge = myNet->getEdgeCont().retrieve(value.substr(0, value.rfind("_")));
828 if (oppEdge == nullptr || oppEdge->getLaneID(oppEdge->getNumLanes() - 1) != value) {
829 return false;
830 }
831 NBEdge* edge = myParentEdge->getNBEdge();
832 if (oppEdge->getFromNode() != edge->getToNode() || oppEdge->getToNode() != edge->getFromNode()) {
833 WRITE_WARNINGF(TL("Opposite lane '%' does not connect the same nodes as edge '%'!"), value, edge->getID());
834 return false;
835 }
836 return true;
837 }
838 }
839 case SUMO_ATTR_TYPE:
840 return true;
842 return canParse<double>(value) && (parse<double>(value) >= 0);
844 return canParseVehicleClasses(value);
846 return canParse<bool>(value);
849 default:
850 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
851 }
852}
853
854
855bool
857 switch (key) {
858 case SUMO_ATTR_ID:
859 case SUMO_ATTR_INDEX:
860 return false;
863 default:
864 return true;
865 }
866}
867
868
869bool
871 const NBEdge* edge = myParentEdge->getNBEdge();
872 switch (key) {
873 case SUMO_ATTR_WIDTH:
875 default:
876 return false;
877 }
878}
879
880
885
886
887void
888GNELane::setSpecialColor(const RGBColor* color, double colorValue) {
889 mySpecialColor = color;
890 mySpecialColorValue = colorValue;
891}
892
893// ===========================================================================
894// private
895// ===========================================================================
896
897void
898GNELane::setAttribute(SumoXMLAttr key, const std::string& value) {
899 // get parent edge
900 NBEdge* edge = myParentEdge->getNBEdge();
901 // get template editor
903 // check if we have to update template
904 const bool updateTemplate = templateEditor->getEdgeTemplate() ? (templateEditor->getEdgeTemplate()->getID() == myParentEdge->getID()) : false;
905 switch (key) {
906 case SUMO_ATTR_ID:
907 case SUMO_ATTR_INDEX:
908 throw InvalidArgument("Modifying attribute '" + toString(key) + "' of " + getTagStr() + " isn't allowed");
909 case SUMO_ATTR_SPEED:
910 edge->setSpeed(myIndex, parse<double>(value));
911 break;
912 case SUMO_ATTR_ALLOW:
914 break;
917 break;
920 break;
923 break;
924 case SUMO_ATTR_WIDTH:
925 if (value.empty() || (value == "default")) {
927 } else {
928 edge->setLaneWidth(myIndex, parse<double>(value));
929 }
930 // update edge parent boundary
932 break;
934 edge->setFriction(myIndex, parse<double>(value));
935 break;
937 edge->setEndOffset(myIndex, parse<double>(value));
938 break;
940 edge->setAcceleration(myIndex, parse<bool>(value));
941 break;
942 case SUMO_ATTR_SHAPE:
944 // set new shape
945 edge->setLaneShape(myIndex, parse<PositionVector>(value));
946 // update edge parent boundary
948 break;
949 case GNE_ATTR_OPPOSITE: {
950 if (value != "") {
951 NBEdge* oppEdge = myNet->getEdgeCont().retrieve(value.substr(0, value.rfind("_")));
952 oppEdge->getLaneStruct(oppEdge->getNumLanes() - 1).oppositeID = getID();
953 } else {
954 // reset prior oppEdge if existing
955 const std::string oldValue = myParentEdge->getNBEdge()->getLaneStruct(myIndex).oppositeID;
956 NBEdge* oppEdge = myNet->getEdgeCont().retrieve(oldValue.substr(0, oldValue.rfind("_")));
957 if (oppEdge != nullptr) {
958 oppEdge->getLaneStruct(oppEdge->getNumLanes() - 1).oppositeID = "";
959 }
960 }
962 break;
963 }
964 case SUMO_ATTR_TYPE:
965 edge->getLaneStruct(myIndex).type = value;
966 break;
968 if (value.empty()) {
970 } else {
971 edge->getLaneStruct(myIndex).laneStopOffset.setOffset(parse<double>(value));
972 }
973 break;
976 break;
978 if (parse<bool>(value)) {
980 } else {
982 }
983 break;
986 break;
987 default:
988 throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
989 }
990 // update template
991 if (updateTemplate) {
992 templateEditor->setEdgeTemplate(myParentEdge);
993 }
994 // invalidate demand path calculator
996}
997
998
999void
1001 // set custom shape
1003 // update geometry
1005}
1006
1007
1008void
1010 // commit new shape
1011 undoList->begin(this, "moving " + toString(SUMO_ATTR_CUSTOMSHAPE) + " of " + getTagStr());
1013 undoList->end();
1014}
1015
1016
1017void
1018GNELane::drawLane(const GUIVisualizationSettings& s, const double layer) const {
1019 // Push layer matrix
1021 // translate to layer
1023 // set lane colors
1024 setLaneColor(s);
1025 // Check if lane has to be draw as railway and if isn't being drawn for selecting
1027 // draw as railway
1029 } else if (myShapeColors.size() > 0) {
1030 // draw geometry with own colors
1033 } else {
1034 // draw geometry with current color
1037 }
1038 // if lane is selected, draw a second lane over it
1040 // draw start end shape points
1042 // check if draw details
1044 // draw markings
1046 // Draw direction indicators
1048 // draw lane textures
1049 drawTextures(s);
1050 // draw lane arrows
1051 drawArrows(s);
1052 // draw link numbers
1053 drawLinkNo(s);
1054 // draw TLS link numbers
1055 drawTLSLinkNo(s);
1056 // draw stopOffsets
1058 }
1059 // draw shape edited
1060 drawShapeEdited(s);
1061 // Pop layer matrix
1063}
1064
1065
1066void
1068 // only draw if lane is selected
1069 if (drawUsingSelectColor()) {
1070 // Push matrix
1072 // move back
1073 glTranslated(0, 0, 0.1);
1074 // set selected edge color
1076 // draw geometry with current color
1079 // Pop matrix
1081 }
1082}
1083
1084
1085void
1087 // if shape is being edited, draw point and green line
1088 if (myShapeEdited) {
1089 // push shape edited matrix
1091 // translate
1093 // set selected edge color
1095 // draw shape around
1098 // move front
1099 glTranslated(0, 0, 1);
1100 // draw geometry points
1105 // Pop shape edited matrix
1107 }
1108}
1109
1110
1111void
1113 // draw additional children
1114 for (const auto& additional : getChildAdditionals()) {
1115 // check that ParkingAreas aren't draw two times
1116 additional->drawGL(s);
1117 }
1118 // draw demand element children
1119 for (const auto& demandElement : getChildDemandElements()) {
1120 if (!demandElement->getTagProperty().isPlacedInRTree()) {
1121 demandElement->drawGL(s);
1122 }
1123 }
1124 // draw path additional elements
1127}
1128
1129
1130void
1132 // check conditions
1134 // check if this is the last lane (note: First lane is the lane more far of the edge's center)
1135 const bool firstlane = (myIndex == 0);
1136 const bool lastLane = (myIndex == (myParentEdge->getNBEdge()->getNumLanes() - 1));
1137 // declare separator width
1138 const auto separatorWidth = SUMO_const_laneMarkWidth * 0.5;
1139 // get passengers change left and right for previous, current and next lane
1140 const bool changeRightTop = lastLane ? true : myParentEdge->getNBEdge()->allowsChangingRight(myIndex + 1, SVC_PASSENGER);
1141 const bool changeLeftCurrent = lastLane ? true : myParentEdge->getNBEdge()->allowsChangingLeft(myIndex, SVC_PASSENGER);
1142 const bool changeRightCurrent = firstlane ? true : myParentEdge->getNBEdge()->allowsChangingRight(myIndex, SVC_PASSENGER);
1143 const bool changeLeftBot = firstlane ? true : myParentEdge->getNBEdge()->allowsChangingLeft(myIndex - 1, SVC_PASSENGER);
1144 // save current color
1145 const auto currentColor = GLHelper::getColor();
1146 // separator offsets
1147 const double topSeparatorOffset = myDrawingConstants->getOffset() + (myDrawingConstants->getDrawingWidth() * -1) + separatorWidth;
1148 const double botSeparatorOffset = myDrawingConstants->getOffset() + myDrawingConstants->getDrawingWidth() - separatorWidth;
1149 // push matrix
1151 // translate
1152 glTranslated(0, 0, 0.1);
1153 // continue depending of lanes
1154 if (myDrawingConstants->drawSuperposed() || (firstlane && lastLane)) {
1155 // draw top and bot separator only
1157 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, topSeparatorOffset);
1158 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, botSeparatorOffset);
1159 } else if (firstlane) {
1160 // draw top separator
1161 GLHelper::setColor((changeLeftCurrent && changeRightTop) ? RGBColor::WHITE : RGBColor::ORANGE);
1162 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, topSeparatorOffset);
1163 // check if draw inverse marking
1164 if (changeLeftCurrent) {
1165 GLHelper::setColor(currentColor);
1167 3, 6, topSeparatorOffset, true, true, s.lefthand, 1);
1168 }
1169 // draw bot separator
1171 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, botSeparatorOffset);
1172 } else if (lastLane) {
1173 // draw top separator
1175 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, topSeparatorOffset);
1176 // draw bot separator
1177 GLHelper::setColor((changeRightCurrent && changeLeftBot) ? RGBColor::WHITE : RGBColor::ORANGE);
1178 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, botSeparatorOffset);
1179 // check if draw inverse marking
1180 if (changeRightCurrent) {
1181 GLHelper::setColor(currentColor);
1183 3, 6, botSeparatorOffset, true, true, s.lefthand, 1);
1184 }
1185 } else {
1186 // draw top separator
1187 GLHelper::setColor((changeLeftCurrent && changeRightTop) ? RGBColor::WHITE : RGBColor::ORANGE);
1188 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, topSeparatorOffset);
1189 // check if draw inverse marking
1190 if (changeLeftCurrent) {
1191 GLHelper::setColor(currentColor);
1193 3, 6, topSeparatorOffset, true, true, s.lefthand, 1);
1194 }
1195 // draw bot separator
1196 GLHelper::setColor((changeRightCurrent && changeLeftBot) ? RGBColor::WHITE : RGBColor::ORANGE);
1197 GUIGeometry::drawGeometry(myDrawingConstants->getDetail(), myLaneGeometry, separatorWidth, botSeparatorOffset);
1198 // check if draw inverse marking
1199 if (changeRightCurrent) {
1200 GLHelper::setColor(currentColor);
1202 3, 6, botSeparatorOffset, true, true, s.lefthand, 1);
1203 }
1204 }
1205 // pop matrix
1207 }
1208}
1209
1210
1211void
1213 // check draw conditions
1215 // get connections
1216 const auto& connections = myParentEdge->getNBEdge()->getConnectionsFromLane(myIndex);
1217 // get number of links
1218 const int noLinks = (int)connections.size();
1219 // only continue if there is links
1220 if (noLinks > 0) {
1221 // push link matrix
1223 // move front
1224 glTranslated(0, 0, GLO_TEXTNAME);
1225 // calculate width
1226 const double width = myParentEdge->getNBEdge()->getLaneWidth(myIndex) / (double) noLinks;
1227 // get X1
1228 double x1 = myParentEdge->getNBEdge()->getLaneWidth(myIndex) / 2;
1229 // iterate over links
1230 for (int i = noLinks - 1; i >= 0; i--) {
1231 // calculate x2
1232 const double x2 = x1 - (double)(width / 2.);
1233 // get link index
1235 connections[s.lefthand ? noLinks - 1 - i : i]);
1236 // draw link index
1238 // update x1
1239 x1 -= width;
1240 }
1241 // pop link matrix
1243 }
1244 }
1245}
1246
1247
1248void
1250 // check conditions
1252 (myParentEdge->getToJunction()->getNBNode()->getControllingTLS().size() > 0)) {
1253 // get connections
1254 const auto& connections = myParentEdge->getNBEdge()->getConnectionsFromLane(myIndex);
1255 // get numer of links
1256 const int noLinks = (int)connections.size();
1257 // only continue if there are links
1258 if (noLinks > 0) {
1259 // push link matrix
1261 // move t front
1262 glTranslated(0, 0, GLO_TEXTNAME);
1263 // calculate width
1264 const double w = myParentEdge->getNBEdge()->getLaneWidth(myIndex) / (double) noLinks;
1265 // calculate x1
1266 double x1 = myParentEdge->getNBEdge()->getLaneWidth(myIndex) / 2;
1267 // iterate over links
1268 for (int i = noLinks - 1; i >= 0; --i) {
1269 // calculate x2
1270 const double x2 = x1 - (double)(w / 2.);
1271 // get link number
1272 const int linkNo = connections[s.lefthand ? noLinks - 1 - i : i].tlLinkIndex;
1273 // draw link number
1275 // update x1
1276 x1 -= w;
1277 }
1278 // pop link matrix
1280 }
1281 }
1282}
1283
1284
1285void
1288 // calculate begin, end and rotation
1289 const Position& begin = myLaneGeometry.getShape()[-2];
1290 const Position& end = myLaneGeometry.getShape().back();
1291 const double rot = GUIGeometry::calculateRotation(begin, end);
1292 // push arrow matrix
1294 // move front (note: must draw on top of junction shape?
1295 glTranslated(0, 0, 3);
1296 // change color depending of spreadSuperposed
1299 } else {
1301 }
1302 // move to end
1303 glTranslated(end.x(), end.y(), 0);
1304 // rotate
1305 glRotated(rot, 0, 0, 1);
1306 const double width = myParentEdge->getNBEdge()->getLaneWidth(myIndex);
1307 if (width < SUMO_const_laneWidth) {
1309 }
1310 // apply offset
1311 glTranslated(myDrawingConstants->getOffset(), 0, 0);
1312 // get destination node
1313 const NBNode* dest = myParentEdge->getNBEdge()->myTo;
1314 // draw all links iterating over connections
1315 for (const auto& connection : myParentEdge->getNBEdge()->myConnections) {
1316 if (connection.fromLane == myIndex) {
1317 // get link direction
1318 LinkDirection dir = dest->getDirection(myParentEdge->getNBEdge(), connection.toEdge, s.lefthand);
1319 // draw depending of link direction
1320 switch (dir) {
1322 GLHelper::drawBoxLine(Position(0, 4), 0, 2, .05);
1323 GLHelper::drawTriangleAtEnd(Position(0, 4), Position(0, 1), (double) 1, (double) .25);
1324 break;
1326 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1327 GLHelper::drawBoxLine(Position(0, 2.5), 90, 1, .05);
1328 GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(1.5, 2.5), (double) 1, (double) .25);
1329 break;
1331 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1332 GLHelper::drawBoxLine(Position(0, 2.5), -90, 1, .05);
1333 GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(-1.5, 2.5), (double) 1, (double) .25);
1334 break;
1336 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1337 GLHelper::drawBoxLine(Position(0, 2.5), 90, .5, .05);
1338 GLHelper::drawBoxLine(Position(0.5, 2.5), 180, 1, .05);
1339 GLHelper::drawTriangleAtEnd(Position(0.5, 2.5), Position(0.5, 4), (double) 1, (double) .25);
1340 break;
1342 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1343 GLHelper::drawBoxLine(Position(0, 2.5), -90, 1, .05);
1344 GLHelper::drawBoxLine(Position(-0.5, 2.5), -180, 1, .05);
1345 GLHelper::drawTriangleAtEnd(Position(-0.5, 2.5), Position(-0.5, 4), (double) 1, (double) .25);
1346 break;
1348 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1349 GLHelper::drawBoxLine(Position(0, 2.5), 45, .7, .05);
1350 GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(1.2, 1.3), (double) 1, (double) .25);
1351 break;
1353 GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05);
1354 GLHelper::drawBoxLine(Position(0, 2.5), -45, .7, .05);
1355 GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(-1.2, 1.3), (double) 1, (double) .25);
1356 break;
1358 GLHelper::drawBoxLine(Position(1, 5.8), 245, 2, .05);
1359 GLHelper::drawBoxLine(Position(-1, 5.8), 115, 2, .05);
1360 glTranslated(0, 5, 0);
1361 GLHelper::drawOutlineCircle(0.9, 0.8, 32);
1362 glTranslated(0, -5, 0);
1363 break;
1364 }
1365 }
1366 }
1367 // pop arrow matrix
1369 }
1370}
1371
1372
1373void
1376 glTranslated(0, 0, 0.1); // must draw on top of junction shape
1377 std::vector<NBEdge::Connection> connections = myParentEdge->getNBEdge()->getConnectionsFromLane(myIndex);
1378 NBNode* node = myParentEdge->getNBEdge()->getToNode();
1379 const Position& startPos = myLaneGeometry.getShape()[-1];
1380 for (auto it : connections) {
1381 const LinkState state = node->getLinkState(myParentEdge->getNBEdge(), it.toEdge, it.fromLane, it.toLane, it.mayDefinitelyPass, it.tlID);
1382 switch (state) {
1384 glColor3d(1, 1, 0);
1385 break;
1387 glColor3d(0, 1, 1);
1388 break;
1389 case LINKSTATE_MAJOR:
1390 glColor3d(1, 1, 1);
1391 break;
1392 case LINKSTATE_MINOR:
1393 glColor3d(.4, .4, .4);
1394 break;
1395 case LINKSTATE_STOP:
1396 glColor3d(.7, .4, .4);
1397 break;
1398 case LINKSTATE_EQUAL:
1399 glColor3d(.7, .7, .7);
1400 break;
1402 glColor3d(.7, .7, 1);
1403 break;
1404 case LINKSTATE_ZIPPER:
1405 glColor3d(.75, .5, 0.25);
1406 break;
1407 default:
1408 throw ProcessError(TLF("Unexpected LinkState '%'", toString(state)));
1409 }
1410 const Position& endPos = it.toEdge->getLaneShape(it.toLane)[0];
1411 glBegin(GL_LINES);
1412 glVertex2d(startPos.x(), startPos.y());
1413 glVertex2d(endPos.x(), endPos.y());
1414 glEnd();
1415 GLHelper::drawTriangleAtEnd(startPos, endPos, (double) 1.5, (double) .2);
1416 }
1418}
1419
1420
1421void
1422GNELane::calculateLaneContour(const GUIVisualizationSettings& s, const double layer) const {
1423 // first check if edge parent was inserted with full boundary
1425 // calculate contour
1427 layer, myDrawingConstants->getDrawingWidth(), 1, true, true, myDrawingConstants->getOffset());
1428 // calculate geometry points contour if we're editing shape
1429 if (myShapeEdited) {
1432 }
1433 }
1434}
1435
1436
1439 // get inspected attribute carriers
1440 const auto& inspectedACs = myNet->getViewNet()->getInspectedAttributeCarriers();
1441 // declare a RGBColor variable
1442 RGBColor color;
1443 // get inspected AC
1444 const GNEAttributeCarrier* inspectedAC = inspectedACs.size() > 0 ? inspectedACs.front() : nullptr;
1445 // we need to draw lanes with a special color if we're inspecting a Trip or Flow and this lane belongs to a via's edge.
1446 if (inspectedAC && (!inspectedAC->isAttributeCarrierSelected()) &&
1447 ((inspectedAC->getTagProperty().getTag() == SUMO_TAG_TRIP) || (inspectedAC->getTagProperty().getTag() == SUMO_TAG_FLOW))) {
1448 // obtain attribute "via"
1449 std::vector<std::string> viaEdges = parse<std::vector<std::string> >(inspectedAC->getAttribute(SUMO_ATTR_VIA));
1450 // iterate over viaEdges
1451 for (const auto& edge : viaEdges) {
1452 // check if parent edge is in the via edges
1453 if (myParentEdge->getID() == edge) {
1454 // set green color in GLHelper and return it
1455 color = RGBColor::GREEN;
1456 }
1457 }
1458 }
1459 if (mySpecialColor != nullptr) {
1460 // If special color is enabled, set it
1461 color = *mySpecialColor;
1462 } else if (myParentEdge->drawUsingSelectColor() && s.laneColorer.getActive() != 1) {
1463 // override with special colors (unless the color scheme is based on selection)
1465 } else {
1466 // Get normal lane color
1467 const GUIColorer& c = s.laneColorer;
1468 if (!setFunctionalColor(c.getActive(), color) && !setMultiColor(s, c, color)) {
1469 color = c.getScheme().getColor(getColorValue(s, c.getActive()));
1470 }
1471 }
1472 // special color for conflicted candidate edges
1474 // extra check for route frame
1477 }
1478 }
1479 // special color for special candidate edges
1481 // extra check for route frame
1484 }
1485 }
1486 // special color for candidate edges
1488 // extra check for route frame
1491 }
1492 }
1493 // special color for source candidate edges
1496 }
1497 // special color for target candidate edges
1500 }
1501 // special color for invalid candidate edges
1504 }
1505 // special color for source candidate lanes
1506 if (mySourceCandidate) {
1508 }
1509 // special color for target candidate lanes
1510 if (myTargetCandidate) {
1512 }
1513 // special color for special candidate lanes
1514 if (mySpecialCandidate) {
1516 }
1517 // special color for possible candidate lanes
1518 if (myPossibleCandidate) {
1520 }
1521 // special color for conflicted candidate lanes
1524 }
1525 // special color for invalid candidate lanes
1526 if (myInvalidCandidate) {
1528 }
1529 // set color in GLHelper
1530 GLHelper::setColor(color);
1531 return color;
1532}
1533
1534
1535bool
1536GNELane::setFunctionalColor(int activeScheme, RGBColor& col) const {
1537 switch (activeScheme) {
1538 case 6: {
1539 double hue = GeomHelper::naviDegree(myLaneGeometry.getShape().beginEndAngle()); // [0-360]
1540 col = RGBColor::fromHSV(hue, 1., 1.);
1541 return true;
1542 }
1543 default:
1544 return false;
1545 }
1546}
1547
1548
1549bool
1551 const int activeScheme = c.getActive();
1552 myShapeColors.clear();
1553 switch (activeScheme) {
1554 case 9: // color by height at segment start
1555 for (PositionVector::const_iterator ii = myLaneGeometry.getShape().begin(); ii != myLaneGeometry.getShape().end() - 1; ++ii) {
1556 myShapeColors.push_back(c.getScheme().getColor(ii->z()));
1557 }
1558 col = c.getScheme().getColor(getColorValue(s, 8));
1559 return true;
1560 case 11: // color by inclination at segment start
1561 for (int ii = 1; ii < (int)myLaneGeometry.getShape().size(); ++ii) {
1562 const double inc = (myLaneGeometry.getShape()[ii].z() - myLaneGeometry.getShape()[ii - 1].z()) / MAX2(POSITION_EPS, myLaneGeometry.getShape()[ii].distanceTo2D(myLaneGeometry.getShape()[ii - 1]));
1563 myShapeColors.push_back(c.getScheme().getColor(inc));
1564 }
1565 col = c.getScheme().getColor(getColorValue(s, 10));
1566 return true;
1567 default:
1568 return false;
1569 }
1570}
1571
1572
1573double
1574GNELane::getColorValue(const GUIVisualizationSettings& s, int activeScheme) const {
1575 const SVCPermissions myPermissions = myParentEdge->getNBEdge()->getPermissions(myIndex);
1576 if (mySpecialColor != nullptr && mySpecialColorValue != std::numeric_limits<double>::max()) {
1577 return mySpecialColorValue;
1578 }
1579 switch (activeScheme) {
1580 case 0:
1581 switch (myPermissions) {
1582 case SVC_PEDESTRIAN:
1583 return 1;
1584 case SVC_BICYCLE:
1585 return 2;
1586 case 0:
1587 // forbidden road or green verge
1588 return myParentEdge->getNBEdge()->getPermissions() == 0 ? 10 : 3;
1589 case SVC_SHIP:
1590 return 4;
1591 case SVC_AUTHORITY:
1592 return 8;
1593 case SVC_AIRCRAFT:
1594 case SVC_DRONE:
1595 return 12;
1596 default:
1597 break;
1598 }
1600 return 9;
1601 } else if (isRailway(myPermissions)) {
1602 if ((myPermissions & SVC_BUS) != 0) {
1603 return 6;
1604 } else {
1605 return 5;
1606 }
1607 } else if ((myPermissions & SVC_PASSENGER) != 0) {
1608 if ((myPermissions & (SVC_RAIL_CLASSES & ~SVC_RAIL_FAST)) != 0 && (myPermissions & SVC_SHIP) == 0) {
1609 return 6;
1610 } else {
1611 return 0;
1612 }
1613 } else {
1614 return 7;
1615 }
1616 case 1:
1618 case 2:
1619 return (double)myPermissions;
1620 case 3:
1622 case 4:
1623 return myParentEdge->getNBEdge()->getNumLanes();
1624 case 5: {
1626 }
1627 // case 6: by angle (functional)
1628 case 7: {
1629 return myParentEdge->getNBEdge()->getPriority();
1630 }
1631 case 8: {
1632 // color by z of first shape point
1633 return myLaneGeometry.getShape()[0].z();
1634 }
1635 // case 9: by segment height
1636 case 10: {
1637 // color by incline
1638 return (myLaneGeometry.getShape()[-1].z() - myLaneGeometry.getShape()[0].z()) / myParentEdge->getNBEdge()->getLength();
1639 }
1640 // case 11: by segment incline
1641
1642 case 12: {
1643 // by numerical edge param value
1645 try {
1647 } catch (NumberFormatException&) {
1648 try {
1650 } catch (BoolFormatException&) {
1651 return -1;
1652 }
1653 }
1654 } else {
1656 }
1657 }
1658 case 13: {
1659 // by numerical lane param value
1661 try {
1663 } catch (NumberFormatException&) {
1664 try {
1666 } catch (BoolFormatException&) {
1667 return -1;
1668 }
1669 }
1670 } else {
1672 }
1673 }
1674 case 14: {
1675 return myParentEdge->getNBEdge()->getDistance();
1676 }
1677 case 15: {
1678 return fabs(myParentEdge->getNBEdge()->getDistance());
1679 }
1680 }
1681 return 0;
1682}
1683
1684
1685void
1686GNELane::drawOverlappedRoutes(const int numRoutes) const {
1687 // get middle point and angle
1690 // Push route matrix
1692 // translate to front
1693 glTranslated(0, 0, GLO_ROUTE + 1);
1694 // get middle
1695 GLHelper::drawText(toString(numRoutes) + " routes", center, 0, 1.8, RGBColor::BLACK, angle + 90);
1696 // pop route matrix
1698
1699}
1700
1701
1702void
1704 const auto& laneStopOffset = myParentEdge->getNBEdge()->getLaneStruct(myIndex).laneStopOffset;
1705 // check conditions
1706 if (laneStopOffset.isDefined() && (laneStopOffset.getPermissions() & SVC_PASSENGER) != 0) {
1707 const Position& end = getLaneShape().back();
1708 const Position& f = getLaneShape()[-2];
1709 const double rot = RAD2DEG(atan2((end.x() - f.x()), (f.y() - end.y())));
1712 glTranslated(end.x(), end.y(), 1);
1713 glRotated(rot, 0, 0, 1);
1714 glTranslated(0, laneStopOffset.getOffset(), 0);
1715 glBegin(GL_QUADS);
1716 glVertex2d(-myDrawingConstants->getDrawingWidth(), 0.0);
1717 glVertex2d(-myDrawingConstants->getDrawingWidth(), 0.2);
1718 glVertex2d(myDrawingConstants->getDrawingWidth(), 0.2);
1719 glVertex2d(myDrawingConstants->getDrawingWidth(), 0.0);
1720 glEnd();
1722 }
1723}
1724
1725
1726bool
1728 return isWaterway(myParentEdge->getNBEdge()->getPermissions(myIndex)) && s.showRails && !s.drawForRectangleSelection; // reusing the showRails setting
1729}
1730
1731
1732void
1734 // Draw direction indicators if the correspondient option is enabled
1735 if (s.showLaneDirection) {
1736 // improve visibility of superposed rail edges
1738 glColor3d(0.3, 0.3, 0.3);
1739 }
1740 // get width and sideOffset
1741 const double width = MAX2(NUMERICAL_EPS, (myDrawingConstants->getDrawingWidth() * 2 * myDrawingConstants->getExaggeration()));
1742 // push direction indicator matrix
1744 // move to front
1745 glTranslated(0, 0, 0.1);
1746 // iterate over shape
1747 for (int i = 0; i < (int) myLaneGeometry.getShape().size() - 1; ++i) {
1748 // push triangle matrix
1750 // move front
1751 glTranslated(myLaneGeometry.getShape()[i].x(), myLaneGeometry.getShape()[i].y(), 0.1);
1752 // rotate
1753 glRotated(myLaneGeometry.getShapeRotations()[i], 0, 0, 1);
1754 // calculate subwidth
1755 for (double subWidth = 0; subWidth < myLaneGeometry.getShapeLengths()[i]; subWidth += width) {
1756 // calculate length
1757 const double length = MIN2(width * 0.5, myLaneGeometry.getShapeLengths()[i] - subWidth);
1758 // draw triangle
1759 glBegin(GL_TRIANGLES);
1760 glVertex2d(-myDrawingConstants->getOffset(), -subWidth - length);
1761 glVertex2d(-myDrawingConstants->getOffset() - width * 0.25, -subWidth);
1762 glVertex2d(-myDrawingConstants->getOffset() + width * 0.25, -subWidth);
1763 glEnd();
1764 }
1765 // pop triangle matrix
1767 }
1768 // pop direction indicator matrix
1770 }
1771}
1772
1773
1774void
1776 // draw foot width 150mm, assume that distance between rail feet inner sides is reduced on both sides by 39mm with regard to the gauge
1777 // assume crosstie length of 181% gauge (2600mm for standard gauge)
1778 // first save current color (obtained from view configuration)
1779 const auto currentLaneColor = GLHelper::getColor();
1780 // Set current color
1781 GLHelper::setColor(currentLaneColor);
1782 // continue depending of detail
1784 // move
1785 glTranslated(0, 0, 0.1);
1786 // draw external crossbar
1787 const double crossbarWidth = 0.2 * myDrawingConstants->getExaggeration();
1788 // draw geometry
1792 // move
1793 glTranslated(0, 0, 0.01);
1794 // Set color gray
1795 glColor3d(0.8, 0.8, 0.8);
1796 // draw geometry
1800 // move
1801 glTranslated(0, 0, 0.01);
1802 // Set current color
1803 GLHelper::setColor(currentLaneColor);
1804 // Draw crossties
1807 myDrawingConstants->getOffset(), false);
1808 } else if (myShapeColors.size() > 0) {
1809 // draw colored box lines
1812 } else {
1813 // draw geometry with current color
1816 }
1817}
1818
1819
1820void
1822 // check all conditions for drawing textures
1823 if (!s.disableLaneIcons && (myLaneRestrictedTexturePositions.size() > 0)) {
1824 // Declare default width of icon (3)
1825 const double iconWidth = myDrawingConstants->getDrawingWidth() * 0.6;
1826 // Draw list of icons
1827 for (int i = 0; i < (int)myLaneRestrictedTexturePositions.size(); i++) {
1828 // Push draw matrix 2
1830 // Set white color
1831 glColor3d(1, 1, 1);
1832 // Translate matrix 2
1833 glTranslated(myLaneRestrictedTexturePositions.at(i).x(), myLaneRestrictedTexturePositions.at(i).y(), 0.1);
1834 // Rotate matrix 2
1835 glRotated(myLaneRestrictedTextureRotations.at(i), 0, 0, -1);
1836 glRotated(90, 0, 0, 1);
1837 // draw texture box depending of type of restriction
1840 } else if (isRestricted(SVC_BICYCLE)) {
1842 } else if (isRestricted(SVC_BUS)) {
1844 }
1845 // Pop draw matrix 2
1847 }
1848 }
1849}
1850
1851
1852void
1854 // draw a Start/endPoints if lane has a custom shape
1856 // obtain circle width and resolution
1857 const double circleWidth = GNEEdge::SNAP_RADIUS * MIN2((double)1, s.laneWidthExaggeration) / 2;
1858 // obtain custom shape
1860 // set color (override with special colors unless the color scheme is based on selection)
1861 if (drawUsingSelectColor() && s.laneColorer.getActive() != 1) {
1863 } else {
1864 GLHelper::setColor(s.junctionColorer.getSchemes()[0].getColor(2));
1865 }
1866 // push start matrix
1868 // move to shape start position
1869 glTranslated(customShape.front().x(), customShape.front().y(), 0.1);
1870 // draw circle
1872 // draw s depending of detail
1874 // move top
1875 glTranslated(0, 0, 0.1);
1876 // draw "S"
1877 GLHelper::drawText("S", Position(), 0.1, circleWidth, RGBColor::WHITE);
1878 }
1879 // pop start matrix
1881 // draw line between junction and start position
1883 // move top
1884 glTranslated(0, 0, 0.1);
1885 // set line width
1886 glLineWidth(4);
1887 // draw line
1889 // pop line matrix
1891 // push start matrix
1893 // move to end position
1894 glTranslated(customShape.back().x(), customShape.back().y(), 0.1);
1895 // draw filled circle
1897 // draw "e" depending of detail
1899 // move top
1900 glTranslated(0, 0, 0.1);
1901 // draw "E"
1902 GLHelper::drawText("E", Position(), 0, circleWidth, RGBColor::WHITE);
1903 }
1904 // pop start matrix
1906 // draw line between Junction and end position
1908 // move top
1909 glTranslated(0, 0, 0.1);
1910 // set line width
1911 glLineWidth(4);
1912 // draw line
1914 // pop line matrix
1916 }
1917}
1918
1919
1920std::string
1922 return myParentEdge->getID();
1923}
1924
1925
1926long
1927GNELane::onDefault(FXObject* obj, FXSelector sel, void* data) {
1928 myNet->getViewNet()->getViewParent()->getTLSEditorFrame()->handleMultiChange(this, obj, sel, data);
1929 return 1;
1930}
1931
1932
1933std::vector<GNEConnection*>
1935 // Declare a vector to save incoming connections
1936 std::vector<GNEConnection*> incomingConnections;
1937 // Obtain incoming edges if junction source was already created
1938 GNEJunction* junctionSource = myParentEdge->getFromJunction();
1939 if (junctionSource) {
1940 // Iterate over incoming GNEEdges of junction
1941 for (const auto& incomingEdge : junctionSource->getGNEIncomingEdges()) {
1942 // Iterate over connection of incoming edges
1943 for (const auto& connection : incomingEdge->getGNEConnections()) {
1944 if (connection->getLaneTo()->getIndex() == getIndex()) {
1945 incomingConnections.push_back(connection);
1946 }
1947 }
1948 }
1949 }
1950 return incomingConnections;
1951}
1952
1953
1954std::vector<GNEConnection*>
1956 // Obtain GNEConnection of parent edge
1957 const std::vector<GNEConnection*>& edgeConnections = myParentEdge->getGNEConnections();
1958 std::vector<GNEConnection*> outcomingConnections;
1959 // Obtain outgoing connections
1960 for (const auto& connection : edgeConnections) {
1961 if (connection->getLaneFrom()->getIndex() == getIndex()) {
1962 outcomingConnections.push_back(connection);
1963 }
1964 }
1965 return outcomingConnections;
1966}
1967
1968
1969void
1971 // update incoming connections of lane
1972 std::vector<GNEConnection*> incomingConnections = getGNEIncomingConnections();
1973 for (const auto& incomingConnection : incomingConnections) {
1974 incomingConnection->updateConnectionID();
1975 }
1976 // update outcoming connections of lane
1977 std::vector<GNEConnection*> outcomingConnections = getGNEOutcomingConnections();
1978 for (const auto& outcomingConnection : outcomingConnections) {
1979 outcomingConnection->updateConnectionID();
1980 }
1981}
1982
1983
1984double
1986 // factor should not be 0
1987 if (myParentEdge->getNBEdge()->getFinalLength() > 0) {
1988 return MAX2(POSITION_EPS, (getLaneShape().length() / myParentEdge->getNBEdge()->getFinalLength()));
1989 } else {
1990 return POSITION_EPS;
1991 };
1992}
1993
1994
1995void
1997 // Create basic commands
1998 std::string edgeDescPossibleMulti = toString(SUMO_TAG_EDGE);
2000 if (edgeSelSize && myParentEdge->isAttributeCarrierSelected() && (edgeSelSize > 1)) {
2001 edgeDescPossibleMulti = toString(edgeSelSize) + " " + toString(SUMO_TAG_EDGE) + "s";
2002 }
2003 // create menu pane for edge operations
2004 FXMenuPane* edgeOperations = new FXMenuPane(ret);
2005 ret->insertMenuPaneChild(edgeOperations);
2006 if (edgeSelSize > 0) {
2007 new FXMenuCascade(ret, TLF("Edge operations (% selected)", toString(edgeSelSize)).c_str(), nullptr, edgeOperations);
2008 } else {
2009 new FXMenuCascade(ret, TL("Edge operations"), nullptr, edgeOperations);
2010 }
2011 // create menu commands for all edge operations
2012 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Split edge here"), nullptr, &parent, MID_GNE_EDGE_SPLIT);
2013 auto splitBothDirections = GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Split edge in both directions here (no symmetric opposite edge)"), nullptr, &parent, MID_GNE_EDGE_SPLIT_BIDI);
2014 // check if allow split edge in both directions
2015 splitBothDirections->disable();
2016 const auto oppositeEdges = myParentEdge->getOppositeEdges();
2017 if (oppositeEdges.size() == 0) {
2018 splitBothDirections->setText(TL("Split edge in both directions here (no opposite edge)"));
2019 } else {
2020 for (const auto& oppositeEdge : oppositeEdges) {
2021 // get reverse inner geometry
2022 const auto reverseGeometry = oppositeEdge->getNBEdge()->getInnerGeometry().reverse();
2023 if (reverseGeometry == myParentEdge->getNBEdge()->getInnerGeometry()) {
2024 splitBothDirections->enable();
2025 splitBothDirections->setText(TL("Split edge in both directions here"));
2026 }
2027 }
2028 }
2029 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Set geometry endpoint here (shift-click)"), nullptr, &parent, MID_GNE_EDGE_EDIT_ENDPOINT);
2030 // restore geometry points depending of selection status
2032 if (edgeSelSize == 1) {
2033 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Restore both geometry endpoints"), nullptr, &parent, MID_GNE_EDGE_RESET_ENDPOINT);
2034 } else {
2035 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Restore geometry endpoints of all selected edges"), nullptr, &parent, MID_GNE_EDGE_RESET_ENDPOINT);
2036 }
2037 } else {
2038 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Restore geometry endpoint (shift-click)"), nullptr, &parent, MID_GNE_EDGE_RESET_ENDPOINT);
2039 }
2040 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Reverse %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_REVERSE);
2041 auto reverse = GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Add reverse direction for %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_ADD_REVERSE);
2042 if (myParentEdge->getReverseEdge() != nullptr) {
2043 reverse->disable();
2044 }
2045 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Add reverse disconnected direction for %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_ADD_REVERSE_DISCONNECTED);
2046 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Reset lengths for %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_RESET_LENGTH);
2047 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Straighten %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_STRAIGHTEN);
2048 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Smooth %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_SMOOTH);
2049 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Straighten elevation of %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_STRAIGHTEN_ELEVATION);
2050 GUIDesigns::buildFXMenuCommand(edgeOperations, TLF("Smooth elevation of %", edgeDescPossibleMulti), nullptr, &parent, MID_GNE_EDGE_SMOOTH_ELEVATION);
2051}
2052
2053
2054void
2056 // Get icons
2057 FXIcon* pedestrianIcon = GUIIconSubSys::getIcon(GUIIcon::LANE_PEDESTRIAN);
2058 FXIcon* bikeIcon = GUIIconSubSys::getIcon(GUIIcon::LANE_BIKE);
2059 FXIcon* busIcon = GUIIconSubSys::getIcon(GUIIcon::LANE_BUS);
2060 FXIcon* greenVergeIcon = GUIIconSubSys::getIcon(GUIIcon::LANEGREENVERGE);
2061 // declare number of selected lanes
2062 int numSelectedLanes = 0;
2063 // if lane is selected, calculate number of restricted lanes
2064 bool edgeHasSidewalk = false;
2065 bool edgeHasBikelane = false;
2066 bool edgeHasBuslane = false;
2067 bool differentLaneShapes = false;
2069 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
2070 // update numSelectedLanes
2071 numSelectedLanes = (int)selectedLanes.size();
2072 // iterate over selected lanes
2073 for (const auto& selectedLane : selectedLanes) {
2074 if (selectedLane->myParentEdge->hasRestrictedLane(SVC_PEDESTRIAN)) {
2075 edgeHasSidewalk = true;
2076 }
2077 if (selectedLane->myParentEdge->hasRestrictedLane(SVC_BICYCLE)) {
2078 edgeHasBikelane = true;
2079 }
2080 if (selectedLane->myParentEdge->hasRestrictedLane(SVC_BUS)) {
2081 edgeHasBuslane = true;
2082 }
2083 if (selectedLane->myParentEdge->getNBEdge()->getLaneStruct(selectedLane->getIndex()).customShape.size() != 0) {
2084 differentLaneShapes = true;
2085 }
2086 }
2087 } else {
2088 edgeHasSidewalk = myParentEdge->hasRestrictedLane(SVC_PEDESTRIAN);
2089 edgeHasBikelane = myParentEdge->hasRestrictedLane(SVC_BICYCLE);
2090 edgeHasBuslane = myParentEdge->hasRestrictedLane(SVC_BUS);
2091 differentLaneShapes = myParentEdge->getNBEdge()->getLaneStruct(myIndex).customShape.size() != 0;
2092 }
2093 // create menu pane for lane operations
2094 FXMenuPane* laneOperations = new FXMenuPane(ret);
2095 ret->insertMenuPaneChild(laneOperations);
2096 if (numSelectedLanes > 0) {
2097 new FXMenuCascade(ret, TLF("Lane operations (% selected)", toString(numSelectedLanes)).c_str(), nullptr, laneOperations);
2098 } else {
2099 new FXMenuCascade(ret, TL("Lane operations"), nullptr, laneOperations);
2100 }
2101 GUIDesigns::buildFXMenuCommand(laneOperations, TL("Duplicate lane"), nullptr, &parent, MID_GNE_LANE_DUPLICATE);
2102 GUIDesigns::buildFXMenuCommand(laneOperations, TL("Set custom lane shape"), nullptr, &parent, MID_GNE_LANE_EDIT_SHAPE);
2103 FXMenuCommand* resetCustomShape = GUIDesigns::buildFXMenuCommand(laneOperations, TL("Reset custom shape"), nullptr, &parent, MID_GNE_LANE_RESET_CUSTOMSHAPE);
2104 if (!differentLaneShapes) {
2105 resetCustomShape->disable();
2106 }
2107 FXMenuCommand* resetOppositeLane = GUIDesigns::buildFXMenuCommand(laneOperations, TL("Reset opposite lane"), nullptr, &parent, MID_GNE_LANE_RESET_OPPOSITELANE);
2108 if (getAttribute(GNE_ATTR_OPPOSITE).empty()) {
2109 resetOppositeLane->disable();
2110 }
2111 // Create panel for lane operations and insert it in ret
2112 FXMenuPane* addSpecialLanes = new FXMenuPane(laneOperations);
2113 ret->insertMenuPaneChild(addSpecialLanes);
2114 FXMenuPane* removeSpecialLanes = new FXMenuPane(laneOperations);
2115 ret->insertMenuPaneChild(removeSpecialLanes);
2116 FXMenuPane* transformSlanes = new FXMenuPane(laneOperations);
2117 ret->insertMenuPaneChild(transformSlanes);
2118 // Create menu comands for all add special lanes
2119 FXMenuCommand* addSidewalk = GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Sidewalk"), pedestrianIcon, &parent, MID_GNE_LANE_ADD_SIDEWALK);
2120 FXMenuCommand* addBikelane = GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Bike lane"), bikeIcon, &parent, MID_GNE_LANE_ADD_BIKE);
2121 FXMenuCommand* addBuslane = GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Bus lane"), busIcon, &parent, MID_GNE_LANE_ADD_BUS);
2122 // if parent edge is selected, always add greenverge in front
2124 GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Green verge"), greenVergeIcon, &parent, MID_GNE_LANE_ADD_GREENVERGE_FRONT);
2125 } else {
2126 GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Green verge (front)"), greenVergeIcon, &parent, MID_GNE_LANE_ADD_GREENVERGE_FRONT);
2127 GUIDesigns::buildFXMenuCommand(addSpecialLanes, TL("Green verge (back)"), greenVergeIcon, &parent, MID_GNE_LANE_ADD_GREENVERGE_BACK);
2128 }
2129 // Create menu comands for all remove special lanes and disable it
2130 FXMenuCommand* removeSidewalk = GUIDesigns::buildFXMenuCommand(removeSpecialLanes, TL("Sidewalk"), pedestrianIcon, &parent, MID_GNE_LANE_REMOVE_SIDEWALK);
2131 removeSidewalk->disable();
2132 FXMenuCommand* removeBikelane = GUIDesigns::buildFXMenuCommand(removeSpecialLanes, TL("Bike lane"), bikeIcon, &parent, MID_GNE_LANE_REMOVE_BIKE);
2133 removeBikelane->disable();
2134 FXMenuCommand* removeBuslane = GUIDesigns::buildFXMenuCommand(removeSpecialLanes, TL("Bus lane"), busIcon, &parent, MID_GNE_LANE_REMOVE_BUS);
2135 removeBuslane->disable();
2136 FXMenuCommand* removeGreenVerge = GUIDesigns::buildFXMenuCommand(removeSpecialLanes, TL("Green verge"), greenVergeIcon, &parent, MID_GNE_LANE_REMOVE_GREENVERGE);
2137 removeGreenVerge->disable();
2138 // Create menu comands for all transform special lanes and disable it
2139 FXMenuCommand* transformLaneToSidewalk = GUIDesigns::buildFXMenuCommand(transformSlanes, TL("Sidewalk"), pedestrianIcon, &parent, MID_GNE_LANE_TRANSFORM_SIDEWALK);
2140 FXMenuCommand* transformLaneToBikelane = GUIDesigns::buildFXMenuCommand(transformSlanes, TL("Bike lane"), bikeIcon, &parent, MID_GNE_LANE_TRANSFORM_BIKE);
2141 FXMenuCommand* transformLaneToBuslane = GUIDesigns::buildFXMenuCommand(transformSlanes, TL("Bus lane"), busIcon, &parent, MID_GNE_LANE_TRANSFORM_BUS);
2142 FXMenuCommand* transformLaneToGreenVerge = GUIDesigns::buildFXMenuCommand(transformSlanes, TL("Green verge"), greenVergeIcon, &parent, MID_GNE_LANE_TRANSFORM_GREENVERGE);
2143 // add menuCascade for lane operations
2144 new FXMenuCascade(laneOperations, TLF("Add restricted %", toString(SUMO_TAG_LANE)).c_str(), nullptr, addSpecialLanes);
2145 FXMenuCascade* cascadeRemoveSpecialLane = new FXMenuCascade(laneOperations, TLF("Remove restricted %", toString(SUMO_TAG_LANE)).c_str(), nullptr, removeSpecialLanes);
2146 new FXMenuCascade(laneOperations, TLF("Transform to restricted %", toString(SUMO_TAG_LANE)).c_str(), nullptr, transformSlanes);
2147 // Enable and disable options depending of current transform of the lane
2148 if (edgeHasSidewalk) {
2149 transformLaneToSidewalk->disable();
2150 addSidewalk->disable();
2151 removeSidewalk->enable();
2152 }
2153 if (edgeHasBikelane) {
2154 transformLaneToBikelane->disable();
2155 addBikelane->disable();
2156 removeBikelane->enable();
2157 }
2158 if (edgeHasBuslane) {
2159 transformLaneToBuslane->disable();
2160 addBuslane->disable();
2161 removeBuslane->enable();
2162 }
2164 transformLaneToGreenVerge->disable();
2165 removeGreenVerge->enable();
2166 }
2167 // Check if cascade menu must be disabled
2168 if (!edgeHasSidewalk && !edgeHasBikelane && !edgeHasBuslane && !isRestricted(SVC_IGNORING)) {
2169 cascadeRemoveSpecialLane->disable();
2170 }
2171 // for whatever reason, sonar complains in the next line that cascadeRemoveSpecialLane may leak, but fox does the cleanup
2172} // NOSONAR
2173
2174
2175void
2177 // Create basic commands
2178 std::string edgeDescPossibleMulti = toString(SUMO_TAG_EDGE);
2180 if ((numSelectedEdges > 0) && myParentEdge->isAttributeCarrierSelected() && (numSelectedEdges > 1)) {
2181 edgeDescPossibleMulti = toString(numSelectedEdges) + " " + toString(SUMO_TAG_EDGE) + "s";
2182 }
2183 // create menu pane for edge operations
2184 FXMenuPane* edgeOperations = new FXMenuPane(ret);
2185 ret->insertMenuPaneChild(edgeOperations);
2186 if (numSelectedEdges > 0) {
2187 new FXMenuCascade(ret, TLF("Template operations (% selected)", toString(numSelectedEdges)).c_str(), nullptr, edgeOperations);
2188 } else {
2189 new FXMenuCascade(ret, TL("Template operations"), nullptr, edgeOperations);
2190 }
2191 // create menu commands for all edge operations
2192 GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Use edge as template"), nullptr, &parent, MID_GNE_EDGE_USEASTEMPLATE);
2193 auto applyTemplate = GUIDesigns::buildFXMenuCommand(edgeOperations, TL("Apply template"), nullptr, &parent, MID_GNE_EDGE_APPLYTEMPLATE);
2194 // check if disable apply template
2196 applyTemplate->disable();
2197 }
2198}
2199
2200
2201void
2203 // addreachability menu
2204 FXMenuPane* reachableByClass = new FXMenuPane(ret);
2205 ret->insertMenuPaneChild(reachableByClass);
2206 if (myNet->isNetRecomputed()) {
2207 new FXMenuCascade(ret, TL("Select reachable"), GUIIconSubSys::getIcon(GUIIcon::MODEVEHICLE), reachableByClass);
2208 for (const auto& vClass : SumoVehicleClassStrings.getStrings()) {
2209 GUIDesigns::buildFXMenuCommand(reachableByClass, vClass.c_str(), VClassIcons::getVClassIcon(SumoVehicleClassStrings.get(vClass)), &parent, MID_REACHABILITY);
2210 }
2211 } else {
2212 FXMenuCommand* menuCommand = GUIDesigns::buildFXMenuCommand(ret, TL("Select reachable (compute junctions)"), nullptr, nullptr, 0);
2213 menuCommand->handle(&parent, FXSEL(SEL_COMMAND, FXWindow::ID_DISABLE), nullptr);
2214 }
2215}
2216
2217/****************************************************************************/
NetworkEditMode
@brie enum for network edit modes
@ NETWORK_DELETE
mode for deleting network elements
@ NETWORK_MOVE
mode for moving network elements
@ NETWORK_TLS
mode for editing tls
@ NETWORK_SELECT
mode for selecting network elements
@ NETWORK_CONNECT
mode for connecting lanes
@ MID_GNE_ADDSELECT_EDGE
Add edge to selected items - menu entry.
Definition GUIAppEnum.h:849
@ MID_GNE_LANE_EDIT_SHAPE
edit lane shape
@ MID_GNE_LANE_TRANSFORM_BIKE
transform lane to bikelane
@ MID_GNE_EDGE_REVERSE
reverse an edge
@ MID_ADDSELECT
Add to selected items - menu entry.
Definition GUIAppEnum.h:485
@ MID_GNE_LANE_ADD_BUS
add busLane
@ MID_GNE_REMOVESELECT_EDGE
Remove edge from selected items - Menu Entry.
Definition GUIAppEnum.h:851
@ MID_GNE_EDGE_STRAIGHTEN_ELEVATION
interpolate z values linear between junctions
@ MID_GNE_EDGE_SMOOTH
smooth geometry
@ MID_GNE_LANE_RESET_CUSTOMSHAPE
reset custom shape
@ MID_GNE_EDGE_STRAIGHTEN
remove inner geometry
@ MID_GNE_LANE_TRANSFORM_BUS
transform lane to busLane
@ MID_COPY_EDGE_NAME
Copy edge name (for lanes only)
Definition GUIAppEnum.h:459
@ MID_GNE_LANE_DUPLICATE
duplicate a lane
@ MID_GNE_LANE_ADD_GREENVERGE_FRONT
add greenVerge front of current lane
@ MID_GNE_LANE_REMOVE_GREENVERGE
remove greenVerge
@ MID_GNE_EDGE_ADD_REVERSE_DISCONNECTED
add reverse edge disconnected (used for for spreadtype center)
@ MID_GNE_EDGE_SPLIT_BIDI
split an edge
@ MID_GNE_LANE_REMOVE_BIKE
remove bikelane
@ MID_GNE_LANE_RESET_OPPOSITELANE
reset opposite lane
@ MID_REACHABILITY
show reachability from a given lane
Definition GUIAppEnum.h:531
@ MID_GNE_EDGE_RESET_LENGTH
reset custom lengths
@ MID_GNE_LANE_REMOVE_BUS
remove busLane
@ MID_GNE_LANE_REMOVE_SIDEWALK
remove sidewalk
@ MID_GNE_EDGE_RESET_ENDPOINT
reset default geometry endpoints
@ MID_GNE_LANE_ADD_GREENVERGE_BACK
add greenVerge back of current lane
@ MID_GNE_EDGE_SMOOTH_ELEVATION
smooth elevation with regard to adjoining edges
@ MID_GNE_EDGE_ADD_REVERSE
add reverse edge
@ MID_GNE_EDGE_APPLYTEMPLATE
apply template
@ MID_GNE_EDGE_USEASTEMPLATE
use edge as tempalte
@ MID_GNE_LANE_ADD_SIDEWALK
add sidewalk
@ MID_GNE_RESET_GEOMETRYPOINT
reset geometry point
@ MID_GNE_LANE_TRANSFORM_SIDEWALK
transform lane to sidewalk
@ MID_GNE_LANE_ADD_BIKE
add bikelane
@ MID_GNE_EDGE_SPLIT
split an edge
@ MID_GNE_LANE_TRANSFORM_GREENVERGE
transform lane to greenVerge
@ MID_GNE_CUSTOM_GEOMETRYPOINT
set custom geometry point
@ MID_GNE_EDGE_EDIT_ENDPOINT
change default geometry endpoints
@ MID_REMOVESELECT
Remove from selected items - Menu Entry.
Definition GUIAppEnum.h:487
@ GLO_ROUTE
a route
@ GLO_JUNCTION
a junction
@ GLO_FRONTELEMENT
front element (used in netedit)
@ GLO_LANE
a lane
@ GLO_TEXTNAME
text element (used in netedit)
GUIViewObjectsHandler gViewObjectsHandler
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
@ LANE_PEDESTRIAN
@ LANEGREENVERGE
#define RAD2DEG(x)
Definition GeomHelper.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:296
#define TL(string)
Definition MsgHandler.h:315
#define TLF(string,...)
Definition MsgHandler.h:317
const SVCPermissions SVCAll
all VClasses are allowed
SVCPermissions invertPermissions(SVCPermissions permissions)
negate the given permissions and ensure that only relevant bits are set
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a railway edge.
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a waterway edge.
const std::string & getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a ' '.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
bool canParseVehicleClasses(const std::string &classes)
Checks whether the given string contains only known vehicle classes.
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_SHIP
is an arbitrary ship
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_RAIL_FAST
vehicle that is allowed to drive on high-speed rail tracks
@ SVC_DRONE
@ SVC_AUTHORITY
authorities vehicles
@ SVC_BUS
vehicle is a bus
@ SVC_AIRCRAFT
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)....
@ PARTLEFT
The link is a partial left direction.
@ RIGHT
The link is a (hard) right direction.
@ TURN
The link is a 180 degree turn.
@ LEFT
The link is a (hard) left direction.
@ STRAIGHT
The link is a straight direction.
@ TURN_LEFTHAND
The link is a 180 degree turn (left-hand network)
@ PARTRIGHT
The link is a partial right direction.
@ NODIR
The link has no direction (is a dead end link)
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ LINKSTATE_MAJOR
This is an uncontrolled, major link, may pass.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_EQUAL
This is an uncontrolled, right-before-left link.
@ LINKSTATE_ZIPPER
This is an uncontrolled, zipper-merge link.
@ LINKSTATE_TL_OFF_BLINKING
The link is controlled by a tls which is off and blinks, has to brake.
@ LINKSTATE_MINOR
This is an uncontrolled, minor link, has to brake.
@ LINKSTATE_TL_OFF_NOSIGNAL
The link is controlled by a tls which is off, not blinking, may pass.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_FROM_JUNCTION
@ SUMO_ATTR_SPEED
@ GNE_ATTR_STOPOFFSET
stop offset (virtual, used by edge and lanes)
@ SUMO_ATTR_VIA
@ GNE_ATTR_OPPOSITE
to busStop (used by personPlans)
@ SUMO_ATTR_TO_JUNCTION
@ GNE_ATTR_PARENT
parent of an additional element
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_CUSTOMSHAPE
whether a given shape is user-defined
@ GNE_ATTR_PARAMETERS
parameters "key1=value1|key2=value2|...|keyN=valueN"
@ GNE_ATTR_FROM_LANEID
from lane ID (used in GNEConnection)
@ GNE_ATTR_STOPOEXCEPTION
stop exceptions (virtual, used by edge and lanes)
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_CHANGE_LEFT
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_ENDOFFSET
@ SUMO_ATTR_ACCELERATION
@ GNE_ATTR_TO_LANEID
to lane ID (used in GNEConnection)
@ SUMO_ATTR_CHANGE_RIGHT
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ID
@ SUMO_ATTR_WIDTH
@ SUMO_ATTR_FRICTION
const double SUMO_const_laneWidth
Definition StdDefs.h:48
T MIN2(T a, T b)
Definition StdDefs.h:76
const double SUMO_const_laneMarkWidth
Definition StdDefs.h:51
T MAX2(T a, T b)
Definition StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
static void drawLine(const Position &beg, double rot, double visLength)
Draws a thin line.
Definition GLHelper.cpp:438
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:654
static void drawOutlineCircle(double radius, double iRadius, int steps=8)
Draws an unfilled circle around (0,0)
Definition GLHelper.cpp:596
static void drawTriangleAtEnd(const Position &p1, const Position &p2, double tLength, double tWidth, const double extraOffset=0)
Draws a triangle at the end of the given line.
Definition GLHelper.cpp:629
static void drawTextAtEnd(const std::string &text, const PositionVector &shape, double x, const GUIVisualizationTextSettings &settings, const double scale)
draw text and the end of shape
Definition GLHelper.cpp:838
static void popMatrix()
pop matrix
Definition GLHelper.cpp:130
static RGBColor getColor()
gets the gl-color
Definition GLHelper.cpp:660
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
Definition GLHelper.cpp:295
static void drawFilledCircleDetailled(const GUIVisualizationSettings::Detail d, const double radius)
Draws a filled circle around (0,0) depending of level of detail.
Definition GLHelper.cpp:539
static void pushMatrix()
push matrix
Definition GLHelper.cpp:117
static void drawInverseMarkings(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double maxLength, double spacing, double halfWidth, bool cl, bool cr, bool lefthand, double scale)
@bried draw the space between markings (in road color)
Definition GLHelper.cpp:900
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, const int align=0, double width=-1)
Definition GLHelper.cpp:756
static void drawCrossTies(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double length, double spacing, double halfWidth, double offset, bool lessDetail)
draw crossties for railroads or pedestrian crossings
Definition GLHelper.cpp:857
const std::string getID() const
get ID (all Attribute Carriers have one)
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
bool mySelected
boolean to check if this AC is selected (instead of GUIGlObjectStorage)
const std::string & getTagStr() const
get tag assigned to this object in string format
const GNETagProperties & getTagProperty() const
get tagProperty associated with this Attribute Carrier
void unselectAttributeCarrier(const bool changeFlag=true)
unselect attribute carrier using GUIGlobalSelection
bool drawUsingSelectColor() const
check if attribute carrier must be drawn using selecting color.
GNENet * myNet
pointer to net
GNENet * getNet() const
get pointer to net
void selectAttributeCarrier(const bool changeFlag=true)
select attribute carrier using GUIGlobalSelection
virtual std::string getAttribute(SumoXMLAttr key) const =0
bool myPossibleCandidate
flag to mark this element as possible candidate
bool mySpecialCandidate
flag to mark this element as special candidate
bool myInvalidCandidate
flag to mark this element as invalid candidate
bool isSpecialCandidate() const
check if this element is a special candidate
bool isPossibleCandidate() const
check if this element is a possible candidate
bool isInvalidCandidate() const
check if this element is a invalid candidate
bool isTargetCandidate() const
check if this element is a target candidate
bool isSourceCandidate() const
check if this element is a source candidate
bool isConflictedCandidate() const
check if this element is a conflicted candidate
bool myTargetCandidate
flag to mark this element as target candidate
bool myConflictedCandidate
flag to mark this element as conflicted candidate
bool mySourceCandidate
flag to mark this element as source candidate
static void changeAttribute(GNEAttributeCarrier *AC, SumoXMLAttr key, const std::string &value, GNEUndoList *undoList, const bool force=false)
change attribute
void calculateContourExtrudedShape(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GUIGlObject *glObject, const PositionVector &shape, const double layer, const double extrusionWidth, const double scale, const bool closeFirstExtrem, const bool closeLastExtrem, const double offset) const
calculate contour extruded (used in elements formed by a central shape)
void drawDottedContours(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, const double lineWidth, const bool addOffset) const
draw dotted contours (basics, select, delete, inspect...)
Boundary getContourBoundary() const
get contour boundary
void calculateContourAllGeometryPoints(const GUIVisualizationSettings &s, const GUIVisualizationSettings::Detail d, const GUIGlObject *glObject, const PositionVector &shape, const double layer, const double radius, const double scale, const bool calculatePosOverShape) const
calculate contour for all geometry points
struct for saving subordinated elements (Junction->Edge->Lane->(Additional | DemandElement)
ProtectElements * getProtectElements() const
get protect elements modul
A road/street connecting two junctions (netedit-version)
Definition GNEEdge.h:53
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
Definition GNEEdge.cpp:658
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:779
GNEEdge * getReverseEdge() const
get reverse edge (if exist)
Definition GNEEdge.cpp:1796
bool clickedOverGeometryPoint(const Position &pos) const
return true if user clicked over a Geometry Point
Definition GNEEdge.cpp:611
static const double SNAP_RADIUS
Definition GNEEdge.h:308
bool hasCustomEndPoints() const
Definition GNEEdge.cpp:575
bool hasRestrictedLane(SUMOVehicleClass vclass) const
check if edge has a restricted lane
Definition GNEEdge.cpp:2330
std::vector< GNEEdge * > getOppositeEdges() const
get opposite edges
Definition GNEEdge.cpp:713
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:77
const std::vector< GNEConnection * > & getGNEConnections() const
returns a reference to the GNEConnection vector
Definition GNEEdge.cpp:1122
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:82
const std::vector< GNEDemandElement * > & getChildDemandElements() const
return child demand elements
const std::vector< GNEGenericData * > & getParentGenericDatas() const
get parent demand elements
const std::vector< GNEDemandElement * > & getParentDemandElements() const
get parent demand elements
const std::vector< GNEAdditional * > & getParentAdditionals() const
get parent additionals
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
const std::vector< GNEGenericData * > & getChildGenericDatas() const
return child generic data elements
void setEdgeTemplate(const GNEEdge *edge)
set edge template
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
TemplateEditor * getTemplateEditor() const
get template editor
static RGBColor colorForLinksState(FXuint state)
return the color for each linkstate
static const StringBijection< FXuint > LinkStateNames
long names for link states
const std::vector< GNEEdge * > & getGNEIncomingEdges() const
Returns incoming GNEEdges.
bool isLogicValid()
whether this junction has a valid logic
Position getPositionInView() const
Returns position of hierarchical element in view.
NBNode * getNBNode() const
Return net build node.
class lane2lane connection geometry
FOX-declaration.
Definition GNELane.h:52
const GNELane * myLane
lane
Definition GNELane.h:84
double myInternalDrawingWidth
internal lane drawing width (used for drawing selected lanes)
Definition GNELane.h:93
void update(const GUIVisualizationSettings &s)
update lane drawing constants
Definition GNELane.cpp:74
GUIVisualizationSettings::Detail myDetail
detail level
Definition GNELane.h:99
bool drawAsRailway() const
draw as railway
Definition GNELane.cpp:148
bool drawSuperposed() const
draw superposed
Definition GNELane.cpp:154
double getExaggeration() const
get exaggeration
Definition GNELane.cpp:118
double myExaggeration
exaggeration
Definition GNELane.h:87
double getDrawingWidth() const
get lane drawing width
Definition GNELane.cpp:124
double getInternalDrawingWidth() const
get internal lane drawing width
Definition GNELane.cpp:130
double myDrawingWidth
lane drawing width
Definition GNELane.h:90
bool myDrawAsRailway
draw as railway
Definition GNELane.h:102
double myOffset
lane offset
Definition GNELane.h:96
double getOffset() const
get lane offset
Definition GNELane.cpp:136
bool myDrawSuperposed
draw supersposed (reduced width so that the lane markings below are visible)
Definition GNELane.h:105
GUIVisualizationSettings::Detail getDetail() const
get detail
Definition GNELane.cpp:142
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition GNELane.h:46
GNELane2laneConnection myLane2laneConnections
lane2lane connections
Definition GNELane.h:366
const PositionVector & getLaneShape() const
get elements shape
Definition GNELane.cpp:214
long onDefault(FXObject *, FXSelector, void *)
multiplexes message to two targets
Definition GNELane.cpp:1927
const GNELane2laneConnection & getLane2laneConnections() const
get Lane2laneConnection struct
Definition GNELane.cpp:664
~GNELane()
Destructor.
Definition GNELane.cpp:188
std::string getParentName() const
Returns the name of the parent object (if any)
Definition GNELane.cpp:1921
std::string getAttribute(SumoXMLAttr key) const
Definition GNELane.cpp:670
void drawLaneStopOffset(const GUIVisualizationSettings &s) const
draw laneStopOffset
Definition GNELane.cpp:1703
void drawSelectedLane(const GUIVisualizationSettings &s) const
draw selected lane
Definition GNELane.cpp:1067
bool checkDrawMoveContour() const
check if draw move contour (red)
Definition GNELane.cpp:401
std::vector< double > myLaneRestrictedTextureRotations
Rotations of textures of restricted lanes.
Definition GNELane.h:353
bool allowPedestrians() const
check if current lane allow pedestrians
Definition GNELane.cpp:202
void drawMarkingsAndBoundings(const GUIVisualizationSettings &s) const
draw lane markings
Definition GNELane.cpp:1131
const RGBColor * mySpecialColor
optional special color
Definition GNELane.h:357
Position getPositionInView() const
Returns position of hierarchical element in view.
Definition GNELane.cpp:319
bool isAttributeComputed(SumoXMLAttr key) const
Definition GNELane.cpp:870
bool drawAsWaterway(const GUIVisualizationSettings &s) const
whether to draw this lane as a waterways
Definition GNELane.cpp:1727
bool checkDrawDeleteContour() const
check if draw delete contour (pink/white)
Definition GNELane.cpp:365
double getLengthGeometryFactor() const
get length geometry factor
Definition GNELane.cpp:1985
bool isAttributeEnabled(SumoXMLAttr key) const
Definition GNELane.cpp:856
void drawDirectionIndicators(const GUIVisualizationSettings &s) const
direction indicators for lanes
Definition GNELane.cpp:1733
bool checkDrawSelectContour() const
check if draw select contour (blue)
Definition GNELane.cpp:383
void updateGeometry()
update pre-computed geometry information
Definition GNELane.cpp:242
void setMoveShape(const GNEMoveResult &moveResult)
set move shape
Definition GNELane.cpp:1000
GNEEdge * myParentEdge
parent edge (GNELanes cannot use hierarchical structures)
Definition GNELane.h:335
void deleteGLObject()
delete element
Definition GNELane.cpp:478
std::string getAttributeForSelection(SumoXMLAttr key) const
method for getting the attribute in the context of object selection
Definition GNELane.cpp:743
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Definition GNELane.cpp:494
int getIndex() const
returns the index of the lane
Definition GNELane.cpp:622
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
Definition GNELane.cpp:604
void removeGeometryPoint(const Position clickedPosition, GNEUndoList *undoList)
remove geometry point in the clicked position
Definition GNELane.cpp:425
GUIGeometry myLaneGeometry
lane geometry
Definition GNELane.h:341
bool checkDrawOverContour() const
check if draw over contour (orange)
Definition GNELane.cpp:359
void drawShapeEdited(const GUIVisualizationSettings &s) const
draw shape edited
Definition GNELane.cpp:1086
void drawOverlappedRoutes(const int numRoutes) const
draw overlapped routes
Definition GNELane.cpp:1686
void updateGLObject()
update GLObject (geometry, ID, etc.)
Definition GNELane.cpp:487
GNEMoveOperation * getMoveOperation()
get move operation
Definition GNELane.cpp:413
void buildLaneOperations(GUISUMOAbstractView &parent, GUIGLObjectPopupMenu *ret)
build lane operations contextual menu
Definition GNELane.cpp:2055
GNELane()
FOX needs this.
Definition GNELane.cpp:176
std::vector< GNEConnection * > getGNEOutcomingConnections()
returns a vector with the outgoing GNEConnections of this lane
Definition GNELane.cpp:1955
DrawingConstants * myDrawingConstants
LaneDrawingConstants.
Definition GNELane.h:344
const std::vector< double > & getShapeRotations() const
get rotations of the single shape parts
Definition GNELane.cpp:224
void buildTemplateOperations(GUISUMOAbstractView &parent, GUIGLObjectPopupMenu *ret)
build template oerations contextual menu
Definition GNELane.cpp:2176
bool setMultiColor(const GUIVisualizationSettings &s, const GUIColorer &c, RGBColor &col) const
sets multiple colors according to the current scheme index and some lane function
Definition GNELane.cpp:1550
void calculateLaneContour(const GUIVisualizationSettings &s, const double layer) const
calculate contour
Definition GNELane.cpp:1422
void drawTLSLinkNo(const GUIVisualizationSettings &s) const
draw TLS link Number
Definition GNELane.cpp:1249
const Parameterised::Map & getACParametersMap() const
get parameters map
Definition GNELane.cpp:882
double getLaneParametricLength() const
returns the parameteric length of the lane
Definition GNELane.cpp:641
RGBColor setLaneColor(const GUIVisualizationSettings &s) const
set color according to edit mode and visualisation settings
Definition GNELane.cpp:1438
bool isValid(SumoXMLAttr key, const std::string &value)
Definition GNELane.cpp:791
std::vector< GNEConnection * > getGNEIncomingConnections()
returns a vector with the incoming GNEConnections of this lane
Definition GNELane.cpp:1934
bool isRestricted(SUMOVehicleClass vclass) const
check if this lane is restricted
Definition GNELane.cpp:658
const DrawingConstants * getDrawingConstants() const
get lane drawing constants (previously calculated in drawGL())
Definition GNELane.cpp:236
int myIndex
The index of this lane.
Definition GNELane.h:338
void drawLaneAsRailway() const
draw lane as railway
Definition GNELane.cpp:1775
void setIndex(int index)
Definition GNELane.cpp:628
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
Definition GNELane.cpp:451
bool checkDrawFromContour() const
check if draw from contour (green)
Definition GNELane.cpp:325
void setSpecialColor(const RGBColor *Color2, double colorValue=std::numeric_limits< double >::max())
Definition GNELane.cpp:888
const GUIGeometry & getLaneGeometry() const
get lane geometry
Definition GNELane.cpp:208
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
Definition GNELane.cpp:610
void drawArrows(const GUIVisualizationSettings &s) const
draw lane arrows
Definition GNELane.cpp:1286
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
Definition GNELane.cpp:616
void drawLane(const GUIVisualizationSettings &s, const double layer) const
draw lane
Definition GNELane.cpp:1018
double mySpecialColorValue
optional value that corresponds to which the special color corresponds
Definition GNELane.h:360
void drawChildren(const GUIVisualizationSettings &s) const
draw children
Definition GNELane.cpp:1112
bool checkDrawRelatedContour() const
check if draw related contour (cyan)
Definition GNELane.cpp:353
std::vector< Position > myLaneRestrictedTexturePositions
Position of textures of restricted lanes.
Definition GNELane.h:350
void commitMoveShape(const GNEMoveResult &moveResult, GNEUndoList *undoList)
commit move shape
Definition GNELane.cpp:1009
double getLaneShapeLength() const
returns the length of the lane's shape
Definition GNELane.cpp:652
void drawStartEndGeometryPoints(const GUIVisualizationSettings &s) const
draw start and end geometry points
Definition GNELane.cpp:1853
std::vector< RGBColor > myShapeColors
The color of the shape parts (cached)
Definition GNELane.h:363
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
return value for lane coloring according to the given scheme
Definition GNELane.cpp:1574
bool checkDrawToContour() const
check if draw from contour (magenta)
Definition GNELane.cpp:339
bool setFunctionalColor(int activeScheme, RGBColor &col) const
sets the color according to the current scheme index and some lane function
Definition GNELane.cpp:1536
void updateConnectionIDs()
update IDs of incoming connections of this lane
Definition GNELane.cpp:1970
void buildRechableOperations(GUISUMOAbstractView &parent, GUIGLObjectPopupMenu *ret)
build rechable operations contextual menu
Definition GNELane.cpp:2202
void drawLane2LaneConnections() const
draw lane to lane connections
Definition GNELane.cpp:1374
void buildEdgeOperations(GUISUMOAbstractView &parent, GUIGLObjectPopupMenu *ret)
build edge operations contextual menu
Definition GNELane.cpp:1996
const std::vector< double > & getShapeLengths() const
get lengths of the single shape parts
Definition GNELane.cpp:230
PositionVector getAttributePositionVector(SumoXMLAttr key) const
Definition GNELane.cpp:731
void drawLinkNo(const GUIVisualizationSettings &s) const
draw link Number
Definition GNELane.cpp:1212
double getSpeed() const
returns the current speed of lane
Definition GNELane.cpp:635
void drawTextures(const GUIVisualizationSettings &s) const
draw lane textures
Definition GNELane.cpp:1821
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
Definition GNELane.cpp:753
GNEEdge * getParentEdge() const
get parent edge
Definition GNELane.cpp:196
GNEMoveOperation * calculateMoveShapeOperation(const GUIGlObject *obj, const PositionVector originalShape, const bool maintainShapeClosed)
calculate move shape operation
move operation
move result
PositionVector shapeToUpdate
shape to update (edited in moveElement)
std::vector< GNELane * > getSelectedLanes() const
get selected lanes
int getNumberOfSelectedEdges() const
get number of selected edges
void deleteLane(GNELane *lane, GNEUndoList *undoList, bool recomputeConnections)
removes lane
Definition GNENet.cpp:590
GNEPathManager * getDemandPathManager()
get demand path manager
Definition GNENet.cpp:142
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:125
bool isNetRecomputed() const
check if net require recomputing
Definition GNENet.cpp:1539
GNEPathManager * getNetworkPathManager()
get network path manager
Definition GNENet.cpp:137
NBEdgeCont & getEdgeCont()
returns the NBEdgeCont of the underlying netbuilder
Definition GNENet.cpp:2159
GNEViewNet * getViewNet() const
get view net
Definition GNENet.cpp:2147
GNEContour myNetworkElementContour
network element contour
bool myShapeEdited
flag to check if element shape is being edited
void setNetworkElementID(const std::string &newID)
set network element id
bool isShapeEdited() const
check if shape is being edited
bool drawCandidateEdgesWithSpecialColor() const
draw candidate edges with special color (Only for candidates, special and conflicted)
void invalidatePathCalculator()
invalidate pathCalculator
PathCalculator * getPathCalculator()
obtain instance of PathCalculator
void drawLanePathElements(const GUIVisualizationSettings &s, const GNELane *lane) const
draw lane path elements
GNEPathCreator * getPathCreator() const
get path creator module
bool controlsEdge(GNEEdge *edge) const
whether the given edge is controlled by the currently edited tlDef
void handleMultiChange(GNELane *lane, FXObject *obj, FXSelector sel, void *data)
update phase definition for the current traffic light and phase
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
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...
const GNEAttributeCarrier * getFrontAttributeCarrier() const
get front attributeCarrier
const GNEViewNetHelper::EditModes & getEditModes() const
get edit modes
const GNEViewNetHelper::EditNetworkElementShapes & getEditNetworkElementShapes() const
get Edit Shape module
const GNEViewNetHelper::NetworkViewOptions & getNetworkViewOptions() const
get network view options
void drawTranslateFrontAttributeCarrier(const GNEAttributeCarrier *AC, double typeOrLayer, const double extraOffset=0)
draw front attributeCarrier
GNEViewParent * getViewParent() const
get the net object
bool checkOverLockedElement(const GUIGlObject *GLObject, const bool isSelected) const
check if given element is locked (used for drawing select and delete contour)
bool checkSelectEdges() const
check if select edges (toggle using button or shift)
GNEUndoList * getUndoList() const
get the undoList object
const std::vector< GNEAttributeCarrier * > & getInspectedAttributeCarriers() const
get inspected attribute carriers
GNEDeleteFrame * getDeleteFrame() const
get frame for delete elements
GNETLSEditorFrame * getTLSEditorFrame() const
get frame for NETWORK_TLS
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
GNERouteFrame * getRouteFrame() const
get frame for DEMAND_ROUTE
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
The popup menu of a globject.
void insertMenuPaneChild(FXMenuPane *child)
Insert a sub-menu pane in this GUIGLObjectPopupMenu.
const std::vector< double > & getShapeRotations() const
The rotations of the single shape parts.
static void drawGeometryPoints(const GUIVisualizationSettings::Detail d, const PositionVector &shape, const RGBColor &color, const double radius, const double exaggeration, const bool editingElevation)
draw geometry points
static void drawGeometry(const GUIVisualizationSettings::Detail d, const GUIGeometry &geometry, const double width, double offset=0)
draw geometry
static double calculateRotation(const Position &first, const Position &second)
return angle between two points (used in geometric calculations)
const PositionVector & getShape() const
The shape of the additional element.
void updateGeometry(const PositionVector &shape)
update entire geometry
const std::vector< double > & getShapeLengths() const
The lengths of the single shape parts.
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
T getColor(const double value) const
const std::vector< T > & getSchemes() const
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
virtual Position getPositionInformation() const
Returns the cursor's x/y position within the network.
static GUIGlID getTexture(GUITexture which)
returns a texture previously defined in the enum GUITexture
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
bool checkBoundaryParentObject(const GUIGlObject *GLObject, const GUIGlObject *parent, const double layer)
Stores the information about how to visualize structures.
bool drawForRectangleSelection
whether drawing is performed for the purpose of selecting objects using a rectangle
GUIVisualizationSizeSettings addSize
bool disableLaneIcons
whether drawing is performed in left-hand networks
GUIVisualizationTextSettings drawLinkJunctionIndex
Detail getDetailLevel(const double exaggeration) const
return the detail level
bool showRails
Information whether rails shall be drawn.
GUIVisualizationCandidateColorSettings candidateColorSettings
candidate color settings
double laneWidthExaggeration
The lane exaggeration (upscale thickness)
bool lefthand
whether drawing is performed in left-hand networks
GUIVisualizationColorSettings colorSettings
color settings
GUIVisualizationDottedContourSettings dottedContourSettings
dotted contour settings
static const RGBColor & getLinkColor(const LinkState &ls, bool realistic=false)
map from LinkState to color constants
double scale
information about a lane's width (temporary, used for a single view)
bool showLaneDirection
Whether to show direction indicators for lanes.
bool drawForViewObjectsHandler
whether drawing is performed for the purpose of selecting objects in view using ViewObjectsHandler
bool showLinkDecals
Information whether link textures (arrows) shall be drawn.
GUIColorer laneColorer
The lane colorer.
bool laneShowBorders
Information whether lane borders shall be drawn.
GUIVisualizationTextSettings drawLinkTLIndex
double selectorFrameScale
the current selection scaling in netedit (set in SelectorFrame)
bool spreadSuperposed
Whether to improve visualisation of superposed (rail) edges.
GUIColorer junctionColorer
The junction colorer.
std::string edgeParam
key for coloring by edge parameter
GUIVisualizationNeteditSizeSettings neteditSizeSettings
netedit size settings
static double naviDegree(const double angle)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition MFXUtils.cpp:112
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
The representation of a single edge during network building.
Definition NBEdge.h:92
double getLaneSpeed(int lane) const
get lane speed
Definition NBEdge.cpp:2208
void setPermittedChanging(int lane, SVCPermissions changeLeft, SVCPermissions changeRight)
set allowed classes for changing to the left and right from the given lane
Definition NBEdge.cpp:4369
double getLength() const
Returns the computed length of the edge.
Definition NBEdge.h:593
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
Definition NBEdge.cpp:4378
double getDistancAt(double pos) const
get distance at the given offset
Definition NBEdge.cpp:4916
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given
Definition NBEdge.cpp:4341
double getLoadedLength() const
Returns the length was set explicitly or the computed length if it wasn't set.
Definition NBEdge.h:602
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
Definition NBEdge.cpp:4293
double getLaneWidth() const
Returns the default width of lanes of this edge.
Definition NBEdge.h:642
NBNode * getToNode() const
Returns the destination node of the edge.
Definition NBEdge.h:546
std::vector< Connection > myConnections
List of connections to following edges.
Definition NBEdge.h:1770
Lane & getLaneStruct(int lane)
Definition NBEdge.h:1428
bool isBidiRail(bool ignoreSpread=false) const
whether this edge is part of a bidirectional railway
Definition NBEdge.cpp:749
NBNode * myTo
Definition NBEdge.h:1740
const std::string & getID() const
Definition NBEdge.h:1528
bool allowsChangingRight(int lane, SUMOVehicleClass vclass) const
Returns whether the given vehicle class may change left from this lane.
Definition NBEdge.cpp:4525
double getDistance() const
get distance
Definition NBEdge.h:679
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
Definition NBEdge.cpp:4164
void setAcceleration(int lane, bool accelRamp)
marks one lane as acceleration lane
Definition NBEdge.cpp:4325
bool isBidiEdge(bool checkPotential=false) const
whether this edge is part of a bidirectional edge pair
Definition NBEdge.cpp:761
int getNumLanes() const
Returns the number of lanes.
Definition NBEdge.h:520
std::vector< Connection > getConnectionsFromLane(int lane, const NBEdge *to=nullptr, int toLane=-1) const
Returns connections from a given lane.
Definition NBEdge.cpp:1286
void setFriction(int lane, double friction)
set lane specific friction (negative lane implies set for all lanes)
Definition NBEdge.cpp:4309
std::string getLaneID(int lane) const
get lane ID
Definition NBEdge.cpp:4016
void setLaneShape(int lane, const PositionVector &shape)
sets a custom lane shape
Definition NBEdge.cpp:4333
NBNode * getFromNode() const
Returns the origin node of the edge.
Definition NBEdge.h:539
int getPriority() const
Returns the priority of the edge.
Definition NBEdge.h:527
static const double UNSPECIFIED_WIDTH
unspecified lane width
Definition NBEdge.h:346
void setEndOffset(int lane, double offset)
set lane specific end-offset (negative lane implies set for all lanes)
Definition NBEdge.cpp:4247
bool allowsChangingLeft(int lane, SUMOVehicleClass vclass) const
Returns whether the given vehicle class may change left from this lane.
Definition NBEdge.cpp:4519
bool isMacroscopicConnector() const
Returns whether this edge was marked as a macroscopic connector.
Definition NBEdge.h:1136
const PositionVector & getLaneShape(int i) const
Returns the shape of the nth lane.
Definition NBEdge.cpp:986
const PositionVector getInnerGeometry() const
Returns the geometry of the edge without the endpoints.
Definition NBEdge.cpp:590
double getFinalLength() const
get length that will be assigned to the lanes in the final network
Definition NBEdge.cpp:4714
Represents a single node (junction) during network building.
Definition NBNode.h:66
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
Definition NBNode.cpp:2358
const std::set< NBTrafficLightDefinition * > & getControllingTLS() const
Returns the traffic lights that were assigned to this node (The set of tls that control this node)
Definition NBNode.h:336
LinkState getLinkState(const NBEdge *incoming, const NBEdge *outgoing, int fromLane, int toLane, bool mayDefinitelyPass, const std::string &tlID) const
get link state
Definition NBNode.cpp:2443
int getConnectionIndex(const NBEdge *from, const NBEdge::Connection &con) const
return the index of the given connection
Definition NBNode.cpp:3951
static bool areParametersValid(const std::string &value, bool report=false, const std::string kvsep="=", const std::string sep="|")
check if given string can be parsed to a parameters map "key1=value1|key2=value2|....
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
std::map< std::string, std::string > Map
parameters map
void setParametersStr(const std::string &paramsString, const std::string kvsep="=", const std::string sep="|")
set the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN"
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
std::string getParametersStr(const std::string kvsep="=", const std::string sep="|") const
Returns the inner key/value map in string format "key1=value1|key2=value2|...|keyN=valueN".
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double x() const
Returns the x-position.
Definition Position.h:55
double z() const
Returns the z-position.
Definition Position.h:65
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
Definition Position.h:286
double y() const
Returns the y-position.
Definition Position.h:60
A list of positions.
double length2D() const
Returns the length.
double beginEndAngle() const
returns the angle in radians of the line connecting the first and the last position
double length() const
Returns the length.
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
int indexOfClosest(const Position &p, bool twoD=false) const
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
static const RGBColor WHITE
Definition RGBColor.h:192
static const RGBColor ORANGE
Definition RGBColor.h:191
static const RGBColor CYAN
Definition RGBColor.h:189
static const RGBColor GREEN
Definition RGBColor.h:186
static RGBColor fromHSV(double h, double s, double v)
Converts the given hsv-triplet to rgb, inspired by http://alvyray.com/Papers/CG/hsv2rgb....
Definition RGBColor.cpp:371
static const RGBColor BLACK
Definition RGBColor.h:193
RGBColor changedBrightness(int change, int toChange=3) const
Returns a new color with altered brightness.
Definition RGBColor.cpp:200
void setOffset(const double offset)
set offset
bool isDefined() const
check if stopOffset was defined
void setExceptions(const std::string permissions)
set exceptions (used in netedit)
std::string getExceptions() const
get exceptions (used in netedit)
double getOffset() const
get offset
std::vector< std::string > getStrings() const
T get(const std::string &str) const
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
static FXIcon * getVClassIcon(const SUMOVehicleClass vc)
returns icon associated to the given vClass
NetworkEditMode networkEditMode
the current Network edit mode
bool isCurrentSupermodeDemand() const
@check if current supermode is Demand
bool isCurrentSupermodeData() const
@check if current supermode is Data
bool isCurrentSupermodeNetwork() const
@check if current supermode is Network
GNENetworkElement * getEditedNetworkElement() const
pointer to edited network element
static void drawLockIcon(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, GUIGlObjectType type, const Position position, const double exaggeration, const double size=0.5, const double offsetx=0, const double offsety=0)
draw lock icon
bool editingElevation() const
check if we're editing elevation
bool showDemandElements() const
check if show demand elements checkbox is enabled
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 invalid
color for invalid elements
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
RGBColor selectedEdgeColor
edge selection color
RGBColor selectedLaneColor
lane selection color
static const RGBColor editShapeColor
color for edited shapes (Junctions, crossings and connections)
static const double segmentWidth
width of dotted contour segments
static const double laneGeometryPointRadius
moving lane geometry point radius
static const double junctionBubbleRadius
junction bubble radius
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
bool show(const GUIGlObject *o) const
whether to show the text
double width
This lane's width.
Definition NBEdge.h:176
StopOffset laneStopOffset
stopOffsets.second - The stop offset for vehicles stopping at the lane's end. Applies if vClass is in...
Definition NBEdge.h:173
PositionVector customShape
A custom shape for this lane set by the user.
Definition NBEdge.h:189
double endOffset
This lane's offset to the intersection begin.
Definition NBEdge.h:169
std::string type
the type of this lane
Definition NBEdge.h:192
std::string oppositeID
An opposite lane ID, if given.
Definition NBEdge.h:179
SVCPermissions changeRight
List of vehicle types that are allowed to change right from this lane.
Definition NBEdge.h:166
double friction
The friction on this lane.
Definition NBEdge.h:154
SVCPermissions changeLeft
List of vehicle types that are allowed to change Left from this lane.
Definition NBEdge.h:163
bool accelRamp
Whether this lane is an acceleration lane.
Definition NBEdge.h:182
PositionVector shape
The lane's shape.
Definition NBEdge.h:148