diff options
Diffstat (limited to 'release/scripts/op/wm.py')
-rw-r--r-- | release/scripts/op/wm.py | 281 |
1 files changed, 195 insertions, 86 deletions
diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py index c5f465a435a..89e9641ba93 100644 --- a/release/scripts/op/wm.py +++ b/release/scripts/op/wm.py @@ -23,17 +23,19 @@ import bpy from bpy.props import * from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear + class MESH_OT_delete_edgeloop(bpy.types.Operator): '''Delete an edge loop by merging the faces on each side to a single face loop''' bl_idname = "mesh.delete_edgeloop" bl_label = "Delete Edge Loop" def execute(self, context): - bpy.ops.transform.edge_slide(value=1.0) - bpy.ops.mesh.select_more() - bpy.ops.mesh.remove_doubles() + if 'FINISHED' in bpy.ops.transform.edge_slide(value=1.0): + bpy.ops.mesh.select_more() + bpy.ops.mesh.remove_doubles() + return {'FINISHED'} - return {'FINISHED'} + return {'CANCELLED'} rna_path_prop = StringProperty(name="Context Attributes", description="rna context string", maxlen=1024, default="") @@ -49,7 +51,7 @@ rna_relative_prop = BoolProperty(name="Relative", def context_path_validate(context, data_path): import sys try: - value = eval("context.%s" % data_path) + value = eval("context.%s" % data_path) if data_path else Ellipsis except AttributeError: if "'NoneType'" in str(sys.exc_info()[1]): # One of the items in the rna path is None, just ignore this @@ -62,17 +64,45 @@ def context_path_validate(context, data_path): def execute_context_assign(self, context): - if context_path_validate(context, self.properties.data_path) is Ellipsis: + if context_path_validate(context, self.data_path) is Ellipsis: return {'PASS_THROUGH'} - if getattr(self.properties, "relative", False): - exec("context.%s+=self.properties.value" % self.properties.data_path) + if getattr(self, "relative", False): + exec("context.%s+=self.value" % self.data_path) else: - exec("context.%s=self.properties.value" % self.properties.data_path) + exec("context.%s=self.value" % self.data_path) return {'FINISHED'} +class BRUSH_OT_set_active_number(bpy.types.Operator): + '''Set active sculpt/paint brush from it's number''' + bl_idname = "brush.set_active_number" + bl_label = "Set Brush Number" + + mode = StringProperty(name="mode", + description="Paint mode to set brush for", maxlen=1024) + number = IntProperty(name="number", + description="Brush number") + + _attr_dict = {"sculpt": "use_paint_sculpt", + "vertex_paint": "use_paint_vertex", + "weight_paint": "use_paint_weight", + "image_paint": "use_paint_texture"} + + def execute(self, context): + attr = self._attr_dict.get(self.mode) + if attr is None: + return {'CANCELLED'} + + for i, brush in enumerate((cur for cur in bpy.data.brushes if getattr(cur, attr))): + if i == self.number: + getattr(context.tool_settings, self.mode).brush = brush + return {'FINISHED'} + + return {'CANCELLED'} + + class WM_OT_context_set_boolean(bpy.types.Operator): '''Set a context value.''' bl_idname = "wm.context_set_boolean" @@ -86,7 +116,7 @@ class WM_OT_context_set_boolean(bpy.types.Operator): execute = execute_context_assign -class WM_OT_context_set_int(bpy.types.Operator): # same as enum +class WM_OT_context_set_int(bpy.types.Operator): # same as enum '''Set a context value.''' bl_idname = "wm.context_set_int" bl_label = "Context Set" @@ -99,7 +129,7 @@ class WM_OT_context_set_int(bpy.types.Operator): # same as enum execute = execute_context_assign -class WM_OT_context_scale_int(bpy.types.Operator): # same as enum +class WM_OT_context_scale_int(bpy.types.Operator): '''Scale an int context value.''' bl_idname = "wm.context_scale_int" bl_label = "Context Set" @@ -112,16 +142,16 @@ class WM_OT_context_scale_int(bpy.types.Operator): # same as enum default=True) def execute(self, context): - if context_path_validate(context, self.properties.data_path) is Ellipsis: + if context_path_validate(context, self.data_path) is Ellipsis: return {'PASS_THROUGH'} - value = self.properties.value - data_path = self.properties.data_path + value = self.value + data_path = self.data_path - if value == 1.0: # nothing to do + if value == 1.0: # nothing to do return {'CANCELLED'} - if getattr(self.properties, "always_step", False): + if getattr(self, "always_step", False): if value > 1.0: add = "1" func = "max" @@ -130,12 +160,12 @@ class WM_OT_context_scale_int(bpy.types.Operator): # same as enum func = "min" exec("context.%s = %s(round(context.%s * value), context.%s + %s)" % (data_path, func, data_path, data_path, add)) else: - exec("context.%s *= value" % self.properties.data_path) + exec("context.%s *= value" % self.data_path) return {'FINISHED'} -class WM_OT_context_set_float(bpy.types.Operator): # same as enum +class WM_OT_context_set_float(bpy.types.Operator): # same as enum '''Set a context value.''' bl_idname = "wm.context_set_float" bl_label = "Context Set Float" @@ -149,7 +179,7 @@ class WM_OT_context_set_float(bpy.types.Operator): # same as enum execute = execute_context_assign -class WM_OT_context_set_string(bpy.types.Operator): # same as enum +class WM_OT_context_set_string(bpy.types.Operator): # same as enum '''Set a context value.''' bl_idname = "wm.context_set_string" bl_label = "Context Set String" @@ -188,9 +218,9 @@ class WM_OT_context_set_value(bpy.types.Operator): maxlen=1024, default="") def execute(self, context): - if context_path_validate(context, self.properties.data_path) is Ellipsis: + if context_path_validate(context, self.data_path) is Ellipsis: return {'PASS_THROUGH'} - exec("context.%s=%s" % (self.properties.data_path, self.properties.value)) + exec("context.%s=%s" % (self.data_path, self.value)) return {'FINISHED'} @@ -204,11 +234,11 @@ class WM_OT_context_toggle(bpy.types.Operator): def execute(self, context): - if context_path_validate(context, self.properties.data_path) is Ellipsis: + if context_path_validate(context, self.data_path) is Ellipsis: return {'PASS_THROUGH'} exec("context.%s=not (context.%s)" % - (self.properties.data_path, self.properties.data_path)) + (self.data_path, self.data_path)) return {'FINISHED'} @@ -228,20 +258,20 @@ class WM_OT_context_toggle_enum(bpy.types.Operator): def execute(self, context): - if context_path_validate(context, self.properties.data_path) is Ellipsis: + if context_path_validate(context, self.data_path) is Ellipsis: return {'PASS_THROUGH'} exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \ - (self.properties.data_path, self.properties.value_1,\ - self.properties.value_2, self.properties.data_path, - self.properties.value_2)) + (self.data_path, self.value_1,\ + self.value_2, self.data_path, + self.value_2)) return {'FINISHED'} class WM_OT_context_cycle_int(bpy.types.Operator): - '''Set a context value. Useful for cycling active material, - vertex keys, groups' etc.''' + '''Set a context value. Useful for cycling active material, ''' + '''vertex keys, groups' etc.''' bl_idname = "wm.context_cycle_int" bl_label = "Context Int Cycle" bl_options = {'UNDO'} @@ -250,12 +280,12 @@ class WM_OT_context_cycle_int(bpy.types.Operator): reverse = rna_reverse_prop def execute(self, context): - data_path = self.properties.data_path + data_path = self.data_path value = context_path_validate(context, data_path) if value is Ellipsis: return {'PASS_THROUGH'} - if self.properties.reverse: + if self.reverse: value -= 1 else: value += 1 @@ -264,10 +294,10 @@ class WM_OT_context_cycle_int(bpy.types.Operator): if value != eval("context.%s" % data_path): # relies on rna clamping int's out of the range - if self.properties.reverse: - value = (1 << 32) + if self.reverse: + value = (1 << 31) - 1 else: - value = - (1 << 32) + value = -1 << 31 exec("context.%s=value" % data_path) @@ -285,14 +315,14 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): def execute(self, context): - value = context_path_validate(context, self.properties.data_path) + value = context_path_validate(context, self.data_path) if value is Ellipsis: return {'PASS_THROUGH'} orig_value = value # Have to get rna enum values - rna_struct_str, rna_prop_str = self.properties.data_path.rsplit('.', 1) + rna_struct_str, rna_prop_str = self.data_path.rsplit('.', 1) i = rna_prop_str.find('[') # just incse we get "context.foo.bar[0]" @@ -310,11 +340,11 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): orig_index = enums.index(orig_value) # Have the info we need, advance to the next item - if self.properties.reverse: + if self.reverse: if orig_index == 0: advance_enum = enums[-1] else: - advance_enum = enums[orig_index-1] + advance_enum = enums[orig_index - 1] else: if orig_index == len(enums) - 1: advance_enum = enums[0] @@ -322,10 +352,71 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): advance_enum = enums[orig_index + 1] # set the new value - exec("context.%s=advance_enum" % self.properties.data_path) + exec("context.%s=advance_enum" % self.data_path) return {'FINISHED'} +class WM_OT_context_cycle_array(bpy.types.Operator): + '''Set a context array value. + Useful for cycling the active mesh edit mode.''' + bl_idname = "wm.context_cycle_array" + bl_label = "Context Array Cycle" + bl_options = {'UNDO'} + + data_path = rna_path_prop + reverse = rna_reverse_prop + + def execute(self, context): + data_path = self.data_path + value = context_path_validate(context, data_path) + if value is Ellipsis: + return {'PASS_THROUGH'} + + def cycle(array): + if self.reverse: + array.insert(0, array.pop()) + else: + array.append(array.pop(0)) + return array + + exec("context.%s=cycle(context.%s[:])" % (data_path, data_path)) + + return {'FINISHED'} + + +class WM_MT_context_menu_enum(bpy.types.Menu): + bl_label = "" + data_path = "" # BAD DESIGN, set from operator below. + + def draw(self, context): + data_path = self.data_path + value = context_path_validate(bpy.context, data_path) + if value is Ellipsis: + return {'PASS_THROUGH'} + base_path, prop_string = data_path.rsplit(".", 1) + value_base = context_path_validate(context, base_path) + + values = [(i.name, i.identifier) for i in value_base.bl_rna.properties[prop_string].items] + + for name, identifier in values: + prop = self.layout.operator("wm.context_set_enum", text=name) + prop.data_path = data_path + prop.value = identifier + + +class WM_OT_context_menu_enum(bpy.types.Operator): + bl_idname = "wm.context_menu_enum" + bl_label = "Context Enum Menu" + bl_options = {'UNDO'} + data_path = rna_path_prop + + def execute(self, context): + data_path = self.data_path + WM_MT_context_menu_enum.data_path = data_path + bpy.ops.wm.call_menu(name="WM_MT_context_menu_enum") + return {'PASS_THROUGH'} + + class WM_OT_context_set_id(bpy.types.Operator): '''Toggle a context value.''' bl_idname = "wm.context_set_id" @@ -337,8 +428,8 @@ class WM_OT_context_set_id(bpy.types.Operator): description="Assign value", maxlen=1024, default="") def execute(self, context): - value = self.properties.value - data_path = self.properties.data_path + value = self.value + data_path = self.data_path # match the pointer type from the target property to bpy.data.* # so we lookup the correct list. @@ -380,8 +471,8 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): initial_x = IntProperty(options={'HIDDEN'}) def _values_store(self, context): - data_path_iter = self.properties.data_path_iter - data_path_item = self.properties.data_path_item + data_path_iter = self.data_path_iter + data_path_item = self.data_path_item self._values = values = {} @@ -400,11 +491,11 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): values[item] = value_orig def _values_delta(self, delta): - delta *= self.properties.input_scale - if self.properties.invert: + delta *= self.input_scale + if self.invert: delta = - delta - data_path_item = self.properties.data_path_item + data_path_item = self.data_path_item for item, value_orig in self._values.items(): if type(value_orig) == int: exec("item.%s = int(%d)" % (data_path_item, round(value_orig + delta))) @@ -412,7 +503,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): exec("item.%s = %f" % (data_path_item, value_orig + delta)) def _values_restore(self): - data_path_item = self.properties.data_path_item + data_path_item = self.data_path_item for item, value_orig in self._values.items(): exec("item.%s = %s" % (data_path_item, value_orig)) @@ -425,7 +516,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): event_type = event.type if event_type == 'MOUSEMOVE': - delta = event.mouse_x - self.properties.initial_x + delta = event.mouse_x - self.initial_x self._values_delta(delta) elif 'LEFTMOUSE' == event_type: @@ -443,13 +534,13 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): if not self._values: self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" % - (self.properties.data_path_iter, self.properties.data_path_item)) + (self.data_path_iter, self.data_path_item)) return {'CANCELLED'} else: - self.properties.initial_x = event.mouse_x + self.initial_x = event.mouse_x - context.window_manager.add_modal_handler(self) + context.window_manager.modal_handler_add(self) return {'RUNNING_MODAL'} @@ -462,7 +553,7 @@ class WM_OT_url_open(bpy.types.Operator): def execute(self, context): import webbrowser - webbrowser.open(self.properties.url) + webbrowser.open(self.url) return {'FINISHED'} @@ -471,14 +562,14 @@ class WM_OT_path_open(bpy.types.Operator): bl_idname = "wm.path_open" bl_label = "" - filepath = StringProperty(name="File Path", maxlen=1024) + filepath = StringProperty(name="File Path", maxlen=1024, subtype='FILE_PATH') def execute(self, context): import sys import os import subprocess - filepath = bpy.path.abspath(self.properties.filepath) + filepath = bpy.path.abspath(self.filepath) filepath = os.path.normpath(filepath) if not os.path.exists(filepath): @@ -513,13 +604,13 @@ class WM_OT_doc_view(bpy.types.Operator): while class_obj: ls.insert(0, class_obj) class_obj = class_obj.nested - return '.'.join([class_obj.identifier for class_obj in ls]) + return '.'.join(class_obj.identifier for class_obj in ls) def execute(self, context): - id_split = self.properties.doc_id.split('.') - if len(id_split) == 1: # rna, class + id_split = self.doc_id.split('.') + if len(id_split) == 1: # rna, class url = '%s/bpy.types.%s.html' % (self._prefix, id_split[0]) - elif len(id_split) == 2: # rna, class.prop + elif len(id_split) == 2: # rna, class.prop class_name, class_prop = id_split if hasattr(bpy.types, class_name.upper() + '_OT_' + class_prop): @@ -562,8 +653,8 @@ class WM_OT_doc_edit(bpy.types.Operator): def execute(self, context): - doc_id = self.properties.doc_id - doc_new = self.properties.doc_new + doc_id = self.doc_id + doc_new = self.doc_new class_name, class_prop = doc_id.split('.') @@ -603,9 +694,8 @@ class WM_OT_doc_edit(bpy.types.Operator): def draw(self, context): layout = self.layout - props = self.properties - layout.label(text="Descriptor ID: '%s'" % props.doc_id) - layout.prop(props, "doc_new", text="") + layout.label(text="Descriptor ID: '%s'" % self.doc_id) + layout.prop(self, "doc_new", text="") def invoke(self, context, event): wm = context.window_manager @@ -632,6 +722,7 @@ class WM_OT_properties_edit(bpy.types.Operator): '''Internal use (edit a property data_path)''' bl_idname = "wm.properties_edit" bl_label = "Edit Property" + bl_options = {'REGISTER'} # only because invoke_props_popup requires. data_path = rna_path property = rna_property @@ -641,9 +732,9 @@ class WM_OT_properties_edit(bpy.types.Operator): description = StringProperty(name="Tip", default="") def execute(self, context): - data_path = self.properties.data_path - value = self.properties.value - prop = self.properties.property + data_path = self.data_path + value = self.value + prop = self.property prop_old = self._last_prop[0] try: @@ -659,7 +750,6 @@ class WM_OT_properties_edit(bpy.types.Operator): # print(exec_str) exec(exec_str) - # Reassign exec_str = "item['%s'] = %s" % (prop, repr(value_eval)) # print(exec_str) @@ -672,32 +762,28 @@ class WM_OT_properties_edit(bpy.types.Operator): if prop_type in (float, int): - prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.properties.min) - prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.properties.max) + prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.min) + prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.max) - prop_ui['description'] = self.properties.description + prop_ui['description'] = self.description return {'FINISHED'} def invoke(self, context, event): - self._last_prop = [self.properties.property] + self._last_prop = [self.property] - item = eval("context.%s" % self.properties.data_path) + item = eval("context.%s" % self.data_path) # setup defaults - prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create + prop_ui = rna_idprop_ui_prop_get(item, self.property, False) # dont create if prop_ui: - self.properties.min = prop_ui.get("min", -1000000000) - self.properties.max = prop_ui.get("max", 1000000000) - self.properties.description = prop_ui.get("description", "") + self.min = prop_ui.get("min", -1000000000) + self.max = prop_ui.get("max", 1000000000) + self.description = prop_ui.get("description", "") wm = context.window_manager - # This crashes, TODO - fix - #return wm.invoke_props_popup(self, event) - - wm.invoke_props_popup(self, event) - return {'RUNNING_MODAL'} + return wm.invoke_props_dialog(self) class WM_OT_properties_add(bpy.types.Operator): @@ -708,7 +794,7 @@ class WM_OT_properties_add(bpy.types.Operator): data_path = rna_path def execute(self, context): - item = eval("context.%s" % self.properties.data_path) + item = eval("context.%s" % self.data_path) def unique_name(names): prop = 'prop' @@ -735,16 +821,39 @@ class WM_OT_properties_remove(bpy.types.Operator): property = rna_property def execute(self, context): - item = eval("context.%s" % self.properties.data_path) - del item[self.properties.property] + item = eval("context.%s" % self.data_path) + del item[self.property] return {'FINISHED'} + +class WM_OT_keyconfig_activate(bpy.types.Operator): + bl_idname = "wm.keyconfig_activate" + bl_label = "Activate Keyconfig" + + filepath = StringProperty(name="File Path", maxlen=1024) + + def execute(self, context): + 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 + bpy.utils.register_module(__name__) def unregister(): - pass + bpy.utils.unregister_module(__name__) if __name__ == "__main__": register() |