#include <netbuild/NBEdgeCont.h>
#include <netedit/changes/GNEChange_Attribute.h>
#include <netedit/changes/GNEChange_TLS.h>
#include <netedit/dialogs/basic/GNEInformationBasicDialog.h>
#include <netedit/dialogs/basic/GNEQuestionBasicDialog.h>
#include <netedit/dialogs/basic/GNEWarningBasicDialog.h>
#include <netedit/dialogs/GNEVClassesDialog.h>
#include <netedit/dialogs/GNEGeometryPointDialog.h>
#include <netedit/dialogs/fix/GNEFixAdditionalElementsDialog.h>
#include <netedit/dialogs/fix/GNEFixDemandElementsDialog.h>
#include <netedit/dialogs/fix/GNEFixNetworkElements.h>
#include <netedit/elements/additional/GNEAdditionalHandler.h>
#include <netedit/elements/additional/GNEPOI.h>
#include <netedit/elements/additional/GNEPoly.h>
#include <netedit/elements/additional/GNETAZ.h>
#include <netedit/elements/demand/GNERouteHandler.h>
#include <netedit/elements/network/GNEConnection.h>
#include <netedit/elements/network/GNECrossing.h>
#include <netedit/elements/network/GNEWalkingArea.h>
#include <netedit/frames/GNEAttributesEditor.h>
#include <netedit/frames/GNEConsecutiveSelector.h>
#include <netedit/frames/GNEDrawingShape.h>
#include <netedit/frames/GNEOverlappedInspection.h>
#include <netedit/frames/GNEPathCreator.h>
#include <netedit/frames/GNEPlanCreator.h>
#include <netedit/frames/GNEViewObjectSelector.h>
#include <netedit/frames/common/GNEDeleteFrame.h>
#include <netedit/frames/common/GNEInspectorFrame.h>
#include <netedit/frames/common/GNEMoveFrame.h>
#include <netedit/frames/common/GNESelectorFrame.h>
#include <netedit/frames/data/GNEEdgeDataFrame.h>
#include <netedit/frames/data/GNEEdgeRelDataFrame.h>
#include <netedit/frames/data/GNEMeanDataFrame.h>
#include <netedit/frames/data/GNETAZRelDataFrame.h>
#include <netedit/frames/demand/GNEContainerFrame.h>
#include <netedit/frames/demand/GNEContainerPlanFrame.h>
#include <netedit/frames/demand/GNEPersonFrame.h>
#include <netedit/frames/demand/GNEPersonPlanFrame.h>
#include <netedit/frames/demand/GNERouteDistributionFrame.h>
#include <netedit/frames/demand/GNERouteFrame.h>
#include <netedit/frames/demand/GNEStopFrame.h>
#include <netedit/frames/demand/GNETypeDistributionFrame.h>
#include <netedit/frames/demand/GNETypeFrame.h>
#include <netedit/frames/demand/GNEVehicleFrame.h>
#include <netedit/frames/network/GNEAdditionalFrame.h>
#include <netedit/frames/network/GNEConnectorFrame.h>
#include <netedit/frames/network/GNECreateEdgeFrame.h>
#include <netedit/frames/network/GNECrossingFrame.h>
#include <netedit/frames/network/GNEDecalFrame.h>
#include <netedit/frames/network/GNEProhibitionFrame.h>
#include <netedit/frames/network/GNEShapeFrame.h>
#include <netedit/frames/network/GNETAZFrame.h>
#include <netedit/frames/network/GNETLSEditorFrame.h>
#include <netedit/frames/network/GNEWireFrame.h>
#include <utils/foxtools/MFXMenuCheckIcon.h>
#include <utils/gui/cursors/GUICursorSubSys.h>
#include <utils/gui/div/GLHelper.h>
#include <utils/gui/div/GUIDesigns.h>
#include <utils/gui/div/GUIGlobalViewUpdater.h>
#include <utils/gui/globjects/GUICursorDialog.h>
#include <utils/gui/globjects/GUIGlObjectStorage.h>
#include <utils/gui/settings/GUICompleteSchemeStorage.h>
#include <utils/gui/windows/GUIDanielPerspectiveChanger.h>
#include <utils/gui/windows/GUIDialog_ViewSettings.h>
#include "GNEApplicationWindow.h"
#include "GNENet.h"
#include "GNEUndoList.h"
#include "GNEViewNet.h"
#include "GNEViewParent.h"
FXDEFMAP(GNEViewNet) GNEViewNetMap[] = {
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_F2_SUPERMODE_NETWORK, GNEViewNet::onCmdSetSupermode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_F3_SUPERMODE_DEMAND, GNEViewNet::onCmdSetSupermode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_F4_SUPERMODE_DATA, GNEViewNet::onCmdSetSupermode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_C_MODE_CONNECT_CONTAINER, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_E_MODE_EDGE_EDGEDATA, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_I_MODE_INSPECT, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_L_MODE_PERSONPLAN, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_P_MODE_POLYGON_PERSON, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_T_MODE_TLS_TYPE, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_V_MODE_VEHICLE, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_Z_MODE_TAZ_TAZREL, GNEViewNet::onCmdSetMode),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID, GNEViewNet::onCmdToggleShowGrid),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GNEViewNet::onCmdToggleDrawJunctionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES, GNEViewNet::onCmdToggleDrawSpreadVehicles),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS, GNEViewNet::onCmdToggleShowDemandElementsNetwork),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES, GNEViewNet::onCmdToggleSelectEdges),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS, GNEViewNet::onCmdToggleShowConnections),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS, GNEViewNet::onCmdToggleHideConnections),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS, GNEViewNet::onCmdToggleShowAdditionalSubElements),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS, GNEViewNet::onCmdToggleShowTAZElements),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION, GNEViewNet::onCmdToggleExtendSelection),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES, GNEViewNet::onCmdToggleChangeAllPhases),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY, GNEViewNet::onCmdToggleMergeAutomatically),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES, GNEViewNet::onCmdToggleShowJunctionBubbles),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION, GNEViewNet::onCmdToggleMoveElevation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES, GNEViewNet::onCmdToggleChainEdges),
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES, GNEViewNet::onCmdToggleAutoOppositeEdge),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID, GNEViewNet::onCmdToggleShowGrid),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GNEViewNet::onCmdToggleDrawJunctionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES, GNEViewNet::onCmdToggleDrawSpreadVehicles),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED, GNEViewNet::onCmdToggleHideNonInspecteDemandElements),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES, GNEViewNet::onCmdToggleHideShapes),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS, GNEViewNet::onCmdToggleShowTrips),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS, GNEViewNet::onCmdToggleShowAllPersonPlans),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON, GNEViewNet::onCmdToggleLockPerson),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS, GNEViewNet::onCmdToggleShowAllContainerPlans),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER, GNEViewNet::onCmdToggleLockContainer),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES, GNEViewNet::onCmdToggleShowOverlappedRoutes),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GNEViewNet::onCmdToggleDrawJunctionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS, GNEViewNet::onCmdToggleShowAdditionals),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES, GNEViewNet::onCmdToggleShowShapes),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS, GNEViewNet::onCmdToggleShowDemandElementsData),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING, GNEViewNet::onCmdToggleTAZRelDrawing),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL, GNEViewNet::onCmdToggleTAZDrawFill),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM, GNEViewNet::onCmdToggleTAZRelOnlyFrom),
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO, GNEViewNet::onCmdToggleTAZRelOnlyTo),
FXMAPFUNC(SEL_COMMAND, MID_ADDSELECT, GNEViewNet::onCmdAddSelected),
FXMAPFUNC(SEL_COMMAND, MID_REMOVESELECT, GNEViewNet::onCmdRemoveSelected),
FXMAPFUNC(SEL_COMMAND, MID_GNE_ADDSELECT_EDGE, GNEViewNet::onCmdAddEdgeSelected),
FXMAPFUNC(SEL_COMMAND, MID_GNE_REMOVESELECT_EDGE, GNEViewNet::onCmdRemoveEdgeSelected),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_RESET_EDGE_ENDPOINTS, GNEViewNet::onCmdResetEdgeEndPoints),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_EDIT_SHAPE, GNEViewNet::onCmdEditJunctionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_RESET_SHAPE, GNEViewNet::onCmdResetJunctionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_REPLACE, GNEViewNet::onCmdReplaceJunction),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_SPLIT, GNEViewNet::onCmdSplitJunction),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_SPLIT_RECONNECT, GNEViewNet::onCmdSplitJunctionReconnect),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_SELECT_ROUNDABOUT, GNEViewNet::onCmdSelectRoundabout),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_CONVERT_ROUNDABOUT, GNEViewNet::onCmdConvertRoundabout),
FXMAPFUNC(SEL_ENTER, MID_GNE_JUNCTION_CONVERT_ROUNDABOUT, GNEViewNet::onEnterConvertRoundabout),
FXMAPFUNC(SEL_LEAVE, MID_GNE_JUNCTION_CONVERT_ROUNDABOUT, GNEViewNet::onLeaveConvertRoundabout),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_CLEAR_CONNECTIONS, GNEViewNet::onCmdClearConnections),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_RESET_CONNECTIONS, GNEViewNet::onCmdResetConnections),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_ADDTLS, GNEViewNet::onCmdAddTLS),
FXMAPFUNC(SEL_COMMAND, MID_GNE_JUNCTION_ADDJOINTLS, GNEViewNet::onCmdAddJoinTLS),
FXMAPFUNC(SEL_COMMAND, MID_GNE_CONNECTION_EDIT_SHAPE, GNEViewNet::onCmdEditConnectionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_CONNECTION_SMOOTH_SHAPE, GNEViewNet::onCmdSmoothConnectionShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_CROSSING_EDIT_SHAPE, GNEViewNet::onCmdEditCrossingShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_WALKINGAREA_EDIT_SHAPE, GNEViewNet::onCmdEditWalkingAreaShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SPLIT, GNEViewNet::onCmdSplitEdge),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SPLIT_BIDI, GNEViewNet::onCmdSplitEdgeBidi),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_REVERSE, GNEViewNet::onCmdReverseEdge),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_ADD_REVERSE, GNEViewNet::onCmdAddReversedEdge),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_ADD_REVERSE_DISCONNECTED, GNEViewNet::onCmdAddReversedEdgeDisconnected),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_EDIT_ENDPOINT, GNEViewNet::onCmdEditEdgeEndpoint),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_RESET_ENDPOINT, GNEViewNet::onCmdResetEdgeEndpoint),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_STRAIGHTEN, GNEViewNet::onCmdStraightenEdges),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SMOOTH, GNEViewNet::onCmdSmoothEdges),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_STRAIGHTEN_ELEVATION, GNEViewNet::onCmdStraightenEdgesElevation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_SMOOTH_ELEVATION, GNEViewNet::onCmdSmoothEdgesElevation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_RESET_LENGTH, GNEViewNet::onCmdResetLength),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_USEASTEMPLATE, GNEViewNet::onCmdEdgeUseAsTemplate),
FXMAPFUNC(SEL_COMMAND, MID_GNE_EDGE_APPLYTEMPLATE, GNEViewNet::onCmdEgeApplyTemplate),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_DUPLICATE, GNEViewNet::onCmdDuplicateLane),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_EDIT_SHAPE, GNEViewNet::onCmdEditLaneShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_RESET_CUSTOMSHAPE, GNEViewNet::onCmdResetLaneCustomShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_RESET_OPPOSITELANE, GNEViewNet::onCmdResetOppositeLane),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_TRANSFORM_SIDEWALK, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_TRANSFORM_BIKE, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_TRANSFORM_BUS, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_TRANSFORM_GREENVERGE, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_ADD_SIDEWALK, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_ADD_BIKE, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_ADD_BUS, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_ADD_GREENVERGE_FRONT, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_ADD_GREENVERGE_BACK, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_REMOVE_SIDEWALK, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_REMOVE_BIKE, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_REMOVE_BUS, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_GNE_LANE_REMOVE_GREENVERGE, GNEViewNet::onCmdLaneOperation),
FXMAPFUNC(SEL_COMMAND, MID_REACHABILITY, GNEViewNet::onCmdLaneReachability),
FXMAPFUNC(SEL_COMMAND, MID_OPEN_ADDITIONAL_DIALOG, GNEViewNet::onCmdOpenAdditionalDialog),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_SIMPLIFY_SHAPE, GNEViewNet::onCmdSimplifyShape),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_CLOSE, GNEViewNet::onCmdClosePolygon),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_OPEN, GNEViewNet::onCmdOpenPolygon),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_SELECT, GNEViewNet::onCmdSelectPolygonElements),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_TRIANGULATE, GNEViewNet::onCmdTriangulatePolygon),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_SET_FIRST_POINT, GNEViewNet::onCmdSetFirstGeometryPoint),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POLYGON_DELETE_GEOMETRY_POINT, GNEViewNet::onCmdDeleteGeometryPoint),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_SIMPLIFY, GNEViewNet::onCmdSimplifyShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_STRAIGHTEN, GNEViewNet::onCmdStraightenShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_CLOSE, GNEViewNet::onCmdCloseShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_OPEN, GNEViewNet::onCmdOpenShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_SET_FIRST_POINT, GNEViewNet::onCmdSetFirstGeometryPointShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_DELETE_GEOMETRY_POINT, GNEViewNet::onCmdDeleteGeometryPointShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_RESET, GNEViewNet::onCmdResetShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_SHAPEEDITED_FINISH, GNEViewNet::onCmdFinishShapeEdited),
FXMAPFUNC(SEL_COMMAND, MID_GNE_POI_TRANSFORM, GNEViewNet::onCmdTransformPOI),
FXMAPFUNC(SEL_COMMAND, MID_GNE_REVERSE, GNEViewNet::onCmdReverse),
FXMAPFUNC(SEL_COMMAND, MID_GNE_ADDREVERSE, GNEViewNet::onCmdAddReverse),
FXMAPFUNC(SEL_COMMAND, MID_GNE_CUSTOM_GEOMETRYPOINT, GNEViewNet::onCmdSetCustomGeometryPoint),
FXMAPFUNC(SEL_COMMAND, MID_GNE_RESET_GEOMETRYPOINT, GNEViewNet::onCmdResetEndPoints),
FXMAPFUNC(SEL_COMMAND, MID_GNE_VIEW_DEFAULT, GNEViewNet::onCmdSetNeteditView),
FXMAPFUNC(SEL_COMMAND, MID_GNE_VIEW_JUPEDSIM, GNEViewNet::onCmdSetNeteditView),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_GENERICDATATYPE, GNEViewNet::onCmdIntervalBarGenericDataType),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_DATASET, GNEViewNet::onCmdIntervalBarDataSet),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_LIMITED, GNEViewNet::onCmdIntervalBarLimit),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_BEGIN, GNEViewNet::onCmdIntervalBarSetBegin),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_END, GNEViewNet::onCmdIntervalBarSetEnd),
FXMAPFUNC(SEL_COMMAND, MID_GNE_INTERVALBAR_PARAMETER, GNEViewNet::onCmdIntervalBarSetParameter),
};
FXIMPLEMENT(GNEViewNet, GUISUMOAbstractView, GNEViewNetMap, ARRAYNUMBER(GNEViewNetMap))
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4355)
#endif
GNEViewNet::GNEViewNet(FXComposite* tmpParent, FXComposite* actualParent, GUIMainWindow& app,
GNEViewParent* viewParent, GNENet* net, GNEUndoList* undoList,
FXGLVisual* glVis, FXGLCanvas* share) :
GUISUMOAbstractView(tmpParent, app, viewParent, net->getGrid(), glVis, share),
myViewObjectsSelector(this),
myEditModes(this),
myTestingMode(this),
myCommonCheckableButtons(this),
myNetworkCheckableButtons(this),
myDemandCheckableButtons(this),
myDataCheckableButtons(this),
myNetworkViewOptions(this),
myDemandViewOptions(this),
myDataViewOptions(this),
myIntervalBar(this),
myMoveSingleElement(this),
myMoveMultipleElements(this),
myVehicleOptions(this),
myVehicleTypeOptions(this),
mySaveElements(this),
myTimeFormat(this),
mySelectingArea(this),
myEditNetworkElementShapes(this),
myLockManager(this),
myViewParent(viewParent),
myNet(net),
myUndoList(undoList) {
reparent(actualParent);
buildEditModeControls();
myNet->setViewNet(this);
((GUIDanielPerspectiveChanger*)myChanger)->setDragDelay(100000000);
GUITextureSubSys::resetTextures();
myTestingMode.initTestingMode();
myNetworkViewOptions.menuCheckToggleGrid->setChecked(myVisualizationSettings->showGrid);
myDemandViewOptions.menuCheckToggleGrid->setChecked(myVisualizationSettings->showGrid);
const bool hide = !myVisualizationSettings->drawJunctionShape;
myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
myDemandViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
myDataViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif
GNEViewNet::~GNEViewNet() {
}
void
GNEViewNet::recalculateBoundaries() {
if (myNet && makeCurrent()) {
const Boundary maxBoundary(1000000000.0, 1000000000.0, -1000000000.0, -1000000000.0);
const std::vector<GUIGlID> GLIDs = getObjectsInBoundary(maxBoundary);
makeNonCurrent();
std::set<GNEAttributeCarrier*> ACs;
for (const auto& GLId : GLIDs) {
GNEAttributeCarrier* AC = myNet->getAttributeCarriers()->retrieveAttributeCarrier(GLId);
if (AC && AC->getTagProperty()->isPlacedInRTree()) {
ACs.insert(AC);
}
}
for (const auto& AC : ACs) {
myNet->getGrid().removeAdditionalGLObject(AC->getGUIGlObject());
myNet->getGrid().addAdditionalGLObject(AC->getGUIGlObject(), AC->getGUIGlObject()->getExaggeration(*myVisualizationSettings));
}
}
}
void
GNEViewNet::doInit() {}
GUIGlID
GNEViewNet::getToolTipID() {
if (myViewObjectsSelector.getGUIGlObjectFront()) {
return myViewObjectsSelector.getGUIGlObjectFront()->getGlID();
} else {
return 0;
}
}
void
GNEViewNet::buildViewToolBars(GUIGlChildWindow* v) {
{
for (auto it_names : gSchemeStorage.getNames()) {
v->getColoringSchemesCombo()->appendIconItem(it_names.c_str());
if (it_names == myVisualizationSettings->name) {
v->getColoringSchemesCombo()->setCurrentItem(v->getColoringSchemesCombo()->getNumItems() - 1);
}
}
}
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Junctions") + std::string("\t") + TL("Locate a junction within the network. (Shift+J)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEJUNCTION), v, MID_HOTKEY_SHIFT_J_LOCATEJUNCTION, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Edges") + std::string("\t") + TL("Locate an edge within the network. (Shift+E)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEEDGE), v, MID_HOTKEY_SHIFT_E_LOCATEEDGE, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate WalkingAreas") + std::string("\t") + TL("Locate a walkingArea within the network. (Shift+W)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEWALKINGAREA), v, MID_HOTKEY_SHIFT_W_LOCATEWALKINGAREA, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Vehicles") + std::string("\t") + TL("Locate a vehicle within the network. (Shift+V)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEVEHICLE), v, MID_HOTKEY_SHIFT_V_LOCATEVEHICLE, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Persons") + std::string("\t") + TL("Locate a person within the network. (Shift+P)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEPERSON), v, MID_HOTKEY_SHIFT_P_LOCATEPERSON, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Containers") + std::string("\t") + TL("Locate a container within the network. (Shift+C)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATECONTAINER), v, MID_HOTKEY_SHIFT_C_LOCATECONTAINER, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Route") + std::string("\t") + TL("Locate a route within the network. (Shift+R)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEROUTE), v, MID_HOTKEY_SHIFT_R_LOCATEROUTE, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Stops") + std::string("\t") + TL("Locate a stop within the network. (Shift+S)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATESTOP), v, MID_HOTKEY_SHIFT_S_LOCATESTOP, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate TLS") + std::string("\t") + TL("Locate a tls within the network. (Shift+T)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATETLS), v, MID_HOTKEY_SHIFT_T_LOCATETLS, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Additional") + std::string("\t") + TL("Locate an additional structure within the network. (Shift+A)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEADD), v, MID_HOTKEY_SHIFT_A_LOCATEADDITIONAL, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate PoI") + std::string("\t") + TL("Locate a PoI within the network. (Shift+O)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEPOI), v, MID_HOTKEY_SHIFT_O_LOCATEPOI, GUIDesignButtonPopup);
new MFXButtonTooltip(v->getLocatorPopup(), myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
std::string("\t") + TL("Locate Polygon") + std::string("\t") + TL("Locate a Polygon within the network. (Shift+L)"),
GUIIconSubSys::getIcon(GUIIcon::LOCATEPOLY), v, MID_HOTKEY_SHIFT_L_LOCATEPOLY, GUIDesignButtonPopup);
}
void
GNEViewNet::updateViewNet(const bool ignoreViewUpdater) const {
if (ignoreViewUpdater || gViewUpdater.allowUpdate()) {
GUISUMOAbstractView::update();
}
}
void
GNEViewNet::forceSupemodeNetwork() {
myEditModes.setSupermode(Supermode::NETWORK, true);
}
void
GNEViewNet::viewUpdated() {
if (myEditModes.isJuPedSimView()) {
myEditModes.dataButton->hide();
switch (myEditModes.networkEditMode) {
case NetworkEditMode::NETWORK_CONNECT:
case NetworkEditMode::NETWORK_TLS:
case NetworkEditMode::NETWORK_PROHIBITION:
case NetworkEditMode::NETWORK_WIRE:
case NetworkEditMode::NETWORK_DECAL:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_INSPECT);
break;
default:
break;
}
switch (myEditModes.demandEditMode) {
case DemandEditMode::DEMAND_MOVE:
case DemandEditMode::DEMAND_VEHICLE:
case DemandEditMode::DEMAND_STOP:
case DemandEditMode::DEMAND_CONTAINER:
case DemandEditMode::DEMAND_CONTAINERPLAN:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_INSPECT);
break;
default:
break;
}
if (myEditModes.isCurrentSupermodeData()) {
forceSupemodeNetwork();
} else {
myEditModes.setSupermode(myEditModes.currentSupermode, true);
}
} else {
myEditModes.dataButton->show();
myEditModes.setSupermode(myEditModes.currentSupermode, true);
}
}
const GNEViewNetHelper::ViewObjectsSelector&
GNEViewNet::getViewObjectsSelector() const {
return myViewObjectsSelector;
}
void
GNEViewNet::updateObjectsInPosition(const Position& pos) {
gViewObjectsHandler.reset();
gViewObjectsHandler.setSelectionPosition(pos);
Boundary positionBoundary;
positionBoundary.add(pos);
positionBoundary.grow(POSITION_EPS);
GLHelper::pushMatrix();
myVisualizationSettings->drawForViewObjectsHandler = true;
drawGLElements(positionBoundary);
gViewObjectsHandler.reverseSelectedObjects();
if (myEditModes.isCurrentSupermodeNetwork() && myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
gViewObjectsHandler.isolateEdgeGeometryPoints();
}
myVisualizationSettings->drawForViewObjectsHandler = false;
GLHelper::popMatrix();
for (const auto& AC : myMarkFrontElements.getACs()) {
gViewObjectsHandler.updateFrontObject(AC->getGUIGlObject());
}
myViewObjectsSelector.updateObjects();
}
void
GNEViewNet::updateObjectsInShape(const PositionVector& shape) {
if (shape.size() == 1) {
updateObjectsInPosition(shape.front());
} else if (shape.size() > 1) {
const auto triangles = Triangle::triangulate(shape);
gViewObjectsHandler.reset();
GLHelper::pushMatrix();
myVisualizationSettings->drawForViewObjectsHandler = true;
myVisualizationSettings->drawForRectangleSelection = true;
for (const auto& triangle : triangles) {
gViewObjectsHandler.setSelectionTriangle(triangle);
drawGLElements(triangle.getBoundary());
}
myVisualizationSettings->drawForViewObjectsHandler = false;
myVisualizationSettings->drawForRectangleSelection = false;
GLHelper::popMatrix();
for (const auto& AC : myMarkFrontElements.getACs()) {
gViewObjectsHandler.updateFrontObject(AC->getGUIGlObject());
}
myViewObjectsSelector.updateObjects();
}
}
void
GNEViewNet::redrawPathElementContours() {
for (const auto& AC : myInspectedElements.getACs()) {
const auto pathElement = dynamic_cast<const GNEPathElement*>(AC);
if (pathElement) {
gViewObjectsHandler.addToRedrawPathElements(pathElement);
}
}
myVisualizationSettings->drawForViewObjectsHandler = true;
GLHelper::pushMatrix();
myNet->getNetworkPathManager()->redrawPathElements(*myVisualizationSettings);
myNet->getDemandPathManager()->redrawPathElements(*myVisualizationSettings);
myNet->getDataPathManager()->redrawPathElements(*myVisualizationSettings);
GLHelper::popMatrix();
myVisualizationSettings->drawForViewObjectsHandler = false;
}
const GNEViewNetHelper::MoveSingleElementModul&
GNEViewNet::getMoveSingleElementValues() const {
return myMoveSingleElement;
}
const GNEViewNetHelper::MoveMultipleElementModul&
GNEViewNet::getMoveMultipleElementValues() const {
return myMoveMultipleElements;
}
bool
GNEViewNet::setColorScheme(const std::string& name) {
if (!gSchemeStorage.contains(name)) {
return false;
}
if (myGUIDialogViewSettings != nullptr) {
if (myGUIDialogViewSettings->getCurrentScheme() != name) {
myGUIDialogViewSettings->setCurrentScheme(name);
}
}
myVisualizationSettings = &gSchemeStorage.get(name.c_str());
updateViewNet();
return true;
}
void
GNEViewNet::openObjectDialogAtCursor(const FXEvent* ) {
ungrab();
if (isEnabled() && myAmInitialised) {
if (myMouseButtonKeyPressed.altKeyPressed()) {
myClickedPopupPosition = getPositionInformation();
myPopup = new GUICursorDialog(GUIGLObjectPopupMenu::PopupType::FRONT_ELEMENT, this, myViewObjectsSelector.getGLObjects());
openPopupDialog();
} else if (myViewObjectsSelector.getGLObjects().empty()) {
openObjectDialog({myNet});
} else {
std::vector<GUIGlObject*> filteredGLObjects;
GUIGlObject* overlappedElement = nullptr;
if (myViewParent->getInspectorFrame()->getOverlappedInspection()->overlappedInspectionShown() &&
myInspectedElements.getFirstAC()) {
overlappedElement = myInspectedElements.getFirstAC()->getGUIGlObject();
filteredGLObjects.push_back(overlappedElement);
}
bool connections = false;
bool TLS = false;
if ((myViewObjectsSelector.getGLObjects().size() == 1) && (myViewObjectsSelector.getGLObjects().back()->getType() == GLO_EDGE)) {
filteredGLObjects.push_back(myViewObjectsSelector.getGLObjects().back());
} else {
for (const auto& glObject : myViewObjectsSelector.getGLObjects()) {
if (glObject->getType() == GLO_EDGE) {
continue;
}
if (glObject->getType() == GLO_CONNECTION) {
connections = true;
}
if (glObject->getType() == GLO_TLLOGIC) {
TLS = true;
}
filteredGLObjects.push_back(glObject);
}
auto it = filteredGLObjects.begin();
if (connections) {
while (it != filteredGLObjects.end()) {
if ((*it)->getType() == GLO_JUNCTION) {
it = filteredGLObjects.erase(it);
} else {
it++;
}
}
} else if (TLS) {
while (it != filteredGLObjects.end()) {
if ((*it)->getType() != GLO_TLLOGIC) {
it = filteredGLObjects.erase(it);
} else {
it++;
}
}
}
}
auto itDuplicated = filteredGLObjects.begin();
std::unordered_set<GUIGlObject*> unorderedSet;
for (auto itElement = filteredGLObjects.begin(); itElement != filteredGLObjects.end(); itElement++) {
if (unorderedSet.insert(*itElement).second) {
*itDuplicated++ = *itElement;
}
}
filteredGLObjects.erase(itDuplicated, filteredGLObjects.end());
openObjectDialog(filteredGLObjects);
}
}
}
void
GNEViewNet::openDeleteDialogAtCursor(const std::vector<GUIGlObject*>& GLObjects) {
if (myPopup) {
destroyPopup();
}
myClickedPopupPosition = getPositionInformation();
myPopup = new GUICursorDialog(GUIGLObjectPopupMenu::PopupType::DELETE_ELEMENT, this, GLObjects);
myCreatedPopup = true;
openPopupDialog();
}
void
GNEViewNet::openSelectDialogAtCursor(const std::vector<GUIGlObject*>& GLObjects) {
if (myPopup) {
destroyPopup();
}
myClickedPopupPosition = getPositionInformation();
myPopup = new GUICursorDialog(GUIGLObjectPopupMenu::PopupType::SELECT_ELEMENT, this, GLObjects);
myCreatedPopup = true;
openPopupDialog();
}
void
GNEViewNet::saveVisualizationSettings() const {
const auto& neteditOptions = OptionsCont::getOptions();
if (neteditOptions.getString("gui-testing.setting-output").size() > 0) {
try {
OutputDevice& output = OutputDevice::getDevice(neteditOptions.getString("gui-testing.setting-output"));
output.openTag(SUMO_TAG_VIEWSETTINGS);
myVisualizationSettings->save(output);
output.openTag(SUMO_TAG_VIEWPORT);
output.writeAttr(SUMO_ATTR_ZOOM, myChanger->getZoom());
output.writeAttr(SUMO_ATTR_X, myChanger->getXPos());
output.writeAttr(SUMO_ATTR_Y, myChanger->getYPos());
output.writeAttr(SUMO_ATTR_ANGLE, myChanger->getRotation());
output.closeTag();
output.closeTag();
output.close();
} catch (...) {
WRITE_ERROR(TL("GUI-Settings cannot be saved in ") + neteditOptions.getString("gui-testing.setting-output"));
}
}
}
const GNEViewNetHelper::EditModes&
GNEViewNet::getEditModes() const {
return myEditModes;
}
const GNEViewNetHelper::TestingMode&
GNEViewNet::getTestingMode() const {
return myTestingMode;
}
const GNEViewNetHelper::NetworkViewOptions&
GNEViewNet::getNetworkViewOptions() const {
return myNetworkViewOptions;
}
const GNEViewNetHelper::DemandViewOptions&
GNEViewNet::getDemandViewOptions() const {
return myDemandViewOptions;
}
const GNEViewNetHelper::DataViewOptions&
GNEViewNet::getDataViewOptions() const {
return myDataViewOptions;
}
const GNEViewNetHelper::MouseButtonKeyPressed&
GNEViewNet::getMouseButtonKeyPressed() const {
return myMouseButtonKeyPressed;
}
const GNEViewNetHelper::EditNetworkElementShapes&
GNEViewNet::getEditNetworkElementShapes() const {
return myEditNetworkElementShapes;
}
void
GNEViewNet::buildColorRainbow(const GUIVisualizationSettings& s, GUIColorScheme& scheme, int active, GUIGlObjectType objectType,
const GUIVisualizationRainbowSettings& rs) {
assert(!scheme.isFixed());
double minValue = std::numeric_limits<double>::infinity();
double maxValue = -std::numeric_limits<double>::infinity();
bool hasMissingData = false;
if (objectType == GLO_LANE) {
if (active == 9) {
active = 8;
} else if (active == 11) {
active = 10;
}
for (const auto& lane : myNet->getAttributeCarriers()->getLanes()) {
const double val = lane.second->getColorValue(s, active);
if (val == s.MISSING_DATA) {
hasMissingData = true;
continue;
}
minValue = MIN2(minValue, val);
maxValue = MAX2(maxValue, val);
}
} else if (objectType == GLO_VEHICLE) {
for (const auto& tagMap : myNet->getAttributeCarriers()->getDemandElements()) {
for (const auto& objItem : tagMap.second) {
const double val = objItem.first->getColorValue(s, active);
if (val == s.MISSING_DATA) {
hasMissingData = true;
continue;
}
minValue = MIN2(minValue, val);
maxValue = MAX2(maxValue, val);
}
}
} else if (objectType == GLO_JUNCTION) {
if (active == 3) {
for (const auto& junction : myNet->getAttributeCarriers()->getJunctions()) {
minValue = MIN2(minValue, junction.second->getPositionInView().z());
maxValue = MAX2(maxValue, junction.second->getPositionInView().z());
}
}
} else if (objectType == GLO_TAZRELDATA) {
if (active == 4) {
for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_TAZREL)) {
const double value = genericData.second->getColorValue(s, active);
if (value == s.MISSING_DATA) {
continue;
}
minValue = MIN2(minValue, value);
maxValue = MAX2(maxValue, value);
}
}
}
if (scheme.getName() == GUIVisualizationSettings::SCHEME_NAME_PERMISSION_CODE) {
scheme.clear();
std::set<SVCPermissions> codes;
for (const auto& lane : myNet->getAttributeCarriers()->getLanes()) {
codes.insert(lane.second->getParentEdge()->getNBEdge()->getPermissions(lane.second->getIndex()));
}
int step = MAX2(1, 360 / (int)codes.size());
int hue = 0;
for (SVCPermissions p : codes) {
scheme.addColor(RGBColor::fromHSV(hue, 1, 1), (double)p);
hue = (hue + step) % 360;
}
return;
}
buildMinMaxRainbow(s, scheme, rs, minValue, maxValue, hasMissingData);
}
void
GNEViewNet::setStatusBarText(const std::string& text) {
myApp->setStatusBarText(text);
}
bool
GNEViewNet::autoSelectNodes() {
if (myLockManager.isObjectLocked(GLO_JUNCTION, false)) {
return false;
} else {
return myNetworkViewOptions.menuCheckExtendSelection->amChecked();
}
}
void
GNEViewNet::setSelectorFrameScale(double selectionScale) {
myVisualizationSettings->selectorFrameScale = selectionScale;
}
bool
GNEViewNet::changeAllPhases() const {
return (myNetworkViewOptions.menuCheckChangeAllPhases->amChecked() != 0);
}
bool
GNEViewNet::showJunctionAsBubbles() const {
return (myNetworkViewOptions.menuCheckShowJunctionBubble->shown() &&
myNetworkViewOptions.menuCheckShowJunctionBubble->amChecked());
}
bool
GNEViewNet::askMergeJunctions(const GNEJunction* movedJunction, const GNEJunction* targetJunction, bool& alreadyAsked) {
if (alreadyAsked) {
return false;
} else if (myNetworkViewOptions.menuCheckMergeAutomatically->amChecked()) {
return true;
} else {
alreadyAsked = true;
const std::string header = TL("Confirm Junction Merger");
const std::string body = TLF("Do you wish to merge junctions '%' and '%'?\n('%' will be eliminated and its roads added to '%')",
movedJunction->getMicrosimID(),
targetJunction->getMicrosimID(),
movedJunction->getMicrosimID(),
targetJunction->getMicrosimID());
const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
return true;
} else {
return false;
}
}
}
bool
GNEViewNet::aksChangeSupermode(const std::string& operation, Supermode expectedSupermode) {
if (OptionsCont::getOptions().getBool("ignore-supermode-question")) {
return true;
}
std::string body;
if (expectedSupermode == Supermode::NETWORK) {
body = TLF("% requires switch to network mode. Continue?", operation);
} else if (expectedSupermode == Supermode::DEMAND) {
body = TLF("% requires switch to demand mode. Continue?", operation);
} else if (expectedSupermode == Supermode::DATA) {
body = TLF("% requires switch to data mode. Continue?", operation);
} else {
throw ProcessError("invalid expected supermode");
}
const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO,
TL("Confirm switch mode"), body);
if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
myEditModes.setSupermode(expectedSupermode, true);
return true;
} else {
return false;
}
}
bool
GNEViewNet::selectingDetectorsTLSMode() const {
const bool TLSMode = (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS));
const bool selectingDetectors = myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled();
return (TLSMode && selectingDetectors);
}
bool
GNEViewNet::selectingJunctionsTLSMode() const {
const bool TLSMode = (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS));
const bool selectingJunctions = myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions();
return (TLSMode && selectingJunctions);
}
GNEViewNetHelper::SaveElements&
GNEViewNet::getSaveElements() {
return mySaveElements;
}
GNEViewNetHelper::TimeFormat&
GNEViewNet::getTimeFormat() {
return myTimeFormat;
}
bool
GNEViewNet::restrictLane(GNELane* lane, SUMOVehicleClass vclass) {
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
std::map<GNEEdge*, GNELane*> mapOfEdgesAndLanes;
for (const auto& selectedLane : selectedLanes) {
mapOfEdgesAndLanes[myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID())] = selectedLane;
}
if (mapOfEdgesAndLanes.size() != selectedLanes.size()) {
const std::string header = TL("Multiple lane in the same edge selected");
const std::string bodyA = TL("There are selected lanes that belong to the same edge.");
const std::string bodyB = TLF("Only one lane per edge will be restricted to %.", toString(vclass));
GNEWarningBasicDialog(myViewParent->getGNEAppWindows(), header, bodyA, bodyB);
}
if (mapOfEdgesAndLanes.size() > 0) {
int counter = 0;
for (const auto& edgeLane : mapOfEdgesAndLanes) {
if (edgeLane.first->hasRestrictedLane(vclass)) {
counter++;
}
}
if (counter == (int)mapOfEdgesAndLanes.size()) {
const std::string header = TLF("Set vclass to % for selected lanes", toString(vclass));
const std::string body = TLF("All lanes own already another lane in the same edge with a restriction for %", toString(vclass));
GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
return 0;
} else {
const std::string header = TLF("Set vclass to % for selected lanes", toString(vclass));
const std::string body = TLF("% lanes will be restricted to %. Continue?", toString(mapOfEdgesAndLanes.size() - counter), toString(vclass));
const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) {
return 0;
}
}
myUndoList->begin(lane, "restrict lanes to " + toString(vclass));
for (const auto& edgeLane : mapOfEdgesAndLanes) {
myNet->restrictLane(vclass, edgeLane.second, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(lane, TL("restrict lane to ") + toString(vclass));
myNet->restrictLane(vclass, lane, myUndoList);
myUndoList->end();
}
return 1;
}
bool
GNEViewNet::addRestrictedLane(GNELane* lane, SUMOVehicleClass vclass, const bool insertAtFront) {
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
std::set<GNEEdge*> setOfEdges;
for (const auto& edge : selectedEdges) {
setOfEdges.insert(edge);
}
for (const auto& selectedLane : selectedLanes) {
setOfEdges.insert(myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID()));
}
if (lane->isAttributeCarrierSelected() || lane->getParentEdge()->isAttributeCarrierSelected()) {
int counter = 0;
for (const auto& edge : setOfEdges) {
if (edge->hasRestrictedLane(vclass)) {
counter++;
}
}
if (counter == (int)setOfEdges.size()) {
const std::string header = TLF("Add vclass % to selected lanes", toString(vclass));
const std::string body = TLF("All lanes own already another lane in the same edge with a restriction to %.", toString(vclass));
GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
return 0;
} else {
const std::string header = TLF("Add vclass % to selected lanes", toString(vclass));
const std::string body = TLF("% restrictions to % will be added. Continue?", toString(setOfEdges.size() - counter), toString(vclass));
const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) {
return 0;
}
}
myUndoList->begin(lane, TL("add restrictions for ") + toString(vclass));
for (const auto& edge : setOfEdges) {
myNet->addRestrictedLane(vclass, edge, -1, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(lane, TL("add vclass for ") + toString(vclass));
if (vclass == SVC_PEDESTRIAN) {
myNet->addRestrictedLane(vclass, lane->getParentEdge(), 0, myUndoList);
} else if (vclass == SVC_IGNORING) {
if (insertAtFront) {
myNet->addGreenVergeLane(lane->getParentEdge(), lane->getIndex() + 1, myUndoList);
} else {
myNet->addGreenVergeLane(lane->getParentEdge(), lane->getIndex(), myUndoList);
}
} else if (lane->getParentEdge()->getChildLanes().size() == 1) {
myNet->addRestrictedLane(vclass, lane->getParentEdge(), -1, myUndoList);
} else {
myNet->addRestrictedLane(vclass, lane->getParentEdge(), lane->getIndex(), myUndoList);
}
myUndoList->end();
}
return 1;
}
bool
GNEViewNet::removeRestrictedLane(GNELane* lane, SUMOVehicleClass vclass) {
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
std::set<GNEEdge*> setOfEdges;
for (const auto& edge : selectedEdges) {
setOfEdges.insert(edge);
}
for (const auto& selectedLane : selectedLanes) {
setOfEdges.insert(myNet->getAttributeCarriers()->retrieveEdge(selectedLane->getParentEdge()->getID()));
}
if (setOfEdges.size() > 0) {
int counter = 0;
for (const auto& edge : setOfEdges) {
if (edge->hasRestrictedLane(vclass)) {
counter++;
}
}
if (counter == 0) {
const std::string header = TLF("Remove vclass % from selected lanes", toString(vclass));
const std::string body = TLF("The selected lanes and edges don't have a restriction to %.", toString(vclass));
GNEInformationBasicDialog(myViewParent->getGNEAppWindows(), header, body);
return 0;
} else {
const std::string header = TLF("Remove vclass % from selected lanes", toString(vclass));
const std::string body = TLF("% restrictions to % will be removed. Continue?", toString(setOfEdges.size() - counter), toString(vclass));
const auto questionDialog = GNEQuestionBasicDialog(myViewParent->getGNEAppWindows(), GNEDialog::Buttons::YES_NO, header, body);
if (questionDialog.getResult() != GNEDialog::Result::ACCEPT) {
return 0;
}
}
myUndoList->begin(lane, "Remove restrictions for " + toString(vclass));
for (const auto& edge : setOfEdges) {
myNet->removeRestrictedLane(vclass, edge, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(lane, TL("Remove vclass for ") + toString(vclass));
myNet->removeRestrictedLane(vclass, lane->getParentEdge(), myUndoList);
myUndoList->end();
}
return 1;
}
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4355)
#endif
GNEViewNet::GNEViewNet() :
myViewObjectsSelector(this),
myEditModes(this),
myTestingMode(this),
myCommonCheckableButtons(this),
myNetworkCheckableButtons(this),
myDemandCheckableButtons(this),
myDataCheckableButtons(this),
myNetworkViewOptions(this),
myDemandViewOptions(this),
myDataViewOptions(this),
myIntervalBar(this),
myMoveSingleElement(this),
myMoveMultipleElements(this),
myVehicleOptions(this),
myVehicleTypeOptions(this),
mySaveElements(this),
myTimeFormat(this),
mySelectingArea(this),
myEditNetworkElementShapes(this),
myLockManager(this) {
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif
std::vector<std::string>
GNEViewNet::getEdgeLaneParamKeys(bool edgeKeys) const {
std::set<std::string> keys;
for (const NBEdge* e : myNet->getEdgeCont().getAllEdges()) {
if (edgeKeys) {
for (const auto& item : e->getParametersMap()) {
keys.insert(item.first);
}
for (const auto& con : e->getConnections()) {
for (const auto& item : con.getParametersMap()) {
keys.insert(item.first);
}
}
} else {
for (const auto& lane : e->getLanes()) {
int i = 0;
for (const auto& item : lane.getParametersMap()) {
keys.insert(item.first);
}
for (const auto& con : e->getConnectionsFromLane(i)) {
for (const auto& item : con.getParametersMap()) {
keys.insert(item.first);
}
}
i++;
}
}
}
return std::vector<std::string>(keys.begin(), keys.end());
}
std::vector<std::string>
GNEViewNet::getEdgeDataAttrs() const {
std::set<std::string> keys;
for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(GNE_TAG_EDGEREL_SINGLE)) {
for (const auto& parameter : genericData.second->getACParametersMap()) {
keys.insert(parameter.first);
}
}
return std::vector<std::string>(keys.begin(), keys.end());
}
std::vector<std::string>
GNEViewNet::getRelDataAttrs() const {
std::set<std::string> keys;
for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_TAZREL)) {
for (const auto& parameter : genericData.second->getACParametersMap()) {
keys.insert(parameter.first);
}
}
for (const auto& genericData : myNet->getAttributeCarriers()->getGenericDatas().at(SUMO_TAG_EDGEREL)) {
for (const auto& parameter : genericData.second->getACParametersMap()) {
keys.insert(parameter.first);
}
}
return std::vector<std::string>(keys.begin(), keys.end());
}
bool
GNEViewNet::checkSelectEdges() const {
if ((myNetworkViewOptions.selectEdges() && !myMouseButtonKeyPressed.shiftKeyPressed()) ||
(!myNetworkViewOptions.selectEdges() && myMouseButtonKeyPressed.shiftKeyPressed())) {
return true;
} else {
return false;
}
}
int
GNEViewNet::getDrawingToggle() const {
return myDrawingToggle;
}
int
GNEViewNet::doPaintGL(int mode, const Boundary& drawingBoundary) {
myVisualizationSettings->lefthand = OptionsCont::getOptions().getBool("lefthand");
myVisualizationSettings->disableLaneIcons = OptionsCont::getOptions().getBool("disable-laneIcons");
updateObjectsInPosition(myNet->getViewNet()->getPositionInformation());
redrawPathElementContours();
glRenderMode(mode);
glMatrixMode(GL_MODELVIEW);
GLHelper::pushMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
mySelectingArea.drawRectangleSelection(myVisualizationSettings->colorSettings.selectionColor);
drawDecals();
drawGrid();
myNetworkViewOptions.menuCheckShowConnections->setChecked(myVisualizationSettings->showLane2Lane);
drawTemporalJunction();
drawTemporalDrawingShape();
myTestingMode.drawTestingElements(myApp);
myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->drawTemporalConsecutiveLanePath();
myViewParent->getWireFrame()->getConsecutiveLaneSelector()->drawTemporalConsecutiveLanePath();
myViewParent->getVehicleFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getPersonFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getPersonPlanFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getContainerFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getContainerPlanFrame()->getPlanCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getRouteFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
myViewParent->getEdgeRelDataFrame()->getPathCreator()->drawTemporalRoute(*myVisualizationSettings);
if (myEditModes.isCurrentSupermodeDemand()) {
if (myDemandViewOptions.getLockedPerson()) {
myDemandViewOptions.menuCheckShowAllPersonPlans->disable();
} else {
myDemandViewOptions.menuCheckShowAllPersonPlans->enable();
}
}
myNet->getNetworkPathManager()->getPathDraw()->clearPathDraw();
myNet->getDemandPathManager()->getPathDraw()->clearPathDraw();
myNet->getDataPathManager()->getPathDraw()->clearPathDraw();
myVisualizationSettings->updateIgnoreHideByZoom();
myNet->drawGL(*myVisualizationSettings);
int hits = drawGLElements(drawingBoundary);
myViewObjectsSelector.updateMergingJunctions();
drawTemporalSplitJunction();
drawTemporalRoundabout();
drawTemporalE1TLSLines();
drawTemporalJunctionTLSLines();
drawNeteditAttributesReferences();
drawTestsCircle();
GLHelper::popMatrix();
myIntervalBar.markForUpdate();
return hits;
}
long
GNEViewNet::onLeftBtnPress(FXObject* obj, FXSelector, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
setFocus();
myMouseButtonKeyPressed.update(eventData);
if (myEditModes.isCurrentSupermodeNetwork()) {
processLeftButtonPressNetwork(eventData);
} else if (myEditModes.isCurrentSupermodeDemand()) {
processLeftButtonPressDemand(eventData);
} else if (myEditModes.isCurrentSupermodeData()) {
processLeftButtonPressData(eventData);
}
updateCursor();
updateViewNet();
return 1;
} else {
return 0;
}
}
long
GNEViewNet::onLeftBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
if (myCreatedPopup) {
myCreatedPopup = false;
return 1;
}
GUISUMOAbstractView::onLeftBtnRelease(obj, sel, eventData);
myMouseButtonKeyPressed.update(eventData);
if (myEditModes.isCurrentSupermodeNetwork()) {
processLeftButtonReleaseNetwork();
} else if (myEditModes.isCurrentSupermodeDemand()) {
processLeftButtonReleaseDemand();
} else if (myEditModes.isCurrentSupermodeData()) {
processLeftButtonReleaseData();
}
updateCursor();
updateViewNet();
return 1;
} else {
return 0;
}
}
long
GNEViewNet::onMiddleBtnPress(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
GUISUMOAbstractView::onMiddleBtnPress(obj, sel, eventData);
updateCursor();
updateViewNet();
return 1;
} else {
return 0;
}
}
long
GNEViewNet::onMiddleBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
GUISUMOAbstractView::onMiddleBtnRelease(obj, sel, eventData);
updateCursor();
updateViewNet();
return 1;
} else {
return 0;
}
}
long
GNEViewNet::onRightBtnPress(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
myMouseButtonKeyPressed.update(eventData);
updateCursor();
if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
return 1;
} else {
return GUISUMOAbstractView::onRightBtnPress(obj, sel, eventData);
}
} else {
return 0;
}
}
long
GNEViewNet::onRightBtnRelease(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
myMouseButtonKeyPressed.update(eventData);
updateCursor();
if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
return 1;
} else {
return GUISUMOAbstractView::onRightBtnRelease(obj, sel, eventData);
}
} else {
return 0;
}
}
long
GNEViewNet::onMouseMove(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
GUISUMOAbstractView::onMouseMove(obj, sel, eventData);
myMouseButtonKeyPressed.update(eventData);
updateCursor();
if (myEditModes.isCurrentSupermodeNetwork()) {
processMoveMouseNetwork(myMouseButtonKeyPressed.mouseLeftButtonPressed());
} else if (myEditModes.isCurrentSupermodeDemand()) {
processMoveMouseDemand(myMouseButtonKeyPressed.mouseLeftButtonPressed());
} else if (myEditModes.isCurrentSupermodeData()) {
processMoveMouseData(myMouseButtonKeyPressed.mouseLeftButtonPressed());
}
updateViewNet();
return 1;
} else {
return 0;
}
}
long
GNEViewNet::onKeyPress(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
myMouseButtonKeyPressed.update(eventData);
updateCursor();
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
updateViewNet();
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) || (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE)) {
updateViewNet();
}
return GUISUMOAbstractView::onKeyPress(obj, sel, eventData);
} else {
return 0;
}
}
long
GNEViewNet::onKeyRelease(FXObject* obj, FXSelector sel, void* eventData) {
if (myViewParent->getGNEAppWindows()->allowInputSignals(obj)) {
myMouseButtonKeyPressed.update(eventData);
updateCursor();
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
updateViewNet();
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) || (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE)) {
updateViewNet();
}
if (mySelectingArea.selectingUsingRectangle && !myMouseButtonKeyPressed.shiftKeyPressed()) {
mySelectingArea.selectingUsingRectangle = false;
updateViewNet();
}
return GUISUMOAbstractView::onKeyRelease(obj, sel, eventData);
} else {
return 0;
}
}
void
GNEViewNet::abortOperation(bool clearSelection) {
setFocus();
if (myEditModes.isCurrentSupermodeNetwork()) {
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) {
myViewParent->getCreateEdgeFrame()->abortEdgeCreation();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
mySelectingArea.selectingUsingRectangle = false;
if (clearSelection) {
myViewParent->getSelectorFrame()->clearCurrentSelection();
}
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
myViewParent->getConnectorFrame()->getConnectionModifications()->onCmdCancelModifications(0, 0, 0);
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS) {
if (myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled()) {
myViewParent->getTLSEditorFrame()->getTLSAttributes()->disableE1DetectorMode();
} else if (myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions()) {
myViewParent->getTLSEditorFrame()->getTLSJunction()->onCmdCancelJoin(nullptr, 0, nullptr);
} else {
myViewParent->getTLSEditorFrame()->getTLSPrograms()->discardChanges(false);
}
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
myEditNetworkElementShapes.stopEditCustomShape();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CROSSING) {
myViewParent->getCrossingFrame()->clearEdgesHotkey();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) {
myViewParent->getShapeFrame()->getDrawingShapeModule()->abortDrawing();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->abortDrawing();
} else if (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() != nullptr) {
myViewParent->getTAZFrame()->getCurrentTAZModule()->setTAZ(nullptr);
}
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_PROHIBITION) {
myViewParent->getProhibitionFrame()->getSelectionModul()->onCmdCancel(nullptr, 0, nullptr);
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
myViewParent->getAdditionalFrame()->getViewObjetsSelector()->clearSelection();
myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->abortPathCreation();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_WIRE) {
myViewParent->getWireFrame()->getConsecutiveLaneSelector()->abortPathCreation();
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
if (myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) {
mySelectingArea.selectingUsingRectangle = false;
if (clearSelection) {
myViewParent->getSelectorFrame()->clearCurrentSelection();
}
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
myViewParent->getRouteFrame()->getPathCreator()->abortPathCreation();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
myViewParent->getVehicleFrame()->getPathCreator()->abortPathCreation();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
myViewParent->getPersonFrame()->getPlanCreator()->abortPathCreation();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
myViewParent->getPersonPlanFrame()->getPlanCreator()->abortPathCreation();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
myViewParent->getContainerFrame()->getPlanCreator()->abortPathCreation();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
myViewParent->getContainerPlanFrame()->getPlanCreator()->abortPathCreation();
}
} else if (myEditModes.isCurrentSupermodeData()) {
if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
mySelectingArea.selectingUsingRectangle = false;
if (clearSelection) {
myViewParent->getSelectorFrame()->clearCurrentSelection();
}
} else if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
myViewParent->getEdgeRelDataFrame()->getPathCreator()->abortPathCreation();
} else if (myEditModes.dataEditMode == DataEditMode::DATA_TAZRELDATA) {
myViewParent->getTAZRelDataFrame()->clearTAZSelection();
}
}
myUndoList->abortAllChangeGroups();
updateViewNet();
}
void
GNEViewNet::hotkeyDel() {
if (myEditModes.isCurrentSupermodeNetwork()) {
if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) || (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS)) {
setStatusBarText(TL("Cannot delete in this mode"));
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT) && myInspectedElements.getFirstAC()) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete network inspected elements"));
while (myInspectedElements.isInspectingElements()) {
deleteNetworkAttributeCarrier(myInspectedElements.getFirstAC());
}
myUndoList->end();
} else {
const auto selectedNetworkACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
if (selectedNetworkACs.size() > 0) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete network selection"));
for (const auto selectedAC : selectedNetworkACs) {
deleteNetworkAttributeCarrier(selectedAC);
}
myUndoList->end();
}
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) && myInspectedElements.getFirstAC()) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete demand inspected elements"));
while (myInspectedElements.isInspectingElements()) {
deleteDemandAttributeCarrier(myInspectedElements.getFirstAC());
}
myUndoList->end();
} else {
const auto selectedDemandACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
if (selectedDemandACs.size() > 0) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete demand selection"));
for (const auto selectedAC : selectedDemandACs) {
deleteDemandAttributeCarrier(selectedAC);
}
myUndoList->end();
}
}
} else if (myEditModes.isCurrentSupermodeData()) {
if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) && myInspectedElements.getFirstAC()) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete data inspected elements"));
while (myInspectedElements.isInspectingElements()) {
deleteDataAttributeCarrier(myInspectedElements.getFirstAC());
}
myUndoList->end();
} else {
const auto selectedDataACs = myNet->getAttributeCarriers()->getSelectedAttributeCarriers(false);
if (selectedDataACs.size() > 0) {
myUndoList->begin(GUIIcon::MODEDELETE, TL("delete data selection"));
for (const auto selectedAC : selectedDataACs) {
deleteDataAttributeCarrier(selectedAC);
}
myUndoList->end();
}
}
}
}
void
GNEViewNet::hotkeyEnter() {
if (myEditModes.isCurrentSupermodeNetwork()) {
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
myViewParent->getConnectorFrame()->getConnectionModifications()->onCmdSaveModifications(0, 0, 0);
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TLS) {
if (myViewParent->getTLSEditorFrame()->getTLSAttributes()->isSetDetectorsToggleButtonEnabled()) {
myViewParent->getTLSEditorFrame()->getTLSAttributes()->disableE1DetectorMode();
} else if (myViewParent->getTLSEditorFrame()->getTLSJunction()->isJoiningJunctions()) {
myViewParent->getTLSEditorFrame()->getTLSJunction()->onCmdAcceptJoin(nullptr, 0, nullptr);
} else if (myViewParent->getTLSEditorFrame()->getTLSPrograms()->checkHaveModifications()) {
myViewParent->getTLSEditorFrame()->getTLSPrograms()->onCmdSaveChanges(nullptr, 0, nullptr);
}
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) && (myEditNetworkElementShapes.getEditedNetworkElement() != nullptr)) {
myEditNetworkElementShapes.commitShapeEdited();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) {
if (myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getShapeFrame()->getDrawingShapeModule()->stopDrawing();
} else {
myViewParent->getShapeFrame()->getDrawingShapeModule()->startDrawing();
}
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CROSSING) {
myViewParent->getCrossingFrame()->createCrossingHotkey();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->stopDrawing();
} else if (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() == nullptr) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->startDrawing();
} else if (myViewParent->getTAZFrame()->getTAZSaveChangesModule()->isChangesPending()) {
myViewParent->getTAZFrame()->getTAZSaveChangesModule()->onCmdSaveChanges(0, 0, 0);
}
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
myViewParent->getAdditionalFrame()->createPath(false);
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_WIRE) {
myViewParent->getWireFrame()->createPath(false);
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
myViewParent->getRouteFrame()->getPathCreator()->createPath(false);
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
myViewParent->getVehicleFrame()->getPathCreator()->onCmdCreatePath(nullptr, 0, nullptr);
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
myViewParent->getPersonFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
myViewParent->getPersonPlanFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
myViewParent->getContainerFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
myViewParent->getContainerPlanFrame()->getPlanCreator()->onCmdCreatePath(nullptr, 0, nullptr);
}
} else if (myEditModes.isCurrentSupermodeData()) {
if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
myViewParent->getEdgeRelDataFrame()->getPathCreator()->createPath(false);
} else if (myEditModes.dataEditMode == DataEditMode::DATA_TAZRELDATA) {
myViewParent->getTAZRelDataFrame()->buildTAZRelationData();
}
}
}
void
GNEViewNet::hotkeyBackSpace() {
if (myEditModes.isCurrentSupermodeNetwork()) {
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) {
myViewParent->getAdditionalFrame()->getConsecutiveLaneSelector()->removeLastElement();
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
if (myEditModes.demandEditMode == DemandEditMode::DEMAND_ROUTE) {
myViewParent->getRouteFrame()->getPathCreator()->removeLastElement();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) {
myViewParent->getVehicleFrame()->getPathCreator()->removeLastElement();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSON) {
myViewParent->getPersonFrame()->getPlanCreator()->removeLastElement();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) {
myViewParent->getPersonPlanFrame()->getPlanCreator()->removeLastElement();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) {
myViewParent->getContainerFrame()->getPlanCreator()->removeLastElement();
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) {
myViewParent->getContainerPlanFrame()->getPlanCreator()->removeLastElement();
}
} else if (myEditModes.isCurrentSupermodeData()) {
if (myEditModes.dataEditMode == DataEditMode::DATA_EDGERELDATA) {
myViewParent->getEdgeRelDataFrame()->getPathCreator()->removeLastElement();
}
}
}
void
GNEViewNet::hotkeyFocusFrame() {
if (myCurrentFrame != nullptr) {
myCurrentFrame->focusUpperElement();
} else {
setFocus();
}
}
GNEViewParent*
GNEViewNet::getViewParent() const {
return myViewParent;
}
GNENet*
GNEViewNet::getNet() const {
return myNet;
}
GNEUndoList*
GNEViewNet::getUndoList() const {
return myUndoList;
}
GNEViewNetHelper::IntervalBar&
GNEViewNet::getIntervalBar() {
return myIntervalBar;
}
GNEViewNetHelper::LockManager&
GNEViewNet::getLockManager() {
return myLockManager;
}
GNEViewNetHelper::InspectedElements&
GNEViewNet::getInspectedElements() {
return myInspectedElements;
}
GNEViewNetHelper::MarkFrontElements&
GNEViewNet::getMarkFrontElements() {
return myMarkFrontElements;
}
bool
GNEViewNet::isCurrentlyMovingElements() const {
return myMoveSingleElement.isCurrentlyMovingSingleElement() || myMoveMultipleElements.isCurrentlyMovingMultipleElements();
}
bool
GNEViewNet::checkOverLockedElement(const GUIGlObject* GLObject, const bool isSelected) const {
if (myLockManager.isObjectLocked(GLObject->getType(), isSelected)) {
return false;
}
const auto glObjectFront = myViewObjectsSelector.getGUIGlObjectFront();
if (glObjectFront) {
if (glObjectFront == GLObject) {
return true;
} else if (glObjectFront->getType() == GLObject->getType()) {
for (const auto& glObjectUnderCursor : myViewObjectsSelector.getGLObjects()) {
if (glObjectUnderCursor == GLObject) {
return true;
}
}
}
}
return false;
}
GNEDemandElement*
GNEViewNet::getLastCreatedRoute() const {
return myLastCreatedRoute;
}
void
GNEViewNet::setLastCreatedRoute(GNEDemandElement* lastCreatedRoute) {
myLastCreatedRoute = lastCreatedRoute;
}
GNEJunction*
GNEViewNet::getJunctionAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto junction = myNet->getAttributeCarriers()->retrieveJunction(glObject.object->getMicrosimID(), false);
if (junction) {
return junction;
}
}
}
return nullptr;
}
GNEConnection*
GNEViewNet::getConnectionAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto connection = myNet->getAttributeCarriers()->retrieveConnection(glObject.object, false);
if (connection) {
return connection;
}
}
}
return nullptr;
}
GNECrossing*
GNEViewNet::getCrossingAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto crossing = myNet->getAttributeCarriers()->retrieveCrossing(glObject.object, false);
if (crossing) {
return crossing;
}
}
}
return nullptr;
}
GNEWalkingArea*
GNEViewNet::getWalkingAreaAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto walkingArea = myNet->getAttributeCarriers()->retrieveWalkingArea(glObject.object, false);
if (walkingArea) {
return walkingArea;
}
}
}
return nullptr;
}
GNEEdge*
GNEViewNet::getEdgeAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto edge = myNet->getAttributeCarriers()->retrieveEdge(glObject.object->getMicrosimID(), false);
if (edge) {
return edge;
}
}
}
return nullptr;
}
GNELane*
GNEViewNet::getLaneAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto lane = myNet->getAttributeCarriers()->retrieveLane(glObject.object, false);
if (lane) {
return lane;
}
}
}
return nullptr;
}
GNEAdditional*
GNEViewNet::getAdditionalAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto additionalElement = myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false);
if (additionalElement) {
return additionalElement;
}
}
}
return nullptr;
}
GNEDemandElement*
GNEViewNet::getDemandElementAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto demandElement = myNet->getAttributeCarriers()->retrieveDemandElement(glObject.object, false);
if (demandElement) {
return demandElement;
}
}
}
return nullptr;
}
GNEPoly*
GNEViewNet::getPolygonAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto polygon = dynamic_cast<GNEPoly*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
if (polygon) {
return polygon;
}
}
}
return nullptr;
}
GNEPOI*
GNEViewNet::getPOIAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto POI = dynamic_cast<GNEPOI*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
if (POI) {
return POI;
}
}
}
return nullptr;
}
GNETAZ*
GNEViewNet::getTAZAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
auto TAZ = dynamic_cast<GNETAZ*>(myNet->getAttributeCarriers()->retrieveAdditional(glObject.object, false));
if (TAZ) {
return TAZ;
}
}
}
return nullptr;
}
GNENetworkElement*
GNEViewNet::getShapeEditedAtPopupPosition() {
for (const auto& glObjectLayer : gViewObjectsHandler.getSelectedObjects()) {
for (const auto& glObject : glObjectLayer.second) {
if (glObject.object->getType() == GLO_JUNCTION) {
auto junction = myNet->getAttributeCarriers()->retrieveJunction(glObject.object->getMicrosimID());
if (junction->isShapeEdited()) {
return junction;
}
} else if (glObject.object->getType() == GLO_CROSSING) {
auto crossing = myNet->getAttributeCarriers()->retrieveCrossing(glObject.object);
if (crossing->isShapeEdited()) {
return crossing;
}
} else if (glObject.object->getType() == GLO_CONNECTION) {
auto connection = myNet->getAttributeCarriers()->retrieveConnection(glObject.object);
if (connection->isShapeEdited()) {
return connection;
}
}
}
}
return nullptr;
}
long
GNEViewNet::onCmdSetSupermode(FXObject*, FXSelector sel, void*) {
switch (FXSELID(sel)) {
case MID_HOTKEY_F2_SUPERMODE_NETWORK:
if (myEditModes.networkButton->shown()) {
myEditModes.setSupermode(Supermode::NETWORK, false);
}
break;
case MID_HOTKEY_F3_SUPERMODE_DEMAND:
if (myEditModes.demandButton->shown()) {
myEditModes.setSupermode(Supermode::DEMAND, false);
}
break;
case MID_HOTKEY_F4_SUPERMODE_DATA:
if (myEditModes.dataButton->shown()) {
myEditModes.setSupermode(Supermode::DATA, false);
}
break;
default:
break;
}
return 1;
}
long
GNEViewNet::onCmdSetMode(FXObject*, FXSelector sel, void*) {
if (myEditModes.isJuPedSimView()) {
if (myEditModes.isCurrentSupermodeNetwork()) {
switch (FXSELID(sel)) {
case MID_HOTKEY_I_MODE_INSPECT:
case MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE:
case MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT:
case MID_HOTKEY_M_MODE_MOVE_MEANDATA:
case MID_HOTKEY_E_MODE_EDGE_EDGEDATA:
case MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS:
case MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA:
case MID_HOTKEY_P_MODE_POLYGON_PERSON:
case MID_HOTKEY_Z_MODE_TAZ_TAZREL:
break;
default:
return 0;
}
}
if (myEditModes.isCurrentSupermodeDemand()) {
switch (FXSELID(sel)) {
case MID_HOTKEY_I_MODE_INSPECT:
case MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE:
case MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT:
case MID_HOTKEY_P_MODE_POLYGON_PERSON:
case MID_HOTKEY_L_MODE_PERSONPLAN:
case MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA:
case MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION:
case MID_HOTKEY_T_MODE_TLS_TYPE:
case MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION:
break;
default:
return 0;
}
}
if (myEditModes.isCurrentSupermodeData()) {
return 0;
}
}
if (myEditModes.isCurrentSupermodeNetwork()) {
switch (FXSELID(sel)) {
case MID_HOTKEY_I_MODE_INSPECT:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_INSPECT);
break;
case MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_DELETE);
break;
case MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_SELECT);
break;
case MID_HOTKEY_M_MODE_MOVE_MEANDATA:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_MOVE);
break;
case MID_HOTKEY_E_MODE_EDGE_EDGEDATA:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_CREATE_EDGE);
break;
case MID_HOTKEY_C_MODE_CONNECT_CONTAINER:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_CONNECT);
break;
case MID_HOTKEY_T_MODE_TLS_TYPE:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS);
break;
case MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_ADDITIONAL);
break;
case MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_CROSSING);
break;
case MID_HOTKEY_Z_MODE_TAZ_TAZREL:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TAZ);
break;
case MID_HOTKEY_P_MODE_POLYGON_PERSON:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_SHAPE);
break;
case MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_PROHIBITION);
break;
case MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_WIRE);
break;
case MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION:
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_DECAL);
break;
default:
break;
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
switch (FXSELID(sel)) {
case MID_HOTKEY_L_MODE_PERSONPLAN:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_PERSONPLAN);
break;
case MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_CONTAINERPLAN);
break;
case MID_HOTKEY_I_MODE_INSPECT:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_INSPECT);
break;
case MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_DELETE);
break;
case MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_SELECT);
break;
case MID_HOTKEY_M_MODE_MOVE_MEANDATA:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_MOVE);
break;
case MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_ROUTE);
break;
case MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_ROUTEDISTRIBUTION);
break;
case MID_HOTKEY_V_MODE_VEHICLE:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_VEHICLE);
break;
case MID_HOTKEY_T_MODE_TLS_TYPE:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_TYPE);
break;
case MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_TYPEDISTRIBUTION);
break;
case MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_STOP);
break;
case MID_HOTKEY_P_MODE_POLYGON_PERSON:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_PERSON);
break;
case MID_HOTKEY_C_MODE_CONNECT_CONTAINER:
myEditModes.setDemandEditMode(DemandEditMode::DEMAND_CONTAINER);
break;
default:
break;
}
} else if (myEditModes.isCurrentSupermodeData()) {
switch (FXSELID(sel)) {
case MID_HOTKEY_I_MODE_INSPECT:
myEditModes.setDataEditMode(DataEditMode::DATA_INSPECT);
break;
case MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE:
myEditModes.setDataEditMode(DataEditMode::DATA_DELETE);
break;
case MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT:
myEditModes.setDataEditMode(DataEditMode::DATA_SELECT);
break;
case MID_HOTKEY_E_MODE_EDGE_EDGEDATA:
myEditModes.setDataEditMode(DataEditMode::DATA_EDGEDATA);
break;
case MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA:
myEditModes.setDataEditMode(DataEditMode::DATA_EDGERELDATA);
break;
case MID_HOTKEY_Z_MODE_TAZ_TAZREL:
myEditModes.setDataEditMode(DataEditMode::DATA_TAZRELDATA);
break;
case MID_HOTKEY_M_MODE_MOVE_MEANDATA:
myEditModes.setDataEditMode(DataEditMode::DATA_MEANDATA);
break;
default:
break;
}
}
return 1;
}
long
GNEViewNet::onCmdSplitEdge(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
myNet->splitEdge(edge, edge->getSplitPos(getPopupPosition()), myUndoList);
}
return 1;
}
long
GNEViewNet::onCmdSplitEdgeBidi(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
const auto oppositeEdges = edge->getOppositeEdges();
if (oppositeEdges.size() > 0) {
for (const auto& oppositeEdge : oppositeEdges) {
const auto reverseGeometry = oppositeEdge->getNBEdge()->getInnerGeometry().reverse();
if (reverseGeometry == edge->getNBEdge()->getInnerGeometry()) {
myNet->splitEdgesBidi(edge, oppositeEdge, edge->getSplitPos(getPopupPosition()), myUndoList);
return 1;
}
}
}
}
return 1;
}
long
GNEViewNet::onCmdReverseEdge(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("Reverse selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
myNet->reverseEdge(selectedEdge, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("Reverse edge"));
myNet->reverseEdge(edge, myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdAddReversedEdge(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("Add Reverse edge for selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
myNet->addReversedEdge(selectedEdge, false, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("Add reverse edge"));
myNet->addReversedEdge(edge, false, myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdAddReversedEdgeDisconnected(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("Add Reverse disconnected edge for selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
myNet->addReversedEdge(selectedEdge, true, myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("Add reverse disconnected edge"));
myNet->addReversedEdge(edge, true, myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdEditEdgeEndpoint(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
edge->editEndpoint(getPopupPosition(), myUndoList);
}
return 1;
}
long
GNEViewNet::onCmdResetEdgeEndpoint(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
myUndoList->begin(edge, TL("reset geometry points"));
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->resetBothEndpoint(myUndoList);
}
myUndoList->end();
} else {
edge->resetEndpoint(getPopupPosition(), myUndoList);
}
}
return 1;
}
long
GNEViewNet::onCmdStraightenEdges(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("straighten selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("straighten edge"));
edge->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdSmoothEdges(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("smooth selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->smooth(myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("smooth edge"));
edge->smooth(myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdStraightenEdgesElevation(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("straighten elevation of selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->straightenElevation(myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("straighten edge elevation"));
edge->straightenElevation(myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdSmoothEdgesElevation(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("smooth elevation of selected edges"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->smoothElevation(myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("smooth edge elevation"));
edge->smoothElevation(myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdResetLength(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
if (edge->isAttributeCarrierSelected()) {
myUndoList->begin(edge, TL("reset edge lengths"));
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->setAttribute(SUMO_ATTR_LENGTH, "-1", myUndoList);
}
myUndoList->end();
} else {
edge->setAttribute(SUMO_ATTR_LENGTH, "-1", myUndoList);
}
}
return 1;
}
long
GNEViewNet::onCmdEdgeUseAsTemplate(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
if (edge != nullptr) {
myViewParent->getInspectorFrame()->getTemplateEditor()->setEdgeTemplate(edge);
}
return 1;
}
long
GNEViewNet::onCmdEgeApplyTemplate(FXObject*, FXSelector, void*) {
GNEEdge* edgeAtPosition = getEdgeAtPopupPosition();
if ((edgeAtPosition != nullptr) && myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
myUndoList->begin(edgeAtPosition, TL("copy edge template"));
if (edgeAtPosition->isAttributeCarrierSelected()) {
for (const auto& edge : myNet->getAttributeCarriers()->getEdges()) {
if (edge.second->isAttributeCarrierSelected()) {
edge.second->copyTemplate(myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myUndoList);
}
}
} else {
edgeAtPosition->copyTemplate(myViewParent->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myUndoList);
}
myUndoList->end();
}
return 1;
}
long
GNEViewNet::onCmdSimplifyShape(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
if (polygonUnderMouse->isAttributeCarrierSelected()) {
myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("simplify shapes"));
const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
for (const auto& selectedShape : selectedShapes) {
if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
dynamic_cast<GNEPoly*>(selectedShape)->simplifyShape();
}
}
myNet->getViewNet()->getUndoList()->end();
} else {
polygonUnderMouse->simplifyShape();
}
}
return 1;
}
long
GNEViewNet::onCmdDeleteGeometryPoint(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
polygonUnderMouse->deleteGeometryPoint(getPopupPosition());
}
return 1;
}
long
GNEViewNet::onCmdClosePolygon(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
if (polygonUnderMouse->isAttributeCarrierSelected()) {
myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("close polygon shapes"));
const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
for (const auto& selectedShape : selectedShapes) {
if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
dynamic_cast<GNEPoly*>(selectedShape)->closePolygon();
}
}
myNet->getViewNet()->getUndoList()->end();
} else {
polygonUnderMouse->closePolygon();
}
}
return 1;
}
long
GNEViewNet::onCmdOpenPolygon(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
if (polygonUnderMouse->isAttributeCarrierSelected()) {
myNet->getViewNet()->getUndoList()->begin(polygonUnderMouse, TL("open polygon shapes"));
const auto selectedShapes = myNet->getAttributeCarriers()->getSelectedShapes();
for (const auto& selectedShape : selectedShapes) {
if ((selectedShape->getTagProperty()->getTag() == SUMO_TAG_POLY) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_WALKABLEAREA) ||
(selectedShape->getTagProperty()->getTag() == GNE_TAG_JPS_OBSTACLE)) {
dynamic_cast<GNEPoly*>(selectedShape)->openPolygon();
}
}
myNet->getViewNet()->getUndoList()->end();
} else {
polygonUnderMouse->openPolygon();
}
}
return 1;
}
long
GNEViewNet::onCmdSelectPolygonElements(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
updateObjectsInShape(polygonUnderMouse->getShape());
std::vector<GNEAttributeCarrier*> ACsUnderPolygon;
ACsUnderPolygon.reserve(myViewObjectsSelector.getAttributeCarriers().size());
for (const auto& AC : myViewObjectsSelector.getAttributeCarriers()) {
if ((AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) && checkSelectEdges()) {
ACsUnderPolygon.push_back(AC);
} else if ((AC->getTagProperty()->getTag() == SUMO_TAG_LANE) && !checkSelectEdges()) {
ACsUnderPolygon.push_back(AC);
} else if (!AC->getTagProperty()->isSymbol() && (AC != polygonUnderMouse)) {
ACsUnderPolygon.push_back(AC);
}
}
if (ACsUnderPolygon.size() > 0) {
myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODESELECT, TL("select within polygon boundary"));
for (const auto& AC : ACsUnderPolygon) {
AC->setAttribute(GNE_ATTR_SELECTED, "true", myUndoList);
}
myNet->getViewNet()->getUndoList()->end();
}
}
return 1;
}
long
GNEViewNet::onCmdTriangulatePolygon(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
GNEAdditionalHandler additionalHandler(myNet, polygonUnderMouse->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
const auto triangulation = Triangle::triangulate(polygonUnderMouse->getShape());
myNet->getViewNet()->getUndoList()->begin(GUIIcon::POLY, TL("triangulate polygon"));
for (const auto& triangle : triangulation) {
auto basePolygon = polygonUnderMouse->getSumoBaseObject();
basePolygon->addStringAttribute(SUMO_ATTR_ID, myNet->getAttributeCarriers()->generateAdditionalID(polygonUnderMouse->getTagProperty()->getTag()));
basePolygon->addPositionVectorAttribute(SUMO_ATTR_SHAPE, triangle.getShape());
additionalHandler.parseSumoBaseObject(basePolygon);
}
myNet->deleteAdditional(polygonUnderMouse, myNet->getViewNet()->getUndoList());
myNet->getViewNet()->getUndoList()->end();
}
return 1;
}
long
GNEViewNet::onCmdSetFirstGeometryPoint(FXObject*, FXSelector, void*) {
GNEPoly* polygonUnderMouse = getPolygonAtPopupPosition();
if (polygonUnderMouse) {
polygonUnderMouse->changeFirstGeometryPoint(polygonUnderMouse->getVertexIndex(getPopupPosition(), false));
}
return 1;
}
long
GNEViewNet::onCmdSimplifyShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->simplifyShapeEdited(undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdStraightenShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
undoList->begin(shapeEdited, TL("straighten edited shape"));
shapeEdited->straigthenShapeEdited(undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdCloseShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->closeShapeEdited(undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdOpenShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->openShapeEdited(undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdSetFirstGeometryPointShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
const auto geometryPointIndex = shapeEdited->getGeometryPointUnderCursorShapeEdited();
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->setFirstGeometryPointShapeEdited(geometryPointIndex, undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdDeleteGeometryPointShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
const auto geometryPointIndex = shapeEdited->getGeometryPointUnderCursorShapeEdited();
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->deleteGeometryPointShapeEdited(geometryPointIndex, undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdResetShapeEdited(FXObject*, FXSelector, void*) {
auto undoList = myNet->getViewNet()->getUndoList();
GNENetworkElement* shapeEdited = getShapeEditedAtPopupPosition();
if (shapeEdited) {
undoList->begin(shapeEdited, TL("simplify edited shape"));
shapeEdited->resetShapeEdited(undoList);
undoList->end();
}
return 1;
}
long
GNEViewNet::onCmdFinishShapeEdited(FXObject*, FXSelector, void*) {
hotkeyEnter();
return 1;
}
long
GNEViewNet::onCmdTransformPOI(FXObject*, FXSelector, void*) {
GNEPOI* POI = getPOIAtPopupPosition();
if (POI) {
GNEAdditionalHandler additionalHandler(myNet, POI->getFilename(), myViewParent->getGNEAppWindows()->isUndoRedoAllowed());
if (POI->getTagProperty()->getTag() == SUMO_TAG_POI) {
std::vector<GUIGlID> GLIDs = getObjectsInBoundary(POI->getCenteringBoundary());
std::vector<GNELane*> lanes;
for (const auto& GLID : GLIDs) {
GNELane* lane = dynamic_cast<GNELane*>(GUIGlObjectStorage::gIDStorage.getObjectBlocking(GLID));
if (lane) {
lanes.push_back(lane);
}
}
if (lanes.empty()) {
WRITE_WARNINGF(TL("No lanes around % to attach it"), toString(SUMO_TAG_POI));
} else {
GNELane* nearestLane = lanes.front();
double minorPosOverLane = nearestLane->getLaneShape().nearest_offset_to_point2D(POI->getPositionInView());
double minorLateralOffset = nearestLane->getLaneShape().positionAtOffset(minorPosOverLane).distanceTo(POI->getPositionInView());
for (const auto& lane : lanes) {
double posOverLane = lane->getLaneShape().nearest_offset_to_point2D(POI->getPositionInView());
double lateralOffset = lane->getLaneShape().positionAtOffset(posOverLane).distanceTo(POI->getPositionInView());
if (lateralOffset < minorLateralOffset) {
minorPosOverLane = posOverLane;
minorLateralOffset = lateralOffset;
nearestLane = lane;
}
}
CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
POIBaseObject->addStringAttribute(SUMO_ATTR_LANE, nearestLane->getID());
POIBaseObject->addDoubleAttribute(SUMO_ATTR_POSITION, minorPosOverLane);
POIBaseObject->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, POI->getFriendlyPos());
POIBaseObject->addDoubleAttribute(SUMO_ATTR_POSITION_LAT, 0);
myUndoList->begin(POI, TL("attach POI into lane"));
myNet->deleteAdditional(POI, myUndoList);
additionalHandler.parseSumoBaseObject(POIBaseObject);
myUndoList->end();
}
} else {
CommonXMLStructure::SumoBaseObject* POIBaseObject = POI->getSumoBaseObject();
POIBaseObject->addDoubleAttribute(SUMO_ATTR_X, POI->x());
POIBaseObject->addDoubleAttribute(SUMO_ATTR_Y, POI->y());
myUndoList->begin(POI, TL("release POI from lane"));
myNet->deleteAdditional(POI, myUndoList);
additionalHandler.parseSumoBaseObject(POIBaseObject);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdReverse(FXObject*, FXSelector, void*) {
GNEDemandElement* demandElement = getDemandElementAtPopupPosition();
if (demandElement) {
myUndoList->begin(demandElement, TLF("reverse % '%'", demandElement->getTagStr(), demandElement->getID()));
GNERouteHandler::reverse(demandElement);
myUndoList->end();
}
return 1;
}
long
GNEViewNet::onCmdAddReverse(FXObject*, FXSelector, void*) {
GNEDemandElement* demandElement = getDemandElementAtPopupPosition();
if (demandElement) {
myUndoList->begin(demandElement, TLF("add reverse '%'", demandElement->getTagStr()));
GNERouteHandler::addReverse(demandElement);
myUndoList->end();
}
return 1;
}
long
GNEViewNet::onCmdSetCustomGeometryPoint(FXObject*, FXSelector, void*) {
GNEEdge* edge = getEdgeAtPopupPosition();
GNEPoly* poly = getPolygonAtPopupPosition();
GNETAZ* TAZ = getTAZAtPopupPosition();
if (edge != nullptr) {
auto edgeGeometry = edge->getNBEdge()->getGeometry();
const int index = edgeGeometry.indexOfClosest(getPositionInformation(), true);
const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), edgeGeometry[index]);
if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != edgeGeometry[index])) {
edgeGeometry[index] = geometryPointDialog.getEditedPosition();
myUndoList->begin(edge, TL("change edge Geometry Point position"));
if (index == 0) {
GNEChange_Attribute::changeAttribute(edge, GNE_ATTR_SHAPE_START, toString(edgeGeometry.front()), myUndoList);
} else if (index == ((int)edgeGeometry.size() - 1)) {
GNEChange_Attribute::changeAttribute(edge, GNE_ATTR_SHAPE_END, toString(edgeGeometry.back()), myUndoList);
} else {
edgeGeometry.pop_front();
edgeGeometry.pop_back();
GNEChange_Attribute::changeAttribute(edge, SUMO_ATTR_SHAPE, toString(edgeGeometry), myUndoList);
}
myUndoList->end();
}
} else if (poly != nullptr) {
PositionVector polygonGeometry = poly->getShape();
const int index = polygonGeometry.indexOfClosest(getPositionInformation(), true);
const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), polygonGeometry[index]);
if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != polygonGeometry[index])) {
polygonGeometry[index] = geometryPointDialog.getEditedPosition();
myUndoList->begin(poly, TL("change polygon Geometry Point position"));
GNEChange_Attribute::changeAttribute(poly, SUMO_ATTR_SHAPE, toString(polygonGeometry), myUndoList);
myUndoList->end();
}
} else if (TAZ != nullptr) {
PositionVector TAZGeometry = TAZ->getAdditionalGeometry().getShape();
const int index = TAZGeometry.indexOfClosest(getPositionInformation(), true);
const auto geometryPointDialog = GNEGeometryPointDialog(myViewParent->getGNEAppWindows(), TAZGeometry[index]);
if ((geometryPointDialog.getResult() == GNEDialog::Result::ACCEPT) && (geometryPointDialog.getEditedPosition() != TAZGeometry[index])) {
TAZGeometry[index] = geometryPointDialog.getEditedPosition();
myUndoList->begin(TAZ, TL("change TAZ Geometry Point position"));
GNEChange_Attribute::changeAttribute(TAZ, SUMO_ATTR_SHAPE, toString(TAZGeometry), myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdResetEndPoints(FXObject*, FXSelector, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition != nullptr) {
GNEEdge* edge = laneAtPopupPosition->getParentEdge();
if (edge->isAttributeCarrierSelected()) {
const auto selectedEdges = myNet->getAttributeCarriers()->getSelectedEdges();
myUndoList->begin(edge, TL("reset end points of selected edges"));
for (const auto& selectedEdge : selectedEdges) {
selectedEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
selectedEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(edge, TL("reset end points of edge '") + edge->getID());
edge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
edge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdDuplicateLane(FXObject*, FXSelector, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition != nullptr) {
if (laneAtPopupPosition->isAttributeCarrierSelected()) {
myUndoList->begin(laneAtPopupPosition, TL("duplicate selected lanes"));
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
for (const auto& lane : selectedLanes) {
myNet->duplicateLane(lane, myUndoList, true);
}
myUndoList->end();
} else {
myUndoList->begin(laneAtPopupPosition, TL("duplicate lane"));
myNet->duplicateLane(laneAtPopupPosition, myUndoList, false);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdEditLaneShape(FXObject*, FXSelector, void*) {
GNELane* lane = getLaneAtPopupPosition();
if (lane) {
myEditNetworkElementShapes.startEditCustomShape(lane);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdResetLaneCustomShape(FXObject*, FXSelector, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition != nullptr) {
if (laneAtPopupPosition->isAttributeCarrierSelected()) {
myUndoList->begin(laneAtPopupPosition, TL("reset custom lane shapes"));
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
for (const auto& lane : selectedLanes) {
lane->setAttribute(SUMO_ATTR_CUSTOMSHAPE, "", myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(laneAtPopupPosition, TL("reset custom lane shape"));
laneAtPopupPosition->setAttribute(SUMO_ATTR_CUSTOMSHAPE, "", myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdResetOppositeLane(FXObject*, FXSelector, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition != nullptr) {
if (laneAtPopupPosition->isAttributeCarrierSelected()) {
myUndoList->begin(laneAtPopupPosition, TL("reset opposite lanes"));
const auto selectedLanes = myNet->getAttributeCarriers()->getSelectedLanes();
for (const auto& lane : selectedLanes) {
lane->setAttribute(GNE_ATTR_OPPOSITE, "", myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(laneAtPopupPosition, TL("reset opposite lane"));
laneAtPopupPosition->setAttribute(GNE_ATTR_OPPOSITE, "", myUndoList);
myUndoList->end();
}
}
return 1;
}
long
GNEViewNet::onCmdLaneOperation(FXObject*, FXSelector sel, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition) {
switch (FXSELID(sel)) {
case MID_GNE_LANE_TRANSFORM_SIDEWALK:
return restrictLane(laneAtPopupPosition, SVC_PEDESTRIAN);
case MID_GNE_LANE_TRANSFORM_BIKE:
return restrictLane(laneAtPopupPosition, SVC_BICYCLE);
case MID_GNE_LANE_TRANSFORM_BUS:
return restrictLane(laneAtPopupPosition, SVC_BUS);
case MID_GNE_LANE_TRANSFORM_GREENVERGE:
return restrictLane(laneAtPopupPosition, SVC_IGNORING);
case MID_GNE_LANE_ADD_SIDEWALK:
return addRestrictedLane(laneAtPopupPosition, SVC_PEDESTRIAN, false);
case MID_GNE_LANE_ADD_BIKE:
return addRestrictedLane(laneAtPopupPosition, SVC_BICYCLE, false);
case MID_GNE_LANE_ADD_BUS:
return addRestrictedLane(laneAtPopupPosition, SVC_BUS, false);
case MID_GNE_LANE_ADD_GREENVERGE_FRONT:
return addRestrictedLane(laneAtPopupPosition, SVC_IGNORING, true);
case MID_GNE_LANE_ADD_GREENVERGE_BACK:
return addRestrictedLane(laneAtPopupPosition, SVC_IGNORING, false);
case MID_GNE_LANE_REMOVE_SIDEWALK:
return removeRestrictedLane(laneAtPopupPosition, SVC_PEDESTRIAN);
case MID_GNE_LANE_REMOVE_BIKE:
return removeRestrictedLane(laneAtPopupPosition, SVC_BICYCLE);
case MID_GNE_LANE_REMOVE_BUS:
return removeRestrictedLane(laneAtPopupPosition, SVC_BUS);
case MID_GNE_LANE_REMOVE_GREENVERGE:
return removeRestrictedLane(laneAtPopupPosition, SVC_IGNORING);
default:
return 0;
}
} else {
return 0;
}
}
long
GNEViewNet::onCmdLaneReachability(FXObject* menu, FXSelector, void*) {
GNELane* laneAtPopupPosition = getLaneAtPopupPosition();
if (laneAtPopupPosition != nullptr) {
const SUMOVehicleClass vClass = SumoVehicleClassStrings.get(dynamic_cast<FXMenuCommand*>(menu)->getText().text());
myNet->getDemandPathManager()->getPathCalculator()->calculateReachability(vClass, laneAtPopupPosition->getParentEdge());
myUndoList->begin(laneAtPopupPosition, TL("select lane reachability"));
for (const auto& edge : myNet->getAttributeCarriers()->getEdges()) {
for (const auto& lane : edge.second->getChildLanes()) {
if (lane->getReachability() >= 0) {
lane->setAttribute(GNE_ATTR_SELECTED, "true", myUndoList);
}
}
}
myUndoList->end();
}
return 1;
}
long
GNEViewNet::onCmdOpenAdditionalDialog(FXObject*, FXSelector, void*) {
GNEAdditional* addtional = getAdditionalAtPopupPosition();
if (addtional && addtional->getTagProperty()->hasDialog()) {
addtional->openAdditionalDialog();
}
return 1;
}
void
GNEViewNet::processClick(void* eventData) {
FXEvent* evt = (FXEvent*)eventData;
destroyPopup();
setFocus();
myChanger->onLeftBtnPress(eventData);
grab();
if (evt->click_count == 2) {
handle(this, FXSEL(SEL_DOUBLECLICKED, 0), eventData);
}
}
void
GNEViewNet::updateCursor() {
if (myPanning) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::MOVEVIEW));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::MOVEVIEW));
} else {
bool cursorMoveView = false;
bool cursorInspect = false;
bool cursorSelect = false;
bool cursorMoveElement = false;
bool cursorDelete = false;
if (myEditModes.isCurrentSupermodeNetwork()) {
if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) ||
(myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) ||
(myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL) ||
(myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) ||
(myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ)) {
cursorMoveView = true;
}
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT) {
cursorInspect = true;
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
cursorSelect = true;
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_MOVE) {
cursorMoveElement = true;
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_DELETE) {
cursorDelete = true;
}
} else if (myEditModes.isCurrentSupermodeDemand()) {
if ((myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) ||
(myEditModes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) ||
(myEditModes.demandEditMode == DemandEditMode::DEMAND_STOP)) {
cursorMoveView = true;
}
if (myEditModes.demandEditMode == DemandEditMode::DEMAND_INSPECT) {
cursorInspect = true;
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) {
cursorSelect = true;
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_MOVE) {
cursorMoveElement = true;
} else if (myEditModes.demandEditMode == DemandEditMode::DEMAND_DELETE) {
cursorDelete = true;
}
} else if (myEditModes.isCurrentSupermodeData()) {
if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
cursorMoveView = true;
}
if (myEditModes.dataEditMode == DataEditMode::DATA_INSPECT) {
cursorInspect = true;
} else if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) {
cursorSelect = true;
} else if (myEditModes.dataEditMode == DataEditMode::DATA_DELETE) {
cursorDelete = true;
}
}
if (myMouseButtonKeyPressed.controlKeyPressed() && cursorMoveView) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::MOVEVIEW));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::MOVEVIEW));
} else if (cursorInspect) {
if (!checkSelectEdges() && myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_INSPECT)) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::INSPECT_LANE));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::INSPECT_LANE));
} else {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::INSPECT));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::INSPECT));
}
} else if (cursorSelect) {
if (!checkSelectEdges() && myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT)) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::SELECT_LANE));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::SELECT_LANE));
} else {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::SELECT));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::SELECT));
}
} else if (cursorMoveElement) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::MOVEELEMENT));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::MOVEELEMENT));
} else if (cursorDelete) {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::DELETE_CURSOR));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::DELETE_CURSOR));
} else {
setDefaultCursor(GUICursorSubSys::getCursor(GUICursor::DEFAULT));
setDragCursor(GUICursorSubSys::getCursor(GUICursor::DEFAULT));
}
}
}
int
GNEViewNet::drawGLElements(const Boundary& bound) {
if (myDrawingToggle > 10000) {
myDrawingToggle = 0;
} else {
myDrawingToggle++;
}
myVisualizationSettings->scale = m2p(SUMO_const_laneWidth);
const float minB[2] = { (float)bound.xmin(), (float)bound.ymin() };
const float maxB[2] = { (float)bound.xmax(), (float)bound.ymax() };
glLineWidth(1);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_POLYGON_OFFSET_FILL);
glEnable(GL_POLYGON_OFFSET_LINE);
return myGrid->Search(minB, maxB, *myVisualizationSettings);
}
void
GNEViewNet::drawGrid() const {
if (myVisualizationSettings->showGrid) {
if (!myNetworkViewOptions.menuCheckToggleGrid->amChecked() ||
!myDemandViewOptions.menuCheckToggleGrid->amChecked()) {
myNetworkViewOptions.menuCheckToggleGrid->setChecked(true);
myDemandViewOptions.menuCheckToggleGrid->setChecked(true);
myNetworkViewOptions.menuCheckToggleGrid->update();
myNetworkViewOptions.menuCheckToggleGrid->update();
}
if (myEditModes.isCurrentSupermodeNetwork() || myEditModes.isCurrentSupermodeDemand()) {
paintGLGrid();
}
} else {
if (myNetworkViewOptions.menuCheckToggleGrid->amChecked() ||
myDemandViewOptions.menuCheckToggleGrid->amChecked()) {
myNetworkViewOptions.menuCheckToggleGrid->setChecked(false);
myDemandViewOptions.menuCheckToggleGrid->setChecked(false);
myNetworkViewOptions.menuCheckToggleGrid->update();
myNetworkViewOptions.menuCheckToggleGrid->update();
}
}
}
long
GNEViewNet::onCmdResetEdgeEndPoints(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction) {
myUndoList->begin(GUIIcon::EDGE, TL("reset edge endpoints"));
if (junction->isAttributeCarrierSelected()) {
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
for (const auto& selectedJunction : selectedJunctions) {
for (const auto& incomingEdge : selectedJunction->getGNEIncomingEdges()) {
incomingEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
}
for (const auto& outgoingEdge : selectedJunction->getGNEOutgoingEdges()) {
outgoingEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
}
}
} else {
for (const auto& incomingEdge : junction->getGNEIncomingEdges()) {
incomingEdge->setAttribute(GNE_ATTR_SHAPE_END, "", myUndoList);
}
for (const auto& outgoingEdge : junction->getGNEOutgoingEdges()) {
outgoingEdge->setAttribute(GNE_ATTR_SHAPE_START, "", myUndoList);
}
}
myUndoList->end();
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdEditJunctionShape(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction) {
if (junction->getNBNode()->getShape().size() == 0) {
myNet->computeAndUpdate(OptionsCont::getOptions(), false);
}
if (myVisualizationSettings->showGrid) {
WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
}
myEditNetworkElementShapes.startEditCustomShape(junction);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdResetJunctionShape(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction) {
if (junction->isAttributeCarrierSelected()) {
myUndoList->begin(junction, TL("reset custom junction shapes"));
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
for (const auto& selectedJunction : selectedJunctions) {
selectedJunction->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
}
myUndoList->end();
} else {
myUndoList->begin(junction, TL("reset custom junction shape"));
junction->setAttribute(SUMO_ATTR_SHAPE, "", myUndoList);
myUndoList->end();
}
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdReplaceJunction(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
myNet->replaceJunctionByGeometry(junction, myUndoList);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdSplitJunction(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
myNet->splitJunction(junction, false, myUndoList);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdSplitJunctionReconnect(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
myNet->splitJunction(junction, true, myUndoList);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdSelectRoundabout(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
myNet->selectRoundabout(junction, myUndoList);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdConvertRoundabout(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
myNet->createRoundabout(junction, myUndoList);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onEnterConvertRoundabout(FXObject*, FXSelector, void*) {
myDrawPreviewRoundabout = true;
update();
return 1;
}
long
GNEViewNet::onLeaveConvertRoundabout(FXObject*, FXSelector, void*) {
myDrawPreviewRoundabout = false;
update();
return 1;
}
long
GNEViewNet::onCmdClearConnections(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
if (myInspectedElements.getFirstAC() && (myInspectedElements.getFirstAC()->getTagProperty()->getTag() == SUMO_TAG_CONNECTION)) {
myViewParent->getInspectorFrame()->clearInspection();
}
const auto frontElements = myMarkFrontElements.getACs();
for (const auto& AC : frontElements) {
if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
myMarkFrontElements.unmarkAC(AC);
}
}
if (junction->isAttributeCarrierSelected()) {
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
myUndoList->begin(GUIIcon::CONNECTION, TL("clear connections of selected junctions"));
for (const auto& selectedJunction : selectedJunctions) {
myNet->clearJunctionConnections(selectedJunction, myUndoList);
}
myUndoList->end();
} else {
myNet->clearJunctionConnections(junction, myUndoList);
}
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdResetConnections(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
if (myInspectedElements.getFirstAC() && (myInspectedElements.getFirstAC()->getTagProperty()->getTag() == SUMO_TAG_CONNECTION)) {
myViewParent->getInspectorFrame()->clearInspection();
}
const auto frontElements = myMarkFrontElements.getACs();
for (const auto& AC : frontElements) {
if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
myMarkFrontElements.unmarkAC(AC);
}
}
if (junction->isAttributeCarrierSelected()) {
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
myUndoList->begin(GUIIcon::CONNECTION, TL("reset connections of selected junctions"));
for (const auto& selectedJunction : selectedJunctions) {
myNet->resetJunctionConnections(selectedJunction, myUndoList);
}
myUndoList->end();
} else {
myNet->resetJunctionConnections(junction, myUndoList);
}
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdAddTLS(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
if (junction->isAttributeCarrierSelected()) {
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODETLS, TL("add TLS in multiple junctions"));
for (const auto& selectedJunction : selectedJunctions) {
selectedJunction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
}
myNet->getViewNet()->getUndoList()->end();
} else {
junction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS, true);
myViewParent->getTLSEditorFrame()->editJunction(junction);
}
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdAddJoinTLS(FXObject*, FXSelector, void*) {
GNEJunction* junction = getJunctionAtPopupPosition();
if (junction != nullptr) {
if (junction->isAttributeCarrierSelected()) {
myNet->getViewNet()->getUndoList()->begin(GUIIcon::MODETLS, TL("add TLS in multiple junctions"));
}
junction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
if (junction->getAttribute(SUMO_ATTR_TLID).size() > 0) {
const auto selectedJunctions = myNet->getAttributeCarriers()->getSelectedJunctions();
for (const auto& selectedJunction : selectedJunctions) {
if (selectedJunction->getNBNode()->getControllingTLS().empty()) {
selectedJunction->setAttribute(SUMO_ATTR_TYPE, "traffic_light", myUndoList);
selectedJunction->setAttribute(SUMO_ATTR_TLID, junction->getAttribute(SUMO_ATTR_TLID), myUndoList);
}
}
}
if (junction->getNBNode()->getControllingTLS().size() > 0) {
const auto TLSDef = (*junction->getNBNode()->getControllingTLS().begin());
if (!myNet->getTLLogicCont().exist(TLSDef->getID() + "_joined")) {
myUndoList->add(new GNEChange_TLS(junction, TLSDef, TLSDef->getID() + "_joined"), true);
}
}
if (junction->isAttributeCarrierSelected()) {
myNet->getViewNet()->getUndoList()->end();
}
myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_TLS, true);
myViewParent->getTLSEditorFrame()->editJunction(junction);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdEditConnectionShape(FXObject*, FXSelector, void*) {
GNEConnection* connection = getConnectionAtPopupPosition();
if (connection) {
myEditNetworkElementShapes.startEditCustomShape(connection);
}
if (myVisualizationSettings->showGrid) {
WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdSmoothConnectionShape(FXObject*, FXSelector, void*) {
GNEConnection* connection = getConnectionAtPopupPosition();
if (connection) {
connection->smootShape();
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdEditCrossingShape(FXObject*, FXSelector, void*) {
GNECrossing* crossing = getCrossingAtPopupPosition();
if (crossing) {
if (crossing->getParentJunctions().front()->getNBNode()->getShape().size() == 0) {
myNet->computeAndUpdate(OptionsCont::getOptions(), false);
}
if (myVisualizationSettings->showGrid) {
WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
}
myEditNetworkElementShapes.startEditCustomShape(crossing);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdEditWalkingAreaShape(FXObject*, FXSelector, void*) {
GNEWalkingArea* walkingArea = getWalkingAreaAtPopupPosition();
if (walkingArea) {
if (walkingArea->getParentJunctions().front()->getNBNode()->getShape().size() == 0) {
myNet->computeAndUpdate(OptionsCont::getOptions(), false);
if (myVisualizationSettings->showGrid) {
WRITE_WARNING(TL("Grid is still active, press ctrl+g to deactivate"));
}
}
myEditNetworkElementShapes.startEditCustomShape(walkingArea);
}
destroyPopup();
setFocus();
return 1;
}
long
GNEViewNet::onCmdToggleSelectEdges(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckSelectEdges->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckSelectEdges->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckSelectEdges->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckSelectEdges->update();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES)) {
myNetworkViewOptions.menuCheckSelectEdges->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowConnections(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckShowConnections->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckShowConnections->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckShowConnections->update();
if (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE) {
getNet()->initGNEConnections();
}
myVisualizationSettings->showLane2Lane = (myNetworkViewOptions.menuCheckShowConnections->amChecked() == TRUE);
getNet()->requireRecompute();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS)) {
myNetworkViewOptions.menuCheckShowConnections->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleHideConnections(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckHideConnections->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckHideConnections->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckHideConnections->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckHideConnections->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS)) {
myNetworkViewOptions.menuCheckHideConnections->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowAdditionalSubElements(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckShowAdditionalSubElements->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckShowAdditionalSubElements->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckShowAdditionalSubElements->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckShowAdditionalSubElements->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS)) {
myNetworkViewOptions.menuCheckShowAdditionalSubElements->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowTAZElements(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckShowTAZElements->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckShowTAZElements->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckShowTAZElements->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckShowTAZElements->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS)) {
myNetworkViewOptions.menuCheckShowTAZElements->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleExtendSelection(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckExtendSelection->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckExtendSelection->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckExtendSelection->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckExtendSelection->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION)) {
myNetworkViewOptions.menuCheckExtendSelection->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleChangeAllPhases(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckChangeAllPhases->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckChangeAllPhases->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckChangeAllPhases->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckChangeAllPhases->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES)) {
myNetworkViewOptions.menuCheckChangeAllPhases->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowGrid(FXObject*, FXSelector sel, void*) {
if (myVisualizationSettings->showGrid) {
myVisualizationSettings->showGrid = false;
myNetworkViewOptions.menuCheckToggleGrid->setChecked(false);
myDemandViewOptions.menuCheckToggleGrid->setChecked(false);
} else {
myVisualizationSettings->showGrid = true;
myNetworkViewOptions.menuCheckToggleGrid->setChecked(true);
myDemandViewOptions.menuCheckToggleGrid->setChecked(true);
}
myNetworkViewOptions.menuCheckToggleGrid->update();
myDemandViewOptions.menuCheckToggleGrid->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID)) {
myNetworkViewOptions.menuCheckToggleGrid->setFocus();
} else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID)) {
myDemandViewOptions.menuCheckToggleGrid->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleDrawJunctionShape(FXObject*, FXSelector sel, void*) {
myVisualizationSettings->drawJunctionShape = !myVisualizationSettings->drawJunctionShape;
const bool hide = !myVisualizationSettings->drawJunctionShape;
myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
myDemandViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
myDataViewOptions.menuCheckToggleDrawJunctionShape->setChecked(hide);
myNetworkViewOptions.menuCheckToggleDrawJunctionShape->update();
myDemandViewOptions.menuCheckToggleDrawJunctionShape->update();
myDataViewOptions.menuCheckToggleDrawJunctionShape->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
myNetworkViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
} else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
myDemandViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
} else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE)) {
myDataViewOptions.menuCheckToggleDrawJunctionShape->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleDrawSpreadVehicles(FXObject*, FXSelector sel, void*) {
if ((myNetworkViewOptions.menuCheckDrawSpreadVehicles->amChecked() == TRUE) ||
(myDemandViewOptions.menuCheckDrawSpreadVehicles->amChecked() == TRUE)) {
myNetworkViewOptions.menuCheckDrawSpreadVehicles->setChecked(FALSE);
myDemandViewOptions.menuCheckDrawSpreadVehicles->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckDrawSpreadVehicles->setChecked(TRUE);
myDemandViewOptions.menuCheckDrawSpreadVehicles->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckDrawSpreadVehicles->update();
myDemandViewOptions.menuCheckDrawSpreadVehicles->update();
std::set<GNEEdge*> edgesToUpdate;
for (const auto& vehicle : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VEHICLE)) {
if (vehicle.second->getParentEdges().size() > 0) {
edgesToUpdate.insert(vehicle.second->getParentEdges().front());
} else if (vehicle.second->getChildDemandElements().size() > 0 && (vehicle.second->getChildDemandElements().front()->getTagProperty()->getTag() == GNE_TAG_ROUTE_EMBEDDED)) {
edgesToUpdate.insert(vehicle.second->getChildDemandElements().front()->getParentEdges().front());
}
}
for (const auto& routeFlow : myNet->getAttributeCarriers()->getDemandElements().at(GNE_TAG_FLOW_ROUTE)) {
if (routeFlow.second->getParentEdges().size() > 0) {
edgesToUpdate.insert(routeFlow.second->getParentEdges().front());
} else if (routeFlow.second->getChildDemandElements().size() > 0 && (routeFlow.second->getChildDemandElements().front()->getTagProperty()->getTag() == GNE_TAG_ROUTE_EMBEDDED)) {
edgesToUpdate.insert(routeFlow.second->getChildDemandElements().front()->getParentEdges().front());
}
}
for (const auto& trip : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_TRIP)) {
if (trip.second->getParentEdges().size() > 0) {
edgesToUpdate.insert(trip.second->getParentEdges().front());
}
}
for (const auto& flow : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_FLOW)) {
if (flow.second->getParentEdges().size() > 0) {
edgesToUpdate.insert(flow.second->getParentEdges().front());
}
}
for (const auto& edge : edgesToUpdate) {
edge->updateVehicleSpreadGeometries();
}
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES)) {
myNetworkViewOptions.menuCheckDrawSpreadVehicles->setFocus();
} else if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES)) {
myDemandViewOptions.menuCheckDrawSpreadVehicles->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleMergeAutomatically(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckMergeAutomatically->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckMergeAutomatically->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckMergeAutomatically->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckMergeAutomatically->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY)) {
myNetworkViewOptions.menuCheckMergeAutomatically->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowJunctionBubbles(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckShowJunctionBubble->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckShowJunctionBubble->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckShowJunctionBubble->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckShowJunctionBubble->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES)) {
myNetworkViewOptions.menuCheckShowJunctionBubble->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleMoveElevation(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckMoveElevation->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckMoveElevation->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckMoveElevation->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION)) {
myNetworkViewOptions.menuCheckMoveElevation->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleChainEdges(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckChainEdges->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckChainEdges->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckChainEdges->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckChainEdges->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES)) {
myNetworkViewOptions.menuCheckChainEdges->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleAutoOppositeEdge(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckAutoOppositeEdge->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckAutoOppositeEdge->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckAutoOppositeEdge->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES)) {
myNetworkViewOptions.menuCheckAutoOppositeEdge->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleHideNonInspecteDemandElements(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckHideNonInspectedDemandElements->amChecked() == TRUE) {
myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setChecked(TRUE);
}
myDemandViewOptions.menuCheckHideNonInspectedDemandElements->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED)) {
myDemandViewOptions.menuCheckHideNonInspectedDemandElements->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowOverlappedRoutes(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckShowOverlappedRoutes->amChecked() == TRUE) {
myDemandViewOptions.menuCheckShowOverlappedRoutes->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckShowOverlappedRoutes->setChecked(TRUE);
}
myDemandViewOptions.menuCheckShowOverlappedRoutes->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES)) {
myDemandViewOptions.menuCheckShowOverlappedRoutes->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleHideShapes(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckHideShapes->amChecked() == TRUE) {
myDemandViewOptions.menuCheckHideShapes->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckHideShapes->setChecked(TRUE);
}
myDemandViewOptions.menuCheckHideShapes->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES)) {
myDemandViewOptions.menuCheckHideShapes->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowTrips(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckShowAllTrips->amChecked() == TRUE) {
myDemandViewOptions.menuCheckShowAllTrips->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckShowAllTrips->setChecked(TRUE);
}
myDemandViewOptions.menuCheckShowAllTrips->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS)) {
myDemandViewOptions.menuCheckShowAllTrips->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowAllPersonPlans(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckShowAllPersonPlans->amChecked() == TRUE) {
myDemandViewOptions.menuCheckShowAllPersonPlans->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckShowAllPersonPlans->setChecked(TRUE);
}
myDemandViewOptions.menuCheckShowAllPersonPlans->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS)) {
myDemandViewOptions.menuCheckShowAllPersonPlans->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleLockPerson(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckLockPerson->amChecked() == TRUE) {
myDemandViewOptions.menuCheckLockPerson->setChecked(FALSE);
} else if (myInspectedElements.getFirstAC() && myInspectedElements.getFirstAC()->getTagProperty()->isPerson()) {
myDemandViewOptions.menuCheckLockPerson->setChecked(TRUE);
}
myDemandViewOptions.menuCheckLockPerson->update();
if (myDemandViewOptions.menuCheckLockPerson->amChecked()) {
const GNEDemandElement* personOrPersonPlan = dynamic_cast<const GNEDemandElement*>(myInspectedElements.getFirstAC());
if (personOrPersonPlan) {
if (personOrPersonPlan->getTagProperty()->isPerson()) {
myDemandViewOptions.lockPerson(personOrPersonPlan);
} else {
myDemandViewOptions.lockPerson(personOrPersonPlan->getParentDemandElements().front());
}
}
} else {
myDemandViewOptions.unlockPerson();
}
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON)) {
myDemandViewOptions.menuCheckLockPerson->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowAllContainerPlans(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckShowAllContainerPlans->amChecked() == TRUE) {
myDemandViewOptions.menuCheckShowAllContainerPlans->setChecked(FALSE);
} else {
myDemandViewOptions.menuCheckShowAllContainerPlans->setChecked(TRUE);
}
myDemandViewOptions.menuCheckShowAllContainerPlans->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS)) {
myDemandViewOptions.menuCheckShowAllContainerPlans->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleLockContainer(FXObject*, FXSelector sel, void*) {
if (myDemandViewOptions.menuCheckLockContainer->amChecked() == TRUE) {
myDemandViewOptions.menuCheckLockContainer->setChecked(FALSE);
} else if (myInspectedElements.getFirstAC() && myInspectedElements.getFirstAC()->getTagProperty()->isContainer()) {
myDemandViewOptions.menuCheckLockContainer->setChecked(TRUE);
}
myDemandViewOptions.menuCheckLockContainer->update();
if (myDemandViewOptions.menuCheckLockContainer->amChecked()) {
const GNEDemandElement* containerOrContainerPlan = dynamic_cast<const GNEDemandElement*>(myInspectedElements.getFirstAC());
if (containerOrContainerPlan) {
if (containerOrContainerPlan->getTagProperty()->isContainer()) {
myDemandViewOptions.lockContainer(containerOrContainerPlan);
} else {
myDemandViewOptions.lockContainer(containerOrContainerPlan->getParentDemandElements().front());
}
}
} else {
myDemandViewOptions.unlockContainer();
}
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER)) {
myDemandViewOptions.menuCheckLockContainer->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowAdditionals(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckShowAdditionals->amChecked() == TRUE) {
myDataViewOptions.menuCheckShowAdditionals->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckShowAdditionals->setChecked(TRUE);
}
myDataViewOptions.menuCheckShowAdditionals->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS)) {
myDataViewOptions.menuCheckShowAdditionals->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowShapes(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckShowShapes->amChecked() == TRUE) {
myDataViewOptions.menuCheckShowShapes->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckShowShapes->setChecked(TRUE);
}
myDataViewOptions.menuCheckShowShapes->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES)) {
myDataViewOptions.menuCheckShowShapes->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowDemandElementsNetwork(FXObject*, FXSelector sel, void*) {
if (myNetworkViewOptions.menuCheckShowDemandElements->amChecked() == TRUE) {
myNetworkViewOptions.menuCheckShowDemandElements->setChecked(FALSE);
} else {
myNetworkViewOptions.menuCheckShowDemandElements->setChecked(TRUE);
}
myNetworkViewOptions.menuCheckShowDemandElements->update();
myNet->computeDemandElements(myViewParent->getGNEAppWindows());
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS)) {
myNetworkViewOptions.menuCheckShowDemandElements->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleShowDemandElementsData(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckShowDemandElements->amChecked() == TRUE) {
myDataViewOptions.menuCheckShowDemandElements->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckShowDemandElements->setChecked(TRUE);
}
myDataViewOptions.menuCheckShowDemandElements->update();
myNet->computeDemandElements(myViewParent->getGNEAppWindows());
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS)) {
myDataViewOptions.menuCheckShowDemandElements->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleTAZRelDrawing(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckToggleTAZRelDrawing->amChecked() == TRUE) {
myDataViewOptions.menuCheckToggleTAZRelDrawing->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckToggleTAZRelDrawing->setChecked(TRUE);
}
myDataViewOptions.menuCheckToggleTAZRelDrawing->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING)) {
myDataViewOptions.menuCheckToggleTAZRelDrawing->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleTAZDrawFill(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckToggleTAZDrawFill->amChecked() == TRUE) {
myDataViewOptions.menuCheckToggleTAZDrawFill->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckToggleTAZDrawFill->setChecked(TRUE);
}
myDataViewOptions.menuCheckToggleTAZDrawFill->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL)) {
myDataViewOptions.menuCheckToggleTAZDrawFill->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleTAZRelOnlyFrom(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->amChecked() == TRUE) {
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setChecked(TRUE);
}
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM)) {
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdToggleTAZRelOnlyTo(FXObject*, FXSelector sel, void*) {
if (myDataViewOptions.menuCheckToggleTAZRelOnlyTo->amChecked() == TRUE) {
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setChecked(FALSE);
} else {
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setChecked(TRUE);
}
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->update();
updateViewNet();
if (sel == FXSEL(SEL_COMMAND, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO)) {
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->setFocus();
}
return 1;
}
long
GNEViewNet::onCmdIntervalBarGenericDataType(FXObject*, FXSelector, void*) {
myIntervalBar.setGenericDataType();
return 1;
}
long
GNEViewNet::onCmdIntervalBarDataSet(FXObject*, FXSelector, void*) {
myIntervalBar.setDataSet();
return 1;
}
long
GNEViewNet::onCmdIntervalBarLimit(FXObject*, FXSelector, void*) {
myIntervalBar.setInterval();
return 1;
}
long
GNEViewNet::onCmdIntervalBarSetBegin(FXObject*, FXSelector, void*) {
myIntervalBar.setBegin();
return 1;
}
long
GNEViewNet::onCmdIntervalBarSetEnd(FXObject*, FXSelector, void*) {
myIntervalBar.setEnd();
return 1;
}
long
GNEViewNet::onCmdIntervalBarSetParameter(FXObject*, FXSelector, void*) {
myIntervalBar.setParameter();
return 1;
}
long
GNEViewNet::onCmdAddSelected(FXObject*, FXSelector, void*) {
auto AC = myViewObjectsSelector.getAttributeCarrierFront();
if (AC && !AC->isAttributeCarrierSelected()) {
AC->selectAttributeCarrier();
}
return 1;
}
long
GNEViewNet::onCmdRemoveSelected(FXObject*, FXSelector, void*) {
auto AC = myViewObjectsSelector.getAttributeCarrierFront();
if (AC && AC->isAttributeCarrierSelected()) {
AC->unselectAttributeCarrier();
}
return 1;
}
long
GNEViewNet::onCmdAddEdgeSelected(FXObject*, FXSelector, void*) {
auto edge = myViewObjectsSelector.getEdgeFront();
if (edge && !edge->isAttributeCarrierSelected()) {
edge->selectAttributeCarrier();
}
return 1;
}
long
GNEViewNet::onCmdRemoveEdgeSelected(FXObject*, FXSelector, void*) {
auto edge = myViewObjectsSelector.getEdgeFront();
if (edge && edge->isAttributeCarrierSelected()) {
edge->unselectAttributeCarrier();
}
return 1;
}
long
GNEViewNet::onCmdSetNeteditView(FXObject*, FXSelector sel, void*) {
myEditModes.setView(FXSELID(sel));
update();
return 1;
}
void
GNEViewNet::buildEditModeControls() {
myEditModes.buildSuperModeButtons();
mySaveElements.buildSaveElementsButtons();
myTimeFormat.buildTimeFormatButtons();
myCommonCheckableButtons.buildCommonCheckableButtons();
myNetworkCheckableButtons.buildNetworkCheckableButtons();
myDemandCheckableButtons.buildDemandCheckableButtons();
myDataCheckableButtons.buildDataCheckableButtons();
new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
new FXVerticalSeparator(myViewParent->getGNEAppWindows()->getToolbarsGrip().modes, GUIDesignVerticalSeparator);
myNetworkViewOptions.buildNetworkViewOptionsMenuChecks();
myDemandViewOptions.buildDemandViewOptionsMenuChecks();
myDataViewOptions.buildDataViewOptionsMenuChecks();
myIntervalBar.buildIntervalBarElements();
}
void
GNEViewNet::updateNetworkModeSpecificControls() {
auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions;
myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
myDemandViewOptions.hideDemandViewOptionsMenuChecks();
myDataViewOptions.hideDataViewOptionsMenuChecks();
myCommonCheckableButtons.disableCommonCheckableButtons();
myNetworkCheckableButtons.disableNetworkCheckableButtons();
myDataCheckableButtons.disableDataCheckableButtons();
myIntervalBar.hideIntervalBar();
myViewParent->hideAllFrames();
myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
myNetworkViewOptions.menuCheckToggleGrid->show();
myNetworkViewOptions.menuCheckToggleDrawJunctionShape->show();
myNetworkViewOptions.menuCheckDrawSpreadVehicles->show();
myNetworkViewOptions.menuCheckShowDemandElements->show();
menuChecks.menuCheckToggleGrid->show();
menuChecks.menuCheckToggleDrawJunctionShape->show();
menuChecks.menuCheckDrawSpreadVehicles->show();
menuChecks.menuCheckShowDemandElements->show();
menuChecks.separator->show();
switch (myEditModes.networkEditMode) {
case NetworkEditMode::NETWORK_INSPECT:
myViewParent->getInspectorFrame()->show();
myViewParent->getInspectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getInspectorFrame();
myCommonCheckableButtons.inspectButton->setChecked(true);
myNetworkViewOptions.menuCheckSelectEdges->show();
myNetworkViewOptions.menuCheckShowConnections->show();
myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
myNetworkViewOptions.menuCheckShowTAZElements->show();
myNetworkViewOptions.menuCheckShowJunctionBubble->show();
menuChecks.menuCheckSelectEdges->show();
menuChecks.menuCheckShowConnections->show();
menuChecks.menuCheckShowAdditionalSubElements->show();
menuChecks.menuCheckShowTAZElements->show();
menuChecks.menuCheckShowJunctionBubble->show();
myLockManager.updateLockMenuBar();
break;
case NetworkEditMode::NETWORK_DELETE:
myViewParent->getDeleteFrame()->show();
myViewParent->getDeleteFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getDeleteFrame();
myCommonCheckableButtons.deleteButton->setChecked(true);
myNetworkViewOptions.menuCheckShowConnections->show();
myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
myNetworkViewOptions.menuCheckShowTAZElements->show();
myNetworkViewOptions.menuCheckShowJunctionBubble->show();
myNetworkViewOptions.menuCheckSelectEdges->show();
myNetworkViewOptions.menuCheckShowConnections->show();
menuChecks.menuCheckShowAdditionalSubElements->show();
menuChecks.menuCheckShowTAZElements->show();
menuChecks.menuCheckShowJunctionBubble->show();
menuChecks.menuCheckSelectEdges->show();
menuChecks.menuCheckShowConnections->show();
break;
case NetworkEditMode::NETWORK_SELECT:
myViewParent->getSelectorFrame()->show();
myViewParent->getSelectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getSelectorFrame();
myCommonCheckableButtons.selectButton->setChecked(true);
myNetworkViewOptions.menuCheckSelectEdges->show();
myNetworkViewOptions.menuCheckShowConnections->show();
myNetworkViewOptions.menuCheckExtendSelection->show();
myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
myNetworkViewOptions.menuCheckShowTAZElements->show();
myNetworkViewOptions.menuCheckShowJunctionBubble->show();
menuChecks.menuCheckSelectEdges->show();
menuChecks.menuCheckShowConnections->show();
menuChecks.menuCheckExtendSelection->show();
menuChecks.menuCheckShowAdditionalSubElements->show();
menuChecks.menuCheckShowTAZElements->show();
menuChecks.menuCheckShowJunctionBubble->show();
break;
case NetworkEditMode::NETWORK_CREATE_EDGE:
myViewParent->getCreateEdgeFrame()->show();
myViewParent->getCreateEdgeFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getCreateEdgeFrame();
myNetworkCheckableButtons.createEdgeButton->setChecked(true);
myNetworkViewOptions.menuCheckChainEdges->show();
myNetworkViewOptions.menuCheckAutoOppositeEdge->show();
myNetworkViewOptions.menuCheckShowJunctionBubble->show();
menuChecks.menuCheckChainEdges->show();
menuChecks.menuCheckAutoOppositeEdge->show();
menuChecks.menuCheckShowJunctionBubble->show();
break;
case NetworkEditMode::NETWORK_MOVE:
myViewParent->getMoveFrame()->show();
myViewParent->getMoveFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getMoveFrame();
myNetworkCheckableButtons.moveNetworkElementsButton->setChecked(true);
myNetworkViewOptions.menuCheckMergeAutomatically->show();
myNetworkViewOptions.menuCheckShowJunctionBubble->show();
myNetworkViewOptions.menuCheckMoveElevation->show();
menuChecks.menuCheckMergeAutomatically->show();
menuChecks.menuCheckShowJunctionBubble->show();
menuChecks.menuCheckMoveElevation->show();
break;
case NetworkEditMode::NETWORK_CONNECT:
myViewParent->getConnectorFrame()->show();
myViewParent->getConnectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getConnectorFrame();
myNetworkCheckableButtons.connectionButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_TLS:
myViewParent->getTLSEditorFrame()->show();
myViewParent->getTLSEditorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getTLSEditorFrame();
myNetworkCheckableButtons.trafficLightButton->setChecked(true);
myNetworkViewOptions.menuCheckChangeAllPhases->show();
menuChecks.menuCheckChangeAllPhases->show();
break;
case NetworkEditMode::NETWORK_ADDITIONAL:
myViewParent->getAdditionalFrame()->show();
myViewParent->getAdditionalFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getAdditionalFrame();
myNetworkCheckableButtons.additionalButton->setChecked(true);
myNetworkViewOptions.menuCheckShowAdditionalSubElements->show();
menuChecks.menuCheckShowAdditionalSubElements->show();
break;
case NetworkEditMode::NETWORK_CROSSING:
myViewParent->getCrossingFrame()->show();
myViewParent->getCrossingFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getCrossingFrame();
myNetworkCheckableButtons.crossingButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_TAZ:
myViewParent->getTAZFrame()->show();
myViewParent->getTAZFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getTAZFrame();
myNetworkCheckableButtons.TAZButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_SHAPE:
myViewParent->getShapeFrame()->show();
myViewParent->getShapeFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getShapeFrame();
myNetworkCheckableButtons.shapeButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_PROHIBITION:
myViewParent->getProhibitionFrame()->show();
myViewParent->getProhibitionFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getProhibitionFrame();
myNetworkCheckableButtons.prohibitionButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_WIRE:
myViewParent->getWireFrame()->show();
myViewParent->getWireFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getWireFrame();
myNetworkCheckableButtons.wireButton->setChecked(true);
break;
case NetworkEditMode::NETWORK_DECAL:
myViewParent->getDecalFrame()->show();
myViewParent->getDecalFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getDecalFrame();
myNetworkCheckableButtons.decalButton->setChecked(true);
break;
default:
break;
}
menuChecks.updateShortcuts();
myCommonCheckableButtons.updateCommonCheckableButtons();
myNetworkCheckableButtons.updateNetworkCheckableButtons();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
onPaint(nullptr, 0, nullptr);
updateViewNet();
}
void
GNEViewNet::updateDemandModeSpecificControls() {
auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions;
myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
myDemandViewOptions.hideDemandViewOptionsMenuChecks();
myDataViewOptions.hideDataViewOptionsMenuChecks();
myCommonCheckableButtons.disableCommonCheckableButtons();
myDemandCheckableButtons.disableDemandCheckableButtons();
myDataCheckableButtons.disableDataCheckableButtons();
myIntervalBar.hideIntervalBar();
myViewParent->hideAllFrames();
myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
myDemandViewOptions.menuCheckToggleGrid->show();
myDemandViewOptions.menuCheckToggleDrawJunctionShape->show();
myDemandViewOptions.menuCheckDrawSpreadVehicles->show();
myDemandViewOptions.menuCheckHideShapes->show();
myDemandViewOptions.menuCheckShowAllTrips->show();
myDemandViewOptions.menuCheckShowAllPersonPlans->show();
myDemandViewOptions.menuCheckLockPerson->show();
myDemandViewOptions.menuCheckShowAllContainerPlans->show();
myDemandViewOptions.menuCheckLockContainer->show();
myDemandViewOptions.menuCheckShowOverlappedRoutes->show();
menuChecks.menuCheckToggleGrid->show();
menuChecks.menuCheckToggleDrawJunctionShape->show();
menuChecks.menuCheckDrawSpreadVehicles->show();
menuChecks.menuCheckHideShapes->show();
menuChecks.menuCheckShowAllTrips->show();
menuChecks.menuCheckShowAllPersonPlans->show();
menuChecks.menuCheckLockPerson->show();
menuChecks.menuCheckShowAllContainerPlans->show();
menuChecks.menuCheckLockContainer->show();
menuChecks.menuCheckShowOverlappedRoutes->show();
menuChecks.separator->show();
switch (myEditModes.demandEditMode) {
case DemandEditMode::DEMAND_INSPECT:
myViewParent->getInspectorFrame()->show();
myViewParent->getInspectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getInspectorFrame();
myCommonCheckableButtons.inspectButton->setChecked(true);
myDemandViewOptions.menuCheckHideNonInspectedDemandElements->show();
menuChecks.menuCheckHideNonInspectedDemandElements->show();
break;
case DemandEditMode::DEMAND_DELETE:
myViewParent->getDeleteFrame()->show();
myViewParent->getDeleteFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getDeleteFrame();
myCommonCheckableButtons.deleteButton->setChecked(true);
break;
case DemandEditMode::DEMAND_SELECT:
myViewParent->getSelectorFrame()->show();
myViewParent->getSelectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getSelectorFrame();
myCommonCheckableButtons.selectButton->setChecked(true);
break;
case DemandEditMode::DEMAND_MOVE:
myViewParent->getMoveFrame()->show();
myViewParent->getMoveFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getMoveFrame();
myDemandCheckableButtons.moveDemandElementsButton->setChecked(true);
break;
case DemandEditMode::DEMAND_ROUTE:
myViewParent->getRouteFrame()->show();
myViewParent->getRouteFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getRouteFrame();
myDemandCheckableButtons.routeButton->setChecked(true);
break;
case DemandEditMode::DEMAND_ROUTEDISTRIBUTION:
myViewParent->getRouteDistributionFrame()->show();
myViewParent->getRouteDistributionFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getRouteDistributionFrame();
myDemandCheckableButtons.routeDistributionButton->setChecked(true);
break;
case DemandEditMode::DEMAND_VEHICLE:
myViewParent->getVehicleFrame()->show();
myViewParent->getVehicleFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getVehicleFrame();
myDemandCheckableButtons.vehicleButton->setChecked(true);
break;
case DemandEditMode::DEMAND_TYPE:
myViewParent->getTypeFrame()->show();
myViewParent->getTypeFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getTypeFrame();
myDemandCheckableButtons.typeButton->setChecked(true);
break;
case DemandEditMode::DEMAND_TYPEDISTRIBUTION:
myViewParent->getTypeDistributionFrame()->show();
myViewParent->getTypeDistributionFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getTypeDistributionFrame();
myDemandCheckableButtons.typeDistributionButton->setChecked(true);
break;
case DemandEditMode::DEMAND_STOP:
myViewParent->getStopFrame()->show();
myViewParent->getStopFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getStopFrame();
myDemandCheckableButtons.stopButton->setChecked(true);
break;
case DemandEditMode::DEMAND_PERSON:
myViewParent->getPersonFrame()->show();
myViewParent->getPersonFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getPersonFrame();
myDemandCheckableButtons.personButton->setChecked(true);
break;
case DemandEditMode::DEMAND_PERSONPLAN:
myViewParent->getPersonPlanFrame()->show();
myViewParent->getPersonPlanFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getPersonPlanFrame();
myDemandCheckableButtons.personPlanButton->setChecked(true);
break;
case DemandEditMode::DEMAND_CONTAINER:
myViewParent->getContainerFrame()->show();
myViewParent->getContainerFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getContainerFrame();
myDemandCheckableButtons.containerButton->setChecked(true);
break;
case DemandEditMode::DEMAND_CONTAINERPLAN:
myViewParent->getContainerPlanFrame()->show();
myViewParent->getContainerPlanFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getContainerPlanFrame();
myDemandCheckableButtons.containerPlanButton->setChecked(true);
break;
default:
break;
}
menuChecks.updateShortcuts();
myCommonCheckableButtons.updateCommonCheckableButtons();
myDemandCheckableButtons.updateDemandCheckableButtons();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
onPaint(nullptr, 0, nullptr);
updateViewNet();
}
void
GNEViewNet::updateDataModeSpecificControls() {
auto& menuChecks = myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions;
myNetworkViewOptions.hideNetworkViewOptionsMenuChecks();
myDemandViewOptions.hideDemandViewOptionsMenuChecks();
myDataViewOptions.hideDataViewOptionsMenuChecks();
myCommonCheckableButtons.disableCommonCheckableButtons();
myDataCheckableButtons.disableDataCheckableButtons();
myIntervalBar.showIntervalBar();
myViewParent->hideAllFrames();
myViewParent->getGNEAppWindows()->getEditMenuCommands().networkViewOptions.hideNetworkViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().demandViewOptions.hideDemandViewOptionsMenuChecks();
myViewParent->getGNEAppWindows()->getEditMenuCommands().dataViewOptions.hideDataViewOptionsMenuChecks();
myDataViewOptions.menuCheckToggleDrawJunctionShape->show();
myDataViewOptions.menuCheckShowAdditionals->show();
myDataViewOptions.menuCheckShowShapes->show();
myDataViewOptions.menuCheckShowDemandElements->show();
menuChecks.menuCheckToggleDrawJunctionShape->show();
menuChecks.menuCheckShowAdditionals->show();
menuChecks.menuCheckShowShapes->show();
menuChecks.menuCheckShowDemandElements->show();
menuChecks.separator->show();
switch (myEditModes.dataEditMode) {
case DataEditMode::DATA_INSPECT:
myViewParent->getInspectorFrame()->show();
myViewParent->getInspectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getInspectorFrame();
myCommonCheckableButtons.inspectButton->setChecked(true);
myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
myDataViewOptions.menuCheckToggleTAZDrawFill->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
menuChecks.menuCheckToggleTAZRelDrawing->show();
menuChecks.menuCheckToggleTAZDrawFill->show();
menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
menuChecks.menuCheckToggleTAZRelOnlyTo->show();
break;
case DataEditMode::DATA_DELETE:
myViewParent->getDeleteFrame()->show();
myViewParent->getDeleteFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getDeleteFrame();
myCommonCheckableButtons.deleteButton->setChecked(true);
myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
menuChecks.menuCheckToggleTAZRelDrawing->show();
menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
menuChecks.menuCheckToggleTAZRelOnlyTo->show();
break;
case DataEditMode::DATA_SELECT:
myViewParent->getSelectorFrame()->show();
myViewParent->getSelectorFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getSelectorFrame();
myCommonCheckableButtons.selectButton->setChecked(true);
myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
menuChecks.menuCheckToggleTAZRelDrawing->show();
menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
menuChecks.menuCheckToggleTAZRelOnlyTo->show();
break;
case DataEditMode::DATA_EDGEDATA:
myViewParent->getEdgeDataFrame()->show();
myViewParent->getEdgeDataFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getEdgeDataFrame();
myDataCheckableButtons.edgeDataButton->setChecked(true);
break;
case DataEditMode::DATA_EDGERELDATA:
myViewParent->getEdgeRelDataFrame()->show();
myViewParent->getEdgeRelDataFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getEdgeRelDataFrame();
myDataCheckableButtons.edgeRelDataButton->setChecked(true);
break;
case DataEditMode::DATA_TAZRELDATA:
myViewParent->getTAZRelDataFrame()->show();
myViewParent->getTAZRelDataFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getTAZRelDataFrame();
myDataCheckableButtons.TAZRelDataButton->setChecked(true);
myDataViewOptions.menuCheckToggleTAZRelDrawing->show();
myDataViewOptions.menuCheckToggleTAZDrawFill->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyFrom->show();
myDataViewOptions.menuCheckToggleTAZRelOnlyTo->show();
menuChecks.menuCheckToggleTAZRelDrawing->show();
menuChecks.menuCheckToggleTAZDrawFill->show();
menuChecks.menuCheckToggleTAZRelOnlyFrom->show();
menuChecks.menuCheckToggleTAZRelOnlyTo->show();
break;
case DataEditMode::DATA_MEANDATA:
myViewParent->getMeanDataFrame()->show();
myViewParent->getMeanDataFrame()->focusUpperElement();
myCurrentFrame = myViewParent->getMeanDataFrame();
myDataCheckableButtons.meanDataButton->setChecked(true);
break;
default:
break;
}
menuChecks.updateShortcuts();
myCommonCheckableButtons.updateCommonCheckableButtons();
myDataCheckableButtons.updateDataCheckableButtons();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->recalc();
myViewParent->getGNEAppWindows()->getToolbarsGrip().modes->repaint();
onPaint(nullptr, 0, nullptr);
updateViewNet();
}
void
GNEViewNet::deleteNetworkAttributeCarrier(const GNEAttributeCarrier* AC) {
if (AC->getTagProperty()->getTag() == SUMO_TAG_JUNCTION) {
GNEJunction* junction = myNet->getAttributeCarriers()->retrieveJunction(AC->getID(), false);
if (junction) {
myNet->deleteJunction(junction, myUndoList);
}
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_CROSSING) {
GNECrossing* crossing = myNet->getAttributeCarriers()->retrieveCrossing(AC->getGUIGlObject(), false);
if (crossing) {
myNet->deleteCrossing(crossing, myUndoList);
}
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
GNEEdge* edge = myNet->getAttributeCarriers()->retrieveEdge(AC->getID(), false);
if (edge) {
myNet->deleteEdge(edge, myUndoList, false);
}
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_LANE) {
GNELane* lane = myNet->getAttributeCarriers()->retrieveLane(AC->getGUIGlObject(), false);
if (lane) {
myNet->deleteLane(lane, myUndoList, false);
}
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
GNEConnection* connection = myNet->getAttributeCarriers()->retrieveConnection(AC->getGUIGlObject(), false);
if (connection) {
myNet->deleteConnection(connection, myUndoList);
}
} else if ((AC->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) || (AC->getTagProperty()->getTag() == SUMO_TAG_TAZSINK)) {
GNETAZSourceSink* TAZSourceSink = myNet->getAttributeCarriers()->retrieveTAZSourceSink(AC, false);
if (TAZSourceSink) {
myNet->deleteTAZSourceSink(TAZSourceSink, myUndoList);
}
} else if (AC->getTagProperty()->isAdditionalElement()) {
GNEAdditional* additionalElement = myNet->getAttributeCarriers()->retrieveAdditional(AC->getGUIGlObject(), false);
if (additionalElement) {
myNet->deleteAdditional(additionalElement, myUndoList);
}
}
}
void
GNEViewNet::deleteDemandAttributeCarrier(const GNEAttributeCarrier* AC) {
GNEDemandElement* demandElement = myNet->getAttributeCarriers()->retrieveDemandElement(AC->getGUIGlObject(), false);
if (demandElement) {
myNet->deleteDemandElement(demandElement, myUndoList);
}
}
void
GNEViewNet::deleteDataAttributeCarrier(const GNEAttributeCarrier* AC) {
if (AC->getTagProperty()->getTag() == SUMO_TAG_DATASET) {
GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(AC->getID(), false);
if (dataSet) {
myNet->deleteDataSet(dataSet, myUndoList);
}
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_DATAINTERVAL) {
GNEDataInterval* dataInterval = myNet->getAttributeCarriers()->retrieveDataInterval(AC, false);
if (dataInterval) {
myNet->deleteDataInterval(dataInterval, myUndoList);
}
} else {
GNEGenericData* genericData = myNet->getAttributeCarriers()->retrieveGenericData(AC->getGUIGlObject(), false);
if (genericData) {
myNet->deleteGenericData(genericData, myUndoList);
}
}
}
void
GNEViewNet::updateControls() {
if (myEditModes.isCurrentSupermodeNetwork()) {
switch (myEditModes.networkEditMode) {
case NetworkEditMode::NETWORK_INSPECT:
myViewParent->getInspectorFrame()->update();
break;
default:
break;
}
}
if (myEditModes.isCurrentSupermodeDemand()) {
switch (myEditModes.demandEditMode) {
case DemandEditMode::DEMAND_INSPECT:
myViewParent->getInspectorFrame()->update();
break;
case DemandEditMode::DEMAND_VEHICLE:
myViewParent->getVehicleFrame()->show();
break;
case DemandEditMode::DEMAND_TYPE:
myViewParent->getTypeFrame()->show();
break;
case DemandEditMode::DEMAND_TYPEDISTRIBUTION:
myViewParent->getTypeDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
break;
case DemandEditMode::DEMAND_ROUTEDISTRIBUTION:
myViewParent->getRouteDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
break;
case DemandEditMode::DEMAND_PERSON:
myViewParent->getPersonFrame()->show();
break;
case DemandEditMode::DEMAND_PERSONPLAN:
myViewParent->getPersonPlanFrame()->show();
break;
case DemandEditMode::DEMAND_CONTAINER:
myViewParent->getContainerFrame()->show();
break;
case DemandEditMode::DEMAND_CONTAINERPLAN:
myViewParent->getContainerPlanFrame()->show();
break;
case DemandEditMode::DEMAND_STOP:
myViewParent->getStopFrame()->show();
break;
default:
break;
}
}
if (myEditModes.isCurrentSupermodeData()) {
switch (myEditModes.dataEditMode) {
case DataEditMode::DATA_INSPECT:
myViewParent->getInspectorFrame()->update();
break;
default:
break;
}
myIntervalBar.markForUpdate();
}
updateViewNet();
}
void
GNEViewNet::drawTemporalDrawingShape() const {
PositionVector temporalShape;
bool deleteLastCreatedPoint = false;
if (myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
temporalShape = myViewParent->getShapeFrame()->getDrawingShapeModule()->getTemporalShape();
deleteLastCreatedPoint = myViewParent->getShapeFrame()->getDrawingShapeModule()->getDeleteLastCreatedPoint();
} else if (myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
temporalShape = myViewParent->getTAZFrame()->getDrawingShapeModule()->getTemporalShape();
deleteLastCreatedPoint = myViewParent->getTAZFrame()->getDrawingShapeModule()->getDeleteLastCreatedPoint();
}
if (temporalShape.size() > 0) {
GLHelper::pushMatrix();
glLineWidth(2);
glTranslated(0, 0, GLO_TEMPORALSHAPE);
GLHelper::setColor(RGBColor::BLUE);
GLHelper::drawLine(temporalShape);
GLHelper::popMatrix();
GLHelper::pushMatrix();
glLineWidth(2);
glTranslated(0, 0, GLO_TEMPORALSHAPE);
if (deleteLastCreatedPoint) {
GLHelper::setColor(RGBColor::RED);
} else {
GLHelper::setColor(RGBColor::GREEN);
}
GLHelper::drawLine(temporalShape.back(), snapToActiveGrid(getPositionInformation()));
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawTemporalJunction() const {
if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) &&
!myMouseButtonKeyPressed.controlKeyPressed() &&
!myMouseButtonKeyPressed.shiftKeyPressed() &&
!myMouseButtonKeyPressed.altKeyPressed()) {
const Position mousePosition = snapToActiveGrid(getPositionInformation());
const double junctionExaggeration = myVisualizationSettings->junctionSize.getExaggeration(*myVisualizationSettings, nullptr, 4);
RGBColor bubbleColor = myVisualizationSettings->junctionColorer.getScheme().getColor(1);
bubbleColor.setAlpha(200);
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_TEMPORALSHAPE);
GLHelper::pushMatrix();
glTranslated(mousePosition.x(), mousePosition.y(), 0.1);
GLHelper::setColor(bubbleColor);
const double circleWidth = myVisualizationSettings->neteditSizeSettings.junctionBubbleRadius * junctionExaggeration;
GLHelper::drawOutlineCircle(circleWidth, circleWidth * 0.75, 32);
GLHelper::popMatrix();
if (myViewParent->getCreateEdgeFrame()->getJunctionSource() && (mousePosition.distanceSquaredTo(myViewParent->getCreateEdgeFrame()->getJunctionSource()->getPositionInView()) > 1)) {
RGBColor temporalEdgeColor = RGBColor::BLACK;
temporalEdgeColor.setAlpha(200);
GUIGeometry temporalEdgeGeometry;
PositionVector temporalEdge = {mousePosition, myViewParent->getCreateEdgeFrame()->getJunctionSource()->getPositionInView()};
temporalEdge.move2side(-1);
temporalEdgeGeometry.updateGeometry(temporalEdge);
GLHelper::pushMatrix();
GLHelper::setColor(temporalEdgeColor);
GUIGeometry::drawGeometry(GUIVisualizationSettings::Detail::Level0, temporalEdgeGeometry, 0.75);
if (myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE) {
temporalEdge.move2side(2);
temporalEdgeGeometry.updateGeometry(temporalEdge);
GUIGeometry::drawGeometry(GUIVisualizationSettings::Detail::Level0, temporalEdgeGeometry, 0.75);
}
GLHelper::popMatrix();
}
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawTemporalSplitJunction() const {
if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_CREATE_EDGE) &&
!myMouseButtonKeyPressed.controlKeyPressed() &&
myMouseButtonKeyPressed.shiftKeyPressed() &&
!myMouseButtonKeyPressed.altKeyPressed() &&
(gViewObjectsHandler.markedEdge != nullptr)) {
const auto lane = gViewObjectsHandler.markedEdge->getChildLanes().back();
auto shape = lane->getLaneShape();
shape.move2side(lane->getDrawingConstants()->getDrawingWidth() * -1);
const auto offset = shape.nearest_offset_to_point2D(snapToActiveGrid(getPositionInformation()));
const auto splitPosition = shape.positionAtOffset2D(offset);
const double junctionExaggeration = myVisualizationSettings->junctionSize.getExaggeration(*myVisualizationSettings, nullptr, 4);
RGBColor bubbleColor = myVisualizationSettings->junctionColorer.getScheme().getColor(1);
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_TEMPORALSHAPE);
GLHelper::pushMatrix();
glTranslated(splitPosition.x(), splitPosition.y(), 0.1);
GLHelper::setColor(bubbleColor);
const double circleWidth = myVisualizationSettings->neteditSizeSettings.junctionBubbleRadius * junctionExaggeration;
GLHelper::drawOutlineCircle(circleWidth, circleWidth * 0.75, 32);
GLHelper::drawFilledCircle(0.5, 32);
GLHelper::popMatrix();
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawTemporalRoundabout() const {
if ((myCurrentObjectsDialog.size() > 0) && (myCurrentObjectsDialog.front()->getType() == GLO_JUNCTION) && myDrawPreviewRoundabout) {
const auto junction = myNet->getAttributeCarriers()->retrieveJunction(myCurrentObjectsDialog.front()->getMicrosimID());
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_TEMPORALSHAPE);
GLHelper::pushMatrix();
glTranslated(junction->getNBNode()->getPosition().x(), junction->getNBNode()->getPosition().y(), 0.1);
GLHelper::setColor(RGBColor::GREEN);
const double circleWidth = (junction->getNBNode()->getRadius() < 0) ? 4.0 : junction->getNBNode()->getRadius();
GLHelper::drawOutlineCircle(circleWidth * 1.30, circleWidth, 32);
GLHelper::popMatrix();
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawTemporalE1TLSLines() const {
if (selectingDetectorsTLSMode() && (myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction() != nullptr)) {
const auto junctionPos = myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction()->getNBNode()->getPosition();
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_TEMPORALSHAPE);
for (const auto& E1ID : myViewParent->getTLSEditorFrame()->getTLSAttributes()->getE1Detectors()) {
const auto E1 = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_INDUCTION_LOOP, E1ID.second, false);
if (E1) {
GLHelper::pushMatrix();
GUIGeometry::drawChildLine(*myVisualizationSettings, junctionPos, E1->getPositionInView(),
myVisualizationSettings->additionalSettings.TLSConnectionColor, true, 0.25);
GLHelper::popMatrix();
}
}
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawTemporalJunctionTLSLines() const {
if (selectingJunctionsTLSMode() && (myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction() != nullptr)) {
const auto junctionPos = myViewParent->getTLSEditorFrame()->getTLSJunction()->getCurrentJunction()->getNBNode()->getPosition();
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_TEMPORALSHAPE);
for (const auto& selectedJunctionID : myViewParent->getTLSEditorFrame()->getTLSJunction()->getSelectedJunctionIDs()) {
const auto selectedJunction = myNet->getAttributeCarriers()->retrieveJunction(selectedJunctionID);
GLHelper::pushMatrix();
GUIGeometry::drawChildLine(*myVisualizationSettings, junctionPos, selectedJunction->getPositionInView(),
myVisualizationSettings->additionalSettings.TLSConnectionColor, true, 0.25);
GLHelper::popMatrix();
}
GLHelper::popMatrix();
}
}
void
GNEViewNet::drawNeteditAttributesReferences() {
if (myEditModes.isCurrentSupermodeNetwork() && (myEditModes.networkEditMode == NetworkEditMode::NETWORK_ADDITIONAL)) {
}
}
void
GNEViewNet::drawTestsCircle() const {
if (myVisualizationSettings->showGrid && OptionsCont::getOptions().getBool("gui-testing")) {
const Position mousePosition = snapToActiveGrid(getPositionInformation());
GLHelper::pushMatrix();
glTranslated(mousePosition.x(), mousePosition.y(), GLO_TESTELEMENT - 1);
GLHelper::setColor(RGBColor::ORANGE);
GLHelper::drawFilledCircle(1, 8);
GLHelper::popMatrix();
}
}
void
GNEViewNet::processLeftButtonPressNetwork(void* eventData) {
myMoveMultipleElements.resetMovingSelectedEdge();
switch (myEditModes.networkEditMode) {
case NetworkEditMode::NETWORK_INSPECT: {
if (checkSelectEdges()) {
myViewObjectsSelector.filterLanes();
} else {
myViewObjectsSelector.filterEdges();
}
myViewObjectsSelector.filterLockedElements();
if (myViewParent->getInspectorFrame()->getAttributesEditor()->isReparenting()) {
myViewParent->getInspectorFrame()->getAttributesEditor()->setNewParent(myViewObjectsSelector.getAttributeCarrierFront());
} else {
myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_DELETE: {
if (checkSelectEdges()) {
myViewObjectsSelector.filterLanes();
} else {
myViewObjectsSelector.filterEdges();
}
myViewObjectsSelector.filterLockedElements({GLO_WALKINGAREA});
if (myViewObjectsSelector.getAttributeCarrierFront()) {
if (myViewParent->getDeleteFrame()->getDeleteOptions()->deleteOnlyGeometryPoints()) {
myViewParent->getDeleteFrame()->removeGeometryPoint(myViewObjectsSelector);
} else if (myViewObjectsSelector.getAttributeCarrierFront()->isAttributeCarrierSelected()) {
if (!myViewObjectsSelector.getAttributeCarrierFront()->getGUIGlObject()->isGLObjectLocked()) {
myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
}
} else {
myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
}
} else {
processClick(eventData);
}
break;
}
case NetworkEditMode::NETWORK_SELECT:
if (checkSelectEdges()) {
myViewObjectsSelector.filterLanes();
} else {
myViewObjectsSelector.filterEdges();
}
myViewObjectsSelector.filterLockedElements();
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myMouseButtonKeyPressed.shiftKeyPressed()) {
mySelectingArea.beginRectangleSelection();
} else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
processClick(eventData);
}
} else {
processClick(eventData);
}
break;
case NetworkEditMode::NETWORK_CREATE_EDGE: {
if (myMouseButtonKeyPressed.shiftKeyPressed()) {
GNEEdge* edge = myViewObjectsSelector.getEdgeFront();
if (edge) {
const auto oppositeEdges = edge->getOppositeEdges();
if (myMouseButtonKeyPressed.altKeyPressed()) {
myNet->splitEdge(edge, edge->getSplitPos(getPositionInformation()), myUndoList);
} else if (oppositeEdges.size() > 0) {
myNet->splitEdgesBidi(edge, oppositeEdges.front(), edge->getSplitPos(getPositionInformation()), myUndoList);
} else {
myNet->splitEdge(edge, edge->getSplitPos(getPositionInformation()), myUndoList);
}
}
} else if (!myMouseButtonKeyPressed.controlKeyPressed()) {
myViewParent->getCreateEdgeFrame()->processClick(getPositionInformation(),
myViewObjectsSelector,
(myNetworkViewOptions.menuCheckAutoOppositeEdge->amChecked() == TRUE),
(myNetworkViewOptions.menuCheckChainEdges->amChecked() == TRUE));
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_MOVE: {
myViewObjectsSelector.filterLanes();
myViewObjectsSelector.filterLockedElements({GLO_WALKINGAREA});
if (myEditNetworkElementShapes.getEditedNetworkElement()) {
if (myMouseButtonKeyPressed.shiftKeyPressed()) {
if (myViewObjectsSelector.getNetworkElementFront() == myEditNetworkElementShapes.getEditedNetworkElement()) {
myViewObjectsSelector.getNetworkElementFront()->removeGeometryPoint(getPositionInformation(), myUndoList);
}
} else if (!myMoveSingleElement.beginMoveNetworkElementShape()) {
processClick(eventData);
}
} else {
myViewObjectsSelector.filterConnections();
myViewObjectsSelector.filterCrossings();
auto AC = myViewObjectsSelector.getAttributeCarrierFront();
if (AC && (AC->getTagProperty()->isNetworkElement() || AC->getTagProperty()->isAdditionalElement())) {
if (AC->isAttributeCarrierSelected()) {
myMoveMultipleElements.beginMoveSelection();
} else if (!myMoveSingleElement.beginMoveSingleElementNetworkMode()) {
processClick(eventData);
}
} else {
processClick(eventData);
}
}
break;
}
case NetworkEditMode::NETWORK_CONNECT: {
if (myViewObjectsSelector.getLaneFrontNonLocked()) {
myViewParent->getConnectorFrame()->handleLaneClick(myViewObjectsSelector);
updateViewNet();
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_TLS: {
myViewParent->getTLSEditorFrame()->editTLS(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_ADDITIONAL: {
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myViewParent->getAdditionalFrame()->addAdditional(myViewObjectsSelector)) {
updateViewNet();
}
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_CROSSING: {
myViewObjectsSelector.filterCrossings();
myViewObjectsSelector.filterWalkingAreas();
myViewObjectsSelector.filterConnections();
myViewParent->getCrossingFrame()->addCrossing(myViewObjectsSelector);
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_TAZ: {
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myMouseButtonKeyPressed.shiftKeyPressed() && (myViewParent->getTAZFrame()->getCurrentTAZModule()->getTAZ() != nullptr)) {
mySelectingArea.beginRectangleSelection();
} else {
if (myViewParent->getTAZFrame()->processClick(snapToActiveGrid(getPositionInformation()), myViewObjectsSelector)) {
updateViewNet();
}
processClick(eventData);
}
} else {
processClick(eventData);
}
break;
}
case NetworkEditMode::NETWORK_SHAPE: {
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (!myViewObjectsSelector.getPOIFront()) {
bool updateTemporalShape = false;
myViewParent->getShapeFrame()->processClick(snapToActiveGrid(getPositionInformation()), myViewObjectsSelector, updateTemporalShape);
updateViewNet();
if (!updateTemporalShape) {
processClick(eventData);
}
}
} else {
processClick(eventData);
}
break;
}
case NetworkEditMode::NETWORK_PROHIBITION: {
if (myViewObjectsSelector.getConnectionFront()) {
myViewParent->getProhibitionFrame()->handleProhibitionClick(myViewObjectsSelector);
updateViewNet();
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_WIRE: {
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
myViewParent->getWireFrame()->addWire(myViewObjectsSelector);
updateViewNet();
}
processClick(eventData);
break;
}
case NetworkEditMode::NETWORK_DECAL: {
processClick(eventData);
break;
}
default: {
processClick(eventData);
}
}
}
void
GNEViewNet::processLeftButtonReleaseNetwork() {
if (myMoveMultipleElements.isMovingSelection()) {
myMoveMultipleElements.finishMoveSelection();
} else if (mySelectingArea.selectingUsingRectangle) {
if (mySelectingArea.startDrawing) {
if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_SELECT) {
mySelectingArea.processRectangleSelection();
} else if (myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) {
myViewParent->getTAZFrame()->processEdgeSelection(mySelectingArea.processEdgeRectangleSelection());
}
} else if (myMouseButtonKeyPressed.shiftKeyPressed()) {
if (myViewObjectsSelector.getLaneFront()) {
if (myViewObjectsSelector.getLaneFront()->isAttributeCarrierSelected()) {
myViewObjectsSelector.getLaneFront()->unselectAttributeCarrier();
} else {
myViewObjectsSelector.getLaneFront()->selectAttributeCarrier();
}
}
}
mySelectingArea.finishRectangleSelection();
} else {
myMoveSingleElement.finishMoveSingleElement();
}
}
void
GNEViewNet::processMoveMouseNetwork(const bool mouseLeftButtonPressed) {
if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_SHAPE) && myViewParent->getShapeFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getShapeFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
} else if ((myEditModes.networkEditMode == NetworkEditMode::NETWORK_TAZ) && myViewParent->getTAZFrame()->getDrawingShapeModule()->isDrawing()) {
myViewParent->getTAZFrame()->getDrawingShapeModule()->setDeleteLastCreatedPoint(myMouseButtonKeyPressed.shiftKeyPressed());
}
if (myMoveMultipleElements.isMovingSelection()) {
myMoveMultipleElements.moveSelection(mouseLeftButtonPressed);
} else if (mySelectingArea.selectingUsingRectangle) {
mySelectingArea.moveRectangleSelection();
} else {
myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
}
}
void
GNEViewNet::processLeftButtonPressDemand(void* eventData) {
myViewObjectsSelector.filterShapes();
switch (myEditModes.demandEditMode) {
case DemandEditMode::DEMAND_INSPECT: {
myViewObjectsSelector.filterLockedElements();
myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_DELETE: {
myViewObjectsSelector.filterLockedElements();
const auto markAC = myViewObjectsSelector.getAttributeCarrierFront();
if (markAC) {
if (markAC->isAttributeCarrierSelected()) {
myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
} else {
myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
}
} else {
processClick(eventData);
}
break;
}
case DemandEditMode::DEMAND_SELECT:
myViewObjectsSelector.filterLockedElements();
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myMouseButtonKeyPressed.shiftKeyPressed()) {
mySelectingArea.beginRectangleSelection();
} else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
processClick(eventData);
}
} else {
processClick(eventData);
}
break;
case DemandEditMode::DEMAND_MOVE: {
myViewObjectsSelector.filterLockedElements();
const auto markAC = myViewObjectsSelector.getAttributeCarrierFront();
if (markAC) {
if (markAC->isAttributeCarrierSelected()) {
myMoveMultipleElements.beginMoveSelection();
} else if (!myMoveSingleElement.beginMoveSingleElementDemandMode()) {
processClick(eventData);
}
} else {
processClick(eventData);
}
break;
}
case DemandEditMode::DEMAND_ROUTE: {
if (myViewObjectsSelector.getLaneFront()) {
myViewParent->getRouteFrame()->addEdgeRoute(myViewObjectsSelector.getLaneFront()->getParentEdge(), myMouseButtonKeyPressed);
}
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_VEHICLE: {
myViewObjectsSelector.filterAdditionals(true, false);
myViewObjectsSelector.filterDemandElements(false);
myViewParent->getVehicleFrame()->addVehicle(myViewObjectsSelector, myMouseButtonKeyPressed);
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_STOP: {
myViewObjectsSelector.filterAdditionals(false, true);
myViewObjectsSelector.filterDemandElements(true);
if (myViewParent->getStopFrame()->addStop(myViewObjectsSelector, myMouseButtonKeyPressed)) {
updateViewNet();
}
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_PERSON: {
myViewObjectsSelector.filterAdditionals(false, false);
if (myViewParent->getPersonFrame()->getPlanSelector()->getCurrentPlanTagProperties()) {
if (myViewParent->getPersonFrame()->getPlanSelector()->getCurrentPlanTagProperties()->planRoute()) {
myViewObjectsSelector.filterDemandElements(false);
} else {
myViewObjectsSelector.filterDemandElements(true);
}
myViewParent->getPersonFrame()->addPerson(myViewObjectsSelector);
}
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_PERSONPLAN: {
myViewObjectsSelector.filterAdditionals(false, false);
if (myViewParent->getPersonPlanFrame()->getPlanSelector()->getCurrentPlanTagProperties()) {
if (myViewParent->getPersonPlanFrame()->getPlanSelector()->getCurrentPlanTagProperties()->planRoute()) {
myViewObjectsSelector.filterDemandElements(false);
} else {
myViewObjectsSelector.filterDemandElements(true);
}
myViewParent->getPersonPlanFrame()->addPersonPlanElement(myViewObjectsSelector);
}
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_CONTAINER: {
myViewObjectsSelector.filterAdditionals(false, false);
myViewObjectsSelector.filterDemandElements(true);
myViewParent->getContainerFrame()->addContainer(myViewObjectsSelector);
processClick(eventData);
break;
}
case DemandEditMode::DEMAND_CONTAINERPLAN: {
myViewObjectsSelector.filterAdditionals(false, false);
myViewObjectsSelector.filterDemandElements(true);
myViewParent->getContainerPlanFrame()->addContainerPlanElement(myViewObjectsSelector);
processClick(eventData);
break;
}
default: {
processClick(eventData);
}
}
}
void
GNEViewNet::processLeftButtonReleaseDemand() {
if (myMoveMultipleElements.isMovingSelection()) {
myMoveMultipleElements.finishMoveSelection();
} else if (mySelectingArea.selectingUsingRectangle) {
if (mySelectingArea.startDrawing) {
mySelectingArea.processRectangleSelection();
}
mySelectingArea.finishRectangleSelection();
} else {
myMoveSingleElement.finishMoveSingleElement();
}
}
void
GNEViewNet::processMoveMouseDemand(const bool mouseLeftButtonPressed) {
if (mySelectingArea.selectingUsingRectangle) {
mySelectingArea.moveRectangleSelection();
} else {
myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
}
}
void
GNEViewNet::processLeftButtonPressData(void* eventData) {
const auto AC = myViewObjectsSelector.getAttributeCarrierFront();
switch (myEditModes.dataEditMode) {
case DataEditMode::DATA_INSPECT: {
myViewObjectsSelector.filterLockedElements();
if (AC && AC->getTagProperty()->getTag() == SUMO_TAG_TAZ) {
myViewParent->getInspectorFrame()->inspectElement(AC);
} else {
myViewParent->getInspectorFrame()->inspectClickedElements(myViewObjectsSelector, getPositionInformation(), myMouseButtonKeyPressed.shiftKeyPressed());
}
processClick(eventData);
break;
}
case DataEditMode::DATA_DELETE: {
if (AC) {
if (AC->isAttributeCarrierSelected()) {
if (!AC->getGUIGlObject()->isGLObjectLocked()) {
myViewParent->getDeleteFrame()->removeSelectedAttributeCarriers();
}
} else {
myViewParent->getDeleteFrame()->removeAttributeCarrier(myViewObjectsSelector);
}
} else {
processClick(eventData);
}
break;
}
case DataEditMode::DATA_SELECT:
myViewObjectsSelector.filterLockedElements();
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myMouseButtonKeyPressed.shiftKeyPressed()) {
mySelectingArea.beginRectangleSelection();
} else if (!myViewParent->getSelectorFrame()->selectAttributeCarrier(myViewObjectsSelector)) {
processClick(eventData);
}
} else {
processClick(eventData);
}
break;
case DataEditMode::DATA_EDGEDATA:
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myViewParent->getEdgeDataFrame()->addEdgeData(myViewObjectsSelector, myMouseButtonKeyPressed)) {
updateViewNet();
}
}
processClick(eventData);
break;
case DataEditMode::DATA_EDGERELDATA:
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myViewParent->getEdgeRelDataFrame()->addEdgeRelationData(myViewObjectsSelector, myMouseButtonKeyPressed)) {
updateViewNet();
}
}
processClick(eventData);
break;
case DataEditMode::DATA_TAZRELDATA:
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
if (myViewParent->getTAZRelDataFrame()->setTAZ(myViewObjectsSelector)) {
updateViewNet();
}
}
processClick(eventData);
break;
case DataEditMode::DATA_MEANDATA:
if (!myMouseButtonKeyPressed.controlKeyPressed()) {
}
processClick(eventData);
break;
default: {
processClick(eventData);
}
}
}
void
GNEViewNet::processLeftButtonReleaseData() {
if (myMoveMultipleElements.isMovingSelection()) {
myMoveMultipleElements.finishMoveSelection();
} else if (mySelectingArea.selectingUsingRectangle) {
if (mySelectingArea.startDrawing) {
mySelectingArea.processRectangleSelection();
}
mySelectingArea.finishRectangleSelection();
} else {
myMoveSingleElement.finishMoveSingleElement();
}
}
void
GNEViewNet::processMoveMouseData(const bool mouseLeftButtonPressed) {
if (mySelectingArea.selectingUsingRectangle) {
mySelectingArea.moveRectangleSelection();
} else {
myMoveSingleElement.moveSingleElement(mouseLeftButtonPressed);
}
}