1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file    GUIVisualizationSettings.cpp
11 /// @author  Daniel Krajzewicz
12 /// @author  Jakob Erdmann
13 /// @author  Michael Behrisch
14 /// @date    Sept 2002
15 /// @version $Id$
16 ///
17 // Stores the information about how to visualize structures
18 /****************************************************************************/
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <map>
27 #include <vector>
28 #include <utils/gui/div/GUIGlobalSelection.h>
29 #include "GUIVisualizationSettings.h"
30 #include "GUIPropertyScheme.h"
31 
32 // ===========================================================================
33 // static members
34 // ===========================================================================
35 bool GUIVisualizationSettings::UseMesoSim = false;
36 
37 /* -------------------------------------------------------------------------
38  * color constants for link states
39  * ----------------------------------------------------------------------- */
40 const RGBColor SUMO_color_TL_GREEN_MAJOR(0, 255, 0);
41 const RGBColor SUMO_color_TL_GREEN_MINOR(0, 179, 0);
42 const RGBColor SUMO_color_TL_RED(255, 0, 0);
43 const RGBColor SUMO_color_TL_REDYELLOW(255, 128, 0);
44 const RGBColor SUMO_color_TL_YELLOW_MAJOR(255, 255, 0);
45 const RGBColor SUMO_color_TL_YELLOW_MINOR(255, 255, 0);
46 const RGBColor SUMO_color_TL_OFF_BLINKING(128, 64, 0);
47 const RGBColor SUMO_color_TL_OFF_NOSIGNAL(0, 255, 255);
48 const RGBColor SUMO_color_MAJOR(255, 255, 255);
49 const RGBColor SUMO_color_MINOR(51, 51, 51);
50 const RGBColor SUMO_color_EQUAL(128, 128, 128);
51 const RGBColor SUMO_color_STOP(128, 0, 128);
52 const RGBColor SUMO_color_ALLWAY_STOP(0, 0, 192);
53 const RGBColor SUMO_color_ZIPPER(192, 128, 64);
54 const RGBColor SUMO_color_DEADEND(0, 0, 0);
55 
56 // -------------------------------------------------------------------------
57 // color constants for other objects
58 // -------------------------------------------------------------------------
59 
60 const RGBColor GUIVisualizationSettings::SUMO_color_busStop(76, 170, 50);
61 const RGBColor GUIVisualizationSettings::SUMO_color_busStop_sign(255, 235, 0);
62 const RGBColor GUIVisualizationSettings::SUMO_color_containerStop(83, 89, 172);
63 const RGBColor GUIVisualizationSettings::SUMO_color_containerStop_sign(177, 184, 186, 171);
64 const RGBColor GUIVisualizationSettings::SUMO_color_chargingStation(114, 210, 252);
65 const RGBColor GUIVisualizationSettings::SUMO_color_chargingStation_sign(255, 235, 0);
66 const RGBColor GUIVisualizationSettings::SUMO_color_chargingStation_charge(255, 180, 0);
67 const RGBColor GUIVisualizationSettings::SUMO_color_E1(255, 255, 0);
68 const RGBColor GUIVisualizationSettings::SUMO_color_E1Instant(255, 0, 255);
69 const RGBColor GUIVisualizationSettings::SUMO_color_E2(0, 204, 204);
70 const RGBColor GUIVisualizationSettings::SUMO_color_E3Entry(0, 92, 64);
71 const RGBColor GUIVisualizationSettings::SUMO_color_E3Exit(92, 0, 0);
72 const RGBColor GUIVisualizationSettings::SUMO_color_stops(220, 20, 30);
73 
74 const std::string GUIVisualizationSettings::SCHEME_NAME_EDGE_PARAM_NUMERICAL("by param (numerical, streetwise)");
75 const std::string GUIVisualizationSettings::SCHEME_NAME_LANE_PARAM_NUMERICAL("by param (numerical, lanewise)");
76 const std::string GUIVisualizationSettings::SCHEME_NAME_EDGEDATA_NUMERICAL("by edgeData (numerical, streetwise)");
77 
78 // color constants for scheme background
79 #define COL_SCHEME_EMISSION RGBColor(255,255,210)
80 #define COL_SCHEME_MISC     RGBColor(210,220,255)
81 #define COL_SCHEME_STATIC   RGBColor(230,230,230)
82 #define COL_SCHEME_DYNAMIC  RGBColor(220,255,220)
83 
84 // ===========================================================================
85 // member method definitions
86 // ===========================================================================
GUIVisualizationSettings(bool _netedit)87 GUIVisualizationSettings::GUIVisualizationSettings(bool _netedit) :
88     name(""),
89     netedit(_netedit),
90     angle(0),
91     dither(false),
92     fps(false),
93     backgroundColor(RGBColor::WHITE),
94     showGrid(false), gridXSize(100), gridYSize(100),
95     laneShowBorders(false), showBikeMarkings(true), showLinkDecals(true),
96     showLinkRules(true), showRails(true),
97     edgeName(false, 60, RGBColor(255, 128, 0, 255)),
98     internalEdgeName(false, 45, RGBColor(128, 64, 0, 255)),
99     cwaEdgeName(false, 60, RGBColor::MAGENTA),
100     streetName(false, 60, RGBColor::YELLOW),
101     edgeValue(false, 100, RGBColor::CYAN),
102     hideConnectors(false),
103     laneWidthExaggeration(1),
104     laneMinSize(0),
105     showLaneDirection(false),
106     showSublanes(true),
107     spreadSuperposed(false),
108     edgeParam("EDGE_KEY"),
109     laneParam("LANE_KEY"),
110     edgeData("speed"),
111     vehicleQuality(0), showBlinker(true),
112     drawLaneChangePreference(false), drawMinGap(false),
113     showBTRange(false), vehicleSize(1),
114     vehicleName(false, 60, RGBColor(204, 153, 0, 255)),
115     vehicleValue(false, 80, RGBColor::CYAN),
116     personQuality(0),
117     personSize(1),
118     personName(false, 60, RGBColor(0, 153, 204, 255)),
119     personValue(false, 80, RGBColor::CYAN),
120     containerQuality(0),
121     containerSize(1),
122     containerName(false, 60, RGBColor(0, 153, 204, 255)),
123     drawLinkTLIndex(false, 50, RGBColor(128, 128, 255, 255)),
124     drawLinkJunctionIndex(false, 50, RGBColor(128, 128, 255, 255)),
125     junctionName(false, 60, RGBColor(0, 255, 128, 255)),
126     internalJunctionName(false, 50, RGBColor(0, 204, 128, 255)),
127     tlsPhaseIndex(false, 150, RGBColor(255, 255, 0, 255)),
128     showLane2Lane(false),
129     drawJunctionShape(true),
130     drawCrossingsAndWalkingareas(true),
131     junctionSize(1),
132     addMode(0),
133     addSize(1),
134     addName(false, 60, RGBColor(255, 0, 128, 255)),
135     addFullName(false, 60, RGBColor(255, 0, 128, 255)),
136     poiSize(0), poiName(false, 50, RGBColor(255, 0, 128, 255)),
137     poiType(false, 60, RGBColor(255, 0, 128, 255)),
138     polySize(0), polyName(false, 50, RGBColor(255, 0, 128, 255)),
139     polyType(false, 60, RGBColor(255, 0, 128, 255)),
140     showSizeLegend(true),
141     gaming(false),
142     selectionColor(0, 0, 204, 255),
143     selectedEdgeColor(0, 0, 204, 255),
144     selectedLaneColor(0, 0, 128, 255),
145     selectedConnectionColor(0, 0, 100, 255),
146     selectedAdditionalColor(0, 0, 150, 255),
147     selectionScale(1.),
148     drawForSelecting(false) {
149 
150     if (netedit) {
151         initNeteditDefaults();
152     } else {
153         initSumoGuiDefaults();
154     }
155 }
156 
157 
158 void
initSumoGuiDefaults()159 GUIVisualizationSettings::initSumoGuiDefaults() {
160     /// add lane coloring schemes
161     GUIColorScheme scheme = GUIColorScheme("uniform", RGBColor::BLACK, "road", true, 0);
162     scheme.addColor(RGBColor::GREY, 1, "sidewalk");
163     scheme.addColor(RGBColor(192, 66, 44), 2, "bike lane");
164     scheme.addColor(RGBColor(0, 0, 0, 0), 3, "green verge");
165     scheme.addColor(RGBColor(150, 200, 200), 4, "waterway");
166     scheme.addColor(RGBColor::BLACK, 5, "railway");
167     scheme.addColor(RGBColor(92, 92, 92), 6, "no passenger"); // paths, service roads etc
168     scheme.addColor(RGBColor::RED, 7, "closed"); // road closing
169     scheme.addColor(RGBColor::GREEN, 8, "connector"); // macro-connector
170     laneColorer.addScheme(scheme);
171     scheme = GUIColorScheme("by selection (lane-/streetwise)", RGBColor(128, 128, 128, 255), "unselected", true, 0, COL_SCHEME_MISC);
172     scheme.addColor(RGBColor(0, 80, 180, 255), 1, "selected");
173     laneColorer.addScheme(scheme);
174     scheme = GUIColorScheme("by permission code", RGBColor(240, 240, 240), "nobody");
175     scheme.addColor(RGBColor(10, 10, 10), (double)SVC_PASSENGER, "passenger");
176     scheme.addColor(RGBColor(128, 128, 128), (double)SVC_PEDESTRIAN, "pedestrian");
177     scheme.addColor(RGBColor(80, 80, 80), (double)(SVC_PEDESTRIAN | SVC_DELIVERY), "pedestrian_delivery");
178     scheme.addColor(RGBColor(192, 66, 44), (double)SVC_BICYCLE, "bicycle");
179     scheme.addColor(RGBColor(40, 100, 40), (double)SVC_BUS, "bus");
180     scheme.addColor(RGBColor(166, 147, 26), (double)SVC_TAXI, "taxi");
181     scheme.addColor(RGBColor::BLACK, (double)(SVCAll & ~SVC_NON_ROAD), "normal_road");
182     scheme.addColor(RGBColor::BLACK, (double)(SVCAll & ~(SVC_PEDESTRIAN | SVC_NON_ROAD)), "disallow_pedestrian");
183     scheme.addColor(RGBColor(255, 206, 0), (double)(SVCAll & ~(SVC_PEDESTRIAN | SVC_BICYCLE | SVC_MOPED | SVC_NON_ROAD)), "motorway");
184     scheme.addColor(RGBColor(150, 200, 200), (double)SVC_SHIP, "waterway");
185     scheme.addColor(RGBColor::GREEN, (double)SVCAll, "all");
186     laneColorer.addScheme(scheme);
187     // ... traffic states ...
188     scheme = GUIColorScheme("by allowed speed (lanewise)", RGBColor::RED);
189     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
190     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
191     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
192     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
193     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
194     laneColorer.addScheme(scheme);
195     scheme = GUIColorScheme("by current occupancy (lanewise, brutto)", RGBColor(235, 235, 235), "", false, 0, COL_SCHEME_DYNAMIC);
196     scheme.addColor(RGBColor::GREEN, 0.25);
197     scheme.addColor(RGBColor::YELLOW, 0.5);
198     scheme.addColor(RGBColor::ORANGE, 0.75);
199     scheme.addColor(RGBColor::RED, 1.0);
200     laneColorer.addScheme(scheme);
201     scheme = GUIColorScheme("by current occupancy (lanewise, netto)", RGBColor(235, 235, 235), "", false, 0, COL_SCHEME_DYNAMIC);
202     scheme.addColor(RGBColor::GREEN, 0.25);
203     scheme.addColor(RGBColor::YELLOW, 0.5);
204     scheme.addColor(RGBColor::ORANGE, 0.75);
205     scheme.addColor(RGBColor::RED, 1.0);
206     laneColorer.addScheme(scheme);
207     scheme = GUIColorScheme("by first vehicle waiting time (lanewise)", RGBColor(235, 235, 235), "", false, 0, COL_SCHEME_DYNAMIC);
208     scheme.addColor(RGBColor::CYAN, (double)30);
209     scheme.addColor(RGBColor::GREEN, (double)100);
210     scheme.addColor(RGBColor::YELLOW, (double)200);
211     scheme.addColor(RGBColor::RED, (double)300);
212     laneColorer.addScheme(scheme);
213     scheme = GUIColorScheme("by lane number (streetwise)", RGBColor::RED);
214     scheme.addColor(RGBColor::BLUE, (double)5);
215     laneColorer.addScheme(scheme);
216     // ... emissions ...
217     scheme = GUIColorScheme("by CO2 emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
218     scheme.addColor(RGBColor::RED, (double)(10. / 7.5 / 5.));
219     laneColorer.addScheme(scheme);
220     scheme = GUIColorScheme("by CO emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
221     scheme.addColor(RGBColor::RED, (double)(0.05 / 7.5 / 2.));
222     laneColorer.addScheme(scheme);
223     scheme = GUIColorScheme("by PMx emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
224     scheme.addColor(RGBColor::RED, (double)(.005 / 7.5 / 5.));
225     laneColorer.addScheme(scheme);
226     scheme = GUIColorScheme("by NOx emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
227     scheme.addColor(RGBColor::RED, (double)(.125 / 7.5 / 5.));
228     laneColorer.addScheme(scheme);
229     scheme = GUIColorScheme("by HC emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
230     scheme.addColor(RGBColor::RED, (double)(.02 / 7.5 / 4.));
231     laneColorer.addScheme(scheme);
232     scheme = GUIColorScheme("by fuel consumption", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
233     scheme.addColor(RGBColor::RED, (double)(.005 / 7.5 * 100.));
234     laneColorer.addScheme(scheme);
235     scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
236     scheme.addColor(RGBColor::RED, (double)100);
237     laneColorer.addScheme(scheme);
238     // ... weights (experimental) ...
239     scheme = GUIColorScheme("by global travel time", RGBColor::GREEN);
240     scheme.addColor(RGBColor::RED, (double)100);
241     scheme.setAllowsNegativeValues(true);
242     laneColorer.addScheme(scheme);
243     scheme = GUIColorScheme("by global speed percentage", RGBColor::RED);
244     scheme.addColor(RGBColor::YELLOW, (double)50);
245     scheme.addColor(RGBColor::GREEN, (double)100);
246     scheme.setAllowsNegativeValues(true);
247     laneColorer.addScheme(scheme);
248     scheme = GUIColorScheme("by given length/geometrical length", RGBColor::BLACK);
249     scheme.addColor(RGBColor::RED, 0.25);
250     scheme.addColor(RGBColor::YELLOW, 0.5);
251     scheme.addColor(RGBColor(179, 179, 179, 255), (double)1.0);
252     scheme.addColor(RGBColor::GREEN, (double)2.0);
253     scheme.addColor(RGBColor::BLUE, (double)4.0);
254     laneColorer.addScheme(scheme);
255     laneColorer.addScheme(GUIColorScheme("by angle", RGBColor::YELLOW, "", true));
256     scheme = GUIColorScheme("by loaded weight", RGBColor::GREEN);
257     scheme.addColor(RGBColor::RED, (double)100);
258     scheme.setAllowsNegativeValues(true);
259     laneColorer.addScheme(scheme);
260     scheme = GUIColorScheme("by priority", RGBColor::YELLOW);
261     scheme.addColor(RGBColor::RED, (double) - 20);
262     scheme.addColor(RGBColor::GREEN, (double)20);
263     scheme.setAllowsNegativeValues(true);
264     laneColorer.addScheme(scheme);
265     scheme = GUIColorScheme("by height at start", RGBColor::GREY);
266     scheme.addColor(RGBColor::BLUE, (double) - 10);
267     scheme.addColor(RGBColor::RED, (double)10);
268     scheme.addColor(RGBColor::YELLOW, (double)50);
269     scheme.addColor(RGBColor::GREEN, (double)100);
270     scheme.addColor(RGBColor::MAGENTA, (double)200);
271     scheme.setAllowsNegativeValues(true);
272     laneColorer.addScheme(scheme);
273     scheme = GUIColorScheme("by height at geometry-segment start", RGBColor::GREY);
274     scheme.addColor(RGBColor::BLUE, (double) - 10);
275     scheme.addColor(RGBColor::RED, (double)10);
276     scheme.addColor(RGBColor::YELLOW, (double)50);
277     scheme.addColor(RGBColor::GREEN, (double)100);
278     scheme.addColor(RGBColor::MAGENTA, (double)200);
279     scheme.setAllowsNegativeValues(true);
280     laneColorer.addScheme(scheme);
281     scheme = GUIColorScheme("by inclination", RGBColor::GREY);
282     scheme.addColor(RGBColor::YELLOW, (double) .1);
283     scheme.addColor(RGBColor::RED, (double) .3);
284     scheme.addColor(RGBColor::GREEN, (double) - .1);
285     scheme.addColor(RGBColor::BLUE, (double) - .3);
286     scheme.setAllowsNegativeValues(true);
287     laneColorer.addScheme(scheme);
288     scheme = GUIColorScheme("by geometry-segment inclination", RGBColor::GREY);
289     scheme.addColor(RGBColor::YELLOW, (double) .1);
290     scheme.addColor(RGBColor::RED, (double) .3);
291     scheme.addColor(RGBColor::GREEN, (double) - .1);
292     scheme.addColor(RGBColor::BLUE, (double) - .3);
293     scheme.setAllowsNegativeValues(true);
294     laneColorer.addScheme(scheme);
295     scheme = GUIColorScheme("by average speed", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
296     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
297     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
298     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
299     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
300     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
301     laneColorer.addScheme(scheme);
302     scheme = GUIColorScheme("by average relative speed ", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
303     scheme.addColor(RGBColor::YELLOW, (double)(0.25));
304     scheme.addColor(RGBColor::GREEN, (double)(0.5));
305     scheme.addColor(RGBColor::CYAN, (double)(0.75));
306     scheme.addColor(RGBColor::BLUE, (double)(1));
307     scheme.addColor(RGBColor::MAGENTA, (double)(1.25));
308     laneColorer.addScheme(scheme);
309     scheme = GUIColorScheme("by routing device assumed speed ", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
310     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
311     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
312     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
313     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
314     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
315     laneColorer.addScheme(scheme);
316     scheme = GUIColorScheme("by electricity consumption", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
317     scheme.addColor(RGBColor::RED, (double)(1 / 7.5 / 5.));
318     laneColorer.addScheme(scheme);
319     scheme = GUIColorScheme("by insertion-backlog (streetwise)", RGBColor(204, 204, 204), "", false, 0, COL_SCHEME_DYNAMIC);
320     scheme.addColor(RGBColor::GREEN, (double)1);
321     scheme.addColor(RGBColor::YELLOW, (double)10);
322     scheme.addColor(RGBColor::RED, (double)100);
323     laneColorer.addScheme(scheme);
324     scheme = GUIColorScheme("by TAZ (streetwise)", RGBColor(204, 204, 204), "no TAZ", true);
325     laneColorer.addScheme(scheme);
326     scheme = GUIColorScheme(SCHEME_NAME_EDGE_PARAM_NUMERICAL, RGBColor(204, 204, 204));
327     scheme.setAllowsNegativeValues(true);
328     laneColorer.addScheme(scheme);
329     scheme = GUIColorScheme(SCHEME_NAME_LANE_PARAM_NUMERICAL, RGBColor(204, 204, 204));
330     scheme.setAllowsNegativeValues(true);
331     laneColorer.addScheme(scheme);
332     scheme = GUIColorScheme(SCHEME_NAME_EDGEDATA_NUMERICAL, RGBColor(204, 204, 204));
333     scheme.setAllowsNegativeValues(true);
334     laneColorer.addScheme(scheme);
335 
336 
337     /// add vehicle coloring schemes
338     vehicleColorer.addScheme(GUIColorScheme("given vehicle/type/route color", RGBColor::YELLOW, "", true));
339     vehicleColorer.addScheme(GUIColorScheme("uniform", RGBColor::YELLOW, "", true));
340     vehicleColorer.addScheme(GUIColorScheme("given/assigned vehicle color", RGBColor::YELLOW, "", true));
341     vehicleColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor::YELLOW, "", true));
342     vehicleColorer.addScheme(GUIColorScheme("given/assigned route color", RGBColor::YELLOW, "", true));
343     vehicleColorer.addScheme(GUIColorScheme("depart position as HSV", RGBColor::YELLOW, "", true));
344     vehicleColorer.addScheme(GUIColorScheme("arrival position as HSV", RGBColor::YELLOW, "", true));
345     vehicleColorer.addScheme(GUIColorScheme("direction/distance as HSV", RGBColor::YELLOW, "", true));
346     scheme = GUIColorScheme("by speed", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
347     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
348     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
349     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
350     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
351     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
352     vehicleColorer.addScheme(scheme);
353     scheme = GUIColorScheme("by action step", RGBColor::GREY, "no action", true, 0, COL_SCHEME_DYNAMIC);
354     scheme.addColor(RGBColor(0, 255, 0, 255), 1., "action in next step");
355     scheme.addColor(RGBColor(80, 160, 80, 255), 2., "had action step");
356     vehicleColorer.addScheme(scheme);
357     scheme = GUIColorScheme("by waiting time", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
358     scheme.addColor(RGBColor::CYAN, (double)30);
359     scheme.addColor(RGBColor::GREEN, (double)100);
360     scheme.addColor(RGBColor::YELLOW, (double)200);
361     scheme.addColor(RGBColor::RED, (double)300);
362     vehicleColorer.addScheme(scheme);
363     scheme = GUIColorScheme("by accumulated waiting time", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
364     scheme.addColor(RGBColor::CYAN, (double)25);
365     scheme.addColor(RGBColor::GREEN, (double)50);
366     scheme.addColor(RGBColor::YELLOW, (double)75);
367     scheme.addColor(RGBColor::RED, (double)100);
368     vehicleColorer.addScheme(scheme);
369     scheme = GUIColorScheme("by time since lane change", RGBColor(179, 179, 179, 255), "0", false, 0, COL_SCHEME_DYNAMIC);
370     scheme.addColor(RGBColor(189, 189, 179, 255), -180);
371     scheme.addColor(RGBColor(255, 255, 0, 255), -20);
372     scheme.addColor(RGBColor(255,   0, 0, 255), -0.001);
373     scheme.addColor(RGBColor(0,   0, 255, 255),  0.001);
374     scheme.addColor(RGBColor(0, 255, 255, 255),  20);
375     scheme.addColor(RGBColor(179, 189, 189, 255),  180);
376     scheme.setAllowsNegativeValues(true);
377     vehicleColorer.addScheme(scheme);
378     scheme = GUIColorScheme("by max speed", RGBColor::RED);
379     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
380     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
381     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
382     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
383     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
384     vehicleColorer.addScheme(scheme);
385     // ... emissions ...
386     scheme = GUIColorScheme("by CO2 emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
387     scheme.addColor(RGBColor::RED, (double)5.);
388     vehicleColorer.addScheme(scheme);
389     scheme = GUIColorScheme("by CO emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
390     scheme.addColor(RGBColor::RED, 0.05);
391     vehicleColorer.addScheme(scheme);
392     scheme = GUIColorScheme("by PMx emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
393     scheme.addColor(RGBColor::RED, (double).005);
394     vehicleColorer.addScheme(scheme);
395     scheme = GUIColorScheme("by NOx emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
396     scheme.addColor(RGBColor::RED, (double).125);
397     vehicleColorer.addScheme(scheme);
398     scheme = GUIColorScheme("by HC emissions", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
399     scheme.addColor(RGBColor::RED, (double).02);
400     vehicleColorer.addScheme(scheme);
401     scheme = GUIColorScheme("by fuel consumption", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
402     scheme.addColor(RGBColor::RED, (double).005);
403     vehicleColorer.addScheme(scheme);
404     scheme = GUIColorScheme("by noise emissions (Harmonoise)", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
405     scheme.addColor(RGBColor::RED, (double)100.);
406     vehicleColorer.addScheme(scheme);
407     scheme = GUIColorScheme("by reroute number", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
408     scheme.addColor(RGBColor::YELLOW, (double)1.);
409     scheme.addColor(RGBColor::WHITE, (double)10.);
410     vehicleColorer.addScheme(scheme);
411     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
412     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
413     vehicleColorer.addScheme(scheme);
414     scheme = GUIColorScheme("by offset from best lane", RGBColor(179, 179, 179, 255), "0", false, 0, COL_SCHEME_DYNAMIC);
415     scheme.addColor(RGBColor(255, 0, 255, 255), -100, "opposite lane");
416     scheme.addColor(RGBColor(255,   0, 0, 255), -3, "-3");
417     scheme.addColor(RGBColor(255, 255, 0, 255), -1, "-1");
418     scheme.addColor(RGBColor(0, 255, 255, 255),  1,  "1");
419     scheme.addColor(RGBColor(0,   0, 255, 255),  3,  "3");
420     scheme.setAllowsNegativeValues(true);
421     vehicleColorer.addScheme(scheme);
422     scheme = GUIColorScheme("by acceleration", RGBColor(179, 179, 179, 255), "0", false, 0, COL_SCHEME_DYNAMIC);
423     scheme.addColor(RGBColor(64,    0, 0, 255), -9.0);
424     scheme.addColor(RGBColor(255,   0, 0, 255), -4.5 /* -SUMOVTypeParameter::getDefaultDecel() */);
425     scheme.addColor(RGBColor(255, 255, 0, 255), -0.1);
426     scheme.addColor(RGBColor(0, 255, 255, 255),  0.1);
427     scheme.addColor(RGBColor(0,   0, 255, 255),  2.6 /* SUMOVTypeParameter::getDefaultAccel() */);
428     scheme.addColor(RGBColor(255, 0, 255, 255),  5.2);
429     scheme.setAllowsNegativeValues(true);
430     vehicleColorer.addScheme(scheme);
431     scheme = GUIColorScheme("by time gap on lane", RGBColor(255, 255, 0, 255), "0", false, 0, COL_SCHEME_DYNAMIC);
432     scheme.addColor(RGBColor(179, 179, 179, 255), -1);
433     scheme.addColor(RGBColor(0, 255, 255, 255), 1);
434     scheme.addColor(RGBColor(0,   0, 255, 255), 2);
435     scheme.setAllowsNegativeValues(true);
436     vehicleColorer.addScheme(scheme);
437     scheme = GUIColorScheme("by depart delay", RGBColor::BLUE);
438     scheme.addColor(RGBColor::CYAN, (double)30);
439     scheme.addColor(RGBColor::GREEN, (double)100);
440     scheme.addColor(RGBColor::YELLOW, (double)200);
441     scheme.addColor(RGBColor::RED, (double)300);
442     vehicleColorer.addScheme(scheme);
443     scheme = GUIColorScheme("by electricity consumption", RGBColor::GREEN, "", false, 0, COL_SCHEME_EMISSION);
444     scheme.addColor(RGBColor::RED, (double)5);
445     vehicleColorer.addScheme(scheme);
446     scheme = GUIColorScheme("by time loss", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
447     scheme.addColor(RGBColor::CYAN, (double)10);
448     scheme.addColor(RGBColor::GREEN, (double)60);
449     scheme.addColor(RGBColor::YELLOW, (double)180);
450     scheme.addColor(RGBColor::RED, (double)900);
451     vehicleColorer.addScheme(scheme);
452     scheme = GUIColorScheme("by lateral speed", RGBColor(179, 179, 179, 255), "0", false, 0, COL_SCHEME_DYNAMIC);
453     scheme.addColor(RGBColor(255,   0, 0, 255), -3, "-1.5");
454     scheme.addColor(RGBColor(255, 255, 0, 255), -1, "-0.5");
455     scheme.addColor(RGBColor(0, 255, 255, 255),  1,  "0.5");
456     scheme.addColor(RGBColor(0,   0, 255, 255),  3,  "1.5");
457     scheme.setAllowsNegativeValues(true);
458     vehicleColorer.addScheme(scheme);
459     vehicleColorer.addScheme(GUIColorScheme("random", RGBColor::YELLOW, "", true));
460 
461     /// add person coloring schemes
462     personColorer.addScheme(GUIColorScheme("given person/type color", RGBColor::BLUE, "", true));
463     personColorer.addScheme(GUIColorScheme("uniform", RGBColor::BLUE, "", true));
464     personColorer.addScheme(GUIColorScheme("given/assigned person color", RGBColor::BLUE, "", true));
465     personColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor::BLUE, "", true));
466     scheme = GUIColorScheme("by speed", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
467     scheme.addColor(RGBColor::YELLOW, (double)(2.5 / 3.6));
468     scheme.addColor(RGBColor::GREEN, (double)(5 / 3.6));
469     scheme.addColor(RGBColor::BLUE, (double)(10 / 3.6));
470     personColorer.addScheme(scheme);
471     scheme = GUIColorScheme("by mode", RGBColor::GREY, "waiting for insertion", true, 0, COL_SCHEME_DYNAMIC);
472     scheme.addColor(RGBColor::RED, (double)(1), "stopped");
473     scheme.addColor(RGBColor::GREEN, (double)(2), "walking");
474     scheme.addColor(RGBColor::BLUE, (double)(3), "riding");
475     scheme.addColor(RGBColor::CYAN, (double)(4), "accessing trainStop");
476     scheme.addColor(RGBColor::YELLOW, (double)(5), "waiting for ride");
477     personColorer.addScheme(scheme);
478     scheme = GUIColorScheme("by waiting time", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
479     scheme.addColor(RGBColor::CYAN, (double)30);
480     scheme.addColor(RGBColor::GREEN, (double)100);
481     scheme.addColor(RGBColor::YELLOW, (double)200);
482     scheme.addColor(RGBColor::RED, (double)300);
483     personColorer.addScheme(scheme);
484     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
485     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
486     personColorer.addScheme(scheme);
487     personColorer.addScheme(GUIColorScheme("by angle", RGBColor::YELLOW, "", true));
488     personColorer.addScheme(GUIColorScheme("random", RGBColor::YELLOW, "", true));
489 
490     /// add container coloring schemes
491     containerColorer.addScheme(GUIColorScheme("given container/type color", RGBColor::YELLOW, "", true));
492     containerColorer.addScheme(GUIColorScheme("uniform", RGBColor::YELLOW, "", true));
493     containerColorer.addScheme(GUIColorScheme("given/assigned container color", RGBColor::YELLOW, "", true));
494     containerColorer.addScheme(GUIColorScheme("given/assigned type color", RGBColor::YELLOW, "", true));
495     scheme = GUIColorScheme("by speed", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
496     scheme.addColor(RGBColor::YELLOW, (double)(2.5 / 3.6));
497     scheme.addColor(RGBColor::GREEN, (double)(5 / 3.6));
498     scheme.addColor(RGBColor::BLUE, (double)(10 / 3.6));
499     containerColorer.addScheme(scheme);
500     scheme = GUIColorScheme("by mode", RGBColor::GREY, "waiting for insertion", true, 0, COL_SCHEME_DYNAMIC);
501     scheme.addColor(RGBColor::RED, (double)(1), "stopped");
502     scheme.addColor(RGBColor::GREEN, (double)(2), "tranship"); // walking
503     scheme.addColor(RGBColor::BLUE, (double)(3), "transport");
504     scheme.addColor(RGBColor::CYAN, (double)(4), "accessing trainStop");
505     scheme.addColor(RGBColor::YELLOW, (double)(5), "waiting for transport");
506     containerColorer.addScheme(scheme);
507     scheme = GUIColorScheme("by waiting time", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
508     scheme.addColor(RGBColor::CYAN, (double)30);
509     scheme.addColor(RGBColor::GREEN, (double)100);
510     scheme.addColor(RGBColor::YELLOW, (double)200);
511     scheme.addColor(RGBColor::RED, (double)300);
512     containerColorer.addScheme(scheme);
513     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
514     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
515     containerColorer.addScheme(scheme);
516     containerColorer.addScheme(GUIColorScheme("by angle", RGBColor::YELLOW, "", true));
517 
518     /// add junction coloring schemes
519     scheme = GUIColorScheme("uniform", RGBColor::BLACK, "", true);
520     scheme.addColor(RGBColor(150, 200, 200), 1, "waterway");
521     scheme.addColor(RGBColor(0, 0, 0, 0), 2, "railway");
522     junctionColorer.addScheme(scheme);
523     scheme = GUIColorScheme("by selection", RGBColor(128, 128, 128, 255), "unselected", true, 0, COL_SCHEME_MISC);
524     scheme.addColor(RGBColor(0, 80, 180, 255), 1, "selected");
525     junctionColorer.addScheme(scheme);
526     scheme = GUIColorScheme("by type", RGBColor::GREEN, "traffic_light", true);
527     scheme.addColor(RGBColor(0, 128, 0), 1, "traffic_light_unregulated");
528     scheme.addColor(RGBColor::YELLOW, 2, "priority");
529     scheme.addColor(RGBColor::RED, 3, "priority_stop");
530     scheme.addColor(RGBColor::BLUE, 4, "right_before_left");
531     scheme.addColor(RGBColor::CYAN, 5, "allway_stop");
532     scheme.addColor(RGBColor::GREY, 6, "district");
533     scheme.addColor(RGBColor::MAGENTA, 7, "unregulated");
534     scheme.addColor(RGBColor::BLACK, 8, "dead_end");
535     scheme.addColor(RGBColor::ORANGE, 9, "rail_signal");
536     scheme.addColor(RGBColor(172, 108, 44), 10, "zipper"); // brown, darker than the zipper link rule
537     scheme.addColor(RGBColor(192, 255, 192), 11, "traffic_light_right_on_red"); // light green
538     scheme.addColor(RGBColor(128, 0, 128), 12, "rail_crossing"); // dark purple
539     junctionColorer.addScheme(scheme);
540     scheme = GUIColorScheme("by height", RGBColor::GREY);
541     scheme.addColor(RGBColor::BLUE, (double) - 10);
542     scheme.addColor(RGBColor::RED, (double)10);
543     scheme.addColor(RGBColor::YELLOW, (double)50);
544     scheme.addColor(RGBColor::GREEN, (double)100);
545     scheme.addColor(RGBColor::MAGENTA, (double)200);
546     scheme.setAllowsNegativeValues(true);
547     junctionColorer.addScheme(scheme);
548 
549     /// add POI coloring schemes
550     poiColorer.addScheme(GUIColorScheme("given POI color", RGBColor::RED, "", true));
551     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
552     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
553     poiColorer.addScheme(scheme);
554     poiColorer.addScheme(GUIColorScheme("uniform", RGBColor::RED, "", true));
555 
556     /// add polygon coloring schemes
557     polyColorer.addScheme(GUIColorScheme("given polygon color", RGBColor::ORANGE, "", true));
558     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
559     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
560     polyColorer.addScheme(scheme);
561     polyColorer.addScheme(GUIColorScheme("uniform", RGBColor::ORANGE, "", true));
562 
563     /// add lane scaling schemes
564     {
565         GUIScaleScheme scheme = GUIScaleScheme("default", 1, "uniform", true);
566         laneScaler.addScheme(scheme);
567         scheme = GUIScaleScheme("by selection (lane-/streetwise)", 0.5, "unselected", true, 0, COL_SCHEME_MISC);
568         scheme.addColor(5, 1, "selected");
569         laneScaler.addScheme(scheme);
570         // ... traffic states ...
571         scheme = GUIScaleScheme("by allowed speed (lanewise)", 0);
572         scheme.addColor(10, (double)(150.0 / 3.6));
573         laneScaler.addScheme(scheme);
574         scheme = GUIScaleScheme("by current occupancy (lanewise, brutto)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
575         scheme.addColor(10, 0.95);
576         laneScaler.addScheme(scheme);
577         scheme = GUIScaleScheme("by current occupancy (lanewise, netto)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
578         scheme.addColor(10, 0.95);
579         laneScaler.addScheme(scheme);
580         scheme = GUIScaleScheme("by first vehicle waiting time (lanewise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
581         scheme.addColor(10, (double)300);
582         laneScaler.addScheme(scheme);
583         scheme = GUIScaleScheme("by lane number (streetwise)", 1);
584         scheme.addColor(10, (double)5);
585         laneScaler.addScheme(scheme);
586         // ... emissions ...
587         scheme = GUIScaleScheme("by CO2 emissions", 0, "", false, 0, COL_SCHEME_EMISSION);
588         scheme.addColor(10, (double)(10. / 7.5 / 5.));
589         laneScaler.addScheme(scheme);
590         scheme = GUIScaleScheme("by CO emissions", 0, "", false, 0, COL_SCHEME_EMISSION);
591         scheme.addColor(10, (double)(0.05 / 7.5 / 2.));
592         laneScaler.addScheme(scheme);
593         scheme = GUIScaleScheme("by PMx emissions", 0, "", false, 0, COL_SCHEME_EMISSION);
594         scheme.addColor(10, (double)(.005 / 7.5 / 5.));
595         laneScaler.addScheme(scheme);
596         scheme = GUIScaleScheme("by NOx emissions", 0, "", false, 0, COL_SCHEME_EMISSION);
597         scheme.addColor(10, (double)(.125 / 7.5 / 5.));
598         laneScaler.addScheme(scheme);
599         scheme = GUIScaleScheme("by HC emissions", 0, "", false, 0, COL_SCHEME_EMISSION);
600         scheme.addColor(10, (double)(.02 / 7.5 / 4.));
601         laneScaler.addScheme(scheme);
602         scheme = GUIScaleScheme("by fuel consumption", 0, "", false, 0, COL_SCHEME_EMISSION);
603         scheme.addColor(10, (double)(.005 / 7.5 * 100.));
604         laneScaler.addScheme(scheme);
605         scheme = GUIScaleScheme("by noise emissions (Harmonoise)", 0, "", false, 0, COL_SCHEME_EMISSION);
606         scheme.addColor(10, (double)100);
607         laneScaler.addScheme(scheme);
608         // ... weights (experimental) ...
609         scheme = GUIScaleScheme("by global travel time", 0);
610         scheme.addColor(10, (double)100);
611         scheme.setAllowsNegativeValues(true);
612         laneScaler.addScheme(scheme);
613         scheme = GUIScaleScheme("by global speed percentage", 0);
614         scheme.addColor(10, (double)100);
615         scheme.setAllowsNegativeValues(true);
616         laneScaler.addScheme(scheme);
617         scheme = GUIScaleScheme("by given length/geometrical length", 0);
618         scheme.addColor(10, (double)10.0);
619         laneScaler.addScheme(scheme);
620         scheme = GUIScaleScheme("by loaded weight", 0);
621         scheme.addColor(-1000, (double) - 1000);
622         scheme.addColor(1000, (double)1000);
623         scheme.setAllowsNegativeValues(true);
624         laneScaler.addScheme(scheme);
625         scheme = GUIScaleScheme("by priority", 1);
626         scheme.addColor(0.5, (double) - 20);
627         scheme.addColor(5, (double)20);
628         scheme.setAllowsNegativeValues(true);
629         laneScaler.addScheme(scheme);
630         scheme = GUIScaleScheme("by average speed", 0, "", false, 0, COL_SCHEME_DYNAMIC);
631         scheme.addColor(10, (double)(150.0 / 3.6));
632         laneScaler.addScheme(scheme);
633         scheme = GUIScaleScheme("by average relative speed", 0, "", false, 0, COL_SCHEME_DYNAMIC);
634         scheme.addColor(0.5, (double)(0.5));
635         scheme.addColor(2, (double)(1));
636         scheme.addColor(10, (double)(2));
637         laneScaler.addScheme(scheme);
638         scheme = GUIScaleScheme("by electricity consumption", 0, "", false, 0, COL_SCHEME_EMISSION);
639         scheme.addColor(10, (double)(1 / 7.5 / 5.));
640         laneScaler.addScheme(scheme);
641         scheme = GUIScaleScheme("by insertion-backlog (streetwise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
642         scheme.addColor(1, (double)1);
643         scheme.addColor(10, (double)10);
644         scheme.addColor(50, (double)100);
645         laneScaler.addScheme(scheme);
646     }
647 
648 
649     /// add edge coloring schemes
650     edgeColorer.addScheme(GUIColorScheme("uniform", RGBColor(0, 0, 0, 0), "", true));
651     scheme = GUIColorScheme("by selection (streetwise)", RGBColor(128, 128, 128, 255), "unselected", true, 0, COL_SCHEME_MISC);
652     scheme.addColor(RGBColor(0, 80, 180, 255), 1, "selected");
653     edgeColorer.addScheme(scheme);
654     scheme = GUIColorScheme("by purpose (streetwise)", RGBColor(), "normal", true);
655     scheme.addColor(RGBColor(128, 0, 128, 255), 1, "connector"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_CONNECTOR
656     scheme.addColor(RGBColor::BLUE, 2, "internal"); // see MSEdge::EdgeBasicFunction::EDGEFUNCTION_INTERNAL
657     edgeColorer.addScheme(scheme);
658     scheme = GUIColorScheme("by allowed speed (streetwise)", RGBColor::RED);
659     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
660     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
661     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
662     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
663     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
664     edgeColorer.addScheme(scheme);
665     scheme = GUIColorScheme("by current occupancy (streetwise, brutto)", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
666     scheme.addColor(RGBColor::RED, 0.95);
667     edgeColorer.addScheme(scheme);
668     scheme = GUIColorScheme("by current speed (streetwise)", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
669     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
670     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
671     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
672     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
673     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
674     edgeColorer.addScheme(scheme);
675     scheme = GUIColorScheme("by current flow (streetwise)", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
676     scheme.addColor(RGBColor::RED, (double)5000);
677     edgeColorer.addScheme(scheme);
678     scheme = GUIColorScheme("by relative speed (streetwise)", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
679     scheme.addColor(RGBColor::YELLOW, (double)(0.25));
680     scheme.addColor(RGBColor::GREEN, (double)(0.5));
681     scheme.addColor(RGBColor::CYAN, (double)(0.75));
682     scheme.addColor(RGBColor::BLUE, (double)(1));
683     scheme.addColor(RGBColor::MAGENTA, (double)(1.25));
684     edgeColorer.addScheme(scheme);
685     scheme = GUIColorScheme("by routing device assumed speed", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
686     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
687     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
688     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
689     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
690     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
691     edgeColorer.addScheme(scheme);
692     edgeColorer.addScheme(GUIColorScheme("by angle", RGBColor::YELLOW, "", true));
693     scheme = GUIColorScheme("by segments (alternating)", RGBColor::BLUE, "odd", true);
694     scheme.addColor(RGBColor::RED, 1, "even");
695     edgeColorer.addScheme(scheme);
696     scheme = GUIColorScheme("by jammed state (segmentwise)", RGBColor::GREEN, "free", true, 0, COL_SCHEME_DYNAMIC);
697     scheme.addColor(RGBColor::RED, 1, "jammed");
698     edgeColorer.addScheme(scheme);
699     scheme = GUIColorScheme("by current occupancy (segmentwise, brutto)", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
700     scheme.addColor(RGBColor::RED, 0.95);
701     edgeColorer.addScheme(scheme);
702     scheme = GUIColorScheme("by current speed (segmentwise)", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
703     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
704     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
705     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
706     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
707     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
708     edgeColorer.addScheme(scheme);
709     scheme = GUIColorScheme("by current flow (segmentwise)", RGBColor::BLUE, "", false, 0, COL_SCHEME_DYNAMIC);
710     scheme.addColor(RGBColor::RED, (double)5000);
711     edgeColorer.addScheme(scheme);
712     scheme = GUIColorScheme("by relative speed (segmentwise)", RGBColor::RED, "", false, 0, COL_SCHEME_DYNAMIC);
713     scheme.addColor(RGBColor::YELLOW, (double)(0.25));
714     scheme.addColor(RGBColor::GREEN, (double)(0.5));
715     scheme.addColor(RGBColor::CYAN, (double)(0.75));
716     scheme.addColor(RGBColor::BLUE, (double)(1));
717     scheme.addColor(RGBColor::MAGENTA, (double)(1.25));
718     edgeColorer.addScheme(scheme);
719     scheme = GUIColorScheme("by insertion-backlog (streetwise)", RGBColor::GREY, "", false, 0, COL_SCHEME_DYNAMIC);
720     scheme.addColor(RGBColor::GREEN, (double)1);
721     scheme.addColor(RGBColor::YELLOW, (double)10);
722     scheme.addColor(RGBColor::RED, (double)100);
723     edgeColorer.addScheme(scheme);
724     scheme = GUIColorScheme("by TAZ (streetwise)", RGBColor(204, 204, 204), "no TAZ", true);
725     edgeColorer.addScheme(scheme);
726 
727 
728     /// add edge scaling schemes
729     {
730         edgeScaler.addScheme(GUIScaleScheme("uniform", 1, "", true));
731         GUIScaleScheme scheme = GUIScaleScheme("by selection (streetwise)", 0.5, "unselected", true, 0, COL_SCHEME_MISC);
732         scheme.addColor(5, 1, "selected");
733         edgeScaler.addScheme(scheme);
734         scheme = GUIScaleScheme("by allowed speed (streetwise)", 0);
735         scheme.addColor(10, (double)(150.0 / 3.6));
736         edgeScaler.addScheme(scheme);
737         scheme = GUIScaleScheme("by current occupancy (streetwise, brutto)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
738         scheme.addColor(10, 0.95);
739         edgeScaler.addScheme(scheme);
740         scheme = GUIScaleScheme("by current speed (streetwise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
741         scheme.addColor(10, (double)(150.0 / 3.6));
742         edgeScaler.addScheme(scheme);
743         scheme = GUIScaleScheme("by current flow (streetwise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
744         scheme.addColor(20, (double)5000);
745         edgeScaler.addScheme(scheme);
746         scheme = GUIScaleScheme("by relative speed (streetwise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
747         scheme.addColor(20, (double)1);
748         edgeScaler.addScheme(scheme);
749         scheme = GUIScaleScheme("by insertion-backlog (streetwise)", 0, "", false, 0, COL_SCHEME_DYNAMIC);
750         scheme.addColor(1, (double)1);
751         scheme.addColor(10, (double)10);
752         scheme.addColor(50, (double)100);
753         edgeScaler.addScheme(scheme);
754     }
755 
756 }
757 
758 
759 void
initNeteditDefaults()760 GUIVisualizationSettings::initNeteditDefaults() {
761     // init color schemes
762     GUIColorScheme scheme = GUIColorScheme("uniform", RGBColor::BLACK, "road", true);
763     scheme.addColor(RGBColor::GREY, 1, "Sidewalk");
764     scheme.addColor(RGBColor(192, 66, 44), 2, "bike lane");
765     scheme.addColor(RGBColor(200, 255, 200), 3, "green verge");
766     scheme.addColor(RGBColor(150, 200, 200), 4, "waterway");
767     scheme.addColor(RGBColor::BLACK, 5, "railway");
768     scheme.addColor(RGBColor(92, 92, 92), 6, "no passenger"); // paths, service roads etc
769     laneColorer.addScheme(scheme);
770     scheme = GUIColorScheme("by selection (lane-/streetwise)", RGBColor(128, 128, 128, 255), "unselected", true, 0, COL_SCHEME_MISC);
771     scheme.addColor(RGBColor(0, 80, 180, 255), 1, "selected");
772     laneColorer.addScheme(scheme);
773     scheme = GUIColorScheme("by permission code", RGBColor(240, 240, 240), "nobody");
774     scheme.addColor(RGBColor(10, 10, 10), (double)SVC_PASSENGER, "passenger");
775     scheme.addColor(RGBColor(128, 128, 128), (double)SVC_PEDESTRIAN, "pedestrian");
776     scheme.addColor(RGBColor(80, 80, 80), (double)(SVC_PEDESTRIAN | SVC_DELIVERY), "pedestrian_delivery");
777     scheme.addColor(RGBColor(192, 66, 44), (double)SVC_BICYCLE, "bicycle");
778     scheme.addColor(RGBColor(40, 100, 40), (double)SVC_BUS, "bus");
779     scheme.addColor(RGBColor(166, 147, 26), (double)SVC_TAXI, "taxi");
780     scheme.addColor(RGBColor::BLACK, (double)(SVCAll & ~SVC_NON_ROAD), "normal_road");
781     scheme.addColor(RGBColor::BLACK, (double)(SVCAll & ~(SVC_PEDESTRIAN | SVC_NON_ROAD)), "disallow_pedestrian");
782     scheme.addColor(RGBColor(255, 206, 0), (double)(SVCAll & ~(SVC_PEDESTRIAN | SVC_BICYCLE | SVC_MOPED | SVC_NON_ROAD)), "motorway");
783     scheme.addColor(RGBColor(150, 200, 200), (double)SVC_SHIP, "waterway");
784     scheme.addColor(RGBColor::GREEN, (double)SVCAll, "all");
785     laneColorer.addScheme(scheme);
786 
787     scheme = GUIColorScheme("by allowed speed (lanewise)", RGBColor::RED);
788     scheme.addColor(RGBColor::YELLOW, (double)(30 / 3.6));
789     scheme.addColor(RGBColor::GREEN, (double)(55 / 3.6));
790     scheme.addColor(RGBColor::CYAN, (double)(80 / 3.6));
791     scheme.addColor(RGBColor::BLUE, (double)(120 / 3.6));
792     scheme.addColor(RGBColor::MAGENTA, (double)(150 / 3.6));
793     laneColorer.addScheme(scheme);
794 
795     scheme = GUIColorScheme("by lane number (streetwise)", RGBColor::RED);
796     scheme.addColor(RGBColor::BLUE, (double)5);
797     laneColorer.addScheme(scheme);
798 
799     scheme = GUIColorScheme("by given length/geometrical length", RGBColor::BLACK);
800     scheme.addColor(RGBColor::RED, 0.25);
801     scheme.addColor(RGBColor::YELLOW, 0.5);
802     scheme.addColor(RGBColor(179, 179, 179, 255), (double)1.0);
803     scheme.addColor(RGBColor::GREEN, (double)2.0);
804     scheme.addColor(RGBColor::BLUE, (double)4.0);
805     laneColorer.addScheme(scheme);
806     laneColorer.addScheme(GUIColorScheme("by angle", RGBColor::YELLOW, "", true));
807 
808     scheme = GUIColorScheme("by priority", RGBColor::YELLOW);
809     scheme.addColor(RGBColor::RED, (double) - 20);
810     scheme.addColor(RGBColor::GREEN, (double)20);
811     scheme.setAllowsNegativeValues(true);
812     laneColorer.addScheme(scheme);
813     scheme = GUIColorScheme("by height at start", RGBColor::RED);
814     scheme.addColor(RGBColor::BLUE, (double) - 10);
815     scheme.addColor(RGBColor::YELLOW, (double)50);
816     scheme.addColor(RGBColor::GREEN, (double)100);
817     scheme.addColor(RGBColor::MAGENTA, (double)200);
818     scheme.setAllowsNegativeValues(true);
819     laneColorer.addScheme(scheme);
820     scheme = GUIColorScheme("by height at segment start", RGBColor::RED);
821     scheme.addColor(RGBColor::BLUE, (double) - 10);
822     scheme.addColor(RGBColor::YELLOW, (double)50);
823     scheme.addColor(RGBColor::GREEN, (double)100);
824     scheme.addColor(RGBColor::MAGENTA, (double)200);
825     scheme.setAllowsNegativeValues(true);
826     laneColorer.addScheme(scheme);
827     scheme = GUIColorScheme("by inclination", RGBColor::GREY);
828     scheme.addColor(RGBColor::YELLOW, (double) .1);
829     scheme.addColor(RGBColor::RED, (double) .3);
830     scheme.addColor(RGBColor::GREEN, (double) - .1);
831     scheme.addColor(RGBColor::BLUE, (double) - .3);
832     scheme.setAllowsNegativeValues(true);
833     laneColorer.addScheme(scheme);
834     scheme = GUIColorScheme("by segment inclination", RGBColor::GREY);
835     scheme.addColor(RGBColor::YELLOW, (double) .1);
836     scheme.addColor(RGBColor::RED, (double) .3);
837     scheme.addColor(RGBColor::GREEN, (double) - .1);
838     scheme.addColor(RGBColor::BLUE, (double) - .3);
839     scheme.setAllowsNegativeValues(true);
840     laneColorer.addScheme(scheme);
841     scheme = GUIColorScheme(SCHEME_NAME_EDGE_PARAM_NUMERICAL, RGBColor(204, 204, 204));
842     scheme.setAllowsNegativeValues(true);
843     laneColorer.addScheme(scheme);
844     scheme = GUIColorScheme(SCHEME_NAME_LANE_PARAM_NUMERICAL, RGBColor(204, 204, 204));
845     scheme.setAllowsNegativeValues(true);
846     laneColorer.addScheme(scheme);
847 
848     scheme = GUIColorScheme("uniform", RGBColor(102, 0, 0), "", true);
849     scheme.addColor(RGBColor(204, 0, 0), 1, "shape not computed");
850     scheme.addColor(RGBColor(153, 0, 0), 2, "geometry points");
851     scheme.addColor(RGBColor::GREEN, 3, "custom shape");
852     junctionColorer.addScheme(scheme);
853     scheme = GUIColorScheme("by selection", RGBColor(128, 128, 128, 255), "unselected", true, 0, COL_SCHEME_MISC);
854     scheme.addColor(RGBColor(0, 80, 180, 255), 1, "selected");
855     junctionColorer.addScheme(scheme);
856     scheme = GUIColorScheme("by type", RGBColor::GREEN, "traffic_light", true);
857     scheme.addColor(RGBColor(0, 128, 0), 1, "traffic_light_unregulated");
858     scheme.addColor(RGBColor::YELLOW, 2, "priority");
859     scheme.addColor(RGBColor::RED, 3, "priority_stop");
860     scheme.addColor(RGBColor::BLUE, 4, "right_before_left");
861     scheme.addColor(RGBColor::CYAN, 5, "allway_stop");
862     scheme.addColor(RGBColor::GREY, 6, "district");
863     scheme.addColor(RGBColor::MAGENTA, 7, "unregulated");
864     scheme.addColor(RGBColor::BLACK, 8, "dead_end");
865     scheme.addColor(RGBColor::ORANGE, 9, "rail_signal");
866     scheme.addColor(RGBColor(172, 108, 44), 10, "zipper"); // brown, darker than the zipper link rule
867     scheme.addColor(RGBColor(192, 255, 192), 11, "traffic_light_right_on_red");
868     scheme.addColor(RGBColor(128, 0, 128), 12, "rail_crossing"); // dark purple
869     junctionColorer.addScheme(scheme);
870     scheme = GUIColorScheme("by height", RGBColor::GREY);
871     scheme.addColor(RGBColor::BLUE, (double) - 10);
872     scheme.addColor(RGBColor::RED, (double)10);
873     scheme.addColor(RGBColor::YELLOW, (double)50);
874     scheme.addColor(RGBColor::GREEN, (double)100);
875     scheme.addColor(RGBColor::MAGENTA, (double)200);
876     scheme.setAllowsNegativeValues(true);
877     junctionColorer.addScheme(scheme);
878 
879     /// add POI coloring schemes
880     poiColorer.addScheme(GUIColorScheme("given POI color", RGBColor::RED, "", true));
881     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
882     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
883     poiColorer.addScheme(scheme);
884     poiColorer.addScheme(GUIColorScheme("uniform", RGBColor::RED, "", true));
885 
886     /// add polygon coloring schemes
887     polyColorer.addScheme(GUIColorScheme("given polygon color", RGBColor::ORANGE, "", true));
888     scheme = GUIColorScheme("by selection", RGBColor(179, 179, 179, 255), "unselected", true, 0, COL_SCHEME_MISC);
889     scheme.addColor(RGBColor(0, 102, 204, 255), 1, "selected");
890     polyColorer.addScheme(scheme);
891     polyColorer.addScheme(GUIColorScheme("uniform", RGBColor::ORANGE, "", true));
892 
893     /// add edge scaling schemes
894     {
895         GUIScaleScheme scheme = GUIScaleScheme("default", 1, "uniform", true);
896         laneScaler.addScheme(scheme);
897     }
898 
899     // dummy schemes
900     vehicleColorer.addScheme(GUIColorScheme("uniform", RGBColor::YELLOW, "", true));
901     personColorer.addScheme(GUIColorScheme("uniform", RGBColor::YELLOW, "", true));
902     containerColorer.addScheme(GUIColorScheme("uniform", RGBColor::YELLOW, "", true));
903 }
904 
905 
906 int
getLaneEdgeMode() const907 GUIVisualizationSettings::getLaneEdgeMode() const {
908     if (UseMesoSim) {
909         return edgeColorer.getActive();
910     }
911     return laneColorer.getActive();
912 }
913 
914 
915 int
getLaneEdgeScaleMode() const916 GUIVisualizationSettings::getLaneEdgeScaleMode() const {
917     if (UseMesoSim) {
918         return edgeScaler.getActive();
919     }
920     return laneScaler.getActive();
921 }
922 
923 
924 GUIColorScheme&
getLaneEdgeScheme()925 GUIVisualizationSettings::getLaneEdgeScheme() {
926     if (UseMesoSim) {
927         return edgeColorer.getScheme();
928     }
929     return laneColorer.getScheme();
930 }
931 
932 
933 GUIScaleScheme&
getLaneEdgeScaleScheme()934 GUIVisualizationSettings::getLaneEdgeScaleScheme() {
935     if (UseMesoSim) {
936         return edgeScaler.getScheme();
937     }
938     return laneScaler.getScheme();
939 }
940 
941 void
save(OutputDevice & dev) const942 GUIVisualizationSettings::save(OutputDevice& dev) const {
943     dev.openTag(SUMO_TAG_VIEWSETTINGS_SCHEME);
944     dev.writeAttr(SUMO_ATTR_NAME, name);
945     dev.openTag(SUMO_TAG_VIEWSETTINGS_OPENGL);
946     dev.writeAttr("dither", dither);
947     dev.writeAttr("fps", fps);
948     dev.closeTag();
949     dev.openTag(SUMO_TAG_VIEWSETTINGS_BACKGROUND);
950     dev.writeAttr("backgroundColor", backgroundColor);
951     dev.writeAttr("showGrid", showGrid);
952     dev.writeAttr("gridXSize", gridXSize);
953     dev.writeAttr("gridYSize", gridYSize);
954     dev.closeTag();
955     // edges
956     dev.openTag(SUMO_TAG_VIEWSETTINGS_EDGES);
957     dev.writeAttr("laneEdgeMode", getLaneEdgeMode());
958     dev.writeAttr("scaleMode", getLaneEdgeScaleMode());
959     dev.writeAttr("laneShowBorders", laneShowBorders);
960     dev.writeAttr("showBikeMarkings", showBikeMarkings);
961     dev.writeAttr("showLinkDecals", showLinkDecals);
962     dev.writeAttr("showLinkRules", showLinkRules);
963     dev.writeAttr("showRails", showRails);
964     dev.writeAttr("hideConnectors", hideConnectors);
965     dev.writeAttr("widthExaggeration", laneWidthExaggeration);
966     dev.writeAttr("minSize", laneMinSize);
967     dev.writeAttr("showDirection", showLaneDirection);
968     dev.writeAttr("showSublanes", showSublanes);
969     dev.writeAttr("spreadSuperposed", spreadSuperposed);
970     dev.writeAttr("edgeParam", edgeParam);
971     dev.writeAttr("laneParam", laneParam);
972     dev.writeAttr("edgeData", edgeData);
973     dev.lf();
974     dev << "               ";
975     edgeName.print(dev, "edgeName");
976     dev.lf();
977     dev << "               ";
978     internalEdgeName.print(dev, "internalEdgeName");
979     dev.lf();
980     dev << "               ";
981     cwaEdgeName.print(dev, "cwaEdgeName");
982     dev.lf();
983     dev << "               ";
984     streetName.print(dev, "streetName");
985     dev.lf();
986     dev << "               ";
987     edgeValue.print(dev, "edgeValue");
988     laneColorer.save(dev);
989     laneScaler.save(dev);
990     edgeColorer.save(dev);
991     edgeScaler.save(dev);
992     dev.closeTag();
993     // vehicles
994     dev.openTag(SUMO_TAG_VIEWSETTINGS_VEHICLES);
995     dev.writeAttr("vehicleMode", vehicleColorer.getActive());
996     dev.writeAttr("vehicleQuality", vehicleQuality);
997     vehicleSize.print(dev, "vehicle");
998     dev.writeAttr("showBlinker", showBlinker);
999     dev.writeAttr("drawMinGap", drawMinGap);
1000     dev.lf();
1001     dev << "                 ";
1002     vehicleName.print(dev, "vehicleName");
1003     dev.lf();
1004     dev << "                 ";
1005     vehicleValue.print(dev, "vehicleValue");
1006     vehicleColorer.save(dev);
1007     dev.closeTag();
1008     // persons
1009     dev.openTag(SUMO_TAG_VIEWSETTINGS_PERSONS);
1010     dev.writeAttr("personMode", personColorer.getActive());
1011     dev.writeAttr("personQuality", personQuality);
1012     personSize.print(dev, "person");
1013     dev.lf();
1014     dev << "                ";
1015     personName.print(dev, "personName");
1016     dev.lf();
1017     dev << "                 ";
1018     personValue.print(dev, "personValue");
1019     personColorer.save(dev);
1020     dev.closeTag();
1021     // containers
1022     dev.openTag(SUMO_TAG_VIEWSETTINGS_CONTAINERS);
1023     dev.writeAttr("containerMode", containerColorer.getActive());
1024     dev.writeAttr("containerQuality", containerQuality);
1025     containerSize.print(dev, "container");
1026     dev.lf();
1027     dev << "                ";
1028     containerName.print(dev, "containerName");
1029     containerColorer.save(dev);
1030     dev.closeTag();
1031     // junctions
1032     dev.openTag(SUMO_TAG_VIEWSETTINGS_JUNCTIONS);
1033     dev.writeAttr("junctionMode", junctionColorer.getActive());
1034     dev.lf();
1035     dev << "                  ";
1036     drawLinkTLIndex.print(dev, "drawLinkTLIndex");
1037     dev.lf();
1038     dev << "                  ";
1039     drawLinkJunctionIndex.print(dev, "drawLinkJunctionIndex");
1040     dev.lf();
1041     dev << "                  ";
1042     junctionName.print(dev, "junctionName");
1043     dev.lf();
1044     dev << "                  ";
1045     internalJunctionName.print(dev, "internalJunctionName");
1046     dev.lf();
1047     dev << "                  ";
1048     tlsPhaseIndex.print(dev, "tlsPhaseIndex");
1049     dev.lf();
1050     dev << "                  ";
1051     dev.writeAttr("showLane2Lane", showLane2Lane);
1052     dev.writeAttr("drawShape", drawJunctionShape);
1053     dev.writeAttr("drawCrossingsAndWalkingareas", drawCrossingsAndWalkingareas);
1054     junctionSize.print(dev, "junction");
1055     junctionColorer.save(dev);
1056     dev.closeTag();
1057     // additionals
1058     dev.openTag(SUMO_TAG_VIEWSETTINGS_ADDITIONALS);
1059     dev.writeAttr("addMode", addMode);
1060     addSize.print(dev, "add");
1061     addName.print(dev, "addName");
1062     addFullName.print(dev, "addFullName");
1063     dev.closeTag();
1064     // pois
1065     dev.openTag(SUMO_TAG_VIEWSETTINGS_POIS);
1066     poiSize.print(dev, "poi");
1067     poiName.print(dev, "poiName");
1068     poiType.print(dev, "poiType");
1069     poiColorer.save(dev);
1070     dev.closeTag();
1071     // polys
1072     dev.openTag(SUMO_TAG_VIEWSETTINGS_POLYS);
1073     polySize.print(dev, "poly");
1074     polyName.print(dev, "polyName");
1075     polyType.print(dev, "polyType");
1076     polyColorer.save(dev);
1077     dev.closeTag();
1078     // legend
1079     dev.openTag(SUMO_TAG_VIEWSETTINGS_LEGEND);
1080     dev.writeAttr("showSizeLegend", showSizeLegend);
1081     dev.closeTag();
1082 
1083     dev.closeTag();
1084 }
1085 
1086 
1087 bool
operator ==(const GUIVisualizationSettings & v2)1088 GUIVisualizationSettings::operator==(const GUIVisualizationSettings& v2) {
1089     if (dither != v2.dither) {
1090         return false;
1091     }
1092     if (fps != v2.fps) {
1093         return false;
1094     }
1095     if (backgroundColor != v2.backgroundColor) {
1096         return false;
1097     }
1098     if (selectionColor != v2.selectionColor) {
1099         return false;
1100     }
1101     if (selectedEdgeColor != v2.selectedEdgeColor) {
1102         return false;
1103     }
1104     if (selectedLaneColor != v2.selectedLaneColor) {
1105         return false;
1106     }
1107     if (selectedConnectionColor != v2.selectedConnectionColor) {
1108         return false;
1109     }
1110     if (selectedAdditionalColor != v2.selectedAdditionalColor) {
1111         return false;
1112     }
1113     if (showGrid != v2.showGrid) {
1114         return false;
1115     }
1116     if (gridXSize != v2.gridXSize) {
1117         return false;
1118     }
1119     if (gridYSize != v2.gridYSize) {
1120         return false;
1121     }
1122 
1123     if (!(edgeColorer == v2.edgeColorer)) {
1124         return false;
1125     }
1126     if (!(edgeScaler == v2.edgeScaler)) {
1127         return false;
1128     }
1129     if (!(laneColorer == v2.laneColorer)) {
1130         return false;
1131     }
1132     if (!(laneScaler == v2.laneScaler)) {
1133         return false;
1134     }
1135     if (laneShowBorders != v2.laneShowBorders) {
1136         return false;
1137     }
1138     if (showBikeMarkings != v2.showBikeMarkings) {
1139         return false;
1140     }
1141     if (showLinkDecals != v2.showLinkDecals) {
1142         return false;
1143     }
1144     if (showLinkRules != v2.showLinkRules) {
1145         return false;
1146     }
1147     if (showRails != v2.showRails) {
1148         return false;
1149     }
1150     if (edgeName != v2.edgeName) {
1151         return false;
1152     }
1153     if (internalEdgeName != v2.internalEdgeName) {
1154         return false;
1155     }
1156     if (cwaEdgeName != v2.cwaEdgeName) {
1157         return false;
1158     }
1159     if (streetName != v2.streetName) {
1160         return false;
1161     }
1162     if (edgeValue != v2.edgeValue) {
1163         return false;
1164     }
1165     if (hideConnectors != v2.hideConnectors) {
1166         return false;
1167     }
1168     if (laneWidthExaggeration != v2.laneWidthExaggeration) {
1169         return false;
1170     }
1171     if (laneMinSize != v2.laneMinSize) {
1172         return false;
1173     }
1174     if (showLaneDirection != v2.showLaneDirection) {
1175         return false;
1176     }
1177     if (showSublanes != v2.showSublanes) {
1178         return false;
1179     }
1180     if (spreadSuperposed != v2.spreadSuperposed) {
1181         return false;
1182     }
1183     if (edgeParam != v2.edgeParam) {
1184         return false;
1185     }
1186     if (laneParam != v2.laneParam) {
1187         return false;
1188     }
1189     if (edgeData != v2.edgeData) {
1190         return false;
1191     }
1192     if (!(vehicleColorer == v2.vehicleColorer)) {
1193         return false;
1194     }
1195     if (vehicleQuality != v2.vehicleQuality) {
1196         return false;
1197     }
1198     if (vehicleSize != v2.vehicleSize) {
1199         return false;
1200     }
1201     if (showBlinker != v2.showBlinker) {
1202         return false;
1203     }
1204     if (drawLaneChangePreference != v2.drawLaneChangePreference) {
1205         return false;
1206     }
1207     if (drawMinGap != v2.drawMinGap) {
1208         return false;
1209     }
1210     if (showBTRange != v2.showBTRange) {
1211         return false;
1212     }
1213     if (vehicleName != v2.vehicleName) {
1214         return false;
1215     }
1216     if (vehicleValue != v2.vehicleValue) {
1217         return false;
1218     }
1219     if (!(personColorer == v2.personColorer)) {
1220         return false;
1221     }
1222     if (personQuality != v2.personQuality) {
1223         return false;
1224     }
1225     if (personSize != v2.personSize) {
1226         return false;
1227     }
1228     if (personName != v2.personName) {
1229         return false;
1230     }
1231     if (personValue != v2.personValue) {
1232         return false;
1233     }
1234     if (!(containerColorer == v2.containerColorer)) {
1235         return false;
1236     }
1237     if (containerQuality != v2.containerQuality) {
1238         return false;
1239     }
1240     if (containerSize != v2.containerSize) {
1241         return false;
1242     }
1243     if (containerName != v2.containerName) {
1244         return false;
1245     }
1246     if (!(junctionColorer == v2.junctionColorer)) {
1247         return false;
1248     }
1249     if (!(poiColorer == v2.poiColorer)) {
1250         return false;
1251     }
1252     if (!(polyColorer == v2.polyColorer)) {
1253         return false;
1254     }
1255     if (drawLinkTLIndex != v2.drawLinkTLIndex) {
1256         return false;
1257     }
1258     if (drawLinkJunctionIndex != v2.drawLinkJunctionIndex) {
1259         return false;
1260     }
1261     if (junctionName != v2.junctionName) {
1262         return false;
1263     }
1264     if (internalJunctionName != v2.internalJunctionName) {
1265         return false;
1266     }
1267     if (tlsPhaseIndex != v2.tlsPhaseIndex) {
1268         return false;
1269     }
1270 
1271     if (showLane2Lane != v2.showLane2Lane) {
1272         return false;
1273     }
1274 
1275     if (drawJunctionShape != v2.drawJunctionShape) {
1276         return false;
1277     }
1278 
1279     if (drawCrossingsAndWalkingareas != v2.drawCrossingsAndWalkingareas) {
1280         return false;
1281     }
1282     if (junctionSize != v2.junctionSize) {
1283         return false;
1284     }
1285 
1286     if (addMode != v2.addMode) {
1287         return false;
1288     }
1289     if (addSize != v2.addSize) {
1290         return false;
1291     }
1292     if (addName != v2.addName) {
1293         return false;
1294     }
1295     if (addFullName != v2.addFullName) {
1296         return false;
1297     }
1298     if (poiSize != v2.poiSize) {
1299         return false;
1300     }
1301     if (poiName != v2.poiName) {
1302         return false;
1303     }
1304     if (poiType != v2.poiType) {
1305         return false;
1306     }
1307     if (polySize != v2.polySize) {
1308         return false;
1309     }
1310     if (polyName != v2.polyName) {
1311         return false;
1312     }
1313     if (polyType != v2.polyType) {
1314         return false;
1315     }
1316 
1317     if (showSizeLegend != v2.showSizeLegend) {
1318         return false;
1319     }
1320 
1321     return true;
1322 }
1323 
1324 
1325 double
getExaggeration(const GUIVisualizationSettings & s,const GUIGlObject * o,double factor) const1326 GUIVisualizationSizeSettings::getExaggeration(const GUIVisualizationSettings& s, const GUIGlObject* o, double factor) const {
1327     /// @note should look normal-sized at zoom 1000
1328     return (constantSize && (!constantSizeSelected || o == nullptr || gSelected.isSelected(o)))
1329            ? MAX2((double)exaggeration, exaggeration * factor / s.scale)
1330            : (!constantSizeSelected || o == nullptr || gSelected.isSelected(o) ? exaggeration : 1);
1331 }
1332 
1333 
1334 const RGBColor&
getLinkColor(const LinkState & ls)1335 GUIVisualizationSettings::getLinkColor(const LinkState& ls) {
1336     switch (ls) {
1337         case LINKSTATE_TL_GREEN_MAJOR:
1338             return SUMO_color_TL_GREEN_MAJOR;
1339         case LINKSTATE_TL_GREEN_MINOR:
1340             return SUMO_color_TL_GREEN_MINOR;
1341         case LINKSTATE_TL_RED:
1342             return SUMO_color_TL_RED;
1343         case LINKSTATE_TL_REDYELLOW:
1344             return SUMO_color_TL_REDYELLOW;
1345         case LINKSTATE_TL_YELLOW_MAJOR:
1346             return SUMO_color_TL_YELLOW_MAJOR;
1347         case LINKSTATE_TL_YELLOW_MINOR:
1348             return SUMO_color_TL_YELLOW_MINOR;
1349         case LINKSTATE_TL_OFF_BLINKING:
1350             return SUMO_color_TL_OFF_BLINKING;
1351         case LINKSTATE_TL_OFF_NOSIGNAL:
1352             return SUMO_color_TL_OFF_NOSIGNAL;
1353         case LINKSTATE_MAJOR:
1354             return SUMO_color_MAJOR;
1355         case LINKSTATE_MINOR:
1356             return SUMO_color_MINOR;
1357         case LINKSTATE_EQUAL:
1358             return SUMO_color_EQUAL;
1359         case LINKSTATE_STOP:
1360             return SUMO_color_STOP;
1361         case LINKSTATE_ALLWAY_STOP:
1362             return SUMO_color_ALLWAY_STOP;
1363         case LINKSTATE_ZIPPER:
1364             return SUMO_color_ZIPPER;
1365         case LINKSTATE_DEADEND:
1366             return SUMO_color_DEADEND;
1367         default:
1368             throw ProcessError("No color defined for LinkState '" + std::string(ls, 1) + "'");
1369     }
1370 }
1371 
1372 double
getTextAngle(double objectAngle) const1373 GUIVisualizationSettings::getTextAngle(double objectAngle) const {
1374     double viewAngle = objectAngle - angle;
1375     while (viewAngle < 0) {
1376         viewAngle += 360;
1377     }
1378     // fmod round towards zero which is not want we want for negative numbers
1379     viewAngle = fmod(viewAngle, 360);
1380     if (viewAngle > 90 && viewAngle < 270) {
1381         // avoid reading text on it's head
1382         objectAngle -= 180;
1383     }
1384     return objectAngle;
1385 }
1386 
1387 /****************************************************************************/
1388 
1389 
1390