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