Для того чтобы оператор, вызванный из непредназначенного для него контекста, правильно выполнил свою работу, для него необходимо переопределить контекст при помощи bpy.context.temp_override.() Однако при помощи temp_override можно переопределять не только контекст вызова оператора, но и, например, стек выбранных объектов.
Список всех выделенных объектов сцены хранится в bpy.context.selected_objects.
1 2 3 |
bpy.context.selected_objects # [bpy.data.objects['Cube']] |
Если теперь мы вызовем оператор transform.translate()
1 |
bpy.ops.transform.translate(value=(0, 1.0, 0), orient_axis_ortho='X', orient_type='GLOBAL') |
все выделенные объекты передвинутся на единицу вдоль глобальной оси X.
Мы можем использовать этот же самый оператор transform.translate() для того чтобы передвинуть нужные нам объекты, а не выделенные. Для этого нужно перед вызовом оператора переопределить для него список выделенных объектов.
Соберем указатели на нужные объекты в список:
1 |
objects = [bpy.data.objects['Suzanne'], bpy.data.objects['Suzanne.001']] |
И воспользуемся функцией temp_override для временного переопределения списка выделенных объектов, указав вместо него созданный нами список.
1 |
with bpy.context.temp_override(selected_objects=objects): |
Теперь повторно вызовем оператор transform.translate
1 |
bpy.ops.transform.translate(value=(0, 1.0, 0), orient_axis_ortho='X', orient_type='GLOBAL') |
В результате его выполнения будут передвинуты не выделенные объекты, а только те, что мы указали в списке при переопределении.
Полный код:
1 2 3 4 5 |
import bpy objects = [bpy.data.objects['Suzanne'], bpy.data.objects['Suzanne.001']] with bpy.context.temp_override(selected_objects=objects): bpy.ops.transform.translate(value=(0, 1.0, 0), orient_axis_ortho='X', orient_type='GLOBAL') |