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