[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1948] contrib/py/scripts/addons/ paint_palette.py: Added color and weight paint palettes to contrib
Jonathan Smith
j.jaydez at gmail.com
Tue May 17 12:41:37 CEST 2011
Revision: 1948
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1948
Author: jaydez
Date: 2011-05-17 10:41:36 +0000 (Tue, 17 May 2011)
Log Message:
-----------
Added color and weight paint palettes to contrib
Added Paths:
-----------
contrib/py/scripts/addons/paint_palette.py
Added: contrib/py/scripts/addons/paint_palette.py
===================================================================
--- contrib/py/scripts/addons/paint_palette.py (rev 0)
+++ contrib/py/scripts/addons/paint_palette.py 2011-05-17 10:41:36 UTC (rev 1948)
@@ -0,0 +1,699 @@
+# paint_palette.py (c) 2011 Dany Lebel (Axon_D)
+#
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+
+
+bl_info = {
+ "name": "Paint Palettes",
+ "author": "Dany Lebel (Axon D)",
+ "version": (0,8,1),
+ "blender": (2, 5, 7),
+ "api": 36722,
+ "location": "Image Editor and 3D View > Any Paint mode > Color Palette or Weight Palette panel",
+ "description": "Palettes for color and weight paint modes",
+ "warning": "beta",
+ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Paint/Palettes",
+ "tracker_url": "http://projects.blender.org/tracker/index.php?func=detail&aid=25908",
+ "category": "Other"}
+
+"""
+This addon brings palettes to the paint modes.
+
+ * Color Palette for Image Painting, Texture Paint and Vertex Paint modes.
+ * Weight Palette for the Weight Paint mode.
+
+Set a number of colors (or weights according to the mode) and then associate it
+with the brush by using the button under the color.
+"""
+
+import bpy
+from bpy.props import *
+
+
+class AddPresetBase():
+ '''Base preset class, only for subclassing
+ subclasses must define
+ - preset_values
+ - preset_subdir '''
+ # bl_idname = "script.preset_base_add"
+ # bl_label = "Add a Python Preset"
+ bl_options = {'REGISTER'} # only because invoke_props_popup requires.
+
+ name = bpy.props.StringProperty(name="Name",
+ description="Name of the preset, used to make the path name",
+ maxlen=64, default="")
+ remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
+
+ @staticmethod
+ def as_filename(name): # could reuse for other presets
+ for char in " !@#$%^&*(){}:\";'[]<>,.\\/?":
+ name = name.replace(char, '_')
+ return name.lower().strip()
+
+ def execute(self, context):
+ import os
+
+ if hasattr(self, "pre_cb"):
+ self.pre_cb(context)
+
+ preset_menu_class = getattr(bpy.types, self.preset_menu)
+
+ if not self.remove_active:
+
+ if not self.name:
+ return {'FINISHED'}
+
+ filename = self.as_filename(self.name)
+
+ target_path = bpy.utils.user_resource('SCRIPTS',
+ os.path.join("presets", self.preset_subdir), create=True)
+
+ if not target_path:
+ self.report({'WARNING'}, "Failed to create presets path")
+ return {'CANCELLED'}
+
+ filepath = os.path.join(target_path, filename) + ".py"
+
+ if hasattr(self, "add"):
+ self.add(context, filepath)
+ else:
+ file_preset = open(filepath, 'w')
+ file_preset.write("import bpy\n")
+
+ if hasattr(self, "preset_defines"):
+ for rna_path in self.preset_defines:
+ exec(rna_path)
+ file_preset.write("%s\n" % rna_path)
+ file_preset.write("\n")
+
+
+ for rna_path in self.preset_values:
+ value = eval(rna_path)
+ # convert thin wrapped sequences to simple lists to repr()
+ try:
+ value = value[:]
+ except:
+ pass
+
+ file_preset.write("%s = %r\n" % (rna_path, value))
+ file_preset.write("\
+ci = bpy.context.window_manager.palette_props.current_color_index\n\
+palette_props = bpy.context.window_manager.palette_props\n\
+image_paint = bpy.context.tool_settings.image_paint\n\
+vertex_paint = bpy.context.tool_settings.vertex_paint\n\
+if ci == 0:\n\
+ image_paint.brush.color = palette_props.color_0\n\
+ vertex_paint.brush.color = palette_props.color_0\n\
+elif ci == 1:\n\
+ image_paint.brush.color = palette_props.color_1\n\
+ vertex_paint.brush.color = palette_props.color_1\n\
+elif ci == 2:\n\
+ image_paint.brush.color = palette_props.color_2\n\
+ vertex_paint.brush.color = palette_props.color_2\n\
+elif ci == 3:\n\
+ image_paint.brush.color = palette_props.color_3\n\
+ vertex_paint.brush.color = palette_props.color_3\n\
+elif ci == 4:\n\
+ image_paint.brush.color = palette_props.color_4\n\
+ vertex_paint.brush.color = palette_props.color_4\n\
+elif ci == 5:\n\
+ image_paint.brush.color = palette_props.color_5\n\
+ vertex_paint.brush.color = palette_props.color_5\n\
+elif ci == 6:\n\
+ image_paint.brush.color = palette_props.color_6\n\
+ vertex_paint.brush.color = palette_props.color_6\n\
+elif ci == 7:\n\
+ image_paint.brush.color = palette_props.color_7\n\
+ vertex_paint.brush.color = palette_props.color_7\n\
+elif ci == 8:\n\
+ image_paint.brush.color = palette_props.color_8\n\
+ vertex_paint.brush.color = palette_props.color_8")
+
+ file_preset.close()
+
+ preset_menu_class.bl_label = bpy.path.display_name(filename)
+
+ else:
+ preset_active = preset_menu_class.bl_label
+
+ # fairly sloppy but convenient.
+ filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
+
+ if not filepath:
+ filepath = bpy.utils.preset_find(preset_active,
+ self.preset_subdir, display_name=True)
+
+ if not filepath:
+ return {'CANCELLED'}
+
+ if hasattr(self, "remove"):
+ self.remove(context, filepath)
+ else:
+ try:
+ os.remove(filepath)
+ except:
+ import traceback
+ traceback.print_exc()
+
+ # XXX, stupid!
+ preset_menu_class.bl_label = "Presets"
+
+ if hasattr(self, "post_cb"):
+ self.post_cb(context)
+
+ return {'FINISHED'}
+
+ def check(self, context):
+ self.name = self.as_filename(self.name)
+
+ def invoke(self, context, event):
+ if not self.remove_active:
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
+ else:
+ return self.execute(context)
+
+class ExecutePalettePreset(bpy.types.Operator):
+ ''' Executes a preset '''
+ bl_idname = "script.execute_preset"
+ bl_label = "Execute a Python Preset"
+
+ filepath = bpy.props.StringProperty(name="Path",
+ description="Path of the Python file to execute",
+ maxlen=512, default="")
+ menu_idname = bpy.props.StringProperty(name="Menu ID Name",
+ description="ID name of the menu this was called from", default="")
+
+ def execute(self, context):
+ from os.path import basename
+ filepath = self.filepath
+
+ # change the menu title to the most recently chosen option
+ preset_class = getattr(bpy.types, self.menu_idname)
+ preset_class.bl_label = bpy.path.display_name(basename(filepath))
+
+ # execute the preset using script.python_file_run
+ bpy.ops.script.python_file_run(filepath=filepath)
+ return {'FINISHED'}
+
+
+class PALETTE_MT_palette_presets(bpy.types.Menu):
+ bl_label = "Palette Presets"
+ preset_subdir = "palette"
+ preset_operator = "script.execute_preset"
+ draw = bpy.types.Menu.draw_preset
+
+
+class AddPresetPalette(AddPresetBase, bpy.types.Operator):
+ '''Add a Palette Preset'''
+ bl_idname = "palette.preset_add"
+ bl_label = "Add Palette Preset"
+ preset_menu = "PALETTE_MT_palette_presets"
+
+ preset_defines = [
+ "window_manager = bpy.context.window_manager"
+ ]
+
+ preset_values = [
+ "window_manager.palette_props.color_0",
+ "window_manager.palette_props.color_1",
+ "window_manager.palette_props.color_2",
+ "window_manager.palette_props.color_3",
+ "window_manager.palette_props.color_4",
+ "window_manager.palette_props.color_5",
+ "window_manager.palette_props.color_6",
+ "window_manager.palette_props.color_7",
+ "window_manager.palette_props.color_8",
+
+ ]
+
+ preset_subdir = "palette"
+
+
+class BrushButtonsPanel():
+ bl_space_type = 'IMAGE_EDITOR'
+ bl_region_type = 'UI'
+
+ @classmethod
+ def poll(cls, context):
+ sima = context.space_data
+ toolsettings = context.tool_settings.image_paint
+ return sima.show_paint and toolsettings.brush
+
+class IMAGE_OT_select_color(bpy.types.Operator):
+ bl_label = ""
+ bl_description = "Select this color"
+ bl_idname = "paint.select_color"
+
+
+ color_index = IntProperty()
+
+ def invoke(self, context, event):
+ palette_props = bpy.context.window_manager.palette_props
+ palette_props.current_color_index = self.color_index
+
+ if self.color_index == 0:
+ color = palette_props.color_0
+ elif self.color_index == 1:
+ color = palette_props.color_1
+ elif self.color_index == 2:
+ color = palette_props.color_2
+ elif self.color_index == 3:
+ color = palette_props.color_3
+ elif self.color_index == 4:
+ color = palette_props.color_4
+ elif self.color_index == 5:
+ color = palette_props.color_5
+ elif self.color_index == 6:
+ color = palette_props.color_6
+ elif self.color_index == 7:
+ color = palette_props.color_7
+ elif self.color_index == 8:
+ color = palette_props.color_8
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list