[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