- based on a request by Campbell (he also provided a patch for scene.Layer) access to layers was improved a little, keeping the old method (ob.Layers is a bitmask) and adding the nicer one (ob.layers is a list of ints). Done for objects and scenes. House-cleaning: .Layer was renamed to .Layers (actually just using strncmp instead of strcmp, so both work, same done for Window.ViewLayers). - finally committing patch by Ken Hughes to let .clearScriptLinks() accept a parameter (list of strings) to clear only specified texts. - doc updates and fixes (JMS reported a problem in nmesh.transform() example code). Thanks all who contributed.
402 lines
16 KiB
Python
402 lines
16 KiB
Python
# This is not a real module, it's simply an introductory text.
|
|
|
|
"""
|
|
Blender Python related features
|
|
===============================
|
|
|
|
L{Back to Main Page<API_intro>}
|
|
|
|
|
|
Introduction:
|
|
=============
|
|
|
|
This page describes special features available to BPython scripts:
|
|
|
|
- Command line mode is accessible with the '-P' and '-b' Blender options.
|
|
- Registration allows scripts to become available from some pre-defined menus
|
|
in Blender, like Import, Export, Wizards and so on.
|
|
- Proper documentation data is used by the 'Scripts Help Browser' script to
|
|
show help information for any registered script. Your own GUI can use
|
|
this facility with the L{Blender.ShowHelp} function.
|
|
- Configuration is for data in your script that can be tweaked according to
|
|
user taste or needs. Like documentation, this is another helper
|
|
functionality -- you don't need to provide a GUI yourself to edit config
|
|
data.
|
|
|
|
|
|
Command line usage:
|
|
-------------------
|
|
|
|
B{Specifying scripts}:
|
|
|
|
The '-P' option followed either by:
|
|
- a script filename (full pathname if not in the same folder where you run
|
|
the command);
|
|
- the name of a Text in a .blend file (that must also be specified)
|
|
will open Blender and immediately run the given script.
|
|
|
|
Example::
|
|
|
|
# open Blender and execute the given script:
|
|
blender -P script.py
|
|
|
|
B{Passing parameters}:
|
|
|
|
To pass parameters to the script you can:
|
|
- write them to a file before running Blender, then make your script parse that file;
|
|
- set environment variables and access them with the 'os' module:
|
|
|
|
Examples with parameters being passed to the script via command line::
|
|
|
|
# execute a command like:
|
|
|
|
myvar=value blender -P script.py
|
|
|
|
# and in script.py access myvar with os.getenv
|
|
# (os.environ and os.setenv are also useful):
|
|
|
|
# script.py:
|
|
import os
|
|
val = os.getenv('myvar')
|
|
|
|
# To pass multiple parameters, simply write them in sequence,
|
|
# separated by spaces:
|
|
|
|
myvar1=value1 myvar2=value2 mystr="some string data" blender -P script.py
|
|
|
|
B{Background mode}:
|
|
|
|
In '-b' mode no windows will be opened: the program will run as a command
|
|
line tool able to render stills and animations and execute any working Python
|
|
script with complete access to loaded .blend's file contents. Once the task
|
|
is completed, the program will exit.
|
|
|
|
Background mode examples::
|
|
|
|
# Open Blender in background mode with file 'myfile.blend'
|
|
# and run the script 'script.py':
|
|
|
|
blender -b myfile.blend -P script.py
|
|
|
|
# Note: a .blend file is always required. 'script.py' can be a file
|
|
# in the file system or a Blender Text stored in 'myfile.blend'.
|
|
|
|
# Let's assume 'script.py' has code to render the current frame;
|
|
# this line will set the [s]tart and [e]nd (and so the current) frame to
|
|
# frame 44 and call the script:
|
|
|
|
blender -b myfile.blend -s 44 -e 44 -P script.py
|
|
|
|
# Using now a script written to render animations, we set different
|
|
# start and end frames and then execute this line:
|
|
|
|
blender -b myfile.blend -s 1 -e 10 -P script.py
|
|
|
|
# Note: we can also set frames and define if we want a single image or
|
|
# an animation in the script body itself, naturally.
|
|
|
|
The rendered pictures will be written to the default render folder, that can
|
|
also be set via bpython (take a look at L{Render.RenderData}). Their
|
|
names will be the equivalent frame number followed by the extension of the
|
|
chosen image type: 0001.png, for example. To rename them to something else,
|
|
coders can use the C{rename} function in the standard 'os' Python module.
|
|
|
|
Reminder: if you just need to render, it's not necessary to have a script.
|
|
Blender can create stills and animations with its own command line arguments.
|
|
Example:
|
|
- a single image at frame 44: blender -b myfile.blend -f 44
|
|
- an animation from frame 1 to 10: blender -b myfile.blend -s 1 -e 10 -a
|
|
|
|
|
|
Registering scripts:
|
|
--------------------
|
|
|
|
To be registered a script needs two things:
|
|
- to be either in the default scripts dir or in the user defined scripts
|
|
path (see User Preferences window -> File Paths tab -> Python path);
|
|
- to have a proper header.
|
|
|
|
Try 'blender -d' to know where your default dir for scripts is, it will
|
|
inform either the dir or the file with that info already parsed, which is
|
|
in the same dir of the scripts folder.
|
|
|
|
The header should be like this one (all double and single apostrophes below
|
|
are required)::
|
|
#!BPY
|
|
|
|
# \"\"\"
|
|
# Name: 'Script Name'
|
|
# Blender: 233
|
|
# Group: 'Export'
|
|
# Submenu: 'All' all
|
|
# Submenu: 'Selected' sel
|
|
# Submenu: 'Configure (gui)' gui
|
|
# Tooltip: 'Export to some format.'
|
|
# \"\"\"
|
|
|
|
where:
|
|
- B{Name} is the string that will appear in the menu;
|
|
- B{Blender} is the minimum program version required to run the script;
|
|
- B{Group} defines where the script will be put, see all groups in the
|
|
Scripts Window's header, menu "Scripts";
|
|
- B{Submenu} adds optional submenus for further control;
|
|
- B{Tooltip} is the (short) tooltip string for the menu entry.
|
|
|
|
note:
|
|
- all double and single apostrophes above are required;
|
|
- you can "comment out" the header above, by starting lines with
|
|
'#', like we did. This is not required (except for the first line, #!BPY,
|
|
of course), but this way the header won't conflict with Python tools that
|
|
you can use to generate documentation for your script code. Just
|
|
remember to keep this header above any other line with triple
|
|
double-quotes (\"\"\") in your script.
|
|
|
|
Submenu lines are not required, use them if you want to provide extra
|
|
options. To see which submenu the user chose, check the "__script__"
|
|
dictionary in your code: __script__['arg'] has the defined keyword (the word
|
|
after the submenu string name: all, sel or gui in the example above) of the
|
|
chosen submenu. For example, if the user clicked on submenu 'Selected' above,
|
|
__script__['arg'] will be "sel".
|
|
|
|
If your script requires extra data or configuration files, there is a special
|
|
folder where they can be saved: see 'datadir' in L{Blender.Get}.
|
|
|
|
|
|
Documenting scripts:
|
|
--------------------
|
|
|
|
The "Scripts Help Browser" script in the Help menu can parse special variables
|
|
from registered scripts and display help information for users. For that,
|
|
authors only need to add proper information to their scripts, after the
|
|
registration header.
|
|
|
|
The expected variables:
|
|
|
|
- __bpydoc__ (or __doc__) (type: string):
|
|
- The main help text. Write a first short paragraph explaining what the
|
|
script does, then add the rest of the help text, leaving a blank line
|
|
between each new paragraph. To force line breaks you can use <br> tags.
|
|
|
|
- __author__ (type: string or list of strings):
|
|
- Author name(s).
|
|
|
|
- __version__ (type: string):
|
|
- Script version. A good recommendation is using a version number followed
|
|
by the date in the format YYYY/MM/DD: "1.0 2005/12/31".
|
|
|
|
- __url__ (type: string or list of strings):
|
|
- Internet links that are shown as buttons in the help screen. Clicking
|
|
them opens the user's default browser at the specified location. The
|
|
expected format for each url entry is e.g.
|
|
"Author's site, http://www.somewhere.com". The first part, before the
|
|
comma (','), is used as the button's tooltip. There are two preset
|
|
options: "blender" and "elysiun", which link to the Python forums at
|
|
blender.org and elysiun.com, respectively.
|
|
|
|
- __email__ (optional, type: string or list of strings):
|
|
- Equivalent to __url__, but opens the user's default email client. You
|
|
can write the email as someone:somewhere*com and the help script will
|
|
substitute accordingly: someone@somewhere.com. This is only a minor help
|
|
to hide emails from spammers, since your script may be available at some
|
|
site. "scripts" is the available preset, with the email address of the
|
|
mailing list devoted to scripting in Blender, bf-scripts-dev@blender.org.
|
|
You should only use this one if you are subscribed to the list:
|
|
http://projects.blender.org/mailman/listinfo/bf-scripts-dev for more
|
|
information.
|
|
|
|
Example::
|
|
__author__ = 'Mr. Author'
|
|
__version__ = '1.0 2005/01/01'
|
|
__url__ = ["Author's site, http://somewhere.com",
|
|
"Support forum, http://somewhere.com/forum/", "blender", "elysiun"]
|
|
__email__ = ["Mr. Author, mrauthor:somewhere*com", "scripts"]
|
|
__bpydoc__ = \"\"\"\\
|
|
This script does this and that.
|
|
|
|
Explaining better, this script helps you create ...
|
|
|
|
You can write as many paragraphs as needed.
|
|
|
|
Shortcuts:<br>
|
|
Esc or Q: quit.<br>
|
|
etc.
|
|
|
|
Supported:<br>
|
|
Meshes, metaballs.
|
|
|
|
Known issues:<br>
|
|
This is just an example, there's no actual script.
|
|
|
|
Notes:<br>
|
|
You can check scripts bundled with Blender to see more examples of how to
|
|
add documentation to your own works.
|
|
\"\"\"
|
|
|
|
B{Note}: your own GUI or menu code can display documentation by calling the
|
|
help browser with the L{Blender.ShowHelp} function.
|
|
|
|
Configuring scripts:
|
|
--------------------
|
|
|
|
The L{Blender.Registry<Registry>} module provides a simplified way to keep
|
|
scripts configuration options in memory and also saved in config files.
|
|
And with the "Scripts Config Editor" script in the System menu users can later
|
|
view and edit the options easily.
|
|
|
|
Let's first clarify what we mean by config options: they are simple data
|
|
(bools, ints, floats, strings) used by programs to conform to user
|
|
preferences. The buttons in Blender's User Preferences window are a good
|
|
example.
|
|
|
|
For example, a particular exporter might include:
|
|
- SEPARATE_MATS = False: a bool variable (True / False) to determine if it
|
|
should write materials to a separate file;
|
|
- VERSION = 2: an int to define an specific version of the export format;
|
|
- TEX_DIR = "/path/to/textures": a default texture dir to prepend to all
|
|
exported texture filenames instead of their actual paths.
|
|
|
|
The script needs to provide users a GUI to configure these options -- or else
|
|
directly editing the source code would be the only way to change them. And to
|
|
store changes made to the GUI so they can be reloaded any time the script is
|
|
executed, programmers have to write and load their own config files (ideally at
|
|
L{Blender.Get}('udatadir') or, if not available, L{Blender.Get}('datadir')).
|
|
|
|
This section describes BPython facilities (based on the L{Registry} module and
|
|
the config editor) that can take care of this in a simplified (and much
|
|
recommended) way.
|
|
|
|
Here's how it works::
|
|
|
|
# sample_exporter.py
|
|
import Blender
|
|
from Blender import Registry
|
|
|
|
# First define all config variables with their default values:
|
|
SEPARATE_MATERIALS = True
|
|
VERSION = True
|
|
TEX_DIR = ''
|
|
EXPORT_DIR = ''
|
|
|
|
# Then define a function to update the Registry:
|
|
def registry_update():
|
|
# populate a dict with current config values:
|
|
d = {
|
|
'SEPARATE_MATERIALS': SEPARATE_MATERIALS,
|
|
'VERSION': VERSION,
|
|
'TEX_DIR': TEX_DIR,
|
|
'EXPORT_DIR': EXPORT_DIR
|
|
}
|
|
# store the key (optional 3rd arg tells if
|
|
# the data should also be written to a file):
|
|
Registry.SetKey('sample_exporter', d, True)
|
|
|
|
# (A good convention is to use the script name as Registry key)
|
|
|
|
# Now we check if our key is available in the Registry or file system:
|
|
regdict = Registry.GetKey('sample_exporter', True)
|
|
|
|
# If this key already exists, update config variables with its values:
|
|
if regdict:
|
|
try:
|
|
SEPARATE_MATERIALS = regdict['SEPARATE_MATERIALS']
|
|
VERSION = regdict['VERSION']
|
|
TEX_DIR = regdict['TEX_DIR']
|
|
EXPORT_DIR = regdict['EXPORT_DIR']
|
|
|
|
# if data was corrupted (or a new version of the script changed
|
|
# (expanded, removed, renamed) the config vars and users may have
|
|
# the old config file around):
|
|
except: update_registry() # rewrite it
|
|
|
|
else: # if the key doesn't exist yet, use our function to create it:
|
|
update_registry()
|
|
|
|
# ...
|
|
|
|
Hint: nicer code than the simplistic example above can be written by keeping
|
|
config var names in a list of strings and using the exec function.
|
|
|
|
B{Note}: if your script's GUI lets users change config vars, call the
|
|
registry_update() function in the button events callback to save the changes.
|
|
On the other hand, you don't need to handle configuration
|
|
in your own gui, it can be left for the 'Scripts Config Editor',
|
|
which should have access to your script's config key as soon as the
|
|
above code is executed once (as soon as SetKey is executed).
|
|
|
|
B{Note} (limits for config vars): strings longer than 300 characters are
|
|
clamped and the number of items in dictionaries, sequences and the config key
|
|
itself is limited to 60.
|
|
|
|
|
|
B{Scripts Configuration Editor}:
|
|
|
|
This script should be available from the System menu in the Scripts window.
|
|
It provides a GUI to view and edit saved configuration data, both from the
|
|
Registry dictionary in memory and the scripts config data dir. This is
|
|
useful for all scripts with config vars, but specially for those without GUI's,
|
|
like most importers and exporters, since this editor will provide one for them.
|
|
|
|
The example above already gives a good idea of how the information can be
|
|
prepared to be accessible from this editor, but there is more worth knowing:
|
|
|
|
1. String vars that end with '_dir' or '_file' (can be upper case, too) are
|
|
recognized as input boxes for dirs or files and a 'browse' button is added to
|
|
their right side, to call the file selector.
|
|
|
|
2. Both key names and configuration variables names starting with an
|
|
underscore ('_') are ignored by the editor. Programmers can use this feature
|
|
for any key or config var that is not meant to be configured by this editor.
|
|
|
|
3. The following information refers to extra config variables that may be
|
|
added specifically to aid the configuration editor script. To clarify, in the
|
|
example code above these variables (the string 'script' and the dictionaries
|
|
'tooltips' and 'limits') would appear along with SEPARATE_MATERIALS, VERSION,
|
|
TEX_DIR and EXPORT_DIR, wherever they are written.
|
|
|
|
Minor note: these names are case insensitive: tooltips, TOOLTIPS, etc. are all
|
|
recognized.
|
|
|
|
3.1 The config editor will try to display a 'help' button for a key, to show
|
|
documentation for the script that owns it. To find this "owner script", it
|
|
will first look for a config variable called 'script', a string containing
|
|
the name of the owner Python file (with or without '.py' extension)::
|
|
|
|
script = 'sample_exporter.py'
|
|
|
|
If there is no such variable, the editor will check if the file formed by the
|
|
key name and the '.py' extension exists. If both alternatives fail, no help
|
|
button will be displayed.
|
|
|
|
3.2 You can define tooltips for the buttons that the editor creates for your
|
|
config data (string input, toggle, number sliders). Simply create a dict
|
|
called 'tooltips', where config var names are keys and their tooltips,
|
|
values::
|
|
|
|
tooltips = {
|
|
'EXPORT_DIR': 'default folder where exported files should be saved',
|
|
'VERBOSE': 'print info and warning messages to the console',
|
|
'SEPARATE_MATERIALS': 'write materials to their own file'
|
|
}
|
|
|
|
3.3 Int and float button sliders need min and max limits. This can be passed
|
|
to the editor via a dict called 'limits' (ivar1, ivar2 and fvar are meant as
|
|
extra config vars that might have been in the example code above)::
|
|
|
|
limits = {'ivar1': [-10, 10], 'ivar2': [0, 100], 'fvar1': [-12.3, 15.4]}
|
|
|
|
4. The Config Editor itself maintains a Registry key called "General", with
|
|
general options relevant to many scripts, like "verbose" to tell if the user
|
|
wants messages printed to the console and "confirm overwrite", to know if
|
|
a script should ask for confirmation before overwriting files (all exporters
|
|
are recommended to access the General key and check this var -- L{sys.exists
|
|
<Sys.exists>} tells if files or folders already exist).
|
|
|
|
Hint: for actual examples, try the ac3d importer and exporter (it's enough to
|
|
call them from the menus then cancel with ESC), as those have been updated to
|
|
use this config system. After calling them their config data will be available
|
|
in the Config Editor. We also recommend adding a section about config vars
|
|
in your script's help info, as done in the ac3d ones.
|
|
|
|
L{Back to Main Page<API_intro>}
|
|
"""
|