1 package org.opentrafficsim.demo.network.xml;
2
3 import java.awt.Dimension;
4 import java.io.ByteArrayInputStream;
5 import java.io.IOException;
6 import java.io.Serializable;
7 import java.net.URISyntaxException;
8 import java.nio.charset.StandardCharsets;
9 import java.rmi.RemoteException;
10
11 import javax.naming.NamingException;
12 import javax.swing.SwingUtilities;
13 import javax.xml.bind.JAXBException;
14 import javax.xml.parsers.ParserConfigurationException;
15
16 import org.djunits.value.vdouble.scalar.Duration;
17 import org.djunits.value.vdouble.scalar.Time;
18 import org.opentrafficsim.core.dsol.AbstractOTSModel;
19 import org.opentrafficsim.core.dsol.OTSAnimator;
20 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
21 import org.opentrafficsim.core.geometry.OTSGeometryException;
22 import org.opentrafficsim.core.gtu.GTUException;
23 import org.opentrafficsim.core.network.NetworkException;
24 import org.opentrafficsim.demo.network.xml.Grid10X10.TestXMLModelGrid;
25 import org.opentrafficsim.draw.core.OTSDrawingException;
26 import org.opentrafficsim.draw.factory.DefaultAnimationFactory;
27 import org.opentrafficsim.road.network.OTSRoadNetwork;
28 import org.opentrafficsim.road.network.factory.xml.XmlParserException;
29 import org.opentrafficsim.road.network.factory.xml.parser.XmlNetworkLaneParser;
30 import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLight;
31 import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLightColor;
32 import org.opentrafficsim.swing.gui.OTSAnimationPanel;
33 import org.opentrafficsim.swing.gui.OTSSimulationApplication;
34 import org.opentrafficsim.trafficcontrol.TrafficControlException;
35 import org.xml.sax.SAXException;
36
37 import nl.tudelft.simulation.dsol.SimRuntimeException;
38 import nl.tudelft.simulation.language.DSOLException;
39
40
41
42
43
44
45
46
47
48 @SuppressWarnings({"checkstyle:operatorwrap", "checkstyle:linelength"})
49 public class Grid10X10 extends OTSSimulationApplication<TestXMLModelGrid>
50 {
51
52 private static final long serialVersionUID = 1L;
53
54
55
56 private static final String XML_HEADER = "<?xml version='1.0' encoding='UTF-8'?>\r\n" +
57 "<OTS xmlns=\"http://www.opentrafficsim.org/ots\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" +
58 " xsi:schemaLocation=\"http://www.opentrafficsim.org/ots ../../../../../ots-xsd/src/main/resources/xsd/1.03.00/ots.xsd\"\r\n" +
59 " xmlns:xi=\"http://www.w3.org/2001/XInclude\">\r\n" +
60 "\r\n" +
61 " <DEFINITIONS>\r\n" +
62 " <xi:include href=\"https://opentrafficsim.org/docs/xsd/1.03.00/defaults/default_gtutypes.xml\">\r\n" +
63 " <xi:fallback>\r\n" +
64 " <xi:include href=\"../xsd/1.03.00/defaults/default_gtutypes.xml\">\r\n" +
65 " <xi:fallback>\r\n" +
66 " <xi:include href=\"xsd/1.03.00/defaults/default_gtutypes.xml\" />\r\n" +
67 " </xi:fallback>\r\n" +
68 " </xi:include>\r\n" +
69 " </xi:fallback>\r\n" +
70 " </xi:include>\r\n" +
71 " \r\n" +
72 " <xi:include href=\"https://opentrafficsim.org/docs/xsd/1.03.00/defaults/default_linktypes.xml\">\r\n" +
73 " <xi:fallback>\r\n" +
74 " <xi:include href=\"../xsd/1.03.00/defaults/default_linktypes.xml\">\r\n" +
75 " <xi:fallback>\r\n" +
76 " <xi:include href=\"xsd/1.03.00/defaults/default_linktypes.xml\" />\r\n" +
77 " </xi:fallback>\r\n" +
78 " </xi:include>\r\n" +
79 " </xi:fallback>\r\n" +
80 " </xi:include>\r\n" +
81 "\r\n" +
82 " <xi:include href=\"https://opentrafficsim.org/docs/xsd/1.03.00/defaults/default_lanetypes.xml\">\r\n" +
83 " <xi:fallback>\r\n" +
84 " <xi:include href=\"../xsd/1.03.00/defaults/default_lanetypes.xml\">\r\n" +
85 " <xi:fallback>\r\n" +
86 " <xi:include href=\"xsd/1.03.00/defaults/default_lanetypes.xml\" />\r\n" +
87 " </xi:fallback>\r\n" +
88 " </xi:include>\r\n" +
89 " </xi:fallback>\r\n" +
90 " </xi:include>\r\n" +
91 "\r\n" +
92 " <xi:include href=\"https://opentrafficsim.org/docs/xsd/1.03.00/defaults/default_gtutemplates.xml\">\r\n" +
93 " <xi:fallback>\r\n" +
94 " <xi:include href=\"../xsd/1.03.00/defaults/default_gtutemplates.xml\">\r\n" +
95 " <xi:fallback>\r\n" +
96 " <xi:include href=\"xsd/1.03.00/defaults/default_gtutemplates.xml\" />\r\n" +
97 " </xi:fallback>\r\n" +
98 " </xi:include>\r\n" +
99 " </xi:fallback>\r\n" +
100 " </xi:include>\r\n" +
101 "\r\n" +
102 " <LANETYPES>\r\n" +
103 " <LANETYPE ID=\"STREET\">\r\n" +
104 " <COMPATIBILITY GTUTYPE=\"ROAD_USER\" DIRECTION=\"FORWARD\" />\r\n" +
105 " </LANETYPE>\r\n" +
106 " </LANETYPES>\r\n" +
107 "\r\n" +
108 " <GTUTYPES>\r\n" +
109 " <!-- <GTUTYPE PARENT=\"ROAD_USER\" ID=\"CAR\" /> <GTUTYPE PARENT=\"ROAD_USER\" ID=\"TRUCK\" /> -->\r\n" +
110 " </GTUTYPES>\r\n" +
111 "\r\n" +
112 " <GTUTEMPLATES>\r\n" +
113 " <GTUTEMPLATE GTUTYPE=\"CAR\" ID=\"CARS\">\r\n" +
114 " <LENGTHDIST LENGTHUNIT=\"m\">\r\n" +
115 " <UNIFORM MIN=\"4\" MAX=\"7\" />\r\n" +
116 " </LENGTHDIST>\r\n" +
117 " <WIDTHDIST LENGTHUNIT=\"m\">\r\n" +
118 " <UNIFORM MIN=\"1.7\" MAX=\"2\" />\r\n" +
119 " </WIDTHDIST>\r\n" +
120 " <MAXSPEEDDIST SPEEDUNIT=\"km/h\">\r\n" +
121 " <CONSTANT C=\"120\" />\r\n" +
122 " </MAXSPEEDDIST>\r\n" +
123 " </GTUTEMPLATE>\r\n" +
124 " <GTUTEMPLATE GTUTYPE=\"TRUCK\" ID=\"TRUCKS\">\r\n" +
125 " <LENGTHDIST LENGTHUNIT=\"m\">\r\n" +
126 " <UNIFORM MIN=\"16\" MAX=\"24\" />\r\n" +
127 " </LENGTHDIST>\r\n" +
128 " <WIDTHDIST LENGTHUNIT=\"m\">\r\n" +
129 " <UNIFORM MIN=\"2.2\" MAX=\"2.7\" />\r\n" +
130 " </WIDTHDIST>\r\n" +
131 " <MAXSPEEDDIST SPEEDUNIT=\"km/h\">\r\n" +
132 " <CONSTANT C=\"100\" />\r\n" +
133 " </MAXSPEEDDIST>\r\n" +
134 "\r\n" +
135 " </GTUTEMPLATE>\r\n" +
136 " </GTUTEMPLATES>\r\n" +
137 "\r\n" +
138 " <LINKTYPES>\r\n" +
139 " <LINKTYPE ID=\"STREET\">\r\n" +
140 " <COMPATIBILITY GTUTYPE=\"ROAD_USER\" DIRECTION=\"FORWARD\" />\r\n" +
141 " </LINKTYPE>\r\n" +
142 " </LINKTYPES>\r\n" +
143 "\r\n" +
144 " <ROADLAYOUTS>\r\n" +
145 " <ROADLAYOUT ID=\"r1\" LINKTYPE=\"STREET\">\r\n" +
146 " <SHOULDER>\r\n" +
147 " <WIDTH>2m</WIDTH>\r\n" +
148 " </SHOULDER>\r\n" +
149 " <STRIPE TYPE=\"SOLID\">\r\n" +
150 " </STRIPE>\r\n" +
151 " <LANE ID=\"FORWARD3\" LANETYPE=\"STREET\" DESIGNDIRECTION=\"true\">\r\n" +
152 " <WIDTH>3.3m</WIDTH>\r\n" +
153 " <SPEEDLIMIT GTUTYPE=\"CAR\" LEGALSPEEDLIMIT=\"50 km/h\"></SPEEDLIMIT>\r\n" +
154 " </LANE>\r\n" +
155 " <STRIPE TYPE=\"DASHED\">\r\n" +
156 " </STRIPE>\r\n" +
157 " <LANE ID=\"FORWARD2\" LANETYPE=\"STREET\" DESIGNDIRECTION=\"true\">\r\n" +
158 " <CENTEROFFSET>-6.2m</CENTEROFFSET>\r\n" +
159 " <WIDTH>3.3m</WIDTH>\r\n" +
160 " <SPEEDLIMIT GTUTYPE=\"CAR\" LEGALSPEEDLIMIT=\"50 km/h\"></SPEEDLIMIT>\r\n" +
161 " </LANE>\r\n" +
162 " <STRIPE TYPE=\"DASHED\">\r\n" +
163 " </STRIPE>\r\n" +
164 " <LANE ID=\"FORWARD1\" LANETYPE=\"STREET\" DESIGNDIRECTION=\"true\">\r\n" +
165 " <WIDTH>3.3m</WIDTH>\r\n" +
166 " <SPEEDLIMIT GTUTYPE=\"CAR\" LEGALSPEEDLIMIT=\"50 km/h\"></SPEEDLIMIT>\r\n" +
167 " </LANE>\r\n" +
168 " <STRIPE TYPE=\"SOLID\">\r\n" +
169 " </STRIPE>\r\n" +
170 " </ROADLAYOUT>\r\n" +
171 " </ROADLAYOUTS>\r\n" +
172 " </DEFINITIONS>\r\n";
173
174
175 private static final String XML_FOOTER = " <CONTROL>\r\n" +
176 " </CONTROL>\r\n" +
177 " <MODEL />\r\n" +
178 " <SCENARIO />\r\n" +
179 " <RUN>\r\n" +
180 " <RUNLENGTH>3600s</RUNLENGTH>\r\n" +
181 " <NUMBERREPLICATIONS>1</NUMBERREPLICATIONS>\r\n" +
182 " <RANDOMSTREAMS>\r\n" +
183 " <RANDOMSTREAM ID=\"default\">\r\n" +
184 " <REPLICATION SEED=\"1\" ID=\"1\" />\r\n" +
185 " </RANDOMSTREAM>\r\n" +
186 " <RANDOMSTREAM ID=\"generation\">\r\n" +
187 " <REPLICATION SEED=\"1\" ID=\"1\" />\r\n" +
188 " </RANDOMSTREAM>\r\n" +
189 " </RANDOMSTREAMS>\r\n" +
190 " </RUN>\r\n" +
191 "\r\n" +
192 "</OTS>\r\n";
193
194
195
196
197 private static final int SIZE = 100;
198
199
200 private static final int SPACING = 50;
201
202
203
204
205
206
207 public Grid10X10(final TestXMLModelGrid model, final OTSAnimationPanel panel) throws OTSDrawingException
208 {
209 super(model, panel);
210
211 }
212
213
214 private DefaultAnimationFactory defaultAnimationFactory;
215
216
217
218
219
220 @Override
221 protected void animateNetwork() throws OTSDrawingException
222 {
223 this.defaultAnimationFactory = DefaultAnimationFactory.animateNetwork(getModel().getNetwork(),
224 getModel().getSimulator(), getAnimationPanel().getGTUColorer());
225 }
226
227
228
229
230 public static void main(final String[] args)
231 {
232 StringBuilder xml = new StringBuilder();
233 xml.append(XML_HEADER);
234 xml.append("<NETWORK>\n");
235 for (int x = 0; x < SIZE; x++)
236 {
237 xml.append(String.format(" <NODE ID=\"N%d\" COORDINATE=\"(%d,%d)\" DIRECTION=\"90 deg(E)\" />\n", x,
238 SPACING * x + SPACING / 2, 0));
239 xml.append(String.format(" <NODE ID=\"S%d\" COORDINATE=\"(%d,%d)\" DIRECTION=\"90 deg(E)\" />\n", x,
240 SPACING * x + SPACING / 2, SIZE * SPACING));
241 }
242 for (int y = 0; y < SIZE; y++)
243 {
244 xml.append(String.format(" <NODE ID=\"W%d\" COORDINATE=\"(%d,%d)\" DIRECTION=\"0 deg(E)\" />\n", y, 0,
245 SPACING * y + SPACING / 2));
246 xml.append(String.format(" <NODE ID=\"E%d\" COORDINATE=\"(%d,%d)\" DIRECTION=\"0 deg(E)\" />\n", y, SIZE * SPACING,
247 SPACING * y + SPACING / 2));
248 }
249
250
251 final String link =
252 " <LINK ID=\"%s\" NODESTART=\"%s\" NODEEND=\"%s\" TYPE=\"STREET\">\r\n" +
253 " <STRAIGHT />\r\n" +
254 " <DEFINEDLAYOUT>r1</DEFINEDLAYOUT>\r\n" +
255 " </LINK>\r\n";
256
257
258 for (int x = 0; x < SIZE; x++)
259 {
260 xml.append(String.format(link, "NS" + x, "N" + x, "S" + x));
261 }
262 for (int y = 0; y < SIZE; y++)
263 {
264 xml.append(String.format(link, "WE" + y, "W" + y, "E" + y));
265 }
266
267 xml.append("</NETWORK>\n<NETWORKDEMAND />\n");
268 xml.append(XML_FOOTER);
269
270 System.out.println(xml.toString());
271
272 SwingUtilities.invokeLater(new Runnable()
273 {
274 @Override
275 public void run()
276 {
277 try
278 {
279 OTSAnimator simulator = new OTSAnimator("Grid10X10");
280 TestXMLModelGrid xmlModel = new TestXMLModelGrid(simulator, xml.toString());
281 simulator.initialize(Time.ZERO, Duration.ZERO, Duration.instantiateSI(3600.0), xmlModel);
282 OTSAnimationPanel animationPanel = new OTSAnimationPanel(xmlModel.getNetwork().getExtent(),
283 new Dimension(800, 600), simulator, xmlModel, DEFAULT_COLORER, xmlModel.getNetwork());
284 new Grid10X10(xmlModel, animationPanel);
285 }
286 catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException | DSOLException exception)
287 {
288 exception.printStackTrace();
289 }
290 }
291 });
292 }
293
294
295 @Override
296 public final String toString()
297 {
298 return "TestXMLParserGrid []";
299 }
300
301
302
303
304
305
306
307
308
309
310
311
312
313 static class TestXMLModelGrid extends AbstractOTSModel
314 {
315
316 private static final long serialVersionUID = 20141121L;
317
318
319 private OTSRoadNetwork network;
320
321
322 private final String xml;
323
324
325
326
327
328 TestXMLModelGrid(final OTSSimulatorInterface simulator, final String xml)
329 {
330 super(simulator);
331 this.xml = xml;
332 }
333
334
335 @Override
336 public final void constructModel() throws SimRuntimeException
337 {
338
339 this.network = new OTSRoadNetwork("Grid network", true, getSimulator());
340 try
341 {
342 ByteArrayInputStream bos = new ByteArrayInputStream(this.xml.getBytes(StandardCharsets.UTF_8));
343 XmlNetworkLaneParser.build(bos, this.network, true);
344 }
345 catch (NetworkException | ParserConfigurationException | SAXException | OTSGeometryException | JAXBException
346 | URISyntaxException | XmlParserException | GTUException | IOException | TrafficControlException exception)
347 {
348 exception.printStackTrace();
349 }
350
351 for (TrafficLight tl : this.network.getObjectMap(TrafficLight.class).values())
352 {
353 tl.setTrafficLightColor(TrafficLightColor.GREEN);
354 }
355 }
356
357
358 @Override
359 public OTSRoadNetwork getNetwork()
360 {
361 return this.network;
362 }
363
364
365 @Override
366 public final String toString()
367 {
368 return "TestXMLModelGrid [simulator=" + this.simulator + "]";
369 }
370
371
372 @Override
373 public Serializable getSourceId()
374 {
375 return "TestXMLModelGrid";
376 }
377
378 }
379
380 }