Gracias Gracias:  1
Resultados 1 al 7 de 7

Tema: ayuda con script, error: at if, expected while

  1. #1
    Miembro Nuevo
    Fecha de ingreso
    Jun 2009
    Mensajes
    4

    Ayuda con script, error: at if, expected while

    Hola amigos. Estoy haciendo un script en 3dmax que elija un poliedro de un grupo, y lo combine con otros a partir de un array bidimensional que contiene las coordenadas para esto. No cualquier poliedro de los que tengo en la escena se combina con el resto, y cuando establezco las condiciones de "if" "then" "do" me arroja un error:

    -- Syntax error: at if, expected while
    -- In line: if (

    el código es el siguiente (para ser ejecutado requiere de un archivo csv y un archivo max sobre el cual se corre el script, pero no creo que sean necesarios para entender el problema. Si fueran necesarios, avisenme y los subo a rapidshare.

    NOTA: El error ocurre en la línea 81, que es la que resalto en dentro del codigo

    CODIGO:

    [spoiler]

    Código:
    -- Parámetros VARIABLES
    
    REPETICIONES = 10 -- Cantidad de objetos que copiara el script en total
    
    -- FIN Parámetros VARIABLES
    
    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
    
    array_coordenadas = #() -- crea array vacio en donde meter coordenadas de objetos como point3
    array_provisorio = #() -- crea array vacio en donde meter coordenadas de objetos como string
    array_subcoordenadas = #()
    
    fn copia_poliedro poliedro posición = 
    	(copy poliedro
    	poliedro.pos = posición
    	append objetos_nuevos poliedro
    	)
    
    -- función para copiar y mover a coordenadas correctas un nuevo poliedro
    
    while (not eof archivo_abierto) do 
    	(
     		f = readline archivo_abierto
    		array_archivo = filterString f ";"
    		for i in array_archivo do 
    			(
    				j = filterString i "*"
    				append array_provisorio j
    			)
    		
    	)
    
    -- lee el archivo csv con coordenadas, y genera array bidimensional con coordenadas como string
    
    for x = 1 to array_provisorio.count do
    	(
    		for i in array_provisorio[x] do
    			(
    				j = array_provisorio[x][1]
    				que = array_provisorio[x][2]
    				m = execute j
    				n = execute k
    				array_subcoordenadas = #(m,n)
    			)
    		appendifUnique array_coordenadas array_subcoordenadas	
    	)
    
    -- crea array bidimensional con coordenadas como point3
    
    objetos_nuevos = #() -- crea array vacio en donde meter los objetos nuevos
    
    for i in objetos [random 1 objetos.count] do
    	(
    		copia_objeto = copy i
    		append objetos_nuevos copia_objeto -- se mete el nuevo objeto a un array para obtener sus coordenadas posteriormente
    		copia_objeto.pos = [0,0,0] -- mueve el objeto nuevo a coordenadas 0,0,0
    		txt = copia_objeto.name -- crea string para identificar el nombre del objeto
    	)
    
    -- loop para copiar el primer poliedro al azar y situarlo en las coordenadas 0,0,0
    	
    for j = 1 to REPETICIONES do -- Loop que realizara la acción de copiar un poliedro la cantidad de REPETICIONES que se desee
    	(
    		objeto_base = objetos_nuevos [random 1 objetos_nuevos.count] -- elige un objeto base del array de objetos_nuevos (para el 1er loop será el objeto copiado anteriormente)
    		txta = objeto_base.name -- le asigna a la variable txta el nombre del objeto seleccionado
    		for i in objetos [random 1 objetos.count] do -- selecciona un objeto random del array de objetos para copiar y mover junto al objeto seleccionado anteriormente
    		(
    			txtb = j.name -- asigna a la variable txtb el nombre del objeto seleccionado
    			posicion_referencia = j.pos
    			if (substring 1 1 txta == "a") then do -- si el primer objeto seleccionado contiene en su nombre la letra "a" (o sea si es el dodecaedro) hacer lo siguiente
    				(
    					if (substring 1 1 txtb == "a") then continue -- si el segundo objeto seleccionado contiene la letra "a" en su nombre, continuar pues no se combinan
    					if (substring 1 1 txtb == "b") then continue -- Lo mismo si contiene la letra b
    					if (substring 1 1 txtb == "c") then do -- si contiene la letra c, hacer lo siguiente
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [3][random 1 2]) -- llama a la función COPIA_POLIEDRO, declarada anteriormente
    							append objetos_nuevos copia_poliedro -- mete el objeto en el array objetos_nuevos, para que después pueda ser seleccionado como objeto_base
    						)
    					if (substring 1 1 txtb == "d") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [4][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "f") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [5][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "g") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [6][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "h") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [7][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "i") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [8][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    				)
    			if (substring 1 1 txta == "b") then do
    				(
    					if (substring 1 1 txtb == "b") then continue
    					if (substring 1 1 txtb == "a") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [9][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "c") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [11][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "d") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [12][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "e") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [13][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "f") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [14][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "g") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [15][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "h") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [16][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)	
    				)
    			if (substring 1 1 txta == "c") then do
    				(
    					if (substring 1 1 txtb == "c") then continue
    					if (substring 1 1 txtb == "a") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [17][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "b") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [18][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "d") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [20][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "e") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [21][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "f") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [22][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "g") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [23][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)
    					if (substring 1 1 txtb == "h") then do
    						(
    							copia_poliedro i (posicion_referencia + array_coordenadas [24][random 1 2])
    							append objetos_nuevos copia_poliedro
    						)	
    				)
    		)
    	)
    [/spoiler]

    saludos, y muchas gracias de antemano

  2. #2
    Senior Member
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,637

    Respuesta: Ayuda con script, error: at if, expected while

    copia_poliedro es una función. Ergo que significa la linea:

    append objetos_nuevos copia_poliedro

    Que al array "objetos_nuevos" se le agregue la función "copia_poliedro"?
    Que podría ser... pero me da que no es lo que pretendes...

    De todas formas el error de sintaxis es por el if, o bien:

    if()
    then()
    [else()]

    o bien:
    if()
    do()

    Pero en ningún caso:
    if()
    then do()

    Porque se queda esperando el "while" correspondiente al "do" de después del "then".

    Espero haberme explicado.
    Aquel que pregunta, es tonto un rato. Aquel que no pregunta, es tonto toda la vida.

  3. #3
    reconvertido Avatar de ikerCLoN
    Fecha de ingreso
    Apr 2002
    Ubicación
    Los Angeles, USA
    Mensajes
    14,911

    Respuesta: Ayuda con script, error: at if, expected while

    Así a bote pronto y sin bucear demasiado en el código, te diría que usaras 'if... then' si vas a meter una sentencia 'else' después. Si no, usa 'if... do'.

    Del mismo modo, puedes limpiar mucho el código usando los comandos 'case... of' en lugar de tantos condicionales. Te escribo cómo quedaría:

    Código:
     txtb = j.name -- asigna a la variable txtb el nombre del objeto seleccionado
     posicion_referencia = j.pos
     if (substring 1 1 txta == "a") do -- si el primer objeto seleccionado contiene en su nombre la letra "a" (o sea si es el dodecaedro) hacer lo siguiente
     (
     case (substring 1 1 txtb) of
     (
     "c":(
     copia_poliedro i (posicion_referencia + array_coordenadas [3][random 1 2])
     objetos_nuevos copia_poliedro 
     )
     
     "d":(
     copia_poliedro i (posicion_referencia + array_coordenadas [4][random 1 2])
     append objetos_nuevos copia_poliedro
     )
     -- y así sucesivamente
     )
    En cualquier caso, sería más sencillo hacer un 'loop' con el 'array' de letras y posiciones, y evitar tener tantas condiciones

    EDITADO

    Te me adelantaste, Nessito :D
    character TD @ Walt Disney Animation Studios

    mi curso de rigging facial :: https://www.domestika.org/en/courses...je-3d/ikerclon
    blog :: www.somosposmodernos.com
    twitter :: www.twitter.com/soyposmoderno
    linkedIn :: www.linkedin.com/in/ikerj

  4. #4
    Miembro Nuevo
    Fecha de ingreso
    Jun 2009
    Mensajes
    4

    Respuesta: Ayuda con script, error: at if, expected while

    gracias por las respuestas...

    después de postear seguí trabajando sobre el script, y logre solucionar el problema... de partida, estaba empleando mal el comando substring, pues yo lo usaba:

    substring 1 1 txt == "a"

    diendo que debiera haber sido

    substring txt 1 1 == "a"

    después de eso, sencillamente deje las líneas así:

    Código:
    if (substring txta 1 1 == "a") then -- si el primer objeto seleccionado contiene en su nombre la letra "a" (o sea si es el dodecaedro) hacer lo siguiente
    				(
    					if (substring txtb 1 1 == "a") then continue -- si el segundo objeto seleccionado contiene la letra "a" en su nombre, continuar pues no se combinan
    					if (substring txtb 1 1 == "b") then continue -- Lo mismo si contiene la letra b
    					if (substring txtb 1 1 == "c") then -- si contiene la letra c, hacer lo siguiente
    						
    							copia_poliedro i (posicion_referencia + array_coordenadas [3][random 1 2]) -- llama a la función COPIA_POLIEDRO, declarada anteriormente
    							
    						
    					if (substring txtb 1 1 == "d") then
    eso arreglo el problema... De cualquier forma muchas gracias, intentaré hacer eso del "case"

    muchas gracias nuevamente

  5. #5
    Miembro Nuevo
    Fecha de ingreso
    Jun 2009
    Mensajes
    4

    Respuesta: Ayuda con script, error: at if, expected while

    Estoy intentando simplificar el script mediante "case.... of" pero no me resulta con el ejemplo que me diste, IkerClon

  6. #6
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Respuesta: Ayuda con script, error: at if, expected while

    Ayuda de maxscript -> buscar case of

    Prueba con algo simple para que entiendas el funcionamiento y luego aplicalo a tu script, es mejor que tu mismo te veas la ayuda a que alguien te lo de todo de antemano, vas a aprender muchísimo más y de paso crearas un buen habito.

    Si después de buscar en la ayuda y probar con un ejemplo simple te sigue dando problemas pregunta de nuevo y te ayudaremos con mucho gusto (al menos por mi parte), pero primero inténtalo que no es difícil y lo puedes sacar por ti mismo

  7. #7
    Miembro Nuevo
    Fecha de ingreso
    Jun 2009
    Mensajes
    4

    Re: Ayuda con script, error: at if, expected while

    Bueno, ha pasado un bueeen tiempo desde que publiqué este thread 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) Modulos 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 solicitandoles 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 vacio en donde meter coordenadas de objetos como point3
    array_provisorio = #() -- Crea array vacio en donde meter coordenadas de objetos como string
    array_subcoordenadas = #()
    objetos_nuevos = #()
    animationRange = interval 0 (REPETICIONES + 5)
    
    fn CP poliedro posición = 
    	(
    		copia = copy poliedro
    		copia.pos = 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
    		(
    			tStart = objetos_nuevos.count - 1
    			tEnd = tStart + 2
    			at time tStart copia.visibility = off
    			at time tEnd copia.visibility = on
    		)
    	)
    
    -- función que copia el poliedro seleccionado a la posición especificada
    	
    fn Di punto_nuevo =
    	(
    		for i in objetos_nuevos do
    			(
    				distancia = length (i.pos - punto_nuevo)
    				if (distancia < 0.5) do return false
    			)
    		return true
    	)
    
    -- función que revisa la distancia entre dos puntos en el espacio, para revisar si un poliedro será copiado sobre otro existente
    	
    while (not eof archivo_abierto) do 
    	(
     		f = readline archivo_abierto
    		array_archivo = filterString f ";"
    		for i in array_archivo do 
    			(
    				j = filterString i "*"
    				append array_provisorio j
    			)
    	)
    
    -- Lee el archivo csv con coordenadas, y genera array bidimensional con coordenadas como string
    
    for x = 1 to array_provisorio.count do
    	(
    		for h in array_provisorio[x] do
    			(
    				i = array_provisorio[x][1]
    				j = array_provisorio[x][2]
    				que = array_provisorio[x][3]
    				m = execute i
    				n = execute j
    				o = execute k
    				array_subcoordenadas = #(m,n,o)
    			)
    		append matriz_coordenadas array_subcoordenadas	
    	)
    	
    for i in objetos [random 1 objetos.count] do
    	(
    		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.pos = [0,0,0] -- Mueve el objeto nuevo a coordenadas 0,0,0
    		copia_objeto.wirecolor = [0,0,0]
    	)
    	
    while (objetos_nuevos.count > REPETICIONES == false) do
    	(
    		objeto_base = objetos_nuevos [random 1 objetos_nuevos.count] -- Elige un objeto base del array de objetos_nuevos (para el 1er loop será el objeto copiado anteriormente)
    		na = objeto_base.name -- Le asigna a la variable na el nombre del objeto seleccionado
    		Sa = Substring na 1 1 -- Filtra el nombre del objeto, quedandose solo con la primera letra
    		posicion_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)*8) + x
    		if (matriz_coordenadas[z][3] == true) and 
    		(Di (posicion_referencia + matriz_coordenadas[z][1]) == true) and 
    		(Di (posicion_referencia + matriz_coordenadas[z][2]) == true) then 
    		CP objeto_nuevo (posicion_referencia + matriz_coordenadas[z][random 1 2])
    	)
    
    -- 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
    	(
    		array_distancia = #()
    		for j in objetos_nuevos do
    		(
    			pos_objeto = i.pos
    			DISTANCIA = distance i.pos j.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
    	)
    2 - Versión más depurada del script, que utilizo para crear lamparas. 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 mi :D

    Código:
    objetos_nuevos = #()
    
    Rollout WeairePhelanLamp "Weaire Phelan Lamp" 
    (
    	group " PASO 1 - Elegir cantidad de Modulos para Lampara y la cantidad de Lamparas"
    		(
    			spinner REPETICIONES "Nº Modulos" range:[0,5000,10] type:#integer align:#left
    			spinner CANTIDAD "Nº Lamparas" range:[0,5000,1] type:#integer align:#left
    		)
    	group "PASO 2 - Definir las opciones de Coloreado"
    		(
    			radiobuttons colores "Colorear segun" labels:#("Orden de creacion","Distancia al primer objeto creado","Cantidad de modulos adyacentes","Aleatoriamente") default:4 align:#left
    		)
    	group "PASO 3 - Definir Luminarias"
    		(
    			checkbox LUCES "Crear Luminarias" enabled:true checked:false tooltip: "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","Photometric 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
    		)
    	group "PASO 4 - Opciones Avanzadas Luminarias (Validas para cualquier tipo de luz seleccionada)"
    		(
    			colorpicker Color_Luz "Color Luz" color: [255,255,255] align:#left 
    			label Nota "*Nota: Para luces Omni y MR Omni, el color representa el color real de la fuente lumínica." align:#left
    			label Nota2 " Para Photometric 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
    		)
    	group "PASO 5 - Opciones de Escalado"
    		(
    			label n1 "" align:#left
    			label n2 "El tamaño de los módulos en su diametro 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
    		)
    	group "PASO 6- Seleccionar Todos los módulos. Luego apretar Crear Lampara"
    		(
    			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"
    		(
    			label asd "Te gusta nico qliao?"
    			button si "POR SUPUESTO"
    			label nepe ""
    			button no "OOOOOOH NO"
    		)
    
    on si pressed do
    (
    	messagebox "excelenverga"
    )
    
    on no pressed do
    (
    	messagebox "hijo de puta"
    )
    
    -- borrar antes de esto
    
    on LUCES changed ESTADO do
    	(
    		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)
    		
    	)
    
    on LUZ changed STATE do
    	(
    		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)	
    	)
    
    on FA changed STATUS do
    	(
    		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)
    	)
    	
    on acción pressed do
    	
    (
    
    if opción.state == 1 do
    	(
    		fn filtro obj = isKindof obj geometry	
    	objetos = selectByname title: "Seleccione los Modulos" 
    	) 
    if opción.state == 2 do
    	(
    		objetos = selection as array	
    	)		
    
    for LOOP = 1 to CANTIDAD.value do
    (	
    (
    
    archivo_abierto = openFile "C:/MATRIZ POSICIONES LISTA.csv" -- Abre archivo con coordenadas como string	
    matriz_coordenadas = #() -- Crea array vacio en donde meter coordenadas de objetos como point3
    array_provisorio = #() -- Crea array vacio en donde meter coordenadas de objetos como string
    array_subcoordenadas = #()
    	
    fn CP poliedro posición = 
    	(
    		copia = copy poliedro
    		copia.pos = posición
    		append objetos_nuevos copia
    	)
    
    -- función que copia el poliedro seleccionado a la posición especificada
    	
    fn Di punto_nuevo =
    	(
    		for i in objetos_nuevos do
    			(
    				distancia = length (i.pos - punto_nuevo)
    				if (distancia < 0.5) do return false
    			)
    		return true
    	)
    
    -- función que revisa la distancia entre dos puntos en el espacio, para revisar si un poliedro será copiado sobre otro existente
    	
    while (not eof archivo_abierto) do 
    	(
     		f = readline archivo_abierto
    		array_archivo = filterString f ";"
    		for i in array_archivo do 
    			(
    				j = filterString i "*"
    				append array_provisorio j
    			)
    	)
    
    -- Lee el archivo csv con coordenadas, y genera array bidimensional con coordenadas como string
    
    for x = 1 to array_provisorio.count do
    	(
    		for h in array_provisorio[x] do
    			(
    				i = array_provisorio[x][1]
    				j = array_provisorio[x][2]
    				que = array_provisorio[x][3]
    				m = execute i
    				n = execute j
    				o = execute k
    				array_subcoordenadas = #(m,n,o)
    			)
    		append matriz_coordenadas array_subcoordenadas	
    	)
    	
    objetos_nuevos = #()
    	
    for i in objetos [random 1 objetos.count] do
    	(
    		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.pos = [0,0,0] -- Mueve el objeto nuevo a coordenadas 0,0,0
    		copia_objeto.wirecolor = [255,0,0]
    	)
    	
    while (objetos_nuevos.count > (REPETICIONES.value - 1) == false) do
    	(
    		objeto_base = objetos_nuevos [random 1 objetos_nuevos.count] -- Elige un objeto base del array de objetos_nuevos (para el 1er loop será el objeto copiado anteriormente)
    		na = objeto_base.name -- Le asigna a la variable na el nombre del objeto seleccionado
    		Sa = Substring na 1 1 -- Filtra el nombre del objeto, quedandose solo con la primera letra
    		posicion_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)*8) + x
    		if (matriz_coordenadas[z][3] == true) and 
    		(Di (posicion_referencia + matriz_coordenadas[z][1]) == true) and 
    		(Di (posicion_referencia + matriz_coordenadas[z][2]) == true) then 
    		CP objeto_nuevo (posicion_referencia + matriz_coordenadas[z][random 1 2])
    		PROGRESO_PARCIAL.value = (100 * objetos_nuevos.count) / REPETICIONES.value
    	)
    
    array_distancias = #()
    
    for i in objetos_nuevos do
    	(
    		if (colores.state == 1) do
    			(
    				for j = 1 to objetos_nuevos.count do
    				(
    					n = j as float
    					COL = (255.0 * (n / objetos_nuevos.count))
    					h= objetos_nuevos[j]
    					h.wirecolor = [COL,160,COL] 
    				)
    			)
    		if (colores.state == 2) do
    			(
    				pos = i.pos
    				DISTANCIA = distance i.pos [0,0,0]
    				append array_distancias DISTANCIA
    				for j in objetos_nuevos do
    					(
    						DIST_MAX = amax array_distancias
    						DISTANCIA = distance j.pos [0,0,0]
    						COL = (255.0 * (DISTANCIA / DIST_MAX))
    						i.wirecolor = [160,COL,COL]
    					)
    			)
    		if (colores.state == 3) do
    			(
    				array_distancia = #()
    				for j in objetos_nuevos do
    					(
    						pos_objeto = i.pos
    						DISTANCIA = distance i.pos j.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
    			(
    				i.wirecolor = [(random 1 255),(random 1 255),(random 1 255)]
    			)
    	)
    
    	
    for i in objetos_nuevos do 
    	(
    		
    		N = (REPETICIONES.value) * (100) * (ESC.value) * (LOOP - 1)
    		print N
    		move i [0,N,0]
    		if (ESC.value == 1) then continue
    		if (ESC.value != 1) do
    			(
    				i.pivot = [0,0,0]
    				i.scale = [ESC.value,ESC.value,ESC.value]
    				centerpivot i
    			)
    	)
    
    	
    array_luces = #()
    	
    for i in objetos_nuevos do
    	(
    		if (LUCES.state == true) do
    			(
    				if (LUZ.state == 1) do
    					(
    						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
    					(
    						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
    					(
    						A = i.pos
    						L = free_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
    	)
    
    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 + " lamparas creadas"
    messagebox MENSAJE
    ) -- End "on creación pressed"
    ) -- End Rollout
    
    try ( closeRolloutFloater WEPH )
    catch ()
    WEPH= newRolloutFloater "Lampara Weaire-Phelan" 480 900
    addRollout WeairePhelanLamp WEPH
    Bueno, en este de la lampara si sale la opción para colorear por distancia jejeje.

    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 post.

    Saludos
    Archivos adjuntados Archivos adjuntados

Temas similares

  1. Maya Maya 2013 no me deja guardar, abrir o importar texturas error de script 32 bits
    Por Andrew.Canada en el foro Programación y Scripts
    Respuestas: 2
    Último mensaje: 26-01-2014, 20:51
  2. Script Error al intentar activar programa autodesk
    Por Seiya-Pegasus en el foro Problemas con Programas
    Respuestas: 2
    Último mensaje: 01-05-2013, 22:52
  3. MaXScript error en script de macro excepcion
    Por kurozaki5 en el foro Problemas con Programas
    Respuestas: 0
    Último mensaje: 27-11-2010, 02:19
  4. MaxScript Error en Script de macro Excepcion
    Por malissimo en el foro Problemas con Programas
    Respuestas: 1
    Último mensaje: 17-08-2010, 16:13
  5. ayuda con Script
    Por mariano2cv en el foro Plugins
    Respuestas: 10
    Último mensaje: 02-01-2006, 13:01

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •