diff options
Diffstat (limited to 'release')
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:") |