[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2281] trunk/py/scripts/addons/ paint_palette.py: - Implemented the Gimp Palette format
Dany Lebel
axonestudio at gmail.com
Sat Aug 27 20:23:03 CEST 2011
Revision: 2281
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2281
Author: axon_d
Date: 2011-08-27 18:23:02 +0000 (Sat, 27 Aug 2011)
Log Message:
-----------
- Implemented the Gimp Palette format
- Unlimited number of colors
- Configurable Palette folder
Modified Paths:
--------------
trunk/py/scripts/addons/paint_palette.py
Modified: trunk/py/scripts/addons/paint_palette.py
===================================================================
--- trunk/py/scripts/addons/paint_palette.py 2011-08-27 13:43:14 UTC (rev 2280)
+++ trunk/py/scripts/addons/paint_palette.py 2011-08-27 18:23:02 UTC (rev 2281)
@@ -23,9 +23,9 @@
bl_info = {
"name": "Paint Palettes",
"author": "Dany Lebel (Axon D)",
- "version": (0,8,2),
- "blender": (2, 5, 7),
- "api": 36826,
+ "version": (0,9,0),
+ "blender": (2, 5, 8),
+ "api": 37815,
"location": "Image Editor and 3D View > Any Paint mode > Color Palette or Weight Palette panel",
"description": "Palettes for color and weight paint modes",
"warning": "",
@@ -47,15 +47,170 @@
from bpy.props import *
-class AddPresetBase():
+def update_panels():
+ pp = bpy.context.scene.palette_props
+ current_color = pp.colors[pp.current_color_index].color
+ pp.color_name = pp.colors[pp.current_color_index].name
+ brush = current_brush()
+ brush.color = current_color
+ pp.index = pp.current_color_index
+
+def sample():
+ pp = bpy.context.scene.palette_props
+ context = bpy.context
+ current_color = pp.colors[pp.current_color_index]
+ brush = current_brush()
+ current_color.color = brush.color
+ return None
+
+def current_brush():
+ context = bpy.context
+ if context.area.type == 'VIEW_3D' and context.vertex_paint_object:
+ brush = context.tool_settings.vertex_paint.brush
+ elif context.area.type == 'VIEW_3D' and context.image_paint_object:
+ brush = context.tool_settings.image_paint.brush
+ elif context.area.type == 'IMAGE_EDITOR' and context.space_data.use_image_paint:
+ brush = context.tool_settings.image_paint.brush
+ else :
+ brush = None
+ return brush
+
+
+def update_weight_value():
+ pp = bpy.context.scene.palette_props
+ tt = bpy.context.tool_settings
+ tt.vertex_group_weight = pp.weight_value
+ return None
+
+
+class PALETTE_MT_menu(bpy.types.Menu):
+ bl_label = "Presets"
+ preset_subdir = ""
+ preset_operator = "palette.load_gimp_palette"
+
+ def path_menu(self, searchpaths, operator, props_default={}):
+ layout = self.layout
+ # hard coded to set the operators 'filepath' to the filename.
+ import os
+ import bpy.utils
+
+ layout = self.layout
+
+ if not searchpaths:
+ layout.label("* Missing Paths *")
+
+ # collect paths
+ files = []
+ for directory in searchpaths:
+ files.extend([(f, os.path.join(directory, f)) for f in os.listdir(directory)])
+
+ files.sort()
+
+ for f, filepath in files:
+
+ if f.startswith("."):
+ continue
+
+ preset_name = bpy.path.display_name(f)
+ props = layout.operator(operator, text=preset_name)
+
+ for attr, value in props_default.items():
+ setattr(props, attr, value)
+
+ props.filepath = filepath
+ if operator == "palette.load_gimp_palette":
+ props.menu_idname = self.bl_idname
+
+ def draw_preset(self, context):
+ """Define these on the subclass
+ - preset_operator
+ - preset_subdir
+ """
+ import bpy
+ self.path_menu([bpy.context.scene.palette_props.presets_folder], self.preset_operator)
+
+ draw = draw_preset
+
+
+class LoadGimpPalette(bpy.types.Operator):
+ ''' Executes a preset '''
+ bl_idname = "palette.load_gimp_palette"
+ bl_label = "Load a Gimp palette"
+
+ 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
+
+ palette_props = bpy.context.scene.palette_props
+ palette_props.current_color_index = 0
+
+ # 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))
+
+
+ ts = bpy.context.tool_settings
+ palette_props.columns = 0
+ if filepath[-4:] == ".gpl":
+ gpl = open(filepath, "r")
+ lines = gpl.readlines()
+ palette_props.notes = ''
+ has_color = False
+ for index_0, line in enumerate(lines):
+ if not line or (line[:12] == "GIMP Palette"):
+ pass
+ elif line[:5] == "Name:":
+ palette_props.palette_name = line[5:]
+ elif line[:8] == "Columns:":
+ palette_props.columns = int(line[8:])
+ elif line[0] == "#":
+ palette_props.notes += line
+ else :
+ has_color = True
+ #index_0 = i
+ break
+ i = -1
+ if has_color:
+ for i, ln in enumerate(lines[index_0:]):
+ try:
+ palette_props.colors[i]
+ except IndexError:
+ palette_props.colors.add()
+ color = [float(rgb)/255 for rgb in [ln[0:3], ln[4:7], ln[8:11]]]
+
+ palette_props.colors[i].color = color
+
+ palette_props.colors[i].name = ln[12:-1]
+
+ exceeding = i + 1
+ while palette_props.colors.__len__() > exceeding:
+ palette_props.colors.remove(exceeding)
+
+ if has_color:
+ update_panels()
+ gpl.close()
+ pass
+ else :
+ self.report({'INFO'}, "Not a supported palette format")
+
+ return {'FINISHED'}
+
+
+class WriteGimpPalette():
'''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="")
@@ -69,6 +224,7 @@
def execute(self, context):
import os
+ pp = bpy.context.scene.palette_props
if hasattr(self, "pre_cb"):
self.pre_cb(context)
@@ -81,75 +237,27 @@
return {'FINISHED'}
filename = self.as_filename(self.name)
+ target_path = pp.presets_folder
- 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"
+ filepath = os.path.join(target_path, filename) + ".gpl"
+ file_preset = open(filepath, 'wb')
+ gpl = "GIMP Palette\n"
+ gpl += "Name: %s\n" % filename
+ gpl += "Columns: %d\n" % pp.columns
+ gpl += pp.notes
+ if pp.colors.items():
+ for i, color in enumerate(pp.colors):
+ gpl += "%3d%4d%4d %s" % (color.color.r * 255, color.color.g * 255, color.color.b * 255, color.name + '\n')
+ file_preset.write(bytes(gpl, 'UTF-8'))
- if hasattr(self, "add"):
- self.add(context, filepath)
- else:
- file_preset = open(filepath, 'w')
- file_preset.write("import bpy\n")
+ file_preset.close()
- 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")
+ pp.palette_name = filename
-
- 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
@@ -190,180 +298,154 @@
else:
return self.execute(context)
-class ExecutePalettePreset(bpy.types.Operator):
- ''' Executes a preset '''
- bl_idname = "script.execute_preset"
- bl_label = "Execute a Python Preset"
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list