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_INTERNAL
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), laneWidthExaggeration(1), 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  minPOISize(0), poiExaggeration(1),
70  poiName(false, 50, RGBColor(1., 0, .5)),
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("given vehicle/type/route color", RGBColor(1, 1, 0), "", true));
132  vehicleColorer.addScheme(GUIColorScheme("uniform", RGBColor(1, 1, 0), "", true));
133  vehicleColorer.addScheme(GUIColorScheme("given/assigned vehicle color", RGBColor(1, 1, 0), "", true));
134  vehicleColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor(1, 1, 0), "", true));
135  vehicleColorer.addScheme(GUIColorScheme("given/assigned route color", RGBColor(1, 1, 0), "", true));
136  vehicleColorer.addScheme(GUIColorScheme("depart position as HSV", RGBColor(1, 1, 0), "", true));
137  vehicleColorer.addScheme(GUIColorScheme("arrival position as HSV", RGBColor(1, 1, 0), "", true));
138  vehicleColorer.addScheme(GUIColorScheme("direction/distance as HSV", RGBColor(1, 1, 0), "", true));
139  scheme = GUIColorScheme("by speed", RGBColor(1, 0, 0));
140  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
141  vehicleColorer.addScheme(scheme);
142  scheme = GUIColorScheme("by waiting time", RGBColor(0, 0, 1));
143  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)(5 * 60));
144  vehicleColorer.addScheme(scheme);
145  scheme = GUIColorScheme("by time since last lanechange", RGBColor(1, 1, 1));
146  scheme.addColor(RGBColor(.5, .5, .5), (SUMOReal)(5 * 60));
147  vehicleColorer.addScheme(scheme);
148  scheme = GUIColorScheme("by max speed", RGBColor(1, 0, 0));
149  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
150  vehicleColorer.addScheme(scheme);
151  // ... emissions ...
152  scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor(0, 1, 0));
153  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)5.);
154  vehicleColorer.addScheme(scheme);
155  scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor(0, 1, 0));
156  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.05);
157  vehicleColorer.addScheme(scheme);
158  scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor(0, 1, 0));
159  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).005);
160  vehicleColorer.addScheme(scheme);
161  scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor(0, 1, 0));
162  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).125);
163  vehicleColorer.addScheme(scheme);
164  scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor(0, 1, 0));
165  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).02);
166  vehicleColorer.addScheme(scheme);
167  scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor(0, 1, 0));
168  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal).005);
169  vehicleColorer.addScheme(scheme);
170  scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor(0, 1, 0));
171  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)100.);
172  vehicleColorer.addScheme(scheme);
173  scheme = GUIColorScheme("by reroute number", RGBColor(1, 0, 0));
174  scheme.addColor(RGBColor(1, 1, 0), (SUMOReal)1.);
175  scheme.addColor(RGBColor(1, 1, 1), (SUMOReal)10.);
176  vehicleColorer.addScheme(scheme);
177 
178 
179 #ifdef HAVE_INTERNAL
180 
181  edgeColorer.addScheme(GUIColorScheme("uniform (streetwise)", RGBColor(0, 0, 0), "", true));
182  scheme = GUIColorScheme("by selection (streetwise)", RGBColor(0.7f, 0.7f, 0.7f), "unselected", true);
183  scheme.addColor(RGBColor(0, .4f, .8f), 1, "selected");
184  edgeColorer.addScheme(scheme);
185  scheme = GUIColorScheme("by purpose (streetwise)", RGBColor(0, 0, 0), "normal", true);
186  scheme.addColor(RGBColor(.5, 0, .5), 1, "connector"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_CONNECTOR
187  scheme.addColor(RGBColor(0, 0, 1), 2, "internal"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_INTERNAL
188  edgeColorer.addScheme(scheme);
189  scheme = GUIColorScheme("by allowed speed (streetwise)", RGBColor(1, 0, 0));
190  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
191  edgeColorer.addScheme(scheme);
192  scheme = GUIColorScheme("by current occupancy (streetwise)", RGBColor(0, 0, 1));
193  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)0.95);
194  edgeColorer.addScheme(scheme);
195  scheme = GUIColorScheme("by current speed (streetwise)", RGBColor(1, 0, 0));
196  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)(150.0 / 3.6));
197  edgeColorer.addScheme(scheme);
198  scheme = GUIColorScheme("by current flow (streetwise)", RGBColor(0, 0, 1));
199  scheme.addColor(RGBColor(1, 0, 0), (SUMOReal)5000);
200  edgeColorer.addScheme(scheme);
201  scheme = GUIColorScheme("by relative speed (streetwise)", RGBColor(1, 0, 0));
202  scheme.addColor(RGBColor(0, 0, 1), (SUMOReal)1);
203  edgeColorer.addScheme(scheme);
204 #endif
205 }
206 
207 
208 size_t
210 #ifdef HAVE_INTERNAL
211  if (UseMesoSim) {
212  return edgeColorer.getActive();
213  }
214 #endif
215  return laneColorer.getActive();
216 }
217 
218 
221 #ifdef HAVE_INTERNAL
222  if (UseMesoSim) {
223  return edgeColorer.getScheme();
224  }
225 #endif
226  return laneColorer.getScheme();
227 }
228 
229 
230 void
232  dev << "<viewsettings>\n";
233  dev << " <scheme name=\"" << name << "\">\n";
234  dev << " <opengl antialiase=\"" << antialiase << "\" dither=\"" << dither << "\"/>\n";
235  dev << " <background backgroundColor=\"" << backgroundColor << "\"\n"
236  << " showGrid=\"" << showGrid
237  << "\" gridXSize=\"" << gridXSize << "\" gridYSize=\"" << gridYSize << "\"/>\n";
238  dev << " <edges laneEdgeMode=\"" << getLaneEdgeMode()
239  << "\" laneShowBorders=\"" << laneShowBorders
240  << "\" showLinkDecals=\"" << showLinkDecals
241  << "\" showRails=\"" << showRails
242  << "\" hideConnectors=\"" << hideConnectors << "\"\n"
243  << " " << edgeName.print("edgeName") << "\n"
244  << " " << internalEdgeName.print("internalEdgeName") << "\n"
245  << " " << streetName.print("streetName") << ">\n";
246  laneColorer.save(dev);
247 #ifdef HAVE_INTERNAL
248  edgeColorer.save(dev);
249 #endif
250  dev << " </edges>\n";
251 
252  dev << " <vehicles vehicleMode=\"" << vehicleColorer.getActive()
253  << "\" vehicleQuality=\"" << vehicleQuality
254  << "\" minVehicleSize=\"" << minVehicleSize
255  << "\" vehicleExaggeration=\"" << vehicleExaggeration
256  << "\" showBlinker=\"" << showBlinker << "\"\n"
257  << " " << vehicleName.print("vehicleName")
258  << ">\n";
259  vehicleColorer.save(dev);
260  dev << " </vehicles>\n";
261 
262  dev << " <junctions junctionMode=\"" << junctionMode
263  << "\" drawLinkTLIndex=\"" << drawLinkTLIndex
264  << "\" drawLinkJunctionIndex=\"" << drawLinkJunctionIndex << "\"\n"
265  << " " << junctionName.print("junctionName") << "\n"
266  << " " << internalJunctionName.print("internalJunctionName") << "\n"
267  << " showLane2Lane=\"" << showLane2Lane << "\"/>\n";
268 
269  dev << " <additionals addMode=\"" << addMode
270  << "\" minAddSize=\"" << minAddSize
271  << "\" addExaggeration=\"" << addExaggeration << "\"\n"
272  << " " << addName.print("addName")
273  << "/>\n";
274 
275  dev << " <pois poiExaggeration=\"" << poiExaggeration
276  << "\" minPOISize=\"" << minPOISize << "\"\n"
277  << " " << poiName.print("poiName")
278  << "/>\n";
279 
280  dev << " <legend showSizeLegend=\"" << showSizeLegend << "\"/>\n";
281  dev << " </scheme>\n";
282  dev << "</viewsettings>\n";
283 }
284 
285 
286 bool
288  if (antialiase != v2.antialiase) {
289  return false;
290  }
291  if (dither != v2.dither) {
292  return false;
293  }
294  if (backgroundColor != v2.backgroundColor) {
295  return false;
296  }
298  return false;
299  }
300  if (showGrid != v2.showGrid) {
301  return false;
302  }
303  if (gridXSize != v2.gridXSize) {
304  return false;
305  }
306  if (gridYSize != v2.gridYSize) {
307  return false;
308  }
309 
310 #ifdef HAVE_INTERNAL
311  if (!(edgeColorer == v2.edgeColorer)) {
312  return false;
313  }
314 #endif
315  if (!(laneColorer == v2.laneColorer)) {
316  return false;
317  }
318  if (laneShowBorders != v2.laneShowBorders) {
319  return false;
320  }
321  if (showLinkDecals != v2.showLinkDecals) {
322  return false;
323  }
324  if (showRails != v2.showRails) {
325  return false;
326  }
327  if (edgeName != v2.edgeName) {
328  return false;
329  }
331  return false;
332  }
333  if (streetName != v2.streetName) {
334  return false;
335  }
336  if (hideConnectors != v2.hideConnectors) {
337  return false;
338  }
340  return false;
341  }
342  if (!(vehicleColorer == v2.vehicleColorer)) {
343  return false;
344  }
345  if (vehicleQuality != v2.vehicleQuality) {
346  return false;
347  }
348  if (minVehicleSize != v2.minVehicleSize) {
349  return false;
350  }
352  return false;
353  }
354  if (showBlinker != v2.showBlinker) {
355  return false;
356  }
358  return false;
359  }
360  if (drawMinGap != v2.drawMinGap) {
361  return false;
362  }
363  if (vehicleName != v2.vehicleName) {
364  return false;
365  }
366  if (junctionMode != v2.junctionMode) {
367  return false;
368  }
369  if (drawLinkTLIndex != v2.drawLinkTLIndex) {
370  return false;
371  }
373  return false;
374  }
375  if (junctionName != v2.junctionName) {
376  return false;
377  }
379  return false;
380  }
381 
382  if (showLane2Lane != v2.showLane2Lane) {
383  return false;
384  }
385 
386  if (addMode != v2.addMode) {
387  return false;
388  }
389  if (minAddSize != v2.minAddSize) {
390  return false;
391  }
392  if (addExaggeration != v2.addExaggeration) {
393  return false;
394  }
395  if (addName != v2.addName) {
396  return false;
397  }
398 
399  if (minPOISize != v2.minPOISize) {
400  return false;
401  }
402  if (poiExaggeration != v2.poiExaggeration) {
403  return false;
404  }
405  if (poiName != v2.poiName) {
406  return false;
407  }
408 
409  if (showSizeLegend != v2.showSizeLegend) {
410  return false;
411  }
412 
413  return true;
414 }
415 
416 
417 
418 /****************************************************************************/
419