Aplicación Basada en Capaware 1 En esta clase se verá la arquitectura de la aplicación y sus módulos principales. Con esto se pretende tener una visión genérica del proyecto y saber qué apartados atacar según nuestros intereses o la mejor forma de abordar nuestro problema. También empezaremos con la primera práctica del curso que será un ejercicio sencillo con wxWidgets para crear formularios. En esta clase se verá la arquitectura de la aplicación y sus módulos principales. Con esto se pretende tener una visión genérica del proyecto y saber qué apartados atacar según nuestros intereses o la mejor forma de abordar nuestro problema. También empezaremos con la primera práctica del curso que será un ejercicio sencillo con wxWidgets para crear formularios. La aplicación Capaware se construye sobre un conjunto de librerías. Como se puede ver, en la base tenemos al S.O. Y las bibliotecas de gráficos y de GUI. Sobre ellas se encuentran algunos módulos de los que hará uso la aplicación. Los plugins que se quieran desarrollar harán uso de la bibliteca cpw, y de aquéllas que se quieran utilizar. CPW: Librería principal de Capaware IOSG: Módulo de gráficos. OGC: Módulo de OGC (Open Geospatial Consortium). LIBWMS: Soporte para WMS. OSG: Open Scene Graph (motor gráfico). WxWidgets: librería GUI. Capaware es la aplicación que se construye con cpw y las distintas librerías. Hay dos grandes apartados que recogen la mayor parte del código de la aplicación: controllers y GUI. Controllers: alberga todos los controlladores de los que hace uso la aplicación. Cada nueva funcionalidad posee su propio controlador. GUI: Alberga todas las interfaces de usuario de la aplicación. ApplicationTime: Gestión de Tiempo del escenario abierto (Init, End, Current, Play, Pause, etc.) PluginInterface: Métodos Interfaz de plugins (Init, Exec, definición mapeo de funciones) DynamicLibrary: carga de Dlls y mapeo de funciones. ApplicationCallbacks(Refact): Callbacks para la barra lateral. Se cambiará. Algunos de los principales: ConfigurationC: Configuración de la Aplicación (rutas, configuración GUI, dispositivo de almacenamiento, servidor de comunicaciones,etc.) ChangeOptionsC: Controlador interfaz Opciones. LoginC: usuario, contraseña ChatC: Controlador del sistema de Chat. UI3DController: Controlador menú contextual 3D. HandlerC: Controladores para manipuladores sobre la escena (gizmos) StatusC: Seguimiento progreso de procesos (añadir, quitar, indicar progreso, mensaje, etc.) DistanceC: Controlador herramienta medir distancias ElementC: Controlador para gestión Elementos. KeyboardC: Controlador Teclado. UIApplicationMainFrame: Marco principal. UISplitterCanvas: Canvas para GL. UINewProject: Interfaz creación nuevo Escenario. UIChatWindow: ventana de chat UIConfiguration: Interfaz opciones UIElement: Interfaz creación elementos. UICalculateDistance: interfaz cálculo de distancias. UIIconList: Interfaz selección de icono. UIMovieScheme: TimeLine UILayerTreePanel: Árbol de Capas del Escenario IApplication: Interfaz de Aplicación, opciones comunes CPW (Open, Close, Fullscreen, AddEntity, Get/Set Selección, Get NavigatorManager, Status Controller, etc.) ApplicationConfiguration: Clase Base y opciones de configuración CPW Algunas opciones comunes Ejemplo de fichero de configuración de la aplicación con apartados más relevantes. Estructura de la librería CPW y sus apartados: Callback: funciones callback ●Common: definición de recursos comunes ●Entity: definición de tipos de entidades ●Graphic: Relacionado con la escena y motor gráfico. ●Net: Comunicaciones. ●Persistent: Persistencia ●Thread: Manejo de peticiones. ●Collaborative: EntityMonitorClient ● Callable: Clase Base (Manejo Set de Callbacks). ICallBack: Clase Base, Interfaz de Callbacks. IGraphicCallback: Interfaz Callback Gráfico (Insertar/eliminar de escena, actualizar, animar...) Model3DCallback: Implementación callback gráfico para modelos 3D. ParticlesystemCallback: Implemetnación Callback gráfico para sistemas de partículas. IEventReceiver: Interfaz de Recepción de Eventos, para controladores que quieran capturarlos. -GUI: componentes de la interfaz gráfica 3D -HUD: Head-up Display gui mostrado sobre visor -Widget: Componente GUI gen. (panel, botón...) -Minimapa, UTM label, Compass. -OsgScene: Gestión escena a visualizar. -OsgCamera: Cámaras de los Navegadores -OsgNavigator: Navegador (maneja Cámaras, HUD, Intersecciones, recepción enventos, etc.) -OsgNavigatorManager: Gestor de los Navegadores. -OsgFactory: Factoría para la creación de los componentes del módulo gráfico (escena, navegadores, camaras, etc.) -Persistencia de las capas. -Manager de capas: procesa peticiones y respuestas. -Manager de red: peticiones http. -Manager de disco: búsqueda de imágenes cacheadas. Librería externa para el manejo de capas wms. Existe tres frentes para desarrollar sobre Capaware: -Plugins: La más recomendada para añadir funcionalidades nuevas. La interfaz de desarrollo de plugins es amplia y flexible. Esquema modular. -Modificar núcleo: Para mejorar módulos genéricos existentes o ampliar funcionalidades globales. -Crear aplicación completa: Usando cpw y librerías necesarias. Trabajazo. -Amor/odio. -Multiplataforma (Win/Linux/Mac). -Usa API nativa para la creación de ventanas. -Cantidad importante de componentes. -Cosas que funcionan muy bien y cosas que no funcionan tan bien. -Diferencias entre Windows/Linux importantes. -wxWindows: clase base de los componentes. -El contenido de una ventana también son wxWindows, hijas de el componente padre. -Manejo de eventos sencillo. -Recordar que la GUI es en mayor medida una vista. La lógica asociada debería ir en un controlador. Introducción a ● Aplicación #include "Application.h" class Application : public wxApp, public cpw::IApplication { #ifdef _CONSOLE_APP_ public: IMPLEMENT_APP_NO_MAIN(Application) Application(void); // REMEMBER (/SUBSYSTEM:CONSOLE) ~Application(void); int main(int argc, char *argv[ ]) bool OnInit(); { return wxEntry(argc,argv); } #else bool Close(); } IMPLEMENT_APP(Application) // REMEMBER (/SUBSYSTEM:WINDOWS) #endif 21 WxWidgets, como otras librerías de este tipo, toma control del proceso principal. Existe dos formas de iniciar una aplicación que usa wxWidgets: -Wx implementa el main. -Tenemos nuestro main y definimos punto de entrada a wx. -Para el desarrollo es interesante disponer de consola. Introducción a ● Formulario Sencillo class UISample : public wxDialog { Public: UISample(wxWindow *parent, wxWindowID id, ...); virtual ~UISample(); private: BEGIN_EVENT_TABLE(UISample,wxDialog) EVT_BUTTON (ID_OK_BUTTON, UISample::OnButtonOK) END_EVENT_TABLE() UISample::UISample(wxWindow *parent, …) : wxDialog(parent,...) { SetSize(200, 100); Center(); data_tctrl = new wxTextCtrl(this, wxID_ANY, _ (“Hola”)); ok_button = new wxButton(this,ID_OK_BUTTON, _( "OK” ), wxPoint(100, 40)); this->ShowModal(); wxTextCtrl *data_tctrl; wxButton *ok_button; DECLARE_EVENT_TABLE(); enum } { ID_OK_BUTTON = 1003 } void UIAddTerrain::OnButtonOK(wxCommandEvent& WXUNUSED(event)) void OnButtonOk(wxCloseEvent& event); { }; } this->EndModal(wxID_OK); 22 Creación de un formulario sencillo con un botón y captura del evento.