Не все действия, производимые через Blender Python API, вызывают немедленную перерисовку экрана Blender. Поэтому довольно часто приходится принудительно вызывать обновление экрана для того, чтобы пользователь сразу видел все происходящие изменения.
Для примера нарисуем на экране 3D вьюпорта круг, используя возможности модуля gpu.
1 2 3 4 5 6 7 8 9 10 11 |
import bpy import gpu from gpu_extras.presets import draw_circle_2d shader = gpu.shader.from_builtin('3D_SMOOTH_COLOR') def draw(): shader.bind() draw_circle_2d((0.0, 0.0), (0.0, 1.0, 1.0, 1.0), 1.0, segments=20) draw_handler = bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') |
Если мы выполним этот код из текстового редактора Blender, нажав на кнопку со стрелкой, поначалу мы не увидим на экране вьюпорта никаких изменений. Для того чтобы увидеть нарисованный круг, нужно перевести курсор в рабочую область 3D вьюпорта и выполнить какое-нибудь действие, например изменить масштаб, покрутив колесико мышки. В этот момент экран вьюпорта обновляется и мы видим все изменения сразу.
Чтобы избавить пользователя от необходимости вручную обновлять экран, можно вызвать его принудительную перерисовку, выполнив следующий код:
1 2 |
for area in bpy.context.screen.areas: area.tag_redraw() |
После его выполнения все открытые рабочие области, в том числе и вьюпорт, будут принудительно обновлены.
Чтобы обновить только рабочую область 3D вьюпорта, можно ограничить вызов типом рабочей области:
1 2 3 |
for area in bpy.context.window.screen.areas: if area.type == 'VIEW_3D': area.tag_redraw() |
Этот код заставит перерисоваться только рабочие области 3D вьюпорта.
Перерисовку экрана можно выполнить также при помощи оператора redraw_timer().
1 |
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) |
Хотя эта возможность предоставлена разработчиками для замера скорости перерисовки экрана, она в процессе работы перерисовывает весь экран, что нам и требуется.