[Bf-extensions-cvs] [8b7a781] master: Initial Commit materials library: T51230 T50357
meta-androcto
noreply at git.blender.org
Mon Apr 24 02:33:59 CEST 2017
Commit: 8b7a78110f4a702018e23672361f228d15d2e6f5
Author: meta-androcto
Date: Mon Apr 24 10:33:31 2017 +1000
Branches: master
https://developer.blender.org/rBA8b7a78110f4a702018e23672361f228d15d2e6f5
Initial Commit materials library: T51230 T50357
===================================================================
A materials_library_vx/__init__.py
A materials_library_vx/cycles_templates.blend
A materials_library_vx/materials.blend
===================================================================
diff --git a/materials_library_vx/__init__.py b/materials_library_vx/__init__.py
new file mode 100644
index 0000000..39bb55d
--- /dev/null
+++ b/materials_library_vx/__init__.py
@@ -0,0 +1,1203 @@
+# ##### 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 LICENSE BLOCK #####
+# contributed to by meta-androcto
+
+bl_info = {
+ "name": "Material Library VX",
+ "author": "Mackraken",
+ "version": (1, 0, 1),
+ "blender": (2, 77, 0),
+ "location": "Properties > Material",
+ "description": "Material Library VX",
+ "warning": "",
+ "wiki_url": "https://sites.google.com/site/aleonserra/home/scripts/matlib-vx-5-6",
+ "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
+ "category": "Material"}
+
+# TODO: translate comments, cleanup imports, remove dead code, fix xml set fiter crash
+
+import bpy
+import json
+import zipfile
+import urllib.request
+import os
+import sys
+import re
+import csv
+import codecs
+import collections
+import subprocess
+import webbrowser
+from bpy.types import (
+ Operator,
+ Menu,
+ Panel,
+ PropertyGroup,
+ AddonPreferences,
+ )
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ IntProperty,
+ StringProperty,
+ PointerProperty,
+ )
+
+
+dev = False
+matlib_path = os.path.dirname(__file__)
+
+if dev:
+ matlib_path = r"D:\Blender Foundation\Blender\2.72\scripts\addons\matlib"
+
+
+# debug print variables
+def dd(*args, dodir=False):
+ if dev:
+ if dodir:
+ print(dir(*args))
+ print(*args)
+
+
+# add-on settings
+def addon_settings():
+ # separate function just for more convience
+ addon = bpy.context.user_preferences.addons[__name__]
+ compact = addon.preferences.use_brushes_menu_type
+
+ return compact
+
+
+# Regular Functions
+def winpath(path):
+ return path.replace("\\", "\\\\")
+
+
+def update_search_index(self, context):
+ search = self.search
+ for i, it in enumerate(self.materials):
+ if it.name == search:
+ self.mat_index = i
+ break
+
+
+def check_path(path):
+ # isabs sometimes returns true on relpaths
+ if path and os.path.exists(path) and os.path.isfile(path) and os.path.isabs(path):
+ try:
+ if bpy.data.filepath and bpy.path.relpath(bpy.data.filepath) == bpy.path.relpath(path):
+ return False
+ except:
+ pass
+ # paths are on different drives. No problem then
+ return True
+ return False
+
+
+def update_lib_index(self, context):
+ self.load_library()
+
+
+def update_cat_index(self, context):
+ dd("cat index:", self.current_category, self.filters)
+
+ if self.filters:
+ self.filters = True
+
+
+def update_filter(self, context):
+
+ dd("filter:", self.filters, self.cat_index, self.current_category)
+ """
+ index = self.cat_index
+
+ if self.filters:
+ cat = self.current_category
+ else:
+ cat = ""
+
+ self.current_library.filters = cat
+ """
+ self.update_list()
+
+
+def check_index(collection, index):
+ count = len(collection)
+ return count > 0 and index < count and index >= 0
+
+
+def send_command(cmd, output="sendmat.py"):
+ bin = winpath(bpy.app.binary_path)
+ scriptpath = winpath(os.path.join(matlib_path, output))
+
+ with open(scriptpath, "w") as f:
+ f.write(cmd)
+
+ if output == "createlib.py":
+ code = subprocess.call([bin, "-b", "-P", scriptpath])
+ else:
+ libpath = winpath(bpy.context.scene.matlib.current_library.path)
+ code = subprocess.call([bin, "-b", libpath, "-P", scriptpath])
+
+ # code returns 0 if ok, 1 if not
+ return abs(code - 1)
+
+
+def list_materials(path, sort=False):
+ list = []
+ with bpy.data.libraries.load(path) as (data_from, data_to):
+ for mat in data_from.materials:
+ list.append(mat)
+
+ if sort:
+ list = sorted(list)
+ return list
+
+
+# category properties (none atm)
+class EmptyGroup(PropertyGroup):
+ pass
+
+
+bpy.utils.register_class(EmptyGroup)
+
+
+class matlibMaterials(PropertyGroup):
+ category = StringProperty()
+
+
+bpy.utils.register_class(matlibMaterials)
+
+
+# bpy.types.Scene.matlib_categories = CollectionProperty(type=EmptyGroup)
+
+
+# CATEGORIES
+class Categories():
+
+ # cats = bpy.context.scene.matlib.categories
+
+ def __init__(self, cats):
+ self.cats = cats
+
+ def save(self):
+ scn = bpy.context.scene
+ cats = set([cat.name for cat in self.cats])
+ libpath = bpy.context.scene.matlib.current_library.path
+
+ cmd = """
+print(30*"+")
+import bpy
+if not hasattr(bpy.context.scene, "matlib_categories"):
+ class EmptyProps(bpy.types.PropertyGroup):
+ pass
+ bpy.utils.register_class(EmptyProps)
+ bpy.types.Scene.matlib_categories = bpy.props.CollectionProperty(type=EmptyProps)
+cats = bpy.context.scene.matlib_categories
+for cat in cats:
+ cats.remove(0)
+"""
+ for cat in cats:
+ cmd += """
+cat = cats.add()
+cat.name = "%s" """ % cat.capitalize()
+ cmd += '''
+bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True)''' % winpath(libpath)
+
+ return send_command(cmd, "save_categories.py")
+
+ def read(self, pull=True):
+ # mandar a imprimir el listado
+ catfile = winpath(os.path.join(matlib_path, "categories.txt"))
+ cmd = """
+import bpy, json
+class EmptyProps(bpy.types.PropertyGroup):
+ pass
+bpy.utils.register_class(EmptyProps)
+bpy.types.Scene.matlib_categories = bpy.props.CollectionProperty(type=EmptyProps)
+cats = []
+for cat in bpy.context.scene.matlib_categories:
+ materials = []
+ for mat in bpy.data.materials:
+ if "category" in mat.keys() and mat['category'] == cat.name:
+ materials.append(mat.name)
+ cats.append([cat.name, materials])
+with open("%s", "w") as f:
+ f.write(json.dumps(cats, sort_keys=True, indent=4))
+""" % catfile
+ if pull:
+ send_command(cmd)
+
+ # leer el fichero
+ with open(catfile, "r") as f:
+ cats = json.loads(f.read())
+
+ dd(cats)
+ """
+ # refrescar categorias
+ for cat in self.cats:
+ self.cats.remove(0)
+
+ for cat in cats:
+ item = self.cats.add()
+ item.name = cat
+ """
+ return cats
+
+ def view(self):
+ for cat in self.cats:
+ dd(cat.name)
+
+ def add(self, name):
+ if name and name not in [item.name for item in self.cats]:
+ name = name.strip().capitalize()
+ item = self.cats.add()
+ item.name = name
+ if self.save():
+ dd(name, "added")
+ return True
+ else:
+ dd("duplicated?")
+
+ def remove(self, index):
+ self.cats.remove(index)
+ self.save()
+
+
+class Library():
+
+ def __init__(self, name):
+ self.name = name
+ self.path = os.path.join(matlib_path, name)
+ """
+ @property
+ def default(self):
+ return self.name == default_library
+ """
+ @property
+ def shortname(self):
+ # if self.default:
+ # return "Default Library"
+ return bpy.path.display_name(self.name).title()
+
+ def __repr__(self):
+ return str(type(self).__name__) + "('" + self.name + "')"
+
+
+# bpy.utils.register_class(Library)
+
+def get_libraries():
+ libs = [Library(f) for f in os.listdir(matlib_path) if f[-5::] == "blend"]
+ return sorted(libs, key=lambda x: bpy.path.display_name(x.name))
+
+
+libraries = get_libraries()
+
+
+# MATLIB CLASS
+class matlibProperties(PropertyGroup):
+
+ # MATLIB PROPERTIES
+
+ # libraries are read from the xml
+ lib_index = IntProperty(
+ min=-1,
+ default=-1,
+ update=update_lib_index
+ )
+ all_materials = CollectionProperty(
+ type=matlibMaterials
+ )
+ materials = CollectionProperty(
+ type=matlibMaterials
+ )
+ mat_index = IntProperty(
+ min=-1, default=-1
+ )
+ categories = CollectionProperty(
+ type=EmptyGroup
+ )
+ cat_index = IntProperty(
+ min=-1,
+ default=-1,
+ update=update_cat_index
+ )
+ search = StringProperty(
+ name="Search",
+ description="Find By Name",
+ update=update_search_index
+ )
+
+ # MATLIB OPTIONS
+ # link: import material linked
+ # force import:
+ # if disable it wont import a material if its present in the scene,(avoid duplicates)
+ # instead it will apply the scene material rather than importing the same one from the library
+ # filters: enable or disable category filter
+ # last selected: store the last selected object to regain focus when apply a material.
+ # hide_search: Hides Search Field
+
+ link = BoolProperty(
+ name="Linked",
+ description="Link the material",
+ default=False
+ )
+ force_import = BoolProperty(
+ name="Force Import",
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list