Professional Documents
Culture Documents
Derechos Reservados
2009 Maptek
Todos los derechos reservados. Ninguna parte de este manual puede ser reproducido,
almacenado o transmitido por ningn medio de recuperacin electrnico, mecnico, fotocopiado,
registrado, o de otra manera sin el permiso escrito de Maptek Computacin Chile Ltda. No se
asume ninguna responsabilidad con respecto al uso de la informacin contenida adjunta. Aunque
se ha tomado la precaucin en la preparacin de este manual, el editor y autor(es) no asumen
ninguna responsabilidad de errores u omisiones. Maptek no se responsabiliza por daos o
perjuicios, directos o indirectos, que surjan del uso, interpretacin de la informacin contenida en
este manual.
info@maptek.cl
www.maptek.cl
Marcas
Debido a la naturaleza del material, muchos de los productos del hardware y de software se
mencionan por nombre. Las compaas que fabrican los productos demandan muchos de estos
nombres del producto como marcas registradas. No es la intencin de Maptek demandar estos
nombres o marcas registradas como propias.
Historial de Revisin
Mayo 2008
Introduccin
Contenidos
1
INTRODUCCIN ..................................................................................................................................................... 4
PERL ....................................................................................................................................................................... 5
www.maptek.cl
Introduccin
La programacin de aplicaciones puede ser una tarea muy simple o muy compleja dependiendo del
tpico y de la factibilidad tcnica de lo que se quiere realizar, tanto en algortmica como de
herramientas de programacin.
El presente manual le entrega al lector las herramientas que le facilitarn el trabajo para la
implementacin de aplicaciones bajo el entorno Vulcan. Los contenidos abarcan desde el manejo
de archivos, modelos de bloques, bases de datos y objetos grficos de Vulcan
Introduccin
Perl
1.1. Introduccin.
PERL (Practical Extraction and Report Language) es un lenguaje interpretado que tiene varias
utilidades, pero est principalmente orientado a la bsqueda, extraccin y formateado de archivos
de texto. Tambin es muy usado para manejo y gestin de procesos (estado de procesos, conteo y
extraccin de parmetros caractersticos, etc...).
Perl toma muchas caractersticas del C, como tambin del lenguaje interpretado AWK, sed, shell
(sh), Lisp entre otros. Estructuralmente, Perl est basado en un estilo de bloques como los del C o
AWK, y es muy usado por su flexibilidad en el procesamiento de texto y no tiene ninguna de las
limitaciones de los otros lenguajes de script.
www.maptek.cl
Cambiar los permisos del archivo fuente, para poderlo ejecutar. Esto se realiza mediante la
instruccin chmod:
primer.pl
Los caracteres #! sirven para denotar que lo que viene a continuacin hace referencia a un
intrprete de comandos. Como el intrprete perl se encuentra en los ejecutables de Vulcan se
puede crear una estructura de carpetas en el disco C, copiando el programa perl.exe all de modo
que est siempre disponible en un solo lugar (c:/usr/bin/).
se hara de la siguiente
#! C:/usr/bin/perl
print "Hola mundo\n";
Nota: Al usar primera forma de correr el script no se requiere de la primera lnea de este programa.
Escalar.
2.
Array de escalares.
3.
Tipo Escalar.
El tipo escalar es denotado con un nombre de variable precedido de $. Puede almacenar un
nmero o un string. Por ejemplo:
$valor = 12;
$nombre = Juan;
$palabra = "Hola mundo\n";
Perl
Al usar comillas dobles se puede interpretar caracteres especiales del string al momento de ser
impresos, por ejemplo en pantalla:
print $palabra;
Tambin es posible definir varias variables al mismo tiempo mediante el uso de parntesis:
($nombre,$apellido,$edar) = ("Ferenando","Leiva",26);
@paises = ("Chile","Peru","Bolivia","Argentina");
El nmero de elementos de un array de escalares se puede obtener de la siguiente manera:
$num_elementos = @paises;
o bien
$num_elementos = $#paises+1;
$# devuelve el ltimo ndice del array, y como el valor para el primer ndice es 0 el nmero de
elementos - 1 ser el ltimo valor permitido para indexar el array.
Para acceder al los elementos de un array se usa el ndice de la posicin donde se almacena el
dato (0 a n-1)
$segundo_elemento = $paises[1];
Se puede acceder a varios elementos de un array de la forma @nom_array[indice1,...,indicen]. Por
ejemplo:
print @paises[0,3];
www.maptek.cl
Otra forma es usando el operador rango .. , si se quisiera imprimir todos los valores desde un
ndice i hasta un indice j se debe utilizar el siguiente formato @nom_variable[i..j], por ejemplo:
@paises[0..3];
%precio=("manzana",50,"pera",70,"ciruela",20);
Para acceder a un elemento de un array asociativo se debe utilizar el siguiente formato
@nom_arrayt { clave }. Por ejemplo:
$numero_peras = 10;
$valor_total = @precio{"pera"} * $numero_peras;
Perl
www.maptek.cl
$entrada = int($entrada);
if($entrada == $numero)
{print "Has acertado.\n";}
elsif($entrada > $numero)
{print "El numero es mayor que el pensado.\n";}
Else {print "El numero es menor que el pensado.\n";}
print "\nEL NUMERO PENSADO ERA: ",$numero,"\n\n";
En lugar de if podemos usar unless que tiene el significado contrario.
10
Perl
@valores = (35..70);
print "\nValores del arreglo:\n";
for($i=0;$i<@valores;$i++)
{print "Valor ",$i+1,"=",$valores[$i],"\n";}
Y por ltimo tenemos:
@valores = (35..70);
print "\nValores del arreglo:\n";
foreach $val (@valores)
{print "$val \n";}
1.7. Subrutinas.
Otro aspecto de inters en PERL es la definicin y manejo de subrutinas.
El formato de declaracin de una subrutina es:
sub NOMBRE BLOQUE
Ejemplo:
sub saludo{print
"Hola\n";}
www.maptek.cl
11
Las tres formas producen el mismo resultado con la excepcin de que en el caso de la ltima no es
necesario poner los parntesis. Si se necesita pasar argumentos, estos deben ir entre los
parntesis, y sern almacenados en el array de escalares @_, es decir para saber el nmero y el
valor de los argumentos pasados a una subrutina hay que leer de este array predefinido.
Por ejemplo:
sub muestra_valor
{local ($string)=@_;print ($string;}
muestra_valor ("Hola\n");
La funcin local() sirve para declarar variables locales a la subrutina, sin embargo se puede haber
referencias directamente el array @_.
Por defecto las rutinas retornan la ltima expresin evaluada, pero se puede devolver
explcitamente un o ms valores usando return.
sub muestra_valores
{my ($mensaje,@datos) = @_;print $mensaje;foreach $val (@datos)
{print "$val \n";}} @valores = (35..70);
muestra_valores ("Valores del arreglo:\n",@valores);
1.8. Operadores.
Gran parte de los operadores de PERL son heredados del lenguaje C. Tiene una gran variedad y
se usan igual que en todos los lenguajes y se utilizan principalmente para realizar operaciones
aritmticas y lgicas.
Se puede clasificar a los operadores en los siguientes tipos:
Operadores de comparacin: se usan para comparar dos expresiones y el resultado puede ser
lgico numrico. Los siguientes son los operadores de comparacin:
Compara dos valores iguales. Devuelve un valor lgico verdadero cuando son iguales y falso en
caso contrario
if ($radio == 1) { ...}
si el valor almacenado en $radio es uno entonces entrar en el BLOQUE entre parntesis.
eq Se usa igual que == pero para expresiones tipo string.
12
Perl
if ($radio != 1) { ...}
Entra al bloque si los valores son diferentes
ne Se usa igual que != pero para expresiones tipo string.
< Retorna un valor lgico verdadero el valor numrico de la expresin de la izquierda es menor que
el valor de la expresin de la derecha, en caso contrario retorna falso.
<= ,>= Los operadores <= y >= adems verifican la condicin de igualdad
lt , gt Son los equivalentes de < y > para los tipos de dato no numricos, como las cadenas. Por
ejemplo lt devuelve verdadero si el orden de la cadena de la izquierda es menor que el de la
cadena de la derecha, y gt que devuelve cierto si la cadena de la izquierda es mayor que el orden
de la cadena de la derecha.
le , ge Son los equivalentes de <= y >= para los tipos de dato no numricos
cmp Se usa para comparar caracteres. Retorna 0 si los caracteres comparados son iguales, 1 si la
cadena de la derecha se encuentra al comienzo de la de la izquierda, y -1 en el caso contrario:
retorna
retorna
retorna -1
retorna -1
<=> Se usa para comparar valores numricos, retornando 0 cuando son iguales, 1 cuando el
termino de la derecha es menor que el de la izquierda y -1 en el caso contrario.
=~ Se usa en las expresiones regulares para indicar la presencia de un patrn de comparacin
dentro de una variable que contiene una cadena de caracteres:
www.maptek.cl
13
Operadores de asignacin: se usan para dar valores a cualquier tipo de variables validas en
PERL.
= Se utiliza para asignar a la variable que se encuentra a la izquierda del operador el valor de la
expresin de la derecha.
$var =~ s/one/uno/;
Se reemplaza la ocurrencia de la cadena 'one' por la cadena 'uno'.
$var = 3;
$var**2;
El valor almacenado en var es 9.
'ja' x 3;
Expresa una cadena de 6 caracteres: jajaja.
$var = 5 % 2;
El valor que se asigna a var es 1.
| Permite realizar una operacin binaria 'o' entre 2 valores numricos, por ejemplo
$var = 3 | 2;
14
Perl
& Permite realizar una operacin binaria 'y' entre 2 valores numricos, por ejemplo:
$var = 3 & 2;
El valor asignado es 2.
El operador = est muy relacionado con los operadores aritmticos de modo que es posible
combinarlos siguiendo el siguiente formato:
$var = Juan;
$var .= Soto;
El valor de la variable ser Juan Soto.
|| Tambin representa la operacin lgica 'o' pero en este caso se utiliza sobre instrucciones y no
sobre expresiones regulares.
& Trabaja como un operador lgico 'y' en expresiones regulares, permite confrontar 2 patrones, por
ejemplo:
www.maptek.cl
15
El cdigo entre parntesis se ejecuta si dentro de la variable existe una ocurrencia de la cadena
'pepe' y otra de la cadena 'juan'. Tambin se utiliza para comparar expresiones condicionales.
&& Trabaja como un operador lgico 'y', pero slo sobre instrucciones y no sobre expresiones
regulares.
! Con este operador se puede realizar una evaluacin negativa de la expresin, por ejemplo:
if (!$var) { ...}
Entra al bloque si la variable var es nulo o 0.
16
Perl
1.10. Funciones.
El siguiente es un listado con algunas de las funciones ms utilizadas:
www.maptek.cl
17
18
Perl
1.11. Referencias.
Esta seccin fue elaborada en base a manuales y referencias de Perl tomadas de Internet
http://www.perl.com/
http://www.ulpgc.es/otros/tutoriales/perl/indice.htm
http://perldoc.perl.org/index-functions.html
http://kataix.umag.cl/~mmarin/topinf/perl.html
http://www.htmlpoint.com/perl/index.html
www.maptek.cl
19
20
Perl
Mdulo LAVA
2.1. Introduccin.
Lava es un mdulo creado por Maptek para ser usado en scripts Perl. Este mdulo entrega
acceso a funciones y objetos dentro del entorno grfico de Vulcan, Envisage. Tambin permite
acceder y modificar modelos de bloques, bases de datos ISIS, adems de la edicin y creacin de
triangulaciones.
Varias de las opciones que actualmente incorpora nuestro software fueron en su inicio scripts lava,
por ejemplo: Pit Optimiser. Contact Profile. Chornos Gantt Chart, Flag 2D Polygons, Direccional
Variography, Export Block Model to 4X, etc. Las que fueron desarrolladas localmente para luego
ser probadas e incorporadas definitivamente en Vulcan.
Actualmente este mdulo es usado en la automatizacin de procesos del usuario mediante el uso
de Macros.
Dada esta potencialidad es que permanentemente Maptek ha fomentado el uso de Lava entre sus
clientes.
2.2. Estructura.
Dado que Lava es un mdulo para ser usado en un script perl. Siempre debe ser declarado al
principio del script. As es como se declara:
use Lava
La estructura de un script lava es la misma que la de un script perl.
La extensin que se usa para los lava scripts es .lava, y puede ser ejecutado desde el men
File/Lava. El hecho de que un script lava es bsicamente un script perl trae como consecuencia de
que sea posible ejecutar scripts perl desde el mismo men, con la diferencia que debe ser
cambiada la extensin pl por lava.
www.maptek.cl
21
Cabecera
La idea de tener una cabecera es bsicamente por un tema de orden y seguimiento de los cambios
realizados a cada script.
######################################################
# Nombre
: mi_script.lava
# Lugar
: Maptek Oficina Via del Mar Modificado # Modifid
26-Mayo-2008 NGY Nueva rutina AutoBMF
# Modifid
#
######################################################
Declaracin de mdulos incluidos
use Lava;
use Win32::OLE;
use strict;
use vulcan;
A continuacin se declaran las variables que sern visibles y modificables en cualquier lugar del
script. Por ejemplo:
my $variable1;
my @array1;
22
Mdulo LAVA
Declaracin de subrutinas
sub subroutine1
{my ($var1,$arr1) = @_;my $result = -1;..return($result);}
Parte principal del script
En esta seccin es donde se lleva el control de flujo principal del programa. Por ejemplo
2.3. Funciones
Lava::Version
Esta funcin determina la versin actual de Lava.
$version = Lava::Version();
Lava::Show
Muestra temporalmente el mensaje guardado en $message
www.maptek.cl
23
Lava::Report
Despliega un mensaje de texto en la ventana de reporte
$project = Lava::Project();
Lava::Environment
Retorna el cdigo de ambiente actual
$envir = Lava::Environment();
Lava::Current_BModel
Retorna el nombre del modelo de bloques actualmente abierto o un string vaco si no hay modelo
de bloques abierto.
$nombre_bm = Lava::Current_BModel($modo)
Lava::Object_Visibility
Cambia la visibilidad de un objeto, usando el segmento grfico que lo identifica ($seg).
Lava::Object_Visibility($seg,$modo)
$seg : segment grfico del objeto
$modo : modo de visibilidad (0=visible,1=sombreado,2=invisible)
Lava::View
Esta funcin despliega un mensaje
Lava::View($msg)
$msg : Texto a ser desplegado
24
Mdulo LAVA
2.4. Clases
Existen tres tipos de clases, clases Lava (que solo pueden ser usadas dentro de Envisage), clases
Vulcan (que pueden ser usadas fuera de Envisage) y la clase Triangulacin, que al igual que las
clases Vulcan, puede ser usada fuera de Envisage.
Se utiliza para crear paneles en el ambiente de Envisage. Slo puede ser abierto un panel a la vez
Mtodos
El constructor crea una nueva instancia de Lava::Panel e inicialzalo valores requeridos. No es
posible un nuevo panel si uno est abierto.
execute
Levanta el panel creado
$panel->execute($titulo);
$titulo: Texto que se despliega en la barra superior del panel
text
Crea una lnea de texto en el panel
$panel->text($text);
$text: Texto que se desplegar dentro del panel
tem
www.maptek.cl
25
$panel->item($label,$variable,$length);
$label: Etiqueta del componente a desplegar
$variable: variable donde se guardar el valor ledo
$length: largo del campo
numeric
Crea una caja de edicin para tomar datos de tipo numrico
$panel->numeric($label,$variable,$length,$decimals);
$label: Etiqueta del componente a desplegar
$variable: Variable numrica donde se guardara el valor ledo
$length: nmero de elementos del campo
$decimals: nmero de decimales del valor ledo
Ejemplo:
$edad="21";
$panel->numeric("Ingresa tu edad,\$edad,3,0);
colour
Permite seleccionar un color desde la paleta de colores
$panel->colour($label,$variable);
$label: Etiqueta del componente a desplegar
$variable: Variable entera donde se guardar el nmero del color seleccionado (1-32)
line
26
Mdulo LAVA
$panel->line($label,$variable);
$label: Etiqueta del componente a desplegar
$variable: variable entera donde se guardar el nmero del tipo de lnea seleccionado
pattern
Permite seleccionar un tipo de pattern
$panel->pattern($label,$variable);
$label: Etiqueta del componente a desplegar
$variable: Variable entera donde se guardara el numero del pattern seleccionado (1-32)
on_side
Indica que el elemento previamente definido en el panel va a la derecha del que fue establecido
antes que l.
$panel->on_side;
pick_list
Este mtodo siempre va acompaando a un mtodo item. Permite seleccionar un archivo de un
grupo de archivos en un directorio especfico.
$panel->pick_list($dir,$file_ext, $remueve_ext);
$dir: Directorio donde se buscaran los archivos (ejemplo: .)
$file_ext: Tipo de archivos a mostrar en la lista
$remueve_ext: Especifica si se oculta la extensin (0=no, 1=si)
Ejemplo:
$image = "fase.gif";
$panel->item("Enter image name",\$image);
$panel->pick_list(".","*.gif;*.rgb",1);
pick_list_data
www.maptek.cl
27
$panel->pick_list_data(@array);
@array: Conjunto de todo tipo de valores
logical_button
Crea una casilla de verificacin (tick) en el panel
$panel->logical_button($label,$variable);
$label: Etiqueta del componente a desplegar
$variable: Asume un 1 si se selecciona y 0 en caso contrario
radio_button
Crea un radio button. Al activarse uno de los radio buttons en un panel todos los
otros con el mismo grupo son desactivados.
$panel->radio_button($rnum,$label,$variable);
$rnum: Nmero que identifica al grupo de botones
$label: Etiqueta del componente a desplegar
$variable: Al activarse el botn asume el valor 1, en caso contrario 0
if; y endif
Utilizado conjuntamente con logical_button y radio_button, indica que la parte contenida entre estos
dos mtodos depende de la seleccin del botn previamente definido
new_page
Permite dividir el panel en dos o ms paneles.
28
Mdulo LAVA
begin_indent; y end_indent;
Indenta los elementos definidos dentro de estos.
Ejemplo:
# Variables globales #
my $true = 1;
my $false = 0;
my $invalidval = -9999;
my $bigvalue = 10000000000.0;
my @expantypes = ("Use the major part of the polygon",
"Use the minor part of the polygon",
"Always ask me which part to use");
##################
my $panel;
#
my $crteline = $true;
my $crtepoly = $true;
my $expancrit = $expantypes[0];
# Variables para las lineas
my $lncol = 7;
my $lntyp = 0;
my $lngrp = "";
my $lnnam = "";
# Variables para los poligonos de trabajo
my $wrkpollncol = 2;
my $wrkpollntyp = 20;
# Variables para los lineas de trabajo
my $wrklncol = 6;
my $wrklntyp = 20;
# Variables de layers
my $lay = "TU_LineLay";
my $cllay = $true;
my $tmplay = "TU_TempLay";
# Metodo para la fusion de poligonos
my $method = ;
my $polymerge = $false;
my $boundary_method = $true;
my $Bcdeginterv = 9.0;
www.maptek.cl
29
my $Bcradius = 0.05;
my $rcf_method = $false;
my $min_ang = 90.0;
my $conv_fence = $false;
my $fustol = 0.0;
my $svpolylay = $false;
my $fustol1 = 0.05;
my $fustol2 = 0.05;
# Layer donde seran guardados los resultados
my $polylay = "TU_PolyLay";
my $clpolylay = $true;
my $panel = new Lava::Panel;
$panel = new Lava::Panel;
$panel->text("
$panel->text("
Version $version");
$panel->text("");
$panel->logical_button("Building-Fusioning polygons",\$crtepoly);
$panel->if;
$panel->begin_indent;
$panel->radio_button(2,"Boundary connection",\$boundary_method);
$panel->radio_button(2,"Polygon merge",\$polymerge);
$panel->end_indent;
$panel->begin_indent;
$panel->logical_button("Save in layer",\$svpolylay);
$panel->end_indent;
$panel->if;
$panel->item("",\$polylay,10);
$panel->on_side;
$panel->end_indent;
$panel->text(" ");
$panel->on_side;
$panel->logical_button("
Clear before",\$clpolylay);
$panel->on_side;
$panel->endif;
$panel->endif;
30
Mdulo LAVA
$panel->text("");
$panel->logical_button("Create expansion lines",\$crteline);
$panel->if;
$panel->item("
Expansion criteria",\$expancrit,33);
$panel->pick_list_data(@expantypes);
$panel->colour("
Line ",\$lncol);
$panel->line("
",\$lntyp);
$panel->on_side;
$panel->item("
Group",\$lngrp,10);
$panel->on_side;
$panel->item("
Name",\$lnnam,10);
$panel->on_side;
$panel->item("
Layer",\$lay,10);
$panel->text(" ");
$panel->on_side;
$panel->logical_button("
Clear before",\$cllay);
$panel->on_side;
$panel->text(" ");
$panel->logical_button("Display remaining polygons",\$dspremaining);
$panel->on_side;
$panel->endif;
$panel->text("");
$panel->text("Temporal - Working Parameters");
$panel->item("Working layer",\$tmplay,10);
$panel->text("Polygons");
$panel->colour("",\$wrkpollncol);
$panel->on_side;
$panel->line("
",\$wrkpollntyp);
$panel->on_side;
$panel->text("
Lines");
$panel->on_side;
$panel->colour("",\$wrklncol);
$panel->on_side;
$panel->line("
",\$wrklntyp);
$panel->on_side;
$panel->execute("Maptek Chile Application") or exit;
Resultados:
www.maptek.cl
31
32
Mdulo LAVA
2.5.2. Lava::Obj
Mtodos
Name
Nombre del objeto
Nombre (texto)
[$objdesc] = $obj->description([$newdesc]);
[$objgroup] = $obj->group([$newgroup]);
[$primitiva] = $obj->primitive([$newprimitive]);
[$objcontrol] = $obj->control ([$newcontrol]);
[$objcolour] = $obj->colour ([$newcolour]);
[$objline] = $obj->line([$newline]);
[$objpattern] = $obj->pattern([$newpattern]);
www.maptek.cl
33
[$objclosed] = $obj->closed([$newclosed]);
[$objfeature] = $obj->feature([$newfeature]);
Coordinates
Coordenadas espaciales del objeto
($coords) = $obj->coordinates([$new_coords])
Ejemplo:
$coords = $obj->coordinates();
($x,$y,$z,$w) = $coords->i(0)
primera coordenada del objeto
($text) = $obj->text($newtext)
$text contiene el puntero del texto del objeto
Ejemplo
Dibujar un triangulo en el plano XY
34
Mdulo LAVA
$layer->add($obj);
2.5.3. Lava::Coord
El objeto Lava::Coord encapsula un arreglo de registros de coordenadas. En el punto anterior se
mostr cmo se tratan tales registros. Los objetos textos solo usan la primera coordenada para
definir su posicin (registro 0, o coordenada 0).
Mtodos:
([$x,$y,$z,$w,$t,$name]) = $coords>i($i[,$n_x[,$n_y[,$n_z[,$n_w[,$n_t[,$n_name]]]]]])
$x: Si $n_x no es puesto, $x = valor X de la i-sima coordenama.
www.maptek.cl
35
n
Entrega el nmero de coordenadas vlidas
($n) = $coords->n
$n: Nmero de coordenadas contenidas
2.5.4. Lava::Text
Crea objetos tipo texto. En general es preferible usar la opcin de crear el objeto como el paso
anterior.
Mtodos
[$text_instance] = new Lava::Text() $text_instance: nueva instancia de la clase Lava::Text
Al igual que el tipo Lava::Obj el nombre del mtodo indica el atributo del objeto en si
angle: ngulo del texto
height: Altura
size: Tamao de fuente
font: Tipo de fuente
scale: Escala
Estos atributos dependen mucho de la fuente utilizada (ver referencias)
[$angle]
[$height]
[$size]
[$font]
[$scale]
36
=
=
=
=
=
angle([$newangle])
height([$newheight])
size([$newsize])
font([$newfont])
scale([$newscale])
Mdulo LAVA
Ejemplo:
2.5.5. Lava::Layer
Mtodos
El constructor crea una nueva instancia de Lava::Layer e inicialzalo los valores necesarios.
www.maptek.cl
37
is_valid
Indica si el layer es vlido
($valid) = $layer->is_valid()
add
Agrega un objeto (de tipo Lava::Obj) al layer
$layer->add($my_obj);
$my_obj: Objeto a ser agregado
2.5.6. Lava::Point
Mtodos
is_valid
Retorna verdadero si el punto es vlido o no
$result = $point->is_valid();
$result: indica si el punto es vlido o no
38
Mdulo LAVA
get
Toma el punto de envisage
($result) = $point->get();
$result indica si el usuario selecciono o no un punto
position
Retorna las coordenadas X,Y,Z del punto seleccionado
($x,$y,$z) = $point->position();
$X,$Y,$Z: coordenadas del punto pinchado
Ejemplo
www.maptek.cl
39
Ejemplo:
Mtodos
has_more
Indica que la seleccin corresponde a un objeto valido
next
Avanza al siguiente objeto en la seleccin
is_first
Indica si el objeto es el primero en la lista de seleccin
id
Identificador unico del objeto seleccionado
layer
Nombre del layer del que proviene el objeto seleccionado
replace
Reemplaza los atributos de los objetos (name,group,colour,line,pattern,etc) en caso de ser
modificados
Ejemplos:
a)
40
Mdulo LAVA
$sel->next();}
b)
Mtodos
is_valid
Indica si el usuario ha seleccionado una triangulacin
($result) = $trisel->is_valid()
$result: Tiene 1 si es vlida y 0 en caso contrario
name
Nombre de la triangulacin seleccionada. El nombre incluye la ruta completa donde se encuentra.
($name) = $trisel->name()
www.maptek.cl
41
Index
ndice de la triangulacin. Nmero nico que la identifica de entre todas las triangulaciones
cargadas
($index) = $trisel->index()
triangulation
Retorna la estructura de la triangulacin
($triangulation) = $trisel->triangulation;
$triangulation: recibe las estructuras de la triangulacin seleccionada (puntos e ndices);
replace
Guarda la triangulacin seleccionada y la carga nuevamente en Envisage
$trisel->replace()
Ejemplo
42
Mdulo LAVA
%.3f
%.3f",$i,$x,$y,$z;}
for ($i=0;$i<$triangles;$i++)
{($i1,$i2,$i3) = $triang->triangle($i);
printf "\nTriangle %d = %d
%d
%d",$i,$i1,$i2,$i3;}
$trisel->replace();
2.5.8. Lava::Contourer
Permite crear contornos de triangulaciones. Se necesita que este una triangulacin cargada en el
ambiente 3D.
Ejemplo
www.maptek.cl
43
Mtodos
is_valid
Retorna si la triangulacin es vlida o no
($valid) = $triangulation->is_valid;
$valid: Es 1 cuando una triangulacin ha sido correctamente leida o seteada
44
Mdulo LAVA
points
Entrega el nmero de puntos de la triangulacin
($npoints) = $triangulation->points
$npoints: Contiene nmero de puntos en la triangulacin
triangles
Retorna el nmero de tringulos
($ntriangles) = $triangulation->triangles
$ntriangles: Contiene el nmero de tringulos de la triangulacin
point
Permite acceder a un punto de la triangulacin
([$x,$y,$z]) = $triangulation->point($i[,$newx[,$newy[,$newz]]]])
$i: numero del punto en la triangulacin
$x,$y,$z: coordenadas del punto $i de la triangulacin
$newx,$newy,$newz: nuevas coordenadas para el punto
triangle
Permite acceder al ndice (ndice en la lista de puntos) de los vrtices de un triangulo de la
triangulacin
([$i1,$i2,$i3]) = $triangulation>triangle($i[,$newi1[,$newi2[,$newi3]]]])
$i: numero del triangulo en la triangulacin
$i1,$i2,$i3: ndices de los vrtices del triangulo $i en la triangulacin
$newx,$newy,$newz: nuevos ndices para el triangulo
read
Permite leeri una triangulacin de un disco. Si no se pone el nombre entonces es usado el nombre
entregado al constructor.
$triangulation->read([$name])
$name:Nombre de la triangulacin a ser leda
www.maptek.cl
45
write
Este mtodo escribe una triangulacin a disco. Si no se pone el nombre entonces es usado el
nombre entregado al constructor.
$triangulation->write ([$name])
$name: nombre de la triangulacion a ser guardada en disco
Ejemplos:
a)
%.3f
%.3f",$x,$y,$z;
}
for ($i=0;$i<$triangles;$i++)
{
($x,$y,$z) = $trisel->triangle($i);
46
Mdulo LAVA
printf "\n%d
%d
%d",$x,$y,$z;}
b)
# Creando una nueva triangulacion
use Lava;
($newtri) = new Triangulation;
$newtri->points(10);
$newtri->point(0,91718.514,61917.882,2300.000);
$newtri->point(1,91718.514,61917.882,2400.000);
$newtri->point(2,92014.099,62666.965,2300.000);
$newtri->point(3,92014.099,62666.965,2400.000);
$newtri->point(4,92155.817,62395.675,2300.000);
$newtri->point(5,92155.817,62395.675,2400.000);
$newtri->point(6,92580.973,62448.314,2300.000);
$newtri->point(7,92580.973,62448.314,2400.000);
$newtri->point(8,92597.169,62011.011,2300.000);
$newtri->point(9,92597.169,62011.011,2400.000);
$newtri->triangles(16);
$newtri->triangle(0,0,1,2);
$newtri->triangle(1,0,1,9);
$newtri->triangle(2,0,2,4);
$newtri->triangle(3,0,4,8);
$newtri->triangle(4,0,8,9);
$newtri->triangle(5,1,2,3);
$newtri->triangle(6,1,3,5);
$newtri->triangle(7,1,5,9);
$newtri->triangle(8,2,3,4);
$newtri->triangle(9,3,4,5);
$newtri->triangle(10,4,5,6);
$newtri->triangle(11,4,6,8);
$newtri->triangle(12,5,6,7);
$newtri->triangle(13,5,7,9);
$newtri->triangle(14,6,7,8);
$newtri->triangle(15,7,8,9);
$newtri->write("nelson.00t");
www.maptek.cl
47
48
Mdulo LAVA
www.maptek.cl
49
Mdulo Vulcan
3.1. Introduccin.
Las clases Vulcan para Lava han sido diseadas para trabajar desde fuera de Envisage, es decir,
podemos acceder al modelo de bloque o las base de datos Isis, sin necesidad que se ejecute
dentro de envisage.
Dentro de estas clases se encuentran la clase Block Model (vulcan::block_model), la case Isis data
base (vulcan::isisdb) la clase para Map file (vulcan_mapio) y la clase de triangulacin
(vulcan::triangulation).
Para usar estas clases es necesario agregar la instruccin de uso de la clase en la parte superior
del archivo.
use vulcan;
3.2. Clases
3.2.1. Clase Block Model
La clase block model incluye mtodos para abrir, acceder, recorrer, obtener informacin, obtener
valores de campos y escribir en el modelo de bloques.
Mtodos:
50
Mdulo Vulcan
Sintaxis:
Ejemplo:
Sintaxis:
$bm->close();
Obtener informacin sobre los campos y el modelo de bloque en general.
Sintaxis:
$bm->field_list();
Obtener la lista de campos numricos del modelo
Sintaxis:
$bm->field_list_numbers();
www.maptek.cl
51
Sintaxis:
$bm->->field_list_string();
Verifica si un texto es un campo vlido en el modelo de bloques
Sintaxis:
$bm->is_field(name);
Donde:
name es el nombre del campo a consultar.
Sintaxis:
$bm->is_number(name);
Donde:
name es el nombre del campo a consultar.
Sintaxis:
$bm->is_string(name);
Donde:
name es el nombre del campo a consultar.
Sintaxis:
$bm->model_extent();
52
Mdulo Vulcan
Sintaxis:
$bm->model_origin();
Sintaxis:
$bm->model_orientation();
Para un modelo no rotado estos ngulos son 90 0
Sintaxis:
$bm->model_n_schemas();
$bm->model_schema_extent(k);
Donde:
k corresponde al nmero del k-simo esquema
Sintaxis:
$bm->model_schema_size(k);
www.maptek.cl
53
Donde:
k corresponde al nmero del k-simo esquema
Sintaxis:
$bm->get(name);
Donde:
name es el nombre del campo a consultar.
Sintaxis:
$bm->get_string(name);
Donde:
name es el nombre del campo a consultar.
Sintaxis:
$bm->get_multiple( \@vl );
Donde:
V1 es la lista de campos a consultar.
Sintaxis:
$bm->put(name, value);
54
Mdulo Vulcan
Donde:
name es el nombre del campo a escribir.
value es el valor numrico a escribir
Sintaxis:
$bm->put_string(name, value);
Donde:
name es el nombre del campo a escribir.
value es el valor texto a escribir
Sintaxis:
$bm->write();
Avanza al siguiente bloque
Sintaxis:
$bm->next();
Si es necesario, actualiza el bloque actual antes de pasar al siguiente.
Sintaxis:
$bm->eof();
Mueve el cursor al primer bloque.
Sintaxis:
$bm->rewind();
www.maptek.cl
55
Sintaxis:
$bm->get_position();
Mueve el cursor a la posicin especificada
Sintaxis:
$bm->set_position(pos);
Busca el bloque definido por las coordenadas (x, y, z)
Sintaxis:
$bm->find_xyz(x,y,z);
Donde:
x, y, z es la coordenada relativa al modelo
Sintaxis:
$bm->world_xyz(x,y,z);
Donde:
x, y, z es la coordenada real
Mtodos de conversin
Sintaxis:
$bm->to_world(x,y,z);
Donde:
x, y, z es la coordenada que se desea convertir.
56
Mdulo Vulcan
Sintaxis:
$bm->to_model(x,y,z);
Donde:
x, y, z es la coordenada que se desea convertir.
Sintaxis:
$bm->select(expresion);
La expresin sigue la norma de la seleccin de bloques utilizada por los programas externos de
modelo de bloques.
Ejemplos de expresiones:
-C \'density eq 2.5\'
Selecciona bloques de acuerdo a una condicin. En este caso significa que selecciona bloques
cuya densidad es igual a 2.5
-t tri.00t
Selecciona bloques que estn dentro de una triangulacin
www.maptek.cl
57
-v <variable> [value]
-t <triangulation>
-n <top surface>
Superficie superior.
-u <lower surface>
Superficie inferior.
-O
-C <condition>
-X
Sintaxis:
$bm->match_extent();
Si el mtodo de seleccin utiliza proporcin en slidos (-X), la extensin ser menor que la
extensin del bloque actual. El volumen de la extensin es igual al volumen de la interseccin del
bloque y la triangulacin.
Sintaxis:
$bm->block_extent();
Sintaxis:
$bm->push_select(selection);
El cursor es posicionado en el primer bloque del criterio de seleccin
58
Mdulo Vulcan
Sintaxis:
$bm->pop_select();
El cursor se ubica en el bloque en el cual se llamo al mtodo push_select y se recupera el criterio
de seleccin almacenado.
Las selecciones pueden ser anidadas hasta en 5 niveles.
Un uso tpico de estos mtodos es buscar bloques cercanos a un bloque dentro de la seleccin
creada.
Ejemplo:
Use vulcan;
my $bm = new vulcan::block_model("n1.bmf", "w");
# Seleccion de bloques dentro del solido.
$bm->select("-t abc.00t");
for(; !$bm->eof(); $bm->next())
{$bm->put("density", 2.5);}
www.maptek.cl
59
Es muy importante el orden de los registros en la base de datos. Un objeto comienza con un
registro de cabecera simple (un registro cuyo tipo es la primera tabla en el diseo) y continua con
los restantes registros hasta que se encuentra con el prximo registro de cabecera o el fin de la
base de datos.
Mtodos.
Sintaxis:
60
Mdulo Vulcan
Sintaxis :
$db->is_open();
Este mtodo debe ser llamado inmediatamente despus de la instruccin new
vulcan::isisdb para verificar que la base de datos se ha abierto correctamente.
Cierra la base de datos
Sintaxis:
$db->close();
Si esta instruccin no se ejecuta antes de salir del script los cambios realizados no sern
guardados.
Sintaxis:
$db->table_list();
Obtiene una lista de los campos de una tabla
Sintaxis:
$db->field_list(table);
Donde:
Table es la tabla a consultar.
Sintaxis:
$db->field_index(field, table);
www.maptek.cl
61
Donde:
Field es el nombre del campo a consultar.
Table es la tabla en donde pertenece el campo.
El mtodo retorna el ndice del campo partiendo desde 1. Si el campo no existe el mtodo retorna 1.
Sintaxis:
$db->field_list_numbers(table);
Donde:
Table es la tabla a consultar.
Sintaxis:
$db->field_list_strings(table);
Donde:
Table es la tabla a consultar.
Sintaxis:
$db->delete_record()
Si el registro es un registro cabecera, al eliminarlo genera que todos los registros que estn a
continuacin pasen a pertenecer al objeto previo. Debido a este comportamiento es necesario
tener cuidado al eliminar registros. Se recomienda utilizar delete_key() si se desea eliminar todo el
objeto. El mtodo retorna 0 si el registro se elimin correctamente.
Sintaxis:
$db->delete_key(key)
62
Mdulo Vulcan
Donde:
Key es la clave del objeto que se desea eliminar.
Sintaxis:
$db->determine_key()
Calcula internamente la clave del objeto actual si el registro actual es un registro de cabecera. El
valor de la clave del objeto puede ser recuperado utilizando get_key(). Este procedimiento es til al
usar find_key() con patrones. Al llamar a determine_key() y get_key() retornarn el nombre de la
clave del objeto que se encontr.
Sintaxis:
$db->get_key()
Se debe invocar primero el mtodo determine_key() cuando el registro actual apunte a un registro
de cabecera. Por ejemplo inmediatamente despus de llamar a find_key().
Sintaxis:
$db->is_field(field, table);
Donde:
Field es el nombre del campo a consultar.
Table es la tabla en donde pertenece el campo.
Sintaxis:
$db->is_number(field, table);
Donde:
Field es el nombre del campo a consultar.
Table es la tabla en donde pertenece el campo.
www.maptek.cl
63
Sintaxis:
$db->is_string(field, table);
Donde:
Field es el nombre del campo a consultar.
Table es la tabla en donde pertenece el campo.
Sintaxis:
$db->get(field);
$db->get(index);
Donde
Field es el nombre del campo a consultar.
Index es el ndice del campo a consultar.
Sintaxis:
$db->get_string(field);
$db->get_string(index);
Donde
Field es el nombre del campo a consultar.
Index es el ndice del campo a consultar.
Si este mtodo se utiliza con un campo numrico el valor retornado ser la representacin de texto
del nmero.
64
Mdulo Vulcan
Sintaxis:
$db->get_multiple( \@vl );
Donde
v1 es una lista con los nombres de los campos que se desean recuperar.
Sintaxis:
$db->get_multiple_string( \@vl );
Donde
v1 es una lista con los nombres de los campos que se desean recuperar.
Si este mtodo se utiliza con un campo numrico el valor retornado ser la representacin de texto
del nmero.
Sintaxis:
$db->put(field, value);
$db->put(index, value);
Donde
Field es el nombre del campo a consultar.
Index es el ndice del campo a consultar.
Value es el valor a actualizar el campo.
www.maptek.cl
65
Sintaxis:
$db->put_string(field, value);
$db->put_string(index, value);
Donde
Field es el nombre del campo a consultar.
Index es el ndice del campo a consultar.
Value es el valor a actualizar el campo.
Sintaxis:
$db->next();
Si el siguiente registro es un registro vlido, el mtodo retorna el valor 0. Si al mover el cursor los
datos del registro han sido modificados, stos sern actualizados automticamente en la base de
datos.
Sintaxis:
$db->get_table_name();
Actualiza el nombre de la tabla del registro actual.
Sintaxis:
$db->put_table_name();
Sintaxis:
$db->write();
66
Mdulo Vulcan
Sintaxis:
$db->append();
Este mtodo slo se debe emplear cuando se agregan nuevos objetos, en general, es bastante
difcil determinar a cual objeto pertenece el nuevo registro. Utilice insert_after() e insert_before()
para insertar registros en objetos existentes.
Sintaxis:
$db->insert_after();
Inserta un nuevo registro antes del registro actual.
Sintaxis:
$db->insert_before();
Hay que tener precaucin al utilizar este mtodo. Se debe verificar que no se encuentre en un
registro de cabecera. Al utilizar este mtodo en dicho registro, el registro se crear en el objeto
anterior.
Sintaxis:
$db->eof();
$db->get_position();
Este mtodo se puede utilizar al estilo de marcadores, para volver ms tarde a una posicin
determinada.
www.maptek.cl
67
Sintaxis:
$db->rewind();
Si la base de datos no contiene datos, el mtodo eof() retornar verdadero.
Sintaxis:
$db->set_position(pos);
Donde
Pos es una posicin obtenida con el mtodo get_position().
Bajo ninguna circunstancia se debe dar una posicin obtenida de otra forma.
Sintaxis:
$db->find_key(key);
Donde:
Key es la clave que se desea buscar.
reemplaza 0 o ms caracteres
%
reemplaza un carcter.
68
Mdulo Vulcan
Sintaxis:
$db->next_key(key);
Donde:
Key es la clave del objeto
Sintaxis:
$db->next_same_key();
El mtodo devuelve 0 si la posicin resultante es un registro del mismo objeto. En otras
circunstancias el estado de la base de datos pasar a EOD (end of data) o el mtodo eof()
retornar verdadero.
Sintaxis:
$db->append_buffer(table, buffer);
Donde:
Table es la tabla en la que se agregar el registro
Buffer es un buffer obtenido con get_buffer().
El registro se crear al final de la base de datos. El registro pertenecer al ltimo objeto de la base
de datos, de tal manera que este mtodo debe usarse cuando se agregan nuevos objetos. Este
mtodo en conjunto con get_buffer() se utilizan para copiar registros a un nuevo objeto.
Sintaxis:
$db->get_buffer();
www.maptek.cl
69
El buffer devuelto es binario y no puede ser manipulado. Se debe recuperar el tipo de tabla
correspondiente al buffer usando get_table_name() y almacenar ambos valores para ser usados en
conjunto con el mtodo append_buffer()
Ejemplo
use vulcan;
# abrir la base de datos para lectura
my $db = new vulcan::isisdb("thordemo.dhd","r","krj");
die "Could not open database\n" unless $db->is_open();
# Obtiene una lista de tablas del diseo
my @tables = $db->table_list();
# Loop a travs de las tablas
foreach $t ( @tables )
{
# Obtiene los campos por cada tabla
@fl = $db->field_list($t);
# Imprime las tablas y campos
print "table $t: fields ";
foreach $f ( @fl ) { print "$f "; }
print "\n";}
# Posiciona la base de datos en el primer registro
$db->rewind();
# Lee secuencialmente todos los registros
for (; !$db->eof(); $db->next())
{
# Imprime el HOLEID y DEPTH si el registro viene de
# la table COLLAR
if( $db->get_table_name() eq "COLLAR" )
{print $db->get_string("HOLEID"), " ", $db->get("DEPTH"), "\n";}}
# Cierra la base de datos
$db->close();
70
Mdulo Vulcan
Mtodos.
Sintaxis:
Sintaxis:
$db->table_list();
En el caso del mapfile esta lista solo correponde al texto data
Sintaxis:
$db->field_list();
Obtiene una lista de los campos numricos
Sintaxis:
$db->field_list_numbers(table);
Donde:
Tabla es el nombre de la tabla de la que se quiere obtener informacin
www.maptek.cl
71
Sintaxis:
$db->field_list_string(table);
Donde:
Tabla es el nombre de la tabla de la que se quiere obtener informacin
Sintaxis:
$db->is_field(name, table);
Donde:
Tabla es el nombre de la tabla de la que se quiere obtener informacin
Field nombre del campo que se quiere probar
Sintaxis:
$db->is_number(name, table);
Donde:
Name nombre del campo que se desea probar.
Tabla es el nombre de la tabla de la que se quiere obtener informacin
Sintaxis:
$db->is_string(name, table);
Donde:
Name nombre del campo que se desea probar.
Tabla es el nombre de la tabla de la que se quiere obtener informacin
72
Mdulo Vulcan
Sintaxis:
$db->get(name);
Donde:
Name nombre del campo que se desea obtener el valor.
Sintaxis:
$db->get_string(name);
Donde:
Name nombre del campo que se desea obtener el valor.
Sintaxis:
$db->get_multiple( \@vl );
Donde
v1 es una lista con los nombres de los campos que se desean recuperar.
Sintaxis:
$db->put(name, value);
Donde:
Name nombre del campo que se desea probar.
Value es el valor con el cual se actualizar el campo.
www.maptek.cl
73
Sintaxis:
$db->put_string(name, value);
Donde:
Name nombre del campo que se desea probar.
Value es el valor con el cual se actualizar el campo.
Sintaxis:
$db->next();
Obtiene el tipo de table actual
Sintaxis:
$db->get_table_type();
Actualiza el tipo de tabla actual.
Sintaxis:
$db->put_table_type();
Escribe el bloque actual
Sintaxis:
$db->write();
Agrega al final de la base de datos
Sintaxis:
$db->append();
74
Mdulo Vulcan
Sintaxis:
$db->eof();
Obtine la posicin del registro actual
Sintaxis:
$db->get_position();
Mueve el cursor al primer registro de la base de datos
Sintaxis:
$db->rewind();
Mueve el cursor de la base de datos a una posicin definida
Sintaxis:
$db->set_position(pos);
Mueve el cursor a una clave dada (group id)
Sintaxis:
$db->find_key(key);
Mueve el cursor al siguiente registro
Sintaxis:
$db->next_key(key);
Mueve el cursor a la siguiente tabla
Sintaxis:
$db->next_same_key();
www.maptek.cl
75
Ejemplo:
use vulcan;
my $db = new vulcan::mapio("arcabc.map","r","","arc");
my @recs = $db->table_list();
foreach $r ( @recs )
{@fl = $db->field_list($r);print "table $r\n";foreach $f (@fl)
{print "
>next()){print
$db->get("X"), " ",
$db->get("Y"), " ",
$db->get("Z"), " ",
$db->get("W"), "\n";}
76
Mdulo Vulcan