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/scripts/op/wm.py')
-rw-r--r--release/scripts/op/wm.py281
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()