py api: sphinx doc corrections, pep8 cleanup and style edits, also added __all__ to some modules which were missing it.

This commit is contained in:
2011-07-31 03:15:37 +00:00
parent 670f58023c
commit f4293067c1
23 changed files with 380 additions and 158 deletions

View File

@@ -39,7 +39,7 @@ def replace_line(f, i, text, keep_indent=True):
file_handle = open(f, 'r') file_handle = open(f, 'r')
data = file_handle.readlines() data = file_handle.readlines()
file_handle.close() file_handle.close()
l = data[i] l = data[i]
ws = l[:len(l) - len(l.lstrip())] ws = l[:len(l) - len(l.lstrip())]

View File

@@ -37,7 +37,7 @@ from project_info import (SIMPLE_PROJECTFILE,
source_list, source_list,
is_project_file, is_project_file,
is_c_header, is_c_header,
is_py, # is_py,
cmake_advanced_info, cmake_advanced_info,
cmake_compiler_defines, cmake_compiler_defines,
) )

View File

@@ -33,7 +33,7 @@ example linux usage
from project_info import (SIMPLE_PROJECTFILE, from project_info import (SIMPLE_PROJECTFILE,
SOURCE_DIR, SOURCE_DIR,
CMAKE_DIR, # CMAKE_DIR,
PROJECT_DIR, PROJECT_DIR,
source_list, source_list,
is_project_file, is_project_file,

View File

@@ -1,6 +1,6 @@
Physics Constraints (bge.constraints) Physics Constraints (bge.constraints)
================================== =====================================
.. function:: createConstraint(physicsid, physicsid2, constrainttype, [pivotX, pivotY, pivotZ, [axisX, axisY, axisZ, [flag]]]]) .. function:: createConstraint(physicsid, physicsid2, constrainttype, [pivotX, pivotY, pivotZ, [axisX, axisY, axisZ, [flag]]]])

View File

@@ -1,6 +1,6 @@
Game Keys (bge.events) Game Keys (bge.events)
============================= ======================
***** *****
Intro Intro

View File

@@ -1,6 +1,7 @@
Game Logic (bge.logic) Game Logic (bge.logic)
============================ ======================
***** *****
Intro Intro
***** *****

View File

@@ -1,6 +1,6 @@
Rasterizer (bge.render) Rasterizer (bge.render)
============================= =======================
***** *****
Intro Intro
@@ -16,8 +16,8 @@ Intro
import bge.render import bge.render
import bge.logic import bge.logic
# SCALE sets the speed of motion # scale sets the speed of motion
SCALE=[1, 0.5] scale = 1.0, 0.5
co = bge.logic.getCurrentController() co = bge.logic.getCurrentController()
obj = co.getOwner() obj = co.getOwner()
@@ -27,8 +27,8 @@ Intro
# Transform the mouse coordinates to see how far the mouse has moved. # Transform the mouse coordinates to see how far the mouse has moved.
def mousePos(): def mousePos():
x = (bge.render.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0] x = (bge.render.getWindowWidth() / 2 - mouse.getXPosition()) * scale[0]
y = (bge.render.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1] y = (bge.render.getWindowHeight() / 2 - mouse.getYPosition()) * scale[1]
return (x, y) return (x, y)
pos = mousePos() pos = mousePos()
@@ -43,7 +43,7 @@ Intro
bge.logic.addActiveActuator(wmotion, True) bge.logic.addActiveActuator(wmotion, True)
# Centre the mouse # Centre the mouse
bge.render.setMousePosition(bge.render.getWindowWidth()/2, bge.render.getWindowHeight()/2) bge.render.setMousePosition(bge.render.getWindowWidth() / 2, bge.render.getWindowHeight() / 2)
********* *********
Constants Constants

View File

@@ -1,6 +1,6 @@
Video Texture (bge.texture) Video Texture (bge.texture)
============================== ===========================
***** *****
Intro Intro

View File

@@ -1,6 +1,6 @@
Game Types (bge.types) Game Types (bge.types)
============================= ======================
.. module:: bge.types .. module:: bge.types

View File

@@ -1,6 +1,6 @@
OpenGL Wrapper (bgl) OpenGL Wrapper (bgl)
=========================== ====================
.. module:: bgl .. module:: bgl
@@ -71,8 +71,8 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html>`_ .. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html>`_
:type mode: Enumerated constant :type mode: Enumerated constant
:arg mode: Specifies the primitive that will be create from vertices between glBegin and :arg mode: Specifies the primitive that will be create from vertices between
glEnd. glBegin and glEnd.
.. function:: glBindTexture(target, texture): .. function:: glBindTexture(target, texture):
@@ -1886,4 +1886,3 @@ class Buffer:
the Buffer. If a template is not passed in all fields will be initialized to 0. the Buffer. If a template is not passed in all fields will be initialized to 0.
:rtype: Buffer object :rtype: Buffer object
:return: The newly created buffer as a PyObject. :return: The newly created buffer as a PyObject.

View File

@@ -416,6 +416,7 @@ def pymodule2sphinx(BASEPATH, module_name, module, title):
del key, descr del key, descr
classes = [] classes = []
submodules = []
for attribute in module_dir: for attribute in module_dir:
if not attribute.startswith("_"): if not attribute.startswith("_"):
@@ -437,6 +438,8 @@ def pymodule2sphinx(BASEPATH, module_name, module, title):
py_c_func2sphinx("", fw, module_name, None, attribute, value, is_class=False) py_c_func2sphinx("", fw, module_name, None, attribute, value, is_class=False)
elif value_type == type: elif value_type == type:
classes.append((attribute, value)) classes.append((attribute, value))
elif issubclass(value_type, types.ModuleType):
submodules.append((attribute, value))
elif value_type in (bool, int, float, str, tuple): elif value_type in (bool, int, float, str, tuple):
# constant, not much fun we can do here except to list it. # constant, not much fun we can do here except to list it.
# TODO, figure out some way to document these! # TODO, figure out some way to document these!
@@ -444,12 +447,26 @@ def pymodule2sphinx(BASEPATH, module_name, module, title):
write_indented_lines(" ", fw, "constant value %s" % repr(value), False) write_indented_lines(" ", fw, "constant value %s" % repr(value), False)
fw("\n") fw("\n")
else: else:
print("\tnot documenting %s.%s" % (module_name, attribute)) print("\tnot documenting %s.%s of %r type" % (module_name, attribute, value_type.__name__))
continue continue
attribute_set.add(attribute) attribute_set.add(attribute)
# TODO, more types... # TODO, more types...
# TODO, bpy_extras does this already, mathutils not.
"""
if submodules:
fw("\n"
"**********\n"
"Submodules\n"
"**********\n"
"\n"
)
for attribute, submod in submodules:
fw("* :mod:`%s.%s`\n" % (module_name, attribute))
fw("\n")
"""
# write collected classes now # write collected classes now
for (type_name, value) in classes: for (type_name, value) in classes:
# May need to be its own function # May need to be its own function

View File

@@ -16,7 +16,7 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
__all__ = ( __all__ = (
"paths", "paths",
@@ -26,7 +26,7 @@ __all__ = (
"disable", "disable",
"reset_all", "reset_all",
"module_bl_info", "module_bl_info",
) )
import bpy as _bpy import bpy as _bpy
@@ -129,7 +129,12 @@ def modules(module_cache):
error_duplicates = True error_duplicates = True
elif mod.__time__ != os.path.getmtime(mod_path): elif mod.__time__ != os.path.getmtime(mod_path):
print("reloading addon:", mod_name, mod.__time__, os.path.getmtime(mod_path), mod_path) print("reloading addon:",
mod_name,
mod.__time__,
os.path.getmtime(mod_path),
mod_path,
)
del module_cache[mod_name] del module_cache[mod_name]
mod = None mod = None
@@ -144,7 +149,9 @@ def modules(module_cache):
del modules_stale del modules_stale
mod_list = list(module_cache.values()) mod_list = list(module_cache.values())
mod_list.sort(key=lambda mod: (mod.bl_info['category'], mod.bl_info['name'])) mod_list.sort(key=lambda mod: (mod.bl_info['category'],
mod.bl_info['name'],
))
return mod_list return mod_list
@@ -164,8 +171,9 @@ def check(module_name):
loaded_state = mod and getattr(mod, "__addon_enabled__", Ellipsis) loaded_state = mod and getattr(mod, "__addon_enabled__", Ellipsis)
if loaded_state is Ellipsis: if loaded_state is Ellipsis:
print("Warning: addon-module %r found module but without" print("Warning: addon-module %r found module "
" __addon_enabled__ field, possible name collision from file: %r" % "but without __addon_enabled__ field, "
"possible name collision from file: %r" %
(module_name, getattr(mod, "__file__", "<unknown>"))) (module_name, getattr(mod, "__file__", "<unknown>")))
loaded_state = False loaded_state = False
@@ -208,7 +216,8 @@ def enable(module_name, default_set=True):
return None return None
mod.__addon_enabled__ = False mod.__addon_enabled__ = False
# Split registering up into 3 steps so we can undo if it fails par way through # Split registering up into 3 steps so we can undo
# if it fails par way through.
# 1) try import # 1) try import
try: try:
mod = __import__(module_name) mod = __import__(module_name)
@@ -255,8 +264,9 @@ def disable(module_name, default_set=True):
import sys import sys
mod = sys.modules.get(module_name) mod = sys.modules.get(module_name)
# possible this addon is from a previous session and didnt load a module this time. # possible this addon is from a previous session and didnt load a
# so even if the module is not found, still disable the addon in the user prefs. # module this time. So even if the module is not found, still disable
# the addon in the user prefs.
if mod: if mod:
mod.__addon_enabled__ = False mod.__addon_enabled__ = False
@@ -311,7 +321,22 @@ def reset_all(reload_scripts=False):
disable(mod_name) disable(mod_name)
def module_bl_info(mod, info_basis={"name": "", "author": "", "version": (), "blender": (), "api": 0, "location": "", "description": "", "wiki_url": "", "tracker_url": "", "support": 'COMMUNITY', "category": "", "warning": "", "show_expanded": False}): def module_bl_info(mod, info_basis={"name": "",
"author": "",
"version": (),
"blender": (),
"api": 0,
"location": "",
"description": "",
"wiki_url": "",
"tracker_url": "",
"support": 'COMMUNITY',
"category": "",
"warning": "",
"show_expanded": False,
}
):
addon_info = getattr(mod, "bl_info", {}) addon_info = getattr(mod, "bl_info", {})
# avoid re-initializing # avoid re-initializing

View File

@@ -16,7 +16,7 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
""" """
Give access to blender data and utility functions. Give access to blender data and utility functions.
@@ -31,7 +31,7 @@ __all__ = (
"props", "props",
"types", "types",
"utils", "utils",
) )
# internal blender C module # internal blender C module
@@ -49,7 +49,8 @@ def _main():
# Possibly temp. addons path # Possibly temp. addons path
from os.path import join, dirname, normpath from os.path import join, dirname, normpath
_sys.path.append(normpath(join(dirname(__file__), "..", "..", "addons", "modules"))) _sys.path.append(normpath(join(dirname(__file__),
"..", "..", "addons", "modules")))
# if "-d" in sys.argv: # Enable this to measure startup speed # if "-d" in sys.argv: # Enable this to measure startup speed
if 0: if 0:

View File

@@ -16,26 +16,44 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
""" """
This module has a similar scope to os.path, containing utility This module has a similar scope to os.path, containing utility
functions for dealing with paths in Blender. functions for dealing with paths in Blender.
""" """
__all__ = (
"abspath",
"basename",
"clean_name",
"display_name",
"display_name_from_filepath",
"ensure_ext",
"is_subdir",
"module_names",
"relpath",
"resolve_ncase",
)
import bpy as _bpy import bpy as _bpy
import os as _os import os as _os
def abspath(path, start=None): def abspath(path, start=None):
""" """
Returns the absolute path relative to the current blend file using the "//" prefix. Returns the absolute path relative to the current blend file
using the "//" prefix.
:arg start: Relative to this path, when not set the current filename is used. :arg start: Relative to this path,
when not set the current filename is used.
:type start: string :type start: string
""" """
if path.startswith("//"): if path.startswith("//"):
return _os.path.join(_os.path.dirname(_bpy.data.filepath) if start is None else start, path[2:]) return _os.path.join(_os.path.dirname(_bpy.data.filepath)
if start is None else start,
path[2:],
)
return path return path
@@ -44,7 +62,8 @@ def relpath(path, start=None):
""" """
Returns the path relative to the current blend file using the "//" prefix. Returns the path relative to the current blend file using the "//" prefix.
:arg start: Relative to this path, when not set the current filename is used. :arg start: Relative to this path,
when not set the current filename is used.
:type start: string :type start: string
""" """
if not path.startswith("//"): if not path.startswith("//"):
@@ -68,27 +87,28 @@ def is_subdir(path, directory):
def clean_name(name, replace="_"): def clean_name(name, replace="_"):
""" """
Returns a name with characters replaced that may cause problems under various circumstances, such as writing to a file. Returns a name with characters replaced that
may cause problems under various circumstances,
such as writing to a file.
All characters besides A-Z/a-z, 0-9 are replaced with "_" All characters besides A-Z/a-z, 0-9 are replaced with "_"
or the replace argument if defined. or the replace argument if defined.
""" """
unclean_chars = \ bad_chars = ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\ "\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d"
\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\ "\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c"
\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\ "\x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b"
\x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b\ "\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a"
\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\ "\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99"
\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\ "\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\ "\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\ "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6"
\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\ "\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5"
\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\ "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4"
\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\ "\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3"
\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\ "\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe")
\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
for ch in unclean_chars: for ch in bad_chars:
name = name.replace(ch, replace) name = name.replace(ch, replace)
return name return name
@@ -96,8 +116,9 @@ def clean_name(name, replace="_"):
def display_name(name): def display_name(name):
""" """
Creates a display string from name to be used menus and the user interface. Creates a display string from name to be used menus and the user interface.
Capitalize the first letter in all lowercase names, mixed case names are kept as is. Capitalize the first letter in all lowercase names,
Intended for use with filenames and module names. mixed case names are kept as is. Intended for use with
filenames and module names.
""" """
name_base = _os.path.splitext(name)[0] name_base = _os.path.splitext(name)[0]
@@ -115,9 +136,11 @@ def display_name(name):
def display_name_from_filepath(name): def display_name_from_filepath(name):
""" """
Returns the path stripped of directort and extension, ensured to be utf8 compatible. Returns the path stripped of directort and extension,
ensured to be utf8 compatible.
""" """
return _os.path.splitext(basename(name))[0].encode("utf8", "replace").decode("utf8") name = _os.path.splitext(basename(name))[0]
return name.encode("utf8", "replace").decode("utf8")
def resolve_ncase(path): def resolve_ncase(path):
@@ -132,7 +155,8 @@ def resolve_ncase(path):
if not path or os.path.exists(path): if not path or os.path.exists(path):
return path, True return path, True
filename = os.path.basename(path) # filename may be a directory or a file # filename may be a directory or a file
filename = os.path.basename(path)
dirpath = os.path.dirname(path) dirpath = os.path.dirname(path)
suffix = path[:0] # "" but ensure byte/str match suffix = path[:0] # "" but ensure byte/str match
@@ -190,7 +214,9 @@ def ensure_ext(filepath, ext, case_sensitive=False):
import os import os
fn_base, fn_ext = os.path.splitext(filepath) fn_base, fn_ext = os.path.splitext(filepath)
if fn_base and fn_ext: if fn_base and fn_ext:
if (case_sensitive and ext == fn_ext) or (ext.lower() == fn_ext.lower()): if ((case_sensitive and ext == fn_ext) or
(ext.lower() == fn_ext.lower())):
return filepath return filepath
else: else:
return fn_base + ext return fn_base + ext
@@ -228,7 +254,9 @@ def module_names(path, recursive=False):
modules.append((filename, fullpath)) modules.append((filename, fullpath))
if recursive: if recursive:
for mod_name, mod_path in module_names(directory, True): for mod_name, mod_path in module_names(directory, True):
modules.append(("%s.%s" % (filename, mod_name), mod_path)) modules.append(("%s.%s" % (filename, mod_name),
mod_path,
))
return modules return modules

View File

@@ -16,13 +16,33 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
""" """
This module contains utility functions specific to blender but This module contains utility functions specific to blender but
not assosiated with blenders internal data. not assosiated with blenders internal data.
""" """
__all__ = (
"blend_paths",
"keyconfig_set",
"load_scripts",
"modules_from_path",
"preset_find",
"preset_paths",
"refresh_script_paths",
"register_class",
"register_module",
"resource_path",
"script_paths",
"smpte_from_frame",
"smpte_from_seconds",
"unregister_class",
"unregister_module",
"user_resource",
"user_script_path",
)
from _bpy import register_class, unregister_class, blend_paths, resource_path from _bpy import register_class, unregister_class, blend_paths, resource_path
from _bpy import script_paths as _bpy_script_paths from _bpy import script_paths as _bpy_script_paths
from _bpy import user_resource as _user_resource from _bpy import user_resource as _user_resource
@@ -42,7 +62,8 @@ def _test_import(module_name, loaded_modules):
if module_name in loaded_modules: if module_name in loaded_modules:
return None return None
if "." in module_name: if "." in module_name:
print("Ignoring '%s', can't import files containing multiple periods." % module_name) print("Ignoring '%s', can't import files containing "
"multiple periods." % module_name)
return None return None
if use_time: if use_time:
@@ -74,7 +95,8 @@ def modules_from_path(path, loaded_modules):
:arg path: this path is scanned for scripts and packages. :arg path: this path is scanned for scripts and packages.
:type path: string :type path: string
:arg loaded_modules: already loaded module names, files matching these names will be ignored. :arg loaded_modules: already loaded module names, files matching these
names will be ignored.
:type loaded_modules: set :type loaded_modules: set
:return: all loaded modules. :return: all loaded modules.
:rtype: list :rtype: list
@@ -97,13 +119,17 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
""" """
Load scripts and run each modules register function. Load scripts and run each modules register function.
:arg reload_scripts: Causes all scripts to have their unregister method called before loading. :arg reload_scripts: Causes all scripts to have their unregister method
called before loading.
:type reload_scripts: bool :type reload_scripts: bool
:arg refresh_scripts: only load scripts which are not already loaded as modules. :arg refresh_scripts: only load scripts which are not already loaded
as modules.
:type refresh_scripts: bool :type refresh_scripts: bool
""" """
use_time = _bpy.app.debug use_time = _bpy.app.debug
prefs = _bpy.context.user_preferences
if use_time: if use_time:
import time import time
t_main = time.time() t_main = time.time()
@@ -116,10 +142,11 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
if reload_scripts: if reload_scripts:
_bpy_types.TypeMap.clear() _bpy_types.TypeMap.clear()
# just unload, dont change user defaults, this means we can sync to reload. # just unload, dont change user defaults, this means we can sync
# note that they will only actually reload of the modification time changes. # to reload. note that they will only actually reload of the
# this `wont` work for packages so... its not perfect. # modification time changes. This `wont` work for packages so...
for module_name in [ext.module for ext in _bpy.context.user_preferences.addons]: # its not perfect.
for module_name in [ext.module for ext in prefs.addons]:
_addon_utils.disable(module_name, default_set=False) _addon_utils.disable(module_name, default_set=False)
def register_module_call(mod): def register_module_call(mod):
@@ -131,7 +158,9 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
import traceback import traceback
traceback.print_exc() traceback.print_exc()
else: else:
print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__) print("\nWarning! '%s' has no register function, "
"this is now a requirement for registerable scripts." %
mod.__file__)
def unregister_module_call(mod): def unregister_module_call(mod):
unregister = getattr(mod, "unregister", None) unregister = getattr(mod, "unregister", None)
@@ -172,7 +201,8 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
if reload_scripts: if reload_scripts:
# module names -> modules # module names -> modules
_global_loaded_modules[:] = [_sys.modules[mod_name] for mod_name in _global_loaded_modules] _global_loaded_modules[:] = [_sys.modules[mod_name]
for mod_name in _global_loaded_modules]
# loop over and unload all scripts # loop over and unload all scripts
_global_loaded_modules.reverse() _global_loaded_modules.reverse()
@@ -201,7 +231,8 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
_addon_utils.reset_all(reload_scripts) _addon_utils.reset_all(reload_scripts)
# run the active integration preset # run the active integration preset
filepath = preset_find(_bpy.context.user_preferences.inputs.active_keyconfig, "keyconfig") filepath = preset_find(prefs.inputs.active_keyconfig, "keyconfig")
if filepath: if filepath:
keyconfig_set(filepath) keyconfig_set(filepath)
@@ -214,12 +245,16 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
# base scripts # base scripts
_scripts = _os.path.join(_os.path.dirname(__file__), _os.path.pardir, _os.path.pardir) _scripts = _os.path.join(_os.path.dirname(__file__),
_os.path.pardir,
_os.path.pardir,
)
_scripts = (_os.path.normpath(_scripts), ) _scripts = (_os.path.normpath(_scripts), )
def user_script_path(): def user_script_path():
path = _bpy.context.user_preferences.filepaths.script_directory prefs = _bpy.context.user_preferences
path = prefs.filepaths.script_directory
if path: if path:
path = _os.path.normpath(path) path = _os.path.normpath(path)
@@ -236,22 +271,25 @@ def script_paths(subdir=None, user_pref=True, all=False):
:type subdir: string :type subdir: string
:arg user_pref: Include the user preference script path. :arg user_pref: Include the user preference script path.
:type user_pref: bool :type user_pref: bool
:arg all: Include local, user and system paths rather just the paths blender uses. :arg all: Include local, user and system paths rather just the paths
blender uses.
:type all: bool :type all: bool
:return: script paths. :return: script paths.
:rtype: list :rtype: list
""" """
scripts = list(_scripts) scripts = list(_scripts)
prefs = _bpy.context.user_preferences
# add user scripts dir # add user scripts dir
if user_pref: if user_pref:
user_script_path = _bpy.context.user_preferences.filepaths.script_directory user_script_path = prefs.filepaths.script_directory
else: else:
user_script_path = None user_script_path = None
if all: if all:
# all possible paths # all possible paths
base_paths = tuple(_os.path.join(resource_path(res), "scripts") for res in ('LOCAL', 'USER', 'SYSTEM')) base_paths = tuple(_os.path.join(resource_path(res), "scripts")
for res in ('LOCAL', 'USER', 'SYSTEM'))
else: else:
# only paths blender uses # only paths blender uses
base_paths = _bpy_script_paths() base_paths = _bpy_script_paths()
@@ -426,7 +464,8 @@ def user_resource(type, path="", create=False):
:type type: string :type type: string
:arg subdir: Optional subdirectory. :arg subdir: Optional subdirectory.
:type subdir: string :type subdir: string
:arg create: Treat the path as a directory and create it if its not existing. :arg create: Treat the path as a directory and create
it if its not existing.
:type create: boolean :type create: boolean
:return: a path. :return: a path.
:rtype: string :rtype: string
@@ -477,7 +516,8 @@ def register_module(module, verbose=False):
try: try:
register_class(cls) register_class(cls)
except: except:
print("bpy.utils.register_module(): failed to registering class %r" % cls) print("bpy.utils.register_module(): "
"failed to registering class %r" % cls)
import traceback import traceback
traceback.print_exc() traceback.print_exc()
if verbose: if verbose:
@@ -495,7 +535,8 @@ def unregister_module(module, verbose=False):
try: try:
unregister_class(cls) unregister_class(cls)
except: except:
print("bpy.utils.unregister_module(): failed to unregistering class %r" % cls) print("bpy.utils.unregister_module(): "
"failed to unregistering class %r" % cls)
import traceback import traceback
traceback.print_exc() traceback.print_exc()
if verbose: if verbose:

View File

@@ -16,7 +16,7 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
""" """
Utility modules assosiated with the bpy module. Utility modules assosiated with the bpy module.
@@ -28,4 +28,4 @@ __all__ = (
"image_utils", "image_utils",
"mesh_utils", "mesh_utils",
"view3d_utils", "view3d_utils",
) )

View File

@@ -16,11 +16,11 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
__all__ = ( __all__ = (
"load_image", "load_image",
) )
# limited replacement for BPyImage.comprehensiveImageLoad # limited replacement for BPyImage.comprehensiveImageLoad
@@ -33,8 +33,8 @@ def load_image(imagepath,
verbose=False, verbose=False,
): ):
""" """
Return an image from the file path with options to search multiple paths and Return an image from the file path with options to search multiple paths
return a placeholder if its not found. and return a placeholder if its not found.
:arg filepath: The image filename :arg filepath: The image filename
If a path precedes it, this will be searched as well. If a path precedes it, this will be searched as well.
@@ -51,9 +51,10 @@ def load_image(imagepath,
:type recursive: bool :type recursive: bool
:arg ncase_cmp: on non windows systems, find the correct case for the file. :arg ncase_cmp: on non windows systems, find the correct case for the file.
:type ncase_cmp: bool :type ncase_cmp: bool
:arg convert_callback: a function that takes an existing path and returns a new one. :arg convert_callback: a function that takes an existing path and returns
Use this when loading image formats blender may not support, the CONVERT_CALLBACK a new one. Use this when loading image formats blender may not support,
can take the path for a GIF (for example), convert it to a PNG and return the PNG's path. the CONVERT_CALLBACK can take the path for a GIF (for example),
convert it to a PNG and return the PNG's path.
For formats blender can read, simply return the path that is given. For formats blender can read, simply return the path that is given.
:type convert_callback: function :type convert_callback: function
:return: an image or None :return: an image or None
@@ -92,7 +93,9 @@ def load_image(imagepath,
for filepath_test in variants: for filepath_test in variants:
if ncase_cmp: if ncase_cmp:
ncase_variants = filepath_test, bpy.path.resolve_ncase(filepath_test) ncase_variants = (filepath_test,
bpy.path.resolve_ncase(filepath_test),
)
else: else:
ncase_variants = (filepath_test, ) ncase_variants = (filepath_test, )

View File

@@ -16,7 +16,7 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
__all__ = ( __all__ = (
"ExportHelper", "ExportHelper",
@@ -31,15 +31,25 @@ __all__ = (
"path_reference_copy", "path_reference_copy",
"path_reference_mode", "path_reference_mode",
"unique_name" "unique_name"
) )
import bpy import bpy
from bpy.props import StringProperty, BoolProperty, EnumProperty from bpy.props import StringProperty, BoolProperty, EnumProperty
class ExportHelper: class ExportHelper:
filepath = StringProperty(name="File Path", description="Filepath used for exporting the file", maxlen=1024, default="", subtype='FILE_PATH') filepath = StringProperty(
check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) name="File Path",
description="Filepath used for exporting the file",
maxlen=1024,
subtype='FILE_PATH',
)
check_existing = BoolProperty(
name="Check Existing",
description="Check and warn on overwriting existing files",
default=True,
options={'HIDDEN'},
)
# subclasses can override with decorator # subclasses can override with decorator
# True == use ext, False == no ext, None == do nothing. # True == use ext, False == no ext, None == do nothing.
@@ -65,7 +75,10 @@ class ExportHelper:
if check_extension is None: if check_extension is None:
return False return False
filepath = bpy.path.ensure_ext(self.filepath, self.filename_ext if check_extension else "") filepath = bpy.path.ensure_ext(self.filepath,
self.filename_ext
if check_extension
else "")
if filepath != self.filepath: if filepath != self.filepath:
self.filepath = filepath self.filepath = filepath
@@ -75,7 +88,12 @@ class ExportHelper:
class ImportHelper: class ImportHelper:
filepath = StringProperty(name="File Path", description="Filepath used for importing the file", maxlen=1024, default="", subtype='FILE_PATH') filepath = StringProperty(
name="File Path",
description="Filepath used for importing the file",
maxlen=1024,
subtype='FILE_PATH',
)
def invoke(self, context, event): def invoke(self, context, event):
context.window_manager.fileselect_add(self) context.window_manager.fileselect_add(self)
@@ -116,29 +134,75 @@ _axis_convert_matrix = (
# where all 4 values are or'd into a single value... # where all 4 values are or'd into a single value...
# (i1<<0 | i1<<3 | i1<<6 | i1<<9) # (i1<<0 | i1<<3 | i1<<6 | i1<<9)
_axis_convert_lut = ( _axis_convert_lut = (
{0x8C8, 0x4D0, 0x2E0, 0xAE8, 0x701, 0x511, 0x119, 0xB29, 0x682, 0x88A, 0x09A, 0x2A2, 0x80B, 0x413, 0x223, 0xA2B, 0x644, 0x454, 0x05C, 0xA6C, 0x745, 0x94D, 0x15D, 0x365}, {0x8C8, 0x4D0, 0x2E0, 0xAE8, 0x701, 0x511, 0x119, 0xB29, 0x682, 0x88A,
{0xAC8, 0x8D0, 0x4E0, 0x2E8, 0x741, 0x951, 0x159, 0x369, 0x702, 0xB0A, 0x11A, 0x522, 0xA0B, 0x813, 0x423, 0x22B, 0x684, 0x894, 0x09C, 0x2AC, 0x645, 0xA4D, 0x05D, 0x465}, 0x09A, 0x2A2, 0x80B, 0x413, 0x223, 0xA2B, 0x644, 0x454, 0x05C, 0xA6C,
{0x4C8, 0x2D0, 0xAE0, 0x8E8, 0x681, 0x291, 0x099, 0x8A9, 0x642, 0x44A, 0x05A, 0xA62, 0x40B, 0x213, 0xA23, 0x82B, 0x744, 0x354, 0x15C, 0x96C, 0x705, 0x50D, 0x11D, 0xB25}, 0x745, 0x94D, 0x15D, 0x365},
{0x2C8, 0xAD0, 0x8E0, 0x4E8, 0x641, 0xA51, 0x059, 0x469, 0x742, 0x34A, 0x15A, 0x962, 0x20B, 0xA13, 0x823, 0x42B, 0x704, 0xB14, 0x11C, 0x52C, 0x685, 0x28D, 0x09D, 0x8A5}, {0xAC8, 0x8D0, 0x4E0, 0x2E8, 0x741, 0x951, 0x159, 0x369, 0x702, 0xB0A,
{0x708, 0xB10, 0x120, 0x528, 0x8C1, 0xAD1, 0x2D9, 0x4E9, 0x942, 0x74A, 0x35A, 0x162, 0x64B, 0xA53, 0x063, 0x46B, 0x804, 0xA14, 0x21C, 0x42C, 0x885, 0x68D, 0x29D, 0x0A5}, 0x11A, 0x522, 0xA0B, 0x813, 0x423, 0x22B, 0x684, 0x894, 0x09C, 0x2AC,
{0xB08, 0x110, 0x520, 0x728, 0x941, 0x151, 0x359, 0x769, 0x802, 0xA0A, 0x21A, 0x422, 0xA4B, 0x053, 0x463, 0x66B, 0x884, 0x094, 0x29C, 0x6AC, 0x8C5, 0xACD, 0x2DD, 0x4E5}, 0x645, 0xA4D, 0x05D, 0x465},
{0x508, 0x710, 0xB20, 0x128, 0x881, 0x691, 0x299, 0x0A9, 0x8C2, 0x4CA, 0x2DA, 0xAE2, 0x44B, 0x653, 0xA63, 0x06B, 0x944, 0x754, 0x35C, 0x16C, 0x805, 0x40D, 0x21D, 0xA25}, {0x4C8, 0x2D0, 0xAE0, 0x8E8, 0x681, 0x291, 0x099, 0x8A9, 0x642, 0x44A,
{0x108, 0x510, 0x720, 0xB28, 0x801, 0x411, 0x219, 0xA29, 0x882, 0x08A, 0x29A, 0x6A2, 0x04B, 0x453, 0x663, 0xA6B, 0x8C4, 0x4D4, 0x2DC, 0xAEC, 0x945, 0x14D, 0x35D, 0x765}, 0x05A, 0xA62, 0x40B, 0x213, 0xA23, 0x82B, 0x744, 0x354, 0x15C, 0x96C,
{0x748, 0x350, 0x160, 0x968, 0xAC1, 0x2D1, 0x4D9, 0x8E9, 0xA42, 0x64A, 0x45A, 0x062, 0x68B, 0x293, 0x0A3, 0x8AB, 0xA04, 0x214, 0x41C, 0x82C, 0xB05, 0x70D, 0x51D, 0x125}, 0x705, 0x50D, 0x11D, 0xB25},
{0x948, 0x750, 0x360, 0x168, 0xB01, 0x711, 0x519, 0x129, 0xAC2, 0x8CA, 0x4DA, 0x2E2, 0x88B, 0x693, 0x2A3, 0x0AB, 0xA44, 0x654, 0x45C, 0x06C, 0xA05, 0x80D, 0x41D, 0x225}, {0x2C8, 0xAD0, 0x8E0, 0x4E8, 0x641, 0xA51, 0x059, 0x469, 0x742, 0x34A,
{0x348, 0x150, 0x960, 0x768, 0xA41, 0x051, 0x459, 0x669, 0xA02, 0x20A, 0x41A, 0x822, 0x28B, 0x093, 0x8A3, 0x6AB, 0xB04, 0x114, 0x51C, 0x72C, 0xAC5, 0x2CD, 0x4DD, 0x8E5}, 0x15A, 0x962, 0x20B, 0xA13, 0x823, 0x42B, 0x704, 0xB14, 0x11C, 0x52C,
{0x148, 0x950, 0x760, 0x368, 0xA01, 0x811, 0x419, 0x229, 0xB02, 0x10A, 0x51A, 0x722, 0x08B, 0x893, 0x6A3, 0x2AB, 0xAC4, 0x8D4, 0x4DC, 0x2EC, 0xA45, 0x04D, 0x45D, 0x665}, 0x685, 0x28D, 0x09D, 0x8A5},
{0x688, 0x890, 0x0A0, 0x2A8, 0x4C1, 0x8D1, 0xAD9, 0x2E9, 0x502, 0x70A, 0xB1A, 0x122, 0x74B, 0x953, 0x163, 0x36B, 0x404, 0x814, 0xA1C, 0x22C, 0x445, 0x64D, 0xA5D, 0x065}, {0x708, 0xB10, 0x120, 0x528, 0x8C1, 0xAD1, 0x2D9, 0x4E9, 0x942, 0x74A,
{0x888, 0x090, 0x2A0, 0x6A8, 0x501, 0x111, 0xB19, 0x729, 0x402, 0x80A, 0xA1A, 0x222, 0x94B, 0x153, 0x363, 0x76B, 0x444, 0x054, 0xA5C, 0x66C, 0x4C5, 0x8CD, 0xADD, 0x2E5}, 0x35A, 0x162, 0x64B, 0xA53, 0x063, 0x46B, 0x804, 0xA14, 0x21C, 0x42C,
{0x288, 0x690, 0x8A0, 0x0A8, 0x441, 0x651, 0xA59, 0x069, 0x4C2, 0x2CA, 0xADA, 0x8E2, 0x34B, 0x753, 0x963, 0x16B, 0x504, 0x714, 0xB1C, 0x12C, 0x405, 0x20D, 0xA1D, 0x825}, 0x885, 0x68D, 0x29D, 0x0A5},
{0x088, 0x290, 0x6A0, 0x8A8, 0x401, 0x211, 0xA19, 0x829, 0x442, 0x04A, 0xA5A, 0x662, 0x14B, 0x353, 0x763, 0x96B, 0x4C4, 0x2D4, 0xADC, 0x8EC, 0x505, 0x10D, 0xB1D, 0x725}, {0xB08, 0x110, 0x520, 0x728, 0x941, 0x151, 0x359, 0x769, 0x802, 0xA0A,
{0x648, 0x450, 0x060, 0xA68, 0x2C1, 0x4D1, 0x8D9, 0xAE9, 0x282, 0x68A, 0x89A, 0x0A2, 0x70B, 0x513, 0x123, 0xB2B, 0x204, 0x414, 0x81C, 0xA2C, 0x345, 0x74D, 0x95D, 0x165}, 0x21A, 0x422, 0xA4B, 0x053, 0x463, 0x66B, 0x884, 0x094, 0x29C, 0x6AC,
{0xA48, 0x650, 0x460, 0x068, 0x341, 0x751, 0x959, 0x169, 0x2C2, 0xACA, 0x8DA, 0x4E2, 0xB0B, 0x713, 0x523, 0x12B, 0x284, 0x694, 0x89C, 0x0AC, 0x205, 0xA0D, 0x81D, 0x425}, 0x8C5, 0xACD, 0x2DD, 0x4E5},
{0x448, 0x050, 0xA60, 0x668, 0x281, 0x091, 0x899, 0x6A9, 0x202, 0x40A, 0x81A, 0xA22, 0x50B, 0x113, 0xB23, 0x72B, 0x344, 0x154, 0x95C, 0x76C, 0x2C5, 0x4CD, 0x8DD, 0xAE5}, {0x508, 0x710, 0xB20, 0x128, 0x881, 0x691, 0x299, 0x0A9, 0x8C2, 0x4CA,
{0x048, 0xA50, 0x660, 0x468, 0x201, 0xA11, 0x819, 0x429, 0x342, 0x14A, 0x95A, 0x762, 0x10B, 0xB13, 0x723, 0x52B, 0x2C4, 0xAD4, 0x8DC, 0x4EC, 0x285, 0x08D, 0x89D, 0x6A5}, 0x2DA, 0xAE2, 0x44B, 0x653, 0xA63, 0x06B, 0x944, 0x754, 0x35C, 0x16C,
{0x808, 0xA10, 0x220, 0x428, 0x101, 0xB11, 0x719, 0x529, 0x142, 0x94A, 0x75A, 0x362, 0x8CB, 0xAD3, 0x2E3, 0x4EB, 0x044, 0xA54, 0x65C, 0x46C, 0x085, 0x88D, 0x69D, 0x2A5}, 0x805, 0x40D, 0x21D, 0xA25},
{0xA08, 0x210, 0x420, 0x828, 0x141, 0x351, 0x759, 0x969, 0x042, 0xA4A, 0x65A, 0x462, 0xACB, 0x2D3, 0x4E3, 0x8EB, 0x084, 0x294, 0x69C, 0x8AC, 0x105, 0xB0D, 0x71D, 0x525}, {0x108, 0x510, 0x720, 0xB28, 0x801, 0x411, 0x219, 0xA29, 0x882, 0x08A,
{0x408, 0x810, 0xA20, 0x228, 0x081, 0x891, 0x699, 0x2A9, 0x102, 0x50A, 0x71A, 0xB22, 0x4CB, 0x8D3, 0xAE3, 0x2EB, 0x144, 0x954, 0x75C, 0x36C, 0x045, 0x44D, 0x65D, 0xA65}, 0x29A, 0x6A2, 0x04B, 0x453, 0x663, 0xA6B, 0x8C4, 0x4D4, 0x2DC, 0xAEC,
0x945, 0x14D, 0x35D, 0x765},
{0x748, 0x350, 0x160, 0x968, 0xAC1, 0x2D1, 0x4D9, 0x8E9, 0xA42, 0x64A,
0x45A, 0x062, 0x68B, 0x293, 0x0A3, 0x8AB, 0xA04, 0x214, 0x41C, 0x82C,
0xB05, 0x70D, 0x51D, 0x125},
{0x948, 0x750, 0x360, 0x168, 0xB01, 0x711, 0x519, 0x129, 0xAC2, 0x8CA,
0x4DA, 0x2E2, 0x88B, 0x693, 0x2A3, 0x0AB, 0xA44, 0x654, 0x45C, 0x06C,
0xA05, 0x80D, 0x41D, 0x225},
{0x348, 0x150, 0x960, 0x768, 0xA41, 0x051, 0x459, 0x669, 0xA02, 0x20A,
0x41A, 0x822, 0x28B, 0x093, 0x8A3, 0x6AB, 0xB04, 0x114, 0x51C, 0x72C,
0xAC5, 0x2CD, 0x4DD, 0x8E5},
{0x148, 0x950, 0x760, 0x368, 0xA01, 0x811, 0x419, 0x229, 0xB02, 0x10A,
0x51A, 0x722, 0x08B, 0x893, 0x6A3, 0x2AB, 0xAC4, 0x8D4, 0x4DC, 0x2EC,
0xA45, 0x04D, 0x45D, 0x665},
{0x688, 0x890, 0x0A0, 0x2A8, 0x4C1, 0x8D1, 0xAD9, 0x2E9, 0x502, 0x70A,
0xB1A, 0x122, 0x74B, 0x953, 0x163, 0x36B, 0x404, 0x814, 0xA1C, 0x22C,
0x445, 0x64D, 0xA5D, 0x065},
{0x888, 0x090, 0x2A0, 0x6A8, 0x501, 0x111, 0xB19, 0x729, 0x402, 0x80A,
0xA1A, 0x222, 0x94B, 0x153, 0x363, 0x76B, 0x444, 0x054, 0xA5C, 0x66C,
0x4C5, 0x8CD, 0xADD, 0x2E5},
{0x288, 0x690, 0x8A0, 0x0A8, 0x441, 0x651, 0xA59, 0x069, 0x4C2, 0x2CA,
0xADA, 0x8E2, 0x34B, 0x753, 0x963, 0x16B, 0x504, 0x714, 0xB1C, 0x12C,
0x405, 0x20D, 0xA1D, 0x825},
{0x088, 0x290, 0x6A0, 0x8A8, 0x401, 0x211, 0xA19, 0x829, 0x442, 0x04A,
0xA5A, 0x662, 0x14B, 0x353, 0x763, 0x96B, 0x4C4, 0x2D4, 0xADC, 0x8EC,
0x505, 0x10D, 0xB1D, 0x725},
{0x648, 0x450, 0x060, 0xA68, 0x2C1, 0x4D1, 0x8D9, 0xAE9, 0x282, 0x68A,
0x89A, 0x0A2, 0x70B, 0x513, 0x123, 0xB2B, 0x204, 0x414, 0x81C, 0xA2C,
0x345, 0x74D, 0x95D, 0x165},
{0xA48, 0x650, 0x460, 0x068, 0x341, 0x751, 0x959, 0x169, 0x2C2, 0xACA,
0x8DA, 0x4E2, 0xB0B, 0x713, 0x523, 0x12B, 0x284, 0x694, 0x89C, 0x0AC,
0x205, 0xA0D, 0x81D, 0x425},
{0x448, 0x050, 0xA60, 0x668, 0x281, 0x091, 0x899, 0x6A9, 0x202, 0x40A,
0x81A, 0xA22, 0x50B, 0x113, 0xB23, 0x72B, 0x344, 0x154, 0x95C, 0x76C,
0x2C5, 0x4CD, 0x8DD, 0xAE5},
{0x048, 0xA50, 0x660, 0x468, 0x201, 0xA11, 0x819, 0x429, 0x342, 0x14A,
0x95A, 0x762, 0x10B, 0xB13, 0x723, 0x52B, 0x2C4, 0xAD4, 0x8DC, 0x4EC,
0x285, 0x08D, 0x89D, 0x6A5},
{0x808, 0xA10, 0x220, 0x428, 0x101, 0xB11, 0x719, 0x529, 0x142, 0x94A,
0x75A, 0x362, 0x8CB, 0xAD3, 0x2E3, 0x4EB, 0x044, 0xA54, 0x65C, 0x46C,
0x085, 0x88D, 0x69D, 0x2A5},
{0xA08, 0x210, 0x420, 0x828, 0x141, 0x351, 0x759, 0x969, 0x042, 0xA4A,
0x65A, 0x462, 0xACB, 0x2D3, 0x4E3, 0x8EB, 0x084, 0x294, 0x69C, 0x8AC,
0x105, 0xB0D, 0x71D, 0x525},
{0x408, 0x810, 0xA20, 0x228, 0x081, 0x891, 0x699, 0x2A9, 0x102, 0x50A,
0x71A, 0xB22, 0x4CB, 0x8D3, 0xAE3, 0x2EB, 0x144, 0x954, 0x75C, 0x36C,
0x045, 0x44D, 0x65D, 0xA65},
) )
_axis_convert_num = {'X': 0, 'Y': 1, 'Z': 2, '-X': 3, '-Y': 4, '-Z': 5} _axis_convert_num = {'X': 0, 'Y': 1, 'Z': 2, '-X': 3, '-Y': 4, '-Z': 5}
@@ -206,7 +270,8 @@ def axis_conversion_ensure(operator, forward_attr, up_attr):
return False return False
# return a tuple (free, object list), free is True if memory should be freed later with free_derived_objects() # return a tuple (free, object list), free is True if memory should be freed
# later with free_derived_objects()
def create_derived_objects(scene, ob): def create_derived_objects(scene, ob):
if ob.parent and ob.parent.dupli_type in {'VERTS', 'FACES'}: if ob.parent and ob.parent.dupli_type in {'VERTS', 'FACES'}:
return False, None return False, None
@@ -254,31 +319,45 @@ path_reference_mode = EnumProperty(
description="Method used to reference paths", description="Method used to reference paths",
items=(('AUTO', "Auto", "Use Relative paths with subdirectories only"), items=(('AUTO', "Auto", "Use Relative paths with subdirectories only"),
('ABSOLUTE', "Absolute", "Always write absolute paths"), ('ABSOLUTE', "Absolute", "Always write absolute paths"),
('RELATIVE', "Relative", "Always write relative patsh (where possible)"), ('RELATIVE', "Relative", "Always write relative patsh "
('MATCH', "Match", "Match Absolute/Relative setting with input path"), "(where possible)"),
('MATCH', "Match", "Match Absolute/Relative "
"setting with input path"),
('STRIP', "Strip Path", "Filename only"), ('STRIP', "Strip Path", "Filename only"),
('COPY', "Copy", "copy the file to the destination path (or subdirectory)"), ('COPY', "Copy", "copy the file to the destination path "
"(or subdirectory)"),
), ),
default='AUTO' default='AUTO'
) )
def path_reference(filepath, base_src, base_dst, mode='AUTO', copy_subdir="", copy_set=None): def path_reference(filepath,
base_src,
base_dst,
mode='AUTO',
copy_subdir="",
copy_set=None,
):
""" """
Return a filepath relative to a destination directory, for use with Return a filepath relative to a destination directory, for use with
exporters. exporters.
:arg filepath: the file path to return, supporting blenders relative '//' prefix. :arg filepath: the file path to return,
supporting blenders relative '//' prefix.
:type filepath: string :type filepath: string
:arg base_src: the directory the *filepath* is relative too (normally the blend file). :arg base_src: the directory the *filepath* is relative too
(normally the blend file).
:type base_src: string :type base_src: string
:arg base_dst: the directory the *filepath* will be referenced from (normally the export path). :arg base_dst: the directory the *filepath* will be referenced from
(normally the export path).
:type base_dst: string :type base_dst: string
:arg mode: the method used get the path in ['AUTO', 'ABSOLUTE', 'RELATIVE', 'MATCH', 'STRIP', 'COPY'] :arg mode: the method used get the path in
['AUTO', 'ABSOLUTE', 'RELATIVE', 'MATCH', 'STRIP', 'COPY']
:type mode: string :type mode: string
:arg copy_subdir: the subdirectory of *base_dst* to use when mode='COPY'. :arg copy_subdir: the subdirectory of *base_dst* to use when mode='COPY'.
:type copy_subdir: string :type copy_subdir: string
:arg copy_set: collect from/to pairs when mode='COPY', pass to *path_reference_copy* when exportign is done. :arg copy_set: collect from/to pairs when mode='COPY',
pass to *path_reference_copy* when exportign is done.
:type copy_set: set :type copy_set: set
:return: the new filepath. :return: the new filepath.
:rtype: string :rtype: string
@@ -292,7 +371,9 @@ def path_reference(filepath, base_src, base_dst, mode='AUTO', copy_subdir="", co
elif mode == 'MATCH': elif mode == 'MATCH':
mode = 'RELATIVE' if is_relative else 'ABSOLUTE' mode = 'RELATIVE' if is_relative else 'ABSOLUTE'
elif mode == 'AUTO': elif mode == 'AUTO':
mode = 'RELATIVE' if bpy.path.is_subdir(filepath, base_dst) else 'ABSOLUTE' mode = ('RELATIVE'
if bpy.path.is_subdir(filepath, base_dst)
else 'ABSOLUTE')
elif mode == 'COPY': elif mode == 'COPY':
if copy_subdir: if copy_subdir:
subdir_abs = os.path.join(os.path.normpath(base_dst), copy_subdir) subdir_abs = os.path.join(os.path.normpath(base_dst), copy_subdir)
@@ -367,7 +448,8 @@ def unique_name(key, name, name_dict, name_max=-1, clean_func=None):
if name_new is None: if name_new is None:
count = 1 count = 1
name_dict_values = name_dict.values() name_dict_values = name_dict.values()
name_new = name_new_orig = name if clean_func is None else clean_func(name) name_new = name_new_orig = (name if clean_func is None
else clean_func(name))
if name_max == -1: if name_max == -1:
while name_new in name_dict_values: while name_new in name_dict_values:
@@ -377,7 +459,10 @@ def unique_name(key, name, name_dict, name_max=-1, clean_func=None):
name_new = name_new[:name_max] name_new = name_new[:name_max]
while name_new in name_dict_values: while name_new in name_dict_values:
count_str = "%03d" % count count_str = "%03d" % count
name_new = "%.*s.%s" % (name_max - (len(count_str) + 1), name_new_orig, count_str) name_new = "%.*s.%s" % (name_max - (len(count_str) + 1),
name_new_orig,
count_str,
)
count += 1 count += 1
name_dict[key] = name_new name_dict[key] = name_new

View File

@@ -26,7 +26,7 @@ __all__ = (
"edge_loops_from_edges", "edge_loops_from_edges",
"ngon_tesselate", "ngon_tesselate",
"face_random_points", "face_random_points",
) )
def mesh_linked_faces(mesh): def mesh_linked_faces(mesh):

View File

@@ -16,12 +16,12 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
__all__ = ( __all__ = (
"add_object_align_init", "add_object_align_init",
"object_data_add", "object_data_add",
) )
import bpy import bpy
@@ -39,42 +39,49 @@ def add_object_align_init(context, operator):
:return: the matrix from the context and settings. :return: the matrix from the context and settings.
:rtype: :class:`Matrix` :rtype: :class:`Matrix`
""" """
from mathutils import Matrix, Vector, Euler
properties = operator.properties
space_data = context.space_data space_data = context.space_data
if space_data.type != 'VIEW_3D': if space_data.type != 'VIEW_3D':
space_data = None space_data = None
# location # location
if operator and operator.properties.is_property_set("location"): if operator and properties.is_property_set("location"):
location = mathutils.Matrix.Translation(mathutils.Vector(operator.properties.location)) location = Matrix.Translation(Vector(properties.location))
else: else:
if space_data: # local view cursor is detected below if space_data: # local view cursor is detected below
location = mathutils.Matrix.Translation(space_data.cursor_location) location = Matrix.Translation(space_data.cursor_location)
else: else:
location = mathutils.Matrix.Translation(context.scene.cursor_location) location = Matrix.Translation(context.scene.cursor_location)
if operator: if operator:
operator.properties.location = location.to_translation() properties.location = location.to_translation()
# rotation # rotation
view_align = (context.user_preferences.edit.object_align == 'VIEW') view_align = (context.user_preferences.edit.object_align == 'VIEW')
view_align_force = False view_align_force = False
if operator: if operator:
if operator.properties.is_property_set("view_align"): if properties.is_property_set("view_align"):
view_align = view_align_force = operator.view_align view_align = view_align_force = operator.view_align
else: else:
operator.properties.view_align = view_align properties.view_align = view_align
if operator and operator.properties.is_property_set("rotation") and not view_align_force: if operator and (properties.is_property_set("rotation") and
rotation = mathutils.Euler(operator.properties.rotation).to_matrix().to_4x4() not view_align_force):
rotation = Euler(properties.rotation).to_matrix().to_4x4()
else: else:
if view_align and space_data: if view_align and space_data:
rotation = space_data.region_3d.view_matrix.to_3x3().inverted().to_4x4() rotation = space_data.region_3d.view_matrix.to_3x3().inverted()
rotation.resize_4x4()
else: else:
rotation = mathutils.Matrix() rotation = mathutils.Matrix()
# set the operator properties # set the operator properties
if operator: if operator:
operator.properties.rotation = rotation.to_euler() properties.rotation = rotation.to_euler()
return location * rotation return location * rotation
@@ -114,14 +121,18 @@ def object_data_add(context, obdata, operator=None):
# XXX # XXX
# caused because entering editmodedoes not add a empty undo slot! # caused because entering editmodedoes not add a empty undo slot!
if context.user_preferences.edit.use_enter_edit_mode: if context.user_preferences.edit.use_enter_edit_mode:
if not (obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type): if not (obj_act and
obj_act.mode == 'EDIT' and
obj_act.type == obj_new.type):
_obdata = bpy.data.meshes.new(obdata.name) _obdata = bpy.data.meshes.new(obdata.name)
obj_act = bpy.data.objects.new(_obdata.name, _obdata) obj_act = bpy.data.objects.new(_obdata.name, _obdata)
obj_act.matrix_world = obj_new.matrix_world obj_act.matrix_world = obj_new.matrix_world
scene.objects.link(obj_act) scene.objects.link(obj_act)
scene.objects.active = obj_act scene.objects.active = obj_act
bpy.ops.object.mode_set(mode='EDIT') bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.ed.undo_push(message="Enter Editmode") # need empty undo step # need empty undo step
bpy.ops.ed.undo_push(message="Enter Editmode")
# XXX # XXX
if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type: if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type:

View File

@@ -16,13 +16,13 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
__all__ = ( __all__ = (
"region_2d_to_vector_3d", "region_2d_to_vector_3d",
"region_2d_to_location_3d", "region_2d_to_location_3d",
"location_3d_to_region_2d", "location_3d_to_region_2d",
) )
def region_2d_to_vector_3d(region, rv3d, coord): def region_2d_to_vector_3d(region, rv3d, coord):
@@ -90,15 +90,23 @@ def region_2d_to_location_3d(region, rv3d, coord, depth_location):
origin_start = rv3d.view_matrix.inverted()[3].to_3d() origin_start = rv3d.view_matrix.inverted()[3].to_3d()
origin_end = origin_start + coord_vec origin_end = origin_start + coord_vec
view_vec = rv3d.view_matrix.inverted()[2] view_vec = rv3d.view_matrix.inverted()[2]
return intersect_line_plane(origin_start, origin_end, depth_location, view_vec, 1) return intersect_line_plane(origin_start,
origin_end,
depth_location,
view_vec, 1,
)
else: else:
dx = (2.0 * coord[0] / region.width) - 1.0 dx = (2.0 * coord[0] / region.width) - 1.0
dy = (2.0 * coord[1] / region.height) - 1.0 dy = (2.0 * coord[1] / region.height) - 1.0
persinv = persmat.inverted() persinv = persmat.inverted()
viewinv = rv3d.view_matrix.inverted() viewinv = rv3d.view_matrix.inverted()
origin_start = (persinv[0].xyz * dx) + (persinv[1].xyz * dy) + viewinv[3].xyz origin_start = ((persinv[0].xyz * dx) +
(persinv[1].xyz * dy) + viewinv[3].xyz)
origin_end = origin_start + coord_vec origin_end = origin_start + coord_vec
return intersect_point_line(depth_location, origin_start, origin_end)[0] return intersect_point_line(depth_location,
origin_start,
origin_end,
)[0]
def location_3d_to_region_2d(region, rv3d, coord): def location_3d_to_region_2d(region, rv3d, coord):

View File

@@ -16,14 +16,14 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# <pep8 compliant> # <pep8-80 compliant>
# This file defines a set of methods that are useful for various # This file defines a set of methods that are useful for various
# Relative Keying Set (RKS) related operations, such as: callbacks # Relative Keying Set (RKS) related operations, such as: callbacks
# for polling, iterator callbacks, and also generate callbacks. # for polling, iterator callbacks, and also generate callbacks.
# All of these can be used in conjunction with the others. # All of these can be used in conjunction with the others.
__all__ = [ __all__ = (
"path_add_property", "path_add_property",
"RKS_POLL_selected_objects", "RKS_POLL_selected_objects",
"RKS_POLL_selected_bones", "RKS_POLL_selected_bones",
@@ -33,7 +33,7 @@ __all__ = [
"RKS_GEN_location", "RKS_GEN_location",
"RKS_GEN_rotation", "RKS_GEN_rotation",
"RKS_GEN_scaling", "RKS_GEN_scaling",
] )
import bpy import bpy
@@ -75,7 +75,8 @@ def RKS_POLL_selected_bones(ksi, context):
# selected bones or objects # selected bones or objects
def RKS_POLL_selected_items(ksi, context): def RKS_POLL_selected_items(ksi, context):
return RKS_POLL_selected_bones(ksi, context) or RKS_POLL_selected_objects(ksi, context) return (RKS_POLL_selected_bones(ksi, context) or
RKS_POLL_selected_objects(ksi, context))
########################### ###########################
# Iterator Callbacks # Iterator Callbacks

View File

@@ -6411,7 +6411,9 @@ PyDoc_STRVAR(pyrna_register_class_doc,
" If the class has a *register* class method it will be called\n" " If the class has a *register* class method it will be called\n"
" before registration.\n" " before registration.\n"
"\n" "\n"
" .. note:: :exc:`ValueError` exception is raised if the class is not a\n" " .. note::\n"
"\n"
" :exc:`ValueError` exception is raised if the class is not a\n"
" subclass of a registerable blender class.\n" " subclass of a registerable blender class.\n"
"\n" "\n"
); );