| 
									
										
										
										
											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-08-16 18:59:45 +00:00
										 |  |  | from bpy.types import Menu, Operator | 
					
						
							| 
									
										
										
										
											2011-06-27 07:51:52 +00:00
										 |  |  | from bpy.props import StringProperty, BoolProperty, IntProperty, \ | 
					
						
							|  |  |  |                       FloatProperty, EnumProperty | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class MESH_OT_delete_edgeloop(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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class BRUSH_OT_active_index_set(Operator): | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  |     '''Set active sculpt/paint brush from it's number''' | 
					
						
							| 
									
										
										
										
											2011-04-01 04:22:30 +00:00
										 |  |  |     bl_idname = "brush.active_index_set" | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  |     bl_label = "Set Brush Number" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mode = StringProperty(name="mode", | 
					
						
							|  |  |  |             description="Paint mode to set brush for", maxlen=1024) | 
					
						
							| 
									
										
										
										
											2011-04-01 04:22:30 +00:00
										 |  |  |     index = IntProperty(name="number", | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  |             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-04-01 04:22:30 +00:00
										 |  |  |                   "image_paint": "use_paint_image"} | 
					
						
							| 
									
										
										
										
											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))): | 
					
						
							| 
									
										
										
										
											2011-04-01 06:14:39 +00:00
										 |  |  |             if i == self.index: | 
					
						
							| 
									
										
										
										
											2010-11-10 08:11:58 +00:00
										 |  |  |                 getattr(context.tool_settings, self.mode).brush = brush | 
					
						
							|  |  |  |                 return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return {'CANCELLED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_boolean(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_boolean" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set Boolean" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_int(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" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_scale_int(Operator): | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  |     '''Scale an int context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_scale_int" | 
					
						
							|  |  |  |     bl_label = "Context Set" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											2010-03-08 23:34:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_float(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" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_string(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" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_enum(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_enum" | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     bl_label = "Context Set Enum" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_value(Operator): | 
					
						
							| 
									
										
										
										
											2009-12-22 16:11:11 +00:00
										 |  |  |     '''Set a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_value" | 
					
						
							|  |  |  |     bl_label = "Context Set Value" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_toggle(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_toggle" | 
					
						
							|  |  |  |     bl_label = "Context Toggle" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_toggle_enum(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_toggle_enum" | 
					
						
							|  |  |  |     bl_label = "Context Toggle Values" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_cycle_int(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" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_cycle_enum(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_cycle_enum" | 
					
						
							|  |  |  |     bl_label = "Context Enum Cycle" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											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") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-03 22:28:33 +00:00
										 |  |  |         enums = rna_struct.properties[rna_prop_str].enum_items.keys() | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |         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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_cycle_array(Operator): | 
					
						
							| 
									
										
										
										
											2010-09-06 22:43:09 +00:00
										 |  |  |     '''Set a context array value.
 | 
					
						
							|  |  |  |     Useful for cycling the active mesh edit mode.'''
 | 
					
						
							|  |  |  |     bl_idname = "wm.context_cycle_array" | 
					
						
							|  |  |  |     bl_label = "Context Array Cycle" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											2010-09-06 22:43:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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-08-16 18:59:45 +00:00
										 |  |  | class WM_MT_context_menu_enum(Menu): | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |     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-05-01 07:39:21 +00:00
										 |  |  |         values = [(i.name, i.identifier) for i in value_base.bl_rna.properties[prop_string].enum_items] | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for name, identifier in values: | 
					
						
							|  |  |  |             prop = self.layout.operator("wm.context_set_enum", text=name) | 
					
						
							|  |  |  |             prop.data_path = data_path | 
					
						
							|  |  |  |             prop.value = identifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_menu_enum(Operator): | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |     bl_idname = "wm.context_menu_enum" | 
					
						
							|  |  |  |     bl_label = "Context Enum Menu" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											2011-02-15 18:12:41 +00:00
										 |  |  |     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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_set_id(Operator): | 
					
						
							| 
									
										
										
										
											2010-08-04 12:18:07 +00:00
										 |  |  |     '''Toggle a context value.''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_set_id" | 
					
						
							|  |  |  |     bl_label = "Set Library ID" | 
					
						
							| 
									
										
										
										
											2011-06-06 11:56:54 +00:00
										 |  |  |     bl_options = {'UNDO', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											2010-08-04 12:18:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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="") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 07:51:52 +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)") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_collection_boolean_set(Operator): | 
					
						
							| 
									
										
										
										
											2011-06-27 07:51:52 +00:00
										 |  |  |     '''Set boolean values for a collection of items''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_collection_boolean_set" | 
					
						
							|  |  |  |     bl_label = "Context Collection Boolean Set" | 
					
						
							|  |  |  |     bl_options = {'UNDO', 'REGISTER', 'INTERNAL'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data_path_iter = data_path_iter | 
					
						
							|  |  |  |     data_path_item = data_path_item | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     type = EnumProperty(items=( | 
					
						
							|  |  |  |             ('TOGGLE', "Toggle", ""), | 
					
						
							|  |  |  |             ('ENABLE', "Enable", ""), | 
					
						
							|  |  |  |             ('DISABLE', "Disable", ""), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         name="Type") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         data_path_iter = self.data_path_iter | 
					
						
							|  |  |  |         data_path_item = self.data_path_item | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         items = list(getattr(context, data_path_iter)) | 
					
						
							|  |  |  |         items_ok = [] | 
					
						
							|  |  |  |         is_set = False | 
					
						
							|  |  |  |         for item in items: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 value_orig = eval("item." + data_path_item) | 
					
						
							|  |  |  |             except: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if value_orig == True: | 
					
						
							|  |  |  |                 is_set = True | 
					
						
							|  |  |  |             elif value_orig == False: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.report({'WARNING'}, "Non boolean value found: %s[ ].%s" % | 
					
						
							|  |  |  |                             (data_path_iter, data_path_item)) | 
					
						
							|  |  |  |                 return {'CANCELLED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             items_ok.append(item) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.type == 'ENABLE': | 
					
						
							|  |  |  |             is_set = True | 
					
						
							|  |  |  |         elif self.type == 'DISABLE': | 
					
						
							|  |  |  |             is_set = False | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             is_set = not is_set | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         exec_str = "item.%s = %s" % (data_path_item, is_set) | 
					
						
							|  |  |  |         for item in items_ok: | 
					
						
							|  |  |  |             exec(exec_str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_context_modal_mouse(Operator): | 
					
						
							| 
									
										
										
										
											2010-02-21 14:05:02 +00:00
										 |  |  |     '''Adjust arbitrary values with mouse input''' | 
					
						
							|  |  |  |     bl_idname = "wm.context_modal_mouse" | 
					
						
							|  |  |  |     bl_label = "Context Modal Mouse" | 
					
						
							| 
									
										
										
										
											2011-06-24 03:59:41 +00:00
										 |  |  |     bl_options = {'GRAB_POINTER', 'BLOCKING', 'INTERNAL'} | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 07:51:52 +00:00
										 |  |  |     data_path_iter = data_path_iter | 
					
						
							|  |  |  |     data_path_item = data_path_item | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_url_open(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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_path_open(Operator): | 
					
						
							| 
									
										
										
										
											2010-07-04 10:02:30 +00:00
										 |  |  |     "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'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_doc_view(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''Load online reference docs''' | 
					
						
							|  |  |  |     bl_idname = "wm.doc_view" | 
					
						
							|  |  |  |     bl_label = "View Documentation" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     doc_id = doc_id | 
					
						
							| 
									
										
										
										
											2011-04-01 15:13:58 +00:00
										 |  |  |     if bpy.app.version_cycle == "release": | 
					
						
							|  |  |  |         _prefix = "http://www.blender.org/documentation/blender_python_api_%s%s_release" % ("_".join(str(v) for v in bpy.app.version[:2]), bpy.app.version_char) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         _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: | 
					
						
							| 
									
										
										
										
											2011-03-27 06:15:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 # detect if this is a inherited member and use that name instead | 
					
						
							|  |  |  |                 rna_parent = getattr(bpy.types, class_name).bl_rna | 
					
						
							|  |  |  |                 rna_prop = rna_parent.properties[class_prop] | 
					
						
							|  |  |  |                 rna_parent = rna_parent.base | 
					
						
							|  |  |  |                 while rna_parent and rna_prop == rna_parent.properties.get(class_prop): | 
					
						
							|  |  |  |                     class_name = rna_parent.identifier | 
					
						
							|  |  |  |                     rna_parent = rna_parent.base | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_doc_edit(Operator): | 
					
						
							| 
									
										
										
										
											2009-11-04 20:21:08 +00:00
										 |  |  |     '''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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_properties_edit(Operator): | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |     '''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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  |         if prop_type in {float, int}: | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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] | 
					
						
							| 
									
										
										
										
											2011-03-24 11:38:20 +00:00
										 |  |  |         # context.area.tag_redraw() | 
					
						
							|  |  |  |         for win in context.window_manager.windows: | 
					
						
							|  |  |  |             for area in win.screen.areas: | 
					
						
							|  |  |  |                 area.tag_redraw() | 
					
						
							| 
									
										
										
										
											2011-03-18 06:36:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_properties_add(Operator): | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |     '''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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-02 17:29:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_properties_context_change(Operator): | 
					
						
							| 
									
										
										
										
											2011-04-25 13:47:15 +00:00
										 |  |  |     "Change the context tab in a Properties Window" | 
					
						
							|  |  |  |     bl_idname = "wm.properties_context_change" | 
					
						
							|  |  |  |     bl_label = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context = StringProperty(name="Context", maxlen=32) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         context.space_data.context = (self.context) | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_properties_remove(Operator): | 
					
						
							| 
									
										
										
										
											2010-08-02 02:55:12 +00:00
										 |  |  |     '''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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_keyconfig_activate(Operator): | 
					
						
							| 
									
										
										
										
											2010-09-14 16:45:24 +00:00
										 |  |  |     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-04-01 02:41:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_appconfig_default(Operator): | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |     bl_idname = "wm.appconfig_default" | 
					
						
							|  |  |  |     bl_label = "Default Application Configuration" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         context.window_manager.keyconfigs.active = context.window_manager.keyconfigs.default | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  |         filepath = os.path.join(bpy.utils.preset_paths("interaction")[0], "blender.py") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |         if os.path.exists(filepath): | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  |             bpy.ops.script.execute_preset(filepath=filepath, menu_idname="USERPREF_MT_interaction_presets") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_appconfig_activate(Operator): | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |     bl_idname = "wm.appconfig_activate" | 
					
						
							|  |  |  |     bl_label = "Activate Application Configuration" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     filepath = StringProperty(name="File Path", maxlen=1024) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  |         bpy.utils.keyconfig_set(self.filepath) | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |         filepath = self.filepath.replace("keyconfig", "interaction") | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |         if os.path.exists(filepath): | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  |             bpy.ops.script.execute_preset(filepath=filepath, menu_idname="USERPREF_MT_interaction_presets") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-27 21:45:37 +00:00
										 |  |  |         return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-01 02:41:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_sysinfo(Operator): | 
					
						
							| 
									
										
										
										
											2010-10-16 17:26:40 +00:00
										 |  |  |     '''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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-16 18:59:45 +00:00
										 |  |  | class WM_OT_copy_prev_settings(Operator): | 
					
						
							| 
									
										
										
										
											2011-04-12 21:00:53 +00:00
										 |  |  |     '''Copy settings from previous version''' | 
					
						
							| 
									
										
										
										
											2011-04-11 15:13:06 +00:00
										 |  |  |     bl_idname = "wm.copy_prev_settings" | 
					
						
							|  |  |  |     bl_label = "Copy Previous Settings" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  |         import shutil | 
					
						
							|  |  |  |         ver = bpy.app.version | 
					
						
							| 
									
										
										
										
											2011-04-12 04:23:38 +00:00
										 |  |  |         ver_old = ((ver[0] * 100) + ver[1]) - 1 | 
					
						
							|  |  |  |         path_src = bpy.utils.resource_path('USER', ver_old // 100, ver_old % 100) | 
					
						
							|  |  |  |         path_dst = bpy.utils.resource_path('USER') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if os.path.isdir(path_dst): | 
					
						
							|  |  |  |             self.report({'ERROR'}, "Target path %r exists" % path_dst) | 
					
						
							|  |  |  |         elif not os.path.isdir(path_src): | 
					
						
							|  |  |  |             self.report({'ERROR'}, "Source path %r exists" % path_src) | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2011-04-11 15:13:06 +00:00
										 |  |  |             shutil.copytree(path_src, path_dst) | 
					
						
							| 
									
										
											  
											
												Windows installer and Path changes, fixing various issues:
* Windows installer not working for non-admin users and multiple users
* Addon scripts not installing next to user configuration
* Portable install not being taken into account in all places
The main problem was the windows installer was installing system scripts in
AppData next to the user configuration directory, which is not shared between
users. Now these are installed in ProgramFiles, and only addon scripts added
by the users go to AppData.
On all platforms, addon scripts were sometimes getting installed between
system scripts, because the scripts folder in the executable directory was
given precedence over the user configuration folder, that is no longer done
now. So addons now behave like user configuration, they are preserved even
if you download a newer build of the same blender version.
If you have an installation of 2.57 on windows, the addon install location
will not change until we do the version bump to 2.58, to avoid conflicts with
the existing the installed 2.57 version.
The old behavior of giving precedence to the local folder was done to support
portable install, where all configuration is written to the local folder. This
is now implemented differently: if and only if a "config" folder exists in the
local folder, portable install will be assumed, and files will only be written
to that local folder.
											
										 
											2011-05-27 09:57:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # in 2.57 and earlier windows installers, system scripts were copied | 
					
						
							|  |  |  |             # into the configuration directory, don't want to copy those | 
					
						
							|  |  |  |             system_script = os.path.join(path_dst, 'scripts/modules/bpy_types.py') | 
					
						
							|  |  |  |             if os.path.isfile(system_script): | 
					
						
							|  |  |  |                 shutil.rmtree(os.path.join(path_dst, 'scripts')) | 
					
						
							|  |  |  |                 shutil.rmtree(os.path.join(path_dst, 'plugins')) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-12 04:23:38 +00:00
										 |  |  |             # dont loose users work if they open the splash later. | 
					
						
							|  |  |  |             if bpy.data.is_saved is bpy.data.is_dirty is False: | 
					
						
							|  |  |  |                 bpy.ops.wm.read_homefile() | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.report({'INFO'}, "Reload Start-Up file to restore settings.") | 
					
						
							|  |  |  |             return {'FINISHED'} | 
					
						
							| 
									
										
										
										
											2011-04-11 15:13:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-12 04:23:38 +00:00
										 |  |  |         return {'CANCELLED'} | 
					
						
							| 
									
										
										
										
											2011-04-11 15:13:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2011-03-24 11:38:20 +00:00
										 |  |  |         webbrowser.UnixBrowser._invoke = _invoke |