A small edit of test code from GPU Shader Module (gpu) "Mesh with Random Vertex Colors" to save the handle to the driver namespace ...
import bpy
import gpu
import numpy as np
from random import random
from gpu_extras.batch import batch_for_shader
mesh = bpy.context.active_object.data
mesh.calc_loop_triangles()
vertices = np.empty((len(mesh.vertices), 3), 'f')
indices = np.empty((len(mesh.loop_triangles), 3), 'i')
mesh.vertices.foreach_get(
"co", np.reshape(vertices, len(mesh.vertices) * 3))
mesh.loop_triangles.foreach_get(
"vertices", np.reshape(indices, len(mesh.loop_triangles) * 3))
vertex_colors = [(random(), random(), random(), 1) for _ in range(len(mesh.vertices))]
shader = gpu.shader.from_builtin('3D_SMOOTH_COLOR')
batch = batch_for_shader(
shader, 'TRIS',
{"pos": vertices, "color": vertex_colors},
indices=indices,
)
def draw():
batch.draw(shader)
h = bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW')
bpy.app.driver_namespace["foo"] = h
Such that we can remove via the python console
>>> dns = bpy.app.driver_namespace
>>> h = dns['foo']
>>> h
<capsule object "RNA_HANDLE" at 0x7f4841cdbf90>
>>> bpy.types.SpaceView3D.draw_handler_remove(h, 'WINDOW')
... otherwise it is drawn on the screen until blender is shut.
Or is it? Is there a way, via python API, to remove all or any draw callbacks without the handle?
Related re making a class to "handle the handles"
I can't get a SpaceView3D draw callback to work
gpupython module in 2.8, replacing thebglmodule to draw on the viewport. Feel the gpu tag refers more to the hardware.bmeshas a standalone module has a tag, yet againblfdoesn't. – batFINGER Jan 19 '20 at 17:24