Eclipse SUMO - Simulation of Urban MObility
GUIGlObject.cpp
Go to the documentation of this file.
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 /****************************************************************************/
21 // Base class for all objects that may be displayed within the openGL-gui
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <string>
26 #include <stack>
28 #include <utils/common/ToString.h>
38 #include <utils/gui/div/GLHelper.h>
41 #include <utils/geom/GeomHelper.h>
43 
44 #include "GUIGlObject.h"
45 #include "GUIGlObjectStorage.h"
46 
47 // ===========================================================================
48 // static members
49 // ===========================================================================
50 
52  {"network", GLO_NETWORK},
53  //
54  {"networkElement", GLO_NETWORKELEMENT},
55  {"edge", GLO_EDGE},
56  {"lane", GLO_LANE},
57  {"junction", GLO_JUNCTION},
58  {"connection", GLO_CONNECTION},
59  {"crossing", GLO_CROSSING},
60  {"walkingArea", GLO_WALKINGAREA},
61  {"tlLogic", GLO_TLLOGIC},
62  {"edgeType", GLO_EDGETYPE},
63  {"laneType", GLO_LANETYPE},
64  //
65  {"parentChildLine", GLO_PARENTCHILDLINE},
66  //
67  {"additional", GLO_ADDITIONALELEMENT},
68  {"busStop", GLO_BUS_STOP},
69  {"access", GLO_ACCESS},
70  {"taz", GLO_TAZ},
71  {"containerStop", GLO_CONTAINER_STOP},
72  {"chargingStation", GLO_CHARGING_STATION},
73  {"overheadWireSegment", GLO_OVERHEAD_WIRE_SEGMENT},
74  {"parkingArea", GLO_PARKING_AREA},
75  {"parkingSpace", GLO_PARKING_SPACE},
76  {"e1Detector", GLO_E1DETECTOR},
77  {"e1DetectorME", GLO_E1DETECTOR_ME},
78  {"e1DetectorInstant", GLO_E1DETECTOR_INSTANT},
79  {"e2Detector", GLO_E2DETECTOR},
80  {"e3Detector", GLO_E3DETECTOR},
81  {"entryDetector", GLO_DET_ENTRY},
82  {"exitDetector", GLO_DET_EXIT},
83  {"rerouter", GLO_REROUTER},
84  {"rerouterInterval", GLO_REROUTER_INTERVAL},
85  {"closingreroute", GLO_REROUTER_CLOSINGREROUTE},
86  {"closingLaneReroute", GLO_REROUTER_CLOSINGLANEREROUTE},
87  {"parkingAreaReroute", GLO_REROUTER_PARKINGAREAREROUTE},
88  {"destProbReroute", GLO_REROUTER_DESTPROBREROUTE},
89  {"routeProbReroute", GLO_REROUTER_ROUTEPROBREROUTE},
90  {"rerouterEdge", GLO_REROUTER_EDGE},
91  {"variableSpeedSign", GLO_VSS},
92  {"variableSpeedSignStep", GLO_VSS_STEP},
93  {"calibrator", GLO_CALIBRATOR},
94  {"routeProbe", GLO_ROUTEPROBE},
95  {"vaporizer", GLO_VAPORIZER},
96  {"wire", GLO_WIRE},
97  {"tractionsubstation", GLO_TRACTIONSUBSTATION},
98  //
99  {"laneArrows", GLO_LANEARROWS},
100  //
101  {"shape", GLO_SHAPE},
102  {"polygon", GLO_POLYGON},
103  {"poi", GLO_POI},
104  //
105  {"jupedsim.walkable_area", GLO_JPS_WALKABLEAREA},
106  {"jupedsim.obstacle", GLO_JPS_OBSTACLE},
107  //
108  {"routeElement", GLO_ROUTEELEMENT},
109  {"vType", GLO_VTYPE},
110  //
111  {"route", GLO_ROUTE},
112  //
113  {"ride", GLO_RIDE},
114  {"walk", GLO_WALK},
115  {"personTrip", GLO_PERSONTRIP},
116  {"transport", GLO_TRANSPORT},
117  {"tranship", GLO_TRANSHIP},
118  //
119  {"stop", GLO_STOP},
120  {"stopPlan", GLO_STOP_PLAN},
121  //
122  {"vehicle", GLO_VEHICLE},
123  {"trip", GLO_TRIP},
124  {"flow", GLO_FLOW},
125  {"routeFlow", GLO_ROUTEFLOW},
126  //
127  {"container", GLO_CONTAINER},
128  {"containerFlow", GLO_CONTAINERFLOW},
129  //
130  {"person", GLO_PERSON},
131  {"personFlow", GLO_PERSONFLOW},
132  //
133  {"edgeData", GLO_EDGEDATA},
134  {"edgeRelData", GLO_EDGERELDATA},
135  {"TAZRelData", GLO_TAZRELDATA},
136  //
137  {"lockIcon", GLO_LOCKICON},
138  {"textName", GLO_TEXTNAME},
139  {"frontElement", GLO_FRONTELEMENT},
140  {"geometryPoint", GLO_GEOMETRYPOINT},
141  {"dottedContour", GLO_DOTTEDCONTOUR},
142  {"temporalShape", GLO_TEMPORALSHAPE},
143  {"rectangleSelection", GLO_RECTANGLESELECTION},
144  {"testElement", GLO_TESTELEMENT},
145  //
146  {"undefined", GLO_MAX}
147 };
148 
149 
150 StringBijection<GUIGlObjectType> GUIGlObject::TypeNames(GUIGlObjectTypeNamesInitializer, GLO_MAX);
152 const double GUIGlObject::INVALID_PRIORITY(-std::numeric_limits<double>::max());
153 
154 // ===========================================================================
155 // method definitions
156 // ===========================================================================
157 
158 GUIGlObject::GUIGlObject(GUIGlObjectType type, const std::string& microsimID, FXIcon* icon) :
159  myGlID(GUIGlObjectStorage::gIDStorage.registerObject(this)),
160  myGLObjectType(type),
161  myMicrosimID(microsimID),
162  myIcon(icon) {
163  // make sure that reserved GLO_ADDITIONALELEMENT isn't used
167 }
168 
169 
171  // remove all paramWindow related with this object
172  for (const auto& paramWindow : myParamWindows) {
173  paramWindow->removeObject(this);
174  }
175  // remove object from GLObjectValuePassConnector and GUIGlObjectStorage
178 }
179 
180 
181 std::string
184 }
185 
186 
187 FXIcon*
189  return myIcon;
190 }
191 
192 
195  UNUSED_PARAMETER(&app);
196  UNUSED_PARAMETER(&parent);
197  return nullptr;
198 }
199 
200 
201 bool
203  // by default unlocked
204  return false;
205 }
206 
207 
208 void
210  // by default nothing to do
211 }
212 
213 
214 void
216  // by default nothing to do
217 }
218 
219 
220 void
222  // by default nothing to do
223 }
224 
225 
226 void
228  // by default nothing to update
229 }
230 
231 
232 const std::string
234  return "";
235 }
236 
237 
238 void
239 GUIGlObject::setMicrosimID(const std::string& newID) {
240  myMicrosimID = newID;
243 }
244 
245 
246 void
248  UNUSED_PARAMETER(&s);
249  UNUSED_PARAMETER(parent);
250 }
251 
252 #ifdef HAVE_OSG
253 
254 osg::Node*
255 GUIGlObject::getNode() const {
256  return myOSGNode;
257 }
258 
259 
260 void
261 GUIGlObject::setNode(osg::Node* node) {
262  myOSGNode = node;
263 }
264 
265 #endif
266 
267 void
269  new MFXMenuHeader(ret, app.getBoldFont(), getFullName().c_str(), myIcon, nullptr, 0);
270  if (addSeparator) {
271  new FXMenuSeparator(ret);
272  }
273 }
274 
275 
276 void
279  if (addSeparator) {
280  new FXMenuSeparator(ret);
281  }
282 }
283 
284 
285 void
287  GUIDesigns::buildFXMenuCommand(ret, TL("Copy name to clipboard"), nullptr, ret, MID_COPY_NAME);
288  GUIDesigns::buildFXMenuCommand(ret, TL("Copy typed name to clipboard"), nullptr, ret, MID_COPY_TYPED_NAME);
289  if (addSeparator) {
290  new FXMenuSeparator(ret);
291  }
292 }
293 
294 
295 void
297  if (gSelected.isSelected(getType(), getGlID())) {
299  } else {
301  }
302  if (addSeparator) {
303  new FXMenuSeparator(ret);
304  }
305 }
306 
307 
308 void
311  if (addSeparator) {
312  new FXMenuSeparator(ret);
313  }
314 }
315 
316 
317 void
320  if (addSeparator) {
321  new FXMenuSeparator(ret);
322  }
323 }
324 
325 
326 void
328  GUIDesigns::buildFXMenuCommand(ret, TL("Copy cursor position to clipboard"), nullptr, ret, MID_COPY_CURSOR_POSITION);
329  if (GeoConvHelper::getFinal().usingGeoProjection()) {
330  GUIDesigns::buildFXMenuCommand(ret, TL("Copy cursor geo-position to clipboard"), nullptr, ret, MID_COPY_CURSOR_GEOPOSITION);
331  // create menu pane for edge operations
332  FXMenuPane* showCursorGeoPositionPane = new FXMenuPane(ret);
333  ret->insertMenuPaneChild(showCursorGeoPositionPane);
334  new FXMenuCascade(ret, TL("Show cursor geo-position in "), nullptr, showCursorGeoPositionPane);
335  for (const auto& mapper : app.getOnlineMaps()) {
336  if (mapper.first == "GeoHack") {
338  } else if (mapper.first == "Google Maps") {
340  } else if (mapper.first == "OSM") {
342  } else {
343  GUIDesigns::buildFXMenuCommand(showCursorGeoPositionPane, mapper.first, nullptr, ret, MID_SHOW_GEOPOSITION_ONLINE);
344  }
345  }
346  }
347 }
348 
349 
350 void
353  if (addSeparator) {
354  new FXMenuSeparator(ret);
355  }
356 }
357 
358 
359 void
361  myParamWindows.insert(t);
362 }
363 
364 
365 void
367  std::set<GUIParameterTableWindow*>::iterator i = myParamWindows.find(t);
368  if (i != myParamWindows.end()) {
369  myParamWindows.erase(i);
370  }
371 }
372 
373 
374 void
376  assert(ret);
377  // build header (<tag>:<ID>
378  buildPopupHeader(ret, app, false);
379  // build center
381  // build copy name
383  // build select/unselect
385  // build show parameters
386  buildShowParamsPopupEntry(ret, false);
387  // build copy cursor position to clipboard
388  buildPositionCopyEntry(ret, app);
389  // only show type if isn't empty
390  if (type != "") {
391  GUIDesigns::buildFXMenuCommand(ret, TLF("type: %", type).c_str(), nullptr, nullptr, 0);
392  new FXMenuSeparator(ret);
393  }
394 }
395 
396 
397 void
399  assert(ret);
400  // build header (<tag>:<ID>
401  buildPopupHeader(ret, app, false);
402  // build center
404  // build copy name
406  // build select/unselect
408  // build show parameters
409  buildShowParamsPopupEntry(ret, false);
410  // build copy cursor position to clipboard
411  buildPositionCopyEntry(ret, app);
412  // only show type if isn't empty
413  if (type != "") {
414  GUIDesigns::buildFXMenuCommand(ret, TLF("type: %", type).c_str(), nullptr, nullptr, 0);
415  new FXMenuSeparator(ret);
416  }
417 }
418 
419 
420 std::string
423 }
424 
425 
426 void
427 GUIGlObject::drawName(const Position& pos, const double scale, const GUIVisualizationTextSettings& settings, const double angle, bool forceShow) const {
428  if (settings.show(this) || forceShow) {
429  GLHelper::drawTextSettings(settings, getMicrosimID(), pos, scale, angle);
430  }
431 }
432 
433 
434 /****************************************************************************/
@ MID_MANIP
Open the object's manipulator.
Definition: GUIAppEnum.h:485
@ MID_ADDSELECT
Add to selected items - menu entry.
Definition: GUIAppEnum.h:481
@ MID_COPY_CURSOR_GEOPOSITION
Copy cursor geo-coordinate position - popup entry.
Definition: GUIAppEnum.h:459
@ MID_CENTER
Center view to object - popup entry.
Definition: GUIAppEnum.h:449
@ MID_SHOW_GEOPOSITION_ONLINE
Show the cursor geo-coordinate position online in GeoHack - popup entry.
Definition: GUIAppEnum.h:463
@ MID_COPY_TYPED_NAME
Copy typed object name - popup entry.
Definition: GUIAppEnum.h:453
@ MID_COPY_CURSOR_POSITION
Copy cursor position - popup entry.
Definition: GUIAppEnum.h:457
@ MID_SHOWPARS
Show object parameter - popup entry.
Definition: GUIAppEnum.h:467
@ MID_COPY_NAME
Copy object name - popup entry.
Definition: GUIAppEnum.h:451
@ MID_SHOWTYPEPARS
Show object type parameter - popup entry.
Definition: GUIAppEnum.h:469
@ MID_REMOVESELECT
Remove from selected items - Menu Entry.
Definition: GUIAppEnum.h:483
unsigned int GUIGlID
Definition: GUIGlObject.h:43
GUIGlObjectType
@ GLO_EDGERELDATA
edge relation data
@ GLO_DET_EXIT
a DetExit detector
@ GLO_TAZRELDATA
TAZ relation data.
@ GLO_WALKINGAREA
a walkingArea
@ GLO_TEMPORALSHAPE
temporal shape (used in netedit)
@ GLO_VTYPE
@bief vTypes
@ GLO_ROUTEELEMENT
reserved GLO type to pack all RouteElements (note: In this case the sorting of GLO_<element> is impor...
@ GLO_JPS_WALKABLEAREA
walkable area
@ GLO_REROUTER_EDGE
a Rerouter over edge
@ GLO_TRIP
a trip
@ GLO_BUS_STOP
a busStop
@ GLO_REROUTER_DESTPROBREROUTE
a destination probability reroute
@ GLO_TESTELEMENT
test element (used in netedit)
@ GLO_E2DETECTOR
a E2 detector
@ GLO_DET_ENTRY
a DetEntry detector
@ GLO_TRANSHIP
a container tranship
@ GLO_ROUTEPROBE
a RouteProbe
@ GLO_E1DETECTOR
a E1 detector
@ GLO_STOP_PLAN
a stop plan stop
@ GLO_ACCESS
a Acces
@ GLO_VAPORIZER
a Vaporizer
@ GLO_ROUTEFLOW
a routeFlow
@ GLO_WALK
a walk
@ GLO_CONTAINER_STOP
a containerStop
@ GLO_MAX
empty max
@ GLO_ROUTE
a route
@ GLO_WIRE
reserved GLO type for packing all wire elements
@ GLO_CALIBRATOR
a Calibrator
@ GLO_DOTTEDCONTOUR
dotted contour (used in netedit)
@ GLO_JUNCTION
a junction
@ GLO_E3DETECTOR
a E3 detector
@ GLO_FRONTELEMENT
front element (used in netedit)
@ GLO_LANE
a lane
@ GLO_RIDE
a ride
@ GLO_FLOW
a flow
@ GLO_GEOMETRYPOINT
geometry point (used in netedit)
@ GLO_CHARGING_STATION
a chargingStation
@ GLO_EDGETYPE
an edgeType
@ GLO_PARKING_AREA
a ParkingArea
@ GLO_VSS_STEP
a Variable Speed Sign step
@ GLO_TAZ
Traffic Assignment Zones (TAZs)
@ GLO_LANEARROWS
lane details
@ GLO_CONTAINER
a container
@ GLO_PARENTCHILDLINE
line between parent and childrens
@ GLO_JPS_OBSTACLE
obstacles
@ GLO_EDGEDATA
edge data
@ GLO_CONNECTION
a connection
@ GLO_REROUTER_PARKINGAREAREROUTE
a parking area reroute
@ GLO_ADDITIONALELEMENT
reserved GLO type for packing all additionals elements
@ GLO_PERSONTRIP
a person trip
@ GLO_EDGE
an edge
@ GLO_VEHICLE
a vehicle
@ GLO_PERSON
a person
@ GLO_TRANSPORT
a container transport
@ GLO_NETWORK
The network - empty.
@ GLO_SHAPE
reserved GLO type to pack shapes
@ GLO_POI
poi (over view, geo and lane)
@ GLO_REROUTER_CLOSINGLANEREROUTE
a closing lane reroute
@ GLO_RECTANGLESELECTION
rectangle selection shape (used in netedit)
@ GLO_STOP
a stop
@ GLO_LANETYPE
a laneType
@ GLO_OVERHEAD_WIRE_SEGMENT
a segment of an overhead line
@ GLO_TEXTNAME
text element (used in netedit)
@ GLO_NETWORKELEMENT
reserved GLO type to pack all network elements
@ GLO_REROUTER_CLOSINGREROUTE
a closing reroute
@ GLO_PARKING_SPACE
a ParkingSpace
@ GLO_CONTAINERFLOW
a person flow
@ GLO_POLYGON
polygon
@ GLO_TLLOGIC
a tl-logic
@ GLO_E1DETECTOR_ME
a E1 detector
@ GLO_CROSSING
a tl-logic
@ GLO_REROUTER
a Rerouter
@ GLO_PERSONFLOW
a person flow
@ GLO_E1DETECTOR_INSTANT
a E1 detector
@ GLO_REROUTER_INTERVAL
a rerouter interval
@ GLO_REROUTER_ROUTEPROBREROUTE
a route probability reroute
@ GLO_TRACTIONSUBSTATION
a segment of an overhead line
@ GLO_VSS
a Variable Speed Sign
@ GLO_LOCKICON
Lock icon (used in netedit)
GUISelectedStorage gSelected
A global holder of selected objects.
@ RECENTERVIEW
@ GEOHACK
icons for geo tools
#define TL(string)
Definition: MsgHandler.h:315
#define TLF(string,...)
Definition: MsgHandler.h:317
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:30
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048, const int align=0)
Definition: GLHelper.cpp:788
static void removeObject(GUIGlObject &o)
Removes all instances that pass values from the object with the given id.
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
Definition: GUIDesigns.cpp:42
The popup menu of a globject.
void insertMenuPaneChild(FXMenuPane *child)
Insert a sub-menu pane in this GUIGLObjectPopupMenu.
FXIcon * getGLIcon() const
get icon associated with this GL Object
static const double INVALID_PRIORITY
Definition: GUIGlObject.h:73
std::string myMicrosimID
ID of GL object.
Definition: GUIGlObject.h:309
virtual void markAsFrontElement()
mark element as front element (Currently used only in netedit)
std::string myFullName
full name of GL Object
Definition: GUIGlObject.h:312
void buildShowTypeParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the type parameter window.
void buildShowManipulatorPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the manipulator window.
virtual void deleteGLObject()
delete GLObject (Currently used only in netedit)
const std::string & getFullName() const
Definition: GUIGlObject.h:94
const GUIGlObjectType myGLObjectType
The type of the object.
Definition: GUIGlObject.h:306
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
virtual GUIParameterTableWindow * getTypeParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own type parameter window (optional)
virtual const std::string getOptionalName() const
Returns the name of the object (default "")
static const GUIGlID INVALID_ID
Definition: GUIGlObject.h:72
void buildShapePopupOptions(GUIMainWindow &app, GUIGLObjectPopupMenu *ret, const std::string &type)
build basic shape popup options. Used to unify pop-ups menu in netedit and SUMO-GUI
static StringBijection< GUIGlObjectType >::Entry GUIGlObjectTypeNamesInitializer[]
vector for TypeNames Initializer
Definition: GUIGlObject.h:332
virtual void setMicrosimID(const std::string &newID)
Changes the microsimID of the object.
virtual std::string getParentName() const
Returns the name of the parent object (if any)
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
virtual void updateGLObject()
update GLObject (geometry, ID, etc.) (optional)
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void addParameterTable(GUIParameterTableWindow *w)
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
static StringBijection< GUIGlObjectType > TypeNames
associates object types with strings
Definition: GUIGlObject.h:71
void buildAdditionalsPopupOptions(GUIMainWindow &app, GUIGLObjectPopupMenu *ret, const std::string &type)
build basic additional popup options. Used to unify pop-ups menu in netedit and SUMO-GUI
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.h:156
virtual ~GUIGlObject()
Destructor.
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
Definition: GUIGlObject.h:143
void removeParameterTable(GUIParameterTableWindow *w)
Lets this object know a parameter window showing the object's values was closed.
virtual void drawGLAdditional(GUISUMOAbstractView *const parent, const GUIVisualizationSettings &s) const
Draws additional, user-triggered visualisations.
virtual bool isGLObjectLocked() const
check if element is locked (Currently used only in netedit)
virtual void selectGLObject()
select GLObject (Currently used only in netedit)
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
FXIcon * myIcon
icon associatd with this GL Object
Definition: GUIGlObject.h:315
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.h:104
std::string createFullName() const
create full name
std::set< GUIParameterTableWindow * > myParamWindows
Parameter table windows which refer to this object.
Definition: GUIGlObject.h:321
GUIGlObject(GUIGlObjectType type, const std::string &microsimID, FXIcon *icon)
Constructor.
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0, bool forceShow=false) const
draw name of item
A storage for of displayed objects via their numerical id.
void changeName(GUIGlObject *object, const std::string &fullName)
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
bool remove(GUIGlID id)
Removes the named object from this container.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
const std::map< std::string, std::string > & getOnlineMaps() const
FXFont * getBoldFont()
get bold front
A window containing a gl-object's parameter.
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
Stores the information about how to visualize structures.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
const std::string & getString(const T key) const
static std::string emptyString
An empty string.
Definition: StringUtils.h:86
bool show(const GUIGlObject *o) const
whether to show the text