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-sim.org/
12 // Copyright (C) 2001-2013 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::WHITE),
55  showGrid(false), gridXSize(100), gridYSize(100),
56  laneShowBorders(false), showLinkDecals(true), showRails(true),
57  edgeName(false, 50, RGBColor(255, 128, 0, 255)),
58  internalEdgeName(false, 40, RGBColor(128, 64, 0, 255)),
59  streetName(false, 55, RGBColor::YELLOW),
60  hideConnectors(false), laneWidthExaggeration(1),
61  vehicleQuality(0), minVehicleSize(1), vehicleExaggeration(1), showBlinker(true),
62  drawLaneChangePreference(false), drawMinGap(false),
63  vehicleName(false, 50, RGBColor(204, 153, 0, 255)),
64  personQuality(0), minPersonSize(1), personExaggeration(1),
65  personName(false, 50, RGBColor(0, 153, 204, 255)),
66  drawLinkTLIndex(false), drawLinkJunctionIndex(false),
67  junctionName(false, 50, RGBColor(0, 255, 128, 255)),
68  internalJunctionName(false, 50, RGBColor(0, 204, 128, 255)),
69  showLane2Lane(false), addMode(0), minAddSize(1), addExaggeration(1),
70  addName(false, 50, RGBColor(255, 0, 128, 255)),
71  minPOISize(0), poiExaggeration(1), poiName(false, 50, RGBColor(255, 0, 128, 255)),
72  minPolySize(0), polyExaggeration(1), polyName(false, 50, RGBColor(255, 0, 128, 255)),
73  showSizeLegend(true),
74  gaming(false),
75  selectionScale(1) {
77  GUIColorScheme scheme = GUIColorScheme("uniform", RGBColor::BLACK, "", true);
78  laneColorer.addScheme(scheme);
79  scheme = GUIColorScheme("by selection (lane-/streetwise)", RGBColor(179, 179, 179, 255), "unselected", true);
80  scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
81  laneColorer.addScheme(scheme);
82  scheme = GUIColorScheme("by vclass", RGBColor::BLACK, "all", true);
83  scheme.addColor(RGBColor(0, 26, 128, 255), 1, "public");
84  laneColorer.addScheme(scheme);
85  // ... traffic states ...
86  scheme = GUIColorScheme("by allowed speed (lanewise)", RGBColor::RED);
87  scheme.addColor(RGBColor::BLUE, (SUMOReal)(150.0 / 3.6));
88  laneColorer.addScheme(scheme);
89  scheme = GUIColorScheme("by current occupancy (lanewise, brutto)", RGBColor::BLUE);
90  scheme.addColor(RGBColor::RED, (SUMOReal)0.95);
91  laneColorer.addScheme(scheme);
92  scheme = GUIColorScheme("by current occupancy (lanewise, netto)", RGBColor::BLUE);
93  scheme.addColor(RGBColor::RED, (SUMOReal)0.95);
94  laneColorer.addScheme(scheme);
95  scheme = GUIColorScheme("by first vehicle waiting time (lanewise)", RGBColor::BLUE);
96  scheme.addColor(RGBColor::CYAN, (SUMOReal)30);
97  scheme.addColor(RGBColor::GREEN, (SUMOReal)100);
98  scheme.addColor(RGBColor::YELLOW, (SUMOReal)200);
99  scheme.addColor(RGBColor::RED, (SUMOReal)300);
100  laneColorer.addScheme(scheme);
101  scheme = GUIColorScheme("by lane number (streetwise)", RGBColor::RED);
102  scheme.addColor(RGBColor::BLUE, (SUMOReal)5);
103  laneColorer.addScheme(scheme);
104  // ... emissions ...
105  scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor::GREEN);
106  scheme.addColor(RGBColor::RED, (SUMOReal)(10. / 7.5 / 5.));
107  laneColorer.addScheme(scheme);
108  scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor::GREEN);
109  scheme.addColor(RGBColor::RED, (SUMOReal)(0.05 / 7.5 / 2.));
110  laneColorer.addScheme(scheme);
111  scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor::GREEN);
112  scheme.addColor(RGBColor::RED, (SUMOReal)(.005 / 7.5 / 5.));
113  laneColorer.addScheme(scheme);
114  scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor::GREEN);
115  scheme.addColor(RGBColor::RED, (SUMOReal)(.125 / 7.5 / 5.));
116  laneColorer.addScheme(scheme);
117  scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor::GREEN);
118  scheme.addColor(RGBColor::RED, (SUMOReal)(.02 / 7.5 / 4.));
119  laneColorer.addScheme(scheme);
120  scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor::GREEN);
121  scheme.addColor(RGBColor::RED, (SUMOReal)(.005 / 7.5 * 100.));
122  laneColorer.addScheme(scheme);
123  scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor::GREEN);
124  scheme.addColor(RGBColor::RED, (SUMOReal)100);
125  laneColorer.addScheme(scheme);
126  // ... weights (experimental) ...
127  scheme = GUIColorScheme("by global travel time", RGBColor::GREEN);
128  scheme.addColor(RGBColor::RED, (SUMOReal)100);
129  scheme.setAllowsNegativeValues(true);
130  laneColorer.addScheme(scheme);
131  scheme = GUIColorScheme("by global speed percentage", RGBColor::RED);
132  scheme.addColor(RGBColor::YELLOW, (SUMOReal)50);
133  scheme.addColor(RGBColor::GREEN, (SUMOReal)100);
134  scheme.setAllowsNegativeValues(true);
135  laneColorer.addScheme(scheme);
136  scheme = GUIColorScheme("by given length/geometrical length", RGBColor::BLACK);
137  scheme.addColor(RGBColor::RED, (SUMOReal)0.25);
138  scheme.addColor(RGBColor::YELLOW, (SUMOReal)0.5);
139  scheme.addColor(RGBColor(179, 179, 179, 255), (SUMOReal)1.0);
140  scheme.addColor(RGBColor::GREEN, (SUMOReal)2.0);
141  scheme.addColor(RGBColor::BLUE, (SUMOReal)4.0);
142  laneColorer.addScheme(scheme);
143 
144 
146  vehicleColorer.addScheme(GUIColorScheme("given vehicle/type/route color", RGBColor::YELLOW, "", true));
148  vehicleColorer.addScheme(GUIColorScheme("given/assigned vehicle color", RGBColor::YELLOW, "", true));
149  vehicleColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor::YELLOW, "", true));
150  vehicleColorer.addScheme(GUIColorScheme("given/assigned route color", RGBColor::YELLOW, "", true));
151  vehicleColorer.addScheme(GUIColorScheme("depart position as HSV", RGBColor::YELLOW, "", true));
152  vehicleColorer.addScheme(GUIColorScheme("arrival position as HSV", RGBColor::YELLOW, "", true));
153  vehicleColorer.addScheme(GUIColorScheme("direction/distance as HSV", RGBColor::YELLOW, "", true));
154  scheme = GUIColorScheme("by speed", RGBColor::RED);
155  scheme.addColor(RGBColor::YELLOW, (SUMOReal)(30 / 3.6));
156  scheme.addColor(RGBColor::GREEN, (SUMOReal)(55 / 3.6));
157  scheme.addColor(RGBColor::CYAN, (SUMOReal)(80 / 3.6));
158  scheme.addColor(RGBColor::BLUE, (SUMOReal)(120 / 3.6));
159  scheme.addColor(RGBColor::BLACK, (SUMOReal)(150 / 3.6));
160  vehicleColorer.addScheme(scheme);
161  scheme = GUIColorScheme("by waiting time", RGBColor::BLUE);
162  scheme.addColor(RGBColor::CYAN, (SUMOReal)30);
163  scheme.addColor(RGBColor::GREEN, (SUMOReal)100);
164  scheme.addColor(RGBColor::YELLOW, (SUMOReal)200);
165  scheme.addColor(RGBColor::RED, (SUMOReal)300);
166  vehicleColorer.addScheme(scheme);
167  scheme = GUIColorScheme("by time since last lanechange", RGBColor::WHITE);
168  scheme.addColor(RGBColor::GREY, (SUMOReal)(5 * 60));
169  vehicleColorer.addScheme(scheme);
170  scheme = GUIColorScheme("by max speed", RGBColor::RED);
171  scheme.addColor(RGBColor::BLUE, (SUMOReal)(150.0 / 3.6));
172  vehicleColorer.addScheme(scheme);
173  // ... emissions ...
174  scheme = GUIColorScheme("by CO2 emissions (HBEFA)", RGBColor::GREEN);
175  scheme.addColor(RGBColor::RED, (SUMOReal)5.);
176  vehicleColorer.addScheme(scheme);
177  scheme = GUIColorScheme("by CO emissions (HBEFA)", RGBColor::GREEN);
178  scheme.addColor(RGBColor::RED, (SUMOReal)0.05);
179  vehicleColorer.addScheme(scheme);
180  scheme = GUIColorScheme("by PMx emissions (HBEFA)", RGBColor::GREEN);
181  scheme.addColor(RGBColor::RED, (SUMOReal).005);
182  vehicleColorer.addScheme(scheme);
183  scheme = GUIColorScheme("by NOx emissions (HBEFA)", RGBColor::GREEN);
184  scheme.addColor(RGBColor::RED, (SUMOReal).125);
185  vehicleColorer.addScheme(scheme);
186  scheme = GUIColorScheme("by HC emissions (HBEFA)", RGBColor::GREEN);
187  scheme.addColor(RGBColor::RED, (SUMOReal).02);
188  vehicleColorer.addScheme(scheme);
189  scheme = GUIColorScheme("by fuel consumption (HBEFA)", RGBColor::GREEN);
190  scheme.addColor(RGBColor::RED, (SUMOReal).005);
191  vehicleColorer.addScheme(scheme);
192  scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor::GREEN);
193  scheme.addColor(RGBColor::RED, (SUMOReal)100.);
194  vehicleColorer.addScheme(scheme);
195  scheme = GUIColorScheme("by reroute number", RGBColor::RED);
196  scheme.addColor(RGBColor::YELLOW, (SUMOReal)1.);
197  scheme.addColor(RGBColor::WHITE, (SUMOReal)10.);
198  vehicleColorer.addScheme(scheme);
199  scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true);
200  scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
201  vehicleColorer.addScheme(scheme);
202  scheme = GUIColorScheme("by offset from best lane", RGBColor(179, 179, 179, 255), "0");
203  scheme.addColor(RGBColor(255, 0, 0, 255), -3, "-3");
204  scheme.addColor(RGBColor(255, 255, 0, 255), -1, "-1");
205  scheme.addColor(RGBColor(0, 255, 255, 255), 1, "1");
206  scheme.addColor(RGBColor(0, 0, 255, 255), 3, "3");
207  vehicleColorer.addScheme(scheme);
208  scheme = GUIColorScheme("by acceleration", RGBColor(179, 179, 179, 255), "0");
209  scheme.addColor(RGBColor(255, 0, 0, 255), -DEFAULT_VEH_DECEL);
210  scheme.addColor(RGBColor(255, 255, 0, 255), -0.1);
211  scheme.addColor(RGBColor(0, 255, 255, 255), 0.1);
212  scheme.addColor(RGBColor(0, 0, 255, 255), DEFAULT_VEH_ACCEL);
213  vehicleColorer.addScheme(scheme);
214 
216  personColorer.addScheme(GUIColorScheme("given person/type color", RGBColor::YELLOW, "", true));
218  personColorer.addScheme(GUIColorScheme("given/assigned person color", RGBColor::YELLOW, "", true));
219  personColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor::YELLOW, "", true));
220  scheme = GUIColorScheme("by mode", RGBColor::YELLOW); // walking
221  scheme.addColor(RGBColor::BLUE, (SUMOReal)(1)); // riding
222  scheme.addColor(RGBColor::RED, (SUMOReal)(2)); // stopped
223  scheme.addColor(RGBColor::GREEN, (SUMOReal)(3)); // waiting for ride
224  personColorer.addScheme(scheme);
225  scheme = GUIColorScheme("by waiting time", RGBColor::BLUE);
226  scheme.addColor(RGBColor::RED, (SUMOReal)(5 * 60));
227  personColorer.addScheme(scheme);
228 
229 
230 #ifdef HAVE_INTERNAL
231 
232  edgeColorer.addScheme(GUIColorScheme("uniform (streetwise)", RGBColor::BLACK, "", true));
233  scheme = GUIColorScheme("by selection (streetwise)", RGBColor(179, 179, 179, 255), "unselected", true);
234  scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
235  edgeColorer.addScheme(scheme);
236  scheme = GUIColorScheme("by purpose (streetwise)", RGBColor(), "normal", true);
237  scheme.addColor(RGBColor(128, 0, 128, 255), 1, "connector"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_CONNECTOR
238  scheme.addColor(RGBColor::BLUE, 2, "internal"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_INTERNAL
239  edgeColorer.addScheme(scheme);
240  scheme = GUIColorScheme("by allowed speed (streetwise)", RGBColor::RED);
241  scheme.addColor(RGBColor::BLUE, (SUMOReal)(150.0 / 3.6));
242  edgeColorer.addScheme(scheme);
243  scheme = GUIColorScheme("by current occupancy (streetwise)", RGBColor::BLUE);
244  scheme.addColor(RGBColor::RED, (SUMOReal)0.95);
245  edgeColorer.addScheme(scheme);
246  scheme = GUIColorScheme("by current speed (streetwise)", RGBColor::RED);
247  scheme.addColor(RGBColor::BLUE, (SUMOReal)(150.0 / 3.6));
248  edgeColorer.addScheme(scheme);
249  scheme = GUIColorScheme("by current flow (streetwise)", RGBColor::BLUE);
250  scheme.addColor(RGBColor::RED, (SUMOReal)5000);
251  edgeColorer.addScheme(scheme);
252  scheme = GUIColorScheme("by relative speed (streetwise)", RGBColor::RED);
253  scheme.addColor(RGBColor::BLUE, (SUMOReal)1);
254  edgeColorer.addScheme(scheme);
255 #endif
256 
258  scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true);
259  scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
260  junctionColorer.addScheme(scheme);
261 }
262 
263 
264 size_t
266 #ifdef HAVE_INTERNAL
267  if (UseMesoSim) {
268  return edgeColorer.getActive();
269  }
270 #endif
271  return laneColorer.getActive();
272 }
273 
274 
277 #ifdef HAVE_INTERNAL
278  if (UseMesoSim) {
279  return edgeColorer.getScheme();
280  }
281 #endif
282  return laneColorer.getScheme();
283 }
284 
285 
286 void
288  dev << "<viewsettings>\n";
289  dev << " <scheme name=\"" << name << "\">\n";
290  dev << " <opengl antialiase=\"" << antialiase << "\" dither=\"" << dither << "\"/>\n";
291  dev << " <background backgroundColor=\"" << backgroundColor << "\"\n"
292  << " showGrid=\"" << showGrid
293  << "\" gridXSize=\"" << gridXSize << "\" gridYSize=\"" << gridYSize << "\"/>\n";
294  dev << " <edges laneEdgeMode=\"" << getLaneEdgeMode()
295  << "\" laneShowBorders=\"" << laneShowBorders
296  << "\" showLinkDecals=\"" << showLinkDecals
297  << "\" showRails=\"" << showRails
298  << "\" hideConnectors=\"" << hideConnectors << "\"\n"
299  << " " << edgeName.print("edgeName") << "\n"
300  << " " << internalEdgeName.print("internalEdgeName") << "\n"
301  << " " << streetName.print("streetName") << ">\n";
302  laneColorer.save(dev);
303 #ifdef HAVE_INTERNAL
304  edgeColorer.save(dev);
305 #endif
306  dev << " </edges>\n";
307 
308  dev << " <vehicles vehicleMode=\"" << vehicleColorer.getActive()
309  << "\" vehicleQuality=\"" << vehicleQuality
310  << "\" minVehicleSize=\"" << minVehicleSize
311  << "\" vehicleExaggeration=\"" << vehicleExaggeration
312  << "\" showBlinker=\"" << showBlinker << "\"\n"
313  << " " << vehicleName.print("vehicleName")
314  << ">\n";
315  vehicleColorer.save(dev);
316  dev << " </vehicles>\n";
317  dev << " <persons personMode=\"" << personColorer.getActive()
318  << "\" personQuality=\"" << personQuality
319  << "\" minPersonSize=\"" << minPersonSize
320  << "\" personExaggeration=\"" << personExaggeration
321  << "\" " << personName.print("personName")
322  << ">\n";
323  personColorer.save(dev);
324  dev << " </persons>\n";
325 
326  dev << " <junctions junctionMode=\"" << junctionColorer.getActive()
327  << "\" drawLinkTLIndex=\"" << drawLinkTLIndex
328  << "\" drawLinkJunctionIndex=\"" << drawLinkJunctionIndex << "\"\n"
329  << " " << junctionName.print("junctionName") << "\n"
330  << " " << internalJunctionName.print("internalJunctionName") << "\n"
331  << " showLane2Lane=\"" << showLane2Lane << "\">\n";
332  junctionColorer.save(dev);
333  dev << " </junctions>\n";
334 
335  dev << " <additionals addMode=\"" << addMode
336  << "\" minAddSize=\"" << minAddSize
337  << "\" addExaggeration=\"" << addExaggeration << "\"\n"
338  << " " << addName.print("addName")
339  << "/>\n";
340 
341  dev << " <pois poiExaggeration=\"" << poiExaggeration
342  << "\" minPOISize=\"" << minPOISize << "\"\n"
343  << " " << poiName.print("poiName")
344  << "/>\n";
345 
346  dev << " <polys polyExaggeration=\"" << polyExaggeration
347  << "\" minPolySize=\"" << minPolySize << "\"\n"
348  << " " << polyName.print("polyName")
349  << "/>\n";
350 
351  dev << " <legend showSizeLegend=\"" << showSizeLegend << "\"/>\n";
352  dev << " </scheme>\n";
353  dev << "</viewsettings>\n";
354 }
355 
356 
357 bool
359  if (antialiase != v2.antialiase) {
360  return false;
361  }
362  if (dither != v2.dither) {
363  return false;
364  }
365  if (backgroundColor != v2.backgroundColor) {
366  return false;
367  }
368  if (showGrid != v2.showGrid) {
369  return false;
370  }
371  if (gridXSize != v2.gridXSize) {
372  return false;
373  }
374  if (gridYSize != v2.gridYSize) {
375  return false;
376  }
377 
378 #ifdef HAVE_INTERNAL
379  if (!(edgeColorer == v2.edgeColorer)) {
380  return false;
381  }
382 #endif
383  if (!(laneColorer == v2.laneColorer)) {
384  return false;
385  }
386  if (laneShowBorders != v2.laneShowBorders) {
387  return false;
388  }
389  if (showLinkDecals != v2.showLinkDecals) {
390  return false;
391  }
392  if (showRails != v2.showRails) {
393  return false;
394  }
395  if (edgeName != v2.edgeName) {
396  return false;
397  }
399  return false;
400  }
401  if (streetName != v2.streetName) {
402  return false;
403  }
404  if (hideConnectors != v2.hideConnectors) {
405  return false;
406  }
408  return false;
409  }
410  if (!(vehicleColorer == v2.vehicleColorer)) {
411  return false;
412  }
413  if (vehicleQuality != v2.vehicleQuality) {
414  return false;
415  }
416  if (minVehicleSize != v2.minVehicleSize) {
417  return false;
418  }
420  return false;
421  }
422  if (showBlinker != v2.showBlinker) {
423  return false;
424  }
426  return false;
427  }
428  if (drawMinGap != v2.drawMinGap) {
429  return false;
430  }
431  if (vehicleName != v2.vehicleName) {
432  return false;
433  }
434  if (!(personColorer == v2.personColorer)) {
435  return false;
436  }
437  if (personQuality != v2.personQuality) {
438  return false;
439  }
440  if (minPersonSize != v2.minPersonSize) {
441  return false;
442  }
444  return false;
445  }
446  if (personName != v2.personName) {
447  return false;
448  }
449  if (!(junctionColorer == v2.junctionColorer)) {
450  return false;
451  }
452  if (drawLinkTLIndex != v2.drawLinkTLIndex) {
453  return false;
454  }
456  return false;
457  }
458  if (junctionName != v2.junctionName) {
459  return false;
460  }
462  return false;
463  }
464 
465  if (showLane2Lane != v2.showLane2Lane) {
466  return false;
467  }
468 
469  if (addMode != v2.addMode) {
470  return false;
471  }
472  if (minAddSize != v2.minAddSize) {
473  return false;
474  }
475  if (addExaggeration != v2.addExaggeration) {
476  return false;
477  }
478  if (addName != v2.addName) {
479  return false;
480  }
481 
482  if (minPOISize != v2.minPOISize) {
483  return false;
484  }
485  if (poiExaggeration != v2.poiExaggeration) {
486  return false;
487  }
488  if (poiName != v2.poiName) {
489  return false;
490  }
491 
492  if (minPolySize != v2.minPolySize) {
493  return false;
494  }
496  return false;
497  }
498  if (polyName != v2.polyName) {
499  return false;
500  }
501 
502  if (showSizeLegend != v2.showSizeLegend) {
503  return false;
504  }
505 
506  return true;
507 }
508 
509 
510 
511 /****************************************************************************/
512