DigiNG edición Scripting



Programación de la orden MARCAR_ATR

Nivel: MEDIO



Vamos a programar una orden denominada MARCAR_ATR muy util para hacer catástros. La orden generará un archivo de errores que posteriormente cargaremos como archivo de referencia con la orden CARGA_F y por cuyos errores iteraremos con las órdenes ERR+ y ERR-, y dichas marcas de error nos indicarán qué entidades lineales tenemos en el archivo sobre el cual se ejecutó la orden con exactamente un determinado número de atributos vinculados con una determinada tabla de la base de datos cargada cuando se ejecutó la orden.


Ej: Si tenemos cargada una base de datos con varias tablas, una de las cuales tiene como nombre TAB, y ejecutamos nuestro script como sigue:


vbscript=marcar_atr.vbs TAB 5 salida.bin


El script generará un archivo denominado err.bin con marcas a todas las entidades lineales con exáctamente 5 atributos enlazados con la tabla TAB de la base de datos activa en el momento de la ejecución del script.



El script admitirá o no parámetros. Si no especificamos parámetros, solicitará mediante cuadros de diálogo los datos necesarios para su ejecución.


El formato de parámetros es el siguiente:


VBSCRIPT=MARCAR_ATR.vbs [tabla] [número de atributos] [archivo a generar]


Y algunos ejemplos de ejecución del script: VBSCRIPT=MARCAR_ATR.vbs


VBSCRIPT=MARCAR_ATR.vbs TAB

VBSCRIPT=MARCAR_ATR.vbs TAB 1

VBSCRIPT=MARCAR_ATR.vbs TAB 1 salida.bin



Comenzamos haciendo un sencillo script que nos muestre un mensaje de error en el caso de que el usuario intente ejecutarlo sin ninguna base de datos cargada:


Option Explicit


If digi.BaseDatos Is Nothing Then

        MsgBox "No hay ninguna base de datos cargada en Digi", vbOkOnly, "Error"

Else

        ' Aquí se encontrará el grueso de nuestro programa

End If


A continuación vamos a introducir la lógica para comprobar los argumentos y solicitar al usuario los parámetros que no se puedan obtener de los argumentos:


Option Explicit


Dim argumentos

Dim rsCATDBS

Dim listaTablas

Dim tabla

Dim numeroAtributos

Dim nombreArchivo


If digi.BaseDatos Is Nothing Then

        MsgBox "No hay ninguna base de datos cargada en Digi", vbOkOnly, "Error"

Else

Set rsCATDBS = CreateObject("ADODB.Recordset")

        rsCATDBS.Open "SELECT NOMBRE FROM CATDBS", digi.BaseDatos


        While NOT rsCATDBS.EOF

            listaTablas = listaTablas + "|"

            listaTablas = listaTablas + rsCATDBS(0)


            rsCATDBS.MoveNext

        Wend

        rsCATDBS.Close       


        Set argumentos = digi.Argumentos

        Select Case argumentos.Count

                Case 0

                tabla = digi.ComboOpciones ("Seleccione tabla", "Seleccione una tabla de entre las mostradas en la siguiente lista", listaTablas)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 1

                tabla = argumentos(0)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 2

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 3

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = argumentos(2)

        End Select

End If


A continuación vamos a averiguar el valor interno que tiene la tabla seleccionada: Option Explicit


Dim argumentos

Dim rsCATDBS

Dim listaTablas

Dim tabla

Dim numeroAtributos

Dim nombreArchivo

Dim idTAB


If digi.BaseDatos Is Nothing Then

        MsgBox "No hay ninguna base de datos cargada en Digi", vbOkOnly, "Error"

Else

        Set rsCATDBS = CreateObject("ADODB.Recordset")

        rsCATDBS.Open "SELECT NOMBRE FROM CATDBS", digi.BaseDatos


        While NOT rsCATDBS.EOF

            listaTablas = listaTablas + "|"

            listaTablas = listaTablas + rsCATDBS(0)


            rsCATDBS.MoveNext

        Wend

        rsCATDBS.Close       


        Set argumentos = digi.Argumentos

        Select Case argumentos.Count

                Case 0

                tabla = digi.ComboOpciones ("Seleccione tabla", "Seleccione una tabla de entre las mostradas en la siguiente lista", listaTablas)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 1

                tabla = argumentos(0)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 2

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 3

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = argumentos(2)

        End Select


rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = '" ?        idTAB = rsCATDBS(0)

        rsCATDBS.Close

        Set rsCATDBS = Nothing

End If


Vamos a continuar iterando por todas las entidades del fichero de dibujo y añadiremos las marcas de error para dada línea que cumpla las condiciones siguientes en un array dinámico:



Option Explicit


Dim argumentos

Dim rsCATDBS

Dim listaTablas

Dim tabla

Dim numeroAtributos

Dim nombreArchivo

Dim idTAB

Dim entidad

Dim coincidentes

Dim ArrayEntidades()



If digi.BaseDatos Is Nothing Then

        MsgBox "No hay ninguna base de datos cargada en Digi", vbOkOnly, "Error"

Else

        Set rsCATDBS = CreateObject("ADODB.Recordset")

        rsCATDBS.Open "SELECT NOMBRE FROM CATDBS", digi.BaseDatos


        While NOT rsCATDBS.EOF

            listaTablas = listaTablas + "|"

            listaTablas = listaTablas + rsCATDBS(0)


            rsCATDBS.MoveNext

        Wend

        rsCATDBS.Close       


        Set argumentos = digi.Argumentos

        Select Case argumentos.Count

                Case 0

                tabla = digi.ComboOpciones ("Seleccione tabla", "Seleccione una tabla de entre las mostradas en la siguiente lista", listaTablas)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 1

                tabla = argumentos(0)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 2

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 3

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = argumentos(2)

        End Select


        rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = '" ?        idTAB = rsCATDBS(0)

        rsCATDBS.Close

        Set rsCATDBS = Nothing



Set entidad = digi.PrimeraEntidad(True)

        While Not entidad Is Nothing

                If Not (entidad.Borrado) And (entidad.Tipo = vbLinea) And (entidad.Atributos >= numeroAtributos) Then

                        coincidentes = 0


                        For j = 0 To entidad.Atributos - 1

                                If entidad.Atributo(j).Tabla = idTAB Then

                                        coincidentes = coincidentes + 1

                                End If

                        Next


                        If coincidentes=numeroAtributos Then

                                entidades = entidades + 1

                                ReDim Preserve ArrayEntidades( entidades )

                                Set ArrayEntidades(entidades - 1) = AlmacenaError( entidad )

                        End If

                End If


                Set entidad = digi.SiguienteEntidad

        Wend



        For j = 0 To entidades - 1

                Set ArrayEntidades(j) = Nothing

        Next

End If


Function AlmacenaError( entidad )

        Dim x

        Dim y

        Dim linea

        Dim at


        at = digi.AT * digi.Precision

        x = (entidad.Punto(CInt(entidad.Puntos/2)).x + entidad.Punto(CInt(entidad.Puntos/2)-1).x)/2

        y = (entidad.Punto(CInt(entidad.Puntos/2)).y + entidad.Punto(CInt(entidad.Puntos/2)-1).y)/2


        Set linea = CreateObject("Digi3D.Entidad")

        linea.Codigo = digi.Codigo

        linea.AnadePuntoXYZ x, y, 0

        linea.AnadePuntoXYZ x -        at, y + at, 0

        linea.AnadePuntoXYZ x + at, y + at, 0

        linea.AnadePuntoXYZ x + at, y - at, 0

        linea.AnadePuntoXYZ x - at, y - at, 0

        linea.Cerrar


        digi.DibujaEntidad linea

        Set AlmacenaError = linea

End Function


Por último nos queda almacenar el archivo de errores en disco: Option Explicit


Const vbLinea = 1

Dim argumentos

Dim rsCATDBS

Dim listaTablas

Dim tabla

Dim idTAB

Dim numeroAtributos

Dim nombreArchivo

Dim ArrayEntidades()

Dim entidades

Dim coincidentes

Dim j

Dim entidad


If digi.BaseDatos Is Nothing Then

        MsgBox "No hay ninguna base de datos cargada en Digi", vbOkOnly, "Error"

Else

        Set rsCATDBS = CreateObject("ADODB.Recordset")

        rsCATDBS.Open "SELECT NOMBRE FROM CATDBS", digi.BaseDatos


        While NOT rsCATDBS.EOF

            listaTablas = listaTablas + "|"

            listaTablas = listaTablas + rsCATDBS(0)


            rsCATDBS.MoveNext

        Wend

        rsCATDBS.Close       



        Set argumentos = digi.Argumentos

        Select Case argumentos.Count

                Case 0

                tabla = digi.ComboOpciones ("Seleccione tabla", "Seleccione una tabla de entre las mostradas en la siguiente lista", listaTablas)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 1

                tabla = argumentos(0)

                numeroAtributos = CInt(InputBox("Introduzca el número de atributos", "Número de atributos"))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 2

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = digi.DialogoPideArchivo(False)

                Case 3

                tabla = argumentos(0)

                numeroAtributos = CInt(argumentos(1))

                nombreArchivo = argumentos(2)

        End Select


        rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = '" ?        idTAB = rsCATDBS(0)

        rsCATDBS.Close

        Set rsCATDBS = Nothing


        Set entidad = digi.PrimeraEntidad(True)

        While Not entidad Is Nothing

                If Not (entidad.Borrado) And (entidad.Tipo = vbLinea) And (entidad.Atributos >= numeroAtributos) Then

                        coincidentes = 0


                        For j = 0 To entidad.Atributos - 1

                                If entidad.Atributo(j).Tabla = idTAB Then

                                        coincidentes = coincidentes + 1

                                End If

                        Next


                        If coincidentes=numeroAtributos Then

                                entidades = entidades + 1

                                ReDim Preserve ArrayEntidades( entidades )

                                Set ArrayEntidades(entidades - 1) = AlmacenaError( entidad )

                        End If

                End If


                Set entidad = digi.SiguienteEntidad

        Wend


digi.GuardaArchivo nombreArchivo, ArrayEntidades


        For j = 0 To entidades - 1

                Set ArrayEntidades(j) = Nothing

        Next

End If


Function AlmacenaError( entidad )

        Dim x

        Dim y

        Dim linea

        Dim at


        at = digi.AT * digi.Precision

        x = (entidad.Punto(CInt(entidad.Puntos/2)).x + entidad.Punto(CInt(entidad.Puntos/2)-1).x)/2

        y = (entidad.Punto(CInt(entidad.Puntos/2)).y + entidad.Punto(CInt(entidad.Puntos/2)-1).y)/2


        Set linea = CreateObject("Digi3D.Entidad")

        linea.Codigo = digi.Codigo

        linea.AnadePuntoXYZ x, y, 0

        linea.AnadePuntoXYZ x -        at, y + at, 0

        linea.AnadePuntoXYZ x + at, y + at, 0

        linea.AnadePuntoXYZ x + at, y - at, 0

        linea.AnadePuntoXYZ x - at, y - at, 0

        linea.Cerrar


        digi.DibujaEntidad linea

        Set AlmacenaError = linea

End Function


Fecha de última modificación: jueves, 19 de junio de 2003

© 2001-2003 Dreaming With Objects. Todos los derechos reservados.