[Bf-python] Space handler script links

Campbell Barton cbarton at metavr.com
Mon May 9 08:53:48 CEST 2005


Hi Willian, I coundent get the event variable Blender.event to return a 
character, in an event handeling function too of course.
- Cam


Willian Padovani Germano wrote:
> Hi again,
> 
> As at least some of you know, Ton didn't like the way scripts could 
> control Blender and draw here and there using some Window module 
> functions, for example.  His concerns had a good reason, it's important 
> to follow Blender's UI ideas for proper integration.  Stephen had an irc 
> chat with him (log in wiki) where he suggests an acceptable approach.  I 
> talked to him, too, trying to understand what he proposed and we got to 
> space handler script links.
> 
> This is the accepted way for scripts to get events from windows (areas) 
> and drawing to them using Draw.Image and BGL (OpenGL) functions.  As Ton 
> said this fits nicely in Blender and should survive even if when events 
> system is upgraded.
> ------
> Edited excerpt from the cvs commit msg:
> 
>  -- Implemented Ton's space handler script links:
>  
>  Right now only for the 3d View,  but it's trivial to add for others.  
> There are two types: EVENT, to receive 3d View events from a chosen 
> window and DRAW, to draw on the window.  Ton's idea was to give scripts 
> a controlled way to integrate better within Blender.
>  
>  Here's how it works:
>  
>  - scripts must have a proper header (first line), like:
>  # SPACEHANDLER.VIEW3D.EVENT
>  
>  and then they are shown in 3d View's View menu, "Space Handler Scripts" 
> submenu.  Check (mark, click on it) a script to make it active.
>  
>  EVENT handlers should consult the Blender.event var to get the current 
> event, which can be compared with values from the Draw module:
> 
> # SPACEHANDLER.VIEW3D.EVENT
> 
> import Blender
> from Blender import Draw
> 
> evt = Blender.event
> if evt >= Draw.AKEY and evt <= Draw.ZKEY:
> Draw.PupMenu("%s", % chr(evt))
> elif evt in [Draw.LEFTMOUSE, Draw.MIDDLEMOUSE, Draw.RIGHTMOUSE]:
> Draw.Pupmenu("Mouse button %d pressed" % evt)
> else: evt = None # tell that we want to return the event
> 
> # set Blender.event to None so grabbed event won't be
> # further processed by Blender:
> if evt: Blender.event = None
> 
> # ---
> 
>  DRAW handlers are free to draw to their owner 3D View. OpenGL 
> attributes and modelview and projection matrices are pushed before 
> running the handler and poped when it finishes.
>  
>  To communicate between EVENT and DRAW handler scripts we have the 
> Blender.Registry module, as always.
>  
>  Still need to code some nice example, which should also serve to test 
> properly space handlers.  Simple tests went fine.
> 
> -------
> To make it clear:
> 
> - unless your script sets Blender.event to None, Blender will go on 
> processing the event as if you meant to ignore it in your script, so 
> e.g. a TAB would enter editmode after your script executes, but if you 
> set Blender.event to None when you read a TAB, that won't happen.
> - DRAW handlers should have a header like:
> # SPACEHANDLER.VIEW3D.DRAW
> and they are executed at the end of the window drawing code, like the 
> scene redraw slink.
> 
> Any doubt or concern, just say so.  In my opinion Ton had a good idea, 
> the system works nicely and scripts can do nifty things with it.  Of 
> course you'll need Blender compiled from current cvs to try this.
> 

-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241



More information about the Bf-python mailing list