foreach_set – это удобная обертка в Blender Python API для быстрого присвоения каждому элементу коллекции bpy_prop_collection нужного значения. Однако при использовании этой функции разработчики скриптов часто сталкиваются с появлением не совсем очевидной ошибки.
Например, давайте переключим все полигоны меша в режим сглаженного отображения (smooth shading). Для этого свойство каждого полигона меша “use_smooth” нужно установить в True.
Используя стандартный синтаксис Python мы можем сделать это так:
1 2 |
for polygon in bpy.context.object.data.polygons: polygon.use_smooth = True |
Если же мы хотим использовать foreach_set, логичным кажется написать так:
1 |
bpy.context.object.data.polygons.foreach_set('use_smooth', True) |
однако вызов этой функции таким образом приведет к ошибке:
couldn’t access the py sequence
Это происходит потому, что вторым параметром в функции foreach_set должно идти не само значение, которое мы ходим установить для свойства “use_smooth”, а список значений для каждого из полигонов.
Вмето
1 |
True |
Нам нужно указывать
1 |
[True, True, ..... True] |
Длина списка должна соответствовать количеству элементов для которых вызывается foreach_set, в нашем случае – количеству полигонов.
Поэтому чтобы правильно использовать foreach_set для начала нужно создать список значений по количеству полигонов меша:
1 2 3 |
set_list = [True]*len(bpy.context.object.polygons) # [True, True, True, ....] |
а затем передать его вторым параметром в функцию:
1 |
bpy.context.object.data.polygons.foreach_set('use_smooth', set_list) |
Или все в одну строчку:
1 |
bpy.context.object.data.polygons.foreach_set('use_smooth', [True]*len(bpy.context.object.polygons)) |