1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file    GNEViewNet.h
11 /// @author  Jakob Erdmann
12 /// @date    Feb 2011
13 /// @version $Id$
14 ///
15 // A view on the network being edited (adapted from GUIViewTraffic)
16 /****************************************************************************/
17 #ifndef GNEViewNet_h
18 #define GNEViewNet_h
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include "GNEViewNetHelper.h"
25 
26 #include <utils/common/SUMOVehicleClass.h>
27 #include <utils/foxtools/MFXCheckableButton.h>
28 #include <utils/geom/Position.h>
29 #include <utils/geom/PositionVector.h>
30 #include <utils/gui/globjects/GUIGlObject.h>
31 #include <utils/gui/globjects/GUIGlObjectTypes.h>
32 #include <utils/gui/settings/GUIPropertyScheme.h>
33 #include <utils/gui/settings/GUIVisualizationSettings.h>
34 #include <utils/gui/windows/GUISUMOAbstractView.h>
35 
36 // ===========================================================================
37 // class definitions
38 // ===========================================================================
39 /**
40  * @class GNEViewNet
41  * Microsocopic view at the simulation
42  */
43 class GNEViewNet : public GUISUMOAbstractView {
44     /// @brief FOX-declaration
45     FXDECLARE(GNEViewNet)
46 
47     /// @brief declare GNEViewNetHelper as friend struct
48     friend struct GNEViewNetHelper;
49 
50 public:
51     /* @brief constructor
52      * @param[in] tmpParent temporal FXFrame parent so that we can add items to view area in the desired order
53      * @param[in] actualParent FXFrame parent of GNEViewNet
54      * @param[in] app main windows
55      * @param[in] viewParent viewParent of this viewNet
56      * @param[in] net traffic net
57      * @param[in] undoList pointer to UndoList modul
58      * @param[in] glVis a reference to GLVisuals
59      * @param[in] share a reference to FXCanvas
60      */
61     GNEViewNet(FXComposite* tmpParent, FXComposite* actualParent, GUIMainWindow& app,
62                GNEViewParent* viewParent, GNENet* net, GNEUndoList* undoList,
63                FXGLVisual* glVis, FXGLCanvas* share);
64 
65     /// @brief destructor
66     ~GNEViewNet();
67 
68     /// @brief builds the view toolbars
69     void buildViewToolBars(GUIGlChildWindow&);
70 
71     /// @brief Mark the entire GNEViewNet to be repainted later
72     void update() const;
73 
74     /// @brief get AttributeCarriers in Boundary
75     std::set<std::pair<std::string, GNEAttributeCarrier*> > getAttributeCarriersInBoundary(const Boundary& boundary, bool forceSelectEdges = false);
76 
77     /** @brief Builds an entry which allows to (de)select the object
78      * @param ret The popup menu to add the entry to
79      * @param AC AttributeCarrier that will be select/unselected
80      */
81     void buildSelectionACPopupEntry(GUIGLObjectPopupMenu* ret, GNEAttributeCarrier* AC);
82 
83     /// @brief set color scheme
84     bool setColorScheme(const std::string& name);
85 
86     ///@brief recalibrate color scheme according to the current value range
87     void buildColorRainbow(const GUIVisualizationSettings& s, GUIColorScheme& scheme, int active, GUIGlObjectType objectType);
88 
89     //@brief open object dialog
90     void openObjectDialog();
91 
92     /// @brief get edit modes
93     const GNEViewNetHelper::EditModes& getEditModes() const;
94 
95     /// @brief get move options
96     const GNEViewNetHelper::MoveOptions& getMoveOptions() const;
97 
98     /// @brief get view options
99     const GNEViewNetHelper::ViewOptions& getViewOptions() const;
100 
101     // @brief get Create Edge Options
102     const GNEViewNetHelper::CreateEdgeOptions& getCreateEdgeOptions() const;
103 
104     /// @brief get Key Pressed modul
105     const GNEViewNetHelper::KeyPressed& getKeyPressed() const;
106 
107     /// @name overloaded handlers
108     /// @{
109     /// @brief called when user press mouse's left button
110     long onLeftBtnPress(FXObject*, FXSelector, void*);
111 
112     /// @brief called when user releases mouse's left button
113     long onLeftBtnRelease(FXObject*, FXSelector, void*);
114 
115     /// @brief called when user press mouse's right button
116     long onRightBtnPress(FXObject*, FXSelector, void*);
117 
118     /// @brief called when user releases mouse's right button
119     long onRightBtnRelease(FXObject*, FXSelector, void*);
120 
121     /// @brief called when user moves mouse
122     long onMouseMove(FXObject*, FXSelector, void*);
123 
124     /// @brief called when user press a key
125     long onKeyPress(FXObject* o, FXSelector sel, void* data);
126 
127     /// @brief called when user release a key
128     long onKeyRelease(FXObject* o, FXSelector sel, void* data);
129     /// @}
130 
131     /// @name set modes call backs
132     /// @{
133     /// @brief called when user press a supermode button
134     long onCmdSetSupermode(FXObject*, FXSelector sel, void*);
135 
136     /// @brief called when user press a mode button (Network or demand)
137     long onCmdSetMode(FXObject*, FXSelector sel, void*);
138 
139     /// @}
140 
141     /// @brief split edge at cursor position
142     long onCmdSplitEdge(FXObject*, FXSelector, void*);
143 
144     /// @brief split edge at cursor position
145     long onCmdSplitEdgeBidi(FXObject*, FXSelector, void*);
146 
147     /// @brief reverse edge
148     long onCmdReverseEdge(FXObject*, FXSelector, void*);
149 
150     /// @brief add reversed edge
151     long onCmdAddReversedEdge(FXObject*, FXSelector, void*);
152 
153     /// @brief change geometry endpoint
154     long onCmdEditEdgeEndpoint(FXObject*, FXSelector, void*);
155 
156     /// @brief change geometry endpoint
157     long onCmdResetEdgeEndpoint(FXObject*, FXSelector, void*);
158 
159     /// @brief makes selected edges straight
160     long onCmdStraightenEdges(FXObject*, FXSelector, void*);
161 
162     /// @brief smooth geometry
163     long onCmdSmoothEdges(FXObject*, FXSelector, void*);
164 
165     /// @brief interpolate z values linear between junctions
166     long onCmdStraightenEdgesElevation(FXObject*, FXSelector, void*);
167 
168     /// @brief smooth elevation with regard to adjoining edges
169     long onCmdSmoothEdgesElevation(FXObject*, FXSelector, void*);
170 
171     /// @brief simply shape of current polygon
172     long onCmdSimplifyShape(FXObject*, FXSelector, void*);
173 
174     /// @brief delete the closes geometry point
175     long onCmdDeleteGeometryPoint(FXObject*, FXSelector, void*);
176 
177     /// @brief close opened polygon
178     long onCmdClosePolygon(FXObject*, FXSelector, void*);
179 
180     /// @brief open closed polygon
181     long onCmdOpenPolygon(FXObject*, FXSelector, void*);
182 
183     /// @brief set as first geometry point the closes geometry point
184     long onCmdSetFirstGeometryPoint(FXObject*, FXSelector, void*);
185 
186     /// @brief Transform POI to POILane, and viceversa
187     long onCmdTransformPOI(FXObject*, FXSelector, void*);
188 
189     /// @brief duplicate selected lane
190     long onCmdDuplicateLane(FXObject*, FXSelector, void*);
191 
192     /// @brief reset custom shapes of selected lanes
193     long onCmdResetLaneCustomShape(FXObject*, FXSelector, void*);
194 
195     /// @brief add/remove/restrict lane
196     long onCmdLaneOperation(FXObject*, FXSelector sel, void*);
197 
198     /// @brief open additional dialog
199     long onCmdOpenAdditionalDialog(FXObject*, FXSelector, void*);
200 
201     /// @brief edit junction shape
202     long onCmdEditJunctionShape(FXObject*, FXSelector, void*);
203 
204     /// @brief reset junction shape
205     long onCmdResetJunctionShape(FXObject*, FXSelector, void*);
206 
207     /// @brief replace node by geometry
208     long onCmdReplaceJunction(FXObject*, FXSelector, void*);
209 
210     /// @brief split junction into multiple junctions
211     long onCmdSplitJunction(FXObject*, FXSelector, void*);
212 
213     /// @brief split junction into multiple junctions and reconnect them
214     long onCmdSplitJunctionReconnect(FXObject*, FXSelector, void*);
215 
216     /// @brief clear junction connections
217     long onCmdClearConnections(FXObject*, FXSelector, void*);
218 
219     /// @brief reset junction connections
220     long onCmdResetConnections(FXObject*, FXSelector, void*);
221 
222     /// @brief edit connection shape
223     long onCmdEditConnectionShape(FXObject*, FXSelector, void*);
224 
225     /// @brief edit crossing shape
226     long onCmdEditCrossingShape(FXObject*, FXSelector, void*);
227 
228     /// @brief toogle show connections
229     long onCmdToogleShowConnection(FXObject*, FXSelector, void*);
230 
231     /// @brief toogle show demand elements
232     long onCmdShowDemandElements(FXObject*, FXSelector, void*);
233 
234     /// @brief toogle select edges
235     long onCmdToogleSelectEdges(FXObject*, FXSelector, void*);
236 
237     /// @brief toogle show bubbles
238     long onCmdToogleShowBubbles(FXObject*, FXSelector, void*);
239 
240     /// @brief toogle move elevation
241     long onCmdToogleMoveElevation(FXObject*, FXSelector, void*);
242 
243     /// @brief select AC under cursor
244     long onCmdAddSelected(FXObject*, FXSelector, void*);
245 
246     /// @brief unselect AC under cursor
247     long onCmdRemoveSelected(FXObject*, FXSelector, void*);
248 
249     /// @brief toogle show grid
250     long onCmdShowGrid(FXObject*, FXSelector, void*);
251 
252     /// @brief abort current edition operation
253     void abortOperation(bool clearSelection = true);
254 
255     /// @brief handle del keypress
256     void hotkeyDel();
257 
258     /// @brief handle enter keypress
259     void hotkeyEnter();
260 
261     /// @brief handle focus frame keypress
262     void hotkeyFocusFrame();
263 
264     /// @brief get the net object
265     GNEViewParent* getViewParent() const;
266 
267     /// @brief get the net object
268     GNENet* getNet() const;
269 
270     /// @brief get the undoList object
271     GNEUndoList* getUndoList() const;
272 
273     /// @brief get AttributeCarrier under cursor
274     const GNEAttributeCarrier* getDottedAC() const;
275 
276     /// @brief set attributeCarrier under cursor
277     void setDottedAC(const GNEAttributeCarrier* AC);
278 
279     /// @brief check if lock icon should be visible
280     bool showLockIcon() const;
281 
282     /// @brief set staturBar text
283     void setStatusBarText(const std::string& text);
284 
285     /// @brief whether to autoselect nodes or to lanes
286     bool autoSelectNodes();
287 
288     /// @brief set selection scaling
289     void setSelectionScaling(double selectionScale);
290 
291     /// @brief update control contents after undo/redo or recompute
292     void updateControls();
293 
294     /// @brief change all phases
295     bool changeAllPhases() const;
296 
297     /// @brief return true if junction must be showed as bubbles
298     bool showJunctionAsBubbles() const;
299 
300     /// @brief start edit custom shape
301     void startEditCustomShape(GNENetElement* element, const PositionVector& shape, bool fill);
302 
303     /// @brief edit edit shape
304     void stopEditCustomShape();
305 
306 protected:
307     /// @brief FOX needs this
308     GNEViewNet();
309 
310     /// @brief do paintGL
311     int doPaintGL(int mode, const Boundary& bound);
312 
313     /// @brief called after some features are already initialized
314     void doInit();
315 
316 private:
317     /// @name structs related with modes and testing mode
318     /// @{
319 
320     /// @brief variable used to save variables related with edit moves modes
321     GNEViewNetHelper::EditModes myEditModes;
322 
323     /// @brief variable used to save variables related with testing mode
324     GNEViewNetHelper::TestingMode myTestingMode;
325     /// @}
326 
327     /// @name structs related with input (keyboard and mouse)
328     /// @{
329 
330     /// @brief variable used to save key status after certain events
331     GNEViewNetHelper::KeyPressed myKeyPressed;
332 
333     /// @brief variable use to save all pointers to objects under cursor after a click
334     GNEViewNetHelper::ObjectsUnderCursor myObjectsUnderCursor;
335     /// @}
336 
337     /// @name structs related with checkable buttons
338     /// @{
339 
340     /// @brief variable used to save checkable buttons for common supermodes
341     GNEViewNetHelper::CommonCheckableButtons myCommonCheckableButtons;
342 
343     /// @brief variable used to save checkable buttons for Supermode Network
344     GNEViewNetHelper::NetworkCheckableButtons myNetworkCheckableButtons;
345 
346     /// @brief variable used to save checkable buttons for Supermode Demand
347     GNEViewNetHelper::DemandCheckableButtons myDemandCheckableButtons;
348     /// @}
349 
350     /// @name structs related with Common options
351     /// @{
352     /// @brief variable used to save variables related with selecting areas
353     GNEViewNetHelper::SelectingArea mySelectingArea;
354 
355     /// @brief variable used to save variables related with view options
356     GNEViewNetHelper::ViewOptions myViewOptions;
357     /// @}
358 
359     /// @name structs related with Network options
360     /// @{
361     /// @brief variable used to save all elements related to creation of Edges
362     GNEViewNetHelper::CreateEdgeOptions myCreateEdgeOptions;
363 
364     /// @brief variable used to save all elements related to moving elements
365     GNEViewNetHelper::MoveOptions myMoveOptions;
366 
367     /// @brief variable used to save variables related with movement of single elements
368     GNEViewNetHelper::MoveSingleElementValues myMoveSingleElementValues;
369 
370     /// @brief variable used to save variables related with movement of multiple elements
371     GNEViewNetHelper::MoveMultipleElementValues myMoveMultipleElementValues;
372     // @}
373 
374     /// @name structs related with Demand options
375     /// @{
376 
377     /// @brief variable used to save variables related with vehicle options
378     GNEViewNetHelper::VehicleOptions myVehicleOptions;
379 
380     /// @brief variable used to save variables related with vehicle type options
381     GNEViewNetHelper::VehicleTypeOptions myVehicleTypeOptions;
382     // @}
383 
384     /// @brief view parent
385     GNEViewParent* myViewParent;
386 
387     /// @brief Pointer to current net. (We are not responsible for deletion)
388     GNENet* myNet;
389 
390     /// @brief the current frame
391     GNEFrame* myCurrentFrame;
392 
393     /// @brief a reference to the undolist maintained in the application
394     GNEUndoList* myUndoList;
395 
396     /**@brief current AttributeCarrier that is drawn using with a dotted contour
397      * note: it's constant because is edited from constant functions (example: drawGL(...) const)
398      */
399     const GNEAttributeCarrier* myDottedAC;
400 
401     /// @name variables for edit shapes
402     /// @{
403     /// @brief  polygon used for edit shapes
404     GNEPoly* myEditShapePoly;
405 
406     /// @brief the previous edit mode before edit junction's shapes
407     NetworkEditMode myPreviousNetworkEditMode;
408     /// @}
409 
410     /// @brief create edit mode buttons and elements
411     void buildEditModeControls();
412 
413     /// @brief updates Network mode specific controls
414     void updateNetworkModeSpecificControls();
415 
416     /// @brief updates Demand mode specific controls
417     void updateDemandModeSpecificControls();
418 
419     /// @brief delete all currently selected junctions
420     void deleteSelectedJunctions();
421 
422     /// @brief delete all currently selected lanes
423     void deleteSelectedLanes();
424 
425     /// @brief delete all currently selected edges
426     void deleteSelectedEdges();
427 
428     /// @brief delete all currently selected additionals
429     void deleteSelectedAdditionals();
430 
431     /// @brief delete all currently selected demand elements
432     void deleteSelectedDemandElements();
433 
434     /// @brief delete all currently selected crossings
435     void deleteSelectedCrossings();
436 
437     /// @brief delete all currently selected connections
438     void deleteSelectedConnections();
439 
440     /// @brief delete all currently selected shapes
441     void deleteSelectedShapes();
442 
443     /// @brief try to merge moved junction with another junction in that spot return true if merging did take place
444     bool mergeJunctions(GNEJunction* moved, const Position& oldPos);
445 
446     /// @brief try to retrieve an edge at popup position
447     GNEEdge* getEdgeAtPopupPosition();
448 
449     /// @brief try to retrieve a lane at popup position
450     GNELane* getLaneAtPopupPosition();
451 
452     /// @brief try to retrieve a junction at popup position
453     GNEJunction* getJunctionAtPopupPosition();
454 
455     /// @brief try to retrieve a connection at popup position
456     GNEConnection* getConnectionAtPopupPosition();
457 
458     /// @brief try to retrieve a crossing at popup position
459     GNECrossing* getCrossingAtPopupPosition();
460 
461     /// @brief try to retrieve a additional at popup position
462     GNEAdditional* getAdditionalAtPopupPosition();
463 
464     /// @brief try to retrieve a polygon at popup position
465     GNEPoly* getPolygonAtPopupPosition();
466 
467     /// @brief try to retrieve a POILane at popup position
468     GNEPOI* getPOIAtPopupPosition();
469 
470     /// @brief restrict lane
471     bool restrictLane(SUMOVehicleClass vclass);
472 
473     /// @brief add restricted lane
474     bool addRestrictedLane(SUMOVehicleClass vclass);
475 
476     /// @brief remove restricted lane
477     bool removeRestrictedLane(SUMOVehicleClass vclass);
478 
479     /// @brief Auxiliar function used by onLeftBtnPress(...)
480     void processClick(void* eventData);
481 
482     /// @brief update cursor after every click/key press/release
483     void updateCursor();
484 
485     /// @brief draw functions
486     /// @{
487 
488     /// @brief draw connections between lane candidates during selecting lane mode in Additional mode
489     void drawLaneCandidates() const;
490 
491     /// @brief draw temporal polygon  shape in Polygon Mode
492     void drawTemporalDrawShape() const;
493     /// @}
494 
495     /// @brief mouse process functions
496     /// @{
497 
498     /// @brief process left button press function in Supermode Network
499     void processLeftButtonPressNetwork(void* eventData);
500 
501     /// @brief process left button release function in Supermode Network
502     void processLeftButtonReleaseNetwork();
503 
504     /// @brief process move mouse function in Supermode Network
505     void processMoveMouseNetwork();
506 
507     /// @brief process left button press function in Supermode Demand
508     void processLeftButtonPressDemand(void* eventData);
509 
510     /// @brief process left button release function in Supermode Demand
511     void processLeftButtonReleaseDemand();
512 
513     /// @brief process move mouse function in Supermode Demand
514     void processMoveMouseDemand();
515 
516     /// @brief Invalidated copy constructor.
517     GNEViewNet(const GNEViewNet&) = delete;
518 
519     /// @brief Invalidated assignment operator.
520     GNEViewNet& operator=(const GNEViewNet&) = delete;
521 };
522 
523 
524 #endif
525 
526 /****************************************************************************/
527