SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GUIVisualizationSettings.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Stores the information about how to visualize structures
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
12 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <map>
34 #include <vector>
36 #include "GUIColorScheme.h"
37 
38 #ifdef CHECK_MEMORY_LEAKS
39 #include <foreign/nvwa/debug_new.h>
40 #endif // CHECK_MEMORY_LEAKS
41 
42 // ===========================================================================
43 // static members
44 // ===========================================================================
45 #ifdef HAVE_MESOSIM
46 bool GUIVisualizationSettings::UseMesoSim = false;
47 #endif
48 
49 // ===========================================================================
50 // member method definitions
51 // ===========================================================================
53  : name(""), antialiase(false), dither(false),
54  backgroundColor(RGBColor(1, 1, 1)),
55  showGrid(false), gridXSize(100), gridYSize(100),
56  laneShowBorders(false), showLinkDecals(true), showRails(true),
57  edgeName(false, 50, RGBColor(1, .5, 0)),
58  internalEdgeName(false, 40, RGBColor(.5, .25, 0)),
59  streetName(false, 55, RGBColor(1, 1, 0)),
60  hideConnectors(false), vehicleQuality(0),
61  minVehicleSize(1), vehicleExaggeration(1), showBlinker(true),
62  drawLaneChangePreference(false), drawMinGap(false),
63  vehicleName(false, 50, RGBColor(.8, .6, 0)),
64  junctionMode(0), drawLinkTLIndex(false), drawLinkJunctionIndex(false),
65  junctionName(false, 50, RGBColor(0, 1, .5)),
66  internalJunctionName(false, 50, RGBColor(0, .8, .5)),
67  showLane2Lane(false), addMode(0), minAddSize(1), addExaggeration(1),
68  addName(false, 50, RGBColor(1., 0, .5)),
69  poiName(false, 50, RGBColor(1., 0, .5)),
70  minPOISize(0), poiExaggeration(1),
71  showSizeLegend(true),
72  gaming(false),
73  selectionScale(1) {
75  GUIColorScheme scheme = GUIColorScheme("uniform", RGBColor(0, 0, 0), "", true);
76  laneColorer.addScheme(scheme);
77  scheme = GUIColorScheme("by selection (lane-/streetwise)", RGBColor(0.7f, 0.7f, 0.7f), "unselected", true);
78  scheme.addColor(RGBColor(0, .4f, .8f), 1, "selected");
79  laneColorer.addScheme(scheme);
80  scheme = GUIColorScheme("by vclass", RGBColor(0, 0, 0), "all", true);
81  scheme.addColor(RGBColor(0, .1f, .5f), 1, "public");
82  laneColorer.addScheme(scheme);
83  // ... traffic states ...
84  scheme = GUIColorScheme("by allowed speed (lanewise)", RGBColor(1, 0, 0));
85  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
86  laneColorer.addScheme(scheme);
87  scheme = GUIColorScheme("by current occupancy (lanewise)", RGBColor(0, 0, 1));
88  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.95);
89  laneColorer.addScheme(scheme);
90  scheme = GUIColorScheme("by first vehicle waiting time (lanewise)", RGBColor(0, 1, 0));
91  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)200);
92  laneColorer.addScheme(scheme);
93  scheme = GUIColorScheme("by lane number (streetwise)", RGBColor(1, 0, 0));
94  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)5);
95  laneColorer.addScheme(scheme);
96  // ... emissions ...
97  scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor(0, 1, 0));
98  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(10. / 7.5 / 5.));
99  laneColorer.addScheme(scheme);
100  scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor(0, 1, 0));
101  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(0.05 / 7.5 / 2.));
102  laneColorer.addScheme(scheme);
103  scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor(0, 1, 0));
104  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(.005 / 7.5 / 5.));
105  laneColorer.addScheme(scheme);
106  scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor(0, 1, 0));
107  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(.125 / 7.5 / 5.));
108  laneColorer.addScheme(scheme);
109  scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor(0, 1, 0));
110  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(.02 / 7.5 / 4.));
111  laneColorer.addScheme(scheme);
112  scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor(0, 1, 0));
113  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(.005 / 7.5 * 100.));
114  laneColorer.addScheme(scheme);
115  scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor(0, 1, 0));
116  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)100);
117  laneColorer.addScheme(scheme);
118  // ... weights (experimental) ...
119  scheme = GUIColorScheme("by global travel time", RGBColor(0, 1, 0));
120  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)100);
121  scheme.setAllowsNegativeValues(true);
122  laneColorer.addScheme(scheme);
123  scheme = GUIColorScheme("by global speed percentage", RGBColor(1, 0, 0));
124  scheme.addColor(RGBColor(1, 1, 0), (SUMOReal)50);
125  scheme.addColor(RGBColor(0, 1, 0), (SUMOReal)100);
126  scheme.setAllowsNegativeValues(true);
127  laneColorer.addScheme(scheme);
128 
129 
131  vehicleColorer.addScheme(GUIColorScheme("uniform", RGBColor(1, 1, 0), "", true));
132  vehicleColorer.addScheme(GUIColorScheme("given/assigned vehicle color", RGBColor(1, 1, 0), "", true));
133  vehicleColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor(1, 1, 0), "", true));
134  vehicleColorer.addScheme(GUIColorScheme("given/assigned route color", RGBColor(1, 1, 0), "", true));
135  vehicleColorer.addScheme(GUIColorScheme("depart position as HSV", RGBColor(1, 1, 0), "", true));
136  vehicleColorer.addScheme(GUIColorScheme("arrival position as HSV", RGBColor(1, 1, 0), "", true));
137  vehicleColorer.addScheme(GUIColorScheme("direction/distance as HSV", RGBColor(1, 1, 0), "", true));
138  scheme = GUIColorScheme("by speed", RGBColor(1, 0, 0));
139  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
140  vehicleColorer.addScheme(scheme);
141  scheme = GUIColorScheme("by waiting time", RGBColor(0, 0, 1));
142  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(5 * 60));
143  vehicleColorer.addScheme(scheme);
144  scheme = GUIColorScheme("by time since last lanechange", RGBColor(1, 1, 1));
145  scheme.addColor(RGBColor(.5, .5, .5), (SUMOReal)(5 * 60));
146  vehicleColorer.addScheme(scheme);
147  scheme = GUIColorScheme("by max speed", RGBColor(1, 0, 0));
148  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
149  vehicleColorer.addScheme(scheme);
150  // ... emissions ...
151  scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor(0, 1, 0));
152  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)5.);
153  vehicleColorer.addScheme(scheme);
154  scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor(0, 1, 0));
155  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.05);
156  vehicleColorer.addScheme(scheme);
157  scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor(0, 1, 0));
158  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).005);
159  vehicleColorer.addScheme(scheme);
160  scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor(0, 1, 0));
161  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).125);
162  vehicleColorer.addScheme(scheme);
163  scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor(0, 1, 0));
164  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).02);
165  vehicleColorer.addScheme(scheme);
166  scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor(0, 1, 0));
167  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).005);
168  vehicleColorer.addScheme(scheme);
169  scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor(0, 1, 0));
170  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)100.);
171  vehicleColorer.addScheme(scheme);
172  scheme = GUIColorScheme("by reroute number", RGBColor(1, 0, 0));
173  scheme.addColor(RGBColor(1, 1, 0), (SUMOReal)1.);
174  scheme.addColor(RGBColor(1, 1, 1), (SUMOReal)10.);
175  vehicleColorer.addScheme(scheme);
176 
177 
178 #ifdef HAVE_MESOSIM
179 
180  edgeColorer.addScheme(GUIColorScheme("uniform (streetwise)", RGBColor(0, 0, 0), "", true));
181  scheme = GUIColorScheme("by selection (streetwise)", RGBColor(0.7f, 0.7f, 0.7f), "unselected", true);
182  scheme.addColor(RGBColor(0, .4f, .8f), 1, "selected");
183  edgeColorer.addScheme(scheme);
184  scheme = GUIColorScheme("by purpose (streetwise)", RGBColor(0, 0, 0), "normal", true);
185  scheme.addColor(RGBColor(.5, 0, .5), 1, "connector"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_CONNECTOR
186  scheme.addColor(RGBColor(0, 0, 1), 2, "internal"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_INTERNAL
187  edgeColorer.addScheme(scheme);
188  scheme = GUIColorScheme("by allowed speed (streetwise)", RGBColor(1, 0, 0));
189  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
190  edgeColorer.addScheme(scheme);
191  scheme = GUIColorScheme("by current occupancy (streetwise)", RGBColor(0, 0, 1));
192  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.95);
193  edgeColorer.addScheme(scheme);
194  scheme = GUIColorScheme("by current speed (streetwise)", RGBColor(1, 0, 0));
195  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
196  edgeColorer.addScheme(scheme);
197  scheme = GUIColorScheme("by current flow (streetwise)", RGBColor(0, 0, 1));
198  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)5000);
199  edgeColorer.addScheme(scheme);
200  scheme = GUIColorScheme("by relative speed (streetwise)", RGBColor(1, 0, 0));
201  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)1);
202  edgeColorer.addScheme(scheme);
203 #endif
204 }
205 
206 
207 size_t
209 #ifdef HAVE_MESOSIM
210  if (UseMesoSim) {
211  return edgeColorer.getActive();
212  }
213 #endif
214  return laneColorer.getActive();
215 }
216 
217 
220 #ifdef HAVE_MESOSIM
221  if (UseMesoSim) {
222  return edgeColorer.getScheme();
223  }
224 #endif
225  return laneColorer.getScheme();
226 }
227 
228 
229 void
231  dev << "<viewsettings>\n";
232  dev << " <scheme name=\"" << name << "\">\n";
233  dev << " <opengl antialiase=\"" << antialiase << "\" dither=\"" << dither << "\"/>\n";
234  dev << " <background backgroundColor=\"" << backgroundColor << "\"\n"
235  << " showGrid=\"" << showGrid
236  << "\" gridXSize=\"" << gridXSize << "\" gridYSize=\"" << gridYSize << "\"/>\n";
237  dev << " <edges laneEdgeMode=\"" << getLaneEdgeMode()
238  << "\" laneShowBorders=\"" << laneShowBorders
239  << "\" showLinkDecals=\"" << showLinkDecals
240  << "\" showRails=\"" << showRails
241  << "\" hideConnectors=\"" << hideConnectors << "\"\n"
242  << " " << edgeName.print("edgeName") << "\n"
243  << " " << internalEdgeName.print("internalEdgeName") << "\n"
244  << " " << streetName.print("streetName") << ">\n";
245  laneColorer.save(dev);
246 #ifdef HAVE_MESOSIM
247  edgeColorer.save(dev);
248 #endif
249  dev << " </edges>\n";
250 
251  dev << " <vehicles vehicleMode=\"" << vehicleColorer.getActive()
252  << "\" vehicleQuality=\"" << vehicleQuality
253  << "\" minVehicleSize=\"" << minVehicleSize
254  << "\" vehicleExaggeration=\"" << vehicleExaggeration
255  << "\" showBlinker=\"" << showBlinker << "\"\n"
256  << " " << vehicleName.print("vehicleName")
257  << ">\n";
258  vehicleColorer.save(dev);
259  dev << " </vehicles>\n";
260 
261  dev << " <junctions junctionMode=\"" << junctionMode
262  << "\" drawLinkTLIndex=\"" << drawLinkTLIndex
263  << "\" drawLinkJunctionIndex=\"" << drawLinkJunctionIndex << "\"\n"
264  << " " << junctionName.print("junctionName") << "\n"
265  << " " << internalJunctionName.print("internalJunctionName") << "\n"
266  << " showLane2Lane=\"" << showLane2Lane << "\"/>\n";
267 
268  dev << " <additionals addMode=\"" << addMode
269  << "\" minAddSize=\"" << minAddSize
270  << "\" addExaggeration=\"" << addExaggeration << "\"\n"
271  << " " << addName.print("addName")
272  << "/>\n";
273 
274  dev << " <pois poiExaggeration=\"" << poiExaggeration
275  << "\" minPOISize=\"" << minPOISize << "\"\n"
276  << " " << poiName.print("poiName")
277  << "/>\n";
278 
279  dev << " <legend showSizeLegend=\"" << showSizeLegend << "\"/>\n";
280  dev << " </scheme>\n";
281  dev << "</viewsettings>\n";
282 }
283 
284 
285 bool
287  if (antialiase != v2.antialiase) {
288  return false;
289  }
290  if (dither != v2.dither) {
291  return false;
292  }
293  if (backgroundColor != v2.backgroundColor) {
294  return false;
295  }
297  return false;
298  }
299  if (showGrid != v2.showGrid) {
300  return false;
301  }
302  if (gridXSize != v2.gridXSize) {
303  return false;
304  }
305  if (gridYSize != v2.gridYSize) {
306  return false;
307  }
308 
309 #ifdef HAVE_MESOSIM
310  if (!(edgeColorer == v2.edgeColorer)) {
311  return false;
312  }
313 #endif
314  if (!(laneColorer == v2.laneColorer)) {
315  return false;
316  }
317  if (laneShowBorders != v2.laneShowBorders) {
318  return false;
319  }
320  if (showLinkDecals != v2.showLinkDecals) {
321  return false;
322  }
323  if (showRails != v2.showRails) {
324  return false;
325  }
326  if (edgeName != v2.edgeName) {
327  return false;
328  }
330  return false;
331  }
332  if (streetName != v2.streetName) {
333  return false;
334  }
335  if (hideConnectors != v2.hideConnectors) {
336  return false;
337  }
338 
339  if (!(vehicleColorer == v2.vehicleColorer)) {
340  return false;
341  }
342  if (vehicleQuality != v2.vehicleQuality) {
343  return false;
344  }
345  if (minVehicleSize != v2.minVehicleSize) {
346  return false;
347  }
349  return false;
350  }
351  if (showBlinker != v2.showBlinker) {
352  return false;
353  }
355  return false;
356  }
357  if (drawMinGap != v2.drawMinGap) {
358  return false;
359  }
360  if (vehicleName != v2.vehicleName) {
361  return false;
362  }
363  if (junctionMode != v2.junctionMode) {
364  return false;
365  }
366  if (drawLinkTLIndex != v2.drawLinkTLIndex) {
367  return false;
368  }
370  return false;
371  }
372  if (junctionName != v2.junctionName) {
373  return false;
374  }
376  return false;
377  }
378 
379  if (showLane2Lane != v2.showLane2Lane) {
380  return false;
381  }
382 
383  if (addMode != v2.addMode) {
384  return false;
385  }
386  if (minAddSize != v2.minAddSize) {
387  return false;
388  }
389  if (addExaggeration != v2.addExaggeration) {
390  return false;
391  }
392  if (addName != v2.addName) {
393  return false;
394  }
395 
396  if (minPOISize != v2.minPOISize) {
397  return false;
398  }
399  if (poiExaggeration != v2.poiExaggeration) {
400  return false;
401  }
402  if (poiName != v2.poiName) {
403  return false;
404  }
405 
406  if (showSizeLegend != v2.showSizeLegend) {
407  return false;
408  }
409 
410  return true;
411 }
412 
413 
414 
415 /****************************************************************************/
416