diff options
Diffstat (limited to 'release/scripts/templates_py/operator_modal_draw.py')
-rw-r--r-- | release/scripts/templates_py/operator_modal_draw.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/release/scripts/templates_py/operator_modal_draw.py b/release/scripts/templates_py/operator_modal_draw.py new file mode 100644 index 00000000000..d11ddf0b467 --- /dev/null +++ b/release/scripts/templates_py/operator_modal_draw.py @@ -0,0 +1,79 @@ +import bpy +import bgl +import blf + + +def draw_callback_px(self, context): + print("mouse points", len(self.mouse_path)) + + font_id = 0 # XXX, need to find out how best to get this. + + # draw some text + blf.position(font_id, 15, 30, 0) + blf.size(font_id, 20, 72) + blf.draw(font_id, "Hello Word " + str(len(self.mouse_path))) + + # 50% alpha, 2 pixel width line + bgl.glEnable(bgl.GL_BLEND) + bgl.glColor4f(0.0, 0.0, 0.0, 0.5) + bgl.glLineWidth(2) + + bgl.glBegin(bgl.GL_LINE_STRIP) + for x, y in self.mouse_path: + bgl.glVertex2i(x, y) + + bgl.glEnd() + + # restore opengl defaults + bgl.glLineWidth(1) + bgl.glDisable(bgl.GL_BLEND) + bgl.glColor4f(0.0, 0.0, 0.0, 1.0) + + +class ModalDrawOperator(bpy.types.Operator): + """Draw a line with the mouse""" + bl_idname = "view3d.modal_operator" + bl_label = "Simple Modal View3D Operator" + + def modal(self, context, event): + context.area.tag_redraw() + + if event.type == 'MOUSEMOVE': + self.mouse_path.append((event.mouse_region_x, event.mouse_region_y)) + + elif event.type == 'LEFTMOUSE': + bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW') + return {'FINISHED'} + + elif event.type in {'RIGHTMOUSE', 'ESC'}: + bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW') + return {'CANCELLED'} + + return {'RUNNING_MODAL'} + + def invoke(self, context, event): + if context.area.type == 'VIEW_3D': + # the arguments we pass the the callback + args = (self, context) + # Add the region OpenGL drawing callback + # draw in view space with 'POST_VIEW' and 'PRE_VIEW' + self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL') + + self.mouse_path = [] + + context.window_manager.modal_handler_add(self) + return {'RUNNING_MODAL'} + else: + self.report({'WARNING'}, "View3D not found, cannot run operator") + return {'CANCELLED'} + + +def register(): + bpy.utils.register_class(ModalDrawOperator) + + +def unregister(): + bpy.utils.unregister_class(ModalDrawOperator) + +if __name__ == "__main__": + register() |