UNIVERSIDAD DE CHILE FACULTAD DE CIENCIAS FÍSICAS Y MATEMÁTICAS DEPARTAMENTO DE LAS CIENCIAS DE LA COMPUTACIÓN DESARROLLO DE UNA APLICACIÓN MÓVIL PARA LA ADMINISTRACIÓN DE AVANCES SOBRE PLANOS ARQUITECTONICOS MEMORIA PARA OPTAR AL TÍTULO DE INGENIERO CIVIL EN COMPUTACIÓN NICOLÁS EDUARDO DUJOVNE WEINBERGER PROFESOR GUÍA: SERGIO OCHOA DELORENZI MIEMBROS DE LA COMISIÓN: LUIS GUERRERO BLANCO OSCAR ALBERTO HERRERA DIAZ SANTIAGO DE CHILE AGOSTO 2007 RESUMEN DE LA MEMORIA PARA OPTAR AL TÍTULO DE INGENIERO CIVIL EN COMPUTACIÓN POR: NICOLÁS DUJOVNE W. FECHA: 12/08/2007 PROF. GUIA: Dr. SERGIO OCHOA DESARROLLO DE UNA APLICACIÓN MÓVIL PARA LA ADMINISTRACIÓN DE AVANCES SOBRE PLANOS ARQUITECTÓNICOS Últimamente la arquitectura se ha visto favorecida por los avances efectuados en el ámbito de las Ciencias de la Computación. Uno de los mayores beneficios es poder contar con herramientas que permitan la creación y administración de planos digitales, reemplazando así, en cierta medida, la confección de planos sobre papel. Con la masificación del uso de estos planos digitales surgen oportunidades para apoyar otras fases del proceso de construcción de obras, como la fase de seguimiento, en la que es necesario registrar los avances logrados en la construcción, comparándolos con la planificación inicial que se desprende de los planos confeccionados. El contenido de este Trabajo de Título se centra, precisamente, en el desarrollo de una herramienta para apoyar la fase de seguimiento de un proceso de construcción. El objetivo principal del trabajo fue aportar una primera aproximación de diseño e implementación de una herramienta que permita administrar los avances en obras de construcción, utilizando para ello planos digitales. Dicha herramienta debe permitir al usuario realizar anotaciones por sobre el plano digital, pudiendo de esta forma registrar los avances y las observaciones necesarias. Para efectos de este trabajo se consideraron dos tipos de anotaciones: delimitaciones de zonas coloreadas dentro del plano e ingreso de texto a mano alzada. Asimismo, debe funcionar sobre dispositivos Tablet PC, facilitando de esta manera su uso en terreno mediante el uso del lápiz provisto por dichos dispositivos. El trabajo se inició con una investigación del estado del arte en cuanto al uso de herramientas para la confección de planos arquitectónicos. Posteriormente se procedió a la búsqueda de alternativas para el desarrollo, desde el lenguaje de programación hasta librerías o utilidades que pudieran ser de ayuda para el proyecto. Finalmente se procedió a realizar el diseño y la implementación, apoyándose en reuniones semanales con el Profesor Guía y un estudiante de Magister asociado al tema, en las cuales se validaban los avances logrados y se planificaban los pasos a seguir. El resultado final del trabajo fue una herramienta que, si bien no puede ser usada en terreno en su estado actual, cumple los objetivos planteados y sirve de base para posteriores desarrollos. De esta forma se dejan abiertas numerosas posibilidades para trabajos futuros relacionados con el apoyo al seguimiento de obras arquitectónicas, profundizando o extendiendo el trabajo realizado en este proyecto. 2 Muchas gracias a todas las personas que me han apoyado a lo largo de mi vida, tanto en lo personal como en los estudios, este trabajo está dedicado a ellos. Este trabajo de memoria fue parcialmente financiado por el proyecto Fondecyt No. 11060467. 3 Índice de Contenido 1. Introducción ................................................................................................................................. 7 1.1. Justificación .......................................................................................................................... 9 1.2. Objetivos del Trabajo ......................................................................................................... 10 1.3 Requisitos de la Solución .................................................................................................... 11 1.4. Plan de Trabajo Ejecutado .................................................................................................. 12 2. Investigación Realizada ............................................................................................................. 14 2.1. Implementación y manejo de capas en imágenes ............................................................... 15 2.1.1. JFDraw ........................................................................................................................ 15 2.1.2. Batik SVG Toolkit ........................................................................................................ 17 2.1.3. Graphics 2D ................................................................................................................ 17 2.1.4. G - 2D Graphics Library and Rendering Engine for Java .......................................... 18 2.1.5. Librería gráfica de C#: System.Drawing ..................................................................... 19 2.2. Formato de Plano Digital a Utilizar.................................................................................... 20 2.3. Reconocimiento de Elementos Arquitectónicos en Planos Digitales ................................. 21 3. Resultados de la Investigación .................................................................................................. 22 3.1. Conclusiones de la Investigación ....................................................................................... 22 3.2. Problemática a Resolver ..................................................................................................... 23 3.3. Alcance del Proyecto .......................................................................................................... 24 4. Diseño de la Solución ................................................................................................................ 26 4.1. Consideraciones de Diseño................................................................................................. 26 4.1.1. Manipulación de Imágenes .......................................................................................... 26 4.1.2. Manejo de Archivos XML........................................................................................... 28 4.2. Estructura de las Anotaciones............................................................................................. 29 4.2.1. Definición de anotación Área ...................................................................................... 32 4.2.2. Definición de anotación TextoLibre ............................................................................ 32 4.3. Estructura de Capas ........................................................................................................... 33 4.4. Capa de Texto utilizando InkOverlay................................................................................. 34 4.5. Sincronización entre las Capas ........................................................................................... 36 4.6. Implementación de Marcas y Estados ................................................................................ 37 4.7. Estructura de Almacenamiento ........................................................................................... 39 4.8. Diagrama de Clases ............................................................................................................ 41 4 5. Prototipo Implementado ............................................................................................................ 42 5.1. Estructura de la Herramienta .............................................................................................. 42 5.2. Menú de la Aplicación........................................................................................................ 43 5.2.1. Crear nuevo Proyecto .................................................................................................. 44 5.2.2. Abrir Proyecto ............................................................................................................. 44 5.2.3. Guardar Proyecto ......................................................................................................... 45 5.2.4. Manipulación de Anotaciones ..................................................................................... 45 5.3. Barra de Herramientas de Imágenes ................................................................................... 45 5.3.1. Modo de Desplazamiento / Zoom ............................................................................... 46 5.3.2. Modo de Marcar Anotaciones ..................................................................................... 47 5.3.2.1. Creación de Anotaciones de Área ........................................................................ 47 5.3.2.2. Creación de anotaciones de texto a mano alzada ................................................. 48 5.3.3. Leyenda de Anotaciones.............................................................................................. 49 5.4. Seleccionador de Planos ..................................................................................................... 50 5.5. Detalle de Anotación .......................................................................................................... 51 5.6. Visor de Imágenes .............................................................................................................. 52 6. Resultados Preliminares ............................................................................................................ 53 7. Discusión y Conclusiones.......................................................................................................... 54 8. Trabajo a Futuro ........................................................................................................................ 55 9. Bibliografía y Referencias ......................................................................................................... 57 Apéndice A: Código Fuente de la Solución Implementada .......................................................... 59 Implementación de Clase Área .................................................................................................. 59 Implementación de Clase TextoLibre ........................................................................................ 60 Implementación Clase PlanoDigital .......................................................................................... 60 Rutina de Creación de Nuevo Proyecto..................................................................................... 62 Rutina de Carga de Proyecto en XML....................................................................................... 63 Rutina de Actualización de Vista de Plano Digital ................................................................... 65 Apéndice B: Ejemplo de Estructura de XML de Almacenamiento de Proyectos ......................... 67 Apéndice C: Ejemplo de Estructura de XML de Configuración de la Aplicación........................ 69 5 Índice de Figuras Figura 1 - Ejemplos de manejo de capas del Software JFDraw ................................................... 16 Figura 2 - Ejemplo de uso de la librería binaria de JFDraw ......................................................... 16 Figura 3 - Imagen de demostración de uso de librería G ............................................................. 19 Figura 4 - Formatos posibles para exportar un plano de ArchiCad 10 (versión estudiante) ........ 20 Figura 5 - Ejemplo de propuesta de definición de polígonos ....................................................... 23 Figura 6 - Ejemplo de uso de marca referencial ........................................................................... 24 Figura 7 - Ejemplo de recorte de una imagen para su despliegue ................................................ 27 Figura 8 - Diagrama de clases de Anotación ................................................................................ 30 Figura 9 - Estructura de simulación de capas ............................................................................... 34 Figura 10 - Diagrama de clases de uso de Administradores ........................................................ 37 Figura 11 - Extracto de almacenamiento de proyectos en XML .................................................. 39 Figura 12 - Extracto de XML de almacenamiento ....................................................................... 40 Figura 13 - Extracto de almacenamiento de anotación de texto a mano alzada ........................... 40 Figura 14 - Diagrama de clases de la solución ............................................................................. 41 Figura 15 - Vista general de la Aplicación ................................................................................... 42 Figura 16 - Acciones para la manipulación de proyectos............................................................. 43 Figura 17 - Acciones para la manipulación de anotaciones ......................................................... 43 Figura 18 - Ejemplo de estructura de directorios para crear un nuevo proyecto de seguimiento 44 Figura 19 - Ejemplo de nombre de archivo en título de la aplicación .......................................... 45 Figura 20 - Barra de Herramientas de imágenes .......................................................................... 45 Figura 21 - Ejemplo de eliminación de anotación ........................................................................ 46 Figura 22 - Ejemplo de creación de nueva anotación................................................................... 47 Figura 23 - Ejemplo de ingreso de anotación de área .................................................................. 48 Figura 24 - Ejemplo de ingreso de nueva anotación de texto....................................................... 48 Figura 25 - Ejemplo de visualización de anotaciones de texto .................................................... 49 Figura 26 - Ejemplo de selección de plano .................................................................................. 50 Figura 27 - Ejemplo detalle de anotación ..................................................................................... 51 Figura 28 - Ejemplo visor de imágenes ........................................................................................ 52 6 1. Introducción La arquitectura, como muchas otras áreas de estudio, se ha visto beneficiada con los avances de la computación durante los últimos años. Antiguamente, hablar de planos arquitectónicos era hablar de planos confeccionados a mano sobre papel. Por lo tanto, uno de los mayores beneficios para la arquitectura moderna fue poder contar con herramientas que permitan la creación y administración de planos digitales y de la información contenida en ellas. De esta manera, se simplifica el proceso de actualizarlos y compartirlos entre las distintas personas que trabajan con ellos. El uso de dichos planos digitales ha ganado mucha fuerza, tanto así que ha pasado a formar parte importante del proceso de construcción, en particular en la confección inicial y en la coordinación entre las distintas áreas. Finalizada la etapa de confección de los planos y una vez que se procede con el inicio de construcción de la obra, se utilizan dos métodos para evaluar y seguir el avance de ésta. En el primero, el equipo de construcción utiliza una carta Gantt con las tareas a realizar, con lo cual pueden acceder a una estimación de cuán ajustados están con respecto a la planificación inicial. Por su parte, el otro método para medir el avance de la obra - que es utilizado por el equipo arquitectónico – consiste en ir marcando en la impresión del plano final los avances, detalles y/o comentarios que vayan surgiendo a medida que avanza la construcción. Para esto, se requiere que una persona acuda con el plano de cada obra al lugar físico de construcción y realice las actualizaciones pertinentes. Posteriormente, de ser necesario, se modifica dicho plano de acuerdo a la información obtenida, imprimiendo esta nueva versión, debiendo por tanto traspasar la información de avance de la versión anterior a esta nueva. Ahora bien, la versión final impresa que se utiliza para seguir los avances no sólo es útil para el equipo arquitectónico, sino que también lo es para el equipo de construcción, utilizada como guía para ejecutar la obra. En resumen, en terreno se trabaja mucho con los planos en papel, por lo que resulta complejo lograr un manejo adecuado de la información que registran en estos planos todos los actores involucrados. Típicamente, podrían existir distintas versiones de planos parcialmente actualizados, que serían utilizados por personas que pertenecen a distintas áreas, como por ejemplo arquitectos, jefes de obra, ingenieros civiles e ingenieros eléctricos, entre otros. Esto suele ocasionar inconsistencias, requiriendo un esfuerzo importante para mantener los planos actualizados. La cantidad de planos arquitectónicos que se manipulan en una obra está directamente relacionada con la magnitud de ésta, por lo que, a medida que se realizan construcciones de mayor envergadura, mayor será la cantidad de planos utilizados. Por lo tanto, el apoyo computacional se torna indispensable en estos escenarios de construcción. 7 En este contexto, la administración de la información a través de planos arquitectónicos se está convirtiendo en un tema crucial para el buen manejo de los proyectos. Día a día se proyectan construcciones más complejas, grandes o desafiantes, las cuales requieren cada vez más de un manejo de información adecuado para su nivel de complejidad. Esto involucra información de diversas áreas tales como arquitectura, construcción, redes eléctricas/telefónicas/TV/Internet y circuitos sanitarios, entre otros. Cada uno de estos planos aporta con información específica para el desarrollo de la obra, la cual tiene que ser acumulada y sincronizada periódica y adecuadamente. En la actualidad, éste es uno de los mayores problemas del manejo de la información en el escenario de la construcción debido a que, en primera instancia, se maneja de forma digital para luego traspasarlo a papel. Esta información en papel tiene importantes limitaciones para ser recolectada, integrada y distribuida. La propuesta de este trabajo de título es desarrollar una herramienta para poder efectuar el seguimiento de las obras mediante planos digitales, apoyando así todo el proceso de construcción. El trabajo, específicamente, se focalizó en el soporte que es necesario entregar a un inspector técnico de obra (ITO), el cual está encargado de supervisar y revisar que la obra se lleve a cabo tal como estaba estipulado y, en ciertos casos, realizar actualizaciones sobre los planos. Para esto se propone reemplazar los planos impresos por planos digitales accesibles a través de un dispositivo Tablet PC. De esta manera se facilita el transporte y, por sobre todo, la administración de la información contenida en éstos. 8 1.1. Justificación Uno de los problemas a resolver en los procesos de construcción es el manejo de la información. En la actualidad la mayor parte de las herramientas de software existentes apoyan la confección y visualización de los planos de diversa índole, dejando con menor cobertura el proceso una vez terminados los planos, que es exactamente el enfoque de este trabajo de título. Actualmente, el seguimiento a las obras mediante planos digitales no se practica por falta de herramientas que brinden la seguridad necesaria para la correcta coordinación entre los planos confeccionados. La propuesta es dar un primer paso al diseñar e implementar una herramienta que pueda proveer esta coordinación entre los planos y los avances o modificaciones a realizar. También se considera una sincronización en las versiones de las capas de distintas personas que tengan el mismo plano digital (esto no se profundiza en este trabajo, pero sí se requiere que se detalle en futuras versiones). Por otro lado, la herramienta descrita no sólo resulta útil para realizar seguimiento de avances de obras, sino también para utilizarse con otros fines. En el mismo proceso de confección de planos, la herramienta podría ser aplicada como base para ofrecer una solución al traspaso y modificación de los planos por parte de los involucrados en éste. Por ejemplo, reconociendo los espacios dejados por el arquitecto para que el encargado detalle el sistema eléctrico en los espacios para ello asignados, ayudando así a la coordinación entre las partes. De esta forma se estaría utilizando el modelo de capas propuesto en este trabajo, de modo que cada involucrado (arquitecto, ingeniero eléctrico, ingeniero civil, etc.) trabaje sobre una capa, administrándola sin intervenir en el trabajo del resto del equipo, teniendo así vistas parciales o totales de los planos. Este proyecto aporta cuantiosas posibilidades para desarrollar trabajos futuros, dado que es el pionero en este ámbito. Sería interesante desarrollar en profundidad el tema de reconocimiento de la estructura del plano arquitectónico (existen diversos documentos al respecto e incluso algunas implementaciones), ya que mientras más detalles se obtengan en este punto, mayor es la especificación que se puede lograr en la administración de los avances o comentarios respecto a la obra. Otro trabajo que se desprende de este proyecto podría ser generalizar la estructura de capas propuesta, logrando así una mayor división entre los avances de distinta índole, expandiendo las áreas beneficiadas por la herramienta, pudiendo hacer uso de esta funcionalidad con otros fines. Finalmente, se podría pretender desarrollar a futuro un prototipo para la visualización de los planos en 3D, de manera de poder realizar un seguimiento de avances aún más detallado, así como también darle un uso en otras áreas. Esto último tomando en cuenta hacia adonde apunta la tecnología para la visualización de planos arquitectónicos. Sin un estudio en profundidad de las diversas posibilidades de extensibilidad de este proyecto, las anteriores son sólo algunas de las opciones, teniendo en cuenta que este proyecto es la base para futuros desarrollos. 9 1.2. Objetivos del Trabajo El objetivo general de este trabajo de título estuvo enfocado en la investigación, diseño e implementación de una aplicación móvil para dar seguimiento a los proyectos de obras de construcción, mediante el uso de imágenes obtenidas de los planos digitales. Esta solución permite manejar la información en base a capas, así como también realizar marcas sobre las mismas, indicando comentarios asociados (superpuestos al plano) y almacenando la información de la capa en archivos XML. La aplicación fue diseñada para funcionar sobre dispositivos Tablet PC. Los objetivos específicos diseñados para alcanzar el objetivo general, son los siguientes: 1. Diseño e implementación de una estructura en XML para almacenar la información relevante de un plano arquitectónico. Esta estructura permite, a su vez, obtener la posición de un punto o espacio dentro de un plano, junto con información asociada a éste. 2. Diseño de la interfaz gráfica que le permita a un usuario manipular los planos, obteniendo una representación gráfica de los mismos a partir de los datos almacenados. 3. Implementación de una aplicación para Tablet PC que permite desplegar una imagen de un plano en formato digital (por ejemplo JPEG), así como también, marcar puntos o zonas del plano adjuntando información de texto y/o una delimitación de áreas. 10 1.3 Requisitos de la Solución Durante la realización del proyecto, se debieron cumplir ciertos requisitos básicos con respecto de lo que se esperaba para la solución. A continuación se detallan algunos de estos requisitos: − La solución debe funcionar sobre un dispositivo Tablet PC, aprovechando y haciendo uso de sus características particulares. − La aplicación debe permitir la creación de un nuevo proyecto de seguimiento en base a las imágenes de los planos de un proyecto de construcción. Para esto se debe proponer e implementar un método para su realización. − Además, y relacionado con el punto anterior, se deben poder diferenciar los distintos tipos de planos utilizados en un proyecto de construcción como - por ejemplo - planos estructurales, eléctricos, de agua y gas, entre otros, para poder ser integrados al nuevo proyecto. − Los planos deben ser presentados agrupados según las zonas o áreas que representen en la obra, identificando en cada caso los tipos de planos mencionados anteriormente. Por ejemplo, el primer piso de un edificio podría contar tanto con planos estructurales, como arquitectónicos y de terminaciones. − La aplicación debe proveer las funcionalidades de acercamiento y desplazamiento en los planos. − La aplicación debe permitir realizar marcas para distinguir los puntos de interés en cada plano, con la finalidad de poder realizar su seguimiento. Las marcas deberán almacenar, además, información acerca de su estado, autor, posición, etc. − Dentro de la información asociada a cada marca debe existir un atributo de estado, el cual debe poder ser actualizado por los usuarios. Además, este atributo debe tener valores por defecto, tal que denoten el estado de avance para una anotación. − La solución debe permitir la realización de marcas de texto a mano alzada sobre los planos, haciendo uso del lápiz provisto por los dispositivos Tablet PC. 11 − Los proyectos de seguimiento a las obras creados por la aplicación deben ser almacenados en disco en formato XML, para lo cual se debe proponer e implementar una estructura de almacenamiento. − Los proyectos creados y almacenados por la aplicación deben ser portables, es decir, se debe considerar que la acción de intercambio de estos archivos será de uso común. 1.4. Plan de Trabajo Ejecutado Para alcanzar los objetivos definidos, se diseñó el siguiente plan de trabajo: 1. Investigación del proceso de confección y administración de planos de obra, dentro de un proyecto de construcción de infraestructura física (2 semanas) – Estatus: Terminado. 2. Investigación sobre representación vectorial y material existente relacionado con reconocimiento de patrones de imágenes, particularmente en los que respecta a planos arquitectónicos (1 mes) - Estatus: Terminado. 3. Investigación de buenas prácticas de representación y almacenamiento de información en XML (2 semanas) – Estatus: Terminado. 4. Investigación y práctica en el uso de dispositivo Tablet PC (2 semanas) - Estatus: Terminado. 5. Diseño de la estructura de almacenamiento de la información en XML (1 mes) – Estatus: Terminado. 6. Diseño e implementación de las capas de información basadas en la arquitectura (redes eléctricas, gas, agua, arquitectura, etc.), utilizando la información almacenada en los archivos XML ya diseñados (2 meses) – Estatus: Terminado. 7. Diseño e implementación de interfaz de usuario para visualizar planos y realizar marcas sobre éstos (2 meses) - Estatus: Terminado. 8. Realización de pruebas y ajustes a la solución propuesta (3 semanas) - Estatus: Terminado. 9. Confección del documento final del trabajo de título (2,5 meses) – Estatus: Terminado. 12 El cronograma de trabajo asociado a las actividades antes presentadas es el siguiente: Cronograma de Actividades: Mes / Tarea 1 2 3 4 5 6 7 8 9 1 XX XX 2 3 4 5 6 7 XXXX XX XXXX XXXX 8 XX XX XX XX XX XX XXXX XX XXX XXXX La organización de las actividades propuestas se basó en una investigación sobre los temas y trabajos relacionados a este proyecto. Posteriormente, se continúo con la implementación de la solución, procediendo a distribuir las tareas, trabajando paralelamente en ellas y desarrollando el informe final del trabajo de título a medida que se avanzaba. Finalmente, se realizaron las actividades de experimentación y ajuste de las soluciones desarrolladas. 13 2. Investigación Realizada Dadas las características de este trabajo de título, uno de los desafíos más importantes a enfrentar fue el relacionado con las imágenes digitales. Por conformar un tema bastante extenso se decidió dividirlo en 3 aspectos, que son de gran relevancia en el desarrollo del trabajo. El primero de los aspectos investigados está relacionado con la problemática de la implementación de capas por sobre el plano arquitectónico digital. Para ello, se buscaron trabajos relacionados con la implementación de ideas similares en ésta u otras áreas, así como también herramientas que faciliten el manejo tanto del plano digital como de las capas que van sobre él. Otro aspecto fundamental en la investigación de imágenes digitales fue la definición del tipo de imagen a utilizar, es decir, en términos técnicos, el formato de imagen con el cual se trabaje. El enfoque de esta investigación no sólo estuvo ligado con la selección de un formato que permitiera el manejo de capas que se implementen por sobre el plano digital, sino también con la integración a los formatos que el software utilizado por ingenieros civiles o arquitectos para confeccionar dichos planos permita generar. Dicha integración resulta de vital importancia, debido a que la idea es apoyar el proceso de gestión de seguimiento de las obras, por lo que es necesario que la solución se adapte a las herramientas utilizadas. Un último aspecto investigado se refirió al reconocimiento de elementos arquitectónicos en planos digitales. El objetivo fue ser capaces de reconocer los polígonos que forman la estructura del plano. A pesar de no ser un tema fundamental en este trabajo de título, sí fue necesario investigar posibles soluciones, tratando de lograr una aproximación para que en algún futuro trabajo se pueda obtener esta característica. 14 2.1. Implementación y manejo de capas en imágenes En este tema la idea fue interiorizarse con el manejo de imágenes digitales, particularmente en diversas formas de trabajar con una capa sobre una imagen base, para lo cual se buscaron ejemplos y herramientas que facilitaran la manipulación de imágenes. Dentro de esta búsqueda se barajaron 2 alternativas como lenguaje de programación para la implementación de la aplicación a realizar: Java y C#. 2.1.1. JFDraw El Software freeware - desarrollado en Java por JFImagine - es un software gráfico basado en el uso de vectores y capas que permite la creación de imágenes de cualquier tipo, utilizando para ello elementos geométricos predefinidos. La aplicación es de licencia gratuita para utilizarla confeccionando dibujos, diagramas, etc. Además se ofrece la librería binaria, con fines de desarrollo, para manipular imágenes por un costo de US$ 299. Se realizaron pruebas en el software, las cuales se basaron en la confección de dibujos utilizando figuras geométricas en distintas capas y la exportación de las imágenes generadas a un formato XML. El objetivo de estas pruebas fue dimensionar si las características del software abarcaban las funcionalidades requeridas para este trabajo de título. Ahora bien, dado los resultados obtenidos, se puede deducir que el manejo de capas es muy similar a lo que se desea lograr, por lo que - basándose en las pruebas realizadas a este software – es posible concluir que es factible utilizar la librería binaria para el desarrollo de la aplicación. En la figura 1 se muestran las pruebas realizadas en este software. Se trata de 2 figuras geométricas superpuestas fácilmente identificables, cada una de ellas en una capa distinta. La idea es que, sin modificar los objetos de la imagen, se pueden manipular las capas para ponerlas al frente, al fondo, o no desplegarlas. La imagen en los tres casos mostrados es la misma, sólo cambia el manejo de las capas. 15 Figura 1 - Ejemplos de manejo de capas del Software JFDraw En el sitio Web del software (www.jfimagine.com) existe una sección especial para desarrolladores, en la cual se puede acceder a la documentación de la librería, así como también a ejemplos de lo que se puede lograr con ella. Pese a no poder ejecutar los ejemplos, por no contar con la librería binaria, de uno de ellos se desprende la factibilidad de fijar una imagen de fondo y trabajar sobre ella en una capa distinta - como se puede apreciar en la figura 2 – donde se trabaja con un mapa geográfico de fondo trazando segmentos para englobar un continente. Figura 2 - Ejemplo de uso de la librería binaria de JFDraw 16 2.1.2. Batik SVG Toolkit Batik es un conjunto de herramientas, basado en Java, para la generación y manipulación de imágenes de formato SVG (Scalable Vector Graphics). Se basa en una serie de módulos de los cuales cada uno ofrece una cierta funcionalidad, que pueden ser utilizados en conjunto o por separado. Esta herramienta podría ser de gran utilidad para este trabajo de título si se decide utilizar el formato de imágenes SVG, ya que provee de muchas funcionalidades útiles para la manipulación de este formato. Por otro lado, la elección de utilizar esta plataforma tiene por consecuencia forzar el uso del formato SVG para los planos digitales, así como también para las capas implementadas por sobre el plano. En definitiva, la decisión de adoptar esta herramienta está directamente relacionada con la selección del formato de planos digitales utilizado y el formato para las capas que llevan los avances por sobre éste. 2.1.3. Graphics 2D Graphics 2D es parte de la librería de Java para la creación de aplicaciones gráficas. Es la base de muchas de las herramientas que proveen un manejo de mayor nivel en el lenguaje. La idea de considerarlo como una alternativa, es diseñar una implementación propia para la manipulación de capas. Para ello, se utiliza la imagen del plano digital como base y se dibuja por sobre ésta la capa correspondiente al seguimiento de avances. Al emplear esta librería, se podría obtener una solución precisa para el problema que se requiere abordar sin estar incurriendo en la incorporación de características que no se necesitan. Pero por otro lado, esto implica trabajar a más bajo nivel y podría tardar más tiempo que las otras alternativas en lograr una solución funcional. 17 2.1.4. G - 2D Graphics Library and Rendering Engine for Java Una de las áreas del conocimiento en la que el manejo de las imágenes digitales es muy común es la geología. Últimamente se han digitalizado imágenes de todos los sectores del planeta, desarrollándose así una rama en la que se requiere un manejo de imágenes tal que permita, por ejemplo, distinguir una ruta dentro de una ciudad, para lo cual se utiliza una capa por sobre el mapa geográfico del lugar, destacándose la ruta e información asociada a ella. Una de las soluciones enfocadas a resolver este tema es G, una librería genérica construida sobre la base de Java 2D (java.awt.Graphics2D), desarrollada por GeoSoft (Geotechnical Software Services). A diferencia de otras librerías o aplicaciones relacionadas a la geología, la librería G está construida de manera genérica, lo que permite que no sólo sea utilizada en el ámbito de la geología, sino en cualquier ámbito que se requiera manejar gráficos en 2D. Por otro lado, gracias a que es una abstracción de Graphics 2D, provee las mismas características pero con un modo de utilización más simple y fácil de manejar. Una de sus particularidades es que puede ser extendida, lo que puede ser muy útil para adaptarla a las condiciones específicas en las que se realizó el trabajo. Además es muy liviana aproximadamente 80 Kb - con lo que, probablemente, no se esté incurriendo en la inclusión de funcionalidades o características no requeridas. En el sitio Web de esta herramienta se pueden encontrar variados ejemplos, incluyendo manejo de zoom in/out, así como también de desplazamiento horizontal y vertical en una imagen, ambas características requeridas para implementar en este trabajo de título. Otro de los ejemplos incluye la imagen de la figura 3, donde se muestra cómo el usuario puede trazar una ruta por sobre una imagen definida de fondo. 18 Figura 3 - Imagen de demostración de uso de librería G 2.1.5. Librería gráfica de C#: System.Drawing El análogo a la clase Graphics 2D de Java es la librería de C# System.Drawing, para desarrollar aplicaciones gráficas. El análisis funcional de esta alternativa es muy similar al realizado en la revisión de Graphics 2D, es decir, requiere una programación a más bajo nivel considerando que no se utilice ninguna herramienta que encapsule las funcionalidades de la librería. Por otro lado, la utilización de la plataforma .NET en el proyecto ofrece un gran beneficio en comparación a Java, debido a que posee una versión particular para los dispositivos Tablet PC, a diferencia de Java que utiliza la misma versión que en los PC tradicionales, logrando así .NET un mejor manejo de las características particulares de los Tablet PC. 19 En relación al uso de C# y .NET en el manejo de imágenes se cuenta con el trabajo de título "Navegación y actualización de información de cartografía, usando dispositivos HandHelds", desarrollado por el alumno Manuel Villarroel [Villarroel, 2006]. Dicho trabajo utiliza este lenguaje y una plataforma con funcionalidades similares a lo que se logró en este trabajo de título en cuanto a imágenes digitales se refiere. 2.2. Formato de Plano Digital a Utilizar La razón de la investigación en este tema reside en la importancia de la definición del formato utilizado para las imágenes digitales en la aplicación desarrollada. Para esto, fue necesario considerar una serie de características y/o restricciones deseables con las que el formato elegido debía cumplir. En primer lugar, es un requisito fundamental que la aplicación desarrollada sea compatible con el software utilizado por los arquitectos para confeccionar los planos arquitectónicos, es decir, que dichos planos puedan ser exportados al formato ya adoptado. Para esto se utilizó el software ArchiCad, versión 10 para estudiantes, comprobando a cuales formatos es posible exportar los planos, como se puede ver en la figura 4. . Figura 4 - Formatos posibles para exportar un plano de ArchiCad 10 (versión estudiante) 20 Una vez determinado el conjunto de formatos, fue necesario determinar qué tipo de imagen digital se utilizaría, imágenes vectoriales o mapas de bits, para lo cual fue necesario investigar qué tipo de imagen se ajustaba mejor a las necesidades de este trabajo de título. La investigación se llevó a cabo buscando en Internet definiciones, comparaciones y ejemplos de ambos tipos de imágenes. Otras consideraciones incluyeron restricciones con respecto al tamaño del archivo dado que, por lo general, se espera trabajar con planos arquitectónicos de gran tamaño, la exportación debe ser a un formato que permita una compresión adecuada, evitando de esta manera una pérdida de calidad significativa ya que mientras más grande sea el archivo en bytes, más lenta puede resultar su manipulación, lo que afecta directamente el tiempo de respuesta de la aplicación desarrollada. 2.3. Reconocimiento de Elementos Arquitectónicos en Planos Digitales Aunque no es un requisito de este trabajo de título contar con un reconocimiento de los elementos arquitectónicos, sí se consideró una investigación al respecto. Ésta se realizó con la finalidad de analizar la factibilidad de lograr algún tipo de implementación dentro de los alcances este proyecto, o bien para dejar la investigación realizada como una base para trabajos futuros. En este contexto, el paper “A system for virtual prototyping of architectural projects”, [Sánchez, 2003], resulta muy importante, ya que es un trabajo directamente relacionado con el reconocimiento de elementos arquitectónicos en el dibujo de un plano. Si bien se basa en planos confeccionados a mano, podría servir para poder reconocer las partes de un plano digital y, por tanto, la posibilidad de manejar dichas partes del plano arquitectónico como objetos. Aún más, en dicho paper también se introduce el diseño de un framework para realizar el procedimiento descrito, por lo que, para futuros trabajos se deja abierta la posibilidad de utilizar el framework y validar si podría ser de utilidad para solucionar el reconocimiento automático de figuras del plano. 21 3. Resultados de la Investigación Luego de realizar la investigación descrita en el capítulo anterior, y previo al desarrollo del prototipo a implementar en este trabajo de título, es necesario sacar conclusiones de los resultados obtenidos. A continuación se presentan una serie de consideraciones tomadas en cuenta luego de la investigación realizada. Además se plantea el alcance del trabajo y la problemática a solucionar. 3.1. Conclusiones de la Investigación El primer tema a tratar es el relacionado con el lenguaje de programación a utilizar: las dos opciones son Java y C#. Pese a que para Java se pueden encontrar más herramientas y frameworks relacionados en Internet, se propuso trabajar con C#, ya que de esta forma es posible aprovechar las investigaciones e implementaciones desarrolladas por trabajos de título anteriores y paralelos a este, facilitando así la integración y la compatibilidad con ellos. Además, otro factor que se tomó en cuenta fue el mayor soporte ofrecido por la plataforma .NET para desarrollar aplicaciones sobre dispositivos Tablet PC. En cuanto al formato de las imágenes para los planos, pese a que el ideal hubiese sido haber trabajado con el formato vectorial SVG, basado en XML, se desistió de tal modelo debido a que al momento de la investigación no fue posible generarlo desde las aplicaciones CAD, utilizadas para confeccionar los planos. Con esto no se estaría cumpliendo uno de los requisitos básicos para la integración de la solución al proceso de gestión de las obras de construcción. Por ello se decidió utilizar formatos de mapa de bits, como JPEG (“Joint Photographic Experts Group”), PNG (“Portable Network Graphics”) o similares, ampliamente soportados por la librería de gráficos de 2D de .NET para C#. Para la implementación del ingreso de texto a mano alzada por parte de los usuarios haciendo uso del lápiz provisto por los dispositivos Tablet PC, se dispuso utilizar la librería Microsoft.Ink, incluida en el paquete de desarrollo de software para Tablet PC. Dentro de ésta se encuentra la clase InkOverlay, la cual permite realizar este tipo de anotaciones y además provee funcionalidad para almacenarlas. 22 3.2. Problemática a Resolver Una vez definido el lenguaje de programación, la siguiente etapa fue proponer un diseño para el manejo de las anotaciones que realice el usuario en el plano digital. Hay que aclarar que en este trabajo de título, al ser la primera aproximación de esta aplicación, se decidió no implementar un reconocimiento de los objetos del plano, al menos no como una prioridad. Alternativamente, se propuso implementar una funcionalidad tal, que el usuario pueda generar figuras geométricas marcando los vértices de ésta, de tal forma que luego a dicha figura geométrica se la pueda rellenar de un cierto color, dependiendo del estado en el que se encuentre el objeto que está identificado. Esto se puede ver gráficamente en el ejemplo de la figura 5, donde se muestra un segmento de un plano arquitectónico. La interacción del usuario con el sistema radica en marcar los vértices de la figura geométrica que desea identificar, en este caso la habitación del medio. Posteriormente la aplicación traza las aristas y le da la opción al usuario de seleccionar el estado en el que se encuentra la zona marcada. Figura 5 - Ejemplo de propuesta de definición de polígonos Otro aspecto definido fue el ingreso de texto a la capa por sobre el plano. Dada la variedad de usuarios que podrían hacer uso de la aplicación, desde ingenieros civiles hasta jefes de obra de construcción, en algunos casos podría surgir abuso del ingreso de texto, lo que tendría como consecuencia un problema del punto de vista gráfico ya que afectaría la visión del plano original. Esto sumado a que la aplicación funciona sobre dispositivos Tablet PC, donde se escribe a mano alzada, lo que afectaría de manera negativa la visión del plano y, en definitiva, al uso de la aplicación. 23 La propuesta para la solución al problema es mediante el uso de marcadores para texto. Es decir, si el usuario quiere agregar un texto a algún sector del plano, simplemente señaliza la posición del marcador y luego ingresa el texto deseado. Con lo anterior se logra que el texto no se despliegue junto con los avances de la obra, sino que sólo se desplieguen los marcadores, los cuales son usados para mostrar u ocultar el texto asociado a ellos. Así se evita el colapso de la vista gráfica de la aplicación con textos por todo el plano, sin dejar de lado la funcionalidad de poder agregarlo y visualizarlo, ya que es parte fundamental de la comunicación entre las personas. Figura 6 - Ejemplo de uso de marca referencial 3.3. Alcance del Proyecto A grandes rasgos la aplicación funciona en base a capas (o layers), las cuales se pueden superponer al plano digital, desplegando de esta forma las marcas que cada capa contenga. Por ejemplo, marcas que indiquen avance, comentarios, modificaciones, etc. Pese a que dentro del marco de este trabajo de título sólo se consideró desarrollar dos capas, la solución implementada puede ser extensible a múltiples capas. De esta manera, las capas de información sobre un plano podrán ser superpuestas- a futuro- según las necesidades del usuario. En este primer paso en la construcción de la herramienta se consideró como un tema fundamental la definición y el diseño de una estructura de almacenamiento de información para cada capa. Esta fue implementada utilizando XML para su posible sincronización posterior entre distintas versiones de capas asociadas a un mismo plano. El siguiente paso consistió en desarrollar la interfaz de creación y modificación de dicha capa mediante el uso de un dispositivo Tablet PC. Así, esta primera versión le permite a un usuario - en base a una serie de planos digitales - realizar marcaciones básicas con respecto a avances, utilizando así la aplicación como una base para futuros desarrollos en el tema. 24 Paralelamente, y no siendo éste un tema fundamental para este trabajo, también se investigó y analizó la posibilidad de lograr algún tipo de reconocimiento de las partes más relevantes de un plano arquitectónico, tales como puertas, ventanas, habitaciones, pasillos, entre otros. Al realizar esto y, considerando el uso de herramientas ya existentes, se evitó el haber tenido que desarrollar el reconocimiento de imágenes. Se concluyó finalmente que este reconocimiento es una propuesta interesante para una futura aproximación al tema. En resumen, el alcance de este trabajo de título constó en diseñar e implementar una capa sobre un plano arquitectónico, con el fin de poder marcar y comentar avances o modificaciones en una obra de construcción. Esto, con un soporte de almacenamiento de información basado en XML y haciendo uso de un dispositivo Tablet PC. Paralelamente, otro alumno [Moya 2007], trabajó en una sincronización de archivos XML de carácter genérico. Dicha investigación constituye un factor fundamental en la puesta en marcha de este proyecto, ya que permite la sincronización entre los registros de avances de una obra de distintos usuarios trabajando sobre la misma. 25 4. Diseño de la Solución 4.1. Consideraciones de Diseño A continuación se comentan algunas de las consideraciones que se tomaron en cuenta al momento de diseñar la solución de software a la problemática planteada, considerando tanto factores prácticos como de eficiencia. 4.1.1. Manipulación de Imágenes Dado que los proyectos de seguimiento creados por la aplicación desarrollada serán usados principalmente en terreno, fue imprescindible considerar su portabilidad. Es por esto que físicamente deben tener una estructura tal que permitan una fácil transmisión de ellos entre los usuarios, ya que se espera que el envío de proyectos entre los actores involucrados sea muy frecuente. Para solucionar la inquietud anterior se optó por incluir las imágenes de los planos en el archivo XML que contiene el proyecto. Esto se obtuvo utilizando una codificación en base 64 para las imágenes, con lo cual se logró que los proyectos dependan sólo de un archivo XML que almacene toda la información necesaria para utilizarlo en la aplicación. Asimismo, en referencia al tema de las imágenes a manipular, fue necesario tener en consideración sus tamaños ya que, por tratarse de representaciones de planos, en su mayoría se espera que éstos sean de gran tamaño, como mínimo 2.000 pixeles de largo y/o ancho. Por tal razón, operaciones del estilo de acercamiento o replicación de las imágenes en memoria no pueden ser implementadas a la ligera. Para evitar problemas en lo que respecta a este ámbito, sólo se mantiene en memoria la imagen del plano que se está desplegando, manteniendo el resto de las imágenes en disco de modo que, al realizar acercamientos, solamente se efectúa la operación al sector que queda visible para el usuario. De esta forma se logró independizar la aplicación del tamaño de las imágenes de los proyectos, logrando que la eficiencia no se vea perjudicada al manejar imágenes de gran tamaño. En la figura 7 se puede ver gráficamente cómo se realiza el recorte de una sección del plano para su despliegue. Este recorte se calcula en base a las dimensiones del control de visualización, ponderado por el inverso del factor de acercamiento. A modo de ejemplo, si el control tiene un tamaño de 100x100 pixeles y el factor de acercamiento es de 2, es decir un 200% de su tamaño original, el recorte del plano será de 50x50 pixeles. Esto ya que posteriormente será necesario ampliar el recorte por el factor de acercamiento, para así utilizar todo el espacio dispuesto para ello en la visualización. La operación recién descrita tiene sus consecuencias puesto que, en la manipulación de imágenes en C#, el origen del sistema de referencias corresponde al extremo superior izquierdo. Con la extracción del recorte del plano, implícitamente se modificó el sistema de referencias con el cual se tiene que trabajar, por lo que el nuevo origen se encuentra en el extremo superior izquierdo del recorte, lo que hace necesario – previo a su presentación sobre el plano - transformar las coordenadas almacenadas para las anotaciones al nuevo sistema. 26 Figura 7 - Ejemplo de recorte de una imagen para su despliegue 27 4.1.2. Manejo de Archivos XML Otra consideración importante es la eficiencia de la solución, la que depende de diversos factores, siendo uno de ellos la escalabilidad, en términos del tamaño de los proyectos. Es decir, la solución tiene que ser apta para realizar seguimientos a proyectos de gran envergadura, como por ejemplo el de un edificio, el cual puede llegar a contener más de un centenar de planos que lo describan. Por este motivo, la manipulación del archivo XML - que contiene al proyecto - pasa a ser de gran relevancia ya que cargarlo completo en la memoria del dispositivo móvil puede no ser la mejor opción. Teniendo presente esta consideración, se optó por leer en forma secuencial el archivo XML mediante XMLReader, un parser similar a SAX (por sus siglas en inglés Simple API for XML), cargando los datos en la estructura definida por la aplicación, evitando así utilizar un objeto DOM (Document Object Model), que sería la alternativa para manipulación de archivos XML, pues este último requiere de un gran uso de memoria para archivos de este tamaño. Considerando que las imágenes de los planos se incluyen dentro del archivo XML, se puede concluir que la lectura y escritura secuencial resultan más eficientes que cargar en memoria un objeto que represente al archivo XML del proyecto entero, bajo la premisa que sólo se va a utilizar una imagen del plano a la vez. Ahora bien, al almacenar las imágenes en una estructura de datos propia de la aplicación, igualmente se está incurriendo en un uso innecesario de memoria, ya que sólo se requiere manipular una imagen a la vez para desplegarla en el visor de la aplicación. Tomando en cuenta esta característica, a medida que se lee el archivo XML, se almacenan las imágenes en un directorio temporal, guardando en la estructura sólo las referencias a éstas. Así, se pretende disminuir el uso de memoria, utilizando en su lugar accesos a disco para obtener las imágenes de los planos, cuando el usuario cambie el plano a visualizar por la aplicación. Para el funcionamiento de la aplicación se generó un archivo de configuración adicional en formato XML –, el cual contiene información independiente de cada proyecto de seguimiento. Este archivo incorpora los estados posibles para las anotaciones asociados a sus respectivos colores, así como las imágenes utilizadas para marcar la existencia de anotaciones de texto asociadas a su estado de visualización. Al iniciar la aplicación, el contenido de este archivo es almacenado en memoria mediante el uso del patrón de diseño Singleton [Buschman, 1996] en dos clases distintas, de manera que todas las clases de anotación tengan acceso a estas asociaciones, abstrayendo el uso de estados de avance y visualización en el resto de las clases de la solución. 28 4.2. Estructura de las Anotaciones En esta primera versión, la solución desarrollada debía soportar sólo dos tipos de anotaciones: la delimitación de áreas o zonas mediante polígonos y el ingreso de texto a mano alzada, mediante el uso del lápiz. Sin embargo, la estructura de la aplicación se diseñó contemplando la futura necesidad por implementar nuevos tipos de anotaciones. Además, teniendo en cuenta que para cada anotación se pide como requerimiento almacenar una serie de información asociada - independiente del tipo al que pertenezca - se implementó una estructura de herencia. Con una clase base, Anotación, que agrupa los atributos y métodos comunes para todo tipo de anotación. De esta forma se logra una abstracción desde el punto de vista práctico, en que para la aplicación principal, el manejo de anotaciones es transparente, utilizando para ello polimorfismo. 29 Figura 8 - Diagrama de clases de Anotación En el diagrama de la figura 8 se puede apreciar la relación entre las clases que componen la estructura, así como también los métodos definidos por la clase Anotación que deben ser implementados por cada clase que herede de ella. z Métodos Virtuales de Anotación: c dibujaAnotacion: Método que encapsula la funcionalidad de dibujar la anotación. La idea es abstraer lo más posible a la aplicación principal de la lógica particular de cómo cada anotación se representa sobre el plano. Para esto, recibe como parámetros el objeto Graphics, donde está representado el plano, el factor de acercamiento con el cual se tiene que dibujar la anotación y un rectángulo especificando la sección de la imagen que va a ser desplegada en pantalla. 30 c z hitTesting: Este método recibe como parámetro un punto del plano, el cual el usuario seleccionó, y retorna un valor booleano dependiendo si el punto está haciendo contacto con la anotación en cuestión. Atributos comunes de una Anotación c Autor original: Define al usuario que genera la anotación. c Autor de última modificación: Define al último usuario que modificó la anotación c Fecha de creación: Fecha en la cual se genera por primera vez esta anotación. c Fecha de última modificación: Última fecha de modificación de la anotación. Se considera una modificación a cualquier cambio en los valores de los atributos que representan una anotación. c Estado: Estado de avance de la anotación, según se haya definido en el archivo de configuración. c Identificador: Código identificador único de la anotación. Se genera al momento de la creación de la anotación. 31 4.2.1. Definición de anotación Área La anotación Área implementa la necesidad de poder seleccionar una zona o área del plano, definiendo un estado de avance para ella. Este estado define, a su vez, un color semitransparente, con el cual el área puede ser visualizada por el usuario. La estructura del objeto se define por una serie de puntos ingresados por el usuario en forma secuencial, que pasan a formar los vértices del polígono que delimita al área. Los puntos seleccionados se almacenan en un arreglo de objetos Point en la variable vértices. Para dibujar la anotación sobre el plano, es necesario re-calcular la posición de los vértices almacenados, considerando la porción de la imagen del plano que se va a desplegar, así como también el factor de acercamiento utilizado. De esta manera se logra mantener la consistencia de posición del área con respecto a la imagen del plano. Por otro lado, el color y el factor de transparencia, también conocido como alfa, se obtienen del administrador de estados, utilizando para ello el estado de la anotación a dibujar. En el caso de detección de la selección del objeto, mediante el puntero del dispositivo móvil por parte del usuario, se genera un polígono con las coordenadas almacenadas, utilizando una estructura provista por C# (llamada GraphicsPath), para luego chequear mediante dicha estructura si el punto seleccionado por el usuario está contenido por el polígono. 4.2.2. Definición de anotación TextoLibre La anotación TextoLibre satisface la necesidad de almacenar la información del ingreso de texto a mano alzada por parte del usuario. En este caso, el objeto sólo almacena la posición que marca la existencia de una anotación realizada a mano alzada, puesto que los trazos que ingresa el usuario son almacenados en la aplicación principal por medio de la clase inkOverlay. La posición es almacenada con respecto al origen del plano y se representa gráficamente con una imagen designada para ello, la cual se obtiene a través del administrador de marcas, utilizando el estado de avance de la anotación. En este caso, la acción de dibujar la anotación representa la visualización gráfica de la marca que hace referencia al texto. Se implementó de esta forma para evitar que el despliegue del plano se vea colapsado por el texto que se ha ingresado en él. El texto oculto es referenciado mediante unas imágenes designadas para ello, que al ser seleccionadas permiten mostrar u ocultar el texto asociado. En consecuencia, dibujar la marca de la anotación implica re-calcular la posición de ella en base a las coordenadas del origen de la porción del plano a visualizar, junto con el factor de zoom, dibujando por sobre el plano la marca correspondiente. 32 Para la detección de la selección de la anotación por parte del usuario, se realiza un proceso similar al caso de las áreas, pero utilizando un rectángulo que está definido por el tamaño de la imagen que se despliega referenciando al texto. Luego, se verifica si el rectángulo contiene el punto seleccionado por el usuario, retornando un valor booleano según sea el caso. 4.3. Estructura de Capas Para satisfacer la necesidad de desplegar las anotaciones a realizar por la aplicación sobre el plano sin modificar la imagen original, se optó por un diseño de capas. Este diseño permite tener una capa o layer para cada imagen representativa de un plano, en la cual se almacenan las anotaciones. Cada capa se simula por medio de una lista, mediante un objeto ArrayList que contiene las anotaciones. De esta manera, por ejemplo, para dibujar las anotaciones se debe iterar sobre esta lista, manipulando cada anotación para discernir si debe ser desplegada o no, dependiendo del valor de sus atributos. Ahora bien, como un proyecto de construcción consta de más de un plano, alcanzando a tener en ciertos casos una gran cantidad de ellos, se utiliza una tabla de Hash para almacenarlos, teniendo como llave para cada plano el nombre de éste. Luego, como cada plano se subdivide en una serie de tipos de planos, el valor para cada llave es un arreglo finito, que contiene en cada una de sus casillas un objeto representativo del tipo de plano, llamado PlanoDigital. Este objeto, llamado PlanoDigital, es el que contiene tanto la imagen original del plano como también la lista que representa la capa por sobre éste, definida anteriormente. En estricto rigor, más que el Bitmap del plano, contiene en disco la ruta a éste, almacenada en un directorio temporal, como una manera de no abusar del uso de memoria, cargando sólo la información en memoria cuando se visualiza el plano. Además, el objeto tiene atributos que definen las coordenadas de origen del recorte del plano desplegado, así como también su factor de acercamiento. Estos últimos son reiniciados cada vez que se abre un proyecto de seguimiento y son necesarios para no perder la visión en la que el usuario dejó el plano cuando decide revisar otros, para luego volver a trabajar en la misma posición. 33 Figura 9 - Estructura de simulación de capas Con la estructura descrita, es posible tener una serie de planos donde cada uno de ellos se compone de un número finito de tipos de planos, obteniendo una capa de anotaciones sobre cada uno de estos tipos. Además, el objeto definido para contener la imagen y la lista de anotaciones pasa a ser considerado como el plano de seguimiento, pues no sólo consta de la imagen del plano, sino que también de las anotaciones de avances realizadas sobre él. En la figura 9 se puede ver de forma más clara la asociación entre las clases. La clase Administrador es la clase principal de la aplicación. 4.4. Capa de Texto utilizando InkOverlay La manipulación de texto a mano alzada en la aplicación se lleva a cabo mediante el uso de la clase InkOverlay, la que provee las funcionalidades necesarias para ingresar el texto a través del lápiz del dispositivo Tablet PC, así como también las de almacenamiento y agrupación de los trazos ingresados. Esta clase está incorporada dentro de la librería Microsoft.Ink, que pertenece a las utilidades de desarrollo de software de los dispositivos Tablet PC (Software Development Kit). Lógicamente, este objeto puede ser visto como una capa complementaria para la capa de anotaciones, pues contiene los trazos asociados a las anotaciones almacenadas para cada plano. La diferencia es que se utiliza el mismo objeto InkOverlay para todo el proyecto de seguimiento, gracias a la colección incorporada por InkOverlay para agrupar trazos que compartan una cierta lógica. En este caso, la lógica de agrupación corresponde a un conjunto de trazos que definen el contenido de una anotación de texto a mano alzada. 34 Cada uno de estos conjuntos de trazos están asociados a una palabra clave, con la cual se almacenan y es posible recuperarlos, similar a la idea de una tabla de Hash. Por lo que, al crear una anotación de texto a mano alzada, además de generar el objeto anotación, se guardan los trazos ingresados por el usuario en un nuevo conjunto, con el identificador del objeto anotación como la llave del conjunto. De esta manera, para poder desplegar un conjunto de trazos almacenados, es necesario contar con el identificador de la anotación asociada. Esta agrupación de trazos realizada por el objeto InkOverlay también permite manipular cada conjunto de trazos por separado. Esto da la posibilidad de tener sólo uno de estos objetos para cada proyecto de seguimiento, desplegando el texto almacenado con el identificador de la anotación que el usuario seleccione. De esta forma, al cambiar de plano visualizado basta con ocultar todas las agrupaciones, mostrando sólo las que sean visibles en el nuevo plano seleccionado. La decisión de diseño de utilizar sólo un objeto InkOverlay por cada proyecto de seguimiento se tomó teniendo en consideración que - dadas las funcionalidades que ofrece - no se justificaría tener uno por plano, como podría pensarse lógicamente que debiera ser. Dada la forma en que se diseñó, cada anotación de texto a mano alzada tiene implícitamente asociada una agrupación de trazos, la cual puede ser obtenida con su atributo de identificador único. Además, al incluir sólo un objeto InkOverlay, se simplifica el proceso de almacenamiento del texto en el archivo XML, ya que la alternativa de tener un InkOverlay por plano, o que cada anotación de texto libre almacene sus propios trazos implica no sólo más procesamiento sino también lo hace más complejo. 35 4.5. Sincronización entre las Capas Una vez que ya está claro el funcionamiento de cada capa por separado, es necesario evidenciar cómo se llevó a cabo la sincronización entre ellas, pues es fundamental que las anotaciones se desplieguen en la misma posición en que el usuario las ingresó ya que, de lo contrario, éstas pierden sentido. En primer lugar, la imagen del plano a visualizar se carga en memoria y es almacenada de forma temporal en la clase principal de la aplicación. Luego, se extrae la porción de la imagen que va a ser desplegada, en base a la posición y al factor de acercamiento que tenga el plano, para dibujarlo como imagen de fondo en el visor. Una vez que se tiene el fondo, se proceden a dibujar las anotaciones del plano sobre la imagen del visor, modificando la visibilidad de la agrupación asociada a cada anotación de texto libre en el objeto InkOverlay según corresponda. Ahora bien, las coordenadas del origen del visor representan - en realidad - las coordenadas del extremo superior izquierdo del extracto de la imagen obtenida. Como las coordenadas almacenadas por las anotaciones consideran el origen del sistema de referencias el extremo superior izquierdo de la imagen del plano, es necesario realizar las operaciones pertinentes para dibujar las anotaciones en el lugar que les corresponda. Para esto se utiliza la siguiente fórmula: P' = (P – V) * Zoom donde P' representa la posición en el nuevo sistema de referencias; P es el punto almacenado por la anotación con respecto al origen de la imagen; V es el origen de la fracción extraída de la imagen para ser desplegada y Zoom es el factor de acercamiento utilizado. En el caso de la sincronización del plano con el objeto InkOverlay, es un poco más complejo, ya que éste utiliza un sistema de coordenadas propio, para lo cual es necesario transformar los valores de desplazamiento antes de realizar la operación. Por otro lado, el origen de ese sistema de coordenadas coincide en todo momento con el extremo superior izquierdo del visor de la aplicación, por lo que es necesario desplazarlo en el sentido contrario de manera que permanezca en el lugar que le corresponde. Además, como se utiliza sólo una estructura InkOverlay para todo el proyecto de seguimiento, es preciso ajustar la posición de ésta cada vez que se cambie el plano a visualizar para, de forma de mantener la relación entre las anotaciones y el texto almacenado. 36 4.6. Implementación de Marcas y Estados Dentro del alcance de este proyecto se implementaron dos tipos de anotaciones para realizar el seguimiento a las obras, estructurando la solución de tal forma que a futuro se puedan agregar más tipos sin mayores problemas. Ahora bien, cada una de estas anotaciones se despliega en pantalla de diferente manera: una utilizando un color para rellenar un área y la otra mediante una imagen pequeña, marcando la posición de un texto asociado. Dado que se utilizó polimorfismo para abstraer a la clase principal de los distintos tipos de anotaciones, es necesario solucionar el problema de cómo cada anotación obtiene el color asociado a su estado, o bien la imagen que representa la marca. Para esto la aplicación utiliza dos tipos de estados: el estado de avance, que representa el estado en el que se encuentra cada anotación mediante el cual se realiza el seguimiento al proyecto, y el estado de visualización, que representa la forma en que cada anotación será visualizada. Esto último es principalmente relevante para las anotaciones de texto a mano alzada, ya que decide con qué imagen se va a marcar la existencia de este tipo de anotación. Ahora bien, tanto los estados de avance como los estados de visualización son inicializados en la aplicación por medio de un archivo de configuración, en el cual deben estar definidos sus nombres y asociaciones con color e imagen respectivamente. Para efectos de este proyecto se utilizaron tres tipos de estados, tanto para el avance como para la visualización. Para resolver el problema planteado, se recurrió a la utilización del patrón de diseño Singleton [Buschman, 1996], instanciándolo al iniciar la aplicación con los datos almacenados en el XML de configuración. De esta forma, al generar una nueva instancia de un objeto Anotación, éste referencia a la clase de administración que le corresponda, obteniendo de ella el detalle del color o la imagen para referenciar la marca. Figura 10 - Diagrama de clases de uso de Administradores 37 En la figura 10 se observa la interacción de las anotaciones con los administradores. En el caso del administrador de estados, éste cuenta con una tabla de Hash donde almacena la asociación entre los estados de avance de una anotación y su color representativo. Por su parte en el caso del administrador de marcas se utiliza simplemente una lista en que cada posición representa el tipo de visualización con la imagen asociada a éste. 38 4.7. Estructura de Almacenamiento Como parte fundamental del trabajo realizado se encuentra la propuesta e implementación de una estructura de almacenamiento para los proyectos de seguimiento, la cual permita la persistencia de las anotaciones ingresadas, así como también de las modificaciones realizadas. Dentro de los requisitos para la aplicación se especifica que el formato del archivo con la estructura definida debe ser XML, de forma de poder hacer uso de la sincronización para estos archivos, desarrollada en forma paralela. La primera consideración a tener en cuenta para la definición de la estructura del archivo, es que debe contener información general referente al proyecto de seguimiento, así como nombre y versión. Lo anterior se torna fundamental si se toma en cuenta que dentro de los alcances de la aplicación para trabajos futuros se encuentra la incorporación de un manejo de versiones, sustentado en las modificaciones que se le van realizando a las imágenes de los planos. Además, como en el diseño se consideró hacer uso de sólo un objeto – InkOverlay - para almacenar los textos ingresados a mano alzada, se optó por guardar esta estructura en su completitud en vez de extraer cada conjunto de trazos para almacenarlo en la anotación que le corresponda. Esto último, serializando el objeto en base 64 y almacenándolo previo a la definición de los planos. Figura 11 - Extracto de almacenamiento de proyectos en XML Para almacenar los planos, es importante que la estructura definida permita asociar, para cada tipo de plano, su imagen relacionada y las anotaciones que se hayan realizado sobre ella, agrupando cada uno de estos tipos definidos dentro de una zona o área de la obra referenciada como plano. Lo recién descrito debe poder repetirse tantas veces como planos haya en el proyecto, y cada uno de estos planos debe poseer un nombre asociado de forma de ser fácilmente identificable dentro de la aplicación. 39 Figura 12 - Extracto de XML de almacenamiento En cuanto al almacenamiento de las anotaciones para cada tipo de plano, se barajaron dos alternativas posibles. La primera consistía en desglosar el objeto de cada anotación mediante el uso de polimorfismo, cada anotación se representaba en formato XML según correspondiera para posteriormente, al abrirse un proyecto almacenado, se hiciera el procedimiento inverso en cada caso. La otra opción consistía en serializar y des-serializar en formato XML los objetos de anotación, según el tipo de objeto que fuere, haciendo uso para ello de las librerías provistas por el framework. Se optó por esta última alternativa debido a que simplifica en gran medida el código, evitando así tener que realizar modificaciones a futuro si se desean agregar más atributos a cada anotación y/o crear nuevos tipos de anotaciones. Figura 13 - Extracto de almacenamiento de anotación de texto a mano alzada 40 4.8. Diagrama de Clases Hasta ahora se han explicado en forma separada cada uno de los componentes de diseño que conforman la solución, los cuales se relacionan de una u otra manera a la clase principal, Administrador. Ella contiene la implementación del flujo de la interacción con el usuario, así como también los procesos de lectura y almacenamiento de proyectos en disco. Con las consideraciones anteriores, la idea central es abstraer las particularidades de diseño de la solución para que sean utilizadas en esta clase principal. Figura 14 - Diagrama de clases de la solución 41 5. Prototipo Implementado En esta sección se documenta tanto la propuesta de diseño y la usabilidad implementada para la solución, como también las acciones posibles a realizar por los usuarios para manipular los proyectos de seguimiento administrados a través de la aplicación. 5.1. Estructura de la Herramienta Desde un punto de vista de usabilidad, la aplicación se podría definir en dos conceptos: por un lado, la manipulación de las imágenes, es decir, la posibilidad de desplazarse por el plano, realizar acercamientos y agregar anotaciones. Por otra parte, la navegación de los planos y la manipulación de los detalles de las anotaciones. Para satisfacer estas necesidades, se plantea un diseño con dos barras de herramientas, una para cada uno de los conceptos definidos respectivamente, facilitando de esta manera la utilización de la aplicación desde un punto de vista de usabilidad. Figura 15 - Vista general de la Aplicación 42 Leyenda de Figura 15: 1. Menú de la aplicación: menú con acciones generales para la manipulación de proyectos de seguimiento y para las anotaciones. 2. Barra de herramientas de imágenes: barra de herramientas con funcionalidades para la manipulación de las imágenes de los planos. 3. Seleccionador de planos: herramientas para la navegación de los proyectos de seguimiento. 4. Detalle de anotaciones: despliegue de los detalles de las anotaciones, así como también botón para crearlas y guardar los cambios realizados en el estado de éstas. 5. Visor de imágenes: espacio de despliegue de las imágenes de los planos. 5.2. Menú de la Aplicación La aplicación, como requisito, debe proveer las funcionalidades básicas para la manipulación de archivos. En este caso se manipulan archivos XML con el formato definido para los proyectos de seguimiento. El menú asociado a la manipulación de proyectos provee 4 funcionalidades vitales para poder realizar un buen uso de la aplicación, en cuanto a crear, abrir y guardar proyectos de seguimiento. Figura 16 - Acciones para la manipulación de proyectos Figura 17 - Acciones para la manipulación de anotaciones 43 5.2.1. Crear nuevo Proyecto Esta función se utiliza para generar un nuevo proyecto de seguimiento en base a las imágenes del plano, para luego dejarlo abierto en la aplicación. La creación del proyecto requiere un directorio con un cierto formato, en el que utiliza los nombres de las carpetas y los nombres de las imágenes para generar el proyecto de acuerdo a las características de la obra. Figura 18 - Ejemplo de estructura de directorios para crear un nuevo proyecto de seguimiento El directorio raíz que contenga las imágenes del nuevo proyecto debe llevar el nombre que se le quiera asignar al proyecto. En el ejemplo de la figura 18, “nuevo proyecto”. Dentro de éste, deberá haber un directorio para cada agrupación de planos que posea el proyecto. En este caso, se utiliza el modelo de un edificio o casa, con los planos de los tres primeros pisos más el patio delantero, en el que el nombre de cada directorio pasa a ser el nombre de la agrupación de planos dentro de la aplicación. Dentro de cada directorio, se esperan las imágenes de los tipos de planos, los cuales tienen que hacer referencia en su nombre al tipo que correspondan: si son eléctricos, “_eléctrico” ó estructurales, “_estructural”. Además, pueden estar en cualquier formato de mapa de bits (jpg, png, bmp, etc.). El proyecto, posteriormente, debe ser guardado por el usuario en un nuevo archivo: Opción “Guardar como...”, asignándole el nombre que se desee, el cual es independiente del nombre almacenado internamente por la aplicación para el proyecto. 5.2.2. Abrir Proyecto Opción que permite abrir un proyecto de seguimiento previamente creado por la aplicación, almacenado en un archivo XML, según la estructura definida anteriormente. No permite abrir archivos que no cumplan con dicho formato. 44 5.2.3. Guardar Proyecto La aplicación implementa dos formas de guardar el proyecto actualmente en uso; la primera lo hace en el mismo archivo que fue abierto, reescribiéndolo de manera de guardar los cambios realizados. La segunda consta en guardarlo en un archivo distinto al que se utilizó para abrirlo, el que puede ser un archivo nuevo o también se puede escribir sobre uno ya existente. Luego, la aplicación hace uso de este último para la acción de “Guardar”. El archivo actualmente en uso puede ser visto sobre la barra del menú de la aplicación, en el título de ésta, donde se hace referencia a su localización en disco. Figura 19 - Ejemplo de nombre de archivo en título de la aplicación 5.2.4. Manipulación de Anotaciones En esta primera versión de la aplicación, sólo se implementó la acción de ocultar todas las anotaciones de texto visibles, en vez que el usuario tenga que ocultarlas de a una. Lo relevante de este menú fue dejar propuesta su existencia con el objetivo que, en futuras versiones, albergue otro tipo de acciones útiles para la manipulación de anotaciones. 5.3. Barra de Herramientas de Imágenes Para la manipulación de las imágenes de los planos se implementó una barra de herramientas - en la parte superior de la aplicación, referenciada por el número 2 en la figura 15 en la cual se le presentan al usuario tanto las opciones básicas de acercamiento y desplazamiento de las imágenes, como también la funcionalidad para crear nuevas anotaciones. Además, muestra una leyenda descriptiva acerca de las distintas marcas utilizadas para las anotaciones de texto asociadas a su significado. En la figura 20 se muestra la barra de herramientas de imágenes, donde se pueden diferenciar tres zonas: las acciones a realizar por el puntero, ya sea desplazamiento o creación de nuevas anotaciones, una para aumentar o disminuir el factor de acercamiento o zoom para la imagen y, finalmente, el cuadro de leyenda de anotaciones descrito anteriormente. Figura 20 - Barra de Herramientas de imágenes 45 5.3.1. Modo de Desplazamiento / Zoom Al seleccionar este modo, es posible desplazarse por la imagen del plano elegido mediante el lápiz del dispositivo Tablet PC. Para esto, es necesario pinchar un punto del plano y arrastrar el lápiz en dirección contraria a la cual se desee desplazar. Lo anterior resulta sumamente intuitivo, debido a que es el movimiento normal que un usuario realizaría si quisiera desplazar la vista del plano. El movimiento de desplazamiento finaliza una vez que el lápiz es levantado de la pantalla, dejando de hacer contacto con ella. En este modo también es posible realizar acercamientos o alejamientos, utilizando para ello los botones “+” o “-” ubicados en la barra, o bien seleccionar un nuevo valor en el campo de selección que despliega el zoom actual del plano. Por otro lado, ésta también es la modalidad para seleccionar anotaciones mediante contacto con la marca o la superficie de la anotación. En el caso de anotaciones de texto, las marcas que hacen referencia a éstas cambiarán según el estado de visualización que tengan, descritos en la barra en “Leyenda Anotación”. Además, haciendo uso del botón del lápiz que simula la acción de realizar un click con el botón secundario de un mouse, es posible eliminar anotaciones al seleccionarlas, tal como se observa en la figura 21. Figura 21 - Ejemplo de eliminación de anotación 46 5.3.2. Modo de Marcar Anotaciones Para el modo de marcado de anotaciones, se debe seleccionar la opción “Marcar” ubicada en “Acciones de Puntero”. En este modo el usuario tiene la opción de crear nuevas anotaciones, utilizando el lápiz debe seleccionar en la imagen el punto donde quiera crearla. En esa posición, se despliega un menú con las posibilidades de anotaciones a crear. Para las anotaciones de área, este es el primer punto del polígono a definir, mientras que para las de de texto es la posición de la marca que hace referencia al texto. Figura 22 - Ejemplo de creación de nueva anotación 5.3.2.1. Creación de Anotaciones de Área Para la creación de una anotación de área, la aplicación utiliza el primer punto ingresado como el primer vértice del polígono a definir, esperando que el usuario ingrese el resto de los vértices del área, para luego finalizar la aplicación con el botón “guardar”, ubicado en la barra de herramientas de planos. Es importante destacar que los vértices deben ser ingresados en orden, pues así es como se ingresan en la aplicación. Los puntos que el usuario va seleccionando para ser vértices del polígono que definen el área de la anotación, se van marcando de color rojo a modo de recordatorio exacto del lugar donde estos puntos están ubicados, como se puede ver en la figura 23. 47 Figura 23 - Ejemplo de ingreso de anotación de área 5.3.2.2. Creación de anotaciones de texto a mano alzada En el caso de las anotaciones de texto a mano alzada, el puntero del lápiz cambia a un punto para ingresar trazos, utilizando el visor de la aplicación como un espacio de dibujo. El punto seleccionado inicialmente para crear la anotación se usa para desplegar la marca asociada al texto a ingresar. En este caso, todo trazo ingresado queda guardado bajo ésta, sin importar cuantas veces se levante el lápiz de la pantalla. Esto es debido a que la aplicación agrupa los trazos según la anotación a la cual correspondan. En la figura 24 se puede apreciar un ejemplo del ingreso de una anotación de texto. Figura 24 - Ejemplo de ingreso de nueva anotación de texto Para asignarles un estado y finalizar las anotaciones ingresadas, tanto de área como de texto, se utiliza el área habilitada para ello en la barra lateral “Detalle Anotación”. 48 5.3.3. Leyenda de Anotaciones La leyenda de anotaciones se despliega con fines meramente informativos, recordando al usuario los estados posibles para las anotaciones de texto. En la figura 25 se puede ver un ejemplo de los tres estados posibles para una de estas anotaciones. Figura 25 - Ejemplo de visualización de anotaciones de texto 49 5.4. Seleccionador de Planos Para la navegación de los planos del proyecto, se implementó un campo de selección donde se listan todas las zonas disponibles para la obra de construcción. Para cada una de las zonas existen dos tipos de planos, el estructural y el eléctrico. Éstos son los dos que se implementaron en el prototipo. Al seleccionar una zona y un tipo de plano, la imagen asociada se despliega en el visor de imágenes, pudiendo de esta forma registrar el avance para el plano seleccionado. Es importante destacar que, para una mejor usabilidad de la aplicación, se implementó una memoria temporal de la posición en que se deja cada plano, de forma que permita navegar por distintos planos y, al volver a alguno ya visualizado, éste se encuentre en la misma posición en que se dejó. Se habla de temporal debido a que sólo sucede mientras se tiene abierto el proyecto. Una vez que se finaliza, se reinician los valores tanto de desplazamiento como de acercamiento para todos los planos. Figura 26 - Ejemplo de selección de plano 50 5.5. Detalle de Anotación Esta zona se utiliza para el despliegue del detalle de las anotaciones, lo que ocurre cuando una anotación es seleccionada por el usuario en modo de desplazamiento. Además, se utiliza junto con la creación de anotaciones para asignarles un estado y guardarlas en la aplicación. También es posible cambiar el estado de las ya existentes, guardando los cambios al finalizar. Figura 27 - Ejemplo detalle de anotación 51 5.6. Visor de Imágenes El visor de imágenes hace referencia a un espacio habilitado para el despliegue de las imágenes de los planos. Sólo se despliega una imagen si existe un plano seleccionado, en caso contrario no se muestra ninguna imagen. Además, contiene barras de desplazamiento como forma alternativa para moverse en el plano. Figura 28 - Ejemplo visor de imágenes 52 6. Resultados Preliminares Durante el desarrollo del prototipo, las instancias de validación se basaron en reuniones semanales con el Profesor Guía Dr. Sergio Ochoa y el alumno de magíster Gabriel Bravo, quien continuará el trabajo realizado. En dichas reuniones se validaban las funcionalidades obtenidas, así como también se delineaban los siguientes pasos a seguir. En una instancia final de validación del prototipo desarrollado, se realizó una reunión con un profesor de Ingeniería Estructural de la Pontificia Universidad Católica de Chile, Dr. Diego López-García, quien tiene vasta experiencia en gestión de proyectos de construcción. El objetivo de la reunión fue exponer la solución obtenida, recibiendo indicaciones – desde su perspectiva y experticia en el tema - acerca de la utilidad que puede tener en la práctica en su estado actual, así como también cuáles son las proyecciones futuras para el proyecto. Se lograron interesantes resultados en dicha reunión, ya que, por un lado, aterrizó en cierta manera el proyecto, haciéndonos notar que el prototipo trataba de resolver tres problemas en uno. Esto último, dado que el seguimiento de una obra de construcción se puede dividir en tres partes: un seguimiento estructural, otro arquitectónico y, finalmente, las terminaciones como cañerías y sistema eléctrico, entre otros. Dado lo anterior se tienen tres tipos de seguimiento, para lo cuales no se hace una diferenciación en la aplicación. También nos reafirmó que el estándar - al menos en Chile - para realizar seguimientos a las obras se lleva a cabo a través de la utilización de cartas Gantt, usualmente mediante el software Microsoft Project. Lo anterior, acotando que tanto la elaboración como la actualización de dichas cartas Gantt son un “cuello de botella” no menor en el proceso de seguimiento. Por ello una potencial utilidad de la aplicación, en un estado más avanzado, podría ser la de apoyar ese proceso, actualizando las cartas Gantt a medida que se marcan los avances en el software. Respecto a las anotaciones implementadas por este prototipo, en el tema de la selección de áreas propuso validar la utilidad de asociar un volumen a cada área, para que, de esta manera, el usuario pueda calcular el uso de materiales en el seguimiento de planos estructurales. En este punto, la selección de las áreas para cada plano requiere un trabajo extra, el cual no es despreciable, por lo que, idealmente, los datos podrían ser obtenidos directamente desde el software CAD utilizado para la elaboración de los planos. El problema con la idea planteada es que el formato que poseen los planos al generarlos vía CAD es propietario, lo que haría muy difícil la labor de importarlos a la aplicación. En el tema de las anotaciones de texto a mano alzada se validó que su uso sería útil para los tres tipos de seguimiento, constituyendo una anotación fundamental para dar libertad al usuario de expresar cualquier tipo de comentario o ajuste, sin verse en la obligación de utilizar las opciones provistas a futuro para cada tipo de seguimiento. 53 7. Discusión y Conclusiones El trabajo realizado cumple a cabalidad con los objetivos generales planteados en un comienzo, puesto que se logró diseñar e implementar un prototipo funcional para realizar seguimientos de obras de construcción. Más aún, se lograron validar en forma preliminar los alcances de la solución obtenida con una persona experta en el área de gestión de proyectos de construcción. Pese a que los resultados no fueron totalmente satisfactorios desde el punto de vista de satisfacer las necesidades para realizar un seguimiento real, sí se consiguió una visión más clara para delimitar los próximos avances en el desarrollo del proyecto, de manera de permanecer alineados con las necesidades de gestión de las obras de construcción. En cuanto a los objetivos específicos definidos inicialmente, también se lograron soluciones satisfactorias ya que, en una primera instancia, se diseñó e implementó una estructura para el almacenamiento de los datos de seguimiento ingresados a través de la aplicación. Es más, no sólo se logró esto, sino que la estructura que posee el archivo XML es tal, que permite que contenga todo el proyecto sin depender de otros archivos, como por ejemplo imágenes. Dado lo anterior, además se cumple el requisito de portabilidad exigido, facilitando el futuro traspaso de proyectos entre usuarios. Otro de los objetivos logrados de manera exitosa fue el diseño de una interfaz gráfica que le permite al usuario navegar en forma rápida y fácil por los planos del proyecto. Además, le permite manipular las imágenes desplegadas en el visor, para lo cual se terminó implementando como parte del trabajo - el desplazamiento y acercamiento de éstas, luego de utilizar y validar el uso de un componente externo que realizaba dichas funciones. Con lo anterior, el proyecto se vio beneficiado por una mejor sincronización entre las capas de anotaciones y se logró una mejor eficiencia al navegar por un plano. Al ser ésta la primera aproximación para una solución al seguimiento de obras de construcción, se investigó como objetivo central un prototipo funcional de manera de poder validarlo y continuar el trabajo en base a las indicaciones recibidas. Ahora bien, desde un punto de vista más técnico, la idea fue también el generar una base de código que permita, dada la retroalimentación recibida con respecto a las funcionalidades, servir de inicio para futuros desarrollos. Para ello, durante el proyecto se consideraron medidas en el diseño para satisfacer futuras demandas como, por ejemplo, la estructura para soportar nuevos tipos de anotaciones tanto en la aplicación como también en el archivo de almacenamiento. En resumen, tanto los logros como las conclusiones obtenidas en este trabajo de título son fundamentales para futuros desarrollos en el área de soluciones tecnológicas para el control de avances en obras de construcción. Basados en el desarrollo realizado y en las indicaciones obtenidas por el Ingeniero Civil ya mencionado, es posible modificar las funcionalidades ofrecidas actualmente por la aplicación, con el objetivo de satisfacer las necesidades existentes en la industria. Así, ésta podrá servir de herramienta en próximos desarrollos con versiones más aterrizadas a los requerimientos de los usuarios que realizan los seguimientos de las obras en terreno. 54 8. Trabajo a Futuro Al ser éste el primer trabajo de desarrollo de software para el apoyo al seguimiento de avances en obras de construcción en el Departamento de las Ciencias de la Computación, es mucho lo que falta por hacer. La idea de esta sección es que sirva para los trabajos que continúen a éste, aportando ideas y dejando en claro los principales caminos a seguir. El primer tema planteado consiste en una investigación para validar el posible uso de formatos de archivos propios de software CAD, utilizados por arquitectos e ingenieros civiles para la confección de los planos, para cargar la información inicial al proyecto de seguimiento, en vez de utilizar las imágenes en formato de mapa de bits. La gran falencia del prototipo en su estado actual es la necesidad de que el usuario le indique los puntos de interés para el seguimiento, así como áreas y puntos específicos, lo que implica un tiempo extra en los procesos ya existentes. El caso ideal se lograría al eliminar o reducir dichos tiempos adicionales, permitiendo optimizar los procesos de seguimiento realizados para la gestión de los proyectos de construcción. Ahora bien, la utilización de archivos de formato CAD para la carga inicial de los proyectos puede resultar una tarea muy difícil, imposible en cierta medida, pues se trata de formatos propietarios de las empresas que comercian el software, por lo que su estructura interna es desconocida. En caso que no se obtengan resultados positivos, se propone una investigación referente al reconocimiento de imágenes, en particular de planos, con el mismo objetivo de la investigación anterior, es decir, automatizar la detección de elementos relevantes para el seguimiento. De esta manera, se busca dar un paso más hacia la optimización en el proceso de seguimiento ya que, pese a no representar una disminución total del tiempo de configuración, sí es posible reducirlo comparativamente a lo que se debe realizar en la actualidad. Referente a otro tema para futuros avances, se pudo concluir de la reunión con el Ingeniero Civil que el prototipo actual trata de abarcar tres tipos de seguimientos distintos: uno estructural, otro arquitectónico y finalmente el de terminaciones. Por ello se deja propuesto que, en próximos desarrollos, se dividan éstos en tres vistas distintas para un proyecto para, de esta manera, ofrecer las funcionalidades adecuadas para cada tipo de seguimiento. Las diferencias radican, principalmente, en que se interesa administrar tipos de marcas particulares para cada caso, con distintas opciones, por lo que habría que validar si la separación de dichas vistas ofrece una mejor usabilidad para la aplicación. Para el apoyo, tanto a la posible implementación de los distintos tipos de seguimiento, así como también al prototipo en su estado actual, sería de gran valor efectuar nuevos tipos de anotaciones. Para esto, se propone validar e implementar el uso de anotaciones de audio como alternativa a las de texto a mano alzada, lo que permitiría al usuario realizar anotaciones en un menor tiempo, facilitando así, su labor de realizar el seguimiento a la obra. Incluso, podría ser utilizado de forma complementaria, implementando anotaciones híbridas, en las que el usuario pueda asociar texto y audio al mismo punto referencial en el plano. 55 A su vez, para la implementación de los distintos tipos de vistas, podría ser de gran utilidad permitir al usuario definir cuáles son los puntos relevantes para el seguimiento de avance para cada tipo. Por ejemplo, en un seguimiento de un plano de terminaciones eléctricas, permitir al usuario ingresar las posiciones de los enchufes y paneles. Dado que en caso de no tener un reconocimiento previo de estos puntos de interés, es sumamente importante contar con esta funcionalidad. Asimismo, el ejemplo anterior puede ser extendido para seguimientos estructurales, arquitectónicos y otros tipos de terminaciones, previa definición de cuales son los puntos de interés en cada caso. Finalmente otra de las proyecciones obtenidas de la reunión con el Ingeniero Civil, fue la posibilidad que la aplicación se sincronice de alguna forma con el software Microsoft Project, utilizado actualmente para llevar a cabo el seguimiento de avances mediante cartas Gantt. Dado lo anterior, se propone una validación de la posibilidad de realizar dicha función, principalmente investigar cómo poder realizar las asociaciones entre las tareas creadas en MS Project y las anotaciones generadas en la aplicación de seguimiento. El objetivo principal de esto radica en la posibilidad de actualizar automáticamente las cartas Gantt según los avances que se vayan registrando en la aplicación y, de esta forma, optimizar los tiempos utilizados actualmente para ese fin. 56 9. Bibliografía y Referencias [Buschman, 1996] Buschman, F., Meunier, R., Rohnert, H., Sommerland, P., Stal, M.: PatternOriented Software Architecture: A System of Patterns. John Wiley & Sons, 1996. [Kamel, 1993] Kamel, N. An Integrated Approach to Shared Synchronous Groupware Workspaces. Proceedings of the Fourth Workshop on Future Trends of Distributed Computing Systems, IEEE Computer Society Press, pp. 157-163. Lisbon, Portugal, 1993. [Moya, 2007] Moya, C. Módulo para la Sincronización Automática de Documentos XML. Memoria de Ingeniero Civil en Computación. DCC, Universidad de Chile, Julio, 2007. [Nah, 2005] Nah, F., Sheng, H. The Value of Mobile Applications: A Utility Company Study. Communications of the ACM, Vol. 48, No. 2. pp. 85-90. 2005. [Neyem, 2005] Neyem, A., Ochoa, S.F., Guerrero, L.A., Pino, J.A. Sharing Information Resources in Mobile Ad-hoc Networks. 11th Int. Workshop on Groupware (CRIWG 2005). Lecture Notes in Computer Science. Springer. Porto do Galinhas, Brazil. Sept. 2005. [Neyem, 2006] Neyem, A., Ochoa, S.F., Pino, J.A. A Strategy to Share Documents in MANETs using Mobile Devices IEEE 8th International Conference on Advanced Communication Technology (ICACT 2006). Phoenix Park, Korea. Feb. 2006. [Perry, 2001] Perry, M., O'Hara, K., Sellen, A., Brown, B., Harper, R. Dealing with mobility: understanding access anytime, anywhere. ACM Trans. Computer-Human Interactions, Vol. 8, No. 4. pp. 323-347. December 2001. [Sanchez, 2002] Sánchez, G. Lladós, J., Tombre, K. A mean string algorithm to compute the average among a set of 2D shapes. Pattern Recognition Letters. Vol. 23, No. 1-3. Pp. 203-213 2002. [Sánchez, 2003] Sánchez, G., Valveny, E., Lladós, J. Martí, E., Ramos, O., Lozano, N., Mas, J. A system for virtual prototyping of architectural projects. Proceedings of Fifth IAPR International Workshop on Pattern Recognition, pp. 65-74, Barcelona, Spain. July 2003. [Schaffers, 2006] Schaffers, H., Brodt, T., Pallot,M., Prinz, W. (eds). The Future Workplace Perspectives on Mobile and Collaborative Working, Telematica Instituut, The Netherlands. 2006. [Spinelli, 2003] Spinelli, G. and Brodie, J. Proceedings of HCI’03: Towards an Understanding of Common Information Spaces in Distributed and Mobile Work. Crete, Greece. 22-27 June 2003. 57 [Villarroel, 2006] Villarroel, M. Navegación y Actualización de Información de Cartografía, Usando Dispositivos HandHelds. Documento de Memoria para optar al grado de Ingeniero Civil en Computación. Departamento de Ciencias de la Computación, Universidad de Chile. Nov. 2006. [Wang, 2005] Wang, Y., van de Kar, E., Meijer, G. Designing mobile solutions for mobile workers: lessons learned from a case study. Proceedings of the ACM 7th International Conference on Electronic Commerce. Xian, China. Pp.582-589. 2005. 58 Apéndice A: Código Fuente de la Solución Implementada A continuación se presenta parte del código fuente de la solución implementada. El código fuente presentado corresponde a las clases más importantes que constituyen la herramienta. Implementación de Clase Área public class Area: Anotacion{ public Point[] vertices; [System.Xml.Serialization.XmlIgnoreAttribute] AdministradorEstados administradorEstados; public Area() { administradorEstados = AdministradorEstados.Instance(); } public Area(string autor, DateTime fechaCreacion) { this.fecha_creacion = fechaCreacion; this.autor_original = autor; administradorEstados = AdministradorEstados.Instance(); } public void setVertices(Point[] puntos) { this.vertices = puntos; } public override void dibujaAnotacion(System.Drawing.Graphics g, double zoom, Rectangle view) { bool dibuja = false; for (int i = 0; i < vertices.Length; i++) { if (view.Contains(vertices[i])) { int alphaValue = 100; Color color = administradorEstados.getColorEstado(this.estado); Brush brush = new SolidBrush(Color.FromArgb(alphaValue, color)); Point[] tmp = new Point[vertices.Length]; for (int k = 0; k < vertices.Length; k++) { tmp[k] = new Point((int)((vertices[k].X - view.X) * zoom), (int)((vertices[k].Y - view.Y) * zoom)); } g.FillPolygon(brush, tmp); break; } } } public override bool hitTesting(Point click, int marcaWidth, int marcaHeight) { GraphicsPath gp = new GraphicsPath(); gp.AddLines(vertices); return gp.IsVisible(click); 59 } } Implementación de Clase TextoLibre public class TextoLibre : Anotacion { public Point marcaReferencial; [System.Xml.Serialization.XmlIgnoreAttribute] AdministradorMarcas administradorMarcas; public TextoLibre() { administradorMarcas = AdministradorMarcas.Instance(); } public TextoLibre(Point posicion, string autor, DateTime fecha_creacion) { this.marcaReferencial = posicion; this.autor_original = autor; this.fecha_creacion = fecha_creacion; administradorMarcas = AdministradorMarcas.Instance(); visibilidad = 0; } public override void dibujaAnotacion(System.Drawing.Graphics g, double zoom, Rectangle view) { Rectangle view_tmp = new Rectangle(view.X, view.Y, (int)(view.Width / zoom), (int)(view.Height / zoom)); if (view_tmp.Contains(marcaReferencial)) { Point tmp = new Point((int)((marcaReferencial.X - view.X) * zoom), (int)((marcaReferencial.Y - view.Y) * zoom) - administradorMarcas.marca_height); g.DrawImage((Image)administradorMarcas.getBitmap(visibilidad), tmp); } } public override bool hitTesting(Point click, int marcaWidth, int marcaHeight) { Size s = new Size(marcaWidth, marcaHeight); Point tmp = new Point(marcaReferencial.X, marcaReferencial.Y administradorMarcas.marca_height); Rectangle r = new Rectangle(tmp, s); return r.Contains(click); } } Implementación Clase PlanoDigital public class PlanoDigital { public List<Anotacion> anotaciones; public String ruta_imagen; public String tipo_plano; public String nombre_imagen_plano; 60 private double _zoom; private Point _origen; public PlanoDigital() { anotaciones = new List<Anotacion>(); _origen = new Point(0, 0); _zoom = 1; } public void setZoom(double zoom) { _zoom = zoom; } public double getZoom() { return _zoom; } public void setOrigen(Point origen) { _origen = origen; } public Point getOrigen() { return _origen; } public String getRutaImagen() { return ruta_imagen; } public List<Anotacion> getAnotaciones() { return anotaciones; } public int addAnotacion(Anotacion a) { int tmp = anotaciones.Count; this.anotaciones.Insert(tmp, a); return tmp; } public Anotacion getAnotacion(int i) { return (Anotacion)anotaciones[i]; } public void setTipoPlano(String tipo) { tipo_plano = tipo; } public void dibujaAnotaciones(Graphics g, Bitmap b, double zoom, Rectangle view) { if(anotaciones.Count > 0) foreach (Anotacion a in anotaciones) { a.dibujaAnotacion(g, zoom, view); } 61 } public void writeToXML(XmlTextWriter writer) { writer.WriteStartElement(tipo_plano); //Guardar la imagen del plano en XML writer.WriteStartElement("imagen"); writer.WriteAttributeString("nombre", nombre_imagen_plano); Bitmap bm = new Bitmap(ruta_imagen); MemoryStream ms = new MemoryStream(); bm.Save(ms, ImageFormat.Jpeg); byte[] bitmapArray = ms.ToArray(); writer.WriteBase64(bitmapArray, 0, bitmapArray.Length); writer.WriteEndElement(); bm.Dispose(); //Guardar anotaciones en XML writer.WriteStartElement("anotaciones"); if (anotaciones.Count > 0) foreach (Anotacion anotacion in anotaciones) { anotacion.visibilidad = 0; XmlSerializer s = new XmlSerializer(anotacion.GetType()); s.Serialize(writer, anotacion); } writer.WriteEndElement(); writer.WriteEndElement(); } } Rutina de Creación de Nuevo Proyecto private void crearNuevoProyecto(string path) { iniciaAplicacion(); try { DirectoryInfo dir_root = new DirectoryInfo(path); tempDirectory = Directory.CreateDirectory(temp_path + "\\Administrador de Planos\\" + dir_root.Name); ArrayList nombres_directorios = new ArrayList(); nombres_directorios.Add("Seleccione un plano"); foreach (DirectoryInfo dir in dir_root.GetDirectories()) { string plano_nombre = dir.Name; nombres_directorios.Add(plano_nombre); PlanoDigital[] pd = new PlanoDigital[2]; Directory.CreateDirectory(temp_path + "\\Administrador de Planos\\" + dir_root.Name + "\\" + plano_nombre); foreach (FileInfo plano_imagen in dir.GetFiles()) 62 { int inicio = plano_imagen.Name.LastIndexOf('_') + 1; int final = plano_imagen.Name.LastIndexOf('.'); string tipo = plano_imagen.Name.Substring(inicio, final - inicio); ; if (tipo.CompareTo("estructural") == 0) { pd[0] = new PlanoDigital(); String image_full_path = tempDirectory.FullName + "\\" + plano_nombre + "\\" + plano_imagen.Name; plano_imagen.CopyTo(image_full_path, true); pd[0].nombre_imagen_plano = plano_imagen.Name; pd[0].ruta_imagen = image_full_path; pd[0].setTipoPlano("estructural"); } else if (tipo.CompareTo("electrico") == 0) { pd[1] = new PlanoDigital(); String image_full_path = tempDirectory.FullName + "\\" + plano_nombre + "\\" + plano_imagen.Name; plano_imagen.CopyTo(image_full_path, true); pd[1].nombre_imagen_plano = plano_imagen.Name; pd[1].ruta_imagen = image_full_path; pd[1].setTipoPlano("electrico"); } } planos.Add(plano_nombre, pd); } selectorDePlano.DataSource = nombres_directorios; } catch(Exception exc) { MessageBox.Show(exc.Message+"\n "+exc.StackTrace); } } Rutina de Carga de Proyecto en XML public void guardaProyectoToXML(string nombre_archivo) { FileInfo xmlFile = new FileInfo(nombre_archivo); StreamWriter xmlStreamWriter = xmlFile.CreateText(); //StreamWriter xmlStreamWriter = xmlFile. XmlTextWriter writer = new XmlTextWriter(xmlStreamWriter); writer.WriteStartElement("proyecto"); writer.WriteAttributeString("nombre", ""); writer.WriteAttributeString("version", ""); byte[] base64ISF_bytes = inkOverlay.Ink.Save(PersistenceFormat.InkSerializedFormat); String base64ISF_string = Convert.ToBase64String(base64ISF_bytes); writer.WriteElementString("inkOverlay", base64ISF_string); writer.WriteStartElement("planos"); 63 foreach (KeyValuePair<string, PlanoDigital[]> de in planos) { PlanoDigital[] pd = (PlanoDigital[])de.Value; writer.WriteStartElement("plano"); writer.WriteAttributeString("nombre", (String)de.Key); for (int i = 0; i < pd.Length; i++) { if(pd[i] != null) pd[i].writeToXML(writer); } writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); writer.Close(); xmlStreamWriter.Close(); } public PlanoDigital readPlanoDigitalFromXML(XmlReader reader, String nombrePlano) { PlanoDigital plano = new PlanoDigital(); while (reader.Read()) { switch (reader.NodeType) { case System.Xml.XmlNodeType.Element: if (reader.Name.Equals("imagen")) { String image_name = reader.GetAttribute("nombre"); String image_full_path = tempDirectory.FullName + "\\" + nombrePlano + "\\" + image_name; FileStream fs = new FileStream(image_full_path, FileMode.Create); plano.nombre_imagen_plano = image_name; plano.ruta_imagen = image_full_path; byte[] buf = new byte[1024]; int numRead = 0; while ((numRead = reader.ReadElementContentAsBase64(buf, 0, 1024)) > 0) { fs.Write(buf, 0, numRead); } fs.Close(); } if (reader.Name.Equals("Area")) { XmlSerializer s = new XmlSerializer(typeof(Area)); Area area_tmp = (Area)s.Deserialize(reader.ReadSubtree()); plano.anotaciones.Add(area_tmp); } if (reader.Name.Equals("TextoLibre")) { XmlSerializer s = new XmlSerializer(typeof(TextoLibre)); TextoLibre texto_tmp = (TextoLibre)s.Deserialize(reader.ReadSubtree()); 64 plano.anotaciones.Add(texto_tmp); //Oculta las anotaciones contenidas en el objeto inkOverlay inkOverlay.Ink.CustomStrokes[texto_tmp.getId()].ModifyDrawingAttributes(hideAnotacion); } break; } } return plano; } Rutina de Actualización de Vista de Plano Digital private void actualizarVistaPlano(int nuevo_tipo_plano) { try { tipo_de_plano = nuevo_tipo_plano; double zoomPlano = plano_en_uso[tipo_de_plano].getZoom(); Point origenPlano = plano_en_uso[tipo_de_plano].getOrigen(); zoomSelectionBox.Text = (zoomPlano*100).ToString()+"%"; //Seteo los parametros de zoom y desplazamiento del plano, almacenados temporalmente por la sesion en el objeto PlanoDigital Point p_aux = multiplicaPoint(origenPlano,zoomPlano * -1); inkOverlay.Renderer.PixelToInkSpace(planoBoard.Handle, ref p_aux); inkOverlay.Renderer.Move((float)p_aux.X, (float)p_aux.Y); inkOverlay.Renderer.Move((float)0, (float)0); inkOverlay.Renderer.Scale((float)zoomPlano, (float)zoomPlano, false); planoBoard.Image = null; Graphics g = planoBoard.CreateGraphics(); dibujaPlano(g); Rectangle src = new Rectangle(0, 0, planoBoard.Width, planoBoard.Height); inkOverlay.Draw(src); } catch (NullReferenceException ne) { MessageBox.Show("NullPointerException: " + ne.Message); } } private void dibujaPlano(Graphics g) { double zoomPlano = plano_en_uso[tipo_de_plano].getZoom(); Point origenPlano = plano_en_uso[tipo_de_plano].getOrigen(); Rectangle src = new Rectangle(0, 0, planoBoard.Width, planoBoard.Height); Size dest_size = new Size((int)(planoBoard.Width / zoomPlano), (int)(planoBoard.Height / zoomPlano)); Rectangle dest = new Rectangle(new Point(origenPlano.X, origenPlano.Y), dest_size); g.DrawImage(imagenOriginalPlano, src, dest, GraphicsUnit.Pixel); dibujaAnotaciones(g); if (textoLibre_tmp != null) 65 textoLibre_tmp.dibujaAnotacion(g, zoomPlano, dest); } 66 Apéndice B: Ejemplo de Estructura de XML de Almacenamiento de Proyectos A continuación un archivo XML de ejemplo utilizado para almacenar un proyecto de seguimiento, creado por la aplicación. La codificación de las imágenes y las marcas de texto fueron omitidas, por razones de espacio. <proyecto nombre="Proyecto de prueba" version="1"> <inkOverlay>AMEEHQSkCYoEARCFH...</inkOverlay> <planos> <plano nombre="2do piso"> <estructural> <imagen nombre="2do_piso_estructural.png">/9j/4AA...</imagen> <anotaciones> <TextoLibre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Id>55956262</Id> <autor_original>ndujovne</autor_original> <fecha_creacion>2007-06-21T17:57:36.609375-04:00</fecha_creacion> <fecha_ultima_modificacion>0001-01-01T00:00:00</fecha_ultima_modificacion> <estado>Finalizada</estado> <marcaReferencial> <X>781</X> <Y>183</Y> </marcaReferencial> </TextoLibre> <Area xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Id>52661490</Id> <autor_original>ndujovne</autor_original> <fecha_creacion>2007-06-21T17:57:40.53125-04:00</fecha_creacion> <fecha_ultima_modificacion>0001-01-01T00:00:00</fecha_ultima_modificacion> <estado>Critico</estado> <vertices> <Point> <X>366</X> <Y>177</Y> </Point> <Point> <X>504</X> <Y>185</Y> </Point> <Point> <X>464</X> <Y>249</Y> </Point> <Point> <X>377</X> <Y>271</Y> </Point> </vertices> </Area> </anotaciones> </estructural> 67 <electrico> <imagen nombre="2do_piso_electrico.png">/9j/4AAQSkZ...</imagen> <anotaciones /> </electrico> </plano> <plano nombre="1er Piso"> <estructural> <imagen nombre="1er piso estructural.png">/9j/4AAQSkZ...</imagen> <anotaciones /> </estructural> <electrico> <imagen nombre="1er piso electrico.png">/9j/4AAQSkZ...</imagen> <anotaciones /> </electrico> </plano> </planos> </proyecto> 68 Apéndice C: Ejemplo de Estructura de XML de Configuración de la Aplicación A continuación un archivo XML de ejemplo que contiene la información de configuración necesaria para el uso de la aplicación. La codificación de las imágenes fue omitida, por razones de espacio. <configuracion> <estados n_estados="3"> <estado indice="0" color="Green">Finalizada</estado> <estado indice="1" color="Yellow">Atrasado</estado> <estado indice="2" color="Red">Critico</estado> </estados> <marcas width="17" height="15"> <marca ajuste_width="15" ajuste_height="0" tipo="0" nombre="oculto">iVBORw...</marca> <marca ajuste_width="15" ajuste_height="0" tipo="1" nombre="visible">iVBORw...</marca> <marca ajuste_width="15" ajuste_height="0" tipo="2" nombre="seleccionado">iVBORw...</marca> </marcas> </configuracion> 69