Python Blender - Asignar coordenadas a objetos desde una lista

Ana1811 - 05/09/2022 15:13
Hola a todos. Tengo una lista con valores Z y una serie de sub-colecciones en el árbol de Blender. Mi idea es crear un objeto del tipo Vacío (Empty) en cada una de las subcolecciones y asignar a cada uno los valores Z correspondientes de la lista. Entiendo que debería ejecutar dos bucles for, uno para recorrer las subcolecciones y crear los objetos, y otro para recorrer la lista de valores Z y asignarlos a los objetos creados. Sin embargo, no he logrado obtener el resultado que busco.

Mi código es el siguiente:

[CODE]import bpy


heights = [0.09, 3.09, 6.09]


...


ind = 0
for coll in bpy.data.collections['IfcBuilding/My Building'].children:
empty = bpy.data.objects.new('IfcBuildingStorey/Level' + str(ind), None)
coll.objects.link(empty)
empty.empty_display_type = 'PLAIN_AXES'
for i in heights:
empty.location[2] = i
ind += 1
[/CODE]

La estructura de mi árbol de Blender es la de la imagen:


🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #243748




Con este código consigo cambiar el valor de la coordenada Z de los objetos, pero todos adquieren el último valor de la lista (6.09).

¿Podría alguien ayudarme con esto?

Muchas gracias de antemano.

-- IMÁGENES ADJUNTAS --

🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #243748

3dpoder - 31/03/2023 12:37
El problema con tu código es que estás asignando todos los valores de la lista heights a cada objeto empty en el segundo bucle for. En lugar de eso, deberías asignarle un valor único a cada objeto empty basado en su índice en la lista heights. Aquí te muestro un ejemplo de cómo podrías modificar tu código para lograr esto:

Código:

[CODE]import bpy

heights = [0.09, 3.09, 6.09]

...

for i, coll in enumerate(bpy.data.collections['IfcBuilding/My Building'].children):
empty = bpy.data.objects.new('IfcBuildingStorey/Level' + str(i), None)
coll.objects.link(empty)
empty.empty_display_type = 'PLAIN_AXES'
empty.location[2] = heights[i][/CODE]

Ten en cuenta que en lugar de utilizar un contador externo ind, puedes utilizar la función enumerate de Python para obtener tanto el índice como el elemento actual en la lista heights. De esta manera, puedes asignar el valor correspondiente de heights a cada objeto empty dentro del bucle for principal.