0
$\begingroup$

I want to create something similar to this where I can have custom thumbnails for the mesh file that will be appended/imported from another blend file.

enter image description here

    import os
import re
import bpy
from bpy.props import *
import bpy.utils.previews
from bpy.types import WindowManager


# Append
class OBJECT_OT_AddButton(bpy.types.Operator):
    bl_idname = "add.object"
    bl_label = "Add Object"

    def execute(self, context):
        selected_preview = bpy.data.window_managers["WinMan"].my_previews
        category = context.scene.grass.cat

        # Append Particle System
        bpy.ops.wm.append (directory = os.path.join(os.path.dirname(__file__), "Blends" + os.sep + category + ".blend" + os.sep + "ParticleSettings/"), filepath=category + ".blend", filename=selected_preview)

        return{'FINISHED'}


# Update
def update_category(self, context):
    enum_previews_from_directory_items(self, context)


# Drop Down Menu
class Categories(bpy.types.PropertyGroup):
    mode_options = [
        ("Grass", "Grass", '', 0),
        ("Weeds", "Weeds", '', 1)
        ]

    cat = bpy.props.EnumProperty(
        items=mode_options,
        description="Select a Category",
        default="Grass",
        update=update_category
    )


# Generate Previews
def enum_previews_from_directory_items(self, context):

    category = context.scene.grass.cat

    # Icons Directory
    directory = os.path.join(os.path.dirname(__file__), "Icons" + os.sep + category)

    # EnumProperty Callback
    enum_items = []

    if context is None:
        return enum_items

    wm = context.window_manager

    # Get the Preview Collection (defined in register func)
    pcoll = preview_collections["main"]

    if directory == pcoll.my_previews_dir:
        return pcoll.my_previews

    print("Scanning directory: %s" % directory)

    if directory and os.path.exists(directory):
        # Scan the Directory for PNG Files
        image_paths = []
        for fn in os.listdir(directory):
            if fn.lower().endswith(""):
                image_paths.append(fn)

        # For each image in the directory, load the thumb unless it has already been loaded
        for i, name in enumerate(image_paths):
            # Generate a Thumbnail Preview for a File.
            filepath = os.path.join(directory, name)

            if filepath in pcoll:
                enum_items.append((name, name, "", pcoll[filepath].icon_id, i))
            else:
                thumb = pcoll.load(filepath, filepath, 'IMAGE')
                enum_items.append((name, name, "", thumb.icon_id, i))

    pcoll.my_previews = enum_items
    pcoll.my_previews_dir = directory
    return pcoll.my_previews


# Panel
class PreviewsPanel(bpy.types.Panel):
    # Create a Panel in the Tool Shelf
    bl_category = "Edger"
    bl_label = "Grass Free"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'

    # Draw
    def draw(self, context):
        layout = self.layout
        wm = context.window_manager

        # Drop Down Menu
        col = layout.column()
        col.prop(context.scene.grass, "cat", text="Category")

        # Previews
        row = layout.row()
        row.template_icon_view(wm, "my_previews", show_labels=True)

        # Add Button
        row = layout.row()
        row.operator("add.object", icon="ZOOMIN", text="Add")

preview_collections = {}

#####################################################################

# Register
def register():

    bpy.utils.register_module(__name__)

    WindowManager.my_previews_dir = StringProperty(
            name = "Folder Path",
            subtype = 'DIR_PATH',
            default = "")

    WindowManager.my_previews = EnumProperty(
            items = enum_previews_from_directory_items)

    pcoll = bpy.utils.previews.new()
    pcoll.my_previews_dir = ""
    pcoll.my_previews = ()

    preview_collections["main"] = pcoll
    bpy.types.Scene.grass = bpy.props.PointerProperty(type=Categories)


# Unregister
def unregister():

    del WindowManager.my_previews

    for pcoll in preview_collections.values():
        bpy.utils.previews.remove(pcoll)
    preview_collections.clear()

    bpy.utils.unregister_module(__name__)

    del bpy.types.Scene.grass


if __name__ == "__main__":
    register()
$\endgroup$
6
  • $\begingroup$ What have you got so far, what have you tried and where did it fail? Could you post some example code snippets? $\endgroup$ Jun 19, 2017 at 23:21
  • $\begingroup$ 3d-wolf.com/uploads/2/9/9/4/29944523/grass_free.zip $\endgroup$
    – Retrax
    Jun 19, 2017 at 23:34
  • $\begingroup$ It's a free addon by "Wolf" that utilizes blender files for libraries for some grass objects, I just can figure out about how he did that, you can download the script and check it out. $\endgroup$
    – Retrax
    Jun 19, 2017 at 23:36
  • $\begingroup$ Is that code that you wrote or is that from the mentioned addon? $\endgroup$ Jun 20, 2017 at 0:09
  • $\begingroup$ It is from the addon, I can't get it into my grips, there are two blend files from which the addon imports stuff, I can understand what he meant by context.scene.grass.cat, please can you check out the file and maybe give me some answers. $\endgroup$
    – Retrax
    Jun 20, 2017 at 0:31

0

You must log in to answer this question.

Browse other questions tagged .