Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi
UNIDAD I PERSONALIZACIÓN DEL PROGRAMA IDRISI OBJETIVOS DE UNIDAD: Proporcionar al alumno la metodología fundamental para personalizar el programa Idrisi, mediante el uso del lenguaje de programación Delphi 6.0 para llevar a cabo la construcción de programas. TEMAS: 1.1 Personalización del menú del programa Idrisi. 1.2 Conexión del programa Idrisi con el Delphi 6.0. 1.3 Utilización de la librería Idrisi. 1.1 PERSONALIZACIÓN DEL MENÚ DEL PROGRAMA IDRISI Nota: Traducción realizada por el profesor de la materia a partir del original “IDRISI Applications Programming Interface User’s Guide” (2003), pero con ejemplos propios en algunos casos. Para una referencia completa se recomienda consultar el original. Idrisi ha sido especialmente diseñado para permitir al usuario incrementar su capacidad y funcionalidad a través de la agregación de nuevos módulos. El menú de Idrisi es totalmente personalizable, permitiendo el agregar en él un módulo como si fuese un elemento original del sistema Idrisi. A continuación se presentan algunas instrucciones concretas sobre cómo integrar un módulo en Idrisi. El menú de Idrisi no se encuentra codificado de forma “dura” dentro del archivo IDRISI32.EXE y, más bien, es creado a partir de un grupo de archivos de texto de menú (con una extensión .Imn) que se ubican en la carpeta \IDRISI Andes\Extensions. Como consecuencia de esto, el menú de Idrisi es completamente extensible y reconfigurable. La organización de estos archivos de texto de menú se realiza mediante un archivo principal llamado Extensions.Lst, mismo que enlista los archivos de texto de menú en el mismo orden en que aparecen en el menú de Idrisi. Cada uno de los archivos de texto es un archivo ASCII con una extensión .Imn (Idrisi Menú) que contienen las entradas del menú y su correspondiente llamada DLL (librería dinámica) o EXE (archivo ejecutable). Cuando un usuario da clic sobre un elemento del menú, Idirisi invoca la función DLL o EXE dada en el archivo de texto de menú. 1
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi La estructura de Extensions.Lst es una lista simple en formato ASCII. Cada línea enlista un archivo de texto de menú (sin su extensión .Imn) ordenado de manera tal como se desea producir el menú final. El archivo original Extensions.Lst que viene con Idrisi contiene lo siguiente:
Las primeras dos líneas de un archivo .Imn proporciona la información general sobre la extensión:
La siguiente sección del .Imn contiene la lista de acciones (Action List). El nombre a la izquierda del signo igual (=) es el nombre de la acción (Action Name). A la derecha del mismo signo igual se encuentra el nombre del DLL o EXE, seguido por el nombre de la función para llamarlo, seguido a su vez por un parámetro opcional. En el caso de diálogos estándar de Idrisi, este último parámetro es un número que se refiere al dialogo particular dentro de un DLL. Algunos de los diálogos están contenidos en el ejecutable principal de Idrisi y están referidos como tales. De otra forma, estos son referenciados mediante un DLL o EXE específico. Por ejemplo:
2
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi En este ejemplo, las operaciones de Calculadora de Imagen y Editor (Image calculator y Edit, respectivamente) se encuentran contenidas en el ejecutable principal de Idrisi, mientras que las otras están contenidas en extensiones de DLL’s. Cuando se integra un módulo desarrollado por un usuario, la lista de acciones únicamente necesita contener el nombre del archivo ejecutable (el cual además ha de estar contenido en la carpeta \IDRISI Andes\Mods). Por ejemplo:
MI_ACCION=MI_EJECUTABLE.EXE Después de la lista de acciones se encuentra la descripción del orden y ubicación de los elementos del menú. El menú es una estructura jerárquica, con submenús identificados por la palabra branch (rama/ramificación del menú). Menubreak (divisor de menú) indica la inserción de una línea para separar elementos. La sección inicia con BEGINMENU y finaliza con ENDMENU. Cualquier BEGINBRANCH debe tener un ENDBRANCH. A continuación se presenta un ejemplo (las líneas que comienzan con “//” son comentarios):
3
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi
Breve descripción de los elementos de un .Imn: BEGINMENU INSERTIONDEPTH 1 //use zero if top level menu item (usar cero si se trata de un elemento de menu superior) IdrMenuAnalysis //caption of menu item to be inserted under (título o leyenda del elemento de menú bajo el cual es insertado este menú, esto es, nombre del menú del que se desprende este submenú) ITEMNAME ANALYSISMENUDatabaseQuery ITEMCAPTION Database Query //caption of first item (título del primer elemento) ACTION 0 //this one does no action so its action code is zero (este no es una acción, por lo tanto su código de acción es cero) HELPCONTEXT 0 //'0' means not yet linked (significa que no está vinculado) BEGINBRANCH ITEMNAME ANALYSISMENUReclass //Any unique name that makes sense (un nombre único que sea significativo) ITEMCAPTION RECLASS //This is what appears in the menu (esto es lo que aparece en el menú) ACTION ANALYSIS_RECLASS //This refers to the action list above (se refiere a la acción mencionada arriba, en la lista de acciones) HELPCONTEXT 0 ITEMNAME ANALYSISMENUOverlay ITEMCAPTION OVERLAY ACTION ANALYSIS_OVERLAY HELPCONTEXT 0 ITEMNAME ANALYSISMENUCrosstab ITEMCAPTION CROSSTAB ACTION ANALYSIS_CROSSTAB HELPCONTEXT 0 MENUBREAK ITEMNAME ANALYSISMENUEdit ITEMCAPTION Edit ACTION ANALYSIS_EDIT HELPCONTEXT 0 ENDBRANCH ITEMNAME ANALYSISMENUMathematicalOperators ITEMCAPTION Mathematical Operators ACTION 0 HELPCONTEXT 0 BEGINBRANCH ITEMNAME ANALYSISMENUOverlay2 ITEMCAPTION OVERLAY ACTION ANALYSIS_OVERLAY HELPCONTEXT 0 ITEMNAME ANALYSISMENUScalar ITEMCAPTION SCALAR ACTION ANALYSIS_SCALAR HELPCONTEXT 0 END BRANCH ENDMENU
4
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi 1.2 CONEXIÓN DEL PROGRAMA IDRISI CON EL DELPHI 6.0. INTERFAZ DE PROGRAMACIÓN DE APLICACIONES DE IDRISI Idrisi Applications Programming Interface (Idrisi API) Versión 2.0 Clark Labs 2003 Nota: El API trabaja con todas las versiones de Idrisi de 32 bits, incluyendo Idrisi uno, dos, Kilimajaro (14) y Andes (15). INTRODUCCIÓN Idrisi ha sido diseñado como un servidor de automatización OLE usando tecnología COM Object (Objeto COM). Como consecuencia, es posible emplear lenguajes de desarrollo de alto nivel, tales como Delphi, Visual C++, Visual Basic o Visual Basic para Aplicaciones (VBA) como macrolenguajes para controlar las operaciones de Idrisi. En resumen, se pueden crear sofisticadas aplicaciones de Controlador de Automatización OLE que tienen completo control sobre el funcionamiento de Idrisi. El servidor de automatización OLE de Idrisi es registrado automáticamente en Windows cuando Idrisi se instala en un equipo. Por lo tanto, al estar instalado Idrisi, automáticamente se tiene el acceso a la totalidad de la Interfaz de Programación de Aplicaciones (API, por sus siglas en inglés). El servidor de automatización OLE de Idrisi otorga un amplio rango de funciones para controlar Idrisi, incluyendo correr módulos, desplegar archivos y manipular variables del ambiente Idrisi. INICIO RÁPIDO El primer paso para usar la API de Idrisi es registrarlo en el ambiente de programación. Esto normalmente toma poco tiempo, y se describe en la siguiente sección. Después de que se ha registrado la API el programador tiene la posibilidad de controlar la mayoría de los aspectos de operación del sistema Idrisi. A continuación se presentan algunas ideas rápidas para iniciar: Una vez que ha sido instalada la librería de Idrisi, cualquiera de los métodos o propiedades incluidos con Idrisi puede ser usado con únicamente escribir el nombre de la referencia de objeto de Idrisi (Idrisi object reference), seguida por un punto, seguida por el nombre del método o propiedad (method o property) con sus parámetros (parameters). Por ejmplo:
5
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi La referencia de objeto de Idrisi (Idrisi object reference) es el nombre que el ambiente de programación usa para referirse al controlador de automatización de Idrisi. Este se establecido cuando se instala la librería de Idrisi. Los métodos (methods) son funciones o procedimientos incluidos en la librería de controlador de automatización (p.e. operaciones que invocan una acción), mientras que las propiedades (properties) son los ajustes accesibles al usuario (tales como la ruta hacia la carpeta de trabajo [working folder]). En la mayoría de los ambientes de programación se podrá notar que tan pronto como se teclea un punto después de la referencia del objeto de Idrisi (Idrisi object reference), se despliega una lista de funciones desde la librería entre las cuales se puede elegir la deseada para cierta función. Posteriormente, tan pronto como se teclea el paréntesis de apertura de los parámetros (después del nombre de la función) inmediatamente se enlistan todos los parámetros requeridos junto con su tipo de dato. Si se crea un programa que accede a la API e Idrisi no está abierto, Windows automáticamente inicia Idrisi al momento que es requerido dentro de dicho programa. En el documento original de la API se muestra una larga lista de métodos (funciones y procedimientos) y propiedades (atributos). Vale la pena mencionar que la mayoría de los usuarios sólo necesitan tres o cuatro de estos elementos. Los más empleados son: 1. RunModule. Empleado para ejecutar un módulo propio de Idrisi; emplea la misma lista de parámetros que un macro dentro de Idrisi. 2. DisplayFile. Como el nombre lo sugiere, es empleado para desplegar capas vectoriales y/o matriciales. 3. AddLayerToDisplay. Para agregar una capa en una composición de mapa existente. 4. GetWorkingDir. Empleado para determinar la ruta de la carpeta de trabajo actual. 5. GetResourceDirCount. Usado para contar el número de carpetas de recurso con que cuenta un proyecto. 6. GetResourceDir. Útil para conocer la ruta de una carpeta de recursos específica. El método RunModule tiene una opción de espera que causa que un programa espere hasta que una operación en Idrisi finalice antes de ir a la siguiente línea de código del programa. El parámetro ModParams de RunModule es idéntico al macro comando del módulo que se esté ejecutando, pero con dos excepciones: (1) el parámetro “x” del macro comando no es necesario y (2) todas la referencias de archivos usados con RunModule deben usar su ruta de acceso completa y su extensión. Para los archivos de Idrisi, la extensión del archivo de datos principal debe ser usado (.rst, .vct, .avl), sin considerar la de sus archivos de documentación. Recomendación para acceder a la ruta de la carpeta de trabajo (working folder) (la misma lógica se puede emplear para las carpetas de recursos): 6
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi Empleando la variable WrkFld como cadena de caracteres: WrkFld:=Idrisi32.GetWorkingDir Y usar esta variable para referirse a esta carpeta cada vez que se requiera y así no estar invocando el método en cada momento. Se puede observar que existen algunos métodos de la librería de Idrisi que no están documentados en el documento de la API de Idrisi. Esto se debe a que estos son sólo para uso interno de Idrisi y, por tanto, no deben ser empleados en las aplicaciones personales. La flexibilidad de modificar el menú de Idrisi permite incorporar en el menú el acceso a los módulos desarrollados por un usuario. ACCESO EN DELPHI 6.0 A LA INTERFAZ DE PROGRAMACIÓN DE APLICACIONES DE IDRISI Idrisi es un Servidor de Automatización, entonces cualquier programa que acceda a los métodos y propiedades descritos arriba es llamado Controlador de Automatización. Este último es el caso de Delphi 6.0. La siguiente información es específica para Delphi 5.0 o versiones posteriores. Paso 1. Instalar la Librería de Tipo de Idrisi (esto se realiza sólo una vez) • • • • • • •
En el menú PROJECT en Delphi, seleccionar IMPORT TYPE LIBRARY. Buscar “IDRISI Library” en la lista de servidores instalados y seleccionarlo. Ajustar la página de paleta (palette page) en “Servers” y asegurarse de que la caja de selección “Generate Component Wrapper” esté seleccionada. Clic en “Install”. Delphi preguntará cual paquete se ha de instalar la librería, siendo el paquete default “dclusr5.dpk”. Este es el paquete de componente de Delphi principal. Clic en “Ok” para indicar que se desea instalar la librería en ese paquete. Se desplegara una ventana de diálogo sobre el contenido de esta librería. Dar clic en “Compile”. Ahora se puede cerrar esta ventana de diálogo.
Con esto se tendrá acceso a la librería de Idrisi en cualquier proyecto de Delphi que se creé. PASO 2. Usar la librería de Idrisi (será necesario hacer esto para cada nuevo proyecto dentro de Delphi) Dentro de cualquier proyecto de Delphi que necesite acceder a Idrisi es necesario incluir la siguiente declaración en “Uses”: Uses IDRISI32_tbl; Después, declarar un objeto de la clase IIdrisiApiServer como sigue: 7
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007
Apuntes de la materia de Programación en Ambiente SIG Especialización en Cartografía Automatizada, Teledetección y SIG UNIDA I. Personalización del programa Idrisi Var IDRISI32:IIdrisiApiServer; Aunque para la clase PASIG se recomienda usar: Var IdrAPI:IIdrisiApiServer; Después, en la sección de implementación (implementation section), declarar el objeto API de Idrisi como sigue: IDRISI32:CoIdrisiApiServer.Create; Aunque para la clase PASIG se recomienda usar: IdrAPI: CoIdrisiApiServer.Create; Se puede acceder ahora cualquier propiedad o método dado por Idrisi con simplemente referir el objeto IDRISI32 (IdrAPI, para la clase), seguido por un punto, seguido por el nombre del método o propiedad y el o los parámetros requeridos. Por ejemplo, para una variable llamada “Working_Folder”: Working_Folder:=IDRISI32.GetWorkingDir; Para el caso de la clase PASIG quedaría: Working_Folder:=IdrAPI.GetWorkingDir; Finalmente, antes de permitir finalizar completamente a la aplicación, es necesario indicar que ya no se requiere más la API como sigue: IDRISI32:=nil; Para el caso de la clase PASIG quedaría: IdrAPI:=nil; Con esta última operación se remueve un proceso de usuario como cliente de IDRISI 32 (o IdrAPI, para la clase PASIG). Esto permite que IDRISI32 (o IdrAPI) sea finalizado o desconectado cuando ya no se ocupa más dentro de una aplicación.
8
Facultad de Geografía, Universidad Autónoma del Estado de México Profesor: Luis Ricardo Manzano Solís Octubre-Noviembre de 2007