Revision 398
2.1/trunk/doc/Fase 1/dt-visor-3d.rst | ||
---|---|---|
1 |
================================================================= |
|
2 |
Visor 3D básico que integra Nasa WW SDK |
|
3 |
================================================================= |
|
4 |
|
|
5 |
------------------- |
|
6 |
Diseño técnico |
|
7 |
------------------- |
|
8 |
|
|
9 |
:Company: gvSIG Association |
|
10 |
:Author: DiSiD Corporation, S.L. |
|
11 |
:Revision: $Rev: $ |
|
12 |
:Date: $Date: $ |
|
13 |
:Copyright: All rigths reserved |
|
14 |
|
|
15 |
.. contents:: |
|
16 |
:depth: 2 |
|
17 |
:backlinks: none |
|
18 |
|
|
19 |
.. sectnum:: |
|
20 |
:depth: 2 |
|
21 |
:start: 1 |
|
22 |
|
|
23 |
.. |year| date:: %Y |
|
24 |
|
|
25 |
.. header:: |
|
26 |
|
|
27 |
.. class:: headertable |
|
28 |
|
|
29 |
+-----------------------+-------------------------+ |
|
30 |
|.. class:: left |.. class:: right | |
|
31 |
| | | |
|
32 |
| Diseño técnico |###Page### | |
|
33 |
+-----------------------+-------------------------+ |
|
34 |
|
|
35 |
|
|
36 |
.. footer:: |
|
37 |
|
|
38 |
.. include:: <isonum.txt> |
|
39 |
|
|
40 |
.. class:: left |
|
41 |
|
|
42 |
*Visor 3D básico que integra Nasa WW SDK - Diseño técnico* |
|
43 |
|
|
44 |
|copy| |year| ** |
|
45 |
|
|
46 |
|
|
47 |
Introducción |
|
48 |
============= |
|
49 |
|
|
50 |
Este documento detalla el diseño técnico del nuevo visor 3D basado en la librería NASA WW SDK para gvSIG 2.1+. Para más información consulte: |
|
51 |
|
|
52 |
* http://worldwind.arc.nasa.gov/java/ |
|
53 |
* http://goworldwind.org/ |
|
54 |
|
|
55 |
El diseño técnico tendrá en cuenta el análisis de requisitos y el análisis funcional realizados. En primer lugar se detallarán el API y las implementaciones de los diferentes módulos del proyecto. |
|
56 |
|
|
57 |
Diseño técnico |
|
58 |
===================== |
|
59 |
|
|
60 |
Para tener un poco del contexto del diseño técnico, se expone como debería de funcionar de forma resumida el visor 3D. Seguidamente se detallará el API e implementación de la librería y las extensiones del plugin. |
|
61 |
|
|
62 |
Ejemplo de casos de uso |
|
63 |
------------------------------- |
|
64 |
|
|
65 |
A partir de una vista 2D, se desea representar la información cargada en la vista de forma tridimensional. Para ello, el usuario dispondrá de dos entradas de menú / botones para crear los dos tipos de visores: esférico y plano (View3DExtension, una única extensión para dos acciones). Al pulsar sobre uno de los botones, el plugin accederá a la información de la vista activa mediante la obtención del MapControl y la servirá a la librería NASA WW SDK mediante View3DModel#add(FLayer layer). El modelo obtendrá la capa equivalente mediante el View3DManager#getWWLayer(FLayer, loadMode) y la añadirá a un objeto gov.nasa.worldwind.Model. Cuando todas las capas han sido añadidas, se creará el visor mediante View3DSwingManager#createView3DPanel(MapControl, model). |
|
66 |
|
|
67 |
Además de las dos extensiones para la creación de visores, el usuario también dispondrá de una extensión llamada RefreshView3DExtension para la actualización de los datos del visor activo con los posibles cambios efectuados sobre la vista 2D. La extensión ejecutará el método View3DPanel#reloadLayers(). |
|
68 |
|
|
69 |
Y finalmente, existirá una última extensión llamada SynchronizeView3DExtension que permitirá al usuario sincronizar los enfoques de la vista 2D y el visor 3D asociado a la vista. Se accederá al ViewPort del MapControl asociado para sincronizarlo con el enfoque del visor 3D. |
|
70 |
|
|
71 |
LIB API |
|
72 |
-------- |
|
73 |
|
|
74 |
.. note:: |
|
75 |
Los métodos deben lanzar excepciones hacia el nivel más alto de la librería. Como no esta definido el API de excepciones no indico que tipo de excepciones pueden lanzar los métodos. |
|
76 |
|
|
77 |
Este es el API de la librería del visor 3D, la cual esta basada en el modelo de implementación simple API/IMPL. |
|
78 |
|
|
79 |
* Project: org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.api |
|
80 |
* Package: or.gvsig.view3d.lib.api |
|
81 |
|
|
82 |
View3DManager |
|
83 |
********************************************* |
|
84 |
|
|
85 |
Proveerá las siguientes operaciones: |
|
86 |
|
|
87 |
* getWWLayer(FLayer layer, int loadMode) : gov.nasa.worldwind.layers.Layer |
|
88 |
|
|
89 |
A partir de una capa de gvSIG y un modo de carga se obtiene una capa nativa de la librería World Wind. Existen 4 modos de carga: raster imagen, raster elevación, vectorial rasterizada y vectorial 3d. Dependiendo del modo de carga se obtendrá una capa nativa u otra. |
|
90 |
|
|
91 |
|
|
92 |
DataReader |
|
93 |
********************************************* |
|
94 |
|
|
95 |
Proveerá las siguientes operaciones: |
|
96 |
|
|
97 |
* canRead(Object sourceFile) : boolean |
|
98 |
|
|
99 |
Determina si la fuente de datos se puede acceder o no. Puede recibir como parámetro un objeto del tipo File, java.net.URL, String o java.io.InputStream. |
|
100 |
|
|
101 |
* read(Object sourceFile) : gov.nasa.worldwind.layers.Layer |
|
102 |
|
|
103 |
A partir de una fuente de datos crea una capa gov.nasa.worldwind.layers.Layer. |
|
104 |
|
|
105 |
|
|
106 |
SWING API |
|
107 |
---------- |
|
108 |
|
|
109 |
Este es el API de la interfaz de usuario de la librería del visor 3D, la cual esta basada en el modelo de implementación simple API/IMPL. |
|
110 |
|
|
111 |
* Project: org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.api |
|
112 |
* Package: or.gvsig.view3d.swing.api |
|
113 |
|
|
114 |
View3DSwingManager |
|
115 |
******************** |
|
116 |
|
|
117 |
* createView3DModel(int mode) : View3DModel |
|
118 |
|
|
119 |
Crea un modelo a partir del modo. El modo puede tener dos valores: View3dModel.SPHERE y View3DModel.FLAT. El método configura todo lo necesario en la librería NASA WW SDK para la creación de un visor según el modo. |
|
120 |
|
|
121 |
* createView3DModel(int mode, FLayers layers) : View3DModel |
|
122 |
|
|
123 |
Crea un modelo a partir del modo. El modo puede tener dos valores: View3dModel.SPHERE y View3DModel.FLAT. El método configura todo lo necesario en la librería NASA WW SDK para la creación de un visor según el modo. Además recorre la colección de layers y las añade al modelo creado. |
|
124 |
|
|
125 |
* createView3DPanel(MapControl theMapControl, View3DModel theModel) : View3DPanel |
|
126 |
|
|
127 |
Crea un panel con el componente para dibujar la información en 3D a partir de un MapControl y un modelo. |
|
128 |
|
|
129 |
View3DPanel extends JPanel |
|
130 |
**************************** |
|
131 |
|
|
132 |
Clase abstracta que extiende de JPanel. Como JPanel no tiene una interfaz definida, crearemos una clase abstracta que implementará la vista del visor (tamaño, inicialización de componentes...) y definirá el API de nuestro componente. Se añadirá los siguientes métodos definidos pero sin implementarlos. |
|
133 |
|
|
134 |
* getMapControl() : MapControl |
|
135 |
|
|
136 |
Obtiene el mapControl asociado al panel. Del mapControl asociado se extrae la información necesaria para la representación de los datos en 3D y la sincronización de enfoques. |
|
137 |
|
|
138 |
* getModel() : View3DModel |
|
139 |
|
|
140 |
Obtiene el modelo del visor. |
|
141 |
|
|
142 |
* getVerticalExaggeration() : double |
|
143 |
|
|
144 |
Obtiene la exageración vertical del visor. |
|
145 |
|
|
146 |
* reloadLayers() : void |
|
147 |
|
|
148 |
Elimina las capas del modelo de la vista. Accede al MapControl asociado al visor y carga de nuevo las capas. Se usa para actualizar el visor con los posibles cambios realizados sobre la vista 2D. |
|
149 |
|
|
150 |
* setMapControl(MapControl theMapControl) : void |
|
151 |
|
|
152 |
Establece el mapControl al visor. |
|
153 |
|
|
154 |
* setVerticalExaggeration(double verticalExaggeration) : void |
|
155 |
|
|
156 |
Establece las exageración vertical del visor. |
|
157 |
|
|
158 |
* show() : void |
|
159 |
|
|
160 |
Muestra el visor. |
|
161 |
|
|
162 |
* showAtmosphere() : void |
|
163 |
|
|
164 |
Muestra la atmósfera si el visor es esférico. |
|
165 |
|
|
166 |
* showNortIndicator() : void |
|
167 |
|
|
168 |
Muestra el indicador del norte. |
|
169 |
|
|
170 |
* showMiniMap() : void |
|
171 |
|
|
172 |
Muestra el minimapa. |
|
173 |
|
|
174 |
* showScale() : void |
|
175 |
|
|
176 |
Muestra la escala de la capa. |
|
177 |
|
|
178 |
* showStarBackgroundLayer() : void |
|
179 |
|
|
180 |
Muestra el fondo de estrellas. |
|
181 |
|
|
182 |
* hideAtmosphere() : void |
|
183 |
|
|
184 |
Oculta la atmósfera en visores esféricos. |
|
185 |
|
|
186 |
* hideMiniMap() : void |
|
187 |
|
|
188 |
Oculta el minimapa. |
|
189 |
|
|
190 |
* hideStarBackgroundLayer() : void |
|
191 |
|
|
192 |
Oculta el fondo de estrellas. |
|
193 |
|
|
194 |
* hideNorthIndicator() : void |
|
195 |
|
|
196 |
Oculta el indicador del norte. |
|
197 |
|
|
198 |
* hideScale() : void |
|
199 |
|
|
200 |
Oculta la escala del mapa. |
|
201 |
|
|
202 |
* synchronizeViewPorts() : void |
|
203 |
|
|
204 |
Sincroniza el viewPort de la vista 2D enlazada al visor con el enfoque del visor 3D. |
|
205 |
|
|
206 |
View3DModel |
|
207 |
************** |
|
208 |
|
|
209 |
* add(FLayer layer) : void |
|
210 |
|
|
211 |
A partir de la capa que recibe como parámetro, obtiene la capa equivalente en la librería World Wind y la añade al modelo. |
|
212 |
|
|
213 |
* add(FLayers layers) : void |
|
214 |
|
|
215 |
A partir de la colección de capas, obtiene las capas equivalentes en la librería World Wind y las añade al modelo respetando el orden. |
|
216 |
|
|
217 |
* remove(FLayer layer) : void |
|
218 |
|
|
219 |
Elimina del modelo la capa equivalente de la recibida como parámetro. |
|
220 |
|
|
221 |
* removeAll() : void |
|
222 |
|
|
223 |
Elimina todas las capas del modelo. |
|
224 |
|
|
225 |
LIB IMPL |
|
226 |
---------- |
|
227 |
|
|
228 |
DefaultView3DManager implements View3dManager |
|
229 |
**************************************************** |
|
230 |
|
|
231 |
Implementación por defecto del manager View3DManager |
|
232 |
|
|
233 |
DefaultVectorialDataReader implements DataReader |
|
234 |
************************************************* |
|
235 |
|
|
236 |
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo vectorial. |
|
237 |
|
|
238 |
DefaultRasterDataReader implements DataReader |
|
239 |
************************************************ |
|
240 |
|
|
241 |
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo raster. |
|
242 |
|
|
243 |
DefaultElevationDataReader implements DataReader |
|
244 |
************************************************ |
|
245 |
|
|
246 |
Implementación por defecto de la interfaz DataReader. Esta implementación se debe usar para acceder cuando la fuente de datos sea de tipo raster y el modo de carga elevación. |
|
247 |
|
|
248 |
|
|
249 |
SWING IMPL |
|
250 |
-------------- |
|
251 |
|
|
252 |
DefaultView3DSwingManager implements View3DSwingManager |
|
253 |
******************************************************** |
|
254 |
|
|
255 |
Implementación por defecto del manager View3DSwingManager |
|
256 |
|
|
257 |
DefaultView3DModel implements View3DModel |
|
258 |
****************************************** |
|
259 |
|
|
260 |
Implementación por defecto de la clase View3DModel |
|
261 |
|
|
262 |
DefaultView3DPanel extends View3DPanel |
|
263 |
*************************************************** |
|
264 |
|
|
265 |
Implementación por defecto de los métodos descritos en la clase abstracta View3DPanel |
|
266 |
|
|
267 |
View3D Plugin |
|
268 |
---------------- |
|
269 |
|
|
270 |
Plugin principal de la librería. Estará compuesto por tres extensiones: View3DExtension, RefreshView3DExtension y SynchronizeView3DExtension. Además, gestionará la persistencia de las opciones establecidas por el usuario. El plugin registrará las acciones mediante el config.xml y creará el instalable con los archivos JARs. |
|
271 |
|
|
272 |
View3DExtension |
|
273 |
************************ |
|
274 |
|
|
275 |
Extensión de Andami asociada a dos acciones: "create-flat-view3d" y "create-spherical-view3d". Esta extensión deberá estar siempre visible y activa solo cuando se active una vista 2D con un capa o más. Las dos acciones obtendrán la instancia del View3DSwingManager, crearán el modelo, añadirán las capas de la vista activa, crearán el panel del visor 3D a partir del modelo y lo mostrarán. |
|
276 |
|
|
277 |
RefreshView3DExtension |
|
278 |
************************ |
|
279 |
|
|
280 |
Extensión de Andami asociada a la acción: "refresh-view3D". Esta extensión deberá estar visible cuando se active un visor 3D y siempre activa. La extensión obtendrá la instancia de tipo View3DPanel y ejecutará la operación View3DPanel#reloadLayers(). |
|
281 |
|
|
282 |
SynchronizeView3DExtension |
|
283 |
**************************** |
|
284 |
|
|
285 |
Extensión de Andami asociada a la acción: "synchronize-view3D". Esta extensión deberá estar visible cuando se active una vista3D y siempre activa. La extensión obtendrá la instancia de tipo View3DPanel y ejecutará la operación View3DPanel#synchronizeViewPorts(). |
|
286 |
|
|
287 |
Persistencia |
|
288 |
****************** |
|
289 |
|
|
290 |
Se creará un archivo llamado plugin-persistence.def que definirá la estructura de las preferencias. A priori las preferencias tendrán las siguientes propiedades: |
|
291 |
|
|
292 |
* Tamaño por defecto x : int |
|
293 |
* Tamaño por defecto y : int |
|
294 |
* Mostrar minimapa : boolean |
|
295 |
* Mostrar atmósfera : boolean |
|
296 |
* Mostrar escala : boolean |
|
297 |
* Mostrar indicar del norte : boolean |
|
298 |
* Mostrar fondo de estrellas : boolean |
|
299 |
|
|
300 |
Se creará un panel para añadirlo a las preferencias generales de aplicación para que el usuario pueda modificar las preferencias del plugin. |
Also available in: Unified diff