View Javadoc
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   * Grid10X10.java.
42   * <p>
43   * Copyright (c) 2019-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
44   * BSD-style license. See <a href="https://djunits.org/docs/license.html">DJUNITS License</a>.
45   * <p>
46   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
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      //@formatter:off
55      /** xml heading. */
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     /** xml footer. */
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     //@formatter:on
195 
196     /** number of x/y. */
197     private static final int SIZE = 100;
198 
199     /** spacing. */
200     private static final int SPACING = 50;
201 
202     /**
203      * @param model model
204      * @param panel panel
205      * @throws OTSDrawingException on error
206      */
207     public Grid10X10(final TestXMLModelGrid model, final OTSAnimationPanel panel) throws OTSDrawingException
208     {
209         super(model, panel);
210         // System.out.println("ANIMATEMAP.SIZE = " + this.defaultAnimationFactory.animatedObjects.size());
211     }
212 
213     /** */
214     private DefaultAnimationFactory defaultAnimationFactory;
215 
216     /**
217      * Creates the animation objects. This method is overridable. The default uses {@code DefaultAnimationFactory}.
218      * @throws OTSDrawingException on animation error
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      * @param args args
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         //@formatter:off
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         //@formatter:on
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                     animationPanel.enableSimulationControlButtons();
286                 }
287                 catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException | DSOLException exception)
288                 {
289                     exception.printStackTrace();
290                 }
291             }
292         });
293     }
294 
295     /** {@inheritDoc} */
296     @Override
297     public final String toString()
298     {
299         return "TestXMLParserGrid []";
300     }
301 
302     /**
303      * Model to test the XML parser.
304      * <p>
305      * Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. <br>
306      * All rights reserved. BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim
307      * License</a>.
308      * <p>
309      * $LastChangedDate: 2015-09-14 01:33:02 +0200 (Mon, 14 Sep 2015) $, @version $Revision: 1401 $, by $Author: averbraeck $,
310      * initial version un 27, 2015 <br>
311      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
312      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
313      */
314     static class TestXMLModelGrid extends AbstractOTSModel
315     {
316         /** */
317         private static final long serialVersionUID = 20141121L;
318 
319         /** the network. */
320         private OTSRoadNetwork network;
321 
322         /** the xml string. */
323         private final String xml;
324 
325         /**
326          * @param simulator the simulator
327          * @param xml xml string
328          */
329         TestXMLModelGrid(final OTSSimulatorInterface simulator, final String xml)
330         {
331             super(simulator);
332             this.xml = xml;
333         }
334 
335         /** {@inheritDoc} */
336         @Override
337         public final void constructModel() throws SimRuntimeException
338         {
339 
340             this.network = new OTSRoadNetwork("Grid network", true, getSimulator());
341             try
342             {
343                 ByteArrayInputStream bos = new ByteArrayInputStream(this.xml.getBytes(StandardCharsets.UTF_8));
344                 XmlNetworkLaneParser.build(bos, this.network, true);
345             }
346             catch (NetworkException | ParserConfigurationException | SAXException | OTSGeometryException | JAXBException
347                     | URISyntaxException | XmlParserException | GTUException | IOException | TrafficControlException exception)
348             {
349                 exception.printStackTrace();
350             }
351 
352             for (TrafficLight tl : this.network.getObjectMap(TrafficLight.class).values())
353             {
354                 tl.setTrafficLightColor(TrafficLightColor.GREEN);
355             }
356         }
357 
358         /** {@inheritDoc} */
359         @Override
360         public OTSRoadNetwork getNetwork()
361         {
362             return this.network;
363         }
364 
365         /** {@inheritDoc} */
366         @Override
367         public final String toString()
368         {
369             return "TestXMLModelGrid [simulator=" + this.simulator + "]";
370         }
371 
372         /** {@inheritDoc} */
373         @Override
374         public Serializable getSourceId()
375         {
376             return "TestXMLModelGrid";
377         }
378 
379     }
380 
381 }