1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.animation.D2;
11
12 import java.awt.Dimension;
13 import java.awt.Graphics2D;
14 import java.awt.geom.Point2D;
15 import java.awt.geom.Rectangle2D;
16 import java.awt.image.BufferedImage;
17 import java.awt.image.ImageObserver;
18 import java.net.URL;
19
20 import javax.media.j3d.Bounds;
21
22 import nl.javel.gisbeans.map.MapInterface;
23 import nl.javel.gisbeans.map.mapfile.MapFileXMLParser;
24 import nl.tudelft.simulation.dsol.animation.LocatableInterface;
25 import nl.tudelft.simulation.dsol.context.ContextUtil;
26 import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
27 import nl.tudelft.simulation.language.d3.BoundingBox;
28 import nl.tudelft.simulation.language.d3.DirectedPoint;
29 import nl.tudelft.simulation.language.d3.CartesianPoint;
30 import nl.tudelft.simulation.logger.Logger;
31
32 /***
33 * This renderable draws CAD/GIS objects.
34 * <p>
35 * (c) copyright 2003 <a href="http://www.simulation.tudelft.nl">Delft
36 * University of Technology </a>, the Netherlands. <br>
37 * See for project information <a
38 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
39 * License of use: <a href="http://www.gnu.org/copyleft/gpl.html">General Public
40 * License (GPL) </a>, no warranty <br>
41 *
42 * @author <a href="http://www.tbm.tudelft.nl/webstaf/peterja/index.htm">Peter
43 * Jacobs </a>
44 * @version 1.2 Apr 29, 2004
45 * @since 1.4
46 */
47 public class GisRenderable2D implements Renderable2DInterface,
48 LocatableInterface
49 {
50 /*** the map to display */
51 protected MapInterface map = null;
52
53 /*** the image cached image */
54 protected BufferedImage image = null;
55
56 /*** the cached extent */
57 protected Rectangle2D extent = new Rectangle2D.Double();
58
59 /*** the cached screenSize */
60 protected Dimension screenSize = new Dimension();
61
62 /*** the location of the image */
63 protected DirectedPoint location = null;
64
65 /*** the bounds of the image */
66 protected Bounds bounds = null;
67
68 /***
69 * constructs a new GisRenderable2D
70 *
71 * @param simulator the simulator.
72 * @param mapFile the mapfile to use.
73 */
74 public GisRenderable2D(final SimulatorInterface simulator, final URL mapFile)
75 {
76 super();
77 try
78 {
79 this.map = MapFileXMLParser.parseMapFile(mapFile);
80 this.location = new DirectedPoint(new CartesianPoint(this.extent.getCenterX(),
81 this.extent.getCenterY(), -Double.MIN_VALUE));
82 this.bounds = new BoundingBox(this.extent.getWidth(), this.extent
83 .getHeight(), 0.0);
84 simulator.getReplication().getRunControl().getTreatment()
85 .getProperties().put("animationPanel.extent",
86 this.map.getExtent());
87 ContextUtil.bindToContext(simulator, "/animation/2D", this);
88 } catch (Exception exception)
89 {
90 Logger.warning(this, "<init>", exception);
91 }
92 }
93
94 /***
95 * @see nl.tudelft.simulation.dsol.animation.D2.Renderable2DInterface
96 * #paint(java.awt.Graphics2D, java.awt.geom.Rectangle2D,
97 * java.awt.Dimension, java.awt.image.ImageObserver)
98 */
99 public void paint(final Graphics2D graphics, final Rectangle2D extent,
100 final Dimension screen, final ImageObserver observer)
101 {
102 try
103 {
104
105 if (extent.equals(this.extent) && screen.equals(this.screenSize))
106 {
107 graphics.drawImage(this.image, 0, 0, null);
108 return;
109 }
110 this.map.setExtent((Rectangle2D) extent.clone());
111 this.map.getImage().setSize(screen);
112 this.cacheImage();
113 this.paint(graphics, extent, screen, observer);
114 } catch (Exception exception)
115 {
116 Logger.warning(this, "paint", exception);
117 }
118 }
119
120 /***
121 * @see nl.tudelft.simulation.dsol.animation.D2.Renderable2DInterface#getSource()
122 */
123 public LocatableInterface getSource()
124 {
125 return this;
126 }
127
128 /***
129 * @see nl.tudelft.simulation.dsol.animation.LocatableInterface#getBounds()
130 */
131 public Bounds getBounds()
132 {
133 return this.bounds;
134 }
135
136 /***
137 * @see nl.tudelft.simulation.dsol.animation.LocatableInterface#getLocation()
138 */
139 public DirectedPoint getLocation()
140 {
141 return this.location;
142 }
143
144 /***
145 * caches the GIS map by creating an image. This prevents continuous
146 * rendering.
147 *
148 * @throws Exception on graphicsProblems and network connection failures.
149 */
150 private void cacheImage() throws Exception
151 {
152 this.image = new BufferedImage((int) this.map.getImage().getSize()
153 .getWidth(), (int) this.map.getImage().getSize().getHeight(),
154 BufferedImage.TYPE_4BYTE_ABGR);
155 Graphics2D bg = this.image.createGraphics();
156 this.map.drawMap(bg);
157 bg.dispose();
158 this.screenSize = (Dimension) this.map.getImage().getSize().clone();
159 this.extent = this.map.getExtent();
160 this.location = new DirectedPoint(new CartesianPoint(this.extent.getCenterX(),
161 this.extent.getCenterY(), -Double.MIN_VALUE));
162 this.bounds = new BoundingBox(this.extent.getWidth(), this.extent
163 .getHeight(), 0.0);
164 }
165
166 /***
167 * destroys an RenderableObject by unsubscribing it from the context.
168 */
169 public void destroy()
170 {
171 try
172 {
173 nl.tudelft.simulation.naming.context.ContextUtil
174 .unbindFromContext(this);
175 } catch (Throwable throwable)
176 {
177 Logger.warning(this, "finalize", throwable);
178 }
179 }
180
181 /***
182 * @see nl.tudelft.simulation.dsol.animation.D2.Renderable2DInterface#contains(java.awt.geom.Point2D,
183 * java.awt.geom.Rectangle2D, java.awt.Dimension)
184 */
185 public boolean contains(final Point2D pointWorldCoordinates,
186 final Rectangle2D extent, final Dimension screen)
187 {
188 return false;
189 }
190 }