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