Skip to content

Instantly share code, notes, and snippets.

@simonecesano
Created September 5, 2021 10:01
Show Gist options
  • Save simonecesano/506c2b3b430005d36844e156f8e7b301 to your computer and use it in GitHub Desktop.
Save simonecesano/506c2b3b430005d36844e156f8e7b301 to your computer and use it in GitHub Desktop.
import bpy
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
class ModalTimerOperator(bpy.types.Operator):
"""Operator which runs its self from a timer"""
bl_idname = "wm.modal_timer_operator"
bl_label = "Modal Timer Operator"
_timer = None
def modal(self, context, event):
if event.type in {'RIGHTMOUSE', 'ESC'}:
self.cancel(context)
return {'CANCELLED'}
if event.type == 'TIMER':
tornado.ioloop.IOLoop.current().stop()
tornado.ioloop.IOLoop.current().start()
return {'PASS_THROUGH'}
def execute(self, context):
wm = context.window_manager
self._timer = wm.event_timer_add(0.1, window=context.window)
self._app = make_app()
self._server = tornado.httpserver.HTTPServer(self._app)
self._server.listen(3636)
print(self._app)
wm.modal_handler_add(self)
return {'RUNNING_MODAL'}
def cancel(self, context):
wm = context.window_manager
print('stopping')
self._server.stop()
tornado.ioloop.IOLoop.current().stop()
wm.event_timer_remove(self._timer)
def register():
bpy.utils.register_class(ModalTimerOperator)
def unregister():
bpy.utils.unregister_class(ModalTimerOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.wm.modal_timer_operator()
@simonecesano
Copy link
Author

This is a skeleton example of how a Tornado web server can be run inside a Modal loop in Blender

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment