Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release')
-rw-r--r--release/scripts/io/netrender/client.py29
-rw-r--r--release/scripts/io/netrender/operators.py9
-rw-r--r--release/scripts/io/netrender/slave.py11
-rw-r--r--release/scripts/modules/animsys_refactor.py64
-rw-r--r--release/scripts/modules/bpy/ops.py11
-rw-r--r--release/scripts/modules/bpy_types.py6
-rw-r--r--release/scripts/modules/console/intellisense.py6
-rw-r--r--release/scripts/modules/rigify/__init__.py6
-rw-r--r--release/scripts/modules/rna_info.py6
-rw-r--r--release/scripts/modules/sys_info.py103
-rw-r--r--release/scripts/op/image.py14
-rw-r--r--release/scripts/op/io_scene_3ds/export_3ds.py1
-rw-r--r--release/scripts/op/io_scene_obj/export_obj.py4
-rw-r--r--release/scripts/op/presets.py10
-rw-r--r--release/scripts/op/screen_play_rendered_anim.py8
-rw-r--r--release/scripts/op/uv.py4
-rw-r--r--release/scripts/op/wm.py9
-rw-r--r--release/scripts/presets/interaction/maya.py386
-rw-r--r--release/scripts/presets/render/HDV_1080p.py2
-rw-r--r--release/scripts/presets/render/HDV_NTSC_1080p.py8
-rw-r--r--release/scripts/presets/render/HDV_PAL_1080p.py8
-rw-r--r--release/scripts/templates/gamelogic.py9
-rw-r--r--release/scripts/templates/gamelogic_basic.py3
-rw-r--r--release/scripts/templates/gamelogic_module.py4
-rw-r--r--release/scripts/ui/properties_data_armature_rigify.py13
-rw-r--r--release/scripts/ui/properties_data_mesh.py4
-rw-r--r--release/scripts/ui/properties_object.py28
-rw-r--r--release/scripts/ui/properties_particle.py6
-rw-r--r--release/scripts/ui/properties_render.py5
-rw-r--r--release/scripts/ui/properties_texture.py9
-rw-r--r--release/scripts/ui/space_image.py41
-rw-r--r--release/scripts/ui/space_info.py20
-rw-r--r--release/scripts/ui/space_userpref.py6
-rw-r--r--release/scripts/ui/space_userpref_keymap.py4
-rw-r--r--release/scripts/ui/space_view3d.py97
-rw-r--r--release/scripts/ui/space_view3d_toolbar.py2
36 files changed, 392 insertions, 564 deletions
diff --git a/release/scripts/io/netrender/client.py b/release/scripts/io/netrender/client.py
index c17944725b0..128ae99ab1d 100644
--- a/release/scripts/io/netrender/client.py
+++ b/release/scripts/io/netrender/client.py
@@ -211,7 +211,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
address = "" if netsettings.server_address == "[default]" else netsettings.server_address
- master.runMaster((address, netsettings.server_port), netsettings.use_master_broadcast, netsettings.use_master_clear, netsettings.path, self.update_stats, self.test_break)
+ master.runMaster((address, netsettings.server_port), netsettings.use_master_broadcast, netsettings.use_master_clear, bpy.path.abspath(netsettings.path), self.update_stats, self.test_break)
def render_slave(self, scene):
@@ -236,10 +236,11 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
# reading back result
self.update_stats("", "Network render waiting for results")
-
+
+
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
- response.read()
+ buf = response.read()
if response.status == http.client.NO_CONTENT:
new_job = True
@@ -248,13 +249,13 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
- response.read()
-
+ buf = response.read()
+
while response.status == http.client.ACCEPTED and not self.test_break():
time.sleep(1)
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
- response.read()
+ buf = response.read()
# cancel new jobs (animate on network) on break
if self.test_break() and new_job:
@@ -271,18 +272,22 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
r = scene.render
x= int(r.resolution_x*r.resolution_percentage*0.01)
y= int(r.resolution_y*r.resolution_percentage*0.01)
+
+ result_path = os.path.join(bpy.path.abspath(netsettings.path), "output.exr")
+
+ folder = os.path.split(result_path)[0]
+
+ if not os.path.exists(folder):
+ os.mkdir(folder)
- f = open(os.path.join(netsettings.path, "output.exr"), "wb")
- buf = response.read(1024)
+ f = open(result_path, "wb")
- while buf:
- f.write(buf)
- buf = response.read(1024)
+ f.write(buf)
f.close()
result = self.begin_result(0, 0, x, y)
- result.load_from_file(os.path.join(netsettings.path, "output.exr"))
+ result.load_from_file(result_path)
self.end_result(result)
conn.close()
diff --git a/release/scripts/io/netrender/operators.py b/release/scripts/io/netrender/operators.py
index 2b40cd77125..96601dcf653 100644
--- a/release/scripts/io/netrender/operators.py
+++ b/release/scripts/io/netrender/operators.py
@@ -417,7 +417,7 @@ class netclientdownload(bpy.types.Operator):
for frame in job.frames:
client.requestResult(conn, job.id, frame.number)
response = conn.getresponse()
- response.read()
+ buf = response.read()
if response.status != http.client.OK:
print("missing", frame.number)
@@ -425,12 +425,9 @@ class netclientdownload(bpy.types.Operator):
print("got back", frame.number)
- f = open(os.path.join(netsettings.path, "%06d.exr" % frame.number), "wb")
- buf = response.read(1024)
+ f = open(os.path.join(bpy.path.abspath(netsettings.path), "%06d.exr" % frame.number), "wb")
- while buf:
- f.write(buf)
- buf = response.read(1024)
+ f.write(buf)
f.close()
diff --git a/release/scripts/io/netrender/slave.py b/release/scripts/io/netrender/slave.py
index f017fefa4e3..8629a38c04a 100644
--- a/release/scripts/io/netrender/slave.py
+++ b/release/scripts/io/netrender/slave.py
@@ -21,6 +21,8 @@ import http, http.client, http.server, urllib
import subprocess, time
import json
+import bpy
+
from netrender.utils import *
import netrender.model
import netrender.repath
@@ -30,8 +32,13 @@ BLENDER_PATH = sys.argv[0]
CANCEL_POLL_SPEED = 2
MAX_TIMEOUT = 10
INCREMENT_TIMEOUT = 1
+try:
+ system = platform.system()
+except UnicodeDecodeError:
+ import sys
+ system = sys.platform
-if platform.system() == 'Windows' and platform.version() >= '5': # Error mode is only available on Win2k or higher, that's version 5
+if system in ('Windows', 'win32') and platform.version() >= '5': # Error mode is only available on Win2k or higher, that's version 5
import ctypes
def SetErrorMode():
val = ctypes.windll.kernel32.SetErrorMode(0x0002)
@@ -118,7 +125,7 @@ def render_slave(engine, netsettings, threads):
slave_id = response.getheader("slave-id")
- NODE_PREFIX = os.path.join(netsettings.path, "slave_" + slave_id)
+ NODE_PREFIX = os.path.join(bpy.path.abspath(netsettings.path), "slave_" + slave_id)
if not os.path.exists(NODE_PREFIX):
os.mkdir(NODE_PREFIX)
diff --git a/release/scripts/modules/animsys_refactor.py b/release/scripts/modules/animsys_refactor.py
index 8cc91873b0e..bd16a02268a 100644
--- a/release/scripts/modules/animsys_refactor.py
+++ b/release/scripts/modules/animsys_refactor.py
@@ -111,6 +111,7 @@ def classes_recursive(base_type, clss=None):
def find_path_new(id_data, data_path, rna_update_dict, rna_update_from_map):
+ # note!, id_data can be ID type or a node tree
# ignore ID props for now
if data_path.startswith("["):
return data_path
@@ -156,36 +157,43 @@ def update_data_paths(rna_update):
rna_update_from_map.setdefault(ren_from, []).append(ren_to)
for id_data in id_iter():
- anim_data = getattr(id_data, "animation_data", None)
- if anim_data is None:
- continue
-
- for fcurve in anim_data.drivers:
- for var in fcurve.driver.variables:
- if var.type == 'SINGLE_PROP':
- for tar in var.targets:
- id_data_other = tar.id
- data_path = tar.data_path
-
- if id_data_other and data_path:
- data_path_new = find_path_new(id_data_other, data_path, rna_update_dict, rna_update_from_map)
- # print(data_path_new)
- if data_path_new != data_path:
- if not IS_TESTING:
- tar.data_path = data_path_new
- print("driver (%s): %s -> %s" % (id_data_other.name, data_path, data_path_new))
+
+ # check node-trees too
+ anim_data_ls = [(id_data, getattr(id_data, "animation_data", None))]
+ node_tree = getattr(id_data, "node_tree", None)
+ if node_tree:
+ anim_data_ls.append((node_tree, node_tree.animation_data))
+
+ for anim_data_base, anim_data in anim_data_ls:
+ if anim_data is None:
+ continue
+
+ for fcurve in anim_data.drivers:
+ for var in fcurve.driver.variables:
+ if var.type == 'SINGLE_PROP':
+ for tar in var.targets:
+ id_data_other = tar.id
+ data_path = tar.data_path
+
+ if id_data_other and data_path:
+ data_path_new = find_path_new(id_data_other, data_path, rna_update_dict, rna_update_from_map)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ tar.data_path = data_path_new
+ print("driver (%s): %s -> %s" % (id_data_other.name, data_path, data_path_new))
+
-
- for action in anim_data_actions(anim_data):
- for fcu in action.fcurves:
- data_path = fcu.data_path
- data_path_new = find_path_new(id_data, data_path, rna_update_dict, rna_update_from_map)
- # print(data_path_new)
- if data_path_new != data_path:
- if not IS_TESTING:
- fcu.data_path = data_path_new
- print("fcurve (%s): %s -> %s" % (id_data.name, data_path, data_path_new))
+ for action in anim_data_actions(anim_data):
+ for fcu in action.fcurves:
+ data_path = fcu.data_path
+ data_path_new = find_path_new(anim_data_base, data_path, rna_update_dict, rna_update_from_map)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ fcu.data_path = data_path_new
+ print("fcurve (%s): %s -> %s" % (id_data.name, data_path, data_path_new))
if __name__ == "__main__":
diff --git a/release/scripts/modules/bpy/ops.py b/release/scripts/modules/bpy/ops.py
index 7a824ce2e68..ba56fa12fe1 100644
--- a/release/scripts/modules/bpy/ops.py
+++ b/release/scripts/modules/bpy/ops.py
@@ -182,8 +182,15 @@ class bpy_ops_submodule_op(object):
import bpy
idname = self.idname()
as_string = op_as_string(idname)
- descr = getattr(bpy.types, idname).bl_rna.description
- return as_string + "\n" + descr
+ op_class = getattr(bpy.types, idname)
+ descr = op_class.bl_rna.description
+ # XXX, workaround for not registering every __doc__ to save time on load.
+ if not descr:
+ descr = op_class.__doc__
+ if not descr:
+ descr = ""
+
+ return "# %s\n%s" % (descr, as_string)
def __str__(self): # used for print(...)
return "<function bpy.ops.%s.%s at 0x%x'>" % \
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 261165d8830..6ecb8a2e207 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -258,15 +258,15 @@ class _GenericBone:
return bones
-class PoseBone(StructRNA, _GenericBone):
+class PoseBone(StructRNA, _GenericBone, metaclass=StructMetaIDProp):
__slots__ = ()
-class Bone(StructRNA, _GenericBone):
+class Bone(StructRNA, _GenericBone, metaclass=StructMetaIDProp):
__slots__ = ()
-class EditBone(StructRNA, _GenericBone):
+class EditBone(StructRNA, _GenericBone, metaclass=StructMetaIDProp):
__slots__ = ()
def align_orientation(self, other):
diff --git a/release/scripts/modules/console/intellisense.py b/release/scripts/modules/console/intellisense.py
index 0f9acf9b6a9..d76c5d0ad60 100644
--- a/release/scripts/modules/console/intellisense.py
+++ b/release/scripts/modules/console/intellisense.py
@@ -75,10 +75,10 @@ def complete(line, cursor, namespace, private=True):
# unquoted word -> module or attribute completion
word = re_unquoted_word.group(1)
if RE_MODULE.match(line):
- import complete_import
+ from . import complete_import
matches = complete_import.complete(line)
else:
- import complete_namespace
+ from . import complete_namespace
matches = complete_namespace.complete(word, namespace, private)
else:
# for now we don't have completers for strings
@@ -112,7 +112,7 @@ def expand(line, cursor, namespace, private=True):
'abs(number) -> number\\nReturn the absolute value of the argument.'
"""
if line[:cursor].strip().endswith('('):
- import complete_calltip
+ from . import complete_calltip
matches, word, scrollback = complete_calltip.complete(line,
cursor, namespace)
no_calltip = False
diff --git a/release/scripts/modules/rigify/__init__.py b/release/scripts/modules/rigify/__init__.py
index 98d9bb235a2..c4f18d51519 100644
--- a/release/scripts/modules/rigify/__init__.py
+++ b/release/scripts/modules/rigify/__init__.py
@@ -534,7 +534,11 @@ def generate_test_all(context, GRAPH=False):
new_objects = rigify.generate_test(context)
if GRAPH:
- base_name = os.path.splitext(bpy.data.filepath)[0]
+ if(bpy.data.filepath):
+ base_name = os.path.splitext(bpy.data.filepath)[0]
+ else:
+ import tempfile
+ base_name = tempfile.mktemp(prefix=bpy.app.tempdir)
for obj, obj_new in new_objects:
for obj in (obj, obj_new):
fn = base_name + "-" + bpy.path.clean_name(obj.name)
diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py
index 4282889c51a..e0298d30aa2 100644
--- a/release/scripts/modules/rna_info.py
+++ b/release/scripts/modules/rna_info.py
@@ -152,7 +152,7 @@ class InfoStructRNA:
functions.append((identifier, attr))
return functions
- def __repr__(self):
+ def __str__(self):
txt = ""
txt += self.identifier
@@ -285,7 +285,7 @@ class InfoPropertyRNA:
return type_str
- def __repr__(self):
+ def __str__(self):
txt = ''
txt += ' * ' + self.identifier + ': ' + self.description
@@ -319,7 +319,7 @@ class InfoFunctionRNA:
self.return_values = tuple(self.return_values)
- def __repr__(self):
+ def __str__(self):
txt = ''
txt += ' * ' + self.identifier + '('
diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py
new file mode 100644
index 00000000000..b6f429141bf
--- /dev/null
+++ b/release/scripts/modules/sys_info.py
@@ -0,0 +1,103 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# classes for extracting info from blenders internal classes
+
+import bpy
+import bgl
+
+import sys
+
+def cutPoint(text, length):
+ "Returns position of the last space found before 'length' chars"
+ l = length
+ c = text[l]
+ while c != ' ':
+ l -= 1
+ if l == 0: return length # no space found
+ c = text[l]
+ return l
+
+def textWrap(text, length = 70):
+ lines = []
+ while len(text) > 70:
+ cpt = cutPoint(text, length)
+ line, text = text[:cpt], text[cpt + 1:]
+ lines.append(line)
+ lines.append(text)
+ return lines
+
+def write_sysinfo(op):
+ output_filename = "system-info.txt"
+ warnings = 0
+ notices = 0
+
+ if output_filename in bpy.data.texts.keys():
+ output = bpy.data.texts[output_filename]
+ output.clear()
+ else:
+ output = bpy.data.texts.new(name=output_filename)
+
+ header = '= Blender {} System Information =\n'.format(bpy.app.version_string)
+ lilies = '{}\n\n'.format(len(header)*'=')
+ firstlilies = '{}\n'.format(len(header)*'=')
+ output.write(firstlilies)
+ output.write(header)
+ output.write(lilies)
+
+ # build info
+ output.write('\nBlender:\n')
+ output.write(lilies)
+ output.write('version {}, revision {}. {}\n'.format(bpy.app.version_string, bpy.app.build_revision, bpy.app.build_type))
+ output.write('build date: {}, {}\n'.format(bpy.app.build_date, bpy.app.build_time))
+ output.write('platform: {}\n'.format(bpy.app.build_platform))
+ output.write('binary path: {}\n\n'.format(bpy.app.binary_path))
+
+ # python info
+ output.write('\nPython:\n')
+ output.write(lilies)
+ output.write('version: {}\n'.format(sys.version))
+ output.write('paths:\n')
+ for p in sys.path:
+ output.write('\t{}\n'.format(p))
+
+ output.write('\nDirectories:\n')
+ output.write(lilies)
+ output.write('scripts: {}\n'.format(bpy.utils.script_paths()))
+ output.write('user scripts: {}\n'.format(bpy.utils.user_script_path()))
+ output.write('datafiles: {}\n'.format(bpy.utils.user_resource('DATAFILES')))
+ output.write('config: {}\n'.format(bpy.utils.user_resource('CONFIG')))
+ output.write('scripts : {}\n'.format(bpy.utils.user_resource('SCRIPTS')))
+ output.write('autosave: {}\n'.format(bpy.utils.user_resource('AUTOSAVE')))
+ output.write('tempdir: {}\n'.format(bpy.app.tempdir))
+
+ output.write('\nOpenGL\n')
+ output.write(lilies)
+ output.write('renderer:\t{}\n'.format(bgl.glGetString(bgl.GL_RENDERER)))
+ output.write('vendor:\t\t{}\n'.format(bgl.glGetString(bgl.GL_VENDOR)))
+ output.write('version:\t{}\n'.format(bgl.glGetString(bgl.GL_VERSION)))
+ output.write('extensions:\n')
+
+ glext = bgl.glGetString(bgl.GL_EXTENSIONS)
+ glext = textWrap(glext, 70)
+ for l in glext:
+ output.write('\t\t{}\n'.format(l))
+
+ op.report({'INFO'}, "System information generated in 'system-info.txt'")
diff --git a/release/scripts/op/image.py b/release/scripts/op/image.py
index b897e7955a0..ddd04c4e7c3 100644
--- a/release/scripts/op/image.py
+++ b/release/scripts/op/image.py
@@ -32,13 +32,17 @@ class EditExternally(bpy.types.Operator):
def _editor_guess(self, context):
import platform
- system = platform.system()
+ try:
+ system = platform.system()
+ except UnicodeDecodeError:
+ import sys
+ system = sys.platform
image_editor = context.user_preferences.filepaths.image_editor
# use image editor in the preferences when available.
if not image_editor:
- if system == 'Windows':
+ if system in ('Windows', 'win32'):
image_editor = ["start"] # not tested!
elif system == 'Darwin':
image_editor = ["open"]
@@ -84,7 +88,7 @@ class EditExternally(bpy.types.Operator):
class SaveDirty(bpy.types.Operator):
- '''Select object matching a naming pattern'''
+ """Save all modified textures"""
bl_idname = "image.save_dirty"
bl_label = "Save Dirty"
bl_options = {'REGISTER', 'UNDO'}
@@ -105,7 +109,7 @@ class SaveDirty(bpy.types.Operator):
class ProjectEdit(bpy.types.Operator):
- '''Select object matching a naming pattern'''
+ """Edit a snapshot if the viewport in an external image editor"""
bl_idname = "image.project_edit"
bl_label = "Project Edit"
bl_options = {'REGISTER'}
@@ -170,7 +174,7 @@ class ProjectEdit(bpy.types.Operator):
class ProjectApply(bpy.types.Operator):
- '''Select object matching a naming pattern'''
+ """Project edited image back onto the object"""
bl_idname = "image.project_apply"
bl_label = "Project Apply"
bl_options = {'REGISTER'}
diff --git a/release/scripts/op/io_scene_3ds/export_3ds.py b/release/scripts/op/io_scene_3ds/export_3ds.py
index 0cbb4347dda..943c94af55f 100644
--- a/release/scripts/op/io_scene_3ds/export_3ds.py
+++ b/release/scripts/op/io_scene_3ds/export_3ds.py
@@ -431,6 +431,7 @@ def make_material_texture_chunk(id, images):
mat_sub = _3ds_chunk(id)
def add_image(img):
+ import os
filename = os.path.basename(image.filepath)
mat_sub_file = _3ds_chunk(MATMAPFILE)
mat_sub_file.add_variable("mapfile", _3ds_string(sane_name(filename)))
diff --git a/release/scripts/op/io_scene_obj/export_obj.py b/release/scripts/op/io_scene_obj/export_obj.py
index abdb07c1a8e..3fd91615bb6 100644
--- a/release/scripts/op/io_scene_obj/export_obj.py
+++ b/release/scripts/op/io_scene_obj/export_obj.py
@@ -750,7 +750,7 @@ def _write(context, filepath,
# Export an animation?
if EXPORT_ANIMATION:
- scene_frames = range(scene.frame_start, context.frame_end + 1) # Up to and including the end frame.
+ scene_frames = range(scene.frame_start, scene.frame_end + 1) # Up to and including the end frame.
else:
scene_frames = [orig_frame] # Dont export an animation.
@@ -803,7 +803,7 @@ Currently the exporter lacks these features:
def save(operator, context, filepath="",
use_triangles=False,
- use_edges=False,
+ use_edges=True,
use_normals=False,
use_hq_normals=False,
use_uvs=True,
diff --git a/release/scripts/op/presets.py b/release/scripts/op/presets.py
index 07852550ab7..2f6a5b69c20 100644
--- a/release/scripts/op/presets.py
+++ b/release/scripts/op/presets.py
@@ -66,7 +66,13 @@ class AddPresetBase():
for rna_path in self.preset_values:
value = eval(rna_path)
- file_preset.write("%s = %s\n" % (rna_path, repr(value)))
+ # convert thin wrapped sequences to simple lists to repr()
+ try:
+ value = value[:]
+ except:
+ pass
+
+ file_preset.write("%s = %r\n" % (rna_path, value))
file_preset.close()
@@ -250,7 +256,7 @@ class AddPresetKeyconfig(AddPresetBase, bpy.types.Operator):
'''Add a Keyconfig Preset'''
bl_idname = "wm.keyconfig_preset_add"
bl_label = "Add Keyconfig Preset"
- preset_menu = "PREFS_MT_keyconfigs"
+ preset_menu = "USERPREF_MT_keyconfigs"
preset_subdir = "keyconfig"
def add(self, context, filepath):
diff --git a/release/scripts/op/screen_play_rendered_anim.py b/release/scripts/op/screen_play_rendered_anim.py
index 53421642129..244c3d4b332 100644
--- a/release/scripts/op/screen_play_rendered_anim.py
+++ b/release/scripts/op/screen_play_rendered_anim.py
@@ -30,14 +30,18 @@ import os
def guess_player_path(preset):
import platform
- system = platform.system()
+ try:
+ system = platform.system()
+ except UnicodeDecodeError:
+ import sys
+ system = sys.platform
if preset == 'BLENDER24':
player_path = "blender"
if system == 'Darwin':
test_path = "/Applications/blender 2.49.app/Contents/MacOS/blender"
- elif system == 'Windows':
+ elif system in ('Windows', 'win32'):
test_path = "/Program Files/Blender Foundation/Blender/blender.exe"
if os.path.exists(test_path):
diff --git a/release/scripts/op/uv.py b/release/scripts/op/uv.py
index d01ef070d87..8fea37ef420 100644
--- a/release/scripts/op/uv.py
+++ b/release/scripts/op/uv.py
@@ -235,7 +235,7 @@ def write_png(fw, mesh_source, image_width, image_height, face_iter):
class ExportUVLayout(bpy.types.Operator):
- '''Export the Mesh as SVG'''
+ """Export UV layout to file"""
bl_idname = "uv.export_layout"
bl_label = "Export UV Layout"
@@ -251,7 +251,7 @@ class ExportUVLayout(bpy.types.Operator):
name="Format",
description="File format to export the UV layout to",
default='PNG')
- size = IntVectorProperty(size=2, default=(1024, 1024), min=8, max=32768)
+ size = IntVectorProperty(size=2, default=(1024, 1024), min=8, max=32768, description="Dimensions of the exported file")
@classmethod
def poll(cls, context):
diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py
index 60a963804a6..4ce10233a9b 100644
--- a/release/scripts/op/wm.py
+++ b/release/scripts/op/wm.py
@@ -779,6 +779,15 @@ class WM_OT_keyconfig_activate(bpy.types.Operator):
bpy.utils.keyconfig_set(self.filepath)
return {'FINISHED'}
+class WM_OT_sysinfo(bpy.types.Operator):
+ '''Generate System Info'''
+ bl_idname = "wm.sysinfo"
+ bl_label = "System Info"
+
+ def execute(self, context):
+ import sys_info
+ sys_info.write_sysinfo(self)
+ return {'FINISHED'}
def register():
pass
diff --git a/release/scripts/presets/interaction/maya.py b/release/scripts/presets/interaction/maya.py
deleted file mode 100644
index 4a40326325e..00000000000
--- a/release/scripts/presets/interaction/maya.py
+++ /dev/null
@@ -1,386 +0,0 @@
-# Configuration Maya
-import bpy
-
-wm = bpy.context.window_manager
-kc = wm.keyconfigs.new('Maya')
-
-# Map 3D View
-km = kc.keymaps.new('3D View', space_type='VIEW_3D', region_type='WINDOW', modal=False)
-
-kmi = km.items.new('view3d.manipulator', 'LEFTMOUSE', 'PRESS', any=True)
-kmi.properties.release_confirm = True
-kmi = km.items.new('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS')
-kmi = km.items.new('view3d.rotate', 'LEFTMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.move', 'MIDDLEMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.zoom', 'RIGHTMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.view_selected', 'NUMPAD_PERIOD', 'PRESS')
-kmi = km.items.new('view3d.view_center_cursor', 'NUMPAD_PERIOD', 'PRESS', ctrl=True)
-kmi = km.items.new('view3d.fly', 'F', 'PRESS', shift=True)
-kmi = km.items.new('view3d.smoothview', 'TIMER1', 'ANY', any=True)
-kmi = km.items.new('view3d.rotate', 'TRACKPADPAN', 'ANY', alt=True)
-kmi = km.items.new('view3d.rotate', 'MOUSEROTATE', 'ANY')
-kmi = km.items.new('view3d.move', 'TRACKPADPAN', 'ANY')
-kmi = km.items.new('view3d.zoom', 'TRACKPADZOOM', 'ANY')
-kmi = km.items.new('view3d.zoom', 'NUMPAD_PLUS', 'PRESS')
-kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'NUMPAD_MINUS', 'PRESS')
-kmi.properties.delta = -1
-kmi = km.items.new('view3d.zoom', 'EQUAL', 'PRESS', ctrl=True)
-kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'MINUS', 'PRESS', ctrl=True)
-kmi.properties.delta = -1
-kmi = km.items.new('view3d.zoom', 'WHEELINMOUSE', 'PRESS')
-kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'WHEELOUTMOUSE', 'PRESS')
-kmi.properties.delta = -1
-kmi = km.items.new('view3d.view_all', 'HOME', 'PRESS')
-kmi.properties.center = False
-kmi = km.items.new('view3d.view_all', 'C', 'PRESS', shift=True)
-kmi.properties.center = True
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_0', 'PRESS')
-kmi.properties.type = 'CAMERA'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS')
-kmi.properties.type = 'FRONT'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_2', 'PRESS')
-kmi.properties.type = 'ORBITDOWN'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS')
-kmi.properties.type = 'RIGHT'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_4', 'PRESS')
-kmi.properties.type = 'ORBITLEFT'
-kmi = km.items.new('view3d.view_persportho', 'NUMPAD_5', 'PRESS')
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_6', 'PRESS')
-kmi.properties.type = 'ORBITRIGHT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS')
-kmi.properties.type = 'TOP'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_8', 'PRESS')
-kmi.properties.type = 'ORBITUP'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', ctrl=True)
-kmi.properties.type = 'BACK'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', ctrl=True)
-kmi.properties.type = 'LEFT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', ctrl=True)
-kmi.properties.type = 'BOTTOM'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_2', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANDOWN'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_4', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANLEFT'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_6', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANRIGHT'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_8', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANUP'
-kmi = km.items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANRIGHT'
-kmi = km.items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True)
-kmi.properties.type = 'PANLEFT'
-kmi = km.items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', shift=True)
-kmi.properties.type = 'PANUP'
-kmi = km.items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', shift=True)
-kmi.properties.type = 'PANDOWN'
-kmi = km.items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi.properties.type = 'ORBITLEFT'
-kmi = km.items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi.properties.type = 'ORBITRIGHT'
-kmi = km.items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', shift=True, alt=True)
-kmi.properties.type = 'ORBITUP'
-kmi = km.items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', shift=True, alt=True)
-kmi.properties.type = 'ORBITDOWN'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'FRONT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'RIGHT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'TOP'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True, ctrl=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'BACK'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True, ctrl=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'LEFT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True, ctrl=True)
-kmi.properties.align_active = True
-kmi.properties.type = 'BOTTOM'
-kmi = km.items.new('view3d.localview', 'NUMPAD_SLASH', 'PRESS')
-kmi = km.items.new('view3d.layers', 'ACCENT_GRAVE', 'PRESS')
-kmi.properties.nr = 0
-kmi = km.items.new('view3d.layers', 'ONE', 'PRESS', any=True)
-kmi.properties.nr = 1
-kmi = km.items.new('view3d.layers', 'TWO', 'PRESS', any=True)
-kmi.properties.nr = 2
-kmi = km.items.new('view3d.layers', 'THREE', 'PRESS', any=True)
-kmi.properties.nr = 3
-kmi = km.items.new('view3d.layers', 'FOUR', 'PRESS', any=True)
-kmi.properties.nr = 4
-kmi = km.items.new('view3d.layers', 'FIVE', 'PRESS', any=True)
-kmi.properties.nr = 5
-kmi = km.items.new('view3d.layers', 'SIX', 'PRESS', any=True)
-kmi.properties.nr = 6
-kmi = km.items.new('view3d.layers', 'SEVEN', 'PRESS', any=True)
-kmi.properties.nr = 7
-kmi = km.items.new('view3d.layers', 'EIGHT', 'PRESS', any=True)
-kmi.properties.nr = 8
-kmi = km.items.new('view3d.layers', 'NINE', 'PRESS', any=True)
-kmi.properties.nr = 9
-kmi = km.items.new('view3d.layers', 'ZERO', 'PRESS', any=True)
-kmi.properties.nr = 10
-kmi = km.items.new('wm.context_toggle_enum', 'Z', 'PRESS')
-kmi.properties.data_path = 'space_data.viewport_shade'
-kmi.properties.value_1 = 'SOLID'
-kmi.properties.value_2 = 'WIREFRAME'
-kmi = km.items.new('wm.context_toggle_enum', 'Z', 'PRESS', alt=True)
-kmi.properties.data_path = 'space_data.viewport_shade'
-kmi.properties.value_1 = 'TEXTURED'
-kmi.properties.value_2 = 'SOLID'
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS')
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True)
-kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True)
-kmi.properties.center = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', alt=True)
-kmi.properties.enumerate = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True)
-kmi.properties.center = True
-kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi.properties.center = True
-kmi.properties.enumerate = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
-kmi.properties.enumerate = True
-kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi.properties.center = True
-kmi.properties.enumerate = True
-kmi.properties.extend = True
-kmi = km.items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY')
-kmi.properties.extend = False
-kmi = km.items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
-kmi = km.items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', shift=True, ctrl=True)
-kmi.properties.deselect = True
-kmi = km.items.new('view3d.select_circle', 'C', 'PRESS')
-kmi = km.items.new('view3d.clip_border', 'B', 'PRESS', alt=True)
-kmi = km.items.new('view3d.zoom_border', 'B', 'PRESS', shift=True)
-kmi = km.items.new('view3d.render_border', 'B', 'PRESS', shift=True)
-kmi = km.items.new('view3d.camera_to_view', 'NUMPAD_0', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('view3d.object_as_camera', 'NUMPAD_0', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.call_menu', 'S', 'PRESS', shift=True)
-kmi.properties.name = 'VIEW3D_MT_snap'
-kmi = km.items.new('wm.context_set_enum', 'COMMA', 'PRESS')
-kmi.properties.data_path = 'space_data.pivot_point'
-kmi.properties.value = 'BOUNDING_BOX_CENTER'
-kmi = km.items.new('wm.context_set_enum', 'COMMA', 'PRESS', ctrl=True)
-kmi.properties.data_path = 'space_data.pivot_point'
-kmi.properties.value = 'MEDIAN_POINT'
-kmi = km.items.new('wm.context_toggle', 'COMMA', 'PRESS', alt=True)
-kmi.properties.data_path = 'space_data.use_pivot_point_align'
-kmi = km.items.new('wm.context_toggle', 'Q', 'PRESS')
-kmi.properties.data_path = 'space_data.show_manipulator'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS')
-kmi.properties.data_path = 'space_data.pivot_point'
-kmi.properties.value = 'CURSOR'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS', ctrl=True)
-kmi.properties.data_path = 'space_data.pivot_point'
-kmi.properties.value = 'INDIVIDUAL_ORIGINS'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS', alt=True)
-kmi.properties.data_path = 'space_data.pivot_point'
-kmi.properties.value = 'ACTIVE_ELEMENT'
-kmi = km.items.new('transform.translate', 'G', 'PRESS', shift=True)
-kmi = km.items.new('transform.translate', 'EVT_TWEAK_S', 'ANY')
-kmi = km.items.new('transform.rotate', 'R', 'PRESS', shift=True)
-kmi = km.items.new('transform.resize', 'S', 'PRESS', shift=True)
-kmi = km.items.new('transform.warp', 'W', 'PRESS', shift=True)
-kmi = km.items.new('transform.tosphere', 'S', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('transform.shear', 'S', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('transform.select_orientation', 'SPACE', 'PRESS', alt=True)
-kmi = km.items.new('transform.create_orientation', 'SPACE', 'PRESS', ctrl=True, alt=True)
-kmi.properties.use = True
-kmi = km.items.new('transform.mirror', 'M', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.context_toggle', 'TAB', 'PRESS', shift=True)
-kmi.properties.data_path = 'tool_settings.use_snap'
-kmi = km.items.new('transform.snap_type', 'TAB', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('view3d.enable_manipulator', 'W', 'PRESS')
-kmi.properties.translate = True
-kmi = km.items.new('view3d.enable_manipulator', 'E', 'PRESS')
-kmi.properties.rotate = True
-kmi = km.items.new('view3d.enable_manipulator', 'R', 'PRESS')
-kmi.properties.scale = True
-kmi = km.items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY', shift=True)
-kmi.properties.extend = True
-
-# Map Object Mode
-km = kc.keymaps.new('Object Mode', space_type='EMPTY', region_type='WINDOW', modal=False)
-
-kmi = km.items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
-kmi.properties.data_path = 'tool_settings.proportional_edit_falloff'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS')
-kmi.properties.data_path = 'tool_settings.proportional_edit'
-kmi.properties.value_1 = 'DISABLED'
-kmi.properties.value_2 = 'ENABLED'
-kmi = km.items.new('view3d.game_start', 'P', 'PRESS')
-kmi = km.items.new('object.select_all', 'A', 'PRESS')
-kmi = km.items.new('object.select_inverse', 'I', 'PRESS', ctrl=True)
-kmi = km.items.new('object.select_linked', 'L', 'PRESS', shift=True)
-kmi = km.items.new('object.select_grouped', 'G', 'PRESS', shift=True)
-kmi = km.items.new('object.select_mirror', 'M', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS')
-kmi.properties.direction = 'PARENT'
-kmi = km.items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS', shift=True)
-kmi.properties.direction = 'PARENT'
-kmi.properties.extend = True
-kmi = km.items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS')
-kmi.properties.direction = 'CHILD'
-kmi = km.items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS', shift=True)
-kmi.properties.direction = 'CHILD'
-kmi.properties.extend = True
-kmi = km.items.new('object.parent_set', 'P', 'PRESS', ctrl=True)
-kmi = km.items.new('object.parent_no_inverse_set', 'P', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.parent_clear', 'P', 'PRESS', alt=True)
-kmi = km.items.new('object.track_set', 'T', 'PRESS', ctrl=True)
-kmi = km.items.new('object.track_clear', 'T', 'PRESS', alt=True)
-kmi = km.items.new('object.constraint_add_with_targets', 'C', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.constraints_clear', 'C', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('object.location_clear', 'G', 'PRESS', alt=True)
-kmi = km.items.new('object.rotation_clear', 'R', 'PRESS', alt=True)
-kmi = km.items.new('object.scale_clear', 'S', 'PRESS', alt=True)
-kmi = km.items.new('object.origin_clear', 'O', 'PRESS', alt=True)
-kmi = km.items.new('object.hide_view_clear', 'H', 'PRESS', alt=True)
-kmi = km.items.new('object.hide_view_set', 'H', 'PRESS')
-kmi = km.items.new('object.hide_view_set', 'H', 'PRESS', shift=True)
-kmi.properties.unselected = True
-kmi = km.items.new('object.move_to_layer', 'M', 'PRESS')
-kmi = km.items.new('object.delete', 'X', 'PRESS')
-kmi = km.items.new('object.delete', 'DEL', 'PRESS')
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', shift=True)
-kmi.properties.name = 'INFO_MT_add'
-kmi = km.items.new('object.duplicates_make_real', 'A', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_object_apply'
-kmi = km.items.new('wm.call_menu', 'U', 'PRESS')
-kmi.properties.name = 'VIEW3D_MT_make_single_user'
-kmi = km.items.new('wm.call_menu', 'L', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_make_links'
-kmi = km.items.new('object.duplicate_move', 'D', 'PRESS', shift=True)
-kmi = km.items.new('object.duplicate_move_linked', 'D', 'PRESS', alt=True)
-kmi = km.items.new('object.join', 'J', 'PRESS', ctrl=True)
-kmi = km.items.new('object.convert', 'C', 'PRESS', alt=True)
-kmi = km.items.new('object.proxy_make', 'P', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('object.make_local', 'L', 'PRESS')
-kmi = km.items.new('anim.keyframe_insert_menu', 'I', 'PRESS')
-kmi = km.items.new('anim.keyframe_delete_v3d', 'I', 'PRESS', alt=True)
-kmi = km.items.new('anim.keying_set_active_set', 'I', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('group.create', 'G', 'PRESS', ctrl=True)
-kmi = km.items.new('group.objects_remove', 'G', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('group.objects_add_active', 'G', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('group.objects_remove_active', 'G', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_object_specials'
-kmi = km.items.new('object.subdivision_set', 'ZERO', 'PRESS', ctrl=True)
-kmi.properties.level = 0
-kmi = km.items.new('object.subdivision_set', 'ONE', 'PRESS', ctrl=True)
-kmi.properties.level = 1
-kmi = km.items.new('object.subdivision_set', 'TWO', 'PRESS', ctrl=True)
-kmi.properties.level = 2
-kmi = km.items.new('object.subdivision_set', 'THREE', 'PRESS', ctrl=True)
-kmi.properties.level = 3
-kmi = km.items.new('object.subdivision_set', 'FOUR', 'PRESS', ctrl=True)
-kmi.properties.level = 4
-kmi = km.items.new('object.subdivision_set', 'FIVE', 'PRESS', ctrl=True)
-kmi.properties.level = 5
-kmi = km.items.new('object.select_all', 'SELECTMOUSE', 'CLICK')
-kmi.properties.action = 'DESELECT'
-
-# Map Mesh
-km = kc.keymaps.new('Mesh', space_type='EMPTY', region_type='WINDOW', modal=False)
-
-kmi = km.items.new('mesh.loopcut_slide', 'R', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
-kmi.properties.extend = True
-kmi = km.items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi.properties.extend = True
-kmi = km.items.new('mesh.select_shortest_path', 'SELECTMOUSE', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_all', 'A', 'PRESS')
-kmi = km.items.new('mesh.select_more', 'NUMPAD_PLUS', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_less', 'NUMPAD_MINUS', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_inverse', 'I', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_non_manifold', 'M', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('mesh.select_linked', 'L', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_linked_pick', 'L', 'PRESS')
-kmi = km.items.new('mesh.select_linked_pick', 'L', 'PRESS', shift=True)
-kmi.properties.deselect = True
-kmi = km.items.new('mesh.faces_select_linked_flat', 'F', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi.properties.sharpness = 135.0
-kmi = km.items.new('mesh.select_similar', 'G', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'TAB', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_selection_mode'
-kmi = km.items.new('mesh.hide', 'H', 'PRESS')
-kmi = km.items.new('mesh.hide', 'H', 'PRESS', shift=True)
-kmi.properties.unselected = True
-kmi = km.items.new('mesh.reveal', 'H', 'PRESS', alt=True)
-kmi = km.items.new('mesh.normals_make_consistent', 'N', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.normals_make_consistent', 'N', 'PRESS', shift=True, ctrl=True)
-kmi.properties.inside = True
-kmi = km.items.new('view3d.edit_mesh_extrude_move_normal', 'E', 'PRESS', ctrl=True)
-kmi = km.items.new('view3d.edit_mesh_extrude_individual_move', 'E', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'E', 'PRESS', alt=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_extrude'
-kmi = km.items.new('mesh.spin', 'R', 'PRESS', alt=True)
-kmi = km.items.new('mesh.fill', 'F', 'PRESS', alt=True)
-kmi = km.items.new('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True)
-kmi = km.items.new('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('mesh.rip_move', 'V', 'PRESS')
-kmi = km.items.new('mesh.merge', 'M', 'PRESS', alt=True)
-kmi = km.items.new('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.edge_face_add', 'F', 'PRESS')
-kmi = km.items.new('mesh.duplicate_move', 'D', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', shift=True)
-kmi.properties.name = 'INFO_MT_mesh_add'
-kmi = km.items.new('mesh.separate', 'P', 'PRESS')
-kmi = km.items.new('mesh.split', 'Y', 'PRESS')
-kmi = km.items.new('mesh.dupli_extrude_cursor', 'ACTIONMOUSE', 'CLICK', ctrl=True)
-kmi = km.items.new('mesh.delete', 'X', 'PRESS')
-kmi = km.items.new('mesh.delete', 'DEL', 'PRESS')
-kmi = km.items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', key_modifier='K')
-kmi = km.items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', shift=True, key_modifier='K')
-kmi.properties.type = 'MIDPOINTS'
-kmi = km.items.new('object.vertex_parent_set', 'P', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_specials'
-kmi = km.items.new('wm.call_menu', 'F', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_faces'
-kmi = km.items.new('wm.call_menu', 'E', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_edges'
-kmi = km.items.new('wm.call_menu', 'V', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_edit_mesh_vertices'
-kmi = km.items.new('wm.call_menu', 'H', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_hook'
-kmi = km.items.new('wm.call_menu', 'U', 'PRESS')
-kmi.properties.name = 'VIEW3D_MT_uv_map'
-kmi = km.items.new('wm.call_menu', 'G', 'PRESS', ctrl=True)
-kmi.properties.name = 'VIEW3D_MT_vertex_group'
-kmi = km.items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
-kmi.properties.data_path = 'tool_settings.proportional_edit_falloff'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS')
-kmi.properties.data_path = 'tool_settings.proportional_edit'
-kmi.properties.value_1 = 'DISABLED'
-kmi.properties.value_2 = 'ENABLED'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS', alt=True)
-kmi.properties.data_path = 'tool_settings.proportional_edit'
-kmi.properties.value_1 = 'DISABLED'
-kmi.properties.value_2 = 'CONNECTED'
-kmi = km.items.new('mesh.select_all', 'SELECTMOUSE', 'CLICK')
-kmi.properties.action = 'DESELECT'
-
-wm.keyconfigs.active = kc
-
-bpy.context.user_preferences.edit.use_drag_immediately = True
-bpy.context.user_preferences.edit.use_insertkey_xyz_to_rgb = False
-bpy.context.user_preferences.inputs.select_mouse = 'LEFT'
-bpy.context.user_preferences.inputs.view_zoom_method = 'DOLLY'
-bpy.context.user_preferences.inputs.view_zoom_axis = 'HORIZONTAL'
-bpy.context.user_preferences.inputs.view_rotate_method = 'TURNTABLE'
-bpy.context.user_preferences.inputs.invert_mouse_wheel_zoom = True
diff --git a/release/scripts/presets/render/HDV_1080p.py b/release/scripts/presets/render/HDV_1080p.py
index 7637648e53a..3ba32135c1d 100644
--- a/release/scripts/presets/render/HDV_1080p.py
+++ b/release/scripts/presets/render/HDV_1080p.py
@@ -5,4 +5,4 @@ bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.render.pixel_aspect_x = 4
bpy.context.scene.render.pixel_aspect_y = 3
bpy.context.scene.render.fps = 24
-bpy.context.scene.render.fps_base = 1
+bpy.context.scene.render.fps_base = 1.001
diff --git a/release/scripts/presets/render/HDV_NTSC_1080p.py b/release/scripts/presets/render/HDV_NTSC_1080p.py
new file mode 100644
index 00000000000..2dfa1e0fd1e
--- /dev/null
+++ b/release/scripts/presets/render/HDV_NTSC_1080p.py
@@ -0,0 +1,8 @@
+import bpy
+bpy.context.scene.render.resolution_x = 1440
+bpy.context.scene.render.resolution_y = 1080
+bpy.context.scene.render.resolution_percentage = 100
+bpy.context.scene.render.pixel_aspect_x = 4
+bpy.context.scene.render.pixel_aspect_y = 3
+bpy.context.scene.render.fps = 30
+bpy.context.scene.render.fps_base = 1.001
diff --git a/release/scripts/presets/render/HDV_PAL_1080p.py b/release/scripts/presets/render/HDV_PAL_1080p.py
new file mode 100644
index 00000000000..d8b1c707607
--- /dev/null
+++ b/release/scripts/presets/render/HDV_PAL_1080p.py
@@ -0,0 +1,8 @@
+import bpy
+bpy.context.scene.render.resolution_x = 1440
+bpy.context.scene.render.resolution_y = 1080
+bpy.context.scene.render.resolution_percentage = 100
+bpy.context.scene.render.pixel_aspect_x = 4
+bpy.context.scene.render.pixel_aspect_y = 3
+bpy.context.scene.render.fps = 25
+bpy.context.scene.render.fps_base = 1
diff --git a/release/scripts/templates/gamelogic.py b/release/scripts/templates/gamelogic.py
index 21a901c091b..0a419955b81 100644
--- a/release/scripts/templates/gamelogic.py
+++ b/release/scripts/templates/gamelogic.py
@@ -1,10 +1,7 @@
# This script must be assigned to a python controller
# where it can access the object that owns it and the sensors/actuators that it connects to.
-# GameLogic has been added to the global namespace no need to import
-
-# for keyboard event comparison
-# import GameKeys
+import bge
# support for Vector(), Matrix() types and advanced functions like Matrix.Scale(...) and Matrix.Rotation(...)
# import mathutils
@@ -13,7 +10,7 @@
# import Rasterizer
def main():
- cont = GameLogic.getCurrentController()
+ cont = bge.logic.getCurrentController()
# The KX_GameObject that owns this controller.
own = cont.owner
@@ -57,7 +54,7 @@ def main():
# Loop through all other objects in the scene
- sce = GameLogic.getCurrentScene()
+ sce = bge.logic.getCurrentScene()
print('Scene Objects:', sce.name)
for ob in sce.objects:
print(' ', ob.name, ob.worldPosition)
diff --git a/release/scripts/templates/gamelogic_basic.py b/release/scripts/templates/gamelogic_basic.py
index 5e7d19672fe..c5578a0add9 100644
--- a/release/scripts/templates/gamelogic_basic.py
+++ b/release/scripts/templates/gamelogic_basic.py
@@ -1,7 +1,8 @@
+import bge
def main():
- cont = GameLogic.getCurrentController()
+ cont = bge.logic.getCurrentController()
own = cont.owner
sens = cont.sensors['mySensor']
diff --git a/release/scripts/templates/gamelogic_module.py b/release/scripts/templates/gamelogic_module.py
index 5a61a3592dc..70bd4d9b45b 100644
--- a/release/scripts/templates/gamelogic_module.py
+++ b/release/scripts/templates/gamelogic_module.py
@@ -5,7 +5,7 @@
# * External text modules are supported as long as they are at
# the same location as the blendfile or one of its libraries.
-import GameLogic
+import bge
# variables defined here will only be set once when the
# module is first imported. Set object spesific vars
@@ -23,4 +23,4 @@ def main(cont):
else:
cont.deactivate(actu)
-# dont call main(GameLogic.getCurrentController()), the py controller will
+# dont call main(bge.logic.getCurrentController()), the py controller will
diff --git a/release/scripts/ui/properties_data_armature_rigify.py b/release/scripts/ui/properties_data_armature_rigify.py
index f7961821277..6453ea9e038 100644
--- a/release/scripts/ui/properties_data_armature_rigify.py
+++ b/release/scripts/ui/properties_data_armature_rigify.py
@@ -211,14 +211,23 @@ class Graph(bpy.types.Operator):
import bpy
reload(graphviz_export)
obj = bpy.context.object
- path = os.path.splitext(bpy.data.filepath)[0] + "-" + bpy.path.clean_name(obj.name)
+ if(bpy.data.filepath):
+ path = os.path.splitext(bpy.data.filepath)[0] + "-" + bpy.path.clean_name(obj.name)
+ else:
+ import tempfile
+ path = tempfile.mktemp(prefix=bpy.app.tempdir) + "-" + bpy.path.clean_name(obj.name)
path_dot = path + ".dot"
path_png = path + ".png"
saved = graphviz_export.graph_armature(bpy.context.object, path_dot, CONSTRAINTS=False, DRIVERS=False)
if saved:
# if we seriously want this working everywhere we'll need some new approach
- os.system("dot -Tpng %s > %s; gnome-open %s &" % (path_dot, path_png, path_png))
+ os.system("dot -Tpng %r > %r" % (path_dot, path_png))
+ if not os.path.exists(path_png) or os.stat(path_png)[6] == 0:
+ self.report('ERROR', "Graphvis could not create %r check graphviz is installed" % path_png)
+ return {'CANCELLED'}
+
+ bpy.ops.image.external_edit(filepath=path_png)
#os.system("python /b/xdot.py '%s' &" % path_dot)
return {'FINISHED'}
diff --git a/release/scripts/ui/properties_data_mesh.py b/release/scripts/ui/properties_data_mesh.py
index 3af0d6a33ac..c098101622e 100644
--- a/release/scripts/ui/properties_data_mesh.py
+++ b/release/scripts/ui/properties_data_mesh.py
@@ -182,7 +182,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
enable_edit = ob.mode != 'EDIT'
enable_edit_value = False
- if ob.show_shape_key is False:
+ if ob.show_only_shape_key is False:
if enable_edit or (ob.type == 'MESH' and ob.use_shape_key_edit_mode):
enable_edit_value = True
@@ -218,7 +218,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
sub = row.row(align=True)
subsub = sub.row(align=True)
subsub.active = enable_edit_value
- subsub.prop(ob, "show_shape_key", text="")
+ subsub.prop(ob, "show_only_shape_key", text="")
subsub.prop(kb, "mute", text="")
sub.prop(ob, "use_shape_key_edit_mode", text="")
diff --git a/release/scripts/ui/properties_object.py b/release/scripts/ui/properties_object.py
index dd242723cac..2532a99b402 100644
--- a/release/scripts/ui/properties_object.py
+++ b/release/scripts/ui/properties_object.py
@@ -68,6 +68,31 @@ class OBJECT_PT_transform(ObjectButtonsPanel, bpy.types.Panel):
row.column().prop(ob, "scale")
layout.prop(ob, "rotation_mode")
+
+class OBJECT_PT_delta_transform(ObjectButtonsPanel, bpy.types.Panel):
+ bl_label = "Delta Transform"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+
+ row = layout.row()
+
+ row.column().prop(ob, "delta_location")
+ if ob.rotation_mode == 'QUATERNION':
+ row.column().prop(ob, "delta_rotation_quaternion", text="Rotation")
+ elif ob.rotation_mode == 'AXIS_ANGLE':
+ #row.column().label(text="Rotation")
+ #row.column().prop(pchan, "delta_rotation_angle", text="Angle")
+ #row.column().prop(pchan, "delta_rotation_axis", text="Axis")
+ #row.column().prop(ob, "delta_rotation_axis_angle", text="Rotation")
+ row.column().label(ob, text="Not for Axis-Angle")
+ else:
+ row.column().prop(ob, "delta_rotation_euler", text="Rotation")
+
+ row.column().prop(ob, "delta_scale")
class OBJECT_PT_transform_locks(ObjectButtonsPanel, bpy.types.Panel):
@@ -251,9 +276,6 @@ class OBJECT_PT_animation(ObjectButtonsPanel, bpy.types.Panel):
col.label(text="Time Offset:")
col.prop(ob, "use_time_offset_edit", text="Edit")
row = col.row()
- row.prop(ob, "use_time_offset_particle", text="Particle")
- row.active = bool(ob.particle_systems)
- row = col.row()
row.prop(ob, "use_time_offset_parent", text="Parent")
row.active = (ob.parent is not None)
row = col.row()
diff --git a/release/scripts/ui/properties_particle.py b/release/scripts/ui/properties_particle.py
index 7f630d6e5ff..ff49b0e4e9f 100644
--- a/release/scripts/ui/properties_particle.py
+++ b/release/scripts/ui/properties_particle.py
@@ -28,12 +28,10 @@ from properties_physics_common import basic_force_field_falloff_ui
def particle_panel_enabled(context, psys):
phystype = psys.settings.physics_type
- if phystype == 'NO' or phystype == 'KEYED':
+ if psys.settings.type in ('EMITTER', 'REACTOR') and phystype in ('NO', 'KEYED'):
return True
- if psys.settings.type in ('EMITTER', 'REACTOR') or (psys.settings.type == 'HAIR' and psys.use_hair_dynamics):
- return (psys.point_cache.is_baked is False) and (not psys.is_edited) and (not context.particle_system_editable)
else:
- return True
+ return (psys.point_cache.is_baked is False) and (not psys.is_edited) and (not context.particle_system_editable)
def particle_panel_poll(cls, context):
diff --git a/release/scripts/ui/properties_render.py b/release/scripts/ui/properties_render.py
index dba9ff44d51..44f1223aa93 100644
--- a/release/scripts/ui/properties_render.py
+++ b/release/scripts/ui/properties_render.py
@@ -84,10 +84,11 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel):
col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
+ row = layout.row()
rl = rd.layers.active
-
if rl:
- layout.prop(rl, "name")
+ row.prop(rl, "name")
+ row.prop(rd, "use_single_layer", text="", icon_only=True)
split = layout.split()
diff --git a/release/scripts/ui/properties_texture.py b/release/scripts/ui/properties_texture.py
index 295078dc1a5..bc59a3259c5 100644
--- a/release/scripts/ui/properties_texture.py
+++ b/release/scripts/ui/properties_texture.py
@@ -865,10 +865,11 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel):
layout.template_image(tex, "image", tex.image_user, compact=True)
#layout.prop(vd, "frame_duration")
- layout.prop(vd, "use_still_frame")
- row = layout.row()
- row.active = vd.use_still_frame
- row.prop(vd, "still_frame")
+ if vd.file_format in ('BLENDER_VOXEL', 'RAW_8BIT'):
+ layout.prop(vd, "use_still_frame")
+ row = layout.row()
+ row.active = vd.use_still_frame
+ row.prop(vd, "still_frame")
layout.prop(vd, "interpolation")
layout.prop(vd, "extension")
diff --git a/release/scripts/ui/space_image.py b/release/scripts/ui/space_image.py
index d2e5046c816..d46220ad7b9 100644
--- a/release/scripts/ui/space_image.py
+++ b/release/scripts/ui/space_image.py
@@ -250,6 +250,47 @@ class IMAGE_MT_uvs(bpy.types.Menu):
layout.separator()
layout.menu("IMAGE_MT_uvs_showhide")
+
+class IMAGE_MT_uvs_select_mode(bpy.types.Menu):
+ bl_label = "UV Select Mode"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ toolsettings = context.tool_settings
+
+ # do smart things depending on whether uv_select_sync is on
+
+ if toolsettings.use_uv_select_sync:
+ prop = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL')
+ prop.value = "(True, False, False)"
+ prop.data_path = "tool_settings.mesh_select_mode"
+
+ prop = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL')
+ prop.value = "(False, True, False)"
+ prop.data_path = "tool_settings.mesh_select_mode"
+
+ prop = layout.operator("wm.context_set_value", text="Face", icon='FACESEL')
+ prop.value = "(False, False, True)"
+ prop.data_path = "tool_settings.mesh_select_mode"
+
+ else:
+ prop = layout.operator("wm.context_set_string", text="Vertex", icon='UV_VERTEXSEL')
+ prop.value = "VERTEX"
+ prop.data_path = "tool_settings.uv_select_mode"
+
+ prop = layout.operator("wm.context_set_string", text="Edge", icon='UV_EDGESEL')
+ prop.value = "EDGE"
+ prop.data_path = "tool_settings.uv_select_mode"
+
+ prop = layout.operator("wm.context_set_string", text="Face", icon='UV_FACESEL')
+ prop.value = "FACE"
+ prop.data_path = "tool_settings.uv_select_mode"
+
+ prop = layout.operator("wm.context_set_string", text="Island", icon='UV_ISLANDSEL')
+ prop.value = "ISLAND"
+ prop.data_path = "tool_settings.uv_select_mode"
class IMAGE_HT_header(bpy.types.Header):
diff --git a/release/scripts/ui/space_info.py b/release/scripts/ui/space_info.py
index fb700104b14..d9ddc4a470b 100644
--- a/release/scripts/ui/space_info.py
+++ b/release/scripts/ui/space_info.py
@@ -119,7 +119,7 @@ class INFO_MT_file(bpy.types.Menu):
layout.separator()
layout.operator_context = 'EXEC_AREA'
- layout.operator("wm.exit_blender", text="Quit", icon='QUIT')
+ layout.operator("wm.quit_blender", text="Quit", icon='QUIT')
class INFO_MT_file_import(bpy.types.Menu):
@@ -219,6 +219,18 @@ class INFO_MT_surface_add(bpy.types.Menu):
layout.operator("surface.primitive_nurbs_surface_sphere_add", icon='SURFACE_NSPHERE', text="NURBS Sphere")
layout.operator("surface.primitive_nurbs_surface_torus_add", icon='SURFACE_NTORUS', text="NURBS Torus")
+class INFO_MT_curve_handle_type_set(bpy.types.Menu):
+ bl_idname = "INFO_MT_curve_handle_type_set"
+ bl_label = "Handle Type"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ layout.operator("curve.handle_type_set", text="Automatic").type = "AUTOMATIC"
+ layout.operator("curve.handle_type_set", text="Vector").type = "VECTOR"
+ layout.operator("curve.handle_type_set", text="Align").type = "ALIGN"
+ layout.operator("curve.handle_type_set", text="Free Align").type = "FREE_ALIGN"
+
class INFO_MT_armature_add(bpy.types.Menu):
bl_idname = "INFO_MT_armature_add"
@@ -333,7 +345,11 @@ class INFO_MT_help(bpy.types.Menu):
layout.separator()
layout.operator("wm.url_open", text="Python API Reference", icon='URL').url = "http://www.blender.org/documentation/blender_python_api_%s/contents.html" % "_".join(str(v) for v in bpy.app.version)
layout.operator("help.operator_cheat_sheet", icon='TEXT')
+ layout.operator("wm.sysinfo", icon='TEXT')
layout.separator()
+ if bpy.app.build_platform[0:7] == 'Windows':
+ layout.operator("wm.toggle_console", icon='CONSOLE')
+ layout.separator()
layout.operator("anim.update_data_paths", text="FCurve/Driver 2.54 fix", icon='HELP')
layout.separator()
layout.operator("wm.splash")
@@ -354,7 +370,7 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
for op_submodule_name in dir(op_module):
op = getattr(op_module, op_submodule_name)
text = repr(op)
- if text.startswith('bpy.ops.'):
+ if text.split("\n")[-1].startswith('bpy.ops.'):
op_strings.append(text)
tot += 1
diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py
index f601b255510..40bb5bc4b55 100644
--- a/release/scripts/ui/space_userpref.py
+++ b/release/scripts/ui/space_userpref.py
@@ -127,7 +127,11 @@ class USERPREF_MT_splash(bpy.types.Menu):
row.label("")
row = split.row()
row.label("Interaction:")
- row.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label)
+ # XXX, no redraws
+ # text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
+ # if not text:
+ # text = "Blender (default)"
+ row.menu("USERPREF_MT_keyconfigs", text="Preset")
class USERPREF_PT_interface(bpy.types.Panel):
diff --git a/release/scripts/ui/space_userpref_keymap.py b/release/scripts/ui/space_userpref_keymap.py
index 0cdebd4734c..70fb2c57e9b 100644
--- a/release/scripts/ui/space_userpref_keymap.py
+++ b/release/scripts/ui/space_userpref_keymap.py
@@ -124,7 +124,7 @@ def _merge_keymaps(kc1, kc2):
return merged_keymaps
-class PREFS_MT_keyconfigs(bpy.types.Menu):
+class USERPREF_MT_keyconfigs(bpy.types.Menu):
bl_label = "KeyPresets"
preset_subdir = "keyconfig"
preset_operator = "wm.keyconfig_activate"
@@ -384,7 +384,7 @@ class InputKeyMapPanel(bpy.types.Panel):
text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
if not text:
text = "Blender (default)"
- row.menu("PREFS_MT_keyconfigs", text=text)
+ row.menu("USERPREF_MT_keyconfigs", text=text)
row.operator("wm.keyconfig_preset_add", text="", icon="ZOOMIN")
row.operator("wm.keyconfig_preset_add", text="", icon="ZOOMOUT").remove_active = True
diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py
index 7df932f6800..79de93c26e9 100644
--- a/release/scripts/ui/space_view3d.py
+++ b/release/scripts/ui/space_view3d.py
@@ -1393,7 +1393,7 @@ class VIEW3D_MT_edit_mesh_specials(bpy.types.Menu):
layout.operator("mesh.select_vertex_path")
-class VIEW3D_MT_edit_mesh_selection_mode(bpy.types.Menu):
+class VIEW3D_MT_edit_mesh_select_mode(bpy.types.Menu):
bl_label = "Mesh Select Mode"
def draw(self, context):
@@ -1417,82 +1417,35 @@ class VIEW3D_MT_edit_mesh_selection_mode(bpy.types.Menu):
class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
bl_label = "Extrude"
+ _extrude_funcs = { \
+ "VERT": lambda layout: layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
+ "EDGE": lambda layout: layout.operator("mesh.extrude_edges_move", text="Edges Only"),
+ "FACE": lambda layout: layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
+ "REGION": lambda layout: layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
+ }
+
@staticmethod
def extrude_options(context):
mesh = context.object.data
- selection_mode = context.tool_settings.mesh_select_mode
-
- totface = mesh.total_face_sel
- totedge = mesh.total_edge_sel
- totvert = mesh.total_vert_sel
+ select_mode = context.tool_settings.mesh_select_mode
- # the following is dependent on selection modes
- # we don't really want that
-# if selection_mode[0]: # vert
-# if totvert == 0:
-# return ()
-# elif totvert == 1:
-# return (3,)
-# elif totedge == 0:
-# return (3,)
-# elif totface == 0:
-# return (2, 3)
-# elif totface == 1:
-# return (0, 2, 3)
-# else:
-# return (0, 1, 2, 3)
-# elif selection_mode[1]: # edge
-# if totedge == 0:
-# return ()
-# elif totedge == 1:
-# return (2,)
-# elif totface == 0:
-# return (2,)
-# elif totface == 1:
-# return (0, 2)
-# else:
-# return (0, 1, 2)
-# elif selection_mode[2]: # face
-# if totface == 0:
-# return ()
-# elif totface == 1:
-# return (0,)
-# else:
-# return (0, 1)
-
- if totvert == 0:
- return ()
- elif totedge == 0:
- return (0, 3)
- elif totface == 0:
- return (0, 2, 3)
- else:
- return (0, 1, 2, 3)
+ menu = []
+ if mesh.total_face_sel:
+ menu += ["REGION", "FACE"]
+ if mesh.total_edge_sel and (select_mode[0] or select_mode[1]):
+ menu += ["EDGE"]
+ if mesh.total_vert_sel and select_mode[0]:
+ menu += ["VERT"]
# should never get here
- return ()
+ return menu
def draw(self, context):
layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
- def region_menu():
- layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region")
-
- def face_menu():
- layout.operator("mesh.extrude_faces_move", text="Individual Faces")
-
- def edge_menu():
- layout.operator("mesh.extrude_edges_move", text="Edges Only")
-
- def vert_menu():
- layout.operator("mesh.extrude_vertices_move", text="Vertices Only")
-
- menu_funcs = region_menu, face_menu, edge_menu, vert_menu
-
- for i in self.extrude_options(context):
- func = menu_funcs[i]
- func()
+ for menu_id in self.extrude_options(context):
+ self._extrude_funcs[menu_id](layout)
class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator):
@@ -1502,17 +1455,17 @@ class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator):
def execute(self, context):
mesh = context.object.data
- selection_mode = context.tool_settings.mesh_select_mode
+ select_mode = context.tool_settings.mesh_select_mode
totface = mesh.total_face_sel
totedge = mesh.total_edge_sel
totvert = mesh.total_vert_sel
- if selection_mode[2] and totface == 1:
+ if select_mode[2] and totface == 1:
return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate={"constraint_orientation": "NORMAL", "constraint_axis": [False, False, True]})
- elif selection_mode[2] and totface > 1:
+ elif select_mode[2] and totface > 1:
return bpy.ops.mesh.extrude_faces_move('INVOKE_REGION_WIN')
- elif selection_mode[1] and totedge >= 1:
+ elif select_mode[1] and totedge >= 1:
return bpy.ops.mesh.extrude_edges_move('INVOKE_REGION_WIN')
else:
return bpy.ops.mesh.extrude_vertices_move('INVOKE_REGION_WIN')
@@ -1926,7 +1879,7 @@ class VIEW3D_MT_edit_armature(bpy.types.Menu):
layout.separator()
- layout.operator("armature.subdivide_multi", text="Subdivide")
+ layout.operator("armature.subdivide", text="Subdivide")
layout.operator("armature.switch_direction", text="Switch Direction")
layout.separator()
@@ -1960,7 +1913,7 @@ class VIEW3D_MT_armature_specials(bpy.types.Menu):
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("armature.subdivide_multi", text="Subdivide")
+ layout.operator("armature.subdivide", text="Subdivide")
layout.operator("armature.switch_direction", text="Switch Direction")
layout.separator()
diff --git a/release/scripts/ui/space_view3d_toolbar.py b/release/scripts/ui/space_view3d_toolbar.py
index ec6f8ed1f3f..6b140591418 100644
--- a/release/scripts/ui/space_view3d_toolbar.py
+++ b/release/scripts/ui/space_view3d_toolbar.py
@@ -311,7 +311,7 @@ class VIEW3D_PT_tools_armatureedit(View3DPanel, bpy.types.Panel):
col = layout.column(align=True)
col.label(text="Modeling:")
col.operator("armature.extrude_move")
- col.operator("armature.subdivide_multi", text="Subdivide")
+ col.operator("armature.subdivide", text="Subdivide")
col = layout.column(align=True)
col.label(text="Repeat:")