View Javadoc
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   * Grid10X10.java.
38   * <p>
39   * Copyright (c) 2019-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
40   * BSD-style license. See <a href="https://djunits.org/docs/license.html">DJUNITS License</a>.
41   * <p>
42   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
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      //@formatter:off
51      /** xml heading. */
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     /** xml footer. */
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     //@formatter:on
191 
192     /** number of x/y. */
193     private static final int SIZE = 100;
194 
195     /** spacing. */
196     private static final int SPACING = 50;
197 
198     /**
199      * @param model model
200      * @param panel panel
201      * @throws OTSDrawingException on error
202      */
203     public Grid10X10(final TestXMLModelGrid model, final OTSAnimationPanel panel) throws OTSDrawingException
204     {
205         super(model, panel);
206         //System.out.println("ANIMATEMAP.SIZE = " + this.defaultAnimationFactory.animatedObjects.size());
207     }
208 
209     /** */
210     private DefaultAnimationFactory defaultAnimationFactory;
211 
212     /**
213      * Creates the animation objects. This method is overridable. The default uses {@code DefaultAnimationFactory}.
214      * @throws OTSDrawingException on animation error
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      * @param args args
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         //@formatter:off
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         //@formatter:on
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     /** {@inheritDoc} */
291     @Override
292     public final String toString()
293     {
294         return "TestXMLParserGrid []";
295     }
296 
297     /**
298      * Model to test the XML parser.
299      * <p>
300      * Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. <br>
301      * All rights reserved. BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim
302      * License</a>.
303      * <p>
304      * $LastChangedDate: 2015-09-14 01:33:02 +0200 (Mon, 14 Sep 2015) $, @version $Revision: 1401 $, by $Author: averbraeck $,
305      * initial version un 27, 2015 <br>
306      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
307      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
308      */
309     static class TestXMLModelGrid extends AbstractOTSModel
310     {
311         /** */
312         private static final long serialVersionUID = 20141121L;
313 
314         /** the network. */
315         private OTSRoadNetwork network;
316 
317         /** the xml string. */
318         private final String xml;
319 
320         /**
321          * @param simulator the simulator
322          * @param xml xml string
323          */
324         TestXMLModelGrid(final OTSSimulatorInterface simulator, final String xml)
325         {
326             super(simulator);
327             this.xml = xml;
328         }
329 
330         /** {@inheritDoc} */
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         /** {@inheritDoc} */
354         @Override
355         public OTSRoadNetwork getNetwork()
356         {
357             return this.network;
358         }
359 
360         /** {@inheritDoc} */
361         @Override
362         public final String toString()
363         {
364             return "TestXMLModelGrid [simulator=" + this.simulator + "]";
365         }
366 
367     }
368 
369 }