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