Sugerencias con script error: at if expected while

Bueno, ha pasado un buen tiempo desde que publiqué este hilo pidiendo ayuda. Finalmente, logré resolver todo lo que quería inicialmente, e incluso llegué a darle muchas funcionalidades adicionales al script. Por eso, quería compartirlo con ustedes. Finalmente no usé el case of, sino que cree una función que evalúa los poliedros que se combinaran, y en caso de ser compatibles, los va agregando a la estrucura. En caso de que no, sencillamente prueba con otro. Finalmente no funciona con un for, sino con un while.

Adjunto los archivos por si alguien quiere probar el script.

A) matriz coordenadas, csv: deben dejarlo en c:, o bien en otra ubicación cambiando la primera línea del código.

B) módulos reconstruidos, max: deben abrirlo y ejecutar el código ahí. En el caso del primer script, deben seleccionar todos los poliedros y luego ejecutar el código. En el caso del segundo script, aparecerá una ventana solicitando seleccionarlos.
1 – Versión original del script. Combina poliedros según matriz de posiciones, y los colorea (o asigna materiales) dependiendo del orden de creación, o distancia al primer módulo, o cantidad de módulos que rodean a un módulo determinado. Además, anima el orden de creación de los poliedros.

Código:

archivo_abierto = openfile c:/matriz posiciones lista.csv - Abre archivo con coordenadas como string. Objetos = $ as array - Crea el array objetos con los elementos seleccionados. Repeticiones = 300. Matriz_coordenadas = #() - Crea array vacío en donde meter coordenadas de objetos como point3. Array_provisorio = #() - Crea array vacío en donde meter coordenadas de objetos como string. Array_subcoordenadas = #(). Objetos_nuevos = #(). Animationrange = interval 0 (repeticiones + 5). Fn cp poliedro posición = t(t copia = copy poliedro copia, pues = posición append objetos_nuevos copia col = (255 * ((objetos_nuevos, count - 1.0) / repeticiones)) copia, material = mrarchmaterial Diffuse: (color 255 col col) reflectivity: 0 showinviewport: true - Asigna material según orden de creación with animate on (t tstart = objetos_nuevos, count - 1 tend = tstart + 2 at time tstart copia, visibility = of at time tend copia, visibility = on ) t). Función que copia el poliedro seleccionado a la posición especificada t. Fn di punto_nuevo = t(t for i in objetos_nuevos do (t distancia = length (i, pues - Punto_nuevo) if (distancia < 0.5) do return false ) return true t). Función que revisa la distancia entre dos puntos en el espacio, para revisar si un poliedro será copiado sobre otro existente t.
While (not eof archivo_abierto) do t(t f = readline archivo_abierto array_archivo = filterstring f, for i in array_archivo do (t = filterstring i * append array_provisorio ) t). Le el archivo csv con coordenadas, y genera array bidimensional con coordenadas como string. For x = 1 todo array_provisorio, count do t(t for h in array_provisorio[x] do (t i = array_provisorio[x][1] = array_provisorio[x][2] que = array_provisorio[x][3] = execute i n = execute o = execute k array_subcoordenadas = #(m, n, o) ) append matriz_coordenadas array_subcoordenadas t) t. For I in objetos [random 1 objetos, count] do t(t copia_objeto = copy i - Copia objeto que fue seleccionado aleatoriamente del array append objetos_nuevos copia_objeto - Se mete el nuevo objeto a un array para obtener sus coordenadas posteriormente copia_objeto, pues = [0,0,0] - Mueve el objeto nuevo a coordenadas 0,0,0 copia_objeto.wirecolor = [0,0,0] t) t.
While (objetos_nuevos, count > repeticiones == false) do t(t objeto_base = objetos_nuevos [random 1 objetos_nuevos, count] - Elige un objeto base del array de objetos_nuevos (para el primer loop será el objeto copiado anteriormente) nada = objeto_base, name - Le asigna a la variable nada el nombre del objeto seleccionado sa = substring nada 1 1 - Filtra el nombre del objeto, quedándose solo con la primera letra posición_referencia = objeto_base, Pos objeto_nuevo = objetos[random 1 objetos, count] nb = objeto_nuevo, name sb = substring nb 1 1 x = sa as integer y = sb as integer z = ((y-1)* + x if (matriz_coordenadas[z][3] == true) and (di (posición_referencia + matriz_coordenadas[z][1]) == true) and (di (posición_referencia + matriz_coordenadas[z][2]) == true) then cp objeto_nuevo (posición_referencia + matriz_coordenadas[z][random 1 2]) t). A continuación, las opciones para asignar material a cada módulo según la cantidad de poliedros que rodean dicho módulo. La opción para asignar material según distancia al primer módulo creado la perdí, pero era algo bastante similar en términos conceptuales y de código. For I in objetos_nuevos do t(t array_distancia = #() for in objetos_nuevos do (t pos_objeto = i, Pos distancia = distance i, pues, Pos if (distancia < 100 == true) do append array_distancia distancia ) col = (255.0*((array_distancia, count)/14.0)) i, material = mrarchmaterial Diffuse: (color col 255 125) reflectivity: 0 showinviewport: true t).

.
2 – Versión más depurada del script, que utilizo para crear lámparas. Viene con una interfaz de uso, en donde se pueden especificar la cantidad de módulos a usar, así como la cantidad de repeticiones. Quedó incluso con una barra de progreso, un gran logro para mí.

Código:

objetos_nuevos = #(). Rollout weairephelanlamp weaire phelan Lamp.
(Tgroup paso 1 - Elegir cantidad de módulos para lampara y la cantidad de lamparas (t spinner repeticiones número módulos range:[0,5000,10] type:#integer align:#left spinner cantidad número lamparas range:[0,5000,1] type:#integer align:#left ) tgroup paso 2 - Definir las opciones de coloreado (t radiobuttons colores colorear segun Labels:#(orden de creación,distancia al primer objeto creado,cantidad de módulos adyacentes,aleatoriamente) default:4 align:#left ) tgroup paso 3 - Definir luminarias (t checkbox luces crear luminarias enabled:true checked:false truco: si se marca la casilla, se creara una luz en cada modulo creado radiobuttons luz elegir tipo de luminaria Labels: #(standard omni,mr área omni,Photometrics free) defaut:1 enabled: false align:#left spinner multiplier intensidad range:[0,50,1] type:#float enabled: false align:#left spinner CD intensidad CD range:[0,10000,1500] enabled: false align:#left spinner kelvin tº kelvin type: #float range: [0,20000,3600] enabled: false default: 3600 align:#left ) tgroup paso 4 - Opciones avanzadas luminarias (validas para cualquier tipo de luz seleccionada) (t colorpicker color_luz color luz color: [255,255,255] align:#left label nota *nota: para luces omni y Mental Ray omni, el color representa el color real de la fuente lumínica. Align:#left label nota2 para Photometrics free en cambio, representa el color filter align:#left checkbox fa usar far attenuation (recomendado) enabled: false spinner sfa start far attenuation type: #worldunits range:[0,100000,0] align:#left enabled: false spinner efa end far attenuation type: #worldunits range:[0,100000,0] align:#left enabled: false checkbox show show far attenuation enabled: false ) tgroup paso 5 - Opciones de escalado (t label n1 align:#left label n2 el tamaño de los módulos en su diámetro mayor es de 100 unidades. Align:#left label n3 si desea escalarlos, ajustar el factor de escala en un valor diferente a 1. Align:#left label n4 si no se desea modificar su tamaño, dejar el valor en 1 align:#left label n5 se recomienda setear las unidades del modelo en customize > units setup antes de seguir align:#left label n6 align:#left spinner Esc factor de escala range: [0,100,1] align:#left ) tgroup paso 6- Seleccionar todos los módulos. Luego apretar crear lampara (t radiobuttons opción Labels:#(seleccionar de una lista,seleccionar en viewport) button acción crear lampara. Width:140 height:30 label relleno progressbar progreso_parcial color: orange progressbar progreso_total color:orange). Borrar después de esto group about (t label asd te gusta Nico qliao? T button si por supuesto label nepe button no oh no). On si pressed do.
(Tmessagebox excelenverga). On no pressed do.
(Tmessagebox hijo de puta). Borrar antes de esto. On luces changed estado do t(t if estado == true then (luz.enabled =true) if estado == true then (multiplier, enabled = true) if estado == true then (fa.enabled = true) if estado == false then (luz.enabled =false) if estado == false then (multiplier, enabled = false) if estado == false then (fa.enabled = false) t). On luz changed state do t(t if state <= 2 then (multiplier, enabled = true) if state <= 2 then (kelvin, enabled = false) if state <= 2 then (CD, enabled = false) if state == 3 then (multiplier, enabled = false) if state == 3 then (kelvin, enabled = true) if state == 3 then (CD, enabled = true) t). On fa changed status do t(t if status == true then (sfa.enabled = true) if status == true then (efa.enabled = true) if status == true then (show.enabled = true) if status == false then (sfa.enabled = false) if status == false then (efa.enabled = false) if status == false then (show.enabled = false) t) t. On acción pressed do t. If opción, state == 1 do t(t Fn filtro obj = iskindof obj geometry tobjetos = selectbyname title: seleccione los módulos t). If opción, state == 2 do t(t objetos = selection as array t). For loop = 1 todo cantidad.value do.
(. Archivo_abierto = openfile c:/matriz posiciones lista.csv - Abre archivo con coordenadas como string. Matriz_coordenadas = #() - Crea array vacío en donde meter coordenadas de objetos como point3. Array_provisorio = #() - Crea array vacío en donde meter coordenadas de objetos como string. Array_subcoordenadas = #() t. Fn cp poliedro posición = t(t copia = copy poliedro copia, pues = posición append objetos_nuevos copia t). Función que copia el poliedro seleccionado a la posición especificada t. Fn di punto_nuevo = t(t for i in objetos_nuevos do (t distancia = length (i, pues - Punto_nuevo) if (distancia < 0.5) do return false ) return true t). Función que revisa la distancia entre dos puntos en el espacio, para revisar si un poliedro será copiado sobre otro existente t.
While (not eof archivo_abierto) do t(t f = readline archivo_abierto array_archivo = filterstring f, for i in array_archivo do (t = filterstring i * append array_provisorio ) t). Le el archivo csv con coordenadas, y genera array bidimensional con coordenadas como string. For x = 1 todo array_provisorio, count do t(t for h in array_provisorio[x] do (t i = array_provisorio[x][1] = array_provisorio[x][2] que = array_provisorio[x][3] = execute i n = execute o = execute k array_subcoordenadas = #(m, n, o) ) append matriz_coordenadas array_subcoordenadas t) t. Objetos_nuevos = #() t. For I in objetos [random 1 objetos, count] do t(t copia_objeto = copy i - Copia objeto que fue seleccionado aleatoriamente del array append objetos_nuevos copia_objeto - Se mete el nuevo objeto a un array para obtener sus coordenadas posteriormente copia_objeto, pues = [0,0,0] - Mueve el objeto nuevo a coordenadas 0,0,0 copia_objeto.wirecolor = [255,0,0] t) t.
While (objetos_nuevos, count > (repeticiones.value - 1) == false) do t(t objeto_base = objetos_nuevos [random 1 objetos_nuevos, count] - Elige un objeto base del array de objetos_nuevos (para el primer loop será el objeto copiado anteriormente) nada = objeto_base, name - Le asigna a la variable nada el nombre del objeto seleccionado sa = substring nada 1 1 - Filtra el nombre del objeto, quedándose solo con la primera letra posición_referencia = objeto_base, Pos objeto_nuevo = objetos[random 1 objetos, count] nb = objeto_nuevo, name sb = substring nb 1 1 x = sa as integer y = sb as integer z = ((y-1)* + x if (matriz_coordenadas[z][3] == true) and (di (posición_referencia + matriz_coordenadas[z][1]) == true) and (di (posición_referencia + matriz_coordenadas[z][2]) == true) then cp objeto_nuevo (posición_referencia + matriz_coordenadas[z][random 1 2]) progreso_parcial.value = (100 * objetos_nuevos, count) / repeticiones.value t). Array_distancias = #(). For I in objetos_nuevos do t(t if (colores, state == 1) do (t for = 1 todo objetos_nuevos, count do (t n = as float col = (255.0 * (n / objetos_nuevos, count)) h= objetos_nuevos[j] h.wirecolor = [col,160,col] ) ) if (colores, state == 2) do (t pues = i, Pos distancia = distance i, pues [0,0,0] append array_distancias distancia for in objetos_nuevos do (t dist_max = amax array_distancias distancia = distance, pues [0,0,0] col = (255.0 * (distancia / dist_max)) i.wirecolor = [160,col,col] ) ) if (colores, state == 3) do (t array_distancia = #() for in objetos_nuevos do (t pos_objeto = i, Pos distancia = distance i, pues, Pos if (distancia < 100 == true) do append array_distancia distancia ) col = (255.0*((array_distancia, count)/14.0)) i.wirecolor = [col,col,130] ) if (colores, state == 4) do (t i.wirecolor = [(random 1 255), (random 1 255), (random 1 255)] ) t) t. For I in objetos_nuevos do t(t n = (repeticiones.value) * (100) * (Esc.value) * (lop - 1) print n move i [0,n,0] if (Esc.value == 1) then continue if (Esc.value.= 1) do (t i, pivot = [0,0,0] i, scale = [esc.value,esc.value,esc.value] centerpivot i ) t) t. Array_luces = #() t. For I in objetos_nuevos do t(t if (luces.state == true) do (t if (luz.state == 1) do (t a = i, Pos l = omnilight pos:a multiplier:multiplier, value color: color_luz, color usefaratten: true farattenstart: sfa.value farattenend: efa.value showfaratten: show.state append array_luces l ) if (luz.state == 2) do (t a = i, Pos l = omnilight pos:a multiplier:multiplier, value color: color_luz, color usefaratten: true farattenstart: sfa.value farattenend: efa.value showfaratten: show.state append array_luces l ) if (luz.state == 3) do (t a = i, Pos l = fre_light pos:a usekelvin: true kelvin: kelvin, value intensity: CD, value usefarattenuation: true startfarattenuation: sfa.value endfarattenuation: efa.value rgbfilter: color_luz, color displayfarattenuationgizmo: show.state append array_luces l ) ) continue t). Progreso_total.value = (100 * loop) / cantidad.value. Format ready.\objetos. Format \objetos. Select objetos.
) - End loop creación de lamparas). Mensaje = felicidades, + cantidad.value as string + lámparas creadas. Messagebox mensaje.
) - End on creación pressed.
) - End ut. Try (closerolloutfloater weph). Catch ().
Weph= newrolloutfloater lampara weaire-phelan 480 900. Addrollout weairephelanlamp weph

.

Bueno, en este de la lámpara si sale la opción para colorear por distancia.

Espero que a alguien pueda servirle en el futuro algo de lo planteado aquí por su humilde servidor. Estoy haciendo un video con el objeto, en donde se ve la animación cuando se van creando los módulos. Apenas lo tenga listo actualizo el mensaje. Saludos.

Ver más sobre el tema y los comentarios en el foro