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