Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 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 GUIGlObject.h 15 : /// @author Daniel Krajzewicz 16 : /// @author Jakob Erdmann 17 : /// @author Michael Behrisch 18 : /// @author Laura Bieker 19 : /// @date Oct 2002 20 : /// 21 : // Base class for all objects that may be displayed within the openGL-gui 22 : /****************************************************************************/ 23 : #pragma once 24 : #include <config.h> 25 : 26 : #include <string> 27 : #include <set> 28 : 29 : #include <utils/geom/Boundary.h> 30 : #include <utils/common/StdDefs.h> 31 : #include <utils/common/StringUtils.h> 32 : #include <utils/common/StringBijection.h> 33 : #include <utils/common/RGBColor.h> 34 : #include <utils/foxtools/fxheader.h> 35 : 36 : #include "GUIGlObjectTypes.h" 37 : 38 : 39 : // =========================================================================== 40 : // definitions 41 : // =========================================================================== 42 : 43 : typedef unsigned int GUIGlID; 44 : 45 : // =========================================================================== 46 : // class declarations 47 : // =========================================================================== 48 : 49 : class GUIGlObjectStorage; 50 : class GUIParameterTableWindow; 51 : class GUIMainWindow; 52 : class GUIGLObjectPopupMenu; 53 : class GUISUMOAbstractView; 54 : class GUIVisualizationSettings; 55 : struct GUIVisualizationTextSettings; 56 : 57 : #ifdef HAVE_OSG 58 : namespace osg { 59 : class Node; 60 : } 61 : #endif 62 : 63 : // =========================================================================== 64 : // class definitions 65 : // =========================================================================== 66 : 67 : class GUIGlObject { 68 : 69 : public: 70 : /// @brief associates object types with strings 71 : static StringBijection<GUIGlObjectType> TypeNames; 72 : static const GUIGlID INVALID_ID; 73 : static const double INVALID_PRIORITY; 74 : 75 : /** @brief Constructor 76 : * 77 : * This is the standard constructor that assures that the object is known 78 : * and its id is unique. Use it always :-) 79 : * 80 : * @param[in] type The GUIGlObjectType type 81 : * @param[in] microsimID unique ID 82 : * @param[in] icon optional icon associated with this GUIGLObject 83 : * @see GUIGlObjectStorage 84 : */ 85 : GUIGlObject(GUIGlObjectType type, const std::string& microsimID, FXIcon* icon); 86 : 87 : /// @brief Destructor 88 : virtual ~GUIGlObject(); 89 : 90 : /// @name getter methods 91 : /// @{ 92 : /// @brief Returns the full name appearing in the tool tip 93 : /// @return This object's typed id 94 : inline const std::string& getFullName() const { 95 2897406 : return myFullName; 96 : } 97 : 98 : /// @brief Returns the name of the parent object (if any) 99 : /// @return This object's parent id 100 : virtual std::string getParentName() const; 101 : 102 : /// @brief Returns the numerical id of the object 103 : /// @return This object's gl-id 104 : inline GUIGlID getGlID() const { 105 95351835 : return myGlID; 106 : } 107 : 108 : /// @brief get icon associated with this GL Object 109 : FXIcon* getGLIcon() const; 110 : 111 : /// @} 112 : 113 : /// @name interfaces to be implemented by derived classes 114 : /// @{ 115 : /** @brief Returns an own popup-menu 116 : * 117 : * @param[in] app The application needed to build the popup-menu 118 : * @param[in] parent The parent window needed to build the popup-menu 119 : * @return The built popup-menu 120 : */ 121 : virtual GUIGLObjectPopupMenu* getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) = 0; 122 : 123 : /// @brief notify object about popup menu removal 124 0 : virtual void removedPopupMenu() {} 125 : 126 : /** @brief Returns an own parameter window 127 : * 128 : * @param[in] app The application needed to build the parameter window 129 : * @param[in] parent The parent window needed to build the parameter window 130 : * @return The built parameter window 131 : */ 132 : virtual GUIParameterTableWindow* getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& parent) = 0; 133 : 134 : /** @brief Returns an own type parameter window (optional) 135 : * 136 : * @param[in] app The application needed to build the parameter window 137 : * @param[in] parent The parent window needed to build the parameter window 138 : * @return The built parameter window 139 : */ 140 : virtual GUIParameterTableWindow* getTypeParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& parent); 141 : 142 : /// @brief Returns the id of the object as known to microsim 143 : inline const std::string& getMicrosimID() const { 144 1450640 : return myMicrosimID; 145 : } 146 : 147 : /// @brief Returns the name of the object (default "") 148 : virtual const std::string getOptionalName() const; 149 : 150 : /// @brief Changes the microsimID of the object 151 : /// @note happens in netedit 152 : virtual void setMicrosimID(const std::string& newID); 153 : 154 : /// @brief Returns the type of the object as coded in GUIGlObjectType 155 : /// @see GUIGlObjectType 156 : inline GUIGlObjectType getType() const { 157 73946145 : return myGLObjectType; 158 : } 159 : 160 : /// @brief Returns the priority of receiving mouse clicks 161 0 : virtual double getClickPriority() const { 162 0 : return (double)myGLObjectType; 163 : } 164 : 165 : /// @brief get blocking status 166 : inline bool isBlocked() const { 167 1445389 : return myAmBlocked; 168 : } 169 : 170 : /// @brief set blocking status 171 : inline void setBlocked(const bool state = true) { 172 21268 : myAmBlocked = state; 173 21248 : } 174 : 175 : /// @brief return exaggeration associated with this GLObject 176 0 : virtual double getExaggeration(const GUIVisualizationSettings& s) const { 177 : UNUSED_PARAMETER(s); 178 0 : return 1.; 179 : } 180 : 181 : //// @brief Returns the boundary to which the view shall be centered in order to show the object 182 : virtual Boundary getCenteringBoundary() const = 0; 183 : 184 : /// @brief Draws the object 185 : /// @param[in] s The settings for the current view (may influence drawing) 186 : virtual void drawGL(const GUIVisualizationSettings& s) const = 0; 187 : 188 : /// @brief check if element is locked (Currently used only in netedit) 189 : virtual bool isGLObjectLocked() const; 190 : 191 : /// @brief mark element as front element (Currently used only in netedit) 192 : virtual void markAsFrontElement(); 193 : 194 : /// @brief delete GLObject (Currently used only in netedit) 195 : virtual void deleteGLObject(); 196 : 197 : /// @brief select GLObject (Currently used only in netedit) 198 : virtual void selectGLObject(); 199 : 200 : /// @brief update GLObject (geometry, ID, etc.) (optional) 201 : virtual void updateGLObject(); 202 : 203 0 : virtual double getColorValue(const GUIVisualizationSettings& /*s*/, int /*activeScheme*/) const { 204 0 : return 0; 205 : } 206 : /// @} 207 : 208 : /** @brief Draws additional, user-triggered visualisations 209 : * @param[in] parent The view 210 : * @param[in] s The settings for the current view (may influence drawing) 211 : */ 212 : virtual void drawGLAdditional(GUISUMOAbstractView* const parent, const GUIVisualizationSettings& s) const; 213 : 214 : /// @brief remove additional user-griggered visualisations 215 0 : virtual void removeActiveAddVisualisation(GUISUMOAbstractView* const /*parent*/, int /*which*/) {} 216 : 217 : /// @brief notify object about left click 218 0 : virtual void onLeftBtnPress(void* /*data*/) {} 219 : 220 : #ifdef HAVE_OSG 221 : /// @brief get OSG Node 222 : osg::Node* getNode() const; 223 : 224 : /// @brief set OSG Node 225 : void setNode(osg::Node* node); 226 : #endif 227 : 228 : /// @name Parameter table window I/O 229 : /// @{ 230 : /// @brief Lets this object know a parameter window showing the object's values was opened 231 : /// @param[in] w The opened parameter window 232 : void addParameterTable(GUIParameterTableWindow* w); 233 : 234 : /// @brief Lets this object know a parameter window showing the object's values was closed 235 : /// @param[in] w The closed parameter window 236 : void removeParameterTable(GUIParameterTableWindow* w); 237 : /// @} 238 : 239 : /// @brief draw name of item 240 : void drawName(const Position& pos, const double scale, const GUIVisualizationTextSettings& settings, const double angle = 0, bool forceShow = false) const; 241 : 242 : protected: 243 : /// @name helper methods for building popup-menus 244 : /// @{ 245 : /** @brief Builds the header 246 : * @param[in, filled] ret The popup menu to add the entry to 247 : * @param[in] addSeparator Whether a separator shall be added, too 248 : */ 249 : void buildPopupHeader(GUIGLObjectPopupMenu* ret, GUIMainWindow& app, bool addSeparator = true); 250 : 251 : /** @brief Builds an entry which allows to center to the object 252 : * @param[in, filled] ret The popup menu to add the entry to 253 : * @param[in] addSeparator Whether a separator shall be added, too 254 : */ 255 : void buildCenterPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 256 : 257 : /** @brief Builds entries which allow to copy the name / typed name into the clipboard 258 : * @param[in, filled] ret The popup menu to add the entry to 259 : * @param[in] addSeparator Whether a separator shall be added, too 260 : */ 261 : void buildNameCopyPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 262 : 263 : /** @brief Builds an entry which allows to (de)select the object 264 : * @param[in, filled] ret The popup menu to add the entry to 265 : * @param[in] addSeparator Whether a separator shall be added, too 266 : */ 267 : void buildSelectionPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 268 : 269 : /** @brief Builds an entry which allows to open the parameter window 270 : * @param[in, filled] ret The popup menu to add the entry to 271 : * @param[in] addSeparator Whether a separator shall be added, too 272 : */ 273 : void buildShowParamsPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 274 : 275 : /** @brief Builds an entry which allows to open the type parameter window 276 : * @param[in, filled] ret The popup menu to add the entry to 277 : * @param[in] addSeparator Whether a separator shall be added, too 278 : */ 279 : void buildShowTypeParamsPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 280 : 281 : /** @brief Builds an entry which allows to copy the cursor position 282 : * if geo projection is used, also builds an entry for copying the geo-position 283 : * @param[in, filled] ret The popup menu to add the entry to 284 : * @param[in] addSeparator Whether a separator shall be added, too 285 : */ 286 : void buildPositionCopyEntry(GUIGLObjectPopupMenu* ret, const GUIMainWindow& app) const; 287 : 288 : /** @brief Builds an entry which allows to open the manipulator window 289 : * @param[in, filled] ret The popup menu to add the entry to 290 : * @param[in] addSeparator Whether a separator shall be added, too 291 : */ 292 : void buildShowManipulatorPopupEntry(GUIGLObjectPopupMenu* ret, bool addSeparator = true); 293 : /// @} 294 : 295 : /// @brief build basic shape popup options. Used to unify pop-ups menu in netedit and SUMO-GUI 296 : void buildShapePopupOptions(GUIMainWindow& app, GUIGLObjectPopupMenu* ret, const std::string& type); 297 : 298 : /// @brief build basic additional popup options. Used to unify pop-ups menu in netedit and SUMO-GUI 299 : void buildAdditionalsPopupOptions(GUIMainWindow& app, GUIGLObjectPopupMenu* ret, const std::string& type); 300 : 301 : private: 302 : /// @brief The numerical id of the object 303 : const GUIGlID myGlID; 304 : 305 : /// @brief The type of the object 306 : const GUIGlObjectType myGLObjectType; 307 : 308 : /// @brief ID of GL object 309 : std::string myMicrosimID; 310 : 311 : /// @brief full name of GL Object 312 : std::string myFullName; 313 : 314 : /// @brief icon associatd with this GL Object 315 : FXIcon* myIcon; 316 : 317 : /// @brief whether the object can be deleted 318 : bool myAmBlocked = false; 319 : 320 : /// @brief Parameter table windows which refer to this object 321 : std::set<GUIParameterTableWindow*> myParamWindows; 322 : 323 : #ifdef HAVE_OSG 324 : /// @brief OSG Node of this GL object 325 : osg::Node* myOSGNode = nullptr; 326 : #endif 327 : 328 : /// @brief create full name 329 : std::string createFullName() const; 330 : 331 : /// @brief vector for TypeNames Initializer 332 : static StringBijection<GUIGlObjectType>::Entry GUIGlObjectTypeNamesInitializer[]; 333 : 334 : /// @brief Invalidated copy constructor. 335 : GUIGlObject(const GUIGlObject&) = delete; 336 : 337 : /// @brief Invalidated assignment operator. 338 : GUIGlObject& operator=(const GUIGlObject&) = delete; 339 : };