| 
									
										
										
										
											2009-11-04 20:50:09 +00:00
										 |  |  | # ##### 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. | 
					
						
							| 
									
										
										
										
											2009-11-21 23:55:14 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-11-04 20:50:09 +00:00
										 |  |  | #  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. | 
					
						
							| 
									
										
										
										
											2009-11-21 23:55:14 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-11-04 20:50:09 +00:00
										 |  |  | #  You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | #  along with this program; if not, write to the Free Software Foundation, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  | #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2009-11-04 20:50:09 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # ##### END GPL LICENSE BLOCK ##### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-09 19:12:03 +00:00
										 |  |  | # <pep8 compliant> | 
					
						
							| 
									
										
										
										
											2009-11-04 20:50:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | import bpy | 
					
						
							| 
									
										
										
										
											2011-02-27 15:25:24 +00:00
										 |  |  | from bpy.props import StringProperty, BoolProperty, IntProperty, FloatProperty | 
					
						
							| 
									
										
										
										
											2010-08-02 22:52:55 +00:00
										 |  |  | from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-08 01:03:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | class MESH_OT_delete_edgeloop(bpy.types.Operator): | 
					
						
							| 
									
										
										
										
											2010-05-14 07:20:16 +00:00
										 |  |  |     '''Delete an edge loop by merging the faces on each side to a single face loop''' | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     bl_idname = "mesh.delete_edgeloop" | 
					
						
							|  |  |  |     bl_label = "Delete Edge Loop" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-12-05 00:08:25 +00:00
										 |  |  |         if 'FINISHED' in bpy.ops.transform.edge_slide(value=1.0): | 
					
						
							| 
									
										
										
										
											2010-12-04 13:46:25 +00:00
										 |  |  |             bpy.ops.mesh.select_more() | 
					
						
							|  |  |  |             bpy.ops.mesh.remove_doubles() | 
					
						
							|  |  |  |             return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2010-12-05 00:08:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-04 13:46:25 +00:00
										 |  |  |         return {'CANCELLED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | rna_path_prop = StringProperty(name="Context Attributes", | 
					
						
							|  |  |  |         description="rna context string", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rna_reverse_prop = BoolProperty(name="Reverse", | 
					
						
							|  |  |  |         description="Cycle backwards", default=False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  | rna_relative_prop = BoolProperty(name="Relative", | 
					
						
							| 
									
										
										
										
											2010-01-31 14:46:28 +00:00
										 |  |  |         description="Apply relative to the current value (delta)", | 
					
						
							|  |  |  |         default=False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  | def context_path_validate(context, data_path): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     import sys | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2011-02-19 04:28:07 +00:00
										 |  |  |         value = eval("context.%s" % data_path) if data_path else Ellipsis | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     except AttributeError: | 
					
						
							|  |  |  |         if "'NoneType'" in str(sys.exc_info()[1]): | 
					
						
							|  |  |  |             # One of the items in the rna path is None, just ignore this | 
					
						
							| 
									
										
										
										
											2009-12-14 01:58:08 +00:00
										 |  |  |             value = Ellipsis | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             # We have a real error in the rna path, dont ignore that | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def execute_context_assign(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |     if context_path_validate(context, self.data_path) is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |     if getattr(self, "relative", False): | 
					
						
							|  |  |  |         exec("context.%s+=self.value" % self.data_path) | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         exec("context.%s=self.value" % self.data_path) | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |     return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  | 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") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  |     _attr_dict = {"sculpt": "use_paint_sculpt", | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  |                   "vertex_paint": "use_paint_vertex", | 
					
						
							|  |  |  |                   "weight_paint": "use_paint_weight", | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  |                   "image_paint": "use_paint_texture"} | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | class WM_OT_context_set_boolean(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_boolean" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set Boolean" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     value = BoolProperty(name="Value", | 
					
						
							|  |  |  |             description="Assignment value", default=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     execute = execute_context_assign | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | class WM_OT_context_set_int(bpy.types.Operator):  # same as enum | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_int" | 
					
						
							|  |  |  |     bl_label = "Context Set" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     value = IntProperty(name="Value", description="Assign value", default=0) | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  |     relative = rna_relative_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     execute = execute_context_assign | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | class WM_OT_context_scale_int(bpy.types.Operator): | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |     '''Scale an int context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_scale_int" | 
					
						
							|  |  |  |     bl_label = "Context Set" | 
					
						
							|  |  |  |     bl_options = {'UNDO'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |     value = FloatProperty(name="Value", description="Assign value", default=1.0) | 
					
						
							|  |  |  |     always_step = BoolProperty(name="Always Step", | 
					
						
							|  |  |  |         description="Always adjust the value by a minimum of 1 when 'value' is not 1.0.", | 
					
						
							|  |  |  |         default=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if context_path_validate(context, self.data_path) is Ellipsis: | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         value = self.value | 
					
						
							|  |  |  |         data_path = self.data_path | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |         if value == 1.0:  # nothing to do | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |             return {'CANCELLED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if getattr(self, "always_step", False): | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |             if value > 1.0: | 
					
						
							|  |  |  |                 add = "1" | 
					
						
							|  |  |  |                 func = "max" | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 add = "-1" | 
					
						
							|  |  |  |                 func = "min" | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |             exec("context.%s = %s(round(context.%s * value), context.%s + %s)" % (data_path, func, data_path, data_path, add)) | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             exec("context.%s *= value" % self.data_path) | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | class WM_OT_context_set_float(bpy.types.Operator):  # same as enum | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							| 
									
										
										
										
											2009-11-17 16:04:17 +00:00
										 |  |  |     bl_idname = "wm.context_set_float" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set Float" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2010-01-31 14:46:28 +00:00
										 |  |  |     value = FloatProperty(name="Value", | 
					
						
							|  |  |  |             description="Assignment value", default=0.0) | 
					
						
							| 
									
										
										
										
											2010-01-04 08:24:24 +00:00
										 |  |  |     relative = rna_relative_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     execute = execute_context_assign | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | class WM_OT_context_set_string(bpy.types.Operator):  # same as enum | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_string" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set String" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     value = StringProperty(name="Value", | 
					
						
							|  |  |  |             description="Assign value", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     execute = execute_context_assign | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_context_set_enum(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_enum" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set Enum" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     value = StringProperty(name="Value", | 
					
						
							|  |  |  |             description="Assignment value (as a string)", | 
					
						
							|  |  |  |             maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     execute = execute_context_assign | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  | class WM_OT_context_set_value(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_value" | 
					
						
							|  |  |  |     bl_label = "Context Set Value" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     value = StringProperty(name="Value", | 
					
						
							|  |  |  |             description="Assignment value (as a string)", | 
					
						
							|  |  |  |             maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if context_path_validate(context, self.data_path) is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         exec("context.%s=%s" % (self.data_path, self.value)) | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | class WM_OT_context_toggle(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_toggle" | 
					
						
							|  |  |  |     bl_label = "Context Toggle" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if context_path_validate(context, self.data_path) is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |         exec("context.%s=not (context.%s)" % | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             (self.data_path, self.data_path)) | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_context_toggle_enum(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_toggle_enum" | 
					
						
							|  |  |  |     bl_label = "Context Toggle Values" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     value_1 = StringProperty(name="Value", \ | 
					
						
							|  |  |  |                 description="Toggle enum", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     value_2 = StringProperty(name="Value", \ | 
					
						
							|  |  |  |                 description="Toggle enum", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if context_path_validate(context, self.data_path) is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \ | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             (self.data_path, self.value_1,\ | 
					
						
							|  |  |  |              self.value_2, self.data_path, | 
					
						
							|  |  |  |              self.value_2)) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_context_cycle_int(bpy.types.Operator): | 
					
						
							| 
									
										
										
										
											2010-11-17 07:22:20 +00:00
										 |  |  |     '''Set a context value. Useful for cycling active material, ''' | 
					
						
							|  |  |  |     '''vertex keys, groups' etc.''' | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     bl_idname = "wm.context_cycle_int" | 
					
						
							|  |  |  |     bl_label = "Context Int Cycle" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     reverse = rna_reverse_prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path = self.data_path | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |         value = context_path_validate(context, data_path) | 
					
						
							| 
									
										
										
										
											2009-12-14 01:58:08 +00:00
										 |  |  |         if value is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if self.reverse: | 
					
						
							| 
									
										
										
										
											2010-01-03 02:24:53 +00:00
										 |  |  |             value -= 1 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-01-03 02:24:53 +00:00
										 |  |  |             value += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |         exec("context.%s=value" % data_path) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |         if value != eval("context.%s" % data_path): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |             # relies on rna clamping int's out of the range | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             if self.reverse: | 
					
						
							| 
									
										
										
										
											2010-10-03 01:44:00 +00:00
										 |  |  |                 value = (1 << 31) - 1 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2010-10-03 01:44:00 +00:00
										 |  |  |                 value = -1 << 31 | 
					
						
							| 
									
										
										
										
											2010-01-03 02:24:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |             exec("context.%s=value" % data_path) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_context_cycle_enum(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_cycle_enum" | 
					
						
							|  |  |  |     bl_label = "Context Enum Cycle" | 
					
						
							| 
									
										
										
										
											2010-03-01 00:03:51 +00:00
										 |  |  |     bl_options = {'UNDO'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path = rna_path_prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     reverse = rna_reverse_prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         value = context_path_validate(context, self.data_path) | 
					
						
							| 
									
										
										
										
											2009-12-14 01:58:08 +00:00
										 |  |  |         if value is Ellipsis: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         orig_value = value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Have to get rna enum values | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         rna_struct_str, rna_prop_str = self.data_path.rsplit('.', 1) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         i = rna_prop_str.find('[') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # just incse we get "context.foo.bar[0]" | 
					
						
							|  |  |  |         if i != -1: | 
					
						
							|  |  |  |             rna_prop_str = rna_prop_str[0:i] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rna_struct = eval("context.%s.rna_type" % rna_struct_str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rna_prop = rna_struct.properties[rna_prop_str] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if type(rna_prop) != bpy.types.EnumProperty: | 
					
						
							|  |  |  |             raise Exception("expected an enum property") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         enums = rna_struct.properties[rna_prop_str].items.keys() | 
					
						
							|  |  |  |         orig_index = enums.index(orig_value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Have the info we need, advance to the next item | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         if self.reverse: | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |             if orig_index == 0: | 
					
						
							|  |  |  |                 advance_enum = enums[-1] | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |                 advance_enum = enums[orig_index - 1] | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             if orig_index == len(enums) - 1: | 
					
						
							|  |  |  |                 advance_enum = enums[0] | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 advance_enum = enums[orig_index + 1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # set the new value | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         exec("context.%s=advance_enum" % self.data_path) | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:18:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-06 22:43:09 +00:00
										 |  |  | 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): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path = self.data_path | 
					
						
							| 
									
										
										
										
											2010-09-06 22:43:09 +00:00
										 |  |  |         value = context_path_validate(context, data_path) | 
					
						
							|  |  |  |         if value is Ellipsis: | 
					
						
							|  |  |  |             return {'PASS_THROUGH'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def cycle(array): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             if self.reverse: | 
					
						
							| 
									
										
										
										
											2010-09-06 22:43:09 +00:00
										 |  |  |                 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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  | class WM_MT_context_menu_enum(bpy.types.Menu): | 
					
						
							|  |  |  |     bl_label = "" | 
					
						
							|  |  |  |     data_path = ""  # BAD DESIGN, set from operator below. | 
					
						
							| 
									
										
										
										
											2011-02-16 02:25:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2011-02-16 02:25:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2011-02-16 02:25:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |     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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:18:07 +00:00
										 |  |  | class WM_OT_context_set_id(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_id" | 
					
						
							|  |  |  |     bl_label = "Set Library ID" | 
					
						
							|  |  |  |     bl_options = {'UNDO'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data_path = rna_path_prop | 
					
						
							|  |  |  |     value = StringProperty(name="Value", | 
					
						
							|  |  |  |             description="Assign value", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         value = self.value | 
					
						
							|  |  |  |         data_path = self.data_path | 
					
						
							| 
									
										
										
										
											2010-08-04 13:59:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # match the pointer type from the target property to bpy.data.* | 
					
						
							|  |  |  |         # so we lookup the correct list. | 
					
						
							|  |  |  |         data_path_base, data_path_prop = data_path.rsplit(".", 1) | 
					
						
							|  |  |  |         data_prop_rna = eval("context.%s" % data_path_base).rna_type.properties[data_path_prop] | 
					
						
							|  |  |  |         data_prop_rna_type = data_prop_rna.fixed_type | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         id_iter = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for prop in bpy.data.rna_type.properties: | 
					
						
							|  |  |  |             if prop.rna_type.identifier == "CollectionProperty": | 
					
						
							|  |  |  |                 if prop.fixed_type == data_prop_rna_type: | 
					
						
							|  |  |  |                     id_iter = prop.identifier | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if id_iter: | 
					
						
							|  |  |  |             value_id = getattr(bpy.data, id_iter).get(value) | 
					
						
							|  |  |  |             exec("context.%s=value_id" % data_path) | 
					
						
							| 
									
										
										
										
											2010-08-04 12:18:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | doc_id = StringProperty(name="Doc ID", | 
					
						
							| 
									
										
										
										
											2010-02-01 22:04:33 +00:00
										 |  |  |         description="", maxlen=1024, default="", options={'HIDDEN'}) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-23 00:56:19 +00:00
										 |  |  | doc_new = StringProperty(name="Edit Description", | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         description="", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | class WM_OT_context_modal_mouse(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Adjust arbitrary values with mouse input''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_modal_mouse" | 
					
						
							|  |  |  |     bl_label = "Context Modal Mouse" | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |     data_path_iter = StringProperty(description="The data path relative to the context, must point to an iterable.") | 
					
						
							|  |  |  |     data_path_item = StringProperty(description="The data path from each iterable to the value (int or float)") | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |     input_scale = FloatProperty(default=0.01, description="Scale the mouse movement by this value before applying the delta") | 
					
						
							|  |  |  |     invert = BoolProperty(default=False, description="Invert the mouse input") | 
					
						
							|  |  |  |     initial_x = IntProperty(options={'HIDDEN'}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _values_store(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path_iter = self.data_path_iter | 
					
						
							|  |  |  |         data_path_item = self.data_path_item | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-27 14:54:45 +00:00
										 |  |  |         self._values = values = {} | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |         for item in getattr(context, data_path_iter): | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |                 value_orig = eval("item." + data_path_item) | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             except: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             # check this can be set, maybe this is library data. | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |                 exec("item.%s = %s" % (data_path_item, value_orig)) | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             except: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             values[item] = value_orig | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _values_delta(self, delta): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         delta *= self.input_scale | 
					
						
							|  |  |  |         if self.invert: | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  |             delta = - delta | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path_item = self.data_path_item | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |         for item, value_orig in self._values.items(): | 
					
						
							| 
									
										
										
										
											2010-02-23 15:34:02 +00:00
										 |  |  |             if type(value_orig) == int: | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |                 exec("item.%s = int(%d)" % (data_path_item, round(value_orig + delta))) | 
					
						
							| 
									
										
										
										
											2010-02-23 15:34:02 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |                 exec("item.%s = %f" % (data_path_item, value_orig + delta)) | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _values_restore(self): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path_item = self.data_path_item | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |         for item, value_orig in self._values.items(): | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  |             exec("item.%s = %s" % (data_path_item, value_orig)) | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self._values.clear() | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |     def _values_clear(self): | 
					
						
							|  |  |  |         self._values.clear() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def modal(self, context, event): | 
					
						
							|  |  |  |         event_type = event.type | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if event_type == 'MOUSEMOVE': | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             delta = event.mouse_x - self.initial_x | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             self._values_delta(delta) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         elif 'LEFTMOUSE' == event_type: | 
					
						
							|  |  |  |             self._values_clear() | 
					
						
							|  |  |  |             return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-24 15:56:27 +00:00
										 |  |  |         elif event_type in ('RIGHTMOUSE', 'ESC'): | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             self._values_restore() | 
					
						
							|  |  |  |             return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |         return {'RUNNING_MODAL'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def invoke(self, context, event): | 
					
						
							|  |  |  |         self._values_store(context) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not self._values: | 
					
						
							| 
									
										
										
										
											2010-03-06 01:40:29 +00:00
										 |  |  |             self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" % | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |                     (self.data_path_iter, self.data_path_item)) | 
					
						
							| 
									
										
										
										
											2010-03-06 01:40:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             return {'CANCELLED'} | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             self.initial_x = event.mouse_x | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-08 11:42:11 +00:00
										 |  |  |             context.window_manager.modal_handler_add(self) | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |             return {'RUNNING_MODAL'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-14 20:07:15 +00:00
										 |  |  | class WM_OT_url_open(bpy.types.Operator): | 
					
						
							| 
									
										
										
										
											2010-05-31 11:38:13 +00:00
										 |  |  |     "Open a website in the Webbrowser" | 
					
						
							| 
									
										
										
										
											2010-03-14 20:07:15 +00:00
										 |  |  |     bl_idname = "wm.url_open" | 
					
						
							|  |  |  |     bl_label = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     url = StringProperty(name="URL", description="URL to open") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         import webbrowser | 
					
						
							| 
									
										
										
										
											2011-03-23 13:04:35 +00:00
										 |  |  |         _webbrowser_bug_fix() | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         webbrowser.open(self.url) | 
					
						
							| 
									
										
										
										
											2010-03-14 20:07:15 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  | class WM_OT_path_open(bpy.types.Operator): | 
					
						
							|  |  |  |     "Open a path in a file browser" | 
					
						
							|  |  |  |     bl_idname = "wm.path_open" | 
					
						
							|  |  |  |     bl_label = "" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 05:12:36 +00:00
										 |  |  |     filepath = StringProperty(name="File Path", maxlen=1024, subtype='FILE_PATH') | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         import sys | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  |         import subprocess | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         filepath = bpy.path.abspath(self.filepath) | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  |         filepath = os.path.normpath(filepath) | 
					
						
							| 
									
										
										
										
											2010-07-05 22:22:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  |         if not os.path.exists(filepath): | 
					
						
							|  |  |  |             self.report({'ERROR'}, "File '%s' not found" % filepath) | 
					
						
							|  |  |  |             return {'CANCELLED'} | 
					
						
							| 
									
										
										
										
											2010-07-05 22:22:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 01:24:16 +00:00
										 |  |  |         if sys.platform[:3] == "win": | 
					
						
							| 
									
										
										
										
											2010-07-05 22:22:22 +00:00
										 |  |  |             subprocess.Popen(['start', filepath], shell=True) | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  |         elif sys.platform == 'darwin': | 
					
						
							|  |  |  |             subprocess.Popen(['open', filepath]) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 subprocess.Popen(['xdg-open', filepath]) | 
					
						
							|  |  |  |             except OSError: | 
					
						
							|  |  |  |                 # xdg-open *should* be supported by recent Gnome, KDE, Xfce | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | class WM_OT_doc_view(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Load online reference docs''' | 
					
						
							|  |  |  |     bl_idname = "wm.doc_view" | 
					
						
							|  |  |  |     bl_label = "View Documentation" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     doc_id = doc_id | 
					
						
							| 
									
										
										
										
											2010-09-03 09:21:40 +00:00
										 |  |  |     _prefix = "http://www.blender.org/documentation/blender_python_api_%s" % "_".join(str(v) for v in bpy.app.version) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _nested_class_string(self, class_string): | 
					
						
							|  |  |  |         ls = [] | 
					
						
							|  |  |  |         class_obj = getattr(bpy.types, class_string, None).bl_rna | 
					
						
							|  |  |  |         while class_obj: | 
					
						
							|  |  |  |             ls.insert(0, class_obj) | 
					
						
							|  |  |  |             class_obj = class_obj.nested | 
					
						
							| 
									
										
										
										
											2010-09-19 07:07:14 +00:00
										 |  |  |         return '.'.join(class_obj.identifier for class_obj in ls) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         id_split = self.doc_id.split('.') | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |         if len(id_split) == 1:  # rna, class | 
					
						
							| 
									
										
										
										
											2009-12-25 15:50:53 +00:00
										 |  |  |             url = '%s/bpy.types.%s.html' % (self._prefix, id_split[0]) | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |         elif len(id_split) == 2:  # rna, class.prop | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |             class_name, class_prop = id_split | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if hasattr(bpy.types, class_name.upper() + '_OT_' + class_prop): | 
					
						
							| 
									
										
										
										
											2009-12-25 15:50:53 +00:00
										 |  |  |                 url = '%s/bpy.ops.%s.html#bpy.ops.%s.%s' % \ | 
					
						
							|  |  |  |                         (self._prefix, class_name, class_name, class_prop) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2009-12-25 15:50:53 +00:00
										 |  |  |                 # It so happens that epydoc nests these, not sphinx | 
					
						
							|  |  |  |                 # class_name_full = self._nested_class_string(class_name) | 
					
						
							|  |  |  |                 url = '%s/bpy.types.%s.html#bpy.types.%s.%s' % \ | 
					
						
							|  |  |  |                         (self._prefix, class_name, class_name, class_prop) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             return {'PASS_THROUGH'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         import webbrowser | 
					
						
							| 
									
										
										
										
											2011-03-23 13:04:35 +00:00
										 |  |  |         _webbrowser_bug_fix() | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         webbrowser.open(url) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_doc_edit(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Load online reference docs''' | 
					
						
							|  |  |  |     bl_idname = "wm.doc_edit" | 
					
						
							|  |  |  |     bl_label = "Edit Documentation" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     doc_id = doc_id | 
					
						
							|  |  |  |     doc_new = doc_new | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _url = "http://www.mindrones.com/blender/svn/xmlrpc.php" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _send_xmlrpc(self, data_dict): | 
					
						
							|  |  |  |         print("sending data:", data_dict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         import xmlrpc.client | 
					
						
							|  |  |  |         user = 'blenderuser' | 
					
						
							|  |  |  |         pwd = 'blender>user' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         docblog = xmlrpc.client.ServerProxy(self._url) | 
					
						
							|  |  |  |         docblog.metaWeblog.newPost(1, user, pwd, data_dict, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         doc_id = self.doc_id | 
					
						
							|  |  |  |         doc_new = self.doc_new | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         class_name, class_prop = doc_id.split('.') | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |         if not doc_new: | 
					
						
							| 
									
										
										
										
											2010-03-20 19:22:34 +00:00
										 |  |  |             self.report({'ERROR'}, "No input given for '%s'" % doc_id) | 
					
						
							|  |  |  |             return {'CANCELLED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # check if this is an operator | 
					
						
							|  |  |  |         op_name = class_name.upper() + '_OT_' + class_prop | 
					
						
							|  |  |  |         op_class = getattr(bpy.types, op_name, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Upload this to the web server | 
					
						
							|  |  |  |         upload = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if op_class: | 
					
						
							|  |  |  |             rna = op_class.bl_rna | 
					
						
							|  |  |  |             doc_orig = rna.description | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |             if doc_orig == doc_new: | 
					
						
							| 
									
										
										
										
											2009-12-24 21:17:14 +00:00
										 |  |  |                 return {'RUNNING_MODAL'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |             print("op - old:'%s' -> new:'%s'" % (doc_orig, doc_new)) | 
					
						
							|  |  |  |             upload["title"] = 'OPERATOR %s:%s' % (doc_id, doc_orig) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             rna = getattr(bpy.types, class_name).bl_rna | 
					
						
							|  |  |  |             doc_orig = rna.properties[class_prop].description | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |             if doc_orig == doc_new: | 
					
						
							| 
									
										
										
										
											2009-12-24 21:17:14 +00:00
										 |  |  |                 return {'RUNNING_MODAL'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |             print("rna - old:'%s' -> new:'%s'" % (doc_orig, doc_new)) | 
					
						
							|  |  |  |             upload["title"] = 'RNA %s:%s' % (doc_id, doc_orig) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-13 13:59:16 +00:00
										 |  |  |         upload["description"] = doc_new | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self._send_xmlrpc(upload) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 19:22:34 +00:00
										 |  |  |     def draw(self, context): | 
					
						
							|  |  |  |         layout = self.layout | 
					
						
							| 
									
										
										
										
											2010-11-01 21:07:25 +00:00
										 |  |  |         layout.label(text="Descriptor ID: '%s'" % self.doc_id) | 
					
						
							| 
									
										
										
										
											2010-10-27 22:15:55 +00:00
										 |  |  |         layout.prop(self, "doc_new", text="") | 
					
						
							| 
									
										
										
										
											2010-03-20 19:22:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     def invoke(self, context, event): | 
					
						
							| 
									
										
										
										
											2010-09-02 04:53:05 +00:00
										 |  |  |         wm = context.window_manager | 
					
						
							| 
									
										
										
										
											2010-03-28 10:52:24 +00:00
										 |  |  |         return wm.invoke_props_dialog(self, width=600) | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | rna_path = StringProperty(name="Property Edit", | 
					
						
							|  |  |  |     description="Property data_path edit", maxlen=1024, default="", options={'HIDDEN'}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rna_value = StringProperty(name="Property Value", | 
					
						
							|  |  |  |     description="Property value edit", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rna_property = StringProperty(name="Property Name", | 
					
						
							|  |  |  |     description="Property name edit", maxlen=1024, default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rna_min = FloatProperty(name="Min", default=0.0, precision=3) | 
					
						
							|  |  |  | rna_max = FloatProperty(name="Max", default=1.0, precision=3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WM_OT_properties_edit(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Internal use (edit a property data_path)''' | 
					
						
							|  |  |  |     bl_idname = "wm.properties_edit" | 
					
						
							|  |  |  |     bl_label = "Edit Property" | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  |     bl_options = {'REGISTER'}  # only because invoke_props_popup requires. | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     data_path = rna_path | 
					
						
							|  |  |  |     property = rna_property | 
					
						
							|  |  |  |     value = rna_value | 
					
						
							|  |  |  |     min = rna_min | 
					
						
							|  |  |  |     max = rna_max | 
					
						
							|  |  |  |     description = StringProperty(name="Tip", default="") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         data_path = self.data_path | 
					
						
							|  |  |  |         value = self.value | 
					
						
							|  |  |  |         prop = self.property | 
					
						
							| 
									
										
										
										
											2011-03-21 23:53:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         prop_old = getattr(self, "_last_prop", [None])[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if prop_old is None: | 
					
						
							|  |  |  |             self.report({'ERROR'}, "Direct execution not supported") | 
					
						
							|  |  |  |             return {'CANCELLED'} | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             value_eval = eval(value) | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             value_eval = value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First remove | 
					
						
							|  |  |  |         item = eval("context.%s" % data_path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rna_idprop_ui_prop_clear(item, prop_old) | 
					
						
							|  |  |  |         exec_str = "del item['%s']" % prop_old | 
					
						
							|  |  |  |         # print(exec_str) | 
					
						
							|  |  |  |         exec(exec_str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Reassign | 
					
						
							|  |  |  |         exec_str = "item['%s'] = %s" % (prop, repr(value_eval)) | 
					
						
							|  |  |  |         # print(exec_str) | 
					
						
							|  |  |  |         exec(exec_str) | 
					
						
							|  |  |  |         self._last_prop[:] = [prop] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         prop_type = type(item[prop]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         prop_ui = rna_idprop_ui_prop_get(item, prop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if prop_type in (float, int): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.min) | 
					
						
							|  |  |  |             prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.max) | 
					
						
							| 
									
										
										
										
											2010-02-14 11:21:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         prop_ui['description'] = self.description | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-18 06:36:57 +00:00
										 |  |  |         # otherwise existing buttons which reference freed | 
					
						
							|  |  |  |         # memory may crash blender [#26510] | 
					
						
							|  |  |  |         context.area.tag_redraw() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def invoke(self, context, event): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-21 23:53:19 +00:00
										 |  |  |         if not self.data_path: | 
					
						
							|  |  |  |             self.report({'ERROR'}, "Data path not set") | 
					
						
							|  |  |  |             return {'CANCELLED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         self._last_prop = [self.property] | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         item = eval("context.%s" % self.data_path) | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # setup defaults | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         prop_ui = rna_idprop_ui_prop_get(item, self.property, False)  # dont create | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |         if prop_ui: | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |             self.min = prop_ui.get("min", -1000000000) | 
					
						
							|  |  |  |             self.max = prop_ui.get("max", 1000000000) | 
					
						
							|  |  |  |             self.description = prop_ui.get("description", "") | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-02 04:53:05 +00:00
										 |  |  |         wm = context.window_manager | 
					
						
							| 
									
										
										
										
											2011-01-15 19:15:35 +00:00
										 |  |  |         return wm.invoke_props_dialog(self) | 
					
						
							| 
									
										
										
										
											2010-02-14 11:21:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-14 23:26:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | class WM_OT_properties_add(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Internal use (edit a property data_path)''' | 
					
						
							|  |  |  |     bl_idname = "wm.properties_add" | 
					
						
							|  |  |  |     bl_label = "Add Property" | 
					
						
							| 
									
										
										
										
											2010-02-14 11:21:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |     data_path = rna_path | 
					
						
							| 
									
										
										
										
											2010-02-14 11:21:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         item = eval("context.%s" % self.data_path) | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def unique_name(names): | 
					
						
							|  |  |  |             prop = 'prop' | 
					
						
							|  |  |  |             prop_new = prop | 
					
						
							|  |  |  |             i = 1 | 
					
						
							|  |  |  |             while prop_new in names: | 
					
						
							|  |  |  |                 prop_new = prop + str(i) | 
					
						
							|  |  |  |                 i += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return prop_new | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         property = unique_name(item.keys()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         item[property] = 1.0 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2010-02-14 11:21:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | class WM_OT_properties_remove(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Internal use (edit a property data_path)''' | 
					
						
							|  |  |  |     bl_idname = "wm.properties_remove" | 
					
						
							|  |  |  |     bl_label = "Remove Property" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data_path = rna_path | 
					
						
							|  |  |  |     property = rna_property | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							| 
									
										
										
										
											2010-09-09 18:03:57 +00:00
										 |  |  |         item = eval("context.%s" % self.data_path) | 
					
						
							|  |  |  |         del item[self.property] | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-14 16:45:24 +00:00
										 |  |  | 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'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-16 17:26:40 +00:00
										 |  |  | 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'} | 
					
						
							| 
									
										
										
										
											2011-03-23 13:04:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _webbrowser_bug_fix(): | 
					
						
							|  |  |  |     # test for X11 | 
					
						
							|  |  |  |     import os | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if os.environ.get("DISPLAY"): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # BSD licenced code copied from python, temp fix for bug | 
					
						
							|  |  |  |         # http://bugs.python.org/issue11432, XXX == added code | 
					
						
							|  |  |  |         def _invoke(self, args, remote, autoraise): | 
					
						
							|  |  |  |             # XXX, added imports | 
					
						
							|  |  |  |             import io | 
					
						
							|  |  |  |             import subprocess | 
					
						
							|  |  |  |             import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             raise_opt = [] | 
					
						
							|  |  |  |             if remote and self.raise_opts: | 
					
						
							|  |  |  |                 # use autoraise argument only for remote invocation | 
					
						
							|  |  |  |                 autoraise = int(autoraise) | 
					
						
							|  |  |  |                 opt = self.raise_opts[autoraise] | 
					
						
							|  |  |  |                 if opt: | 
					
						
							|  |  |  |                     raise_opt = [opt] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             cmdline = [self.name] + raise_opt + args | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if remote or self.background: | 
					
						
							|  |  |  |                 inout = io.open(os.devnull, "r+") | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 # for TTY browsers, we need stdin/out | 
					
						
							|  |  |  |                 inout = None | 
					
						
							|  |  |  |             # if possible, put browser in separate process group, so | 
					
						
							|  |  |  |             # keyboard interrupts don't affect browser as well as Python | 
					
						
							|  |  |  |             setsid = getattr(os, 'setsid', None) | 
					
						
							|  |  |  |             if not setsid: | 
					
						
							|  |  |  |                 setsid = getattr(os, 'setpgrp', None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             p = subprocess.Popen(cmdline, close_fds=True,  # XXX, stdin=inout, | 
					
						
							|  |  |  |                                  stdout=(self.redirect_stdout and inout or None), | 
					
						
							|  |  |  |                                  stderr=inout, preexec_fn=setsid) | 
					
						
							|  |  |  |             if remote: | 
					
						
							|  |  |  |                 # wait five secons. If the subprocess is not finished, the | 
					
						
							|  |  |  |                 # remote invocation has (hopefully) started a new instance. | 
					
						
							|  |  |  |                 time.sleep(1) | 
					
						
							|  |  |  |                 rc = p.poll() | 
					
						
							|  |  |  |                 if rc is None: | 
					
						
							|  |  |  |                     time.sleep(4) | 
					
						
							|  |  |  |                     rc = p.poll() | 
					
						
							|  |  |  |                     if rc is None: | 
					
						
							|  |  |  |                         return True | 
					
						
							|  |  |  |                 # if remote call failed, open() will try direct invocation | 
					
						
							|  |  |  |                 return not rc | 
					
						
							|  |  |  |             elif self.background: | 
					
						
							|  |  |  |                 if p.poll() is None: | 
					
						
							|  |  |  |                     return True | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     return False | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return not p.wait() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         import webbrowser | 
					
						
							|  |  |  |         webbrowser.UnixBrowser._invoke = _invoke |