1 |
1 |
package com.iver.ai2.gvsig3d.map3d.layers;
|
2 |
2 |
|
3 |
3 |
import java.awt.Point;
|
|
4 |
import java.io.File;
|
4 |
5 |
|
5 |
|
import javax.swing.JOptionPane;
|
6 |
|
|
|
6 |
import com.iver.ai2.cache.CacheServiceException;
|
|
7 |
import com.iver.ai2.cache.TileNum;
|
|
8 |
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
|
|
9 |
import com.iver.ai2.gvsig3d.map3d.MapContext3D;
|
7 |
10 |
import com.iver.cit.gvsig.fmap.DriverException;
|
8 |
11 |
import com.iver.cit.gvsig.fmap.MapContext;
|
|
12 |
import com.iver.cit.gvsig.fmap.ViewPort;
|
9 |
13 |
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
|
10 |
14 |
import com.iver.cit.gvsig.fmap.layers.FLayer;
|
|
15 |
import com.iver.cit.gvsig.fmap.layers.FLayers;
|
11 |
16 |
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
|
12 |
|
import com.iver.cit.gvsig.fmap.layers.FLayers;
|
13 |
17 |
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
|
14 |
18 |
import com.iver.cit.gvsig.fmap.layers.LegendListener;
|
15 |
19 |
import com.iver.cit.gvsig.fmap.layers.XMLException;
|
16 |
20 |
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
|
17 |
21 |
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
|
18 |
|
import com.iver.cit.gvsig.fmap.ViewPort;
|
19 |
|
import com.iver.cit.gvsig.project.Project;
|
20 |
22 |
import com.iver.utiles.XMLEntity;
|
21 |
23 |
|
22 |
|
import com.iver.ai2.cache.TileNum;
|
23 |
|
import com.iver.ai2.cache.CacheServiceException;
|
24 |
|
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
|
25 |
|
import com.iver.ai2.gvsig3d.map3d.MapContext3D;
|
26 |
|
|
|
24 |
import es.upv.ai2.libjosg.planets.Planet;
|
27 |
25 |
import es.upv.ai2.libjosg.planets.TileEvent;
|
28 |
26 |
import es.upv.ai2.libjosg.planets.TileListener;
|
29 |
|
import es.upv.ai2.libjosg.planets.Planet;
|
30 |
27 |
import es.upv.ai2.libjosg.viewer.Viewer;
|
31 |
28 |
|
32 |
29 |
public class FLayers3D extends FLayers implements TileListener, LegendListener {
|
... | ... | |
34 |
31 |
// JOSG library objects
|
35 |
32 |
private Planet m_planet;
|
36 |
33 |
private Viewer m_canvas3d;
|
|
34 |
private String m_cacheDir = "c:/data/cache/"; // TEST
|
|
35 |
private boolean m_bSettingLayers = false;
|
37 |
36 |
|
38 |
37 |
/**
|
39 |
38 |
* Constructor that can be used to create a MapContext containing the FLayers3D
|
... | ... | |
54 |
53 |
|
55 |
54 |
public void setPlanet(Planet planet) {
|
56 |
55 |
m_planet = planet;
|
|
56 |
refreshLayersInPlanet();
|
57 |
57 |
}
|
58 |
58 |
|
59 |
59 |
public void setViewer(Viewer viewer) {
|
... | ... | |
65 |
65 |
|
66 |
66 |
protected void callLayerAdded(LayerCollectionEvent event)
|
67 |
67 |
{
|
68 |
|
layerAddedEvent(event);
|
|
68 |
if (!m_bSettingLayers)
|
|
69 |
{
|
|
70 |
FLayer layer = event.getAffectedLayer();
|
|
71 |
layerAddedEvent(layer);
|
|
72 |
}
|
69 |
73 |
super.callLayerAdded(event);
|
70 |
74 |
}
|
71 |
75 |
|
72 |
76 |
protected void callLayerRemoved(LayerCollectionEvent event)
|
73 |
77 |
{
|
74 |
|
layerRemovedEvent(event);
|
|
78 |
FLayer layer = event.getAffectedLayer();
|
|
79 |
layerRemovedEvent(layer);
|
75 |
80 |
super.callLayerRemoved(event);
|
76 |
81 |
}
|
77 |
82 |
|
78 |
|
protected void layerAddedEvent(LayerCollectionEvent e) {
|
|
83 |
protected void layerAddedEvent(FLayer layer) {
|
79 |
84 |
|
80 |
|
FLayer layer = e.getAffectedLayer();
|
81 |
|
|
82 |
85 |
if (layer instanceof Classifiable) {
|
83 |
86 |
Classifiable legendLyr = (Classifiable)layer;
|
84 |
87 |
legendLyr.addLegendListener((LegendListener)this);
|
85 |
88 |
}
|
86 |
89 |
|
87 |
|
if (layer instanceof FLyrDefault) {
|
88 |
|
FLyrDefault baseLayer = (FLyrDefault)layer;
|
89 |
|
if (baseLayer.getProperty("3DLayerExtension") == null) {
|
90 |
|
Layer3DProps props3D = new Layer3DProps();
|
91 |
|
props3D.setLayer(layer);
|
92 |
|
baseLayer.setProperty("3DLayerExtension", props3D);
|
93 |
|
refreshPlanet(props3D);
|
94 |
|
}
|
95 |
|
}
|
|
90 |
Refresh3DProps(layer);
|
96 |
91 |
}
|
97 |
92 |
|
98 |
|
protected void layerRemovedEvent(LayerCollectionEvent e) {
|
|
93 |
protected void layerRemovedEvent(FLayer layer) {
|
99 |
94 |
|
100 |
|
FLayer layer = e.getAffectedLayer();
|
101 |
|
|
102 |
95 |
if (layer instanceof Classifiable) {
|
103 |
96 |
Classifiable legendLyr = (Classifiable)layer;
|
104 |
97 |
legendLyr.removeLegendListener((LegendListener)this);
|
... | ... | |
111 |
104 |
* @param e DOCUMENT ME!
|
112 |
105 |
*/
|
113 |
106 |
public void legendChanged(LegendChangedEvent e) {
|
114 |
|
FLayer lyr = (FLayer)e.getLayer();
|
115 |
|
//Layer3DProps props3D = (Layer3DProps)m_layerProps.get(lyr);
|
116 |
|
refreshPlanet(null /*props3D*/);
|
|
107 |
|
|
108 |
FLyrDefault lyr = (FLyrDefault)e.getLayer();
|
|
109 |
Layer3DProps props3D = (Layer3DProps)lyr.getProperty("3DLayerExtension");
|
|
110 |
props3D.setCacheDirty(true);
|
|
111 |
props3D.setDirty(true);
|
|
112 |
refreshLayerInPlanet(props3D);
|
117 |
113 |
}
|
118 |
114 |
|
119 |
|
protected void refreshPlanet(Layer3DProps props)
|
|
115 |
protected void cleanLayersInPlanet(){
|
|
116 |
// TODO
|
|
117 |
}
|
|
118 |
|
|
119 |
protected void refreshLayersInPlanet() {
|
|
120 |
|
|
121 |
cleanLayersInPlanet();
|
|
122 |
//calculateStages();
|
|
123 |
// TODO: adapt to new layer iterator, when ready
|
|
124 |
for (int iLayer=0; iLayer<layers.size(); iLayer++)
|
|
125 |
{
|
|
126 |
FLayer lyr = (FLayer)layers.get(iLayer);
|
|
127 |
Refresh3DProps(lyr);
|
|
128 |
}
|
|
129 |
}
|
|
130 |
|
|
131 |
protected void Refresh3DProps(FLayer layer) {
|
|
132 |
|
|
133 |
if (layer instanceof FLyrDefault) {
|
|
134 |
Layer3DProps props3D = getLayer3DProps(layer);
|
|
135 |
refreshLayerInPlanet(props3D);
|
|
136 |
}
|
|
137 |
}
|
|
138 |
|
|
139 |
protected Layer3DProps getLayer3DProps(FLayer layer)
|
120 |
140 |
{
|
|
141 |
FLyrDefault baseLayer = (FLyrDefault)layer;
|
|
142 |
Object propsObj = baseLayer.getProperty("3DLayerExtension");
|
|
143 |
Layer3DProps props3D=null;
|
|
144 |
if (propsObj != null)
|
|
145 |
{
|
|
146 |
try {
|
|
147 |
props3D = (Layer3DProps)propsObj;
|
|
148 |
} catch (Exception e) {
|
|
149 |
props3D = null;
|
|
150 |
}
|
|
151 |
}
|
|
152 |
if (props3D == null) {
|
|
153 |
props3D = new Layer3DProps();
|
|
154 |
props3D.setLayer(layer);
|
|
155 |
baseLayer.setProperty("3DLayerExtension", props3D);
|
|
156 |
}
|
|
157 |
else {
|
|
158 |
props3D.setDirty(true); // to be refreshed in planet
|
|
159 |
}
|
|
160 |
return props3D;
|
|
161 |
}
|
|
162 |
|
|
163 |
protected void refreshLayerInPlanet(Layer3DProps props)
|
|
164 |
{
|
|
165 |
if (props==null)
|
|
166 |
return;
|
|
167 |
|
121 |
168 |
if (m_planet == null)
|
122 |
169 |
return; // view not opened yet
|
123 |
170 |
|
124 |
|
boolean isTexture = true;
|
125 |
|
if (isTexture)
|
|
171 |
// clear cache
|
|
172 |
|
|
173 |
if (props.getCacheDirty()) {
|
|
174 |
String layerCacheDir = m_cacheDir + props.getCacheName();
|
|
175 |
removeCache(layerCacheDir);
|
|
176 |
props.setCacheDirty(false);
|
|
177 |
}
|
|
178 |
|
|
179 |
// refresh layer in planet
|
|
180 |
|
|
181 |
if (!props.getDirty())
|
|
182 |
return;
|
|
183 |
|
|
184 |
int type = props.getType();
|
|
185 |
if (type==Layer3DProps.layer3DImage)
|
126 |
186 |
{
|
127 |
|
int stage = 0;
|
|
187 |
int stage = props.getStage();
|
128 |
188 |
m_planet.refreshTextureInfo(stage);
|
129 |
189 |
}
|
130 |
|
else
|
|
190 |
else if (type==Layer3DProps.layer3DElevation)
|
131 |
191 |
m_planet.refreshMDTInfo();
|
|
192 |
|
|
193 |
props.setDirty(false);
|
132 |
194 |
}
|
133 |
195 |
|
|
196 |
private static boolean removeCache(String folder) {
|
|
197 |
File dir = new File(folder);
|
|
198 |
if (dir.isDirectory()) {
|
|
199 |
String[] children = dir.list();
|
|
200 |
for (int i=0; i<children.length; i++) {
|
|
201 |
boolean success = removeCache(folder + "/" + children[i]);
|
|
202 |
if (!success) {
|
|
203 |
return false;
|
|
204 |
}
|
|
205 |
}
|
|
206 |
}
|
|
207 |
|
|
208 |
// The directory is now empty so delete it
|
|
209 |
return dir.delete();
|
|
210 |
}
|
|
211 |
|
134 |
212 |
/**
|
135 |
213 |
* Method of TileListener interface to respond to tile requests
|
136 |
214 |
*
|
... | ... | |
180 |
258 |
new CMSFileRasterService(m_planet.getPlanetName(), rasterFileName);*/
|
181 |
259 |
|
182 |
260 |
FLayerCacheService layerCacheServ =
|
183 |
|
new FLayerCacheService(m_planet.getPlanetName(), "test", lyr);
|
|
261 |
new FLayerCacheService(m_planet.getPlanetName(),
|
|
262 |
getLayer3DProps(lyr).getCacheName(),
|
|
263 |
lyr);
|
|
264 |
layerCacheServ.setCacheRootDir(m_cacheDir);
|
184 |
265 |
|
185 |
266 |
Point tileIndices = new Point(evt.getX(), evt.getY());
|
186 |
267 |
TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
|
... | ... | |
248 |
329 |
* @throws DriverIOException
|
249 |
330 |
*/
|
250 |
331 |
public void setXMLEntity(XMLEntity xml) throws XMLException {
|
|
332 |
m_bSettingLayers = true;
|
251 |
333 |
super.setXMLEntity(xml);
|
|
334 |
m_bSettingLayers = false;
|
252 |
335 |
|
253 |
|
// A?adir cosas de 3D aqu?
|
|
336 |
refreshLayersInPlanet();
|
254 |
337 |
}
|
255 |
338 |
|
256 |
339 |
/**
|
... | ... | |
264 |
347 |
* @throws DriverIOException
|
265 |
348 |
*/
|
266 |
349 |
|
267 |
|
public void setXMLEntity03(XMLEntity xml) throws XMLException {
|
|
350 |
/*public void setXMLEntity03(XMLEntity xml) throws XMLException {
|
268 |
351 |
super.setXMLEntity03(xml);
|
269 |
352 |
|
270 |
353 |
// A?adir cosas de 3D aqu?
|
271 |
|
}
|
|
354 |
}*/
|
272 |
355 |
|
273 |
356 |
}
|