This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/python/api2_2x/doc/Draw.py
Stephen Swaney fec1ebaca3 A little spell-checkage.
Some return types changed from PyNone ( a C name ) to None.
2006-07-12 01:36:07 +00:00

787 lines
24 KiB
Python

# Blender.Draw module and the Button PyType object
"""
The Blender.Draw submodule.
Draw
====
B{New}:
- access to ASCII values in L{events<Register>} callbacks;
- 'large' fonts for L{Text} and L{GetStringWidth}.
- Pop-up blocks with L{PupBlock}
- Color Picker button with L{ColorPicker}
This module provides access to a B{windowing interface} in Blender. Its widgets
include many kinds of buttons: push, toggle, menu, number, string, slider,
scrollbar, plus support for text drawing. It also includes keyboard keys and
mouse button code values in its dictionary, see a list after this example.
Example::
import Blender
from Blender import Draw, BGL
mystring = ""
mymsg = ""
toggle = 0
def event(evt, val): # the function to handle input events
global mystring, mymsg
if not val: # val = 0: it's a key/mbutton release
if evt in [Draw.LEFTMOUSE, Draw.MIDDLEMOUSE, Draw.RIGHTMOUSE]:
mymsg = "You released a mouse button."
Draw.Redraw(1)
return
if evt == Draw.ESCKEY:
Draw.Exit() # exit when user presses ESC
return
elif Draw.AKEY <= evt <= Draw.ZKEY: mystring += chr(evt)
elif evt == Draw.SPACEKEY: mystring += ' '
elif evt == Draw.BACKSPACEKEY and len(mystring):
mystring = mystring[:-1]
else: return # no need to redraw if nothing changed
Draw.Redraw(1)
def button_event(evt): # the function to handle Draw Button events
global mymsg, toggle
if evt == 1:
mymsg = "You pressed the toggle button."
toggle = 1 - toggle
Draw.Redraw(1)
def gui(): # the function to draw the screen
global mystring, mymsg, toggle
if len(mystring) > 90: mystring = ""
BGL.glClearColor(0,0,1,1)
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
BGL.glColor3f(1,1,1)
Draw.Toggle("Toggle", 1, 10, 10, 55, 20, toggle,"A toggle button")
BGL.glRasterPos2i(72, 16)
if toggle: toggle_state = "down"
else: toggle_state = "up"
Draw.Text("The toggle button is %s." % toggle_state, "small")
BGL.glRasterPos2i(10, 230)
Draw.Text("Type letters from a to z, ESC to leave.")
BGL.glRasterPos2i(20, 200)
Draw.Text(mystring)
BGL.glColor3f(1,0.4,0.3)
BGL.glRasterPos2i(340, 70)
Draw.Text(mymsg, "tiny")
Draw.Register(gui, event, button_event) # registering the 3 callbacks
All available events:
- ACCENTGRAVEKEY
- AKEY
- BACKSLASHKEY
- BACKSPACEKEY
- BKEY
- CAPSLOCKKEY
- CKEY
- COMMAKEY
- DELKEY
- DKEY
- DOWNARROWKEY
- EIGHTKEY
- EKEY
- ENDKEY
- EQUALKEY
- ESCKEY
- F10KEY
- F11KEY
- F12KEY
- F1KEY
- F2KEY
- F3KEY
- F4KEY
- F5KEY
- F6KEY
- F7KEY
- F8KEY
- F9KEY
- FIVEKEY
- FKEY
- FOURKEY
- GKEY
- HKEY
- HOMEKEY
- IKEY
- INPUTCHANGE
- INSERTKEY
- JKEY
- KEYBD
- KKEY
- LEFTALTKEY
- LEFTARROWKEY
- LEFTBRACKETKEY
- LEFTCTRLKEY
- LEFTMOUSE
- LEFTSHIFTKEY
- LINEFEEDKEY
- LKEY
- MIDDLEMOUSE
- MINUSKEY
- MKEY
- MOUSEX
- MOUSEY
- NINEKEY
- NKEY
- OKEY
- ONEKEY
- PAD0
- PAD1
- PAD2
- PAD3
- PAD4
- PAD5
- PAD6
- PAD7
- PAD8
- PAD9
- PADASTERKEY
- PADENTER
- PADMINUS
- PADPERIOD
- PADPLUSKEY
- PADSLASHKEY
- PAGEDOWNKEY
- PAGEUPKEY
- PAUSEKEY
- PERIODKEY
- PKEY
- QFULL
- QKEY
- QUOTEKEY
- Q_FIRSTTIME
- RAWKEYBD
- REDRAW
- RETKEY
- RIGHTALTKEY
- RIGHTARROWKEY
- RIGHTBRACKETKEY
- RIGHTCTRLKEY
- RIGHTMOUSE
- RIGHTSHIFTKEY
- RKEY
- SEMICOLONKEY
- SEVENKEY
- SIXKEY
- SKEY
- SLASHKEY
- SPACEKEY
- TABKEY
- THREEKEY
- TIMER0
- TIMER1
- TIMER2
- TIMER3
- TKEY
- TWOKEY
- UKEY
- UPARROWKEY
- VKEY
- WHEELDOWNMOUSE
- WHEELUPMOUSE
- WINCLOSE
- WINFREEZE
- WINQUIT
- WINTHAW
- WKEY
- XKEY
- YKEY
- ZEROKEY
- ZKEY
@note: function Button has an alias: L{PushButton}.
@warn: B{very important}: if using your script causes "Error totblock"
messages when Blender exits (meaning that memory has been leaked), this may
have been caused by an ignored return value from one of the button types. To
avoid this, assign created buttons return values to B{global} variables,
instead of ignoring them. Examples::
# avoid this, it can cause memory leaks:
Draw.Toggle(...)
Draw.Number(...)
Draw.String(...)
# this is correct -- assuming the variables are globals:
my_toggle_button = Draw.Toggle(...)
my_int_button = Draw.Number(...)
my_str_button = Draw.String(...)
@warn: Inside the windowing loop (after Draw.Register() has been executed and
before Draw.Exit() is called), don't use the redraw functions from other
modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and
Draw.Draw() functions that can be used inside the windowing loop.
"""
def Exit():
"""
Exit the windowing interface.
"""
def Register(draw = None, event = None, button = None):
"""
Register callbacks for windowing.
@type draw: function
@type event: function
@type button: function
@param draw: A function to draw the screen, taking no arguments: f().
@param event: A function to handle keyboard and mouse input events, taking
two arguments: f(evt, val), where:
- 'evt' (int) is the event number;
- 'val' (int) is the value modifier. If val = 0, the event refers to a
key or mouse button being released. Otherwise it's a key/button press.
@param button: A function to handle Draw Button events, taking one argument:
f(evt), where:
- 'evt' is the button number (see the I{event} parameter in L{Button}).
@note: note that in the example at the beginning of this page Draw.Register
is called only once. It's not necessary to re-register the callbacks,
they will stay until Draw.Exit is called. It's enough to redraw the
screen, when a relevant event is caught.
@note: only during the B{event} callback: the L{Blender}.ascii variable holds
the ASCII integer value (if it exists and is valid) of the current event.
"""
def Redraw(after = 0):
"""
Queue a redraw event. Redraw events are buffered so that, regardless of how
many events are queued, the window only receives one redraw event.
@type after: int
@param after: If non-zero, the redraw is processed before other input events.
"""
def Draw():
"""
Force an immediate redraw. Forced redraws are not buffered. In other words,
the window is redrawn once every time this function is called.
"""
def Create(value):
"""
Create a default Button object.
@type value: int, float, string or 3 floats
@param value: The value to store in the button.
@rtype: Blender Button
@return: The Button created.
@note: String values must have less then 400 characters.
"""
def PushButton(name, event, x, y, width, height, tooltip = None):
"""
Create a new (push) Button object.
@type name: string
@param name: The string to display on the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@note: This function used to be called only "Button". We added an
alternative alias to avoid a name clash with the L{Button} class/type that
caused trouble in this documentation's generation. The old name shouldn't
be deprecated, use Button or PushButton (better) at your choice.
"""
def PupMenu(name, maxrow = None):
"""
Create a pop-up menu.
The menu options are specified through the 'name' parameter, like with
L{Menu}: options are followed by a format code and separated by the '|'
character. Valid format codes are:
- %t - The option should be used as the title of the pop-up;
- %l - insert a separating line (only works if 'maxrow' isn't given);
- %xB{N} - Chosen this option, PupMenu should return the integer B{N}.
Example::
name = "OK?%t|QUIT BLENDER" # if no %xN int is set, indices start from 1
result = Draw.PupMenu(name)
if result:
Draw.PupMenu("Really?%t|Yes|No")
@type name: string
@param name: The format string to define the contents of the button.
@type maxrow: int
@param maxrow: The maximum number of rows for each column in the pop-up.
@rtype: int
@return: the chosen entry number or -1 if none was chosen.
"""
def PupIntInput(text, default, min, max):
"""
Create an integer number input pop-up.
This allows python to use Blender's integer number pop-up input.
Example::
default = 50
min = 0
max = 100
msg = "Set this value between 0 and 100"
result = Draw.PupIntInput(msg, default, min, max)
if result != None:
print result
else:
print 'no user input'
@type text: string
@param text: The text that is displayed in the pop-up.
@type default: int
@param default: The value that the pop-up is set to initially.
@type min: int
@param min: The lowest value the pop-up will allow.
@type max: int
@param max: The highest value the pop-up will allow.
@rtype: int
@return: the number chosen or None if none was chosen.
"""
def PupFloatInput(text, default, min, max, clickStep, floatLen):
"""
Create a floating point number input pop-up.
This allows python to use Blender's floating point pop-up input.
Example::
default = 50
min = 0.0
max = 10.0
clickStep = 100
floatLen = 3
msg = "Set this value between 0 and 100"
result = Draw.PupFloatInput(msg, default, min, max, clickStep, floatLen)
if result != None:
print result
else:
print 'no user input'
@type text: string
@param text: The text that is displayed in the pop-up.
@type default: float
@param default: The value that the pop-up is set to initially.
@type min: float
@param min: The lowest value the pop-up will allow.
@type max: float
@param max: The highest value the pop-up will allow.
@type clickStep: int
@param clickStep: How much is incremented per user click, 100 will increment 1.0, 10 will increment 0.1 etc.
@type floatLen: int
@param floatLen: The number of decimal places to display, between 2 and 4.
@rtype: float
@return: the number chosen or None if none was chosen.
"""
def PupStrInput(text, default, max = 20):
"""
Create a string input pop-up.
This allows python to use Blender's string pop-up input.
Example::
Blender.Draw.PupStrInput("Name:", "untitled", 25)
@type text: string
@param text: The text that is displayed in the pop-up.
@type default: string
@param default: The value that the pop-up is set to initially. If it's longer
then 'max', it's truncated.
@type max: int
@param max: The most characters the pop-up input will allow. If not given
it defaults to 20 chars. It should be in the range [1, 100].
@rtype: string
@return: The text entered by the user or None if none was chosen.
"""
def PupBlock(title, sequence):
"""
Display a pop-up block.
Possible formats for the items in the sequence parameter.
(Value are objects created with L{Create})
- string: Defines a label
- (string, Value, string): Defines a toggle button. The first string is the text on the button, the optional second string is the tooltip.
- (string, Value, min, max, string): Defines a numeric or string button, depending on the content of Value. The first string is the text on the button, the optional second string is the tooltip. I{For string, max is the maximum length of the string and min is unused.}
Example::
import Blender
text = Blender.Draw.Create("short text")
f = Blender.Draw.Create(1.0)
i = Blender.Draw.Create(2)
tog = Blender.Draw.Create(0)
block = []
block.append(("Name: ", text, 0, 30, "this is some tool tip"))
block.append("Some Label")
block.append(("Value: ", f, 0.0, 100.0))
block.append(("Value: ", i, 0, 100))
block.append(("Option", tog, "another tooltip"))
retval = Blender.Draw.PupBlock("PupBlock test", block)
print "PupBlock returned", retval
print "text\\t", text
print "float\\t", f
print "int\\t", i
print "toggle\\t", tog
@warning: On cancel, the Value objects are brought back to there initial values except for string values which will still contain the modified values.
@type title: string
@param title: The title of the block.
@param sequence: A sequence defining what the block contains.
The order of the list is the order of appearance, from top down.
@rtype: int
@return: 1 if the pop-up is confirmed, 0 otherwise
"""
def Menu(name, event, x, y, width, height, default, tooltip = None):
"""
Create a new Menu Button object.
The menu options are specified through the 'name' of the button. Options are
I{followed} by a format code and separated by the '|' (pipe) character. Valid
format codes are:
- %t - The option should be used as the title;
- %l - Insert a separating line;
- %xB{N} - The option should set the integer B{N} in the button value.
Example::
name = "The Title %t|First Entry %x1|Second Entry %x2|Third Entry %x3"
menu = Draw.Menu(name, 2, 60, 120, 200, 40, 3, "Just a test menu.")
# note that, since default = 3, the "Third Entry"
# will appear as the default choice in the Menu.
@type name: string
@param name: The format string to define the contents of the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type default: int
@param default: The number of the option to be selected by default.
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
"""
def Toggle(name, event, x, y, width, height, default, tooltip = None):
"""
Create a new Toggle Button object.
@type name: string
@param name: The string to display on the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type default: int
@param default: The value specifying the default state:
(0 for "up", 1 for "down").
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
"""
def Slider(name, event, x, y, width, height, initial, min, max, realtime = 1,
tooltip = None):
"""
Create a new Slider Button object.
@type name: string
@param name: The string to display on the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type initial: int or float
@type min: int or float
@type max: int or float
@param initial: The initial value.
@param min: The minimum value.
@param max: The maximum value.
@type realtime: int
@param realtime: If non-zero (the default), the slider will emit events as
it is edited.
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
"""
#def Scrollbar(event, x, y, width, height, initial, min, max, realtime = 1,
# tooltip = None):
# """
# Create a new Scrollbar Button object.
# @type event: int
# @param event: The event number to pass to the button event function when
# activated.
# @type x: int
# @type y: int
# @param x: The lower left x (horizontal) coordinate of the button.
# @param y: The lower left y (vertical) coordinate of the button.
# @type width: int
# @type height: int
# @param width: The button width.
# @param height: The button height.
# @type initial: int or float
# @type min: int or float
# @type max: int or float
# @param initial: The initial value.
# @param min: The minimum value.
# @param max: The maximum value.
# @type realtime: int
# @param realtime: If non-zero (the default), the slider will emit events as
# it is edited.
# @type tooltip: string
# @param tooltip: The button's tooltip (the string that appears when the mouse
# is kept over the button).
# @rtype: Blender Button
# @return: The Button created.
# """
def ColorPicker(event, x, y, width, height, initial, tooltip = None):
"""
Create a new Color Picker Button object.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type initial: 3-float tuple
@param initial: The initial color value. All values must be between 0 and 1
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
@note: The color picker will not work if the Register's event function is None.
@note: Using the same button variable with more then 1 color picker at a time will corrupt memory.
"""
def Number(name, event, x, y, width, height, initial, min, max, tooltip = None):
"""
Create a new Number Button object.
@type name: string
@param name: The string to display on the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type initial: int or float
@type min: int or float
@type max: int or float
@param initial: The initial value.
@param min: The minimum value.
@param max: The maximum value.
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
I{B{Example:}}
This example draws a single floating point value::
from Blender import Draw
b= Draw.Create(0.0) # Data for floating point button
def bevent(evt):
print 'My Button event:', evt
def gui():
global b
b= Draw.Number('value: ', 1000, 0,0, 200, 20, b.val, 0,10, 'some text tip')
Draw.Register(gui, None, bevent) # we are not going to worry about keyboard and mouse events
"""
def String(name, event, x, y, width, height, initial, length, tooltip = None):
"""
Create a new String Button object.
@type name: string
@param name: The string to display on the button.
@type event: int
@param event: The event number to pass to the button event function when
activated.
@type x: int
@type y: int
@param x: The lower left x (horizontal) coordinate of the button.
@param y: The lower left y (vertical) coordinate of the button.
@type width: int
@type height: int
@param width: The button width.
@param height: The button height.
@type initial: string
@param initial: The string to display initially.
@type length: int
@param length: The maximum input length.
@type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button).
@rtype: Blender Button
@return: The Button created.
"""
def GetStringWidth(string, fontsize = 'normal'):
"""
Get the width in pixels of a string.
@type string: string
@param string: A string.
@type fontsize: string
@param fontsize: The size of the font: 'large', 'normal', 'small' or 'tiny'.
@rtype: int
@return: The width of I{string} with the chosen I{fontsize}.
"""
def Text(string, fontsize = 'normal'):
"""
Draw a string on the screen.
Text location is set using the OpenGL raster location functions L{BGL.glRasterPos} before the text is drawn.
This sets the text location from the lower left corner of the current window.
Text color is set using the OpenGL color functions L{BGL.glColor} before the text is drawn.
@type string: string
@param string: The text string to draw.
@type fontsize: string
@param fontsize: The size of the font: 'large', 'normal', 'small' or 'tiny'.
@rtype: int
@return: The width of I{string} drawn with the chosen I{fontsize}.
@note: For drawing text in the 3d view see the workaround in L{BGL.glRasterPos}
"""
def Image(image, x, y, zoomx=1.0, zoomy=1.0, clipx=0, clipy=0, clipw=-1, cliph=-1):
"""
Draw an image on the screen.
The image is drawn at the location specified by the coordinates (x,y). A
pair of optional zoom factors (in horizontal and vertical directions) can
be applied to the image as it is drawn, and an additional clipping rectangle
can be applied to extract a particular sub-region of the image to draw.
Note that the clipping rectangle is given in image space coordinates. In
image space, the origin is located at the bottom left, with x coordinates
increasing to the right and y coordinates increasing upwards. No matter
where the clipping rectangle is placed in image space, the lower-left pixel
drawn on the screen is always placed at the coordinates (x,y). The
clipping rectangle is itself clipped to the dimensions of the image. If
either the width or the height of the clipping rectangle are negative then
the corresponding dimension (width or height) is set to include as much of
the image as possible.
For drawing images with alpha blending with the background you will need to enable blending as shown in the example.
Example::
import Blender
from Blender import BGL, Image, Draw
myimage = Image.Load('myimage.png')
def gui():
BGL.glEnable( BGL.GL_BLEND ) # Only needed for alpha blending images with background.
BGL.glBlendFunc(BGL.GL_SRC_ALPHA, BGL.GL_ONE_MINUS_SRC_ALPHA)
Draw.Image(myimage, 50, 50)
BGL.glDisable( BGL.GL_BLEND )
def event(evt, val):
if evt == Draw.ESCKEY:
Draw.Exit()
Draw.Register(gui, event, None)
@type image: Blender.Image
@param image: The image to draw.
@type x: int
@param x: The lower left x (horizontal) position of the origin of the image.
@type y: int
@param y: The lower left y (vertical) position of the origin of the image.
@type zoomx: float
@param zoomx: The x (horizontal) zoom factor to use when drawing the image.
@type zoomy: float
@param zoomy: The y (vertical) zoom factor to use when drawing the image.
@type clipx: int
@param clipx: The lower left x (horizontal) origin of the clipping rectangle
within the image. A value of 0 indicates the left of the
image.
@type clipy: int
@param clipy: The lower left y (vertical) origin of the clipping rectangle
within the image. A value of 0 indicates the bottom of the
image.
@type clipw: int
@param clipw: The width of the clipping rectangle within the image. If this
value is negative then the clipping rectangle includes as much
of the image as possible in the x (horizontal) direction.
@type cliph: int
@param cliph: The height of the clipping rectangle within the image. If this
value is negative then the clipping rectangle includes as much
of the image as possible in the y (vertical) direction.
"""
class Button:
"""
The Button object
=================
This object represents a button in Blender's GUI.
@type val: int or float, string or 3-float tuple (depends on button type).
@ivar val: The button's value.
"""