Desde ArchiCADero, un rincón de Diseñadero…

Buenos días apreciados lectores y usuarios, venimos una vez más a hablar del mundo GDL y dar soluciones eficientes a este lenguaje cada día más emergente. Yo tengo a veces problemas con la compilación del código, finalmente doy con la solución y comparto con vosotros mi solución.

Lo primero: ¿Qué es un array? Un array es una cadena de datos ordenados. Aquellos que son desarrolladores comprenderán rápidamente lo que es y cuántos usos tiene, pero aquellos que no lo son, os abriré un poco los ojos.

Supongamos que tenemos un ancho, entonces usamos una variable de tipo longitud llamada “ancho”, por ejemplo, y otra variable llamada “largo”, también del tipo longitud. Si hacemos un objeto del tipo block de esta manera:

block ancho, largo, zzyzx

Tendremos un bloque de ancho igual a “ancho”, de largo igual a “largo” y una altura del mismo tamaño que el tamaño total del objeto. Pero ahora hacemos otro block pero lo queremos de ancho y alto distinto. ¿Qué deberíamos de hacer? ¿Otra variable de nombre “ancho2”? ¿Y si el número de objetos está dado por el usuario? ¿Para ser precavidos tendríamos que hacer 10 variables “ancho” y 10 variables “largo”? Eso funciona, pero no es óptimo. Lo que deberíamos crear es una variable array (matriz) llamada ancho y largo. Nos vamos a los parámetros y le damos al botón matriz (el botón que hay al lado del tipo de la variable, en este caso tipo longitud). Y una variable nueva llamada “rep” del tipo entero. Esta variable será el número de repeticiones del bloque que queremos. Vamos al código 3D:

for i=1 to rep

next i

Repetirá lo que le pongamos dentro tantas veces como “rep”.

for i=1 to rep

block ancho[i], largo[i], zzyzx

add 1, 0, 0

next i

Hecho, esto repetirá “rep” veces el poner un block de tamaños distintos separados 1 metro desde el punto de colocación. Pero esto no termina aquí, ahora viene el fallo. La variable matriz ancho y largo no cambian de manera dinámica, no se añaden filas de manera tan fácil o incluso perdemos los valores insertados. Nos tenemos que ir al entorno de programación de parámetros:

dim anc[]

dim lar[]

Esto crea dos variables array llamadas anc y lar, que son ancho y alto pero estas si se modifican de manera dinámica. Los metemos en un bucle y tenemos en cuenta dos cosas. Que si ya tenía un valor, que no lo borre. Si queremos añadir un valor nuevo, el array debe crecer, si no da un error de programación por añadir un valor superior a la dimensión del array. Así que usamos lo siguiente VARDIM1(ancho) nos dice el tamaño del array ancho, así tenemos cuidado de no preguntarle por valores superiores a su dimensión.

for i=1 to rep

if vardim1(ancho)<=i then

anc[i]=ancho[i]

else

anc[i]=0.1

endif

if vardim1(largo)<=i then

lar[i]=largo[i]

else

lar[i]=0.1

endif

next i

 

parameters ancho=anc

parameters largo=lar

¿Qué hace esto? Nosotros tenemos un solo block de ancho 0.5 y largo 0.2 por ejemplo, entonces añadimos un segundo block poniendo rep a 2. El objeto crea dos array llamados anc y lar, y ahora revisa que el tamaño de los array largo y ancho es 1, pero rep será 2 asi que mira lo siguiente. ¿Existe posición en ancho[1] y alto[1]? Si, existe, entonces anc[1] tendrá el valor 0.5 y lar[1] será 0.2. Entonces i vale 2 y pregunta de nuevo si existe posición en ancho[2], como la dimensión de ancho y largo es 1, no es cierto que i sea < o = que 1, entonces pone un valor predeterminado a nuestro antojo, que en mi caso es 0.1 en ambos casos. Y por último el código machaca los valores ancho y largo por los valores de anc y lar.

Ancho ahora tendrá dimensión 2 y Largo también con sus valores dispuestos a ser editados de manera dinámica con dos únicas variables de tamaño variable.

Espero que esto os ayude y os oriente un poco más en este mundo extraño y fascinante del GDL.

Soy Javier Farratell, un saludo desde ArchiCADero