Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEViewNet.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
19// A view on the network being edited (adapted from GUIViewTraffic)
20/****************************************************************************/
21
22#include <netbuild/NBEdgeCont.h>
87
89#include "GNENet.h"
90#include "GNEUndoList.h"
91#include "GNEViewNet.h"
92#include "GNEViewParent.h"
93
94// ===========================================================================
95// FOX callback mapping
96// ===========================================================================
97
98FXDEFMAP(GNEViewNet) GNEViewNetMap[] = {
99 // Super Modes
103 // Modes
120 // Network view options
137 // Demand view options
149 // Data view options
158 // Select elements
159 FXMAPFUNC(SEL_COMMAND, MID_ADDSELECT, GNEViewNet::onCmdAddSelected),
160 FXMAPFUNC(SEL_COMMAND, MID_REMOVESELECT, GNEViewNet::onCmdRemoveSelected),
163 // Junctions
176 FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_ADDTLS, GNEViewNet::onCmdAddTLS),
178 // Connections
181 // Crossings
183 // WalkingArea
185 // Edges
186 FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SPLIT, GNEViewNet::onCmdSplitEdge),
188 FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_REVERSE, GNEViewNet::onCmdReverseEdge),
194 FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SMOOTH, GNEViewNet::onCmdSmoothEdges),
200 // Lanes
219 // Additionals
221 // Polygons
224 FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_OPEN, GNEViewNet::onCmdOpenPolygon),
229 // edit custom shapes
238 // POIs
239 FXMAPFUNC(SEL_COMMAND, MID_GNE_POI_ATTACH, GNEViewNet::onCmdAttachPOI),
240 FXMAPFUNC(SEL_COMMAND, MID_GNE_POI_RELEASE, GNEViewNet::onCmdReleasePOI),
243 // Demand elements
244 FXMAPFUNC(SEL_COMMAND, MID_GNE_REVERSE, GNEViewNet::onCmdReverse),
245 FXMAPFUNC(SEL_COMMAND, MID_GNE_ADDREVERSE, GNEViewNet::onCmdAddReverse),
246 // Geometry Points
249 // toolbar views
252 // IntervalBar
259};
260
261// Object implementation
262FXIMPLEMENT(GNEViewNet, GUISUMOAbstractView, GNEViewNetMap, ARRAYNUMBER(GNEViewNetMap))
263
264
265// ===========================================================================
266// member method definitions
267// ===========================================================================
268#ifdef _MSC_VER
269#pragma warning(push)
270#pragma warning(disable: 4355) // mask warning about "this" in initializers
271#endif
272GNEViewNet::GNEViewNet(FXComposite* tmpParent, FXComposite* actualParent, GUIMainWindow& app,
273 GNEViewParent* viewParent, GNENet* net, GNEUndoList* undoList,
274 FXGLVisual* glVis, FXGLCanvas* share) :
275 GUISUMOAbstractView(tmpParent, app, viewParent, net->getGrid(), glVis, share),
277 myEditModes(this),
278 myTestingMode(this),
285 myDataViewOptions(this),
286 myIntervalBar(this),
289 myVehicleOptions(this),
291 mySaveElements(this),
292 myTimeFormat(this),
293 mySelectingArea(this),
295 myLockManager(this),
296 myViewParent(viewParent),
297 myNet(net),
298 myUndoList(undoList) {
299 // view must be the final member of actualParent
300 reparent(actualParent);
301 // Build edit modes
303 // set this net in Net
304 myNet->setViewNet(this);
305 // set drag delay
306 ((GUIDanielPerspectiveChanger*)myChanger)->setDragDelay(100000000); // 100 milliseconds
307 // Reset textures
309 // init testing mode
310 myTestingMode.initTestingMode();
311 // update grid flags
312 myNetworkViewOptions.menuCheckToggleGrid->setChecked(myVisualizationSettings->showGrid);
313 myDemandViewOptions.menuCheckToggleGrid->setChecked(myVisualizationSettings->showGrid);
314 // update junction shape flags
315 const bool hide = !myVisualizationSettings->drawJunctionShape;
316 myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
317 myDemandViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
318 myDataViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
319}
320#ifdef _MSC_VER
321#pragma warning(pop)
322#endif
323
324
327
328
329void
331 if (myNet && makeCurrent()) {
332 // declare boundary
333 const Boundary maxBoundary(1000000000.0, 1000000000.0, -1000000000.0, -1000000000.0);
334 // get all objects in boundary
335 const std::vector<GUIGlID> GLIDs = getObjectsInBoundary(maxBoundary);
336 // finish make OpenGL context current
337 makeNonCurrent();
338 // declare set
339 std::set<GNEAttributeCarrier*> ACs;
340 // iterate over GUIGlIDs
341 for (const auto& GLId : GLIDs) {
342 GNEAttributeCarrier* AC = myNet->getAttributeCarriers()->retrieveAttributeCarrier(GLId);
343 // Make sure that object exists
344 if (AC && AC->getTagProperty()->isPlacedInRTree()) {
345 ACs.insert(AC);
346 }
347 }
348 // interate over ACs
349 for (const auto& AC : ACs) {
350 // remove object and insert again with exaggeration
351 myNet->getGrid().removeAdditionalGLObject(AC->getGUIGlObject());
352 myNet->getGrid().addAdditionalGLObject(AC->getGUIGlObject(), AC->getGUIGlObject()->getExaggeration(*myVisualizationSettings));
353 }
354 }
355}
356
357
358void
360
361
364 if (myViewObjectsSelector.getGUIGlObjectFront()) {
365 return myViewObjectsSelector.getGUIGlObjectFront()->getGlID();
366 } else {
367 return 0;
368 }
369}
370
371
372void
374 // build coloring tools
375 {
376 for (auto it_names : gSchemeStorage.getNames()) {
377 v->getColoringSchemesCombo()->appendIconItem(it_names.c_str());
378 if (it_names == myVisualizationSettings->name) {
380 }
381 }
382 }
383 // for junctions
384 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
385 std::string("\t") + TL("Locate Junctions") + std::string("\t") + TL("Locate a junction within the network. (Shift+J)"),
387 // for edges
388 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
389 std::string("\t") + TL("Locate Edges") + std::string("\t") + TL("Locate an edge within the network. (Shift+E)"),
391 // for walkingAreas
392 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
393 std::string("\t") + TL("Locate WalkingAreas") + std::string("\t") + TL("Locate a walkingArea within the network. (Shift+W)"),
395 // for vehicles
396 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
397 std::string("\t") + TL("Locate Vehicles") + std::string("\t") + TL("Locate a vehicle within the network. (Shift+V)"),
399 // for person
400 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
401 std::string("\t") + TL("Locate Persons") + std::string("\t") + TL("Locate a person within the network. (Shift+P)"),
403 // for container
404 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
405 std::string("\t") + TL("Locate Containers") + std::string("\t") + TL("Locate a container within the network. (Shift+C)"),
407 // for routes
408 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
409 std::string("\t") + TL("Locate Route") + std::string("\t") + TL("Locate a route within the network. (Shift+R)"),
411 // for routes
412 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
413 std::string("\t") + TL("Locate Stops") + std::string("\t") + TL("Locate a stop within the network. (Shift+S)"),
415 // for persons (currently unused)
416 /*
417 new MFXButtonTooltip(v->getLocatorPopup(),
418 std::string("\t") + TL("Locate Vehicle\tLocate a person within the network.",
419 GUIIconSubSys::getIcon(GUIIcon::LOCATEPERSON), &v, MID_LOCATEPERSON,
420 GUIDesignButtonPopup);
421 */
422 // for tls
423 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
424 std::string("\t") + TL("Locate TLS") + std::string("\t") + TL("Locate a tls within the network. (Shift+T)"),
426 // for additional stuff
427 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
428 std::string("\t") + TL("Locate Additional") + std::string("\t") + TL("Locate an additional structure within the network. (Shift+A)"),
430 // for pois
431 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
432 std::string("\t") + TL("Locate PoI") + std::string("\t") + TL("Locate a PoI within the network. (Shift+O)"),
434 // for polygons
435 new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
436 std::string("\t") + TL("Locate Polygon") + std::string("\t") + TL("Locate a Polygon within the network. (Shift+L)"),
438}
439
440
441void
442GNEViewNet::updateViewNet(const bool ignoreViewUpdater) const {
443 // this call is only used for breakpoints (to check when view is updated)
444 if (ignoreViewUpdater || gViewUpdater.allowUpdate()) {
445 GUISUMOAbstractView::update();
446 }
447}
448
449
450void
454
455
456void
458 if (myEditModes.isJuPedSimView()) {
459 // hide data button (and adjust width)
460 myEditModes.dataButton->hide();
461 // check network modes
462 switch (myEditModes.networkEditMode) {
469 break;
470 default:
471 break;
472 }
473 // check demand modes
474 switch (myEditModes.demandEditMode) {
481 break;
482 default:
483 break;
484 }
485 // go to network mode if we're in data mode
486 if (myEditModes.isCurrentSupermodeData()) {
488 } else {
489 // refresh current supermode
490 myEditModes.setSupermode(myEditModes.currentSupermode, true);
491 }
492 } else {
493 // show data button
494 myEditModes.dataButton->show();
495 // refresh current supermode
496 myEditModes.setSupermode(myEditModes.currentSupermode, true);
497 }
498}
499
500
505
506
507void
509 // clear post drawing elements
510 gViewObjectsHandler.reset();
511 // set selection position in gObjectsInPosition
512 gViewObjectsHandler.setSelectionPosition(pos);
513 // create an small boundary
514 Boundary positionBoundary;
515 positionBoundary.add(pos);
516 positionBoundary.grow(POSITION_EPS);
517 // push matrix
519 // enable draw for view objects handler (this calculate the contours)
520 myVisualizationSettings->drawForViewObjectsHandler = true;
521 // draw all GL elements within the small boundary
522 drawGLElements(positionBoundary);
523 // draw routeDistributions (temporal)
524 for (auto& routeDistribution : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE_DISTRIBUTION)) {
525 routeDistribution.second->drawGL(*myVisualizationSettings);
526 }
527 // swap selected objects (needed after selecting)
528 gViewObjectsHandler.reverseSelectedObjects();
529 // check if filter edges that have the mouse over their geometry points
530 if (myEditModes.isCurrentSupermodeNetwork() && myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
531 gViewObjectsHandler.isolateEdgeGeometryPoints();
532 }
533 // restore draw for view objects handler (this calculate the contours)
534 myVisualizationSettings->drawForViewObjectsHandler = false;
535 // pop matrix
537 // check if update front elements
538 for (const auto& AC : myMarkFrontElements.getACs()) {
539 gViewObjectsHandler.updateFrontObject(AC->getGUIGlObject());
540 }
541 // after draw elements, update objects under cursor
542 myViewObjectsSelector.updateObjects();
543}
544
545
546void
548 if (shape.size() == 1) {
549 // if our shape has only one ponit, use updateObjectsInPosition
550 updateObjectsInPosition(shape.front());
551 } else if (shape.size() > 1) {
552 // triangulate shape
553 const auto triangles = Triangle::triangulate(shape);
554 // clear post drawing elements
555 gViewObjectsHandler.reset();
556 // push matrix
558 // enable draw for object under cursor and rectangle selection
559 myVisualizationSettings->drawForViewObjectsHandler = true;
560 myVisualizationSettings->drawForRectangleSelection = true;
561 // draw all GL elements within the boundares formed by triangles
562 for (const auto& triangle : triangles) {
563 gViewObjectsHandler.setSelectionTriangle(triangle);
564 drawGLElements(triangle.getBoundary());
565 }
566 // restore draw for object under cursor
567 myVisualizationSettings->drawForViewObjectsHandler = false;
568 myVisualizationSettings->drawForRectangleSelection = false;
569 // pop matrix
571 // check if update front elements
572 for (const auto& AC : myMarkFrontElements.getACs()) {
573 gViewObjectsHandler.updateFrontObject(AC->getGUIGlObject());
574 }
575 // after draw elements, update objects under cursor
576 myViewObjectsSelector.updateObjects();
577 }
578}
579
580
581void
583 // if we're inspecting an element, add it to redraw path elements
584 for (const auto& AC : myInspectedElements.getACs()) {
585 const auto pathElement = dynamic_cast<const GNEPathElement*>(AC);
586 if (pathElement) {
587 gViewObjectsHandler.addToRedrawPathElements(pathElement);
588 }
589 }
590 // enable draw for view objects handler (this calculate the contours)
591 myVisualizationSettings->drawForViewObjectsHandler = true;
592 // push matrix
594 // redraw elements in buffer
595 myNet->getNetworkPathManager()->redrawPathElements(*myVisualizationSettings);
596 myNet->getDemandPathManager()->redrawPathElements(*myVisualizationSettings);
597 myNet->getDataPathManager()->redrawPathElements(*myVisualizationSettings);
598 // pop matrix
600 // disable drawForViewObjectsHandler
601 myVisualizationSettings->drawForViewObjectsHandler = false;
602}
603
604
609
610
615
616
617bool
618GNEViewNet::setColorScheme(const std::string& name) {
619 if (!gSchemeStorage.contains(name)) {
620 return false;
621 }
622 if (myGUIDialogViewSettings != nullptr) {
623 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
624 myGUIDialogViewSettings->setCurrentScheme(name);
625 }
626 }
627 myVisualizationSettings = &gSchemeStorage.get(name.c_str());
629 return true;
630}
631
632
633void
635 // reimplemented from GUISUMOAbstractView due GNEOverlappedInspection
636 ungrab();
637 // make network current
638 if (isEnabled() && myAmInitialised) {
639 // check if we're cliking while alt button is pressed
640 if (myMouseButtonKeyPressed.altKeyPressed()) {
641 // set clicked popup position
643 // create cursor popup dialog for mark front element
645 // open popup dialog
647 } else if (myViewObjectsSelector.getGLObjects().empty()) {
649 } else {
650 // declare filtered objects
651 std::vector<GUIGlObject*> filteredGLObjects;
652 // get GUIGLObject front
653 GUIGlObject* overlappedElement = nullptr;
654 // we need to check if we're inspecting a overlapping element
655 if (myViewParent->getInspectorFrame()->getOverlappedInspection()->overlappedInspectionShown() &&
656 myInspectedElements.getFirstAC()) {
657 overlappedElement = myInspectedElements.getFirstAC()->getGUIGlObject();
658 filteredGLObjects.push_back(overlappedElement);
659 }
660 bool connections = false;
661 bool TLS = false;
662 // fill filtered objects
663 if ((myViewObjectsSelector.getGLObjects().size() == 1) && (myViewObjectsSelector.getGLObjects().back()->getType() == GLO_EDGE)) {
664 // special case for edge geometry points (because edges uses the lane pop ups)
665 filteredGLObjects.push_back(myViewObjectsSelector.getGLObjects().back());
666 } else {
667 for (const auto& glObject : myViewObjectsSelector.getGLObjects()) {
668 // always avoid edges
669 if (glObject->getType() == GLO_EDGE) {
670 continue;
671 }
672 if (glObject->getType() == GLO_CONNECTION) {
673 connections = true;
674 }
675 if (glObject->getType() == GLO_TLLOGIC) {
676 TLS = true;
677 }
678 filteredGLObjects.push_back(glObject);
679 }
680 auto it = filteredGLObjects.begin();
681 if (connections) {
682 // filter junctions if there are connections
683 while (it != filteredGLObjects.end()) {
684 if ((*it)->getType() == GLO_JUNCTION) {
685 it = filteredGLObjects.erase(it);
686 } else {
687 it++;
688 }
689 }
690 } else if (TLS) {
691 // filter all elements except TLLogic
692 while (it != filteredGLObjects.end()) {
693 if ((*it)->getType() != GLO_TLLOGIC) {
694 it = filteredGLObjects.erase(it);
695 } else {
696 it++;
697 }
698 }
699 }
700 }
701 // remove duplicated elements using an unordered set
702 auto itDuplicated = filteredGLObjects.begin();
703 std::unordered_set<GUIGlObject*> unorderedSet;
704 for (auto itElement = filteredGLObjects.begin(); itElement != filteredGLObjects.end(); itElement++) {
705 if (unorderedSet.insert(*itElement).second) {
706 *itDuplicated++ = *itElement;
707 }
708 }
709 filteredGLObjects.erase(itDuplicated, filteredGLObjects.end());
710 // open object dialog
711 openObjectDialog(filteredGLObjects);
712 }
713 }
714}
715
716
717void
718GNEViewNet::openDeleteDialogAtCursor(const std::vector<GUIGlObject*>& GLObjects) {
719 if (myPopup) {
720 destroyPopup();
721 }
722 // set clicked popup position
724 // create cursor popup dialog for delete element
726 myCreatedPopup = true;
727 // open popup dialog
729}
730
731
732void
733GNEViewNet::openSelectDialogAtCursor(const std::vector<GUIGlObject*>& GLObjects) {
734 if (myPopup) {
735 destroyPopup();
736 }
737 // set clicked popup position
739 // create cursor popup dialog for select element
741 myCreatedPopup = true;
742 // open popup dialog
744}
745
746
747void
749 // first check if we have to save gui settings in a file (only used for testing purposes)
750 const auto& neteditOptions = OptionsCont::getOptions();
751 if (neteditOptions.getString("gui-testing.setting-output").size() > 0) {
752 try {
753 // open output device
754 OutputDevice& output = OutputDevice::getDevice(neteditOptions.getString("gui-testing.setting-output"));
755 // save view settings
757 myVisualizationSettings->save(output);
758 // save viewport (zoom, X, Y and Z)
760 output.writeAttr(SUMO_ATTR_ZOOM, myChanger->getZoom());
761 output.writeAttr(SUMO_ATTR_X, myChanger->getXPos());
762 output.writeAttr(SUMO_ATTR_Y, myChanger->getYPos());
763 output.writeAttr(SUMO_ATTR_ANGLE, myChanger->getRotation());
764 output.closeTag();
765 output.closeTag();
766 // close output device
767 output.close();
768 } catch (...) {
769 WRITE_ERROR(TL("GUI-Settings cannot be saved in ") + neteditOptions.getString("gui-testing.setting-output"));
770 }
771 }
772}
773
774
777 return myEditModes;
778}
779
780
783 return myTestingMode;
784}
785
786
791
792
797
798
803
804
809
810
815
816
817void
820 assert(!scheme.isFixed());
821 double minValue = std::numeric_limits<double>::infinity();
822 double maxValue = -std::numeric_limits<double>::infinity();
823 // retrieve range
824 bool hasMissingData = false;
825 if (objectType == GLO_LANE) {
826 // XXX (see #3409) multi-colors are not currently handled. this is a quick hack
827 if (active == 9) {
828 active = 8; // segment height, fall back to start height
829 } else if (active == 11) {
830 active = 10; // segment incline, fall back to total incline
831 }
832 for (const auto& lane : myNet->getAttributeCarriers()->getLanes()) {
833 const double val = lane.second->getColorValue(s, active);
834 if (val == s.MISSING_DATA) {
835 hasMissingData = true;
836 continue;
837 }
838 minValue = MIN2(minValue, val);
839 maxValue = MAX2(maxValue, val);
840 }
841 } else if (objectType == GLO_VEHICLE) {
842 for (const auto& tagMap : myNet->getAttributeCarriers()->getDemandElements()) {
843 for (const auto& objItem : tagMap.second) {
844 const double val = objItem.first->getColorValue(s, active);
845 if (val == s.MISSING_DATA) {
846 hasMissingData = true;
847 continue;
848 }
849 minValue = MIN2(minValue, val);
850 maxValue = MAX2(maxValue, val);
851 }
852 }
853 } else if (objectType == GLO_JUNCTION) {
854 if (active == 3) {
855 for (const auto& junction : myNet->getAttributeCarriers()->getJunctions()) {
856 minValue = MIN2(minValue, junction.second->getPositionInView().z());
857 maxValue = MAX2(maxValue, junction.second->getPositionInView().z());
858 }
859 }
860 } else if (objectType == GLO_TAZRELDATA) {
861 if (active == 4) {
862 for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_TAZREL)) {
863 const double value = genericData.second->getColorValue(s, active);
864 if (value == s.MISSING_DATA) {
865 continue;
866 }
867 minValue = MIN2(minValue, value);
868 maxValue = MAX2(maxValue, value);
869 }
870 }
871 }
873 scheme.clear();
874 // add threshold for every distinct value
875 std::set<SVCPermissions> codes;
876 for (const auto& lane : myNet->getAttributeCarriers()->getLanes()) {
877 codes.insert(lane.second->getParentEdge()->getNBEdge()->getPermissions(lane.second->getIndex()));
878 }
879 int step = MAX2(1, 360 / (int)codes.size());
880 int hue = 0;
881 for (SVCPermissions p : codes) {
882 scheme.addColor(RGBColor::fromHSV(hue, 1, 1), (double)p);
883 hue = (hue + step) % 360;
884 }
885 return;
886 }
887 buildMinMaxRainbow(s, scheme, rs, minValue, maxValue, hasMissingData);
888}
889
890
891void
892GNEViewNet::setStatusBarText(const std::string& text) {
893 myApp->setStatusBarText(text);
894}
895
896
897bool
899 if (myLockManager.isObjectLocked(GLO_JUNCTION, false)) {
900 return false;
901 } else {
902 return myNetworkViewOptions.menuCheckExtendSelection->amChecked();
903 }
904}
905
906
907void
908GNEViewNet::setSelectorFrameScale(double selectionScale) {
909 myVisualizationSettings->selectorFrameScale = selectionScale;
910}
911
912
913bool
915 return (myNetworkViewOptions.menuCheckChangeAllPhases->amChecked() != 0);
916}
917
918
919bool
921 return (myNetworkViewOptions.menuCheckShowJunctionBubble->shown() &&
922 myNetworkViewOptions.menuCheckShowJunctionBubble->amChecked());
923}
924
925
926bool
927GNEViewNet::askMergeJunctions(const GNEJunction* movedJunction, const GNEJunction* targetJunction, bool& alreadyAsked) {
928 if (alreadyAsked) {
929 return false;
930 } else if (myNetworkViewOptions.menuCheckMergeAutomatically->amChecked()) {
931 return true;
932 } else {
933 alreadyAsked = true;
934 // open question box
935 const std::string header = TL("Confirm Junction Merger");
936 const std::string body = TLF("Do you wish to merge junctions '%' and '%'?\n('%' will be eliminated and its roads added to '%')",
937 movedJunction->getMicrosimID(),
938 targetJunction->getMicrosimID(),
939 movedJunction->getMicrosimID(),
940 targetJunction->getMicrosimID());
941 const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
942 // continue depending of result
943 if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
944 return true;
945 } else {
946 return false;
947 }
948 }
949}
950
951
952bool
953GNEViewNet::aksChangeSupermode(const std::string& operation, Supermode expectedSupermode) {
954 // first check if ignore option is enabled
955 if (OptionsCont::getOptions().getBool("ignore-supermode-question")) {
956 return true;
957 }
958 std::string body;
959 if (expectedSupermode == Supermode::NETWORK) {
960 body = TLF("% requires switch to network mode. Continue?", operation);
961 } else if (expectedSupermode == Supermode::DEMAND) {
962 body = TLF("% requires switch to demand mode. Continue?", operation);
963 } else if (expectedSupermode == Supermode::DATA) {
964 body = TLF("% requires switch to data mode. Continue?", operation);
965 } else {
966 throw ProcessError("invalid expected supermode");
967 }
968 // open question dialog
969 const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO,
970 TL("Confirm switch mode"), body);
971 // continue depending of result
972 if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
973 myEditModes.setSupermode(expectedSupermode, true);
974 return true;
975 } else {
976 return false;
977 }
978}
979
980
981bool
983 // separate conditions for code legibly
984 const bool TLSMode = (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS));
985 const bool selectingDetectors = myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled();
986 return (TLSMode && selectingDetectors);
987}
988
989
990bool
992 // separate conditions for code legibly
993 const bool TLSMode = (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS));
994 const bool selectingJunctions = myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions();
995 return (TLSMode && selectingJunctions);
996}
997
998
1003
1004
1009
1010
1011bool
1013 // Get selected lanes
1014 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
1015 // Declare map of edges and lanes
1016 std::map<GNEEdge*, GNELane*> mapOfEdgesAndLanes;
1017 // Iterate over selected lanes
1018 for (const auto& selectedLane : selectedLanes) {
1019 mapOfEdgesAndLanes[myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID())] = selectedLane;
1020 }
1021 // Throw warning dialog if there hare multiple lanes selected in the same edge
1022 if (mapOfEdgesAndLanes.size() != selectedLanes.size()) {
1023 const std::string header = TL("Multiple lane in the same edge selected");
1024 const std::string bodyA = TL("There are selected lanes that belong to the same edge.");
1025 const std::string bodyB = TLF("Only one lane per edge will be restricted to %.", toString(vclass));
1026 // Show warning dialog
1027 GNEWarningBasicDialog(myViewParent->getGNEAppWindows(), header, bodyA, bodyB);
1028 }
1029 // If we handeln a set of lanes
1030 if (mapOfEdgesAndLanes.size() > 0) {
1031 // declare counter for number of Sidewalks
1032 int counter = 0;
1033 // iterate over selected lanes
1034 for (const auto& edgeLane : mapOfEdgesAndLanes) {
1035 if (edgeLane.first->hasRestrictedLane(vclass)) {
1036 counter++;
1037 }
1038 }
1039 // if all edges parent own a Sidewalk, stop function
1040 if (counter == (int)mapOfEdgesAndLanes.size()) {
1041 const std::string header = TLF("Set vclass to % for selected lanes", toString(vclass));
1042 const std::string body = TLF("All lanes own already another lane in the same edge with a restriction for %", toString(vclass));
1043 // show information dialog
1044 GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
1045 return 0;
1046 } else {
1047 // Ask confirmation to user
1048 const std::string header = TLF("Set vclass to % for selected lanes", toString(vclass));
1049 const std::string body = TLF("% lanes will be restricted to %. Continue?", toString(mapOfEdgesAndLanes.size() - counter), toString(vclass));
1050 // show question dialog
1051 const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
1052 // continue depending of result
1053 if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) { //1:yes, 2:no, 4:esc
1054 return 0;
1055 }
1056 }
1057 // begin undo operation
1058 myUndoList->begin(lane, "restrict lanes to " + toString(vclass));
1059 // iterate over selected lanes
1060 for (const auto& edgeLane : mapOfEdgesAndLanes) {
1061 // Transform lane to Sidewalk
1062 myNet->restrictLane(vclass, edgeLane.second, myUndoList);
1063 }
1064 // end undo operation
1065 myUndoList->end();
1066 } else {
1067 // If only have a single lane, start undo/redo operation
1068 myUndoList->begin(lane, TL("restrict lane to ") + toString(vclass));
1069 // Transform lane to Sidewalk
1070 myNet->restrictLane(vclass, lane, myUndoList);
1071 // end undo operation
1072 myUndoList->end();
1073 }
1074 return 1;
1075}
1076
1077
1078bool
1079GNEViewNet::addRestrictedLane(GNELane* lane, SUMOVehicleClass vclass, const bool insertAtFront) {
1080 // Get selected edges
1081 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
1082 // get selected lanes
1083 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
1084 // Declare set of edges
1085 std::set<GNEEdge*> setOfEdges;
1086 // Fill set of edges with vector of edges
1087 for (const auto& edge : selectedEdges) {
1088 setOfEdges.insert(edge);
1089 }
1090 // iterate over selected lanes
1091 for (const auto& selectedLane : selectedLanes) {
1092 // Insert pointer to edge into set of edges (To avoid duplicates)
1093 setOfEdges.insert(myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID()));
1094 }
1095 // If we handeln a set of edges
1097 // declare counter for number of restrictions
1098 int counter = 0;
1099 // iterate over set of edges
1100 for (const auto& edge : setOfEdges) {
1101 // update counter if edge has already a restricted lane of type "vclass"
1102 if (edge->hasRestrictedLane(vclass)) {
1103 counter++;
1104 }
1105 }
1106 // if all lanes own a Sidewalk, stop function
1107 if (counter == (int)setOfEdges.size()) {
1108 const std::string header = TLF("Add vclass % to selected lanes", toString(vclass));
1109 const std::string body = TLF("All lanes own already another lane in the same edge with a restriction to %.", toString(vclass));
1110 // show information dialog
1111 GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
1112 return 0;
1113 } else {
1114 // Ask confirmation to user
1115 const std::string header = TLF("Add vclass % to selected lanes", toString(vclass));
1116 const std::string body = TLF("% restrictions to % will be added. Continue?", toString(setOfEdges.size() - counter), toString(vclass));
1117 // show question dialog
1118 const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
1119 // continue depending of result
1120 if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) { //1:yes, 2:no, 4:esc
1121 return 0;
1122 }
1123 }
1124 // begin undo operation
1125 myUndoList->begin(lane, TL("add restrictions for ") + toString(vclass));
1126 // iterate over set of edges
1127 for (const auto& edge : setOfEdges) {
1128 // add restricted lane (guess target)
1129 myNet->addRestrictedLane(vclass, edge, -1, myUndoList);
1130 }
1131 // end undo operation
1132 myUndoList->end();
1133 } else {
1134 // If only have a single lane, start undo/redo operation
1135 myUndoList->begin(lane, TL("add vclass for ") + toString(vclass));
1136 // Add restricted lane
1137 if (vclass == SVC_PEDESTRIAN) {
1138 // always add pedestrian lanes on the right
1139 myNet->addRestrictedLane(vclass, lane->getParentEdge(), 0, myUndoList);
1140 } else if (vclass == SVC_IGNORING) {
1141 if (insertAtFront) {
1142 myNet->addGreenVergeLane(lane->getParentEdge(), lane->getIndex() + 1, myUndoList);
1143 } else {
1144 myNet->addGreenVergeLane(lane->getParentEdge(), lane->getIndex(), myUndoList);
1145 }
1146 } else if (lane->getParentEdge()->getChildLanes().size() == 1) {
1147 // guess insertion position if there is only 1 lane
1148 myNet->addRestrictedLane(vclass, lane->getParentEdge(), -1, myUndoList);
1149 } else {
1150 myNet->addRestrictedLane(vclass, lane->getParentEdge(), lane->getIndex(), myUndoList);
1151 }
1152 // end undo/redo operation
1153 myUndoList->end();
1154 }
1155 return 1;
1156}
1157
1158
1159bool
1161 // Get selected edges
1162 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
1163 // get selected lanes
1164 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
1165 // Declare set of edges
1166 std::set<GNEEdge*> setOfEdges;
1167 // Fill set of edges with vector of edges
1168 for (const auto& edge : selectedEdges) {
1169 setOfEdges.insert(edge);
1170 }
1171 // iterate over selected lanes
1172 for (const auto& selectedLane : selectedLanes) {
1173 // Insert pointer to edge into set of edges (To avoid duplicates)
1174 setOfEdges.insert(myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID()));
1175 }
1176 // If we handeln a set of edges
1177 if (setOfEdges.size() > 0) {
1178 // declare counter for number of restrictions
1179 int counter = 0;
1180 // iterate over set of edges
1181 for (const auto& edge : setOfEdges) {
1182 // update counter if edge has already a restricted lane of type "vclass"
1183 if (edge->hasRestrictedLane(vclass)) {
1184 counter++;
1185 }
1186 }
1187 // if all lanes don't own a Sidewalk, stop function
1188 if (counter == 0) {
1189 const std::string header = TLF("Remove vclass % from selected lanes", toString(vclass));
1190 const std::string body = TLF("The selected lanes and edges don't have a restriction to %.", toString(vclass));
1191 // show information dialog
1192 GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
1193 return 0;
1194 } else {
1195 // Ask confirmation to user
1196 const std::string header = TLF("Remove vclass % from selected lanes", toString(vclass));
1197 const std::string body = TLF("% restrictions to % will be removed. Continue?", toString(setOfEdges.size() - counter), toString(vclass));
1198 // show question dialog
1199 const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
1200 // continue depending of result
1201 if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) { //1:yes, 2:no, 4:esc
1202 return 0;
1203 }
1204 }
1205 // begin undo operation
1206 myUndoList->begin(lane, "Remove restrictions for " + toString(vclass));
1207 // iterate over set of edges
1208 for (const auto& edge : setOfEdges) {
1209 // add Sidewalk
1210 myNet->removeRestrictedLane(vclass, edge, myUndoList);
1211 }
1212 // end undo operation
1213 myUndoList->end();
1214 } else {
1215 // If only have a single lane, start undo/redo operation
1216 myUndoList->begin(lane, TL("Remove vclass for ") + toString(vclass));
1217 // Remove Sidewalk
1218 myNet->removeRestrictedLane(vclass, lane->getParentEdge(), myUndoList);
1219 // end undo/redo operation
1220 myUndoList->end();
1221 }
1222 return 1;
1223}
1224
1225
1226#ifdef _MSC_VER
1227#pragma warning(push)
1228#pragma warning(disable: 4355) // mask warning about "this" in initializers
1229#endif
1232 myEditModes(this),
1233 myTestingMode(this),
1239 myDemandViewOptions(this),
1240 myDataViewOptions(this),
1241 myIntervalBar(this),
1242 myMoveSingleElement(this),
1244 myVehicleOptions(this),
1246 mySaveElements(this),
1247 myTimeFormat(this),
1248 mySelectingArea(this),
1250 myLockManager(this) {
1251}
1252#ifdef _MSC_VER
1253#pragma warning(pop)
1254#endif
1255
1256
1257std::vector<std::string>
1259 std::set<std::string> keys;
1260 for (const NBEdge* e : myNet->getEdgeCont().getAllEdges()) {
1261 if (edgeKeys) {
1262 for (const auto& item : e->getParametersMap()) {
1263 keys.insert(item.first);
1264 }
1265 for (const auto& con : e->getConnections()) {
1266 for (const auto& item : con.getParametersMap()) {
1267 keys.insert(item.first);
1268 }
1269 }
1270 } else {
1271 for (const auto& lane : e->getLanes()) {
1272 int i = 0;
1273 for (const auto& item : lane.getParametersMap()) {
1274 keys.insert(item.first);
1275 }
1276 for (const auto& con : e->getConnectionsFromLane(i)) {
1277 for (const auto& item : con.getParametersMap()) {
1278 keys.insert(item.first);
1279 }
1280 }
1281 i++;
1282 }
1283 }
1284 }
1285 return std::vector<std::string>(keys.begin(), keys.end());
1286}
1287
1288
1289std::vector<std::string>
1291 std::set<std::string> keys;
1292 for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(GNE_TAG_EDGEREL_SINGLE)) {
1293 for (const auto& parameter : genericData.second->getParameters()->getParametersMap()) {
1294 keys.insert(parameter.first);
1295 }
1296 }
1297 return std::vector<std::string>(keys.begin(), keys.end());
1298}
1299
1300
1301std::vector<std::string>
1303 std::set<std::string> keys;
1304 for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_TAZREL)) {
1305 for (const auto& parameter : genericData.second->getParameters()->getParametersMap()) {
1306 keys.insert(parameter.first);
1307 }
1308 }
1309 for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_EDGEREL)) {
1310 for (const auto& parameter : genericData.second->getParameters()->getParametersMap()) {
1311 keys.insert(parameter.first);
1312 }
1313 }
1314 return std::vector<std::string>(keys.begin(), keys.end());
1315}
1316
1317
1318std::vector<std::string>
1320 return myNet->getAttributeCarriers()->getPOIParamKeys();
1321}
1322
1323
1324bool
1326 if ((myNetworkViewOptions.selectEdges() && !myMouseButtonKeyPressed.shiftKeyPressed()) ||
1327 (!myNetworkViewOptions.selectEdges() && myMouseButtonKeyPressed.shiftKeyPressed())) {
1328 return true;
1329 } else {
1330 return false;
1331 }
1332}
1333
1334
1335int
1339
1340
1341int
1342GNEViewNet::doPaintGL(int mode, const Boundary& drawingBoundary) {
1343 // set lefthand and laneIcons
1345 myVisualizationSettings->disableLaneIcons = OptionsCont::getOptions().getBool("disable-laneIcons");
1346 // first step: update objects under cursor
1347 updateObjectsInPosition(myNet->getViewNet()->getPositionInformation());
1348 // second step: redraw contour of path elements (needed if we're inspecting a path element like a route or trip)
1350 // set render modes
1351 glRenderMode(mode);
1352 glMatrixMode(GL_MODELVIEW);
1354 glDisable(GL_TEXTURE_2D);
1355 glDisable(GL_ALPHA_TEST);
1356 glEnable(GL_BLEND);
1357 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1358 glEnable(GL_DEPTH_TEST);
1359 // visualize rectangular selection
1360 mySelectingArea.drawRectangleSelection(myVisualizationSettings->colorSettings.selectionColor);
1361 // draw decals
1362 drawDecals();
1363 // draw grid (and update grid button)
1364 drawGrid();
1365 // update show connections
1366 myNetworkViewOptions.menuCheckShowConnections->setChecked(myVisualizationSettings->showLane2Lane);
1367 // draw temporal junction
1369 // draw temporal drawing shape
1371 // draw testing elements
1372 myTestingMode.drawTestingElements(myApp);
1373 // draw temporal E2 multilane detectors
1374 myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->drawTemporalConsecutiveLanePath();
1375 // draw temporal overhead wires
1376 myViewParent->getWireFrame()->getConsecutiveLaneSelector()->drawTemporalConsecutiveLanePath();
1377 // draw temporal trip/flow route
1378 myViewParent->getVehicleFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
1379 // draw temporal person plan route
1380 myViewParent->getPersonFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
1381 myViewParent->getPersonPlanFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
1382 // draw temporal container plan route
1383 myViewParent->getContainerFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
1384 myViewParent->getContainerPlanFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
1385 // draw temporal route
1386 myViewParent->getRouteFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
1387 // draw temporal edgeRelPath
1388 myViewParent->getEdgeRelDataFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
1389 // check menu checks of supermode demand
1390 if (myEditModes.isCurrentSupermodeDemand()) {
1391 // enable or disable menuCheckShowAllPersonPlans depending of there is a locked person
1392 if (myDemandViewOptions.getLockedPerson()) {
1393 myDemandViewOptions.menuCheckShowAllPersonPlans->disable();
1394 } else {
1395 myDemandViewOptions.menuCheckShowAllPersonPlans->enable();
1396 }
1397 }
1398 // clear pathDraw
1399 myNet->getNetworkPathManager()->getPathDraw()->clearPathDraw();
1400 myNet->getDemandPathManager()->getPathDraw()->clearPathDraw();
1401 myNet->getDataPathManager()->getPathDraw()->clearPathDraw();
1402 // update ignore hide by zoom
1403 myVisualizationSettings->updateIgnoreHideByZoom();
1404 // draw network (boundary
1406 // draw all GL elements
1407 int hits = drawGLElements(drawingBoundary);
1408 // draw routeDistributions (temporal)
1409 for (auto& routeDistribution : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE_DISTRIBUTION)) {
1410 routeDistribution.second->drawGL(*myVisualizationSettings);
1411 }
1412 // after drawing all elements, update list of merged junctions
1413 myViewObjectsSelector.updateMergingJunctions();
1414 // draw temporal split junction
1416 // draw temporal roundabout
1418 // draw temporal lines between E1 detectors and junctions in TLS Mode
1420 // draw temporal lines between junctions in TLS Mode
1422 // draw netedit attributes references
1424 // draw test circle
1426 // pop draw matrix
1428 // update interval bar
1429 myIntervalBar.markForUpdate();
1430 // check if recopute boundaries (Deactivated, continue after 1.14 release)
1431 /*
1432 if (gObjectsInPosition.recomputeBoundaries != GLO_NETWORK) {
1433 myNet->getGrid().updateBoundaries(gObjectsInPosition.recomputeBoundaries);
1434 }
1435 */
1436 return hits;
1437}
1438
1439
1440long
1441GNEViewNet::onLeftBtnPress(FXObject* obj, FXSelector, void* eventData) {
1442 // check if we're in test mode
1443 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1444 // set focus in view net
1445 setFocus();
1446 // update MouseButtonKeyPressed
1447 myMouseButtonKeyPressed.update(eventData);
1448 // process left button press function depending of supermode
1449 if (myEditModes.isCurrentSupermodeNetwork()) {
1451 } else if (myEditModes.isCurrentSupermodeDemand()) {
1453 } else if (myEditModes.isCurrentSupermodeData()) {
1454 processLeftButtonPressData(eventData);
1455 }
1456 // update cursor
1457 updateCursor();
1458 // update view
1459 updateViewNet();
1460 return 1;
1461 } else {
1462 return 0;
1463 }
1464}
1465
1466
1467long
1468GNEViewNet::onLeftBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
1469 // check if we're in test mode
1470 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1471 // avoid closing Popup dialog in Linux
1472 if (myCreatedPopup) {
1473 myCreatedPopup = false;
1474 return 1;
1475 }
1476 // process parent function
1477 GUISUMOAbstractView::onLeftBtnRelease(obj, sel, eventData);
1478 // update MouseButtonKeyPressed
1479 myMouseButtonKeyPressed.update(eventData);
1480 // process left button release function depending of supermode
1481 if (myEditModes.isCurrentSupermodeNetwork()) {
1483 } else if (myEditModes.isCurrentSupermodeDemand()) {
1485 } else if (myEditModes.isCurrentSupermodeData()) {
1487 }
1488 // update cursor
1489 updateCursor();
1490 // update view
1491 updateViewNet();
1492 return 1;
1493 } else {
1494 return 0;
1495 }
1496}
1497
1498
1499long
1500GNEViewNet::onMiddleBtnPress(FXObject* obj, FXSelector sel, void* eventData) {
1501 // check if we're in test mode
1502 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1503 // process parent function
1504 GUISUMOAbstractView::onMiddleBtnPress(obj, sel, eventData);
1505 // update cursor
1506 updateCursor();
1507 // update view
1508 updateViewNet();
1509 return 1;
1510 } else {
1511 return 0;
1512 }
1513}
1514
1515
1516long
1517GNEViewNet::onMiddleBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
1518 // check if we're in test mode
1519 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1520 // process parent function
1521 GUISUMOAbstractView::onMiddleBtnRelease(obj, sel, eventData);
1522 // update cursor
1523 updateCursor();
1524 // update view
1525 updateViewNet();
1526 return 1;
1527 } else {
1528 return 0;
1529 }
1530}
1531
1532
1533long
1534GNEViewNet::onRightBtnPress(FXObject* obj, FXSelector sel, void* eventData) {
1535 // check if we're in test mode
1536 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1537 // update MouseButtonKeyPressed
1538 myMouseButtonKeyPressed.update(eventData);
1539 // update cursor
1540 updateCursor();
1541 if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
1542 // disable right button press during drawing polygon
1543 return 1;
1544 } else {
1545 return GUISUMOAbstractView::onRightBtnPress(obj, sel, eventData);
1546 }
1547 } else {
1548 return 0;
1549 }
1550}
1551
1552
1553long
1554GNEViewNet::onRightBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
1555 // check if we're in test mode
1556 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1557 // update MouseButtonKeyPressed
1558 myMouseButtonKeyPressed.update(eventData);
1559 // update cursor
1560 updateCursor();
1561 // disable right button release during drawing polygon
1562 if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
1563 return 1;
1564 } else {
1565 return GUISUMOAbstractView::onRightBtnRelease(obj, sel, eventData);
1566 }
1567 } else {
1568 return 0;
1569 }
1570}
1571
1572
1573long
1574GNEViewNet::onMouseMove(FXObject* obj, FXSelector sel, void* eventData) {
1575 // check if we're in test mode
1576 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1577 // process mouse move in GUISUMOAbstractView
1578 GUISUMOAbstractView::onMouseMove(obj, sel, eventData);
1579 // update MouseButtonKeyPressed
1580 myMouseButtonKeyPressed.update(eventData);
1581 // update cursor
1582 updateCursor();
1583 // process mouse move function depending of supermode
1584 if (myEditModes.isCurrentSupermodeNetwork()) {
1585 processMoveMouseNetwork(myMouseButtonKeyPressed.mouseLeftButtonPressed());
1586 } else if (myEditModes.isCurrentSupermodeDemand()) {
1587 processMoveMouseDemand(myMouseButtonKeyPressed.mouseLeftButtonPressed());
1588 } else if (myEditModes.isCurrentSupermodeData()) {
1589 processMoveMouseData(myMouseButtonKeyPressed.mouseLeftButtonPressed());
1590 }
1591 // update view
1592 updateViewNet();
1593 return 1;
1594 } else {
1595 return 0;
1596 }
1597}
1598
1599
1600long
1601GNEViewNet::onKeyPress(FXObject* obj, FXSelector sel, void* eventData) {
1602 // check if we're in test mode
1603 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1604 // update MouseButtonKeyPressed
1605 myMouseButtonKeyPressed.update(eventData);
1606 // update cursor
1607 updateCursor();
1608 // continue depending of current edit mode
1609 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
1610 // update viewNet (for temporal junction)
1611 updateViewNet();
1612 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
1613 // change "delete last created point" depending of shift key
1614 myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
1615 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
1616 // change "delete last created point" depending of shift key
1617 myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
1618 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) || (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE)) {
1619 updateViewNet();
1620 }
1621 return GUISUMOAbstractView::onKeyPress(obj, sel, eventData);
1622 } else {
1623 return 0;
1624 }
1625}
1626
1627
1628long
1629GNEViewNet::onKeyRelease(FXObject* obj, FXSelector sel, void* eventData) {
1630 // check if we're in test mode
1631 if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
1632 // update MouseButtonKeyPressed
1633 myMouseButtonKeyPressed.update(eventData);
1634 // update cursor
1635 updateCursor();
1636 // continue depending of current edit mode
1637 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
1638 // update viewNet (for temporal junction)
1639 updateViewNet();
1640 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
1641 // change "delete last created point" depending of shift key
1642 myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
1643 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
1644 // change "delete last created point" depending of shift key
1645 myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
1646 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) || (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE)) {
1647 updateViewNet();
1648 }
1649 // check if selecting using rectangle has to be disabled
1650 if (mySelectingArea.selectingUsingRectangle && !myMouseButtonKeyPressed.shiftKeyPressed()) {
1651 mySelectingArea.selectingUsingRectangle = false;
1652 updateViewNet();
1653 }
1654 return GUISUMOAbstractView::onKeyRelease(obj, sel, eventData);
1655 } else {
1656 return 0;
1657 }
1658}
1659
1660
1661void
1662GNEViewNet::abortOperation(bool clearSelection) {
1663 // steal focus from any text fields and place it over view net
1664 setFocus();
1665 // check what supermode is enabled
1666 if (myEditModes.isCurrentSupermodeNetwork()) {
1667 // abort operation depending of current mode
1668 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
1669 // abort edge creation in create edge frame
1670 myViewParent->getCreateEdgeFrame()->abortEdgeCreation();
1671 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
1672 mySelectingArea.selectingUsingRectangle = false;
1673 // check if current selection has to be cleaned
1674 if (clearSelection) {
1675 myViewParent->getSelectorFrame()->clearCurrentSelection();
1676 }
1677 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
1678 // abort changes in Connector Frame
1679 myViewParent->getConnectorFrame()->getConnectionModifications()->onCmdCancelModifications(0, 0, 0);
1680 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS) {
1681 // continue depending of current TLS frame state
1682 if (myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled()) {
1683 myViewParent->getTLSEditorFrame()->getTLSAttributes()->disableE1DetectorMode();
1684 } else if (myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions()) {
1685 myViewParent->getTLSEditorFrame()->getTLSJunction()->onCmdCancelJoin(nullptr, 0, nullptr);
1686 } else {
1687 myViewParent->getTLSEditorFrame()->getTLSPrograms()->discardChanges(false);
1688 }
1689 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
1690 myEditNetworkElementShapes.stopEditCustomShape();
1691 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CROSSING) {
1692 myViewParent->getCrossingFrame()->clearEdgesHotkey();
1693 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) {
1694 // abort current drawing
1695 myViewParent->getShapeFrame()->getDrawingShapeModule()->abortDrawing();
1696 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
1697 if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
1698 // abort current drawing
1699 myViewParent->getTAZFrame()->getDrawingShapeModule()->abortDrawing();
1700 } else if (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() != nullptr) {
1701 // finish current editing TAZ
1702 myViewParent->getTAZFrame()->getCurrentTAZModule()->setTAZ(nullptr);
1703 }
1704 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_PROHIBITION) {
1705 myViewParent->getProhibitionFrame()->getSelectionModul()->onCmdCancel(nullptr, 0, nullptr);
1706 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
1707 // clear view selection
1708 myViewParent->getAdditionalFrame()->getViewObjetsSelector()->clearSelection();
1709 // abort path
1710 myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->abortPathCreation();
1711 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_WIRE) {
1712 // abort path
1713 myViewParent->getWireFrame()->getConsecutiveLaneSelector()->abortPathCreation();
1714 }
1715 } else if (myEditModes.isCurrentSupermodeDemand()) {
1716 // abort operation depending of current mode
1717 if (myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) {
1718 mySelectingArea.selectingUsingRectangle = false;
1719 // check if current selection has to be cleaned
1720 if (clearSelection) {
1721 myViewParent->getSelectorFrame()->clearCurrentSelection();
1722 }
1723 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
1724 myViewParent->getRouteFrame()->getPathCreator()->abortPathCreation();
1725 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
1726 myViewParent->getVehicleFrame()->getPathCreator()->abortPathCreation();
1727 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
1728 myViewParent->getPersonFrame()->getPlanCreator()->abortPathCreation();
1729 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
1730 myViewParent->getPersonPlanFrame()->getPlanCreator()->abortPathCreation();
1731 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
1732 myViewParent->getContainerFrame()->getPlanCreator()->abortPathCreation();
1733 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
1734 myViewParent->getContainerPlanFrame()->getPlanCreator()->abortPathCreation();
1735 }
1736 } else if (myEditModes.isCurrentSupermodeData()) {
1737 // abort operation depending of current mode
1738 if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
1739 mySelectingArea.selectingUsingRectangle = false;
1740 // check if current selection has to be cleaned
1741 if (clearSelection) {
1742 myViewParent->getSelectorFrame()->clearCurrentSelection();
1743 }
1744 } else if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
1745 myViewParent->getEdgeRelDataFrame()->getPathCreator()->abortPathCreation();
1746 } else if (myEditModes.dataEditMode == DataEditMode::DATA_TAZRELDATA) {
1747 myViewParent->getTAZRelDataFrame()->clearTAZSelection();
1748 }
1749 }
1750 // abort undo list
1751 myUndoList->abortAllChangeGroups();
1752 // update view
1753 updateViewNet();
1754}
1755
1756
1757void
1759 // delete elements depending of current supermode
1760 if (myEditModes.isCurrentSupermodeNetwork()) {
1761 if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) || (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS)) {
1762 setStatusBarText(TL("Cannot delete in this mode"));
1763 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT) && myInspectedElements.getFirstAC()) {
1764 // delete inspected elements
1765 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete network inspected elements"));
1766 while (myInspectedElements.isInspectingElements()) {
1768 }
1769 myUndoList->end();
1770 } else {
1771 // get selected ACs
1772 const auto selectedNetworkACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
1773 // delete selected elements
1774 if (selectedNetworkACs.size() > 0) {
1775 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete network selection"));
1776 for (const auto selectedAC : selectedNetworkACs) {
1778 }
1779 myUndoList->end();
1780 }
1781 }
1782 } else if (myEditModes.isCurrentSupermodeDemand()) {
1783 if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) && myInspectedElements.getFirstAC()) {
1784 // delete inspected elements
1785 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete demand inspected elements"));
1786 while (myInspectedElements.isInspectingElements()) {
1788 }
1789 myUndoList->end();
1790 } else {
1791 // get selected ACs
1792 const auto selectedDemandACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
1793 // delete selected elements
1794 if (selectedDemandACs.size() > 0) {
1795 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete demand selection"));
1796 for (const auto selectedAC : selectedDemandACs) {
1797 deleteDemandAttributeCarrier(selectedAC);
1798 }
1799 myUndoList->end();
1800 }
1801 }
1802 } else if (myEditModes.isCurrentSupermodeData()) {
1803 if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) && myInspectedElements.getFirstAC()) {
1804 // delete inspected elements
1805 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete data inspected elements"));
1806 while (myInspectedElements.isInspectingElements()) {
1808 }
1809 myUndoList->end();
1810 } else {
1811 // get selected ACs
1812 const auto selectedDataACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
1813 // delete selected elements
1814 if (selectedDataACs.size() > 0) {
1815 myUndoList->begin(GUIIcon::MODEDELETE, TL("delete data selection"));
1816 for (const auto selectedAC : selectedDataACs) {
1817 deleteDataAttributeCarrier(selectedAC);
1818 }
1819 myUndoList->end();
1820 }
1821 }
1822 }
1823}
1824
1825
1826void
1828 // check what supermode is enabled
1829 if (myEditModes.isCurrentSupermodeNetwork()) {
1830 // abort operation depending of current mode
1831 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
1832 // Accept changes in Connector Frame
1833 myViewParent->getConnectorFrame()->getConnectionModifications()->onCmdSaveModifications(0, 0, 0);
1834 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS) {
1835 // continue depending of current TLS frame state
1836 if (myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled()) {
1837 myViewParent->getTLSEditorFrame()->getTLSAttributes()->disableE1DetectorMode();
1838 } else if (myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions()) {
1839 myViewParent->getTLSEditorFrame()->getTLSJunction()->onCmdAcceptJoin(nullptr, 0, nullptr);
1840 } else if (myViewParent->getTLSEditorFrame()->getTLSPrograms()->checkHaveModifications()) {
1841 myViewParent->getTLSEditorFrame()->getTLSPrograms()->onCmdSaveChanges(nullptr, 0, nullptr);
1842 }
1843 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) && (myEditNetworkElementShapes.getEditedNetworkElement() != nullptr)) {
1844 myEditNetworkElementShapes.commitShapeEdited();
1845 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) {
1846 if (myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
1847 // stop current drawing
1848 myViewParent->getShapeFrame()->getDrawingShapeModule()->stopDrawing();
1849 } else {
1850 // start drawing
1851 myViewParent->getShapeFrame()->getDrawingShapeModule()->startDrawing();
1852 }
1853 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CROSSING) {
1854 myViewParent->getCrossingFrame()->createCrossingHotkey();
1855 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
1856 if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
1857 // stop current drawing
1858 myViewParent->getTAZFrame()->getDrawingShapeModule()->stopDrawing();
1859 } else if (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() == nullptr) {
1860 // start drawing
1861 myViewParent->getTAZFrame()->getDrawingShapeModule()->startDrawing();
1862 } else if (myViewParent->getTAZFrame()->getTAZSaveChangesModule()->isChangesPending()) {
1863 // save pending changes
1864 myViewParent->getTAZFrame()->getTAZSaveChangesModule()->onCmdSaveChanges(0, 0, 0);
1865 }
1866 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
1867 // create path element
1868 myViewParent->getAdditionalFrame()->createPath(false);
1869 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_WIRE) {
1870 // create path element
1871 myViewParent->getWireFrame()->createPath(false);
1872 }
1873 } else if (myEditModes.isCurrentSupermodeDemand()) {
1874 if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
1875 myViewParent->getRouteFrame()->getPathCreator()->createPath(false);
1876 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
1877 myViewParent->getVehicleFrame()->getPathCreator()->onCmdCreatePath(nullptr, 0, nullptr);
1878 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
1879 myViewParent->getPersonFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
1880 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
1881 myViewParent->getPersonPlanFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
1882 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
1883 myViewParent->getContainerFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
1884 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
1885 myViewParent->getContainerPlanFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
1886 }
1887 } else if (myEditModes.isCurrentSupermodeData()) {
1888 if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
1889 myViewParent->getEdgeRelDataFrame()->getPathCreator()->createPath(false);
1890 } else if (myEditModes.dataEditMode == DataEditMode::DATA_TAZRELDATA) {
1891 myViewParent->getTAZRelDataFrame()->buildTAZRelationData();
1892 }
1893 }
1894}
1895
1896
1897void
1899 // check what supermode is enabled
1900 if (myEditModes.isCurrentSupermodeNetwork()) {
1901 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
1902 myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->removeLastElement();
1903 }
1904 } else if (myEditModes.isCurrentSupermodeDemand()) {
1905 if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
1906 myViewParent->getRouteFrame()->getPathCreator()->removeLastElement();
1907 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
1908 myViewParent->getVehicleFrame()->getPathCreator()->removeLastElement();
1909 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
1910 myViewParent->getPersonFrame()->getPlanCreator()->removeLastElement();
1911 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
1912 myViewParent->getPersonPlanFrame()->getPlanCreator()->removeLastElement();
1913 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
1914 myViewParent->getContainerFrame()->getPlanCreator()->removeLastElement();
1915 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
1916 myViewParent->getContainerPlanFrame()->getPlanCreator()->removeLastElement();
1917 }
1918 } else if (myEditModes.isCurrentSupermodeData()) {
1919 if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
1920 myViewParent->getEdgeRelDataFrame()->getPathCreator()->removeLastElement();
1921 }
1922 }
1923}
1924
1925void
1927 // if there is a visible frame, set focus over it. In other case, set focus over ViewNet
1928 if (myCurrentFrame != nullptr) {
1929 myCurrentFrame->focusUpperElement();
1930 } else {
1931 setFocus();
1932 }
1933}
1934
1935
1938 return myViewParent;
1939}
1940
1941
1942GNENet*
1944 return myNet;
1945}
1946
1947
1950 return myUndoList;
1951}
1952
1953
1958
1959
1964
1965
1970
1971
1976
1977
1978bool
1980 return myMoveSingleElement.isCurrentlyMovingSingleElement() || myMoveMultipleElements.isCurrentlyMovingMultipleElements();
1981}
1982
1983
1984bool
1985GNEViewNet::checkOverLockedElement(const GUIGlObject* GLObject, const bool isSelected) const {
1986 // check if elemet is blocked
1987 if (myLockManager.isObjectLocked(GLObject->getType(), isSelected)) {
1988 return false;
1989 }
1990 // get front GLObject
1991 const auto glObjectFront = myViewObjectsSelector.getGUIGlObjectFront();
1992 // check if element is under cursor
1993 if (glObjectFront) {
1994 if (glObjectFront == GLObject) {
1995 return true;
1996 } else if (glObjectFront->getType() == GLObject->getType()) {
1997 for (const auto& glObjectUnderCursor : myViewObjectsSelector.getGLObjects()) {
1998 if (glObjectUnderCursor == GLObject) {
1999 return true;
2000 }
2001 }
2002 }
2003 }
2004 return false;
2005}
2006
2007
2012
2013
2014void
2016 myLastCreatedRoute = lastCreatedRoute;
2017}
2018
2019
2022 // get first object that can be found in their container
2023 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2024 for (const auto& glObject : glObjectLayer.second) {
2025 auto junction = myNet->getAttributeCarriers()->retrieveJunction(glObject.object->getMicrosimID(), false);
2026 if (junction) {
2027 return junction;
2028 }
2029 }
2030 }
2031 return nullptr;
2032}
2033
2034
2037 // get first object that can be found in their container
2038 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2039 for (const auto& glObject : glObjectLayer.second) {
2040 auto connection = myNet->getAttributeCarriers()->retrieveConnection(glObject.object, false);
2041 if (connection) {
2042 return connection;
2043 }
2044 }
2045 }
2046 return nullptr;
2047}
2048
2049
2052 // get first object that can be found in their container
2053 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2054 for (const auto& glObject : glObjectLayer.second) {
2055 auto crossing = myNet->getAttributeCarriers()->retrieveCrossing(glObject.object, false);
2056 if (crossing) {
2057 return crossing;
2058 }
2059 }
2060 }
2061 return nullptr;
2062}
2063
2064
2067 // get first object that can be found in their container
2068 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2069 for (const auto& glObject : glObjectLayer.second) {
2070 auto walkingArea = myNet->getAttributeCarriers()->retrieveWalkingArea(glObject.object, false);
2071 if (walkingArea) {
2072 return walkingArea;
2073 }
2074 }
2075 }
2076 return nullptr;
2077}
2078
2079
2080GNEEdge*
2082 // get first object that can be found in their container
2083 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2084 for (const auto& glObject : glObjectLayer.second) {
2085 auto edge = myNet->getAttributeCarriers()->retrieveEdge(glObject.object->getMicrosimID(), false);
2086 if (edge) {
2087 return edge;
2088 }
2089 }
2090 }
2091 return nullptr;
2092}
2093
2094
2095GNELane*
2097 // get first object that can be found in their container
2098 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2099 for (const auto& glObject : glObjectLayer.second) {
2100 auto lane = myNet->getAttributeCarriers()->retrieveLane(glObject.object, false);
2101 if (lane) {
2102 return lane;
2103 }
2104 }
2105 }
2106 return nullptr;
2107}
2108
2109
2112 // get first object that can be found in their container
2113 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2114 for (const auto& glObject : glObjectLayer.second) {
2115 auto additionalElement = myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false);
2116 if (additionalElement) {
2117 return additionalElement;
2118 }
2119 }
2120 }
2121 return nullptr;
2122}
2123
2124
2127 // get first object that can be found in their container
2128 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2129 for (const auto& glObject : glObjectLayer.second) {
2130 auto demandElement = myNet->getAttributeCarriers()->retrieveDemandElement(glObject.object, false);
2131 if (demandElement) {
2132 return demandElement;
2133 }
2134 }
2135 }
2136 return nullptr;
2137}
2138
2139
2140GNEPoly*
2142 // get first object that can be parsed to poly element
2143 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2144 for (const auto& glObject : glObjectLayer.second) {
2145 auto polygon = dynamic_cast<GNEPoly*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
2146 if (polygon) {
2147 return polygon;
2148 }
2149 }
2150 }
2151 return nullptr;
2152}
2153
2154
2155GNEPOI*
2157 // get first object that can be parsed to POI element
2158 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2159 for (const auto& glObject : glObjectLayer.second) {
2160 auto POI = dynamic_cast<GNEPOI*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
2161 if (POI) {
2162 return POI;
2163 }
2164 }
2165 }
2166 return nullptr;
2167}
2168
2169
2170GNETAZ*
2172 // get first object that can be parsed to TAZ element
2173 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2174 for (const auto& glObject : glObjectLayer.second) {
2175 auto TAZ = dynamic_cast<GNETAZ*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
2176 if (TAZ) {
2177 return TAZ;
2178 }
2179 }
2180 }
2181 return nullptr;
2182}
2183
2184
2187 // get first object that can be parsed to TAZ element
2188 for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
2189 for (const auto& glObject : glObjectLayer.second) {
2190 if (glObject.object->getType() == GLO_JUNCTION) {
2191 auto junction = myNet->getAttributeCarriers()->retrieveJunction(glObject.object->getMicrosimID());
2192 if (junction->isShapeEdited()) {
2193 return junction;
2194 }
2195 } else if (glObject.object->getType() == GLO_CROSSING) {
2196 auto crossing = myNet->getAttributeCarriers()->retrieveCrossing(glObject.object);
2197 if (crossing->isShapeEdited()) {
2198 return crossing;
2199 }
2200 } else if (glObject.object->getType() == GLO_CONNECTION) {
2201 auto connection = myNet->getAttributeCarriers()->retrieveConnection(glObject.object);
2202 if (connection->isShapeEdited()) {
2203 return connection;
2204 }
2205 }
2206 }
2207 }
2208 return nullptr;
2209}
2210
2211
2212long
2213GNEViewNet::onCmdSetSupermode(FXObject*, FXSelector sel, void*) {
2214 // check what network mode will be set
2215 switch (FXSELID(sel)) {
2217 if (myEditModes.networkButton->shown()) {
2218 myEditModes.setSupermode(Supermode::NETWORK, false);
2219 }
2220 break;
2222 if (myEditModes.demandButton->shown()) {
2223 myEditModes.setSupermode(Supermode::DEMAND, false);
2224 }
2225 break;
2227 if (myEditModes.dataButton->shown()) {
2228 myEditModes.setSupermode(Supermode::DATA, false);
2229 }
2230 break;
2231 default:
2232 break;
2233 }
2234 return 1;
2235}
2236
2237
2238long
2239GNEViewNet::onCmdSetMode(FXObject*, FXSelector sel, void*) {
2240 // first filter modes depending of view
2241 if (myEditModes.isJuPedSimView()) {
2242 // network
2243 if (myEditModes.isCurrentSupermodeNetwork()) {
2244 switch (FXSELID(sel)) {
2245 // common
2249 // infrastructure
2254 // shapes
2257 break;
2258 default:
2259 return 0;
2260 }
2261 }
2262 // demand
2263 if (myEditModes.isCurrentSupermodeDemand()) {
2264 switch (FXSELID(sel)) {
2265 // common
2269 // persons
2272 // routes
2275 // types
2278 break;
2279 default:
2280 return 0;
2281 }
2282 }
2283 // data
2284 if (myEditModes.isCurrentSupermodeData()) {
2285 // all modes disabled
2286 return 0;
2287 }
2288 }
2289 // continue depending of supermode
2290 if (myEditModes.isCurrentSupermodeNetwork()) {
2291 // check what network mode will be set
2292 switch (FXSELID(sel)) {
2295 break;
2297 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_DELETE);
2298 break;
2300 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_SELECT);
2301 break;
2303 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_MOVE);
2304 break;
2307 break;
2310 break;
2312 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS);
2313 break;
2316 break;
2319 break;
2321 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TAZ);
2322 break;
2324 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_SHAPE);
2325 break;
2328 break;
2330 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_WIRE);
2331 break;
2333 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_DECAL);
2334 break;
2335 default:
2336 break;
2337 }
2338 } else if (myEditModes.isCurrentSupermodeDemand()) {
2339 // check what demand mode will be set
2340 switch (FXSELID(sel)) {
2343 break;
2346 break;
2349 break;
2351 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_DELETE);
2352 break;
2354 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_SELECT);
2355 break;
2357 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_MOVE);
2358 break;
2360 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_ROUTE);
2361 break;
2364 break;
2367 break;
2369 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_TYPE);
2370 break;
2373 break;
2375 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_STOP);
2376 break;
2378 myEditModes.setDemandEditMode(DemandEditMode::DEMAND_PERSON);
2379 break;
2382 break;
2383 default:
2384 break;
2385 }
2386 } else if (myEditModes.isCurrentSupermodeData()) {
2387 // check what demand mode will be set
2388 switch (FXSELID(sel)) {
2390 myEditModes.setDataEditMode(DataEditMode::DATA_INSPECT);
2391 break;
2393 myEditModes.setDataEditMode(DataEditMode::DATA_DELETE);
2394 break;
2396 myEditModes.setDataEditMode(DataEditMode::DATA_SELECT);
2397 break;
2400 break;
2403 break;
2406 break;
2409 break;
2410 default:
2411 break;
2412 }
2413 }
2414 return 1;
2415}
2416
2417
2418long
2419GNEViewNet::onCmdSplitEdge(FXObject*, FXSelector, void*) {
2421 if (edge != nullptr) {
2422 myNet->splitEdge(edge, edge->getSplitPos(getPopupPosition()), myUndoList);
2423 }
2424 return 1;
2425}
2426
2427
2428long
2429GNEViewNet::onCmdSplitEdgeBidi(FXObject*, FXSelector, void*) {
2431 if (edge != nullptr) {
2432 // obtain reverse edge
2433 const auto oppositeEdges = edge->getOppositeEdges();
2434 // check that reverse edge works
2435 if (oppositeEdges.size() > 0) {
2436 for (const auto& oppositeEdge : oppositeEdges) {
2437 // get reverse inner geometry
2438 const auto reverseGeometry = oppositeEdge->getNBEdge()->getInnerGeometry().reverse();
2439 if (reverseGeometry == edge->getNBEdge()->getInnerGeometry()) {
2440 myNet->splitEdgesBidi(edge, oppositeEdge, edge->getSplitPos(getPopupPosition()), myUndoList);
2441 return 1;
2442 }
2443 }
2444 }
2445 }
2446 return 1;
2447}
2448
2449
2450long
2451GNEViewNet::onCmdReverseEdge(FXObject*, FXSelector, void*) {
2453 if (edge != nullptr) {
2454 if (edge->isAttributeCarrierSelected()) {
2455 myUndoList->begin(edge, TL("Reverse selected edges"));
2456 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2457 for (const auto& selectedEdge : selectedEdges) {
2458 myNet->reverseEdge(selectedEdge, myUndoList);
2459 }
2460 myUndoList->end();
2461 } else {
2462 myUndoList->begin(edge, TL("Reverse edge"));
2463 myNet->reverseEdge(edge, myUndoList);
2464 myUndoList->end();
2465 }
2466 }
2467 return 1;
2468}
2469
2470
2471long
2472GNEViewNet::onCmdAddReversedEdge(FXObject*, FXSelector, void*) {
2474 if (edge != nullptr) {
2475 if (edge->isAttributeCarrierSelected()) {
2476 myUndoList->begin(edge, TL("Add Reverse edge for selected edges"));
2477 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2478 for (const auto& selectedEdge : selectedEdges) {
2479 myNet->addReversedEdge(selectedEdge, false, myUndoList);
2480 }
2481 myUndoList->end();
2482 } else {
2483 myUndoList->begin(edge, TL("Add reverse edge"));
2484 myNet->addReversedEdge(edge, false, myUndoList);
2485 myUndoList->end();
2486 }
2487 }
2488 return 1;
2489}
2490
2491
2492long
2495 if (edge != nullptr) {
2496 if (edge->isAttributeCarrierSelected()) {
2497 myUndoList->begin(edge, TL("Add Reverse disconnected edge for selected edges"));
2498 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2499 for (const auto& selectedEdge : selectedEdges) {
2500 myNet->addReversedEdge(selectedEdge, true, myUndoList);
2501 }
2502 myUndoList->end();
2503 } else {
2504 myUndoList->begin(edge, TL("Add reverse disconnected edge"));
2505 myNet->addReversedEdge(edge, true, myUndoList);
2506 myUndoList->end();
2507 }
2508 }
2509 return 1;
2510}
2511
2512
2513long
2514GNEViewNet::onCmdEditEdgeEndpoint(FXObject*, FXSelector, void*) {
2516 if (edge != nullptr) {
2517 // snap to active grid the Popup position
2519 }
2520 return 1;
2521}
2522
2523
2524long
2525GNEViewNet::onCmdResetEdgeEndpoint(FXObject*, FXSelector, void*) {
2527 if (edge != nullptr) {
2528 // check if edge is selected
2529 if (edge->isAttributeCarrierSelected()) {
2530 // get all selected edges
2531 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2532 // begin operation
2533 myUndoList->begin(edge, TL("reset geometry points"));
2534 // iterate over selected edges
2535 for (const auto& selectedEdge : selectedEdges) {
2536 // reset both end points
2537 selectedEdge->resetBothEndpoint(myUndoList);
2538 }
2539 // end operation
2540 myUndoList->end();
2541 } else {
2543 }
2544 }
2545 return 1;
2546}
2547
2548
2549long
2550GNEViewNet::onCmdStraightenEdges(FXObject*, FXSelector, void*) {
2552 if (edge != nullptr) {
2553 if (edge->isAttributeCarrierSelected()) {
2554 myUndoList->begin(edge, TL("straighten selected edges"));
2555 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2556 for (const auto& selectedEdge : selectedEdges) {
2557 selectedEdge->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
2558 }
2559 myUndoList->end();
2560 } else {
2561
2562 myUndoList->begin(edge, TL("straighten edge"));
2564 myUndoList->end();
2565 }
2566 }
2567 return 1;
2568}
2569
2570
2571long
2572GNEViewNet::onCmdSmoothEdges(FXObject*, FXSelector, void*) {
2574 if (edge != nullptr) {
2575 if (edge->isAttributeCarrierSelected()) {
2576 myUndoList->begin(edge, TL("smooth selected edges"));
2577 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2578 for (const auto& selectedEdge : selectedEdges) {
2579 selectedEdge->smooth(myUndoList);
2580 }
2581 myUndoList->end();
2582 } else {
2583 myUndoList->begin(edge, TL("smooth edge"));
2584 edge->smooth(myUndoList);
2585 myUndoList->end();
2586 }
2587 }
2588 return 1;
2589}
2590
2591
2592long
2593GNEViewNet::onCmdStraightenEdgesElevation(FXObject*, FXSelector, void*) {
2595 if (edge != nullptr) {
2596 if (edge->isAttributeCarrierSelected()) {
2597 myUndoList->begin(edge, TL("straighten elevation of selected edges"));
2598 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2599 for (const auto& selectedEdge : selectedEdges) {
2600 selectedEdge->straightenElevation(myUndoList);
2601 }
2602 myUndoList->end();
2603 } else {
2604 myUndoList->begin(edge, TL("straighten edge elevation"));
2606 myUndoList->end();
2607 }
2608 }
2609 return 1;
2610}
2611
2612
2613long
2614GNEViewNet::onCmdSmoothEdgesElevation(FXObject*, FXSelector, void*) {
2616 if (edge != nullptr) {
2617 if (edge->isAttributeCarrierSelected()) {
2618 myUndoList->begin(edge, TL("smooth elevation of selected edges"));
2619 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2620 for (const auto& selectedEdge : selectedEdges) {
2621 selectedEdge->smoothElevation(myUndoList);
2622 }
2623 myUndoList->end();
2624 } else {
2625 myUndoList->begin(edge, TL("smooth edge elevation"));
2627 myUndoList->end();
2628 }
2629 }
2630 return 1;
2631}
2632
2633
2634long
2635GNEViewNet::onCmdResetLength(FXObject*, FXSelector, void*) {
2637 if (edge != nullptr) {
2638 if (edge->isAttributeCarrierSelected()) {
2639 myUndoList->begin(edge, TL("reset edge lengths"));
2640 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
2641 for (const auto& selectedEdge : selectedEdges) {
2642 selectedEdge->setAttribute(SUMO_ATTR_LENGTH, "-1", myUndoList);
2643 }
2644 myUndoList->end();
2645 } else {
2647 }
2648 }
2649 return 1;
2650}
2651
2652
2653long
2654GNEViewNet::onCmdEdgeUseAsTemplate(FXObject*, FXSelector, void*) {
2656 if (edge != nullptr) {
2657 myViewParent->getInspectorFrame()->getTemplateEditor()->setEdgeTemplate(edge);
2658 }
2659 return 1;
2660}
2661
2662
2663long
2664GNEViewNet::onCmdEgeApplyTemplate(FXObject*, FXSelector, void*) {
2665 GNEEdge* edgeAtPosition = getEdgeAtPopupPosition();
2666 if ((edgeAtPosition != nullptr) && myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
2667 // begin copy template
2668 myUndoList->begin(edgeAtPosition, TL("copy edge template"));
2669 if (edgeAtPosition->isAttributeCarrierSelected()) {
2670 // copy template in all selected edges
2671 for (const auto& edge : myNet->getAttributeCarriers()->getEdges()) {
2672 if (edge.second->isAttributeCarrierSelected()) {
2673 edge.second->copyTemplate(myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myUndoList);
2674 }
2675 }
2676 } else {
2677 // copy template
2678 edgeAtPosition->copyTemplate(myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myUndoList);
2679 }
2680 // end copy template
2681 myUndoList->end();
2682 }
2683 return 1;
2684}
2685
2686
2687long
2688GNEViewNet::onCmdSimplifyShape(FXObject*, FXSelector, void*) {
2689 // get polygon under mouse
2690 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2691 // check polygon
2692 if (polygonUnderMouse) {
2693 // check if shape is selected
2694 if (polygonUnderMouse->isAttributeCarrierSelected()) {
2695 // begin undo-list
2696 myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("simplify shapes"));
2697 // get shapes
2698 const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
2699 // iterate over shapes
2700 for (const auto& selectedShape : selectedShapes) {
2701 // check if shape is a poly
2702 if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
2703 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
2704 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
2705 // simplify shape
2706 dynamic_cast<GNEPoly*>(selectedShape)->simplifyShape();
2707 }
2708 }
2709 // end undo-list
2710 myNet->getViewNet()->getUndoList()->end();
2711 } else {
2712 polygonUnderMouse->simplifyShape();
2713 }
2714 }
2715 return 1;
2716}
2717
2718
2719long
2720GNEViewNet::onCmdDeleteGeometryPoint(FXObject*, FXSelector, void*) {
2721 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2722 if (polygonUnderMouse) {
2723 polygonUnderMouse->deleteGeometryPoint(getPopupPosition());
2724 }
2725 return 1;
2726}
2727
2728
2729long
2730GNEViewNet::onCmdClosePolygon(FXObject*, FXSelector, void*) {
2731 // get polygon under mouse
2732 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2733 // check polygon
2734 if (polygonUnderMouse) {
2735 // check if shape is selected
2736 if (polygonUnderMouse->isAttributeCarrierSelected()) {
2737 // begin undo-list
2738 myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("close polygon shapes"));
2739 // get selectedshapes
2740 const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
2741 // iterate over shapes
2742 for (const auto& selectedShape : selectedShapes) {
2743 // check if shape is a poly
2744 if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
2745 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
2746 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
2747 // close polygon
2748 dynamic_cast<GNEPoly*>(selectedShape)->closePolygon();
2749 }
2750 }
2751 // end undo-list
2752 myNet->getViewNet()->getUndoList()->end();
2753 } else {
2754 polygonUnderMouse->closePolygon();
2755 }
2756 }
2757 return 1;
2758}
2759
2760
2761long
2762GNEViewNet::onCmdOpenPolygon(FXObject*, FXSelector, void*) {
2763 // get polygon under mouse
2764 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2765 // check polygon
2766 if (polygonUnderMouse) {
2767 // check if shape is selected
2768 if (polygonUnderMouse->isAttributeCarrierSelected()) {
2769 // begin undo-list
2770 myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("open polygon shapes"));
2771 // get shapes
2772 const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
2773 // iterate over shapes
2774 for (const auto& selectedShape : selectedShapes) {
2775 // check if shape is a poly
2776 if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
2777 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
2778 (selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
2779 // open polygon
2780 dynamic_cast<GNEPoly*>(selectedShape)->openPolygon();
2781 }
2782 }
2783 // end undo-list
2784 myNet->getViewNet()->getUndoList()->end();
2785 } else {
2786 polygonUnderMouse->openPolygon();
2787 }
2788 }
2789 return 1;
2790}
2791
2792
2793long
2794GNEViewNet::onCmdSelectPolygonElements(FXObject*, FXSelector, void*) {
2795 // get polygon under mouse
2796 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2797 // check polygon
2798 if (polygonUnderMouse) {
2799 // get all elements under polygon shape
2800 updateObjectsInShape(polygonUnderMouse->getShape());
2801 // declare filtered ACs
2802 std::vector<GNEAttributeCarrier*> ACsUnderPolygon;
2803 ACsUnderPolygon.reserve(myViewObjectsSelector.getAttributeCarriers().size());
2804 // iterate over obtained GUIGlIDs
2805 for (const auto& AC : myViewObjectsSelector.getAttributeCarriers()) {
2806 if ((AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) && checkSelectEdges()) {
2807 ACsUnderPolygon.push_back(AC);
2808 } else if ((AC->getTagProperty()->getTag() == SUMO_TAG_LANE) && !checkSelectEdges()) {
2809 ACsUnderPolygon.push_back(AC);
2810 } else if (!AC->getTagProperty()->isSymbol() && (AC != polygonUnderMouse)) {
2811 ACsUnderPolygon.push_back(AC);
2812 }
2813 }
2814 // continue if there are ACs
2815 if (ACsUnderPolygon.size() > 0) {
2816 // begin undo-list
2817 myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODESELECT, TL("select within polygon boundary"));
2818 // iterate over shapes
2819 for (const auto& AC : ACsUnderPolygon) {
2820 AC->setAttribute(GNE_ATTR_SELECTED, "true", myUndoList);
2821 }
2822 // end undo-list
2823 myNet->getViewNet()->getUndoList()->end();
2824 }
2825 }
2826 return 1;
2827}
2828
2829
2830long
2831GNEViewNet::onCmdTriangulatePolygon(FXObject*, FXSelector, void*) {
2832// get polygon under mouse
2833 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2834 // check polygon
2835 if (polygonUnderMouse) {
2836 // declare additional handler
2837 GNEAdditionalHandler additionalHandler(myNet, polygonUnderMouse->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
2838 // triangulate shape
2839 const auto triangulation = Triangle::triangulate(polygonUnderMouse->getShape());
2840 // begin undo-list
2841 myNet->getViewNet()->getUndoList()->begin(GUIIcon::POLY, TL("triangulate polygon"));
2842 // create every individual triangle
2843 for (const auto& triangle : triangulation) {
2844 auto basePolygon = polygonUnderMouse->getSumoBaseObject();
2845 basePolygon->addStringAttribute(SUMO_ATTR_ID, myNet->getAttributeCarriers()->generateAdditionalID(polygonUnderMouse->getTagProperty()->getTag()));
2846 basePolygon->addPositionVectorAttribute(SUMO_ATTR_SHAPE, triangle.getShape());
2847 // build shape
2848 additionalHandler.parseSumoBaseObject(basePolygon);
2849 }
2850 // delete original polygon
2851 myNet->deleteAdditional(polygonUnderMouse, myNet->getViewNet()->getUndoList());
2852 // end undo-list
2853 myNet->getViewNet()->getUndoList()->end();
2854 }
2855 return 1;
2856}
2857
2858
2859long
2860GNEViewNet::onCmdSetFirstGeometryPoint(FXObject*, FXSelector, void*) {
2861 GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
2862 if (polygonUnderMouse) {
2863 polygonUnderMouse->changeFirstGeometryPoint(polygonUnderMouse->getVertexIndex(getPopupPosition(), false));
2864 }
2865
2866 return 1;
2867}
2868
2869
2870long
2871GNEViewNet::onCmdSimplifyShapeEdited(FXObject*, FXSelector, void*) {
2872 auto undoList = myNet->getViewNet()->getUndoList();
2873 // get shape edited under mouse
2875 if (shapeEdited) {
2876 // simplify edited shape using undo-redo
2877 undoList->begin(shapeEdited, TL("simplify edited shape"));
2878 shapeEdited->simplifyShapeEdited(undoList);
2879 undoList->end();
2880 }
2881 return 1;
2882}
2883
2884
2885long
2886GNEViewNet::onCmdStraightenShapeEdited(FXObject*, FXSelector, void*) {
2887 auto undoList = myNet->getViewNet()->getUndoList();
2888 // get shape edited under mouse
2890 if (shapeEdited) {
2891 // simplify edited shape using undo-redo
2892 undoList->begin(shapeEdited, TL("straighten edited shape"));
2893 shapeEdited->straigthenShapeEdited(undoList);
2894 undoList->end();
2895 }
2896 return 1;
2897}
2898
2899
2900long
2901GNEViewNet::onCmdCloseShapeEdited(FXObject*, FXSelector, void*) {
2902 auto undoList = myNet->getViewNet()->getUndoList();
2903 // get shape edited under mouse
2905 if (shapeEdited) {
2906 // close edited shape using undo-redo
2907 undoList->begin(shapeEdited, TL("simplify edited shape"));
2908 shapeEdited->closeShapeEdited(undoList);
2909 undoList->end();
2910 }
2911 return 1;
2912}
2913
2914
2915long
2916GNEViewNet::onCmdOpenShapeEdited(FXObject*, FXSelector, void*) {
2917 auto undoList = myNet->getViewNet()->getUndoList();
2918 // get shape edited under mouse
2920 if (shapeEdited) {
2921 // open edited shape using undo-redo
2922 undoList->begin(shapeEdited, TL("simplify edited shape"));
2923 shapeEdited->openShapeEdited(undoList);
2924 undoList->end();
2925 }
2926 return 1;
2927}
2928
2929
2930long
2932 auto undoList = myNet->getViewNet()->getUndoList();
2933 // get shape edited under mouse
2935 if (shapeEdited) {
2936 // get geometry point index under cursor
2937 const auto geometryPointIndex = shapeEdited->getGeometryPointUnderCursorShapeEdited();
2938 // set first geometry point in edited shape using undo-redo
2939 undoList->begin(shapeEdited, TL("simplify edited shape"));
2940 shapeEdited->setFirstGeometryPointShapeEdited(geometryPointIndex, undoList);
2941 undoList->end();
2942 }
2943 return 1;
2944}
2945
2946
2947long
2949 auto undoList = myNet->getViewNet()->getUndoList();
2950 // get shape edited under mouse
2952 if (shapeEdited) {
2953 // get geometry point index under cursor
2954 const auto geometryPointIndex = shapeEdited->getGeometryPointUnderCursorShapeEdited();
2955 // delete geometry point edited shape using undo-redo
2956 undoList->begin(shapeEdited, TL("simplify edited shape"));
2957 shapeEdited->deleteGeometryPointShapeEdited(geometryPointIndex, undoList);
2958 undoList->end();
2959 }
2960 return 1;
2961}
2962
2963
2964long
2965GNEViewNet::onCmdResetShapeEdited(FXObject*, FXSelector, void*) {
2966 auto undoList = myNet->getViewNet()->getUndoList();
2967 // get shape edited under mouse
2969 if (shapeEdited) {
2970 // simplify edited shape using undo-redo
2971 undoList->begin(shapeEdited, TL("simplify edited shape"));
2972 shapeEdited->resetShapeEdited(undoList);
2973 undoList->end();
2974 }
2975 return 1;
2976}
2977
2978
2979long
2980GNEViewNet::onCmdFinishShapeEdited(FXObject*, FXSelector, void*) {
2981 // the same behavior as when we press enter
2982 hotkeyEnter();
2983 return 1;
2984}
2985
2986
2987long
2988GNEViewNet::onCmdAttachPOI(FXObject*, FXSelector, void*) {
2989 // obtain POI at popup position
2991 if (POI && (POI->getTagProperty()->getTag() != GNE_TAG_POILANE)) {
2992 // declare additional handler
2993 GNEAdditionalHandler additionalHandler(myNet, POI->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
2994 // obtain lanes around POI boundary
2995 getObjectsInBoundary(POI->getCenteringBoundary());
2996 if (myViewObjectsSelector.getLaneFront() == nullptr) {
2997 WRITE_WARNINGF("No lanes around the % '%' to attach it", toString(SUMO_TAG_POI), POI->getID());
2998 } else {
2999 // obtain nearest lane to POI
3000 GNELane* nearestLane = myViewObjectsSelector.getLaneFront();
3001 double minorPosOverLane = nearestLane->getLaneShape().nearest_offset_to_point2D(POI->getPositionInView());
3002 double minorLateralOffset = nearestLane->getLaneShape().positionAtOffset(minorPosOverLane).distanceTo(POI->getPositionInView());
3003 for (const auto& lane : myViewObjectsSelector.getLanes()) {
3004 double posOverLane = lane->getLaneShape().nearest_offset_to_point2D(POI->getPositionInView());
3005 double lateralOffset = lane->getLaneShape().positionAtOffset(posOverLane).distanceTo(POI->getPositionInView());
3006 if (lateralOffset < minorLateralOffset) {
3007 minorPosOverLane = posOverLane;
3008 minorLateralOffset = lateralOffset;
3009 nearestLane = lane;
3010 }
3011 }
3012 // get sumo base object of POI (And all common attributes)
3013 CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
3014 // add specific attributes
3015 POIBaseObject->addStringAttribute(SUMO_ATTR_LANE, nearestLane->getID());
3016 POIBaseObject->addDoubleAttribute(SUMO_ATTR_POSITION, minorPosOverLane);
3017 POIBaseObject->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, false);
3018 POIBaseObject->addDoubleAttribute(SUMO_ATTR_POSITION_LAT, 0);
3019 // remove POI
3020 myUndoList->begin(POI, TL("attach POI into lane"));
3021 myNet->deleteAdditional(POI, myUndoList);
3022 // add new POI use route handler
3023 additionalHandler.parseSumoBaseObject(POIBaseObject);
3024 myUndoList->end();
3025 }
3026 }
3027 return 1;
3028}
3029
3030
3031long
3032GNEViewNet::onCmdReleasePOI(FXObject*, FXSelector, void*) {
3033 // obtain POI at popup position
3035 if (POI && (POI->getTagProperty()->getTag() == GNE_TAG_POILANE)) {
3036 // declare additional handler
3037 GNEAdditionalHandler additionalHandler(myNet, POI->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
3038 // get sumo base object of POI (And all common attributes)
3039 CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
3040 // add specific attributes
3041 POIBaseObject->addDoubleAttribute(SUMO_ATTR_X, POI->getPositionInView().x());
3042 POIBaseObject->addDoubleAttribute(SUMO_ATTR_Y, POI->getPositionInView().y());
3043 // remove POI
3044 myUndoList->begin(POI, TL("release POI from lane"));
3045 myNet->deleteAdditional(POI, myUndoList);
3046 // add new POI use route handler
3047 additionalHandler.parseSumoBaseObject(POIBaseObject);
3048 myUndoList->end();
3049 }
3050 return 1;
3051}
3052
3053
3054long
3055GNEViewNet::onCmdTransformPOI(FXObject*, FXSelector, void*) {
3056 // obtain POI at popup position
3058 if (POI && (POI->getTagProperty()->getTag() != SUMO_TAG_POI)) {
3059 // declare additional handler
3060 GNEAdditionalHandler additionalHandler(myNet, POI->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
3061 // get sumo base object of POI (And all common attributes)
3062 CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
3063 // add specific attributes
3064 POIBaseObject->addDoubleAttribute(SUMO_ATTR_X, POI->getPositionInView().x());
3065 POIBaseObject->addDoubleAttribute(SUMO_ATTR_Y, POI->getPositionInView().y());
3066 // remove POI
3067 myUndoList->begin(POI, TL("transform to POI"));
3068 myNet->deleteAdditional(POI, myUndoList);
3069 // add new POI use route handler
3070 additionalHandler.parseSumoBaseObject(POIBaseObject);
3071 myUndoList->end();
3072 }
3073 return 1;
3074}
3075
3076
3077long
3078GNEViewNet::onCmdTransformPOIGEO(FXObject*, FXSelector, void*) {
3079 // obtain POI at popup position
3081 if (POI && (POI->getTagProperty()->getTag() != GNE_TAG_POIGEO)) {
3082 // declare additional handler
3083 GNEAdditionalHandler additionalHandler(myNet, POI->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
3084 // get sumo base object of POI (And all common attributes)
3085 CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
3086 // calculate cartesian position
3087 Position GEOPosition = POI->getPositionInView();
3089 POIBaseObject->addDoubleAttribute(SUMO_ATTR_LON, GEOPosition.x());
3090 POIBaseObject->addDoubleAttribute(SUMO_ATTR_LAT, GEOPosition.y());
3091 // remove POI
3092 myUndoList->begin(POI, TL("transform to POI GEO"));
3093 myNet->deleteAdditional(POI, myUndoList);
3094 // add new POI use route handler
3095 additionalHandler.parseSumoBaseObject(POIBaseObject);
3096 myUndoList->end();
3097 }
3098 return 1;
3099}
3100
3101
3102long
3103GNEViewNet::onCmdReverse(FXObject*, FXSelector, void*) {
3104 // obtain demand element at popup position
3106 if (demandElement) {
3107 // begin undo list
3108 myUndoList->begin(demandElement, TLF("reverse % '%'", demandElement->getTagStr(), demandElement->getID()));
3109 GNERouteHandler::reverse(demandElement);
3110 myUndoList->end();
3111 }
3112 return 1;
3113}
3114
3115
3116long
3117GNEViewNet::onCmdAddReverse(FXObject*, FXSelector, void*) {
3118 // obtain demand element at popup position
3120 if (demandElement) {
3121 // begin undo list
3122 myUndoList->begin(demandElement, TLF("add reverse '%'", demandElement->getTagStr()));
3123 GNERouteHandler::addReverse(demandElement);
3124 myUndoList->end();
3125 }
3126 return 1;
3127}
3128
3129
3130long
3131GNEViewNet::onCmdSetCustomGeometryPoint(FXObject*, FXSelector, void*) {
3132 // get element at popup position
3136 // check element
3137 if (edge != nullptr) {
3138 // make a copy of edge geometry
3139 auto edgeGeometry = edge->getNBEdge()->getGeometry();
3140 // get index position
3141 const int index = edgeGeometry.indexOfClosest(getPositionInformation(), true);
3142 // edit position using GNEGeometryPointDialog
3143 const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), edgeGeometry[index]);
3144 // now check position
3145 if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != edgeGeometry[index])) {
3146 // update new position
3147 edgeGeometry[index] = geometryPointDialog.getEditedPosition();
3148 // begin undo list
3149 myUndoList->begin(edge, TL("change edge Geometry Point position"));
3150 // continue depending of index
3151 if (index == 0) {
3152 // change shape start
3154 } else if (index == ((int)edgeGeometry.size() - 1)) {
3155 // change shape end
3157 } else {
3158 // remove front and back geometry points
3159 edgeGeometry.pop_front();
3160 edgeGeometry.pop_back();
3161 // change shape
3163 }
3164 // end undo list
3165 myUndoList->end();
3166 }
3167 } else if (poly != nullptr) {
3168 // make a copy of polygon geometry
3169 PositionVector polygonGeometry = poly->getShape();
3170 // get index position
3171 const int index = polygonGeometry.indexOfClosest(getPositionInformation(), true);
3172 // edit position using GNEGeometryPointDialog
3173 const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), polygonGeometry[index]);
3174 // now check position
3175 if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != polygonGeometry[index])) {
3176 // update new position
3177 polygonGeometry[index] = geometryPointDialog.getEditedPosition();
3178 // begin undo list
3179 myUndoList->begin(poly, TL("change polygon Geometry Point position"));
3180 // change shape
3182 // end undo list
3183 myUndoList->end();
3184 }
3185 } else if (TAZ != nullptr) {
3186 // make a copy of TAZ geometry
3187 PositionVector TAZGeometry = TAZ->getAdditionalGeometry().getShape();
3188 // get index position
3189 const int index = TAZGeometry.indexOfClosest(getPositionInformation(), true);
3190 // edit position using GNEGeometryPointDialog
3191 const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), TAZGeometry[index]);
3192 // now check position
3193 if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != TAZGeometry[index])) {
3194 // update new position
3195 TAZGeometry[index] = geometryPointDialog.getEditedPosition();
3196 // begin undo list
3197 myUndoList->begin(TAZ, TL("change TAZ Geometry Point position"));
3198 // change shape
3200 // end undo list
3201 myUndoList->end();
3202 }
3203 }
3204 return 1;
3205}
3206
3207
3208long
3209GNEViewNet::onCmdResetEndPoints(FXObject*, FXSelector, void*) {
3210 // get lane at popup position
3211 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3212 // check element
3213 if (laneAtPopupPosition != nullptr) {
3214 // get parent edge
3215 GNEEdge* edge = laneAtPopupPosition->getParentEdge();
3216 // check if edge is selected
3217 if (edge->isAttributeCarrierSelected()) {
3218 // get selected edges
3219 const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
3220 // begin undo list
3221 myUndoList->begin(edge, TL("reset end points of selected edges"));
3222 // iterate over edges
3223 for (const auto& selectedEdge : selectedEdges) {
3224 // reset both end points
3225 selectedEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
3226 selectedEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
3227 }
3228 // end undo list
3229 myUndoList->end();
3230 } else {
3231 // begin undo list
3232 myUndoList->begin(edge, TL("reset end points of edge '") + edge->getID());
3233 // reset both end points
3236 // end undo list
3237 myUndoList->end();
3238 }
3239 }
3240 return 1;
3241}
3242
3243
3244long
3245GNEViewNet::onCmdDuplicateLane(FXObject*, FXSelector, void*) {
3246 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3247 if (laneAtPopupPosition != nullptr) {
3248 // when duplicating an unselected lane, keep all connections as they
3249 // are, otherwise recompute them
3250 if (laneAtPopupPosition->isAttributeCarrierSelected()) {
3251 myUndoList->begin(laneAtPopupPosition, TL("duplicate selected lanes"));
3252 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
3253 for (const auto& lane : selectedLanes) {
3254 myNet->duplicateLane(lane, myUndoList, true);
3255 }
3256 myUndoList->end();
3257 } else {
3258 myUndoList->begin(laneAtPopupPosition, TL("duplicate lane"));
3259 myNet->duplicateLane(laneAtPopupPosition, myUndoList, false);
3260 myUndoList->end();
3261 }
3262 }
3263 return 1;
3264}
3265
3266
3267long
3268GNEViewNet::onCmdEditLaneShape(FXObject*, FXSelector, void*) {
3269 // Obtain lane under mouse
3271 if (lane) {
3272 myEditNetworkElementShapes.startEditCustomShape(lane);
3273 }
3274 // destroy pop-up and update view Net
3275 destroyPopup();
3276 setFocus();
3277 return 1;
3278}
3279
3280
3281long
3282GNEViewNet::onCmdResetLaneCustomShape(FXObject*, FXSelector, void*) {
3283 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3284 if (laneAtPopupPosition != nullptr) {
3285 // when duplicating an unselected lane, keep all connections as they
3286 // are, otherwise recompute them
3287 if (laneAtPopupPosition->isAttributeCarrierSelected()) {
3288 myUndoList->begin(laneAtPopupPosition, TL("reset custom lane shapes"));
3289 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
3290 for (const auto& lane : selectedLanes) {
3291 lane->setAttribute(SUMO_ATTR_CUSTOMSHAPE, "", myUndoList);
3292 }
3293 myUndoList->end();
3294 } else {
3295 myUndoList->begin(laneAtPopupPosition, TL("reset custom lane shape"));
3296 laneAtPopupPosition->setAttribute(SUMO_ATTR_CUSTOMSHAPE, "", myUndoList);
3297 myUndoList->end();
3298 }
3299 }
3300 return 1;
3301}
3302
3303
3304long
3305GNEViewNet::onCmdResetOppositeLane(FXObject*, FXSelector, void*) {
3306 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3307 if (laneAtPopupPosition != nullptr) {
3308 // when duplicating an unselected lane, keep all connections as they
3309 // are, otherwise recompute them
3310 if (laneAtPopupPosition->isAttributeCarrierSelected()) {
3311 myUndoList->begin(laneAtPopupPosition, TL("reset opposite lanes"));
3312 const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
3313 for (const auto& lane : selectedLanes) {
3314 lane->setAttribute(GNE_ATTR_OPPOSITE, "", myUndoList);
3315 }
3316 myUndoList->end();
3317 } else {
3318 myUndoList->begin(laneAtPopupPosition, TL("reset opposite lane"));
3319 laneAtPopupPosition->setAttribute(GNE_ATTR_OPPOSITE, "", myUndoList);
3320 myUndoList->end();
3321 }
3322 }
3323 return 1;
3324}
3325
3326
3327long
3328GNEViewNet::onCmdLaneOperation(FXObject*, FXSelector sel, void*) {
3329 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3330 if (laneAtPopupPosition) {
3331 // check lane operation
3332 switch (FXSELID(sel)) {
3334 return restrictLane(laneAtPopupPosition, SVC_PEDESTRIAN);
3336 return restrictLane(laneAtPopupPosition, SVC_BICYCLE);
3338 return restrictLane(laneAtPopupPosition, SVC_BUS);
3340 return restrictLane(laneAtPopupPosition, SVC_IGNORING);
3342 return addRestrictedLane(laneAtPopupPosition, SVC_PEDESTRIAN, false);
3344 return addRestrictedLane(laneAtPopupPosition, SVC_BICYCLE, false);
3346 return addRestrictedLane(laneAtPopupPosition, SVC_BUS, false);
3348 return addRestrictedLane(laneAtPopupPosition, SVC_IGNORING, true);
3350 return addRestrictedLane(laneAtPopupPosition, SVC_IGNORING, false);
3352 return removeRestrictedLane(laneAtPopupPosition, SVC_PEDESTRIAN);
3354 return removeRestrictedLane(laneAtPopupPosition, SVC_BICYCLE);
3356 return removeRestrictedLane(laneAtPopupPosition, SVC_BUS);
3358 return removeRestrictedLane(laneAtPopupPosition, SVC_IGNORING);
3359 default:
3360 return 0;
3361 }
3362 } else {
3363 return 0;
3364 }
3365}
3366
3367
3368long
3369GNEViewNet::onCmdLaneReachability(FXObject* menu, FXSelector, void*) {
3370 GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
3371 if (laneAtPopupPosition != nullptr) {
3372 // obtain vClass
3373 const SUMOVehicleClass vClass = SumoVehicleClassStrings.get(dynamic_cast<FXMenuCommand*>(menu)->getText().text());
3374 // calculate reachability
3375 myNet->getDemandPathManager()->getPathCalculator()->calculateReachability(vClass, laneAtPopupPosition->getParentEdge());
3376 // select all lanes with reachability greater than 0
3377 myUndoList->begin(laneAtPopupPosition, TL("select lane reachability"));
3378 for (const auto& edge : myNet->getAttributeCarriers()->getEdges()) {
3379 for (const auto& lane : edge.second->getChildLanes()) {
3380 if (lane->getReachability() >= 0) {
3381 lane->setAttribute(GNE_ATTR_SELECTED, "true", myUndoList);
3382 }
3383 }
3384 }
3385 myUndoList->end();
3386 }
3387 return 1;
3388}
3389
3390
3391long
3392GNEViewNet::onCmdOpenAdditionalDialog(FXObject*, FXSelector, void*) {
3393 // retrieve additional under cursor
3395 // check if additional can open dialog
3396 if (addtional && addtional->getTagProperty()->hasDialog()) {
3397 addtional->openAdditionalDialog();
3398 }
3399 return 1;
3400}
3401
3402
3403void
3405 FXEvent* evt = (FXEvent*)eventData;
3406 // process click
3407 destroyPopup();
3408 setFocus();
3409 myChanger->onLeftBtnPress(eventData);
3410 grab();
3411 // Check there are double click
3412 if (evt->click_count == 2) {
3413 handle(this, FXSEL(SEL_DOUBLECLICKED, 0), eventData);
3414 }
3415}
3416
3417
3418void
3420 // first check if we're panning
3421 if (myPanning) {
3422 // move view
3425 } else {
3426 // declare flags
3427 bool cursorMoveView = false;
3428 bool cursorInspect = false;
3429 bool cursorSelect = false;
3430 bool cursorMoveElement = false;
3431 bool cursorDelete = false;
3432 // continue depending of supermode
3433 if (myEditModes.isCurrentSupermodeNetwork()) {
3434 // move view
3435 if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) ||
3437 (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) ||
3438 (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) ||
3439 (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ)) {
3440 cursorMoveView = true;
3441 }
3442 // specific mode
3443 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT) {
3444 cursorInspect = true;
3445 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
3446 cursorSelect = true;
3447 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
3448 cursorMoveElement = true;
3449 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_DELETE) {
3450 cursorDelete = true;
3451 }
3452 } else if (myEditModes.isCurrentSupermodeDemand()) {
3453 // move view
3454 if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) ||
3455 (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) ||
3456 (myEditModes.demandEditMode == DemandEditMode::DEMAND_STOP)) {
3457 cursorMoveView = true;
3458 }
3459 // specific mode
3460 if (myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) {
3461 cursorInspect = true;
3462 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) {
3463 cursorSelect = true;
3464 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE) {
3465 cursorMoveElement = true;
3466 } else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_DELETE) {
3467 cursorDelete = true;
3468 }
3469 } else if (myEditModes.isCurrentSupermodeData()) {
3470 // move view
3471 if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
3472 cursorMoveView = true;
3473 }
3474 // specific mode
3475 if (myEditModes.dataEditMode == DataEditMode::DATA_INSPECT) {
3476 cursorInspect = true;
3477 } else if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
3478 cursorSelect = true;
3479 } else if (myEditModes.dataEditMode == DataEditMode::DATA_DELETE) {
3480 cursorDelete = true;
3481 }
3482 }
3483 // set cursor
3484 if (myMouseButtonKeyPressed.controlKeyPressed() && cursorMoveView) {
3485 // move view cursor if control key is pressed
3488 } else if (cursorInspect) {
3489 // special case for inspect lanes
3490 if (!checkSelectEdges() && myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT)) {
3491 // inspect lane cursor
3494 } else {
3495 // inspect cursor
3498 }
3499 } else if (cursorSelect) {
3500 // special case for select lanes
3501 if (!checkSelectEdges() && myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT)) {
3502 // select lane cursor
3505 } else {
3506 // select cursor
3509 }
3510 } else if (cursorMoveElement) {
3511 // move cursor
3514 } else if (cursorDelete) {
3515 // delete cursor
3518 } else {
3519 // default cursor
3522 }
3523 }
3524}
3525
3526
3527int
3529 // udpdate drawing toggle
3530 if (myDrawingToggle > 10000) {
3531 myDrawingToggle = 0;
3532 } else {
3534 }
3535 // set default scale
3537 // calculate boundary extremes
3538 const float minB[2] = { (float)bound.xmin(), (float)bound.ymin() };
3539 const float maxB[2] = { (float)bound.xmax(), (float)bound.ymax() };
3540 // reset gl line to 1
3541 glLineWidth(1);
3542 // set drawing modes
3543 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
3544 glEnable(GL_POLYGON_OFFSET_FILL);
3545 glEnable(GL_POLYGON_OFFSET_LINE);
3546 // draw all elements between minB and maxB, obtain objects included in minB and maxB
3547 return myGrid->Search(minB, maxB, *myVisualizationSettings);
3548}
3549
3550
3551void
3553 // depending of the visualizationSettings, enable or disable check box show grid
3554 if (myVisualizationSettings->showGrid) {
3555 // change show grid
3556 if (!myNetworkViewOptions.menuCheckToggleGrid->amChecked() ||
3557 !myDemandViewOptions.menuCheckToggleGrid->amChecked()) {
3558 // change to true
3559 myNetworkViewOptions.menuCheckToggleGrid->setChecked(true);
3560 myDemandViewOptions.menuCheckToggleGrid->setChecked(true);
3561 // update show grid buttons
3562 myNetworkViewOptions.menuCheckToggleGrid->update();
3563 myNetworkViewOptions.menuCheckToggleGrid->update();
3564 }
3565 // draw grid only in network and demand mode
3566 if (myEditModes.isCurrentSupermodeNetwork() || myEditModes.isCurrentSupermodeDemand()) {
3567 paintGLGrid();
3568 }
3569 } else {
3570 // change show grid
3571 if (myNetworkViewOptions.menuCheckToggleGrid->amChecked() ||
3572 myDemandViewOptions.menuCheckToggleGrid->amChecked()) {
3573 // change to false
3574 myNetworkViewOptions.menuCheckToggleGrid->setChecked(false);
3575 myDemandViewOptions.menuCheckToggleGrid->setChecked(false);
3576 // update show grid buttons
3577 myNetworkViewOptions.menuCheckToggleGrid->update();
3578 myNetworkViewOptions.menuCheckToggleGrid->update();
3579 }
3580 }
3581}
3582
3583
3584long
3585GNEViewNet::onCmdResetEdgeEndPoints(FXObject*, FXSelector, void*) {
3586 // Obtain junction under mouse
3588 if (junction) {
3589 myUndoList->begin(GUIIcon::EDGE, TL("reset edge endpoints"));
3590 // are, otherwise recompute them
3591 if (junction->isAttributeCarrierSelected()) {
3592 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3593 for (const auto& selectedJunction : selectedJunctions) {
3594 // reset shape end from incoming edges
3595 for (const auto& incomingEdge : selectedJunction->getGNEIncomingEdges()) {
3596 incomingEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
3597 }
3598 // reset shape start from outgoing edges
3599 for (const auto& outgoingEdge : selectedJunction->getGNEOutgoingEdges()) {
3600 outgoingEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
3601 }
3602 }
3603 } else {
3604 // reset shape end from incoming edges
3605 for (const auto& incomingEdge : junction->getGNEIncomingEdges()) {
3606 incomingEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
3607 }
3608 // reset shape start from outgoing edges
3609 for (const auto& outgoingEdge : junction->getGNEOutgoingEdges()) {
3610 outgoingEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
3611 }
3612 }
3613 myUndoList->end();
3614 }
3615 // destroy pop-up and set focus in view net
3616 destroyPopup();
3617 setFocus();
3618 return 1;
3619}
3620
3621
3622long
3623GNEViewNet::onCmdEditJunctionShape(FXObject*, FXSelector, void*) {
3624 // Obtain junction under mouse
3626 if (junction) {
3627 // check if network has to be updated
3628 if (junction->getNBNode()->getShape().size() == 0) {
3629 // recompute the whole network
3630 myNet->computeAndUpdate(OptionsCont::getOptions(), false);
3631 }
3632 // if grid is enabled, show warning
3633 if (myVisualizationSettings->showGrid) {
3634 WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
3635 }
3636 // start edit custom shape
3637 myEditNetworkElementShapes.startEditCustomShape(junction);
3638 }
3639 // destroy pop-up and set focus in view net
3640 destroyPopup();
3641 setFocus();
3642 return 1;
3643}
3644
3645
3646long
3647GNEViewNet::onCmdResetJunctionShape(FXObject*, FXSelector, void*) {
3648 // Obtain junction under mouse
3650 if (junction) {
3651 // are, otherwise recompute them
3652 if (junction->isAttributeCarrierSelected()) {
3653 myUndoList->begin(junction, TL("reset custom junction shapes"));
3654 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3655 for (const auto& selectedJunction : selectedJunctions) {
3656 selectedJunction->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
3657 }
3658 myUndoList->end();
3659 } else {
3660 myUndoList->begin(junction, TL("reset custom junction shape"));
3661 junction->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
3662 myUndoList->end();
3663 }
3664 }
3665 // destroy pop-up and set focus in view net
3666 destroyPopup();
3667 setFocus();
3668 return 1;
3669}
3670
3671
3672long
3673GNEViewNet::onCmdReplaceJunction(FXObject*, FXSelector, void*) {
3675 if (junction != nullptr) {
3676 myNet->replaceJunctionByGeometry(junction, myUndoList);
3677 }
3678 // destroy pop-up and set focus in view net
3679 destroyPopup();
3680 setFocus();
3681 return 1;
3682}
3683
3684
3685long
3686GNEViewNet::onCmdSplitJunction(FXObject*, FXSelector, void*) {
3688 if (junction != nullptr) {
3689 myNet->splitJunction(junction, false, myUndoList);
3690 }
3691 // destroy pop-up and set focus in view net
3692 destroyPopup();
3693 setFocus();
3694 return 1;
3695}
3696
3697
3698long
3699GNEViewNet::onCmdSplitJunctionReconnect(FXObject*, FXSelector, void*) {
3701 if (junction != nullptr) {
3702 myNet->splitJunction(junction, true, myUndoList);
3703 }
3704 // destroy pop-up and set focus in view net
3705 destroyPopup();
3706 setFocus();
3707 return 1;
3708}
3709
3710long
3711GNEViewNet::onCmdSelectRoundabout(FXObject*, FXSelector, void*) {
3713 if (junction != nullptr) {
3714 myNet->selectRoundabout(junction, myUndoList);
3715 }
3716 // destroy pop-up and set focus in view net
3717 destroyPopup();
3718 setFocus();
3719 return 1;
3720}
3721
3722long
3723GNEViewNet::onCmdConvertRoundabout(FXObject*, FXSelector, void*) {
3725 if (junction != nullptr) {
3726 myNet->createRoundabout(junction, myUndoList);
3727 }
3728 // destroy pop-up and set focus in view net
3729 destroyPopup();
3730 setFocus();
3731 return 1;
3732}
3733
3734
3735long
3736GNEViewNet::onEnterConvertRoundabout(FXObject*, FXSelector, void*) {
3738 update();
3739 return 1;
3740}
3741
3742
3743long
3744GNEViewNet::onLeaveConvertRoundabout(FXObject*, FXSelector, void*) {
3746 update();
3747 return 1;
3748}
3749
3750
3751long
3752GNEViewNet::onCmdClearConnections(FXObject*, FXSelector, void*) {
3754 if (junction != nullptr) {
3755 // make sure we do not inspect the connection will it is being deleted
3756 if (myInspectedElements.getFirstAC() && (myInspectedElements.getFirstAC()->getTagProperty()->getTag() == SUMO_TAG_CONNECTION)) {
3757 myViewParent->getInspectorFrame()->clearInspection();
3758 }
3759 // make sure that connections isn't the front attribute
3760 const auto frontElements = myMarkFrontElements.getACs();
3761 for (const auto& AC : frontElements) {
3762 if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
3763 AC->unmarkForDrawingFront();
3764 }
3765 }
3766 // check if we're handling a selection
3767 if (junction->isAttributeCarrierSelected()) {
3768 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3769 myUndoList->begin(GUIIcon::CONNECTION, TL("clear connections of selected junctions"));
3770 for (const auto& selectedJunction : selectedJunctions) {
3771 myNet->clearJunctionConnections(selectedJunction, myUndoList);
3772 }
3773 myUndoList->end();
3774 } else {
3775 myNet->clearJunctionConnections(junction, myUndoList);
3776 }
3777 }
3778 // destroy pop-up and set focus in view net
3779 destroyPopup();
3780 setFocus();
3781 return 1;
3782}
3783
3784
3785long
3786GNEViewNet::onCmdResetConnections(FXObject*, FXSelector, void*) {
3788 if (junction != nullptr) {
3789 // make sure we do not inspect the connection will it is being deleted
3790 if (myInspectedElements.getFirstAC() && (myInspectedElements.getFirstAC()->getTagProperty()->getTag() == SUMO_TAG_CONNECTION)) {
3791 myViewParent->getInspectorFrame()->clearInspection();
3792 }
3793 // make sure that connections isn't the front attribute
3794 const auto frontElements = myMarkFrontElements.getACs();
3795 for (const auto& AC : frontElements) {
3796 if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
3797 AC->unmarkForDrawingFront();
3798 }
3799 }
3800 // check if we're handling a selection
3801 if (junction->isAttributeCarrierSelected()) {
3802 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3803 myUndoList->begin(GUIIcon::CONNECTION, TL("reset connections of selected junctions"));
3804 for (const auto& selectedJunction : selectedJunctions) {
3805 myNet->resetJunctionConnections(selectedJunction, myUndoList);
3806 }
3807 myUndoList->end();
3808 } else {
3809 myNet->resetJunctionConnections(junction, myUndoList);
3810 }
3811 }
3812 // destroy pop-up and set focus in view net
3813 destroyPopup();
3814 setFocus();
3815 return 1;
3816}
3817
3818
3819long
3820GNEViewNet::onCmdAddTLS(FXObject*, FXSelector, void*) {
3822 if (junction != nullptr) {
3823 // check if we're adding TLS in multiple junctions
3824 if (junction->isAttributeCarrierSelected()) {
3825 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3826 myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODETLS, TL("add TLS in multiple junctions"));
3827 for (const auto& selectedJunction : selectedJunctions) {
3828 selectedJunction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
3829 }
3830 myNet->getViewNet()->getUndoList()->end();
3831 } else {
3832 // change junction type
3833 junction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
3834 // change to TLS Mode
3835 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS, true);
3836 // set junction in TLS mode
3837 myViewParent->getTLSEditorFrame()->editJunction(junction);
3838 }
3839 }
3840 // destroy pop-up and set focus in view net
3841 destroyPopup();
3842 setFocus();
3843 return 1;
3844}
3845
3846
3847long
3848GNEViewNet::onCmdAddJoinTLS(FXObject*, FXSelector, void*) {
3850 if (junction != nullptr) {
3851 // check if we're adding TLS in multiple junctions
3852 if (junction->isAttributeCarrierSelected()) {
3853 myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODETLS, TL("add TLS in multiple junctions"));
3854 }
3855 // change junction type
3856 junction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
3857 // if TLS was sucesfully created, apply the same TLID to other selected junctions
3858 if (junction->getAttribute(SUMO_ATTR_TLID).size() > 0) {
3859 const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
3860 // iterate over all selected junctions
3861 for (const auto& selectedJunction : selectedJunctions) {
3862 // check that doesn't have a TL
3863 if (selectedJunction->getNBNode()->getControllingTLS().empty()) {
3864 selectedJunction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
3865 selectedJunction->setAttribute(SUMO_ATTR_TLID, junction->getAttribute(SUMO_ATTR_TLID), myUndoList);
3866 }
3867 }
3868 }
3869 // rename traffic light
3870 if (junction->getNBNode()->getControllingTLS().size() > 0) {
3871 const auto TLSDef = (*junction->getNBNode()->getControllingTLS().begin());
3872 if (!myNet->getTLLogicCont().exist(TLSDef->getID() + "_joined")) {
3873 myUndoList->add(new GNEChange_TLS(junction, TLSDef, TLSDef->getID() + "_joined"), true);
3874 }
3875 }
3876 // end undoList
3877 if (junction->isAttributeCarrierSelected()) {
3878 myNet->getViewNet()->getUndoList()->end();
3879 }
3880 // change to TLS Mode
3881 myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS, true);
3882 // set junction in TLS mode
3883 myViewParent->getTLSEditorFrame()->editJunction(junction);
3884 }
3885 // destroy pop-up and set focus in view net
3886 destroyPopup();
3887 setFocus();
3888 return 1;
3889}
3890
3891long
3892GNEViewNet::onCmdEditConnectionShape(FXObject*, FXSelector, void*) {
3893 // Obtain connection under mouse
3895 if (connection) {
3896 myEditNetworkElementShapes.startEditCustomShape(connection);
3897 }
3898 // if grid is enabled, show warning
3899 if (myVisualizationSettings->showGrid) {
3900 WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
3901 }
3902 // destroy pop-up and update view Net
3903 destroyPopup();
3904 setFocus();
3905 return 1;
3906}
3907
3908
3909long
3910GNEViewNet::onCmdSmoothConnectionShape(FXObject*, FXSelector, void*) {
3911 // Obtain connection under mouse
3913 if (connection) {
3914 connection->smootShape();
3915 }
3916 // destroy pop-up and update view Net
3917 destroyPopup();
3918 setFocus();
3919 return 1;
3920}
3921
3922
3923long
3924GNEViewNet::onCmdEditCrossingShape(FXObject*, FXSelector, void*) {
3925 // Obtain crossing under mouse
3927 if (crossing) {
3928 // check if network has to be updated
3929 if (crossing->getParentJunctions().front()->getNBNode()->getShape().size() == 0) {
3930 // recompute the whole network
3931 myNet->computeAndUpdate(OptionsCont::getOptions(), false);
3932 }
3933 // if grid is enabled, show warning
3934 if (myVisualizationSettings->showGrid) {
3935 WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
3936 }
3937 // start edit custom shape
3938 myEditNetworkElementShapes.startEditCustomShape(crossing);
3939 }
3940 // destroy pop-up and update view Net
3941 destroyPopup();
3942 setFocus();
3943 return 1;
3944}
3945
3946
3947long
3948GNEViewNet::onCmdEditWalkingAreaShape(FXObject*, FXSelector, void*) {
3949 // Obtain walkingArea under mouse
3951 if (walkingArea) {
3952 // check if network has to be updated
3953 if (walkingArea->getParentJunctions().front()->getNBNode()->getShape().size() == 0) {
3954 // recompute the whole network
3955 myNet->computeAndUpdate(OptionsCont::getOptions(), false);
3956 // if grid is enabled, show warning
3957 if (myVisualizationSettings->showGrid) {
3958 WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
3959 }
3960 }
3961 // start edit custom shape
3962 myEditNetworkElementShapes.startEditCustomShape(walkingArea);
3963 }
3964 // destroy pop-up and update view Net
3965 destroyPopup();
3966 setFocus();
3967 return 1;
3968}
3969
3970
3971long
3972GNEViewNet::onCmdToggleSelectEdges(FXObject*, FXSelector sel, void*) {
3973 // Toggle menuCheckSelectEdges
3974 if (myNetworkViewOptions.menuCheckSelectEdges->amChecked() == TRUE) {
3975 myNetworkViewOptions.menuCheckSelectEdges->setChecked(FALSE);
3976 } else {
3977 myNetworkViewOptions.menuCheckSelectEdges->setChecked(TRUE);
3978 }
3979 myNetworkViewOptions.menuCheckSelectEdges->update();
3980 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
3981 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES)) {
3982 myNetworkViewOptions.menuCheckSelectEdges->setFocus();
3983 }
3984 return 1;
3985}
3986
3987
3988long
3989GNEViewNet::onCmdToggleShowConnections(FXObject*, FXSelector sel, void*) {
3990 // Toggle menuCheckShowConnections
3991 if (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE) {
3992 myNetworkViewOptions.menuCheckShowConnections->setChecked(FALSE);
3993 } else {
3994 myNetworkViewOptions.menuCheckShowConnections->setChecked(TRUE);
3995 }
3996 myNetworkViewOptions.menuCheckShowConnections->update();
3997 // if show was enabled, init GNEConnections
3998 if (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE) {
4000 }
4001 // change flag "showLane2Lane" in myVisualizationSettings
4002 myVisualizationSettings->showLane2Lane = (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE);
4003 // Hide/show connections require recompute
4005 // Update viewNet to show/hide connections
4006 updateViewNet();
4007 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4008 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS)) {
4009 myNetworkViewOptions.menuCheckShowConnections->setFocus();
4010 }
4011 return 1;
4012}
4013
4014
4015long
4016GNEViewNet::onCmdToggleHideConnections(FXObject*, FXSelector sel, void*) {
4017 // Toggle menuCheckHideConnections
4018 if (myNetworkViewOptions.menuCheckHideConnections->amChecked() == TRUE) {
4019 myNetworkViewOptions.menuCheckHideConnections->setChecked(FALSE);
4020 } else {
4021 myNetworkViewOptions.menuCheckHideConnections->setChecked(TRUE);
4022 }
4023 myNetworkViewOptions.menuCheckHideConnections->update();
4024 // Update viewNet to show/hide connections
4025 updateViewNet();
4026 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4027 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS)) {
4028 myNetworkViewOptions.menuCheckHideConnections->setFocus();
4029 }
4030 return 1;
4031}
4032
4033
4034long
4035GNEViewNet::onCmdToggleShowAdditionalSubElements(FXObject*, FXSelector sel, void*) {
4036 // Toggle menuCheckShowAdditionalSubElements
4037 if (myNetworkViewOptions.menuCheckShowAdditionalSubElements->amChecked() == TRUE) {
4038 myNetworkViewOptions.menuCheckShowAdditionalSubElements->setChecked(FALSE);
4039 } else {
4040 myNetworkViewOptions.menuCheckShowAdditionalSubElements->setChecked(TRUE);
4041 }
4042 myNetworkViewOptions.menuCheckShowAdditionalSubElements->update();
4043 // Update viewNet to show/hide sub elements
4044 updateViewNet();
4045 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4046 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS)) {
4047 myNetworkViewOptions.menuCheckShowAdditionalSubElements->setFocus();
4048 }
4049 return 1;
4050}
4051
4052
4053long
4054GNEViewNet::onCmdToggleShowTAZElements(FXObject*, FXSelector sel, void*) {
4055 // Toggle menuCheckShowAdditionalSubElements
4056 if (myNetworkViewOptions.menuCheckShowTAZElements->amChecked() == TRUE) {
4057 myNetworkViewOptions.menuCheckShowTAZElements->setChecked(FALSE);
4058 } else {
4059 myNetworkViewOptions.menuCheckShowTAZElements->setChecked(TRUE);
4060 }
4061 myNetworkViewOptions.menuCheckShowTAZElements->update();
4062 // Update viewNet to show/hide TAZ elements
4063 updateViewNet();
4064 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4065 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS)) {
4066 myNetworkViewOptions.menuCheckShowTAZElements->setFocus();
4067 }
4068 return 1;
4069}
4070
4071
4072long
4073GNEViewNet::onCmdToggleExtendSelection(FXObject*, FXSelector sel, void*) {
4074 // Toggle menuCheckExtendSelection
4075 if (myNetworkViewOptions.menuCheckExtendSelection->amChecked() == TRUE) {
4076 myNetworkViewOptions.menuCheckExtendSelection->setChecked(FALSE);
4077 } else {
4078 myNetworkViewOptions.menuCheckExtendSelection->setChecked(TRUE);
4079 }
4080 myNetworkViewOptions.menuCheckExtendSelection->update();
4081 // Only update view
4082 updateViewNet();
4083 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4084 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION)) {
4085 myNetworkViewOptions.menuCheckExtendSelection->setFocus();
4086 }
4087 return 1;
4088}
4089
4090
4091long
4092GNEViewNet::onCmdToggleChangeAllPhases(FXObject*, FXSelector sel, void*) {
4093 // Toggle menuCheckChangeAllPhases
4094 if (myNetworkViewOptions.menuCheckChangeAllPhases->amChecked() == TRUE) {
4095 myNetworkViewOptions.menuCheckChangeAllPhases->setChecked(FALSE);
4096 } else {
4097 myNetworkViewOptions.menuCheckChangeAllPhases->setChecked(TRUE);
4098 }
4099 myNetworkViewOptions.menuCheckChangeAllPhases->update();
4100 // Only update view
4101 updateViewNet();
4102 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4103 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES)) {
4104 myNetworkViewOptions.menuCheckChangeAllPhases->setFocus();
4105 }
4106 return 1;
4107}
4108
4109
4110long
4111GNEViewNet::onCmdToggleShowGrid(FXObject*, FXSelector sel, void*) {
4112 // show or hide grid depending of myNetworkViewOptions.menuCheckToggleGrid
4113 if (myVisualizationSettings->showGrid) {
4114 myVisualizationSettings->showGrid = false;
4115 myNetworkViewOptions.menuCheckToggleGrid->setChecked(false);
4116 myDemandViewOptions.menuCheckToggleGrid->setChecked(false);
4117 } else {
4118 myVisualizationSettings->showGrid = true;
4119 myNetworkViewOptions.menuCheckToggleGrid->setChecked(true);
4120 myDemandViewOptions.menuCheckToggleGrid->setChecked(true);
4121 }
4122 myNetworkViewOptions.menuCheckToggleGrid->update();
4123 myDemandViewOptions.menuCheckToggleGrid->update();
4124 // update view to show grid
4125 updateViewNet();
4126 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4127 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID)) {
4128 myNetworkViewOptions.menuCheckToggleGrid->setFocus();
4129 } else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID)) {
4130 myDemandViewOptions.menuCheckToggleGrid->setFocus();
4131 }
4132 return 1;
4133}
4134
4135
4136long
4137GNEViewNet::onCmdToggleDrawJunctionShape(FXObject*, FXSelector sel, void*) {
4138 // toggle state
4139 myVisualizationSettings->drawJunctionShape = !myVisualizationSettings->drawJunctionShape;
4140 // gui button has 'hide' semantics
4141 const bool hide = !myVisualizationSettings->drawJunctionShape;
4142 myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
4143 myDemandViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
4144 myDataViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
4145
4146 myNetworkViewOptions.menuCheckToggleDrawJunctionShape->update();
4147 myDemandViewOptions.menuCheckToggleDrawJunctionShape->update();
4148 myDataViewOptions.menuCheckToggleDrawJunctionShape->update();
4149 // update view to show DrawJunctionShape
4150 updateViewNet();
4151 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4152 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
4153 myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
4154 } else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
4155 myDemandViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
4156 } else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
4157 myDataViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
4158 }
4159 return 1;
4160}
4161
4162long
4163GNEViewNet::onCmdToggleDrawSpreadVehicles(FXObject*, FXSelector sel, void*) {
4164 // Toggle menuCheckShowDemandElements
4165 if ((myNetworkViewOptions.menuCheckDrawSpreadVehicles->amChecked() == TRUE) ||
4166 (myDemandViewOptions.menuCheckDrawSpreadVehicles->amChecked() == TRUE)) {
4167 myNetworkViewOptions.menuCheckDrawSpreadVehicles->setChecked(FALSE);
4168 myDemandViewOptions.menuCheckDrawSpreadVehicles->setChecked(FALSE);
4169 } else {
4170 myNetworkViewOptions.menuCheckDrawSpreadVehicles->setChecked(TRUE);
4171 myDemandViewOptions.menuCheckDrawSpreadVehicles->setChecked(TRUE);
4172 }
4173 myNetworkViewOptions.menuCheckDrawSpreadVehicles->update();
4174 myDemandViewOptions.menuCheckDrawSpreadVehicles->update();
4175 // declare edge set
4176 std::set<GNEEdge*> edgesToUpdate;
4177 // compute vehicle geometry
4178 for (const auto& vehicle : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VEHICLE)) {
4179 if (vehicle.second->getParentEdges().size() > 0) {
4180 edgesToUpdate.insert(vehicle.second->getParentEdges().front());
4181 } else if (vehicle.second->getChildDemandElements().size() > 0 && (vehicle.second->getChildDemandElements().front()->getTagProperty()->getTag() == GNE_TAG_ROUTE_EMBEDDED)) {
4182 edgesToUpdate.insert(vehicle.second->getChildDemandElements().front()->getParentEdges().front());
4183 }
4184 }
4185 for (const auto& routeFlow : myNet->getAttributeCarriers()->getDemandElements().at(GNE_TAG_FLOW_ROUTE)) {
4186 if (routeFlow.second->getParentEdges().size() > 0) {
4187 edgesToUpdate.insert(routeFlow.second->getParentEdges().front());
4188 } else if (routeFlow.second->getChildDemandElements().size() > 0 && (routeFlow.second->getChildDemandElements().front()->getTagProperty()->getTag() == GNE_TAG_ROUTE_EMBEDDED)) {
4189 edgesToUpdate.insert(routeFlow.second->getChildDemandElements().front()->getParentEdges().front());
4190 }
4191 }
4192 for (const auto& trip : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_TRIP)) {
4193 if (trip.second->getParentEdges().size() > 0) {
4194 edgesToUpdate.insert(trip.second->getParentEdges().front());
4195 }
4196 }
4197 for (const auto& flow : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_FLOW)) {
4198 if (flow.second->getParentEdges().size() > 0) {
4199 edgesToUpdate.insert(flow.second->getParentEdges().front());
4200 }
4201 }
4202 // update spread geometries of all edges
4203 for (const auto& edge : edgesToUpdate) {
4204 edge->updateVehicleSpreadGeometries();
4205 }
4206 // update view to show new vehicles positions
4207 updateViewNet();
4208 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4209 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES)) {
4210 myNetworkViewOptions.menuCheckDrawSpreadVehicles->setFocus();
4211 } else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES)) {
4212 myDemandViewOptions.menuCheckDrawSpreadVehicles->setFocus();
4213 }
4214 return 1;
4215}
4216
4217
4218long
4219GNEViewNet::onCmdToggleMergeAutomatically(FXObject*, FXSelector sel, void*) {
4220 // Toggle menuCheckWarnAboutMerge
4221 if (myNetworkViewOptions.menuCheckMergeAutomatically->amChecked() == TRUE) {
4222 myNetworkViewOptions.menuCheckMergeAutomatically->setChecked(FALSE);
4223 } else {
4224 myNetworkViewOptions.menuCheckMergeAutomatically->setChecked(TRUE);
4225 }
4226 myNetworkViewOptions.menuCheckMergeAutomatically->update();
4227 // Only update view
4228 updateViewNet();
4229 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4230 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY)) {
4231 myNetworkViewOptions.menuCheckMergeAutomatically->setFocus();
4232 }
4233 return 1;
4234}
4235
4236
4237long
4238GNEViewNet::onCmdToggleShowJunctionBubbles(FXObject*, FXSelector sel, void*) {
4239 // Toggle menuCheckShowJunctionBubble
4240 if (myNetworkViewOptions.menuCheckShowJunctionBubble->amChecked() == TRUE) {
4241 myNetworkViewOptions.menuCheckShowJunctionBubble->setChecked(FALSE);
4242 } else {
4243 myNetworkViewOptions.menuCheckShowJunctionBubble->setChecked(TRUE);
4244 }
4245 myNetworkViewOptions.menuCheckShowJunctionBubble->update();
4246 // Only update view
4247 updateViewNet();
4248 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4249 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES)) {
4250 myNetworkViewOptions.menuCheckShowJunctionBubble->setFocus();
4251 }
4252 return 1;
4253}
4254
4255
4256long
4257GNEViewNet::onCmdToggleMoveElevation(FXObject*, FXSelector sel, void*) {
4258 // Toggle menuCheckMoveElevation
4259 if (myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
4260 myNetworkViewOptions.menuCheckMoveElevation->setChecked(FALSE);
4261 } else {
4262 myNetworkViewOptions.menuCheckMoveElevation->setChecked(TRUE);
4263 }
4264 myNetworkViewOptions.menuCheckMoveElevation->update();
4265 // Only update view
4266 updateViewNet();
4267 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4268 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION)) {
4269 myNetworkViewOptions.menuCheckMoveElevation->setFocus();
4270 }
4271 return 1;
4272}
4273
4274
4275long
4276GNEViewNet::onCmdToggleChainEdges(FXObject*, FXSelector sel, void*) {
4277 // Toggle menuCheckMoveElevation
4278 if (myNetworkViewOptions.menuCheckChainEdges->amChecked() == TRUE) {
4279 myNetworkViewOptions.menuCheckChainEdges->setChecked(FALSE);
4280 } else {
4281 myNetworkViewOptions.menuCheckChainEdges->setChecked(TRUE);
4282 }
4283 myNetworkViewOptions.menuCheckChainEdges->update();
4284 // Only update view
4285 updateViewNet();
4286 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4287 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES)) {
4288 myNetworkViewOptions.menuCheckChainEdges->setFocus();
4289 }
4290 return 1;
4291}
4292
4293
4294long
4295GNEViewNet::onCmdToggleAutoOppositeEdge(FXObject*, FXSelector sel, void*) {
4296 // Toggle menuCheckAutoOppositeEdge
4297 if (myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE) {
4298 myNetworkViewOptions.menuCheckAutoOppositeEdge->setChecked(FALSE);
4299 } else {
4300 myNetworkViewOptions.menuCheckAutoOppositeEdge->setChecked(TRUE);
4301 }
4302 myNetworkViewOptions.menuCheckAutoOppositeEdge->update();
4303 // Only update view
4304 updateViewNet();
4305 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4306 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES)) {
4307 myNetworkViewOptions.menuCheckAutoOppositeEdge->setFocus();
4308 }
4309 return 1;
4310}
4311
4312
4313long
4315 // Toggle menuCheckHideNonInspectedDemandElements
4316 if (myDemandViewOptions.menuCheckHideNonInspectedDemandElements->amChecked() == TRUE) {
4317 myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setChecked(FALSE);
4318 } else {
4319 myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setChecked(TRUE);
4320 }
4321 myDemandViewOptions.menuCheckHideNonInspectedDemandElements->update();
4322 // Only update view
4323 updateViewNet();
4324 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4325 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED)) {
4326 myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setFocus();
4327 }
4328 return 1;
4329}
4330
4331
4332long
4333GNEViewNet::onCmdToggleShowOverlappedRoutes(FXObject*, FXSelector sel, void*) {
4334 // Toggle menuCheckShowOverlappedRoutes
4335 if (myDemandViewOptions.menuCheckShowOverlappedRoutes->amChecked() == TRUE) {
4336 myDemandViewOptions.menuCheckShowOverlappedRoutes->setChecked(FALSE);
4337 } else {
4338 myDemandViewOptions.menuCheckShowOverlappedRoutes->setChecked(TRUE);
4339 }
4340 myDemandViewOptions.menuCheckShowOverlappedRoutes->update();
4341 // Only update view
4342 updateViewNet();
4343 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4344 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES)) {
4345 myDemandViewOptions.menuCheckShowOverlappedRoutes->setFocus();
4346 }
4347 return 1;
4348}
4349
4350
4351long
4352GNEViewNet::onCmdToggleHideShapes(FXObject*, FXSelector sel, void*) {
4353 // Toggle menuCheckHideShapes
4354 if (myDemandViewOptions.menuCheckHideShapes->amChecked() == TRUE) {
4355 myDemandViewOptions.menuCheckHideShapes->setChecked(FALSE);
4356 } else {
4357 myDemandViewOptions.menuCheckHideShapes->setChecked(TRUE);
4358 }
4359 myDemandViewOptions.menuCheckHideShapes->update();
4360 // Only update view
4361 updateViewNet();
4362 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4363 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES)) {
4364 myDemandViewOptions.menuCheckHideShapes->setFocus();
4365 }
4366 return 1;
4367}
4368
4369
4370long
4371GNEViewNet::onCmdToggleShowTrips(FXObject*, FXSelector sel, void*) {
4372 // Toggle menuCheckHideShapes
4373 if (myDemandViewOptions.menuCheckShowAllTrips->amChecked() == TRUE) {
4374 myDemandViewOptions.menuCheckShowAllTrips->setChecked(FALSE);
4375 } else {
4376 myDemandViewOptions.menuCheckShowAllTrips->setChecked(TRUE);
4377 }
4378 myDemandViewOptions.menuCheckShowAllTrips->update();
4379 // Only update view
4380 updateViewNet();
4381 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4382 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS)) {
4383 myDemandViewOptions.menuCheckShowAllTrips->setFocus();
4384 }
4385 return 1;
4386}
4387
4388
4389long
4390GNEViewNet::onCmdToggleShowAllPersonPlans(FXObject*, FXSelector sel, void*) {
4391 // Toggle menuCheckShowAllPersonPlans
4392 if (myDemandViewOptions.menuCheckShowAllPersonPlans->amChecked() == TRUE) {
4393 myDemandViewOptions.menuCheckShowAllPersonPlans->setChecked(FALSE);
4394 } else {
4395 myDemandViewOptions.menuCheckShowAllPersonPlans->setChecked(TRUE);
4396 }
4397 myDemandViewOptions.menuCheckShowAllPersonPlans->update();
4398 // Only update view
4399 updateViewNet();
4400 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4401 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS)) {
4402 myDemandViewOptions.menuCheckShowAllPersonPlans->setFocus();
4403 }
4404 return 1;
4405}
4406
4407
4408long
4409GNEViewNet::onCmdToggleLockPerson(FXObject*, FXSelector sel, void*) {
4410 // Toggle menuCheckLockPerson
4411 if (myDemandViewOptions.menuCheckLockPerson->amChecked() == TRUE) {
4412 myDemandViewOptions.menuCheckLockPerson->setChecked(FALSE);
4413 } else if (myInspectedElements.getFirstAC() && myInspectedElements.getFirstAC()->getTagProperty()->isPerson()) {
4414 myDemandViewOptions.menuCheckLockPerson->setChecked(TRUE);
4415 }
4416 myDemandViewOptions.menuCheckLockPerson->update();
4417 // lock or unlock current inspected person depending of menuCheckLockPerson value
4418 if (myDemandViewOptions.menuCheckLockPerson->amChecked()) {
4419 // obtain locked person or person plan
4420 const GNEDemandElement* personOrPersonPlan = dynamic_cast<const GNEDemandElement*>(myInspectedElements.getFirstAC());
4421 if (personOrPersonPlan) {
4422 // lock person depending if casted demand element is either a person or a person plan
4423 if (personOrPersonPlan->getTagProperty()->isPerson()) {
4424 myDemandViewOptions.lockPerson(personOrPersonPlan);
4425 } else {
4426 myDemandViewOptions.lockPerson(personOrPersonPlan->getParentDemandElements().front());
4427 }
4428 }
4429 } else {
4430 // unlock current person
4431 myDemandViewOptions.unlockPerson();
4432 }
4433 // update view
4434 updateViewNet();
4435 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4436 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON)) {
4437 myDemandViewOptions.menuCheckLockPerson->setFocus();
4438 }
4439 return 1;
4440}
4441
4442
4443long
4444GNEViewNet::onCmdToggleShowAllContainerPlans(FXObject*, FXSelector sel, void*) {
4445 // Toggle menuCheckShowAllContainerPlans
4446 if (myDemandViewOptions.menuCheckShowAllContainerPlans->amChecked() == TRUE) {
4447 myDemandViewOptions.menuCheckShowAllContainerPlans->setChecked(FALSE);
4448 } else {
4449 myDemandViewOptions.menuCheckShowAllContainerPlans->setChecked(TRUE);
4450 }
4451 myDemandViewOptions.menuCheckShowAllContainerPlans->update();
4452 // Only update view
4453 updateViewNet();
4454 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4455 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS)) {
4456 myDemandViewOptions.menuCheckShowAllContainerPlans->setFocus();
4457 }
4458 return 1;
4459}
4460
4461
4462long
4463GNEViewNet::onCmdToggleLockContainer(FXObject*, FXSelector sel, void*) {
4464 // Toggle menuCheckLockContainer
4465 if (myDemandViewOptions.menuCheckLockContainer->amChecked() == TRUE) {
4466 myDemandViewOptions.menuCheckLockContainer->setChecked(FALSE);
4467 } else if (myInspectedElements.getFirstAC() && myInspectedElements.getFirstAC()->getTagProperty()->isContainer()) {
4468 myDemandViewOptions.menuCheckLockContainer->setChecked(TRUE);
4469 }
4470 myDemandViewOptions.menuCheckLockContainer->update();
4471 // lock or unlock current inspected container depending of menuCheckLockContainer value
4472 if (myDemandViewOptions.menuCheckLockContainer->amChecked()) {
4473 // obtain locked container or container plan
4474 const GNEDemandElement* containerOrContainerPlan = dynamic_cast<const GNEDemandElement*>(myInspectedElements.getFirstAC());
4475 if (containerOrContainerPlan) {
4476 // lock container depending if casted demand element is either a container or a container plan
4477 if (containerOrContainerPlan->getTagProperty()->isContainer()) {
4478 myDemandViewOptions.lockContainer(containerOrContainerPlan);
4479 } else {
4480 myDemandViewOptions.lockContainer(containerOrContainerPlan->getParentDemandElements().front());
4481 }
4482 }
4483 } else {
4484 // unlock current container
4485 myDemandViewOptions.unlockContainer();
4486 }
4487 // update view
4488 updateViewNet();
4489 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4490 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER)) {
4491 myDemandViewOptions.menuCheckLockContainer->setFocus();
4492 }
4493 return 1;
4494}
4495
4496
4497long
4498GNEViewNet::onCmdToggleShowAdditionals(FXObject*, FXSelector sel, void*) {
4499 // Toggle menuCheckShowAdditionals
4500 if (myDataViewOptions.menuCheckShowAdditionals->amChecked() == TRUE) {
4501 myDataViewOptions.menuCheckShowAdditionals->setChecked(FALSE);
4502 } else {
4503 myDataViewOptions.menuCheckShowAdditionals->setChecked(TRUE);
4504 }
4505 myDataViewOptions.menuCheckShowAdditionals->update();
4506 // Only update view
4507 updateViewNet();
4508 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4509 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS)) {
4510 myDataViewOptions.menuCheckShowAdditionals->setFocus();
4511 }
4512 return 1;
4513}
4514
4515
4516long
4517GNEViewNet::onCmdToggleShowShapes(FXObject*, FXSelector sel, void*) {
4518 // Toggle menuCheckShowShapes
4519 if (myDataViewOptions.menuCheckShowShapes->amChecked() == TRUE) {
4520 myDataViewOptions.menuCheckShowShapes->setChecked(FALSE);
4521 } else {
4522 myDataViewOptions.menuCheckShowShapes->setChecked(TRUE);
4523 }
4524 myDataViewOptions.menuCheckShowShapes->update();
4525 // Only update view
4526 updateViewNet();
4527 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4528 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES)) {
4529 myDataViewOptions.menuCheckShowShapes->setFocus();
4530 }
4531 return 1;
4532}
4533
4534
4535long
4536GNEViewNet::onCmdToggleShowDemandElementsNetwork(FXObject*, FXSelector sel, void*) {
4537 // Toggle menuCheckShowDemandElements
4538 if (myNetworkViewOptions.menuCheckShowDemandElements->amChecked() == TRUE) {
4539 myNetworkViewOptions.menuCheckShowDemandElements->setChecked(FALSE);
4540 } else {
4541 myNetworkViewOptions.menuCheckShowDemandElements->setChecked(TRUE);
4542 }
4543 myNetworkViewOptions.menuCheckShowDemandElements->update();
4544 // compute demand elements
4545 myNet->computeDemandElements(myViewParent->getGNEAppWindows());
4546 // update view to show demand elements
4547 updateViewNet();
4548 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4549 if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS)) {
4550 myNetworkViewOptions.menuCheckShowDemandElements->setFocus();
4551 }
4552 return 1;
4553}
4554
4555
4556long
4557GNEViewNet::onCmdToggleShowDemandElementsData(FXObject*, FXSelector sel, void*) {
4558 // Toggle menuCheckShowDemandElements
4559 if (myDataViewOptions.menuCheckShowDemandElements->amChecked() == TRUE) {
4560 myDataViewOptions.menuCheckShowDemandElements->setChecked(FALSE);
4561 } else {
4562 myDataViewOptions.menuCheckShowDemandElements->setChecked(TRUE);
4563 }
4564 myDataViewOptions.menuCheckShowDemandElements->update();
4565 // compute demand elements
4566 myNet->computeDemandElements(myViewParent->getGNEAppWindows());
4567 // update view to show demand elements
4568 updateViewNet();
4569 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4570 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS)) {
4571 myDataViewOptions.menuCheckShowDemandElements->setFocus();
4572 }
4573 return 1;
4574}
4575
4576
4577long
4578GNEViewNet::onCmdToggleTAZRelDrawing(FXObject*, FXSelector sel, void*) {
4579 // Toggle menuCheckShowDemandElements
4580 if (myDataViewOptions.menuCheckToggleTAZRelDrawing->amChecked() == TRUE) {
4581 myDataViewOptions.menuCheckToggleTAZRelDrawing->setChecked(FALSE);
4582 } else {
4583 myDataViewOptions.menuCheckToggleTAZRelDrawing->setChecked(TRUE);
4584 }
4585 myDataViewOptions.menuCheckToggleTAZRelDrawing->update();
4586 // update view to show demand elements
4587 updateViewNet();
4588 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4589 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING)) {
4590 myDataViewOptions.menuCheckToggleTAZRelDrawing->setFocus();
4591 }
4592 return 1;
4593}
4594
4595
4596long
4597GNEViewNet::onCmdToggleTAZDrawFill(FXObject*, FXSelector sel, void*) {
4598 // Toggle menuCheckShowDemandElements
4599 if (myDataViewOptions.menuCheckToggleTAZDrawFill->amChecked() == TRUE) {
4600 myDataViewOptions.menuCheckToggleTAZDrawFill->setChecked(FALSE);
4601 } else {
4602 myDataViewOptions.menuCheckToggleTAZDrawFill->setChecked(TRUE);
4603 }
4604 myDataViewOptions.menuCheckToggleTAZDrawFill->update();
4605 // update view to show demand elements
4606 updateViewNet();
4607 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4608 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL)) {
4609 myDataViewOptions.menuCheckToggleTAZDrawFill->setFocus();
4610 }
4611 return 1;
4612}
4613
4614
4615long
4616GNEViewNet::onCmdToggleTAZRelOnlyFrom(FXObject*, FXSelector sel, void*) {
4617 // Toggle menuCheckShowDemandElements
4618 if (myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->amChecked() == TRUE) {
4619 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setChecked(FALSE);
4620 } else {
4621 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setChecked(TRUE);
4622 }
4623 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->update();
4624 // update view to show demand elements
4625 updateViewNet();
4626 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4627 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM)) {
4628 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setFocus();
4629 }
4630 return 1;
4631}
4632
4633
4634long
4635GNEViewNet::onCmdToggleTAZRelOnlyTo(FXObject*, FXSelector sel, void*) {
4636 // Toggle menuCheckShowDemandElements
4637 if (myDataViewOptions.menuCheckToggleTAZRelOnlyTo->amChecked() == TRUE) {
4638 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setChecked(FALSE);
4639 } else {
4640 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setChecked(TRUE);
4641 }
4642 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->update();
4643 // update view to show demand elements
4644 updateViewNet();
4645 // set focus in menu check again, if this function was called clicking over menu check instead using alt+<key number>
4646 if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO)) {
4647 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setFocus();
4648 }
4649 return 1;
4650}
4651
4652
4653long
4654GNEViewNet::onCmdIntervalBarGenericDataType(FXObject*, FXSelector, void*) {
4655 myIntervalBar.setGenericDataType();
4656 return 1;
4657}
4658
4659
4660long
4661GNEViewNet::onCmdIntervalBarDataSet(FXObject*, FXSelector, void*) {
4662 myIntervalBar.setDataSet();
4663 return 1;
4664}
4665
4666
4667long
4668GNEViewNet::onCmdIntervalBarLimit(FXObject*, FXSelector, void*) {
4669 myIntervalBar.setInterval();
4670 return 1;
4671}
4672
4673
4674long
4675GNEViewNet::onCmdIntervalBarSetBegin(FXObject*, FXSelector, void*) {
4676 myIntervalBar.setBegin();
4677 return 1;
4678}
4679
4680
4681long
4682GNEViewNet::onCmdIntervalBarSetEnd(FXObject*, FXSelector, void*) {
4683 myIntervalBar.setEnd();
4684 return 1;
4685}
4686
4687
4688long
4689GNEViewNet::onCmdIntervalBarSetParameter(FXObject*, FXSelector, void*) {
4690 myIntervalBar.setParameter();
4691 return 1;
4692}
4693
4694
4695long
4696GNEViewNet::onCmdAddSelected(FXObject*, FXSelector, void*) {
4697 // only select if AC under cursor isn't previously selected
4698 auto AC = myViewObjectsSelector.getAttributeCarrierFront();
4699 if (AC && !AC->isAttributeCarrierSelected()) {
4700 AC->selectAttributeCarrier();
4701 }
4702 return 1;
4703}
4704
4705
4706long
4707GNEViewNet::onCmdRemoveSelected(FXObject*, FXSelector, void*) {
4708 // only unselect if AC under cursor isn't previously selected
4709 auto AC = myViewObjectsSelector.getAttributeCarrierFront();
4710 if (AC && AC->isAttributeCarrierSelected()) {
4711 AC->unselectAttributeCarrier();
4712 }
4713 return 1;
4714}
4715
4716
4717long
4718GNEViewNet::onCmdAddEdgeSelected(FXObject*, FXSelector, void*) {
4719 // only select if edge under cursor isn't previously selected
4720 auto edge = myViewObjectsSelector.getEdgeFront();
4721 if (edge && !edge->isAttributeCarrierSelected()) {
4722 edge->selectAttributeCarrier();
4723 }
4724 return 1;
4725}
4726
4727
4728long
4729GNEViewNet::onCmdRemoveEdgeSelected(FXObject*, FXSelector, void*) {
4730 // only unselect if edge under cursor isn't previously selected
4731 auto edge = myViewObjectsSelector.getEdgeFront();
4732 if (edge && edge->isAttributeCarrierSelected()) {
4733 edge->unselectAttributeCarrier();
4734 }
4735 return 1;
4736}
4737
4738
4739long
4740GNEViewNet::onCmdSetNeteditView(FXObject*, FXSelector sel, void*) {
4741 myEditModes.setView(FXSELID(sel));
4742 update();
4743 return 1;
4744}
4745
4746// ===========================================================================
4747// private
4748// ===========================================================================
4749
4750void
4752 // build supermode buttons
4753 myEditModes.buildSuperModeButtons();
4754
4755 // build save elements buttons
4756 mySaveElements.buildSaveElementsButtons();
4757
4758 // build time switch buttons
4759 myTimeFormat.buildTimeFormatButtons();
4760
4761 // build menu checks for Common checkable buttons
4762 myCommonCheckableButtons.buildCommonCheckableButtons();
4763
4764 // build menu checks for Network checkable buttons
4765 myNetworkCheckableButtons.buildNetworkCheckableButtons();
4766
4767 // build menu checks for Demand checkable buttons
4768 myDemandCheckableButtons.buildDemandCheckableButtons();
4769
4770 // build menu checks of view options Data
4771 myDataCheckableButtons.buildDataCheckableButtons();
4772
4773 // Create Vertical separator
4774 new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
4775 // XXX for some reason the vertical groove is not visible. adding more spacing to emphasize the separation
4776 new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
4777 new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
4778
4779 // build menu checks of view options Network
4780 myNetworkViewOptions.buildNetworkViewOptionsMenuChecks();
4781
4782 // build menu checks of view options Demand
4783 myDemandViewOptions.buildDemandViewOptionsMenuChecks();
4784
4785 // build menu checks of view options Data
4786 myDataViewOptions.buildDataViewOptionsMenuChecks();
4787
4788 // build interval bar
4789 myIntervalBar.buildIntervalBarElements();
4790}
4791
4792
4793void
4795 // get menu checks
4796 auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions;
4797 // hide all checkbox of view options Network
4798 myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
4799 // hide all checkbox of view options Demand
4800 myDemandViewOptions.hideDemandViewOptionsMenuChecks();
4801 // hide all checkbox of view options Data
4802 myDataViewOptions.hideDataViewOptionsMenuChecks();
4803 // disable all common edit modes
4804 myCommonCheckableButtons.disableCommonCheckableButtons();
4805 // disable all network edit modes
4806 myNetworkCheckableButtons.disableNetworkCheckableButtons();
4807 // disable all network edit modes
4808 myDataCheckableButtons.disableDataCheckableButtons();
4809 // hide interval bar
4810 myIntervalBar.hideIntervalBar();
4811 // hide all frames
4812 myViewParent->hideAllFrames();
4813 // hide all menuchecks
4814 myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
4815 myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
4816 myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
4817 // In network mode, always show option "show grid", "draw spread vehicles" and "show demand elements"
4818 myNetworkViewOptions.menuCheckToggleGrid->show();
4819 myNetworkViewOptions.menuCheckToggleDrawJunctionShape->show();
4820 myNetworkViewOptions.menuCheckDrawSpreadVehicles->show();
4821 myNetworkViewOptions.menuCheckShowDemandElements->show();
4822 menuChecks.menuCheckToggleGrid->show();
4823 menuChecks.menuCheckToggleDrawJunctionShape->show();
4824 menuChecks.menuCheckDrawSpreadVehicles->show();
4825 menuChecks.menuCheckShowDemandElements->show();
4826 // show separator
4827 menuChecks.separator->show();
4828 // enable selected controls
4829 switch (myEditModes.networkEditMode) {
4830 // common modes
4832 myViewParent->getInspectorFrame()->show();
4833 myViewParent->getInspectorFrame()->focusUpperElement();
4834 myCurrentFrame = myViewParent->getInspectorFrame();
4835 myCommonCheckableButtons.inspectButton->setChecked(true);
4836 // show view options
4837 myNetworkViewOptions.menuCheckSelectEdges->show();
4838 myNetworkViewOptions.menuCheckShowConnections->show();
4839 myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
4840 myNetworkViewOptions.menuCheckShowTAZElements->show();
4841 myNetworkViewOptions.menuCheckShowJunctionBubble->show();
4842 // show menu checks
4843 menuChecks.menuCheckSelectEdges->show();
4844 menuChecks.menuCheckShowConnections->show();
4845 menuChecks.menuCheckShowAdditionalSubElements->show();
4846 menuChecks.menuCheckShowTAZElements->show();
4847 menuChecks.menuCheckShowJunctionBubble->show();
4848 // update lock menu bar
4849 myLockManager.updateLockMenuBar();
4850 // show
4851 break;
4853 myViewParent->getDeleteFrame()->show();
4854 myViewParent->getDeleteFrame()->focusUpperElement();
4855 myCurrentFrame = myViewParent->getDeleteFrame();
4856 myCommonCheckableButtons.deleteButton->setChecked(true);
4857 myNetworkViewOptions.menuCheckShowConnections->show();
4858 myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
4859 myNetworkViewOptions.menuCheckShowTAZElements->show();
4860 myNetworkViewOptions.menuCheckShowJunctionBubble->show();
4861 // show view options
4862 myNetworkViewOptions.menuCheckSelectEdges->show();
4863 myNetworkViewOptions.menuCheckShowConnections->show();
4864 menuChecks.menuCheckShowAdditionalSubElements->show();
4865 menuChecks.menuCheckShowTAZElements->show();
4866 menuChecks.menuCheckShowJunctionBubble->show();
4867 // show menu checks
4868 menuChecks.menuCheckSelectEdges->show();
4869 menuChecks.menuCheckShowConnections->show();
4870 break;
4872 myViewParent->getSelectorFrame()->show();
4873 myViewParent->getSelectorFrame()->focusUpperElement();
4874 myCurrentFrame = myViewParent->getSelectorFrame();
4875 myCommonCheckableButtons.selectButton->setChecked(true);
4876 // show view options
4877 myNetworkViewOptions.menuCheckSelectEdges->show();
4878 myNetworkViewOptions.menuCheckShowConnections->show();
4879 myNetworkViewOptions.menuCheckExtendSelection->show();
4880 myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
4881 myNetworkViewOptions.menuCheckShowTAZElements->show();
4882 myNetworkViewOptions.menuCheckShowJunctionBubble->show();
4883 // show menu checks
4884 menuChecks.menuCheckSelectEdges->show();
4885 menuChecks.menuCheckShowConnections->show();
4886 menuChecks.menuCheckExtendSelection->show();
4887 menuChecks.menuCheckShowAdditionalSubElements->show();
4888 menuChecks.menuCheckShowTAZElements->show();
4889 menuChecks.menuCheckShowJunctionBubble->show();
4890 break;
4891 // specific modes
4893 myViewParent->getCreateEdgeFrame()->show();
4894 myViewParent->getCreateEdgeFrame()->focusUpperElement();
4895 myCurrentFrame = myViewParent->getCreateEdgeFrame();
4896 myNetworkCheckableButtons.createEdgeButton->setChecked(true);
4897 // show view options
4898 myNetworkViewOptions.menuCheckChainEdges->show();
4899 myNetworkViewOptions.menuCheckAutoOppositeEdge->show();
4900 myNetworkViewOptions.menuCheckShowJunctionBubble->show();
4901 // show menu checks
4902 menuChecks.menuCheckChainEdges->show();
4903 menuChecks.menuCheckAutoOppositeEdge->show();
4904 menuChecks.menuCheckShowJunctionBubble->show();
4905 break;
4907 myViewParent->getMoveFrame()->show();
4908 myViewParent->getMoveFrame()->focusUpperElement();
4909 myCurrentFrame = myViewParent->getMoveFrame();
4910 myNetworkCheckableButtons.moveNetworkElementsButton->setChecked(true);
4911 // show view options
4912 myNetworkViewOptions.menuCheckMergeAutomatically->show();
4913 myNetworkViewOptions.menuCheckShowJunctionBubble->show();
4914 myNetworkViewOptions.menuCheckMoveElevation->show();
4915 // show menu checks
4916 menuChecks.menuCheckMergeAutomatically->show();
4917 menuChecks.menuCheckShowJunctionBubble->show();
4918 menuChecks.menuCheckMoveElevation->show();
4919 break;
4921 myViewParent->getConnectorFrame()->show();
4922 myViewParent->getConnectorFrame()->focusUpperElement();
4923 myCurrentFrame = myViewParent->getConnectorFrame();
4924 myNetworkCheckableButtons.connectionButton->setChecked(true);
4925 break;
4927 myViewParent->getTLSEditorFrame()->show();
4928 myViewParent->getTLSEditorFrame()->focusUpperElement();
4929 myCurrentFrame = myViewParent->getTLSEditorFrame();
4930 myNetworkCheckableButtons.trafficLightButton->setChecked(true);
4931 // show view options
4932 myNetworkViewOptions.menuCheckChangeAllPhases->show();
4933 // show menu checks
4934 menuChecks.menuCheckChangeAllPhases->show();
4935 break;
4937 myViewParent->getAdditionalFrame()->show();
4938 myViewParent->getAdditionalFrame()->focusUpperElement();
4939 myCurrentFrame = myViewParent->getAdditionalFrame();
4940 myNetworkCheckableButtons.additionalButton->setChecked(true);
4941 // show view options
4942 myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
4943 // show menu checks
4944 menuChecks.menuCheckShowAdditionalSubElements->show();
4945 break;
4947 myViewParent->getCrossingFrame()->show();
4948 myViewParent->getCrossingFrame()->focusUpperElement();
4949 myCurrentFrame = myViewParent->getCrossingFrame();
4950 myNetworkCheckableButtons.crossingButton->setChecked(true);
4951 break;
4953 myViewParent->getTAZFrame()->show();
4954 myViewParent->getTAZFrame()->focusUpperElement();
4955 myCurrentFrame = myViewParent->getTAZFrame();
4956 myNetworkCheckableButtons.TAZButton->setChecked(true);
4957 break;
4959 myViewParent->getShapeFrame()->show();
4960 myViewParent->getShapeFrame()->focusUpperElement();
4961 myCurrentFrame = myViewParent->getShapeFrame();
4962 myNetworkCheckableButtons.shapeButton->setChecked(true);
4963 break;
4965 myViewParent->getProhibitionFrame()->show();
4966 myViewParent->getProhibitionFrame()->focusUpperElement();
4967 myCurrentFrame = myViewParent->getProhibitionFrame();
4968 myNetworkCheckableButtons.prohibitionButton->setChecked(true);
4969 break;
4971 myViewParent->getWireFrame()->show();
4972 myViewParent->getWireFrame()->focusUpperElement();
4973 myCurrentFrame = myViewParent->getWireFrame();
4974 myNetworkCheckableButtons.wireButton->setChecked(true);
4975 break;
4977 myViewParent->getDecalFrame()->show();
4978 myViewParent->getDecalFrame()->focusUpperElement();
4979 myCurrentFrame = myViewParent->getDecalFrame();
4980 myNetworkCheckableButtons.decalButton->setChecked(true);
4981 break;
4982 default:
4983 break;
4984 }
4985 // update menuChecks shorcuts
4986 menuChecks.updateShortcuts();
4987 // update common Network buttons
4988 myCommonCheckableButtons.updateCommonCheckableButtons();
4989 // Update Network buttons
4990 myNetworkCheckableButtons.updateNetworkCheckableButtons();
4991 // recalc toolbar
4992 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
4993 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
4994 // force repaint because different modes draw different things
4995 onPaint(nullptr, 0, nullptr);
4996 // finally update view
4997 updateViewNet();
4998}
4999
5000
5001void
5003 // get menu checks
5004 auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions;
5005 // hide all checkbox of view options Network
5006 myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
5007 // hide all checkbox of view options Demand
5008 myDemandViewOptions.hideDemandViewOptionsMenuChecks();
5009 // hide all checkbox of view options Data
5010 myDataViewOptions.hideDataViewOptionsMenuChecks();
5011 // disable all common edit modes
5012 myCommonCheckableButtons.disableCommonCheckableButtons();
5013 // disable all Demand edit modes
5014 myDemandCheckableButtons.disableDemandCheckableButtons();
5015 // disable all network edit modes
5016 myDataCheckableButtons.disableDataCheckableButtons();
5017 // hide interval bar
5018 myIntervalBar.hideIntervalBar();
5019 // hide all frames
5020 myViewParent->hideAllFrames();
5021 // hide all menuchecks
5022 myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
5023 myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
5024 myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
5025 // always show "hide shapes", "show grid", "draw spread vehicles", "show overlapped routes" and show/lock persons and containers
5026 myDemandViewOptions.menuCheckToggleGrid->show();
5027 myDemandViewOptions.menuCheckToggleDrawJunctionShape->show();
5028 myDemandViewOptions.menuCheckDrawSpreadVehicles->show();
5029 myDemandViewOptions.menuCheckHideShapes->show();
5030 myDemandViewOptions.menuCheckShowAllTrips->show();
5031 myDemandViewOptions.menuCheckShowAllPersonPlans->show();
5032 myDemandViewOptions.menuCheckLockPerson->show();
5033 myDemandViewOptions.menuCheckShowAllContainerPlans->show();
5034 myDemandViewOptions.menuCheckLockContainer->show();
5035 myDemandViewOptions.menuCheckShowOverlappedRoutes->show();
5036 menuChecks.menuCheckToggleGrid->show();
5037 menuChecks.menuCheckToggleDrawJunctionShape->show();
5038 menuChecks.menuCheckDrawSpreadVehicles->show();
5039 menuChecks.menuCheckHideShapes->show();
5040 menuChecks.menuCheckShowAllTrips->show();
5041 menuChecks.menuCheckShowAllPersonPlans->show();
5042 menuChecks.menuCheckLockPerson->show();
5043 menuChecks.menuCheckShowAllContainerPlans->show();
5044 menuChecks.menuCheckLockContainer->show();
5045 menuChecks.menuCheckShowOverlappedRoutes->show();
5046 // show separator
5047 menuChecks.separator->show();
5048 // enable selected controls
5049 switch (myEditModes.demandEditMode) {
5050 // common modes
5052 myViewParent->getInspectorFrame()->show();
5053 myViewParent->getInspectorFrame()->focusUpperElement();
5054 myCurrentFrame = myViewParent->getInspectorFrame();
5055 // set checkable button
5056 myCommonCheckableButtons.inspectButton->setChecked(true);
5057 // show view options
5058 myDemandViewOptions.menuCheckHideNonInspectedDemandElements->show();
5059 // show menu checks
5060 menuChecks.menuCheckHideNonInspectedDemandElements->show();
5061 break;
5063 myViewParent->getDeleteFrame()->show();
5064 myViewParent->getDeleteFrame()->focusUpperElement();
5065 myCurrentFrame = myViewParent->getDeleteFrame();
5066 // set checkable button
5067 myCommonCheckableButtons.deleteButton->setChecked(true);
5068 break;
5070 myViewParent->getSelectorFrame()->show();
5071 myViewParent->getSelectorFrame()->focusUpperElement();
5072 myCurrentFrame = myViewParent->getSelectorFrame();
5073 // set checkable button
5074 myCommonCheckableButtons.selectButton->setChecked(true);
5075 break;
5077 myViewParent->getMoveFrame()->show();
5078 myViewParent->getMoveFrame()->focusUpperElement();
5079 myCurrentFrame = myViewParent->getMoveFrame();
5080 // set checkable button
5081 myDemandCheckableButtons.moveDemandElementsButton->setChecked(true);
5082 break;
5083 // specific modes
5085 myViewParent->getRouteFrame()->show();
5086 myViewParent->getRouteFrame()->focusUpperElement();
5087 myCurrentFrame = myViewParent->getRouteFrame();
5088 // set checkable button
5089 myDemandCheckableButtons.routeButton->setChecked(true);
5090 break;
5092 myViewParent->getRouteDistributionFrame()->show();
5093 myViewParent->getRouteDistributionFrame()->focusUpperElement();
5094 myCurrentFrame = myViewParent->getRouteDistributionFrame();
5095 // set checkable button
5096 myDemandCheckableButtons.routeDistributionButton->setChecked(true);
5097 break;
5099 myViewParent->getVehicleFrame()->show();
5100 myViewParent->getVehicleFrame()->focusUpperElement();
5101 myCurrentFrame = myViewParent->getVehicleFrame();
5102 // set checkable button
5103 myDemandCheckableButtons.vehicleButton->setChecked(true);
5104 break;
5106 myViewParent->getTypeFrame()->show();
5107 myViewParent->getTypeFrame()->focusUpperElement();
5108 myCurrentFrame = myViewParent->getTypeFrame();
5109 // set checkable button
5110 myDemandCheckableButtons.typeButton->setChecked(true);
5111 break;
5113 myViewParent->getTypeDistributionFrame()->show();
5114 myViewParent->getTypeDistributionFrame()->focusUpperElement();
5115 myCurrentFrame = myViewParent->getTypeDistributionFrame();
5116 // set checkable button
5117 myDemandCheckableButtons.typeDistributionButton->setChecked(true);
5118 break;
5120 myViewParent->getStopFrame()->show();
5121 myViewParent->getStopFrame()->focusUpperElement();
5122 myCurrentFrame = myViewParent->getStopFrame();
5123 // set checkable button
5124 myDemandCheckableButtons.stopButton->setChecked(true);
5125 break;
5127 myViewParent->getPersonFrame()->show();
5128 myViewParent->getPersonFrame()->focusUpperElement();
5129 myCurrentFrame = myViewParent->getPersonFrame();
5130 // set checkable button
5131 myDemandCheckableButtons.personButton->setChecked(true);
5132 break;
5134 myViewParent->getPersonPlanFrame()->show();
5135 myViewParent->getPersonPlanFrame()->focusUpperElement();
5136 myCurrentFrame = myViewParent->getPersonPlanFrame();
5137 // set checkable button
5138 myDemandCheckableButtons.personPlanButton->setChecked(true);
5139 break;
5141 myViewParent->getContainerFrame()->show();
5142 myViewParent->getContainerFrame()->focusUpperElement();
5143 myCurrentFrame = myViewParent->getContainerFrame();
5144 // set checkable button
5145 myDemandCheckableButtons.containerButton->setChecked(true);
5146 break;
5148 myViewParent->getContainerPlanFrame()->show();
5149 myViewParent->getContainerPlanFrame()->focusUpperElement();
5150 myCurrentFrame = myViewParent->getContainerPlanFrame();
5151 // set checkable button
5152 myDemandCheckableButtons.containerPlanButton->setChecked(true);
5153 break;
5154 default:
5155 break;
5156 }
5157 // update menuChecks shorcuts
5158 menuChecks.updateShortcuts();
5159 // update common Network buttons
5160 myCommonCheckableButtons.updateCommonCheckableButtons();
5161 // Update Demand buttons
5162 myDemandCheckableButtons.updateDemandCheckableButtons();
5163 // recalc toolbar
5164 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
5165 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
5166 // force repaint because different modes draw different things
5167 onPaint(nullptr, 0, nullptr);
5168 // finally update view
5169 updateViewNet();
5170}
5171
5172
5173void
5175 // get menu checks
5176 auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions;
5177 // hide all checkbox of view options Network
5178 myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
5179 // hide all checkbox of view options Demand
5180 myDemandViewOptions.hideDemandViewOptionsMenuChecks();
5181 // hide all checkbox of view options Data
5182 myDataViewOptions.hideDataViewOptionsMenuChecks();
5183 // disable all common edit modes
5184 myCommonCheckableButtons.disableCommonCheckableButtons();
5185 // disable all Data edit modes
5186 myDataCheckableButtons.disableDataCheckableButtons();
5187 // show interval bar
5188 myIntervalBar.showIntervalBar();
5189 // hide all frames
5190 myViewParent->hideAllFrames();
5191 // hide all menuchecks
5192 myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
5193 myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
5194 myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
5195 // In data mode, always show options for show elements
5196 myDataViewOptions.menuCheckToggleDrawJunctionShape->show();
5197 myDataViewOptions.menuCheckShowAdditionals->show();
5198 myDataViewOptions.menuCheckShowShapes->show();
5199 myDataViewOptions.menuCheckShowDemandElements->show();
5200 menuChecks.menuCheckToggleDrawJunctionShape->show();
5201 menuChecks.menuCheckShowAdditionals->show();
5202 menuChecks.menuCheckShowShapes->show();
5203 menuChecks.menuCheckShowDemandElements->show();
5204 // show separator
5205 menuChecks.separator->show();
5206 // enable selected controls
5207 switch (myEditModes.dataEditMode) {
5208 // common modes
5210 myViewParent->getInspectorFrame()->show();
5211 myViewParent->getInspectorFrame()->focusUpperElement();
5212 myCurrentFrame = myViewParent->getInspectorFrame();
5213 // set checkable button
5214 myCommonCheckableButtons.inspectButton->setChecked(true);
5215 // show view option
5216 myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
5217 myDataViewOptions.menuCheckToggleTAZDrawFill->show();
5218 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
5219 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
5220 // show menu check
5221 menuChecks.menuCheckToggleTAZRelDrawing->show();
5222 menuChecks.menuCheckToggleTAZDrawFill->show();
5223 menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
5224 menuChecks.menuCheckToggleTAZRelOnlyTo->show();
5225 break;
5227 myViewParent->getDeleteFrame()->show();
5228 myViewParent->getDeleteFrame()->focusUpperElement();
5229 myCurrentFrame = myViewParent->getDeleteFrame();
5230 // set checkable button
5231 myCommonCheckableButtons.deleteButton->setChecked(true);
5232 // show toggle TAZRel drawing view option
5233 myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
5234 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
5235 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
5236 // show toggle TAZRel drawing menu check
5237 menuChecks.menuCheckToggleTAZRelDrawing->show();
5238 menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
5239 menuChecks.menuCheckToggleTAZRelOnlyTo->show();
5240 break;
5242 myViewParent->getSelectorFrame()->show();
5243 myViewParent->getSelectorFrame()->focusUpperElement();
5244 myCurrentFrame = myViewParent->getSelectorFrame();
5245 // set checkable button
5246 myCommonCheckableButtons.selectButton->setChecked(true);
5247 // show toggle TAZRel drawing view option
5248 myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
5249 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
5250 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
5251 // show toggle TAZRel drawing menu check
5252 menuChecks.menuCheckToggleTAZRelDrawing->show();
5253 menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
5254 menuChecks.menuCheckToggleTAZRelOnlyTo->show();
5255 break;
5257 myViewParent->getEdgeDataFrame()->show();
5258 myViewParent->getEdgeDataFrame()->focusUpperElement();
5259 myCurrentFrame = myViewParent->getEdgeDataFrame();
5260 // set checkable button
5261 myDataCheckableButtons.edgeDataButton->setChecked(true);
5262 break;
5264 myViewParent->getEdgeRelDataFrame()->show();
5265 myViewParent->getEdgeRelDataFrame()->focusUpperElement();
5266 myCurrentFrame = myViewParent->getEdgeRelDataFrame();
5267 // set checkable button
5268 myDataCheckableButtons.edgeRelDataButton->setChecked(true);
5269 break;
5271 myViewParent->getTAZRelDataFrame()->show();
5272 myViewParent->getTAZRelDataFrame()->focusUpperElement();
5273 myCurrentFrame = myViewParent->getTAZRelDataFrame();
5274 // set checkable button
5275 myDataCheckableButtons.TAZRelDataButton->setChecked(true);
5276 // show view option
5277 myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
5278 myDataViewOptions.menuCheckToggleTAZDrawFill->show();
5279 myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
5280 myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
5281 // show menu check
5282 menuChecks.menuCheckToggleTAZRelDrawing->show();
5283 menuChecks.menuCheckToggleTAZDrawFill->show();
5284 menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
5285 menuChecks.menuCheckToggleTAZRelOnlyTo->show();
5286 break;
5288 myViewParent->getMeanDataFrame()->show();
5289 myViewParent->getMeanDataFrame()->focusUpperElement();
5290 myCurrentFrame = myViewParent->getMeanDataFrame();
5291 // set checkable button
5292 myDataCheckableButtons.meanDataButton->setChecked(true);
5293 break;
5294 default:
5295 break;
5296 }
5297 // update menuChecks shorcuts
5298 menuChecks.updateShortcuts();
5299 // update common Network buttons
5300 myCommonCheckableButtons.updateCommonCheckableButtons();
5301 // Update Data buttons
5302 myDataCheckableButtons.updateDataCheckableButtons();
5303 // recalc toolbar
5304 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
5305 myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
5306 // force repaint because different modes draw different things
5307 onPaint(nullptr, 0, nullptr);
5308 // finally update view
5309 updateViewNet();
5310}
5311
5312
5313void
5315 if (AC->getTagProperty()->getTag() == SUMO_TAG_JUNCTION) {
5316 // get junction (note: could be already removed if is a child, then hardfail=false)
5317 GNEJunction* junction = myNet->getAttributeCarriers()->retrieveJunction(AC->getID(), false);
5318 // if exist, remove it
5319 if (junction) {
5320 myNet->deleteJunction(junction, myUndoList);
5321 }
5322 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_CROSSING) {
5323 // get crossing (note: could be already removed if is a child, then hardfail=false)
5324 GNECrossing* crossing = myNet->getAttributeCarriers()->retrieveCrossing(AC->getGUIGlObject(), false);
5325 // if exist, remove it
5326 if (crossing) {
5327 myNet->deleteCrossing(crossing, myUndoList);
5328 }
5329 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
5330 // get edge (note: could be already removed if is a child, then hardfail=false)
5331 GNEEdge* edge = myNet->getAttributeCarriers()->retrieveEdge(AC->getID(), false);
5332 // if exist, remove it
5333 if (edge) {
5334 myNet->deleteEdge(edge, myUndoList, false);
5335 }
5336 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_LANE) {
5337 // get lane (note: could be already removed if is a child, then hardfail=false)
5338 GNELane* lane = myNet->getAttributeCarriers()->retrieveLane(AC->getGUIGlObject(), false);
5339 // if exist, remove it
5340 if (lane) {
5341 myNet->deleteLane(lane, myUndoList, false);
5342 }
5343 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
5344 // get connection (note: could be already removed if is a child, then hardfail=false)
5345 GNEConnection* connection = myNet->getAttributeCarriers()->retrieveConnection(AC->getGUIGlObject(), false);
5346 // if exist, remove it
5347 if (connection) {
5348 myNet->deleteConnection(connection, myUndoList);
5349 }
5350 } else if ((AC->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) || (AC->getTagProperty()->getTag() == SUMO_TAG_TAZSINK)) {
5351 // get TAZ SourceSink Element (note: could be already removed if is a child, then hardfail=false)
5352 GNETAZSourceSink* TAZSourceSink = myNet->getAttributeCarriers()->retrieveTAZSourceSink(AC, false);
5353 // if exist, remove it
5354 if (TAZSourceSink) {
5355 myNet->deleteTAZSourceSink(TAZSourceSink, myUndoList);
5356 }
5357 } else if (AC->getTagProperty()->isAdditionalElement()) {
5358 // get additional Element (note: could be already removed if is a child, then hardfail=false)
5359 GNEAdditional* additionalElement = myNet->getAttributeCarriers()->retrieveAdditional(AC->getGUIGlObject(), false);
5360 // if exist, remove it
5361 if (additionalElement) {
5362 myNet->deleteAdditional(additionalElement, myUndoList);
5363 }
5364 }
5365}
5366
5367
5368void
5370 // get demand Element (note: could be already removed if is a child, then hardfail=false)
5371 GNEDemandElement* demandElement = myNet->getAttributeCarriers()->retrieveDemandElement(AC->getGUIGlObject(), false);
5372 // if exist, remove it
5373 if (demandElement) {
5374 myNet->deleteDemandElement(demandElement, myUndoList);
5375 }
5376}
5377
5378
5379void
5381 if (AC->getTagProperty()->getTag() == SUMO_TAG_DATASET) {
5382 // get data set (note: could be already removed if is a child, then hardfail=false)
5383 GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(AC->getID(), false);
5384 // if exist, remove it
5385 if (dataSet) {
5386 myNet->deleteDataSet(dataSet, myUndoList);
5387 }
5388 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_DATAINTERVAL) {
5389 // get data interval (note: could be already removed if is a child, then hardfail=false)
5390 GNEDataInterval* dataInterval = myNet->getAttributeCarriers()->retrieveDataInterval(AC, false);
5391 // if exist, remove it
5392 if (dataInterval) {
5393 myNet->deleteDataInterval(dataInterval, myUndoList);
5394 }
5395 } else {
5396 // get generic data (note: could be already removed if is a child, then hardfail=false)
5397 GNEGenericData* genericData = myNet->getAttributeCarriers()->retrieveGenericData(AC->getGUIGlObject(), false);
5398 // if exist, remove it
5399 if (genericData) {
5400 myNet->deleteGenericData(genericData, myUndoList);
5401 }
5402 }
5403}
5404
5405
5406void
5408 if (myEditModes.isCurrentSupermodeNetwork()) {
5409 switch (myEditModes.networkEditMode) {
5411 myViewParent->getInspectorFrame()->update();
5412 break;
5413 default:
5414 break;
5415 }
5416 }
5417 if (myEditModes.isCurrentSupermodeDemand()) {
5418 switch (myEditModes.demandEditMode) {
5420 myViewParent->getInspectorFrame()->update();
5421 break;
5423 myViewParent->getVehicleFrame()->show();
5424 break;
5426 myViewParent->getTypeFrame()->show();
5427 break;
5429 myViewParent->getTypeDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
5430 break;
5432 myViewParent->getRouteDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
5433 break;
5435 myViewParent->getPersonFrame()->show();
5436 break;
5438 myViewParent->getPersonPlanFrame()->show();
5439 break;
5441 myViewParent->getContainerFrame()->show();
5442 break;
5444 myViewParent->getContainerPlanFrame()->show();
5445 break;
5447 myViewParent->getStopFrame()->show();
5448 break;
5449 default:
5450 break;
5451 }
5452 }
5453 if (myEditModes.isCurrentSupermodeData()) {
5454 switch (myEditModes.dataEditMode) {
5456 myViewParent->getInspectorFrame()->update();
5457 break;
5458 default:
5459 break;
5460 }
5461 // update data interval
5462 myIntervalBar.markForUpdate();
5463 }
5464 // update view
5465 updateViewNet();
5466}
5467
5468// ---------------------------------------------------------------------------
5469// Private methods
5470// ---------------------------------------------------------------------------
5471
5472void
5474 PositionVector temporalShape;
5475 bool deleteLastCreatedPoint = false;
5476 // obtain temporal shape and delete last created point flag
5477 if (myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
5478 temporalShape = myViewParent->getShapeFrame()->getDrawingShapeModule()->getTemporalShape();
5479 deleteLastCreatedPoint = myViewParent->getShapeFrame()->getDrawingShapeModule()->getDeleteLastCreatedPoint();
5480 } else if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
5481 temporalShape = myViewParent->getTAZFrame()->getDrawingShapeModule()->getTemporalShape();
5482 deleteLastCreatedPoint = myViewParent->getTAZFrame()->getDrawingShapeModule()->getDeleteLastCreatedPoint();
5483 }
5484 // check if we're in drawing mode
5485 if (temporalShape.size() > 0) {
5486 // draw blue line with the current drawed shape
5488 glLineWidth(2);
5489 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5491 GLHelper::drawLine(temporalShape);
5493 // draw red line from the last point of shape to the current mouse position
5495 glLineWidth(2);
5496 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5497 // draw last line depending if shift key (delete last created point) is pressed
5498 if (deleteLastCreatedPoint) {
5500 } else {
5502 }
5505 }
5506}
5507
5508
5509void
5511 // first check if we're in correct mode
5512 if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) &&
5513 !myMouseButtonKeyPressed.controlKeyPressed() &&
5514 !myMouseButtonKeyPressed.shiftKeyPressed() &&
5515 !myMouseButtonKeyPressed.altKeyPressed()) {
5516 // get mouse position
5517 const Position mousePosition = snapToActiveGrid(getPositionInformation());
5518 // get junction exaggeration
5519 const double junctionExaggeration = myVisualizationSettings->junctionSize.getExaggeration(*myVisualizationSettings, nullptr, 4);
5520 // get bubble color
5521 RGBColor bubbleColor = myVisualizationSettings->junctionColorer.getScheme().getColor(1);
5522 // change alpha
5523 bubbleColor.setAlpha(200);
5524 // push layer matrix
5526 // translate to temporal shape layer
5527 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5528 // push junction matrix
5530 // move matrix junction center
5531 glTranslated(mousePosition.x(), mousePosition.y(), 0.1);
5532 // set color
5533 GLHelper::setColor(bubbleColor);
5534 // draw outline circle
5535 const double circleWidth = myVisualizationSettings->neteditSizeSettings.junctionBubbleRadius * junctionExaggeration;
5536 GLHelper::drawOutlineCircle(circleWidth, circleWidth * 0.75, 32);
5537 // pop junction matrix
5539 // draw temporal edge
5540 if (myViewParent->getCreateEdgeFrame()->getJunctionSource() && (mousePosition.distanceSquaredTo(myViewParent->getCreateEdgeFrame()->getJunctionSource()->getPositionInView()) > 1)) {
5541 // set temporal edge color
5542 RGBColor temporalEdgeColor = RGBColor::BLACK;
5543 temporalEdgeColor.setAlpha(200);
5544 // declare temporal edge geometry
5545 GUIGeometry temporalEdgeGeometry;
5546 // calculate geometry between source junction and mouse position
5547 PositionVector temporalEdge = {mousePosition, myViewParent->getCreateEdgeFrame()->getJunctionSource()->getPositionInView()};
5548 // move temporal edge 2 side
5549 temporalEdge.move2side(-1);
5550 // update geometry
5551 temporalEdgeGeometry.updateGeometry(temporalEdge);
5552 // push temporal edge matrix
5554 // set color
5555 GLHelper::setColor(temporalEdgeColor);
5556 // draw temporal edge
5558 // check if we have to draw opposite edge
5559 if (myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE) {
5560 // move temporal edge to opposite edge
5561 temporalEdge.move2side(2);
5562 // update geometry
5563 temporalEdgeGeometry.updateGeometry(temporalEdge);
5564 // draw temporal edge
5566 }
5567 // pop temporal edge matrix
5569 }
5570 // pop layer matrix
5572 }
5573}
5574
5575
5576void
5578 // first check if we're in correct mode
5579 if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) &&
5580 !myMouseButtonKeyPressed.controlKeyPressed() &&
5581 myMouseButtonKeyPressed.shiftKeyPressed() &&
5582 !myMouseButtonKeyPressed.altKeyPressed() &&
5583 (gViewObjectsHandler.markedEdge != nullptr)) {
5584 // calculate split position
5585 const auto lane = gViewObjectsHandler.markedEdge->getChildLanes().back();
5586 auto shape = lane->getLaneShape();
5587 // move shape to side
5588 shape.move2side(lane->getDrawingConstants()->getDrawingWidth() * -1);
5589 const auto offset = shape.nearest_offset_to_point2D(snapToActiveGrid(getPositionInformation()));
5590 const auto splitPosition = shape.positionAtOffset2D(offset);
5591 // get junction exaggeration
5592 const double junctionExaggeration = myVisualizationSettings->junctionSize.getExaggeration(*myVisualizationSettings, nullptr, 4);
5593 // get bubble color
5594 RGBColor bubbleColor = myVisualizationSettings->junctionColorer.getScheme().getColor(1);
5595 // push layer matrix
5597 // translate to temporal shape layer
5598 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5599 // push junction matrix
5601 // move matrix junction center
5602 glTranslated(splitPosition.x(), splitPosition.y(), 0.1);
5603 // set color
5604 GLHelper::setColor(bubbleColor);
5605 // draw outline circle
5606 const double circleWidth = myVisualizationSettings->neteditSizeSettings.junctionBubbleRadius * junctionExaggeration;
5607 GLHelper::drawOutlineCircle(circleWidth, circleWidth * 0.75, 32);
5608 // draw filled circle
5610 // pop junction matrix
5612 // pop layer matrix
5614 }
5615}
5616
5617
5618void
5620 // check conditions
5621 if ((myCurrentObjectsDialog.size() > 0) && (myCurrentObjectsDialog.front()->getType() == GLO_JUNCTION) && myDrawPreviewRoundabout) {
5622 // get junction
5623 const auto junction = myNet->getAttributeCarriers()->retrieveJunction(myCurrentObjectsDialog.front()->getMicrosimID());
5624 // push layer matrix
5626 // translate to temporal shape layer
5627 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5628 // push junction matrix
5630 // move matrix junction center
5631 glTranslated(junction->getNBNode()->getPosition().x(), junction->getNBNode()->getPosition().y(), 0.1);
5632 // set color
5634 // draw outline circle
5635 const double circleWidth = (junction->getNBNode()->getRadius() < 0) ? 4.0 : junction->getNBNode()->getRadius();
5636 GLHelper::drawOutlineCircle(circleWidth * 1.30, circleWidth, 32);
5637 // pop junction matrix
5639 // pop layer matrix
5641 }
5642}
5643
5644
5645void
5647 // check conditions
5648 if (selectingDetectorsTLSMode() && (myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction() != nullptr)) {
5649 // get junction
5650 const auto junctionPos = myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction()->getNBNode()->getPosition();
5651 // push layer matrix
5653 // translate to TLLogic
5654 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5655 // iterate over all E1 detectors
5656 for (const auto& E1ID : myViewParent->getTLSEditorFrame()->getTLSAttributes()->getE1Detectors()) {
5657 // first check if E1 exists
5658 const auto E1 = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_INDUCTION_LOOP, E1ID.second, false);
5659 if (E1) {
5660 // push line matrix
5662 // draw line between junction and E1
5663 GUIGeometry::drawChildLine(*myVisualizationSettings, junctionPos, E1->getPositionInView(),
5664 myVisualizationSettings->additionalSettings.TLSConnectionColor, true, 0.25);
5665 // pop line matrix
5667 }
5668 }
5669 // pop layer matrix
5671 }
5672}
5673
5674
5675void
5677 // check conditions
5678 if (selectingJunctionsTLSMode() && (myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction() != nullptr)) {
5679 // get junction
5680 const auto junctionPos = myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction()->getNBNode()->getPosition();
5681 // push layer matrix
5683 // translate to TLLogic
5684 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5685 // iterate over all Junction detectors
5686 for (const auto& selectedJunctionID : myViewParent->getTLSEditorFrame()->getTLSJunction()->getSelectedJunctionIDs()) {
5687 // get junction
5688 const auto selectedJunction = myNet->getAttributeCarriers()->retrieveJunction(selectedJunctionID);
5689 // push line matrix
5691 // draw line between junction and Junction
5692 GUIGeometry::drawChildLine(*myVisualizationSettings, junctionPos, selectedJunction->getPositionInView(),
5693 myVisualizationSettings->additionalSettings.TLSConnectionColor, true, 0.25);
5694 // pop line matrix
5696 }
5697 // pop layer matrix
5699 }
5700}
5701
5702
5703void
5705 if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL)) {
5706 /*
5707 myViewParent->getAdditionalFrame()->getNeteditAttributesEditor()->drawLaneReference(gViewObjectsHandler.markedLane);
5708 // get element length
5709 const double elementLength = getElementLength();
5710 // check lane
5711 if (lane && shown() && myReferencePointComboBox->shown() && (myReferencePoint != ReferencePoint::INVALID) &&
5712 (elementLength != INVALID_DOUBLE)) {
5713 // Obtain position of the mouse over lane (limited over grid)
5714 const double mousePosOverLane = lane->getLaneShape().nearest_offset_to_point2D(myFrameParent->getViewNet()->snapToActiveGrid(myFrameParent->getViewNet()->getPositionInformation())) / lane->getLengthGeometryFactor();
5715 // continue depending of mouse pos over lane
5716 if (mousePosOverLane >= 0) {
5717 // set start and end position
5718 const double startPos = setStartPosition(mousePosOverLane, elementLength);
5719 const double endPos = setEndPosition(mousePosOverLane, elementLength, lane->getLaneShape().length2D());
5720 // get lane geometry
5721 const auto laneShape = lane->getLaneGeometry().getShape();
5722 // difference between start-end position and elementLength
5723 const auto lengthDifference = (endPos - startPos) - elementLength;
5724 // set color
5725 RGBColor segmentColor;
5726 // check if force length
5727 if (myForceLengthFrame->shown() && (myForceLengthCheckButton->getCheck() == TRUE) && abs(lengthDifference) >= 0.1) {
5728 segmentColor = RGBColor::RED;
5729 } else {
5730 segmentColor = RGBColor::ORANGE;
5731 }
5732 // declare geometries
5733 GUIGeometry geometry;
5734 // trim geomtry
5735 geometry.updateGeometry(laneShape,
5736 (startPos == INVALID_DOUBLE) ? -1 : startPos,
5737 Position::INVALID,
5738 (endPos == INVALID_DOUBLE) ? -1 : endPos,
5739 Position::INVALID);
5740 // push layer matrix
5741 GLHelper::pushMatrix();
5742 // translate to temporal shape layer
5743 glTranslated(0, 0, GLO_TEMPORALSHAPE);
5744 // set color
5745 GLHelper::setColor(segmentColor);
5746 // draw temporal edge
5747 GUIGeometry::drawGeometry(lane->getDrawingConstants()->getDetail(), geometry, 0.45);
5748 // check if draw starPos
5749 if (startPos != INVALID_DOUBLE) {
5750 // cut start pos
5751 geometry.updateGeometry(laneShape, startPos, Position::INVALID, startPos + 0.5, Position::INVALID);
5752 // draw startPos
5753 GUIGeometry::drawGeometry(lane->getDrawingConstants()->getDetail(), geometry, 1);
5754 } else {
5755 // push circle matrix
5756 GLHelper::pushMatrix();
5757 // translate to test layer, but under magenta square
5758 glTranslated(laneShape.front().x(), laneShape.front().y(), 0);
5759 // draw circle
5760 GLHelper::drawFilledCircle(0.8, 8);
5761 // pop circle matrix
5762 GLHelper::popMatrix();
5763 }
5764 // check if draw endPos
5765 if (endPos != INVALID_DOUBLE) {
5766 // cut endPos
5767 geometry.updateGeometry(laneShape, endPos - 0.5, Position::INVALID, endPos, Position::INVALID);
5768 // draw endPos
5769 GUIGeometry::drawGeometry(lane->getDrawingConstants()->getDetail(), geometry, 1);
5770 } else {
5771 // push circle matrix
5772 GLHelper::pushMatrix();
5773 // translate to test layer, but under magenta square
5774 glTranslated(laneShape.back().x(), laneShape.back().y(), 0);
5775 // draw circle
5776 GLHelper::drawFilledCircle(0.8, 8);
5777 // pop circle matrix
5778 GLHelper::popMatrix();
5779 }
5780 // set color
5781 GLHelper::setColor(segmentColor.changedBrightness(-32));
5782 // translate to front
5783 glTranslated(0, 0, 2);
5784 // check if draw at end, or over circle
5785 if (endPos == INVALID_DOUBLE) {
5786 // cut endPos
5787 geometry.updateGeometry(laneShape, laneShape.length() - 0.5, Position::INVALID, laneShape.length(), Position::INVALID);
5788 // draw triangle at end
5789 GLHelper::drawTriangleAtEnd(geometry.getShape().front(), geometry.getShape().back(), (double) 0.45, (double) 0.3, 0.3);
5790 } else {
5791 // draw triangle at end
5792 GLHelper::drawTriangleAtEnd(geometry.getShape().front(), geometry.getShape().back(), (double) 0.45, (double) 0.3, -0.1);
5793 }
5794 // pop layer matrix
5795 GLHelper::popMatrix();
5796 }
5797 }
5798 */
5799 }
5800}
5801
5802
5803void
5805 if (myVisualizationSettings->showGrid && OptionsCont::getOptions().getBool("gui-testing")) {
5806 // get mouse position
5807 const Position mousePosition = snapToActiveGrid(getPositionInformation());
5808 // push layer matrix
5810 // translate to test layer, but under magenta square
5811 glTranslated(mousePosition.x(), mousePosition.y(), GLO_TESTELEMENT - 1);
5812 // set color
5814 // draw circle
5816 // pop layer matrix
5818 }
5819}
5820
5821
5822void
5824 // reset moving selected edge
5825 myMoveMultipleElements.resetMovingSelectedEdge();
5826 // decide what to do based on mode
5827 switch (myEditModes.networkEditMode) {
5829 // first swap lane to edges if mySelectEdges is enabled and shift key isn't pressed
5830 if (checkSelectEdges()) {
5831 myViewObjectsSelector.filterLanes();
5832 } else {
5833 myViewObjectsSelector.filterEdges();
5834 }
5835 // now filter locked elements
5836 myViewObjectsSelector.filterLockedElements();
5837 // check if we're selecting a new parent for the current inspected element
5838 if (myViewParent->getInspectorFrame()->getAttributesEditor()->isReparenting()) {
5839 myViewParent->getInspectorFrame()->getAttributesEditor()->setNewParent(myViewObjectsSelector.getAttributeCarrierFront());
5840 } else {
5841 // inspect clicked elements
5842 myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
5843 }
5844 // process click
5845 processClick(eventData);
5846 break;
5847 }
5849 // first swap lane to edges if mySelectEdges is enabled and shift key isn't pressed
5850 if (checkSelectEdges()) {
5851 myViewObjectsSelector.filterLanes();
5852 } else {
5853 myViewObjectsSelector.filterEdges();
5854 }
5855 // now filter locked elements forcing excluding walkingAreas
5856 myViewObjectsSelector.filterLockedElements({GLO_WALKINGAREA});
5857 // continue depending of AC
5858 if (myViewObjectsSelector.getAttributeCarrierFront()) {
5859 // now check if we want only delete geometry points
5860 if (myViewParent->getDeleteFrame()->getDeleteOptions()->deleteOnlyGeometryPoints()) {
5861 // only remove geometry point
5862 myViewParent->getDeleteFrame()->removeGeometryPoint(myViewObjectsSelector);
5863 } else if (myViewObjectsSelector.getAttributeCarrierFront()->isAttributeCarrierSelected()) {
5864 // remove all selected attribute carriers
5865 if (!myViewObjectsSelector.getAttributeCarrierFront()->getGUIGlObject()->isGLObjectLocked()) {
5866 myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
5867 }
5868 } else {
5869 // remove attribute carrier under cursor
5870 myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
5871 }
5872 } else {
5873 // process click
5874 processClick(eventData);
5875 }
5876 break;
5877 }
5879 // first swap lane to edges if mySelectEdges is enabled and shift key isn't pressed
5880 if (checkSelectEdges()) {
5881 myViewObjectsSelector.filterLanes();
5882 } else {
5883 myViewObjectsSelector.filterEdges();
5884 }
5885 // now filter locked elements
5886 myViewObjectsSelector.filterLockedElements();
5887 // avoid to select if control key is pressed
5888 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
5889 // check if a rect for selecting is being created
5890 if (myMouseButtonKeyPressed.shiftKeyPressed()) {
5891 // begin rectangle selection
5892 mySelectingArea.beginRectangleSelection();
5893 } else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
5894 // process click
5895 processClick(eventData);
5896 }
5897 } else {
5898 // process click
5899 processClick(eventData);
5900 }
5901 break;
5903 // check what buttons are pressed
5904 if (myMouseButtonKeyPressed.shiftKeyPressed()) {
5905 // get edge under cursor
5906 GNEEdge* edge = myViewObjectsSelector.getEdgeFront();
5907 if (edge) {
5908 // obtain reverse edge
5909 const auto oppositeEdges = edge->getOppositeEdges();
5910 // check if we're split one or both edges
5911 if (myMouseButtonKeyPressed.altKeyPressed()) {
5912 myNet->splitEdge(edge, edge->getSplitPos(getPositionInformation()), myUndoList);
5913 } else if (oppositeEdges.size() > 0) {
5914 myNet->splitEdgesBidi(edge, oppositeEdges.front(), edge->getSplitPos(getPositionInformation()), myUndoList);
5915 } else {
5916 myNet->splitEdge(edge, edge->getSplitPos(getPositionInformation()), myUndoList);
5917 }
5918 }
5919 } else if (!myMouseButtonKeyPressed.controlKeyPressed()) {
5920 // process left click in create edge frame Frame
5921 myViewParent->getCreateEdgeFrame()->processClick(getPositionInformation(),
5923 (myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE),
5924 (myNetworkViewOptions.menuCheckChainEdges->amChecked() == TRUE));
5925 }
5926 // process click
5927 processClick(eventData);
5928 break;
5929 }
5931 // editing lane shapes in move mode isn't finished, then always filter lanes
5932 myViewObjectsSelector.filterLanes();
5933 // filter locked elements
5934 myViewObjectsSelector.filterLockedElements({GLO_WALKINGAREA});
5935 // check if we're editing a shape
5936 if (myEditNetworkElementShapes.getEditedNetworkElement()) {
5937 // check if we're removing a geometry point
5938 if (myMouseButtonKeyPressed.shiftKeyPressed()) {
5939 // remove geometry point
5940 if (myViewObjectsSelector.getNetworkElementFront() == myEditNetworkElementShapes.getEditedNetworkElement()) {
5941 myViewObjectsSelector.getNetworkElementFront()->getMoveElement()->removeGeometryPoint(getPositionInformation(), myUndoList);
5942 }
5943 } else if (!myMoveSingleElement.beginMoveNetworkElementShape()) {
5944 // process click if there isn't movable elements (to move camera using drag an drop)
5945 processClick(eventData);
5946 }
5947 } else {
5948 // filter connections and crossings, because are moved setting custom shape
5949 myViewObjectsSelector.filterConnections();
5950 myViewObjectsSelector.filterCrossings();
5951 // get AC under cursor
5952 auto AC = myViewObjectsSelector.getAttributeCarrierFront();
5953 // check that AC is an network or additional element
5954 if (AC && (AC->getTagProperty()->isNetworkElement() || AC->getTagProperty()->isAdditionalElement())) {
5955 // check if we're moving a set of selected items
5956 if (AC->isAttributeCarrierSelected()) {
5957 // move selected ACs
5958 myMoveMultipleElements.beginMoveSelection();
5959 } else if (!myMoveSingleElement.beginMoveSingleElementNetworkMode()) {
5960 // process click if there isn't movable elements (to move camera using drag an drop)
5961 processClick(eventData);
5962 }
5963 } else {
5964 // process click if there isn't movable elements (to move camera using drag an drop)
5965 processClick(eventData);
5966 }
5967 }
5968 break;
5969 }
5971 // check if we're clicked over a non locked lane
5972 if (myViewObjectsSelector.getLaneFrontNonLocked()) {
5973 // Handle laneclick (shift key may pass connections, Control key allow conflicts)
5974 myViewParent->getConnectorFrame()->handleLaneClick(myViewObjectsSelector);
5975 updateViewNet();
5976 }
5977 // process click
5978 processClick(eventData);
5979 break;
5980 }
5982 // edit TLS in TLSEditor frame
5983 myViewParent->getTLSEditorFrame()->editTLS(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
5984 // process click
5985 processClick(eventData);
5986 break;
5987 }
5989 // avoid create additionals if control key is pressed
5990 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
5991 if (myViewParent->getAdditionalFrame()->addAdditional(myViewObjectsSelector)) {
5992 updateViewNet();
5993 }
5994 }
5995 // process click
5996 processClick(eventData);
5997 break;
5998 }
6000 // filter elements over junctions
6001 myViewObjectsSelector.filterCrossings();
6002 myViewObjectsSelector.filterWalkingAreas();
6003 myViewObjectsSelector.filterConnections();
6004 // call function addCrossing from crossing frame
6005 myViewParent->getCrossingFrame()->addCrossing(myViewObjectsSelector);
6006 // process click
6007 processClick(eventData);
6008 break;
6009 }
6011 // avoid create TAZs if control key is pressed
6012 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6013 // check if we want to create a rect for selecting edges
6014 if (myMouseButtonKeyPressed.shiftKeyPressed() && (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() != nullptr)) {
6015 // begin rectangle selection
6016 mySelectingArea.beginRectangleSelection();
6017 } else {
6018 // check if process click was successfully
6019 if (myViewParent->getTAZFrame()->processClick(snapToActiveGrid(getPositionInformation()), myViewObjectsSelector)) {
6020 updateViewNet();
6021 }
6022 // process click
6023 processClick(eventData);
6024 }
6025 } else {
6026 // process click
6027 processClick(eventData);
6028 }
6029 break;
6030 }
6032 // avoid create shapes if control key is pressed
6033 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6034 if (!myViewObjectsSelector.getPOIFront()) {
6035 // declare processClick flag
6036 bool updateTemporalShape = false;
6037 // process click
6038 myViewParent->getShapeFrame()->processClick(snapToActiveGrid(getPositionInformation()), myViewObjectsSelector, updateTemporalShape);
6039 updateViewNet();
6040 // process click depending of the result of "process click"
6041 if (!updateTemporalShape) {
6042 // process click
6043 processClick(eventData);
6044 }
6045 }
6046 } else {
6047 // process click
6048 processClick(eventData);
6049 }
6050 break;
6051 }
6053 if (myViewObjectsSelector.getConnectionFront()) {
6054 // shift key may pass connections, Control key allow conflicts.
6055 myViewParent->getProhibitionFrame()->handleProhibitionClick(myViewObjectsSelector);
6056 updateViewNet();
6057 }
6058 // process click
6059 processClick(eventData);
6060 break;
6061 }
6063 // avoid create wires if control key is pressed
6064 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6065 myViewParent->getWireFrame()->addWire(myViewObjectsSelector);
6066 updateViewNet();
6067 }
6068 // process click
6069 processClick(eventData);
6070 break;
6071 }
6073 // process click
6074 processClick(eventData);
6075 break;
6076 }
6077 default: {
6078 // process click
6079 processClick(eventData);
6080 }
6081 }
6082}
6083
6084
6085void
6087 // check moved items
6088 if (myMoveMultipleElements.isMovingSelection()) {
6089 myMoveMultipleElements.finishMoveSelection();
6090 } else if (mySelectingArea.selectingUsingRectangle) {
6091 // check if we're creating a rectangle selection or we want only to select a lane
6092 if (mySelectingArea.startDrawing) {
6093 // check if we're selecting all type of elements o we only want a set of edges for TAZ
6094 if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
6095 mySelectingArea.processRectangleSelection();
6096 } else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
6097 // process edge selection
6098 myViewParent->getTAZFrame()->processEdgeSelection(mySelectingArea.processEdgeRectangleSelection());
6099 }
6100 } else if (myMouseButtonKeyPressed.shiftKeyPressed()) {
6101 // check if there is a lane in objects under cursor
6102 if (myViewObjectsSelector.getLaneFront()) {
6103 // if we clicked over an lane with shift key pressed, select or unselect it
6104 if (myViewObjectsSelector.getLaneFront()->isAttributeCarrierSelected()) {
6105 myViewObjectsSelector.getLaneFront()->unselectAttributeCarrier();
6106 } else {
6107 myViewObjectsSelector.getLaneFront()->selectAttributeCarrier();
6108 }
6109 }
6110 }
6111 // finish selection
6112 mySelectingArea.finishRectangleSelection();
6113 } else {
6114 // finish moving of single elements
6115 myMoveSingleElement.finishMoveSingleElement();
6116 }
6117}
6118
6119
6120void
6121GNEViewNet::processMoveMouseNetwork(const bool mouseLeftButtonPressed) {
6122 // change "delete last created point" depending if during movement shift key is pressed
6123 if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
6124 myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
6125 } else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
6126 myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
6127 }
6128 // check what type of additional is moved
6129 if (myMoveMultipleElements.isMovingSelection()) {
6130 // move entire selection
6131 myMoveMultipleElements.moveSelection(mouseLeftButtonPressed);
6132 } else if (mySelectingArea.selectingUsingRectangle) {
6133 // update selection corner of selecting area
6134 mySelectingArea.moveRectangleSelection();
6135 } else {
6136 // move single elements
6137 myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
6138 }
6139}
6140
6141
6142void
6144 // filter shapes (because POIs and polygons doesn't interact in demand mode)
6145 myViewObjectsSelector.filterShapes();
6146 // decide what to do based on mode
6147 switch (myEditModes.demandEditMode) {
6149 // filter locked elements
6150 myViewObjectsSelector.filterLockedElements();
6151 // inspect clicked elements
6152 myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
6153 // process click
6154 processClick(eventData);
6155 break;
6156 }
6158 // filter locked elements
6159 myViewObjectsSelector.filterLockedElements();
6160 // get front AC
6161 const auto markAC = myViewObjectsSelector.getAttributeCarrierFront();
6162 // check conditions
6163 if (markAC) {
6164 // check if we are deleting a selection or an single attribute carrier
6165 if (markAC->isAttributeCarrierSelected()) {
6166 myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
6167 } else {
6168 myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
6169 }
6170 } else {
6171 // process click
6172 processClick(eventData);
6173 }
6174 break;
6175 }
6177 // filter locked elements
6178 myViewObjectsSelector.filterLockedElements();
6179 // avoid to select if control key is pressed
6180 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6181 // check if a rect for selecting is being created
6182 if (myMouseButtonKeyPressed.shiftKeyPressed()) {
6183 // begin rectangle selection
6184 mySelectingArea.beginRectangleSelection();
6185 } else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
6186 // process click
6187 processClick(eventData);
6188 }
6189 } else {
6190 // process click
6191 processClick(eventData);
6192 }
6193 break;
6195 // filter locked elements
6196 myViewObjectsSelector.filterLockedElements();
6197 // get front AC
6198 const auto markAC = myViewObjectsSelector.getAttributeCarrierFront();
6199 // check that AC under cursor is a demand element
6200 if (markAC) {
6201 // check if we're moving a set of selected items
6202 if (markAC->isAttributeCarrierSelected()) {
6203 // move selected ACs
6204 myMoveMultipleElements.beginMoveSelection();
6205 } else if (!myMoveSingleElement.beginMoveSingleElementDemandMode()) {
6206 // process click if there isn't movable elements (to move camera using drag an drop)
6207 processClick(eventData);
6208 }
6209 } else {
6210 // process click if there isn't movable elements (to move camera using drag an drop)
6211 processClick(eventData);
6212 }
6213 break;
6214 }
6216 // check if we clicked over a lane
6217 if (myViewObjectsSelector.getLaneFront()) {
6218 // Handle edge click
6219 myViewParent->getRouteFrame()->addEdgeRoute(myViewObjectsSelector.getLaneFront()->getParentEdge(), myMouseButtonKeyPressed);
6220 }
6221 // process click
6222 processClick(eventData);
6223 break;
6224 }
6226 // filter additionals (except TAZs) and demands (except routes)
6227 myViewObjectsSelector.filterAdditionals(true, false);
6228 myViewObjectsSelector.filterDemandElements(false);
6229 // Handle click
6230 myViewParent->getVehicleFrame()->addVehicle(myViewObjectsSelector, myMouseButtonKeyPressed);
6231 // process click
6232 processClick(eventData);
6233 break;
6234 }
6236 // filter additionals (except stoppingPlaces) and demands
6237 myViewObjectsSelector.filterAdditionals(false, true);
6238 myViewObjectsSelector.filterDemandElements(true);
6239 // Handle click
6240 if (myViewParent->getStopFrame()->addStop(myViewObjectsSelector, myMouseButtonKeyPressed)) {
6241 updateViewNet();
6242 }
6243 // process click
6244 processClick(eventData);
6245 break;
6246 }
6248 // filter additionals (except stoppingPlaces and TAZs)
6249 myViewObjectsSelector.filterAdditionals(false, false);
6250 if (myViewParent->getPersonFrame()->getPlanSelector()->getCurrentPlanTagProperties()) {
6251 // special case if we're creating person over walk routes
6252 if (myViewParent->getPersonFrame()->getPlanSelector()->getCurrentPlanTagProperties()->planRoute()) {
6253 myViewObjectsSelector.filterDemandElements(false);
6254 } else {
6255 myViewObjectsSelector.filterDemandElements(true);
6256 }
6257 // Handle click
6258 myViewParent->getPersonFrame()->addPerson(myViewObjectsSelector);
6259 }
6260 // process click
6261 processClick(eventData);
6262 break;
6263 }
6265 // filter additionals (except stoppingPlaces and TAZs)
6266 myViewObjectsSelector.filterAdditionals(false, false);
6267 if (myViewParent->getPersonPlanFrame()->getPlanSelector()->getCurrentPlanTagProperties()) {
6268 // special case if we're creating person over walk routes
6269 if (myViewParent->getPersonPlanFrame()->getPlanSelector()->getCurrentPlanTagProperties()->planRoute()) {
6270 myViewObjectsSelector.filterDemandElements(false);
6271 } else {
6272 myViewObjectsSelector.filterDemandElements(true);
6273 }
6274 // Handle person plan click
6275 myViewParent->getPersonPlanFrame()->addPersonPlanElement(myViewObjectsSelector);
6276 }
6277 // process click
6278 processClick(eventData);
6279 break;
6280 }
6282 // filter additionals (except stoppingPlaces and TAZs) and demands
6283 myViewObjectsSelector.filterAdditionals(false, false);
6284 myViewObjectsSelector.filterDemandElements(true);
6285 // Handle click
6286 myViewParent->getContainerFrame()->addContainer(myViewObjectsSelector);
6287 // process click
6288 processClick(eventData);
6289 break;
6290 }
6292 // filter additionals (except stoppingPlaces and TAZs) and demands
6293 myViewObjectsSelector.filterAdditionals(false, false);
6294 myViewObjectsSelector.filterDemandElements(true);
6295 // Handle container plan click
6296 myViewParent->getContainerPlanFrame()->addContainerPlanElement(myViewObjectsSelector);
6297 // process click
6298 processClick(eventData);
6299 break;
6300 }
6301 default: {
6302 // process click
6303 processClick(eventData);
6304 }
6305 }
6306}
6307
6308
6309void
6311 // check moved items
6312 if (myMoveMultipleElements.isMovingSelection()) {
6313 myMoveMultipleElements.finishMoveSelection();
6314 } else if (mySelectingArea.selectingUsingRectangle) {
6315 // check if we're creating a rectangle selection or we want only to select a lane
6316 if (mySelectingArea.startDrawing) {
6317 mySelectingArea.processRectangleSelection();
6318 }
6319 // finish selection
6320 mySelectingArea.finishRectangleSelection();
6321 } else {
6322 // finish moving of single elements
6323 myMoveSingleElement.finishMoveSingleElement();
6324 }
6325}
6326
6327
6328void
6329GNEViewNet::processMoveMouseDemand(const bool mouseLeftButtonPressed) {
6330 if (mySelectingArea.selectingUsingRectangle) {
6331 // update selection corner of selecting area
6332 mySelectingArea.moveRectangleSelection();
6333 } else {
6334 // move single elements
6335 myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
6336 }
6337}
6338
6339
6340void
6342 // get AC
6343 const auto AC = myViewObjectsSelector.getAttributeCarrierFront();
6344 // decide what to do based on mode
6345 switch (myEditModes.dataEditMode) {
6347 // filter locked elements
6348 myViewObjectsSelector.filterLockedElements();
6349 // process left click in Inspector Frame
6350 if (AC && AC->getTagProperty()->getTag() == SUMO_TAG_TAZ) {
6351 myViewParent->getInspectorFrame()->inspectElement(AC);
6352 } else {
6353 // inspect clicked elements
6354 myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
6355 }
6356 // process click
6357 processClick(eventData);
6358 break;
6359 }
6361 // check conditions
6362 if (AC) {
6363 // check if we are deleting a selection or an single attribute carrier
6364 if (AC->isAttributeCarrierSelected()) {
6365 if (!AC->getGUIGlObject()->isGLObjectLocked()) {
6366 myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
6367 }
6368 } else {
6369 myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
6370 }
6371 } else {
6372 // process click
6373 processClick(eventData);
6374 }
6375 break;
6376 }
6378 // filter locked elements
6379 myViewObjectsSelector.filterLockedElements();
6380 // avoid to select if control key is pressed
6381 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6382 // check if a rect for selecting is being created
6383 if (myMouseButtonKeyPressed.shiftKeyPressed()) {
6384 // begin rectangle selection
6385 mySelectingArea.beginRectangleSelection();
6386 } else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
6387 // process click
6388 processClick(eventData);
6389 }
6390 } else {
6391 // process click
6392 processClick(eventData);
6393 }
6394 break;
6396 // avoid create edgeData if control key is pressed
6397 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6398 if (myViewParent->getEdgeDataFrame()->addEdgeData(myViewObjectsSelector, myMouseButtonKeyPressed)) {
6399 updateViewNet();
6400 }
6401 }
6402 // process click
6403 processClick(eventData);
6404 break;
6406 // avoid create edgeData if control key is pressed
6407 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6408 if (myViewParent->getEdgeRelDataFrame()->addEdgeRelationData(myViewObjectsSelector, myMouseButtonKeyPressed)) {
6409 updateViewNet();
6410 }
6411 }
6412 // process click
6413 processClick(eventData);
6414 break;
6416 // avoid create TAZData if control key is pressed
6417 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6418 if (myViewParent->getTAZRelDataFrame()->setTAZ(myViewObjectsSelector)) {
6419 updateViewNet();
6420 }
6421 }
6422 // process click
6423 processClick(eventData);
6424 break;
6426 // avoid create TAZData if control key is pressed
6427 if (!myMouseButtonKeyPressed.controlKeyPressed()) {
6428 //
6429 }
6430 // process click
6431 processClick(eventData);
6432 break;
6433 default: {
6434 // process click
6435 processClick(eventData);
6436 }
6437 }
6438}
6439
6440
6441void
6443 // check moved items
6444 if (myMoveMultipleElements.isMovingSelection()) {
6445 myMoveMultipleElements.finishMoveSelection();
6446 } else if (mySelectingArea.selectingUsingRectangle) {
6447 // check if we're creating a rectangle selection or we want only to select a lane
6448 if (mySelectingArea.startDrawing) {
6449 mySelectingArea.processRectangleSelection();
6450 }
6451 // finish selection
6452 mySelectingArea.finishRectangleSelection();
6453 } else {
6454 // finish moving of single elements
6455 myMoveSingleElement.finishMoveSingleElement();
6456 }
6457}
6458
6459
6460void
6461GNEViewNet::processMoveMouseData(const bool mouseLeftButtonPressed) {
6462 if (mySelectingArea.selectingUsingRectangle) {
6463 // update selection corner of selecting area
6464 mySelectingArea.moveRectangleSelection();
6465 } else {
6466 // move single elements
6467 myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
6468 }
6469}
6470
6471/****************************************************************************/
FXDEFMAP(GNEViewNet) GNEViewNetMap[]
@ DATA_MEANDATA
mode for create meanData elements
@ DATA_EDGERELDATA
mode for create edgeRelData elements
@ DATA_SELECT
mode for selecting data elements
@ DATA_TAZRELDATA
mode for create TAZRelData elements
@ DATA_INSPECT
mode for inspecting data elements
@ DATA_EDGEDATA
mode for create edgeData elements
@ DATA_DELETE
mode for deleting data elements
Supermode
@brie enum for supermodes
@ NETWORK
Network mode (Edges, junctions, etc..).
@ DATA
Data mode (edgeData, LaneData etc..).
@ DEMAND
Demand mode (Routes, Vehicles etc..).
@ NETWORK_SHAPE
Mode for editing Polygons.
@ NETWORK_DELETE
mode for deleting network elements
@ NETWORK_MOVE
mode for moving network elements
@ NETWORK_WIRE
Mode for editing wires.
@ NETWORK_ADDITIONAL
Mode for editing additionals.
@ NETWORK_TAZ
Mode for editing TAZ.
@ NETWORK_CREATE_EDGE
mode for creating new edges
@ NETWORK_TLS
mode for editing tls
@ NETWORK_CROSSING
Mode for editing crossing.
@ NETWORK_SELECT
mode for selecting network elements
@ NETWORK_INSPECT
mode for inspecting network elements
@ NETWORK_PROHIBITION
Mode for editing connection prohibitions.
@ NETWORK_CONNECT
mode for connecting lanes
@ NETWORK_DECAL
Mode for editing decals.
@ DEMAND_PERSONPLAN
Mode for editing person plan.
@ DEMAND_INSPECT
mode for inspecting demand elements
@ DEMAND_CONTAINER
Mode for editing container.
@ DEMAND_DELETE
mode for deleting demand elements
@ DEMAND_ROUTEDISTRIBUTION
Mode for editing route distributions.
@ DEMAND_PERSON
Mode for editing person.
@ DEMAND_TYPEDISTRIBUTION
Mode for editing type distributions.
@ DEMAND_SELECT
mode for selecting demand elements
@ DEMAND_ROUTE
Mode for editing routes.
@ DEMAND_VEHICLE
Mode for editing vehicles.
@ DEMAND_MOVE
mode for moving demand elements
@ DEMAND_STOP
Mode for editing stops.
@ DEMAND_CONTAINERPLAN
Mode for editing container plan.
@ DEMAND_TYPE
Mode for editing types.
@ MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES
automatically create opposite edge
Definition GUIAppEnum.h:849
@ MID_GNE_ADDSELECT_EDGE
Add edge to selected items - menu entry.
Definition GUIAppEnum.h:851
@ MID_HOTKEY_F3_SUPERMODE_DEMAND
select demand supermode in netedit
Definition GUIAppEnum.h:236
@ MID_GNE_LANE_EDIT_SHAPE
edit lane shape
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS
show all person plans
Definition GUIAppEnum.h:933
@ MID_HOTKEY_SHIFT_S_LOCATESTOP
Locate stop - button.
Definition GUIAppEnum.h:188
@ MID_GNE_LANE_TRANSFORM_BIKE
transform lane to bikelane
@ MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING
toggle TAZRel drawing
Definition GUIAppEnum.h:957
@ MID_GNE_EDGE_REVERSE
reverse an edge
@ MID_GNE_JUNCTION_ADDTLS
Add TLS into junction.
@ MID_ADDSELECT
Add to selected items - menu entry.
Definition GUIAppEnum.h:487
@ MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION
hotkey for mode decal AND type distribution
Definition GUIAppEnum.h:69
@ MID_GNE_LANE_ADD_BUS
add busLane
@ MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition GUIAppEnum.h:823
@ MID_GNE_JUNCTION_RESET_EDGE_ENDPOINTS
reset edge endpoints
@ MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION
move elevation instead of x,y
Definition GUIAppEnum.h:845
@ MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS
hide connections
Definition GUIAppEnum.h:831
@ MID_GNE_REMOVESELECT_EDGE
Remove edge from selected items - Menu Entry.
Definition GUIAppEnum.h:853
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS
show connections
Definition GUIAppEnum.h:829
@ MID_GNE_INTERVALBAR_BEGIN
begin changed in InterbalBar
Definition GUIAppEnum.h:977
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO
toggle draw TAZRel only to
Definition GUIAppEnum.h:963
@ MID_GNE_ADDREVERSE
add reverse element
@ MID_GNE_CONNECTION_SMOOTH_SHAPE
@ brief smooth connection shape
@ MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:949
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS
show TAZ elements
Definition GUIAppEnum.h:835
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON
lock person
Definition GUIAppEnum.h:935
@ MID_HOTKEY_Z_MODE_TAZ_TAZREL
hotkey for mode editing TAZ and TAZRel
Definition GUIAppEnum.h:75
@ MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:923
@ MID_GNE_JUNCTION_CLEAR_CONNECTIONS
clear junction's connections
@ MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS
hotkey for start simulation in SUMO and set editing mode additionals AND stops in netedit
Definition GUIAppEnum.h:43
@ MID_GNE_JUNCTION_SELECT_ROUNDABOUT
select all roundabout nodes and edges of the current roundabout
@ MID_GNE_JUNCTION_RESET_SHAPE
reset junction shape
@ MID_GNE_JUNCTION_RESET_CONNECTIONS
reset junction's connections
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID
show grid
Definition GUIAppEnum.h:921
@ MID_GNE_POLYGON_TRIANGULATE
triangulate polygon
@ MID_GNE_JUNCTION_SPLIT
turn junction into multiple junctions
@ MID_GNE_EDGE_STRAIGHTEN_ELEVATION
interpolate z values linear between junctions
@ MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE
hotkey for perform a single simulation step in SUMO and set delete mode in netedit
Definition GUIAppEnum.h:49
@ MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES
create edges in chain mode
Definition GUIAppEnum.h:847
@ MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:955
@ MID_GNE_POLYGON_CLOSE
close opened polygon
@ MID_GNE_EDGE_SMOOTH
smooth geometry
@ MID_HOTKEY_C_MODE_CONNECT_CONTAINER
hotkey for mode connecting lanes AND container
Definition GUIAppEnum.h:45
@ MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN
hotkey for mode prohibition AND container plan
Definition GUIAppEnum.h:53
@ MID_HOTKEY_SHIFT_O_LOCATEPOI
Locate poi - button.
Definition GUIAppEnum.h:182
@ MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION
hotkey for mode editing overhead wires AND route distributions
Definition GUIAppEnum.h:73
@ MID_HOTKEY_T_MODE_TLS_TYPE
hotkey for mode editing TLS AND Vehicle Types
Definition GUIAppEnum.h:67
@ MID_GNE_LANE_RESET_CUSTOMSHAPE
reset custom shape
@ MID_GNE_EDGE_STRAIGHTEN
remove inner geometry
@ MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES
hide shapes
Definition GUIAppEnum.h:929
@ MID_GNE_LANE_TRANSFORM_BUS
transform lane to busLane
@ MID_GNE_POLYGON_SET_FIRST_POINT
Set a vertex of polygon as first vertex.
@ MID_GNE_SHAPEEDITED_DELETE_GEOMETRY_POINT
delete geometry point in shape edited
@ MID_HOTKEY_SHIFT_A_LOCATEADDITIONAL
Locate additional structure - button.
Definition GUIAppEnum.h:172
@ MID_GNE_LANE_DUPLICATE
duplicate a lane
@ MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS
show additionals
Definition GUIAppEnum.h:951
@ MID_HOTKEY_SHIFT_R_LOCATEROUTE
Locate route - button.
Definition GUIAppEnum.h:186
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES
show junctions as bubbles
Definition GUIAppEnum.h:843
@ MID_GNE_LANE_ADD_GREENVERGE_FRONT
add greenVerge front of current lane
@ MID_GNE_INTERVALBAR_END
end changed in InterbalBar
Definition GUIAppEnum.h:979
@ MID_HOTKEY_SHIFT_W_LOCATEWALKINGAREA
Locate edge - button.
Definition GUIAppEnum.h:194
@ MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION
extend selection
Definition GUIAppEnum.h:837
@ MID_GNE_LANE_REMOVE_GREENVERGE
remove greenVerge
@ MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT
hotkey for stop simulation in SUMO and set select mode in netedit
Definition GUIAppEnum.h:63
@ 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_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS
show sub-additionals
Definition GUIAppEnum.h:833
@ MID_GNE_JUNCTION_REPLACE
turn junction into geometry node
@ MID_HOTKEY_SHIFT_C_LOCATECONTAINER
Locate container - button.
Definition GUIAppEnum.h:174
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS
show all container plans
Definition GUIAppEnum.h:937
@ MID_HOTKEY_SHIFT_V_LOCATEVEHICLE
Locate vehicle - button.
Definition GUIAppEnum.h:192
@ MID_GNE_VIEW_DEFAULT
set default view
Definition GUIAppEnum.h:785
@ MID_HOTKEY_F4_SUPERMODE_DATA
select data supermode in netedit
Definition GUIAppEnum.h:238
@ MID_HOTKEY_SHIFT_L_LOCATEPOLY
Locate polygons - button.
Definition GUIAppEnum.h:180
@ MID_GNE_LANE_REMOVE_BIKE
remove bikelane
@ MID_GNE_SHAPEEDITED_RESET
reset shape
@ MID_HOTKEY_SHIFT_E_LOCATEEDGE
Locate edge - button.
Definition GUIAppEnum.h:176
@ MID_GNE_VIEW_JUPEDSIM
set juPedSim view
Definition GUIAppEnum.h:787
@ MID_GNE_SHAPEEDITED_STRAIGHTEN
straighten shape edited geometry
@ MID_GNE_LANE_RESET_OPPOSITELANE
reset opposite lane
@ MID_GNE_INTERVALBAR_PARAMETER
parameter changed in InterbalBar
Definition GUIAppEnum.h:981
@ MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA
hotkey for mode editing crossing, routes and edge rel datas
Definition GUIAppEnum.h:65
@ MID_GNE_JUNCTION_CONVERT_ROUNDABOUT
convert junction to roundabout
@ MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL
toggle draw TAZ fill
Definition GUIAppEnum.h:959
@ MID_REACHABILITY
show reachability from a given lane
Definition GUIAppEnum.h:533
@ MID_HOTKEY_L_MODE_PERSONPLAN
hotkey for mode person plan
Definition GUIAppEnum.h:57
@ MID_GNE_EDGE_RESET_LENGTH
reset custom lengths
@ MID_HOTKEY_V_MODE_VEHICLE
hotkey for mode create vehicles
Definition GUIAppEnum.h:71
@ MID_HOTKEY_SHIFT_P_LOCATEPERSON
Locate person - button.
Definition GUIAppEnum.h:184
@ MID_HOTKEY_I_MODE_INSPECT
hotkey for mode inspecting object attributes
Definition GUIAppEnum.h:55
@ MID_GNE_LANE_REMOVE_BUS
remove busLane
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:825
@ MID_HOTKEY_SHIFT_J_LOCATEJUNCTION
Locate junction - button.
Definition GUIAppEnum.h:178
@ MID_GNE_POLYGON_SELECT
select elements within polygon boundary
@ MID_GNE_JUNCTION_SPLIT_RECONNECT
turn junction into multiple junctions and reconnect them heuristically
@ MID_GNE_REVERSE
reverse current element
@ MID_OPEN_ADDITIONAL_DIALOG
open additional dialog (used in netedit)
Definition GUIAppEnum.h:471
@ MID_GNE_WALKINGAREA_EDIT_SHAPE
edit crossing shape
@ MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED
hide non-inspected demand element
Definition GUIAppEnum.h:927
@ MID_GNE_JUNCTION_EDIT_SHAPE
edit junction shape
@ MID_GNE_LANE_REMOVE_SIDEWALK
remove sidewalk
@ MID_GNE_SHAPEEDITED_OPEN
open closed shape edited
@ MID_GNE_EDGE_RESET_ENDPOINT
reset default geometry endpoints
@ MID_GNE_INTERVALBAR_GENERICDATATYPE
generic data selected
Definition GUIAppEnum.h:971
@ MID_GNE_LANE_ADD_GREENVERGE_BACK
add greenVerge back of current lane
@ MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY
don't ask before merging junctions
Definition GUIAppEnum.h:841
@ MID_GNE_EDGE_SMOOTH_ELEVATION
smooth elevation with regard to adjoining edges
@ MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES
change all phases
Definition GUIAppEnum.h:839
@ MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES
show shapes
Definition GUIAppEnum.h:953
@ MID_HOTKEY_E_MODE_EDGE_EDGEDATA
hotkey for mode adding edges AND edgeDatas
Definition GUIAppEnum.h:51
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM
toggle draw TAZRel only from
Definition GUIAppEnum.h:961
@ MID_GNE_EDGE_ADD_REVERSE
add reverse edge
@ MID_GNE_EDGE_APPLYTEMPLATE
apply template
@ MID_GNE_EDGE_USEASTEMPLATE
use edge as tempalte
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:821
@ MID_GNE_SHAPEEDITED_SIMPLIFY
simplify shape edited geometry
@ MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition GUIAppEnum.h:925
@ MID_GNE_LANE_ADD_SIDEWALK
add sidewalk
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES
show overlapped routes
Definition GUIAppEnum.h:941
@ MID_GNE_SHAPEEDITED_FINISH
finish editing shape edited
@ MID_GNE_RESET_GEOMETRYPOINT
reset geometry point
@ MID_GNE_CONNECTION_EDIT_SHAPE
edit connection shape
@ MID_GNE_SHAPEEDITED_CLOSE
close opened shape edited
@ MID_GNE_POI_ATTACH
attach POI to lane
@ MID_GNE_INTERVALBAR_DATASET
data set selected
Definition GUIAppEnum.h:973
@ MID_HOTKEY_SHIFT_T_LOCATETLS
Locate TLS - button.
Definition GUIAppEnum.h:190
@ MID_GNE_LANE_TRANSFORM_SIDEWALK
transform lane to sidewalk
@ MID_GNE_SHAPEEDITED_SET_FIRST_POINT
Set a vertex of shape edited as first vertex.
@ MID_GNE_LANE_ADD_BIKE
add bikelane
@ MID_HOTKEY_M_MODE_MOVE_MEANDATA
hotkey for mode moving element AND mean data
Definition GUIAppEnum.h:59
@ MID_HOTKEY_F2_SUPERMODE_NETWORK
select network supermode in netedit
Definition GUIAppEnum.h:234
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER
lock container
Definition GUIAppEnum.h:939
@ MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES
select edges
Definition GUIAppEnum.h:827
@ 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_POI_TRANSFORM_POIGEO
Transform to POI Geo.
@ MID_GNE_POI_RELEASE
release POI from lane
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS
show all trips
Definition GUIAppEnum.h:931
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID
show grid
Definition GUIAppEnum.h:819
@ MID_GNE_INTERVALBAR_LIMITED
enable/disable show data elements by interval
Definition GUIAppEnum.h:975
@ MID_GNE_EDGE_EDIT_ENDPOINT
change default geometry endpoints
@ MID_GNE_POLYGON_DELETE_GEOMETRY_POINT
delete geometry point
@ MID_HOTKEY_P_MODE_POLYGON_PERSON
hotkey for mode creating polygons
Definition GUIAppEnum.h:61
@ MID_GNE_JUNCTION_ADDJOINTLS
Add join TLS into junctions.
@ MID_GNE_CROSSING_EDIT_SHAPE
edit crossing shape
@ MID_GNE_POLYGON_OPEN
open closed polygon
@ MID_GNE_POI_TRANSFORM_POI
Transform to POI.
@ MID_GNE_POLYGON_SIMPLIFY_SHAPE
simplify polygon geometry
@ MID_REMOVESELECT
Remove from selected items - Menu Entry.
Definition GUIAppEnum.h:489
GUICompleteSchemeStorage gSchemeStorage
@ MOVEELEMENT
move element cursor
Definition GUICursors.h:54
@ MOVEVIEW
move view cursor
Definition GUICursors.h:36
@ SELECT_LANE
select lanecursor
Definition GUICursors.h:45
@ DEFAULT
default cursor
Definition GUICursors.h:33
@ SELECT
select cursor
Definition GUICursors.h:39
@ DELETE_CURSOR
delete cursor
Definition GUICursors.h:42
@ INSPECT_LANE
inspect lane cursor
Definition GUICursors.h:51
@ INSPECT
inspect cursor
Definition GUICursors.h:48
#define GUIDesignButtonPopup
checkable button placed in popup (for example, locate buttons)
Definition GUIDesigns.h:130
#define GUIDesignVerticalSeparator
vertical separator
Definition GUIDesigns.h:497
unsigned int GUIGlID
Definition GUIGlObject.h:44
GUIGlObjectType
@ GLO_TAZRELDATA
TAZ relation data.
@ GLO_WALKINGAREA
a walkingArea
@ GLO_TEMPORALSHAPE
temporal shape (used in netedit)
@ GLO_TESTELEMENT
test element (used in netedit)
@ GLO_JUNCTION
a junction
@ GLO_LANE
a lane
@ GLO_CONNECTION
a connection
@ GLO_EDGE
an edge
@ GLO_VEHICLE
a vehicle
@ GLO_TLLOGIC
a tl-logic
@ GLO_CROSSING
a tl-logic
GUIViewObjectsHandler gViewObjectsHandler
GUIViewUpdater gViewUpdater
@ LOCATEADD
Definition GUIIcons.h:154
@ MODEDELETE
Definition GUIIcons.h:365
@ LOCATEVEHICLE
Definition GUIIcons.h:148
@ MODETLS
Definition GUIIcons.h:369
@ LOCATEWALKINGAREA
Definition GUIIcons.h:147
@ LOCATEPERSON
Definition GUIIcons.h:151
@ LOCATEROUTE
Definition GUIIcons.h:149
@ LOCATECONTAINER
Definition GUIIcons.h:152
@ LOCATEPOLY
Definition GUIIcons.h:156
@ LOCATEJUNCTION
Definition GUIIcons.h:145
@ LOCATESTOP
Definition GUIIcons.h:150
@ LOCATEPOI
Definition GUIIcons.h:155
@ LOCATEEDGE
Definition GUIIcons.h:146
@ MODESELECT
Definition GUIIcons.h:368
@ LOCATETLS
Definition GUIIcons.h:153
@ CONNECTION
Definition GUIIcons.h:417
GUIPropertyScheme< RGBColor > GUIColorScheme
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
const std::string invalid_return< std::string >::value
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_IGNORING
vehicles ignoring classes
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_BUS
vehicle is a bus
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_DATAINTERVAL
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ GNE_TAG_EDGEREL_SINGLE
@ SUMO_TAG_POI
begin/end of the description of a Point of interest
@ SUMO_TAG_VEHICLE
description of a vehicle
@ GNE_TAG_FLOW_ROUTE
a flow definition using a route instead of a from-to edges route
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ GNE_TAG_POIGEO
Point of interest over view with GEO attributes.
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_CROSSING
crossing between edges for pedestrians
@ SUMO_TAG_POLY
begin/end of the description of a polygon
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ GNE_TAG_POILANE
Point of interest over Lane.
@ SUMO_TAG_DATASET
@ GNE_TAG_JPS_OBSTACLE
polygon used for draw juPedSim obstacles
@ SUMO_TAG_TAZREL
a relation between two TAZs
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ GNE_TAG_JPS_WALKABLEAREA
polygon used for draw juPedSim walkable areas
@ SUMO_TAG_VIEWSETTINGS
@ SUMO_TAG_VIEWPORT
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_LANE
@ SUMO_ATTR_LON
@ GNE_ATTR_OPPOSITE
to busStop (used by personPlans)
@ SUMO_ATTR_Y
@ SUMO_ATTR_X
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_CUSTOMSHAPE
whether a given shape is user-defined
@ SUMO_ATTR_POSITION_LAT
@ SUMO_ATTR_ZOOM
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_ANGLE
@ GNE_ATTR_SHAPE_END
last coordinate of edge shape
@ SUMO_ATTR_TLID
link,node: the traffic light id responsible for this link
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_LAT
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_LENGTH
@ SUMO_ATTR_ID
@ GNE_ATTR_SHAPE_START
first coordinate of edge shape
@ SUMO_ATTR_POSITION
const double SUMO_const_laneWidth
Definition StdDefs.h:52
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
const unsigned char TLS[]
Definition TLS.cpp:22
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
void parseSumoBaseObject(CommonXMLStructure::SumoBaseObject *obj)
parse SumoBaseObject (it's called recursivelly)
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:75
double ymin() const
Returns minimum y-coordinate.
Definition Boundary.cpp:127
double xmin() const
Returns minimum x-coordinate.
Definition Boundary.cpp:115
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:340
double ymax() const
Returns maximum y-coordinate.
Definition Boundary.cpp:133
double xmax() const
Returns maximum x-coordinate.
Definition Boundary.cpp:121
void addBoolAttribute(const SumoXMLAttr attr, const bool value)
add bool attribute into current SumoBaseObject node
void addDoubleAttribute(const SumoXMLAttr attr, const double value)
add double attribute into current SumoBaseObject node
void addStringAttribute(const SumoXMLAttr attr, const std::string &value)
add string attribute into current SumoBaseObject node
static void drawLine(const Position &beg, double rot, double visLength)
Draws a thin line.
Definition GLHelper.cpp:437
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:653
static void drawOutlineCircle(double radius, double iRadius, int steps=8)
Draws an unfilled circle around (0,0).
Definition GLHelper.cpp:595
static void drawFilledCircle(const double widradiusth, const int steps=8)
Draws a filled circle around (0,0).
Definition GLHelper.cpp:568
static void popMatrix()
pop matrix
Definition GLHelper.cpp:135
static void pushMatrix()
push matrix
Definition GLHelper.cpp:122
virtual void openAdditionalDialog()
open Additional Dialog
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
const std::string getID() const override
get ID (all Attribute Carriers have one)
const std::string & getTagStr() const
get tag assigned to this object in string format
const std::string & getFilename() const
get filename in which save this AC
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
virtual GUIGlObject * getGUIGlObject()=0
get GUIGlObject associated with this AttributeCarrier
static void changeAttribute(GNEAttributeCarrier *AC, SumoXMLAttr key, const std::string &value, GNEUndoList *undoList, const bool force=false)
change attribute
void smootShape()
smoothShape
void smooth(GNEUndoList *undoList)
make geometry smooth
Definition GNEEdge.cpp:2341
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
Definition GNEEdge.cpp:1226
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:753
void smoothElevation(GNEUndoList *undoList)
smooth elevation with regard to adjoining edges
Definition GNEEdge.cpp:2353
std::vector< GNEEdge * > getOppositeEdges() const
get opposite edges
Definition GNEEdge.cpp:687
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:1022
void editEndpoint(Position pos, GNEUndoList *undoList)
makes pos the new geometry endpoint at the appropriate end, or remove current existent endpoint
Definition GNEEdge.cpp:775
Position getSplitPos(const Position &clickPos)
Definition GNEEdge.cpp:759
void straightenElevation(GNEUndoList *undoList)
interpolate z values linear between junctions
Definition GNEEdge.cpp:2258
void resetEndpoint(const Position &pos, GNEUndoList *undoList)
restores the endpoint to the junction position at the appropriate end
Definition GNEEdge.cpp:827
const GNEHierarchicalContainerParents< GNEDemandElement * > & getParentDemandElements() const
get parent demand elements
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
const GNEHierarchicalContainerParents< GNEJunction * > & getParentJunctions() const
get parent junctions
const std::vector< GNEEdge * > & getGNEIncomingEdges() const
Returns incoming GNEEdges.
std::string getAttribute(SumoXMLAttr key) const override
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
const std::vector< GNEEdge * > & getGNEOutgoingEdges() const
Returns incoming GNEEdges.
NBNode * getNBNode() const
Return net build node.
const PositionVector & getLaneShape() const
get elements shape
Definition GNELane.cpp:232
int getIndex() const
returns the index of the lane
Definition GNELane.cpp:624
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList) override
Definition GNELane.cpp:763
GNEEdge * getParentEdge() const
get parent edge
Definition GNELane.cpp:214
A NBNetBuilder extended by visualisation and editing capabilities.
Definition GNENet.h:42
void requireRecompute()
inform the net about the need for recomputation
Definition GNENet.cpp:1598
void initGNEConnections()
initialize GNEConnections
Definition GNENet.cpp:2964
void closeShapeEdited(GNEUndoList *undoList)
close shape edited
void setFirstGeometryPointShapeEdited(const int index, GNEUndoList *undoList)
set first geometry point shape edited
void openShapeEdited(GNEUndoList *undoList)
open shape edited
int getGeometryPointUnderCursorShapeEdited() const
get index geometry point under cursor of shape edited
void simplifyShapeEdited(GNEUndoList *undoList)
simplify shape edited
void straigthenShapeEdited(GNEUndoList *undoList)
straighten shape edited
void deleteGeometryPointShapeEdited(const int index, GNEUndoList *undoList)
delete geometry point shape edited
void resetShapeEdited(GNEUndoList *undoList)
reset shape edited
int getVertexIndex(Position pos, bool snapToGrid)
return index of a vertex of shape, or of a new vertex if position is over an shape's edge
Definition GNEPoly.cpp:358
void closePolygon(bool allowUndo=true)
close polygon
Definition GNEPoly.cpp:437
void changeFirstGeometryPoint(int oldIndex, bool allowUndo=true)
change first geometry point
Definition GNEPoly.cpp:458
void deleteGeometryPoint(const Position &pos, bool allowUndo=true)
delete the geometry point closest to the given pos
Definition GNEPoly.cpp:374
CommonXMLStructure::SumoBaseObject * getSumoBaseObject() const
get SUMOBaseObject with all polygon attributes
Definition GNEPoly.cpp:530
void simplifyShape(bool allowUndo=true)
replace the current shape with a rectangle
Definition GNEPoly.cpp:498
void openPolygon(bool allowUndo=true)
open polygon
Definition GNEPoly.cpp:416
static void addReverse(GNEDemandElement *element)
add reverse for given demand element
static void reverse(GNEDemandElement *element)
reverse given demand element
bool isContainer() const
return true if tag correspond to a container element
bool isPlacedInRTree() const
return true if Tag correspond to an element that has to be placed in RTREE
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
bool hasDialog() const
return true if tag correspond to an element that can be edited using a dialog
bool isAdditionalElement() const
return true if tag correspond to an additional element (note: this include TAZ, shapes and wires)
bool isPerson() const
return true if tag correspond to a person element
class used for group inspected elements
class used to group all variables related to interval bar
class used for group front elements
class used to group all variables related with objects under cursor after a click over view
GNEViewNetHelper::EditNetworkElementShapes myEditNetworkElementShapes
struct for grouping all variables related with edit shapes
Definition GNEViewNet.h:713
long onCmdToggleShowDemandElementsNetwork(FXObject *, FXSelector, void *)
toggle show demand elements (network)
long onMouseMove(FXObject *, FXSelector, void *) override
called when user moves mouse
void openObjectDialogAtCursor(const FXEvent *ev) override
open object dialog
long onCmdClosePolygon(FXObject *, FXSelector, void *)
close opened polygon
bool isCurrentlyMovingElements() const
check if an element is being moved
long onCmdEditCrossingShape(FXObject *, FXSelector, void *)
edit crossing shape
void processMoveMouseNetwork(const bool mouseLeftButtonPressed)
process move mouse function in Supermode Network
const GNEViewNetHelper::DataViewOptions & getDataViewOptions() const
get data view options
GNENet * getNet() const
get the net object
long onCmdSetFirstGeometryPoint(FXObject *, FXSelector, void *)
set as first geometry point the closes geometry point
long onCmdEdgeUseAsTemplate(FXObject *, FXSelector, void *)
use edge as template
long onCmdSmoothConnectionShape(FXObject *, FXSelector, void *)
edit connection shape
GNEViewNetHelper::CommonCheckableButtons myCommonCheckableButtons
variable used to save checkable buttons for common supermodes
Definition GNEViewNet.h:651
void hotkeyBackSpace()
handle backspace keypress
GNEViewNetHelper::MarkFrontElements myMarkFrontElements
front element
Definition GNEViewNet.h:722
GNEDemandElement * myLastCreatedRoute
last created route
Definition GNEViewNet.h:737
const GNEViewNetHelper::EditModes & getEditModes() const
get edit modes
long onCmdAddSelected(FXObject *, FXSelector, void *)
select AC under cursor
const GNEViewNetHelper::EditNetworkElementShapes & getEditNetworkElementShapes() const
get Edit Shape module
GNECrossing * getCrossingAtPopupPosition()
try to retrieve a crossing at popup position
std::vector< std::string > getPOIParamKeys() const override
return list of available POI parameters
void updateNetworkModeSpecificControls()
updates Network mode specific controls
long onCmdAddTLS(FXObject *, FXSelector, void *)
add TLS
long onCmdSmoothEdges(FXObject *, FXSelector, void *)
smooth geometry
long onCmdStraightenEdges(FXObject *, FXSelector, void *)
makes selected edges straight
const GNEViewNetHelper::MouseButtonKeyPressed & getMouseButtonKeyPressed() const
get Key Pressed module
void updateCursor()
update cursor after every click/key press/release
void updateDataModeSpecificControls()
updates Data mode specific controls
GNEEdge * getEdgeAtPopupPosition()
try to retrieve an edge at popup position
long onCmdToggleShowDemandElementsData(FXObject *, FXSelector, void *)
toggle show demand elements (data)
GNEViewNetHelper::EditModes myEditModes
variable used to save variables related with edit moves modes
Definition GNEViewNet.h:632
long onCmdReplaceJunction(FXObject *, FXSelector, void *)
replace node by geometry
bool restrictLane(GNELane *lane, SUMOVehicleClass vclass)
restrict lane
long onCmdSplitJunction(FXObject *, FXSelector, void *)
split junction into multiple junctions
void drawGrid() const
draw grid and update grid button
void deleteDemandAttributeCarrier(const GNEAttributeCarrier *AC)
delete given demand attribute carriers
long onCmdClearConnections(FXObject *, FXSelector, void *)
clear junction connections
void abortOperation(bool clearSelection=true)
abort current edition operation
long onCmdToggleTAZDrawFill(FXObject *, FXSelector, void *)
toggle TAZdrawFill
long onCmdResetEndPoints(FXObject *, FXSelector, void *)
reset edge end points
void updateObjectsInPosition(const Position &pos)
update objects and boundaries in position
GNEViewNetHelper::TestingMode myTestingMode
variable used to save variables related with testing mode
Definition GNEViewNet.h:635
GNEDemandElement * getLastCreatedRoute() const
get last created route
GNEViewNetHelper::InspectedElements & getInspectedElements()
get inspected elements
long onCmdToggleDrawSpreadVehicles(FXObject *, FXSelector, void *)
toggle draw vehicles in begin position or spread in lane
GNEPOI * getPOIAtPopupPosition()
try to retrieve a POILane at popup position
GNEViewNetHelper::SelectingArea mySelectingArea
variable used for grouping all variables related with selecting areas
Definition GNEViewNet.h:710
GNENetworkElement * getShapeEditedAtPopupPosition()
try to retreive a edited shape at popup position
const GNEViewNetHelper::MoveSingleElementModul & getMoveSingleElementValues() const
get move single element values
long onCmdToggleShowConnections(FXObject *, FXSelector, void *)
toggle show connections
long onCmdLaneReachability(FXObject *, FXSelector sel, void *)
show lane reachability
long onCmdToggleShowTAZElements(FXObject *, FXSelector, void *)
toggle show TAZ elements
long onLeftBtnPress(FXObject *, FXSelector, void *) override
GNEViewNetHelper::VehicleOptions myVehicleOptions
variable used to save variables related with vehicle options
Definition GNEViewNet.h:696
GNEViewNetHelper::NetworkCheckableButtons myNetworkCheckableButtons
variable used to save checkable buttons for Supermode Network
Definition GNEViewNet.h:654
long onCmdCloseShapeEdited(FXObject *, FXSelector, void *)
close opened shape edited
bool myCreatedPopup
flag for mark if during this frame a popup was created (needed to avoid problems in linux with Cursor...
Definition GNEViewNet.h:743
void openSelectDialogAtCursor(const std::vector< GUIGlObject * > &GLObjects)
open select dialog at cursor
long onCmdSimplifyShapeEdited(FXObject *, FXSelector, void *)
void processClick(void *eventData)
Auxiliary function used by onLeftBtnPress(...).
void buildViewToolBars(GUIGlChildWindow *v) override
builds the view toolbars
void drawNeteditAttributesReferences()
draw circle in testing mode (needed for grid)
long onCmdSimplifyShape(FXObject *, FXSelector, void *)
simply shape of current polygon
GNELane * getLaneAtPopupPosition()
try to retrieve a lane at popup position
GNEViewNetHelper::MouseButtonKeyPressed myMouseButtonKeyPressed
variable used to save key status after certain events
Definition GNEViewNet.h:643
bool askMergeJunctions(const GNEJunction *movedJunction, const GNEJunction *targetJunction, bool &alreadyAsked)
ask merge junctions
GNEViewNetHelper::IntervalBar myIntervalBar
variable used to save IntervalBar
Definition GNEViewNet.h:679
GNEViewParent * myViewParent
view parent
Definition GNEViewNet.h:725
bool showJunctionAsBubbles() const
return true if junction must be showed as bubbles
bool changeAllPhases() const
change all phases
long onCmdEditJunctionShape(FXObject *, FXSelector, void *)
edit junction shape
long onCmdToggleMoveElevation(FXObject *, FXSelector, void *)
toggle move elevation
GNEWalkingArea * getWalkingAreaAtPopupPosition()
try to retrieve a walkingArea at popup position
long onCmdToggleShowAllPersonPlans(FXObject *, FXSelector, void *)
toggle show all person plans in super mode demand
long onLeftBtnRelease(FXObject *, FXSelector, void *) override
called when user releases mouse's left button
long onCmdOpenAdditionalDialog(FXObject *, FXSelector, void *)
open additional dialog
long onCmdToggleTAZRelOnlyTo(FXObject *, FXSelector, void *)
toggle TAZRez only to
long onCmdEgeApplyTemplate(FXObject *, FXSelector, void *)
apply template to edge
long onCmdSetNeteditView(FXObject *, FXSelector sel, void *)
called when a new view is set
const GNEViewNetHelper::NetworkViewOptions & getNetworkViewOptions() const
get network view options
void hotkeyFocusFrame()
handle focus frame keypress
long onCmdToggleChainEdges(FXObject *, FXSelector, void *)
toggle chain edges
GNEViewNetHelper::DemandViewOptions myDemandViewOptions
variable used to save variables related with view options in supermode Demand
Definition GNEViewNet.h:671
void drawTemporalJunctionTLSLines() const
draw temporal Junction TLS Lines
long onCmdLaneOperation(FXObject *, FXSelector sel, void *)
add/remove/restrict lane
void processMoveMouseData(const bool mouseLeftButtonPressed)
process move mouse function in Supermode Data
GNEFrame * myCurrentFrame
the current frame
Definition GNEViewNet.h:731
bool autoSelectNodes()
whether to autoselect nodes or to lanes
void drawTemporalRoundabout() const
draw temporal roundabout
void deleteDataAttributeCarrier(const GNEAttributeCarrier *AC)
delete data attribute carriers
long onCmdToggleLockContainer(FXObject *, FXSelector, void *)
toggle lock container in super mode demand
GNEUndoList * myUndoList
a reference to the undolist maintained in the application
Definition GNEViewNet.h:734
GNEViewNetHelper::NetworkViewOptions myNetworkViewOptions
variable used to save variables related with view options in supermode Network
Definition GNEViewNet.h:668
GUIGlID getToolTipID() override
returns the id of object under cursor to show their tooltip
long onCmdResetEdgeEndPoints(FXObject *, FXSelector, void *)
edit junction shape
void buildEditModeControls()
create edit mode buttons and elements
GNEViewNetHelper::MoveSingleElementModul myMoveSingleElement
modul used for moving single element
Definition GNEViewNet.h:685
int getDrawingToggle() const
get draw toggle (used to avoid drawing junctions twice)
GNEViewNetHelper::DataCheckableButtons myDataCheckableButtons
variable used to save checkable buttons for Supermode Data
Definition GNEViewNet.h:660
long onCmdToggleShowGrid(FXObject *, FXSelector, void *)
toggle show grid
void processLeftButtonPressDemand(void *eventData)
process left button press function in Supermode Demand
GNEDemandElement * getDemandElementAtPopupPosition()
try to retrieve a demand element at popup position
GNEViewNetHelper::TimeFormat myTimeFormat
variable used for grouping all variables related with switch time
Definition GNEViewNet.h:707
long onLeaveConvertRoundabout(FXObject *, FXSelector, void *)
leave to convert junction to roundabout
GNEViewNetHelper::IntervalBar & getIntervalBar()
get interval bar
long onCmdEditLaneShape(FXObject *, FXSelector, void *)
edit lane shape
GNEViewNetHelper::MarkFrontElements & getMarkFrontElements()
get marked for drawing front elements
long onCmdToggleHideNonInspecteDemandElements(FXObject *, FXSelector, void *)
toggle hide non inspected demand elements
GNEViewParent * getViewParent() const
get the net object
long onCmdToggleDrawJunctionShape(FXObject *, FXSelector, void *)
toggle draw junction shape
bool checkOverLockedElement(const GUIGlObject *GLObject, const bool isSelected) const
check if given element is locked (used for drawing select and delete contour)
long onCmdStraightenShapeEdited(FXObject *, FXSelector, void *)
straight shape edited
long onCmdAddReversedEdge(FXObject *, FXSelector, void *)
add reversed edge
void processLeftButtonReleaseNetwork()
process left button release function in Supermode Network
long onCmdDeleteGeometryPointShapeEdited(FXObject *, FXSelector, void *)
delete the closes geometry point in shape edited
long onMiddleBtnPress(FXObject *, FXSelector, void *) override
called when user press mouse's left button
bool checkSelectEdges() const
check if select edges (toggle using button or shift)
long onCmdAddReversedEdgeDisconnected(FXObject *, FXSelector, void *)
add reversed edge disconnected
long onCmdIntervalBarGenericDataType(FXObject *, FXSelector, void *)
change generic data type in interval bar
long onCmdConvertRoundabout(FXObject *, FXSelector, void *)
convert junction to roundabout
long onCmdRemoveEdgeSelected(FXObject *, FXSelector, void *)
unselect Edge under cursor
long onCmdAddReverse(FXObject *, FXSelector, void *)
add a reverse demand element
long onCmdToggleShowShapes(FXObject *, FXSelector, void *)
toggle show shapes in super mode data
long onCmdToggleMergeAutomatically(FXObject *, FXSelector, void *)
toggle warn for merge
long onCmdOpenPolygon(FXObject *, FXSelector, void *)
open closed polygon
GNEViewNetHelper::InspectedElements myInspectedElements
inspected element
Definition GNEViewNet.h:719
long onCmdSetCustomGeometryPoint(FXObject *, FXSelector, void *)
set custom geometry point
bool removeRestrictedLane(GNELane *lane, SUMOVehicleClass vclass)
remove restricted lane
long onCmdIntervalBarDataSet(FXObject *, FXSelector, void *)
change data set in interval bar
GNEViewNetHelper::SaveElements & getSaveElements()
get variable used to save elements
void processLeftButtonReleaseDemand()
process left button release function in Supermode Demand
const GNEViewNetHelper::TestingMode & getTestingMode() const
get testing mode
GNEUndoList * getUndoList() const
get the undoList object
void processLeftButtonPressData(void *eventData)
process left button press function in Supermode Data
long onCmdTransformPOI(FXObject *, FXSelector, void *)
transform to POI
void saveVisualizationSettings() const
GNEViewNetHelper::SaveElements mySaveElements
variable used for grouping all variables related with salve elements
Definition GNEViewNet.h:704
const GNEViewNetHelper::MoveMultipleElementModul & getMoveMultipleElementValues() const
get move multiple element values
void deleteNetworkAttributeCarrier(const GNEAttributeCarrier *AC)
delete given network attribute carriers
GNEViewNetHelper::LockManager myLockManager
lock manager
Definition GNEViewNet.h:716
long onCmdAddEdgeSelected(FXObject *, FXSelector, void *)
select Edge under cursor
long onCmdIntervalBarSetEnd(FXObject *, FXSelector, void *)
change end in interval bar
long onCmdTransformPOIGEO(FXObject *, FXSelector, void *)
transform to POIGEO
const GNEViewNetHelper::ViewObjectsSelector & getViewObjectsSelector() const
get objects under cursor
void drawTemporalDrawingShape() const
draw temporal polygon shape in Polygon Mode
void setLastCreatedRoute(GNEDemandElement *lastCreatedRoute)
set last created route
void drawTestsCircle() const
draw circle in testing mode (needed for grid)
long onCmdSplitEdgeBidi(FXObject *, FXSelector, void *)
split edge at cursor position
long onCmdAddJoinTLS(FXObject *, FXSelector, void *)
add Join TLS
GNEJunction * getJunctionAtPopupPosition()
try to retrieve a junction at popup position
void drawTemporalSplitJunction() const
draw temporal split junction in create edge mode
long onCmdSetSupermode(FXObject *, FXSelector sel, void *)
long onCmdToggleExtendSelection(FXObject *, FXSelector, void *)
toggle extend selection
long onCmdTriangulatePolygon(FXObject *, FXSelector, void *)
triangulate polygon
long onKeyPress(FXObject *o, FXSelector sel, void *data) override
called when user press a key
GNEViewNetHelper::DemandCheckableButtons myDemandCheckableButtons
variable used to save checkable buttons for Supermode Demand
Definition GNEViewNet.h:657
bool aksChangeSupermode(const std::string &operation, Supermode expectedSupermode)
ask about change supermode
GNETAZ * getTAZAtPopupPosition()
try to retrieve a TAZ at popup position
long onCmdSetMode(FXObject *, FXSelector sel, void *)
called when user press a mode button (Network or demand)
long onCmdResetEdgeEndpoint(FXObject *, FXSelector, void *)
change geometry endpoint
long onCmdIntervalBarSetBegin(FXObject *, FXSelector, void *)
change begin in interval bar
long onCmdResetLength(FXObject *, FXSelector, void *)
reset custom edge lengths
std::vector< std::string > getEdgeLaneParamKeys(bool edgeKeys) const override
return list of available edge parameters
long onCmdSelectPolygonElements(FXObject *, FXSelector, void *)
select elements within polygon boundary
long onCmdSetFirstGeometryPointShapeEdited(FXObject *, FXSelector, void *)
set first geometry point in shape edited
long onCmdRemoveSelected(FXObject *, FXSelector, void *)
unselect AC under cursor
long onCmdDeleteGeometryPoint(FXObject *, FXSelector, void *)
delete the closes geometry point
void doInit() override
called after some features are already initialized
long onCmdDuplicateLane(FXObject *, FXSelector, void *)
duplicate selected lane
long onRightBtnRelease(FXObject *, FXSelector, void *) override
called when user releases mouse's right button
void processLeftButtonPressNetwork(void *eventData)
mouse process functions
void hotkeyEnter()
handle enter keypress
GNEConnection * getConnectionAtPopupPosition()
try to retrieve a connection at popup position
long onCmdOpenShapeEdited(FXObject *, FXSelector, void *)
open closed shape edited
long onRightBtnPress(FXObject *, FXSelector, void *) override
called when user press mouse's right button
void recalculateBoundaries() override
recalculate boundaries
void buildColorRainbow(const GUIVisualizationSettings &s, GUIColorScheme &scheme, int active, GUIGlObjectType objectType, const GUIVisualizationRainbowSettings &rs) override
recalibrate color scheme according to the current value range
long onCmdToggleShowOverlappedRoutes(FXObject *, FXSelector, void *)
toggle hide non inspected demand elements
long onCmdToggleAutoOppositeEdge(FXObject *, FXSelector, void *)
toggle autoOpposite edge
long onCmdSplitEdge(FXObject *, FXSelector, void *)
split edge at cursor position
GNEViewNetHelper::LockManager & getLockManager()
get lock manager
long onCmdStraightenEdgesElevation(FXObject *, FXSelector, void *)
interpolate z values linear between junctions
void updateControls()
update control contents after undo/redo or recompute
~GNEViewNet()
destructor
GNEViewNetHelper::MoveMultipleElementModul myMoveMultipleElements
modul used for moving multiple elements
Definition GNEViewNet.h:688
long onCmdSplitJunctionReconnect(FXObject *, FXSelector, void *)
split junction into multiple junctions and reconnect them
long onCmdFinishShapeEdited(FXObject *, FXSelector, void *)
finish shape edited
void hotkeyDel()
handle del keypress
long onCmdToggleChangeAllPhases(FXObject *, FXSelector, void *)
toggle change all phases
long onEnterConvertRoundabout(FXObject *, FXSelector, void *)
enter to convert junction to roundabout
bool myDrawPreviewRoundabout
draw preview roundabout
Definition GNEViewNet.h:740
void redrawPathElementContours()
redraw elements only for calculating boundary
GNEViewNet()
FOX needs this.
long onCmdToggleTAZRelDrawing(FXObject *, FXSelector, void *)
toggle TAZRel drawing
long onCmdToggleShowJunctionBubbles(FXObject *, FXSelector, void *)
toggle show junction bubbles
bool selectingDetectorsTLSMode() const
check if we're selecting detectors in TLS mode
bool selectingJunctionsTLSMode() const
check if we're selecting junctions in TLS mode
long onCmdToggleShowAdditionalSubElements(FXObject *, FXSelector, void *)
toggle show additional sub-elements
long onCmdSmoothEdgesElevation(FXObject *, FXSelector, void *)
smooth elevation with regard to adjoining edges
long onCmdToggleShowAllContainerPlans(FXObject *, FXSelector, void *)
toggle show all container plans in super mode demand
GNEViewNetHelper::VehicleTypeOptions myVehicleTypeOptions
variable used to save variables related with vehicle type options
Definition GNEViewNet.h:699
long onCmdResetJunctionShape(FXObject *, FXSelector, void *)
reset junction shape
long onCmdToggleTAZRelOnlyFrom(FXObject *, FXSelector, void *)
toggle TAZRez only from
long onCmdResetShapeEdited(FXObject *, FXSelector, void *)
reset shape edited
long onKeyRelease(FXObject *o, FXSelector sel, void *data) override
called when user release a key
long onCmdIntervalBarSetParameter(FXObject *, FXSelector, void *)
change parameter in interval bar
void drawTemporalE1TLSLines() const
draw temporal E1 TLS Lines
int doPaintGL(int mode, const Boundary &drawingBoundary) override
do paintGL
long onCmdReverseEdge(FXObject *, FXSelector, void *)
reverse edge
bool setColorScheme(const std::string &name) override
set color scheme
void processLeftButtonReleaseData()
process left button release function in Supermode Data
std::vector< std::string > getEdgeDataAttrs() const override
return list of loaded edgeData attributes
long onCmdToggleShowAdditionals(FXObject *, FXSelector, void *)
toggle show additionals in super mode data
long onCmdToggleLockPerson(FXObject *, FXSelector, void *)
toggle lock person in super mode demand
GNEViewNetHelper::TimeFormat & getTimeFormat()
get variable used to switch between time formats
GNENet * myNet
Pointer to current net. (We are not responsible for deletion).
Definition GNEViewNet.h:728
GNEPoly * getPolygonAtPopupPosition()
try to retrieve a polygon at popup position
long onMiddleBtnRelease(FXObject *, FXSelector, void *) override
called when user releases mouse's left button
long onCmdToggleSelectEdges(FXObject *, FXSelector, void *)
toggle select edges
GNEViewNetHelper::DataViewOptions myDataViewOptions
variable used to save variables related with view options in supermode Data
Definition GNEViewNet.h:674
int myDrawingToggle
drawin toggle (used in drawGLElements to avoid draw elements twice)
Definition GNEViewNet.h:746
long onCmdToggleShowTrips(FXObject *, FXSelector, void *)
toggle show all trips in super mode demand
long onCmdToggleHideShapes(FXObject *, FXSelector, void *)
toggle hide shapes in super mode demand
long onCmdEditEdgeEndpoint(FXObject *, FXSelector, void *)
change geometry endpoint
const GNEViewNetHelper::DemandViewOptions & getDemandViewOptions() const
get demand view options
long onCmdToggleHideConnections(FXObject *, FXSelector, void *)
toggle hide connections
void openDeleteDialogAtCursor(const std::vector< GUIGlObject * > &GLObjects)
open delete dialog at cursor
long onCmdResetConnections(FXObject *, FXSelector, void *)
reset junction connections
long onCmdResetLaneCustomShape(FXObject *, FXSelector, void *)
reset custom shapes of selected lanes
bool addRestrictedLane(GNELane *lane, SUMOVehicleClass vclass, const bool insertAtFront)
add restricted lane
void setStatusBarText(const std::string &text)
set statusBar text
long onCmdEditWalkingAreaShape(FXObject *, FXSelector, void *)
edit walkingArea shape
void processMoveMouseDemand(const bool mouseLeftButtonPressed)
process move mouse function in Supermode Demand
long onCmdReleasePOI(FXObject *, FXSelector, void *)
release POI from lane
long onCmdResetOppositeLane(FXObject *, FXSelector, void *)
reset oppositeLane of current lane
void setSelectorFrameScale(double selectionScale)
set selection scaling (in GNESelectorFrame)
void viewUpdated()
called when view is updated
long onCmdEditConnectionShape(FXObject *, FXSelector, void *)
edit connection shape
void updateObjectsInShape(const PositionVector &shape)
get objects in the given shape (using triangulation)
void updateDemandModeSpecificControls()
updates Demand mode specific controls
void forceSupemodeNetwork()
force supermode network(used after load/create new network)
long onCmdAttachPOI(FXObject *, FXSelector, void *)
attach POI in lane
std::vector< std::string > getRelDataAttrs() const override
return list of loaded edgeRelation and tazRelation attributes
GNEAdditional * getAdditionalAtPopupPosition()
try to retrieve a additional at popup position
long onCmdReverse(FXObject *, FXSelector, void *)
reverse current demand element
void drawTemporalJunction() const
draw temporal junction in create edge mode
long onCmdSelectRoundabout(FXObject *, FXSelector, void *)
select all roundabout nodes and edges
void updateViewNet(const bool ignoreViewUpdater=true) const
Mark the entire GNEViewNet to be repainted later.
int drawGLElements(const Boundary &bound)
draw functions
long onCmdIntervalBarLimit(FXObject *, FXSelector, void *)
change limit interval in interval bar
GNEViewNetHelper::ViewObjectsSelector myViewObjectsSelector
variable use to select objects in view
Definition GNEViewNet.h:626
A single child window which contains a view of the simulation area.
Dialog for edit rerouter intervals.
static FXCursor * getCursor(GUICursor which)
returns a cursor previously defined in the enum GUICursor
static void drawGeometry(const GUIVisualizationSettings::Detail d, const GUIGeometry &geometry, const double width, double offset=0)
draw geometry
static void drawChildLine(const GUIVisualizationSettings &s, const Position &child, const Position &parent, const RGBColor &color, const bool drawEntire, const double lineWidth)
draw line between child and parent (used in netedit)
void updateGeometry(const PositionVector &shape)
update entire geometry
MFXComboBoxIcon * getColoringSchemesCombo()
return combobox with the current coloring schemes (standard, fastest standard, real world....
FXPopup * getLocatorPopup()
@ brief return a pointer to locator popup
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
const std::string & getName() const
int addColor(const T &color, const double threshold, const std::string &name="")
bool myAmInitialised
Internal information whether doInit() was called.
Position snapToActiveGrid(const Position &pos, bool snapXY=true) const
Returns a position that is mapped to the closest grid point if the grid is active.
std::vector< GUIGlObject * > myCurrentObjectsDialog
vector with current objects dialog
GUISUMOAbstractView(FXComposite *p, GUIMainWindow &app, GUIGlChildWindow *parent, const SUMORTree &grid, FXGLVisual *glVis, FXGLCanvas *share)
constructor
virtual long onLeftBtnRelease(FXObject *, FXSelector, void *)
const SUMORTree * myGrid
The visualization speed-up.
void openObjectDialog(const std::vector< GUIGlObject * > &objects, const bool filter=true)
open object dialog for the given object
void paintGLGrid() const
paints a grid
FXbool makeCurrent()
A reimplementation due to some internal reasons.
Position myClickedPopupPosition
clicked poup position
void buildMinMaxRainbow(const GUIVisualizationSettings &s, GUIColorScheme &scheme, const GUIVisualizationRainbowSettings &rs, double minValue, double maxValue, bool hasMissingData)
helper function for buildColorRainbow
virtual long onMiddleBtnRelease(FXObject *, FXSelector, void *)
virtual long onMouseMove(FXObject *, FXSelector, void *)
bool myPanning
Panning flag.
GUIMainWindow * myApp
The application.
std::vector< GUIGlID > getObjectsInBoundary(Boundary bound)
returns the ids of all objects in the given boundary
const Position & getPopupPosition() const
get position of current popup
double m2p(double meter) const
meter-to-pixels conversion method
GUIVisualizationSettings * myVisualizationSettings
visualization settings
void destroyPopup()
destroys the popup
virtual long onKeyPress(FXObject *o, FXSelector sel, void *data)
keyboard functions
virtual long onMiddleBtnPress(FXObject *, FXSelector, void *)
virtual Position getPositionInformation() const
Returns the cursor's x/y position within the network.
virtual long onKeyRelease(FXObject *o, FXSelector sel, void *data)
GUIDialog_ViewSettings * myGUIDialogViewSettings
Visualization changer.
void drawDecals()
Draws the stored decals.
virtual long onRightBtnRelease(FXObject *, FXSelector, void *)
GUIPerspectiveChanger * myChanger
The perspective changer.
GUIGLObjectPopupMenu * myPopup
The current popup-menu.
virtual long onPaint(FXObject *, FXSelector, void *)
virtual long onRightBtnPress(FXObject *, FXSelector, void *)
void openPopupDialog()
open popup dialog
static void resetTextures()
Reset textures.
Stores the information about how to visualize structures.
static const std::string SCHEME_NAME_PERMISSION_CODE
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
long setCurrentItem(const FXint index, FXbool notify=FALSE)
Set the current item (index is zero-based).
FXint getNumItems() const
Return the number of items in the list.
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon item in the last position
The representation of a single edge during network building.
Definition NBEdge.h:92
const PositionVector & getGeometry() const
Returns the geometry of the edge.
Definition NBEdge.h:789
const PositionVector getInnerGeometry() const
Returns the geometry of the edge without the endpoints.
Definition NBEdge.cpp:613
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:345
const PositionVector & getShape() const
retrieve the junction shape
Definition NBNode.cpp:2783
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool).
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
C++ TraCI client API implementation.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimensions
Definition Position.h:263
double distanceSquaredTo(const Position &p2) const
returns the square of the distance to another position
Definition Position.h:268
double x() const
Returns the x-position.
Definition Position.h:52
double y() const
Returns the y-position.
Definition Position.h:57
A list of positions.
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
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
void setAlpha(unsigned char alpha)
Sets a new alpha value.
Definition RGBColor.cpp:108
static const RGBColor BLUE
Definition RGBColor.h:190
static const RGBColor ORANGE
Definition RGBColor.h:194
static const RGBColor GREEN
Definition RGBColor.h:189
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:403
static const RGBColor BLACK
Definition RGBColor.h:196
static const RGBColor RED
named colors
Definition RGBColor.h:188
const PositionVector & getShape() const
Returns the shape of the polygon.
static std::vector< Triangle > triangulate(PositionVector shape)
Definition Triangle.cpp:129
struct used to group all variables related to view options in supermode Data
struct used to group all variables related to view options in supermode Demand
struct used to group all variables related with Supermodes
struct used to group all variables related with edit shapes of NetworkElements
class used to group all variables related with mouse buttons and key pressed after certain events
struct used to group all variables related with movement of groups of elements
struct used to group all variables related with movement of single elements
struct used to group all variables related to view options in supermode Network
struct used to group all variables related with save elements
struct used to group all variables related with testing
struct used to group all variables related with time format