diff options
author | meta-androcto <meta.androcto1@gmail.com> | 2017-04-25 07:55:11 +0300 |
---|---|---|
committer | meta-androcto <meta.androcto1@gmail.com> | 2017-04-25 07:55:11 +0300 |
commit | 0ca01cc32d5543ecb77c9a91cbdcfd37eaa07b43 (patch) | |
tree | 00122f86536d80c06cb575f36d688d52a09687e4 /materials_library_vx | |
parent | 8b7a78110f4a702018e23672361f228d15d2e6f5 (diff) |
matlibvx: revert ui changes
Diffstat (limited to 'materials_library_vx')
-rw-r--r-- | materials_library_vx/README.txt | 75 | ||||
-rw-r--r-- | materials_library_vx/__init__.py | 2009 |
2 files changed, 992 insertions, 1092 deletions
diff --git a/materials_library_vx/README.txt b/materials_library_vx/README.txt new file mode 100644 index 00000000..8a9b6ccc --- /dev/null +++ b/materials_library_vx/README.txt @@ -0,0 +1,75 @@ +# #####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 ##### + +bl_info = { + "name": "Material Library", + "author": "Mackraken (mackraken2023@hotmail.com)", + "version": (0, 5, 61), + "blender": (2, 7, 2), + "api": 60995, + "location": "Properties > Material", + "description": "Material Library VX", + "warning": "", + "wiki_url": "https://sites.google.com/site/aleonserra/home/scripts/matlib-vx", + "tracker_url": "", + "category": "System"} + +MATLIB 5.6.1 + +Installation: +- AVOID USING THE INSTALL ADDON BUTTON +- Copy the matlib folder inside Blender's addons. +Example: D:\Blender\2.72\scripts\addon\ + +- Start Blender. +- Goto File->User Preferences->Addons +- Enable "Material Library" + + +Updates: +v 0.5.61 +- Libraries arent read on each draw call, only on startup or when added. This fixes potential crashes and is less stressful, but when a library is deleted blender should be restarted. +-Moved the addon from "System" category to "Materials" + +v 0.5.6 +- Create new libraries. + Libraries are read from the matlib folder. If you want to change this behaviour, edit the variable "matlib_path" at line 40. (Untested) + + To delete a library delete the blend file within the matlib folder. + +- Apply material to all selected objects. + +- Apply material in edit mesh mode. + +- Improved Material preview. + You can apply a material to the last selected object/s while you are previewing. + +- Categories are saved within the library blend file. + +- More warnings when things goes wrong. + +- Options Added: + - Force Import. False By default. + This option helps to avoid material duplicates when the same material its applied several times. + When this option is disabled the script will try to find the selected material within the working scene, instead of importing a new one from the library. + - Linked. + Import the material by making a link to the library. + - Hide search. + Shows or hides the search box. + + diff --git a/materials_library_vx/__init__.py b/materials_library_vx/__init__.py index 39bb55d2..1556fb7b 100644 --- a/materials_library_vx/__init__.py +++ b/materials_library_vx/__init__.py @@ -1,4 +1,4 @@ -# ##### BEGIN GPL LICENSE BLOCK ##### +# #####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 @@ -14,1190 +14,1015 @@ # 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 +# #####END GPL LICENSE BLOCK ##### 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"} + "name": "Material Library", + "author": "Mackraken (mackraken2023@hotmail.com)", + "version": (0, 5, 6), + "blender": (2, 7, 2), + "api": 60995, + "location": "Properties > Material", + "description": "Material Library VX", + "warning": "", + "wiki_url": "https://sites.google.com/site/aleonserra/home/scripts/matlib-vx", + "tracker_url": "", + "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, - ) +import bpy, os, json +from bpy.props import * +print (30*"-") dev = False + matlib_path = os.path.dirname(__file__) if dev: - matlib_path = r"D:\Blender Foundation\Blender\2.72\scripts\addons\matlib" - + matlib_path = r"D:\Blender Foundation\Blender\2.72\scripts\addons\matlib" -# debug print variables +##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 + if dev: + if dodir: + print(dir(*args)) + print(*args) - -# Regular Functions +#Regular Functions def winpath(path): - return path.replace("\\", "\\\\") - - + 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 - - + 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 - + #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() - + self.load_library() def update_cat_index(self, context): - dd("cat index:", self.current_category, self.filters) - - if self.filters: - self.filters = True + dd("cat index:", self.current_category, self.filter) + if self.filter: + self.filter = 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() - - + + dd("filter:", self.filter, self.cat_index, self.current_category) +# index = self.cat_index +# +# if self.filter: +# cat = self.current_category +# else: +# cat = "" +# +# self.current_library.filter = cat + self.update_list() + def check_index(collection, index): - count = len(collection) - return count > 0 and index < count and index >= 0 - + 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) - - + bin = winpath(bpy.app.binary_path) + scriptpath = winpath(os.path.join(matlib_path, output)) + + with open(scriptpath, "w") as f: + f.write(cmd) + + import subprocess + + 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 - - + 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(bpy.types.PropertyGroup): + pass bpy.utils.register_class(EmptyGroup) - -class matlibMaterials(PropertyGroup): - category = StringProperty() - - +class matlibMaterials(bpy.types.PropertyGroup): + category = StringProperty() bpy.utils.register_class(matlibMaterials) +#bpy.types.Scene.matlib_categories = CollectionProperty(type=EmptyGroup) -# bpy.types.Scene.matlib_categories = CollectionProperty(type=EmptyGroup) - - -# CATEGORIES +### 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 = """ + + #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) + 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) + cats.remove(0) """ - for cat in cats: - cmd += """ + for cat in cats: + cmd += """ cat = cats.add() cat.name = "%s" """ % cat.capitalize() - cmd += ''' + cmd +=''' bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True)''' % winpath(libpath) - return send_command(cmd, "save_categories.py") + 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 = """ + 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 + 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)) + 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() - + 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 __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)) - + 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", - description="Use Scene Materials by default", - default=False - ) - filters = BoolProperty( - name="Filter", - description="Filter Categories", - default=False, - update=update_filter - ) - show_prefs = BoolProperty( - name="show_prefs", - description="Preferences", - default=False - ) - last_selected = StringProperty( - name="Last Selected" - ) - hide_search = BoolProperty( - name="Hide Search", - description="Use Blender Search Only" - ) - - # import_file = StringProperty("Import File", subtype="FILE_PATH") - # path = os.path.dirname(path) - # Development only - - @property - def libraries(self): - global libraries - return libraries - - @property - def current_library(self): - if check_index(libraries, self.lib_index): - return libraries[self.lib_index] - - @property - def active_material(self): - if check_index(self.materials, self.mat_index): - return self.materials[self.mat_index] - - def reload(self): - dd("loading libraries") - - if self.current_library: - self.load_library() - elif self.lib_index == -1 and len(libraries): - self.lib_index = 0 - - def add_library(self, path, setEnabled=False): - # sanitize path - ext = os.path.extsep + "blend" - if not path.endswith(ext): - path += ext - - if check_path(path): - # if path == default_library: - # return 'ERROR', "Cannot add default library." - # if path in [lib.path for lib in self.libraries]: - return 'ERROR', "Library already exists." - else: - dd("Can't find " + path) - # create file - cmd = ''' +### MATLIB CLASS +class matlibProperties(bpy.types.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 + #filter: 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", description="Use Scene Materials by default", default = False) + filter = BoolProperty(name = "Filter",description="Filter Categories", default = False, update=update_filter) + show_prefs = BoolProperty(name = "show_prefs", description="Preferences", default = False) + last_selected = StringProperty(name="Last Selected") + hide_search = BoolProperty(name="Hide Search", description="Use Blender Search Only") + #import_file = StringProperty("Import File", subtype="FILE_PATH") + #path = os.path.dirname(path) + #Development only + + @property + def libraries(self): + global libraries + return libraries + + @property + def current_library(self): + if check_index(libraries, self.lib_index): + return libraries[self.lib_index] + @property + def active_material(self): + if check_index(self.materials, self.mat_index): + return self.materials[self.mat_index] + + def reload(self): + dd("loading libraries") + + if self.current_library: + self.load_library() + elif self.lib_index == -1 and len(libraries): + self.lib_index = 0 + + + def add_library(self, path, setEnabled = False): + #sanitize path + ext = os.path.extsep + "blend" + if not path.endswith(ext): + path += ext + + if check_path(path): +# if path == default_library: +# return 'ERROR', "Cannot add default library." + #if path in [lib.path for lib in self.libraries]: + return 'ERROR', "Library already exists." + else: + dd("Can't find " + path) + #create file + cmd = ''' import bpy bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True)''' % winpath(path) - if not (send_command(cmd, "createlib.py")): - return 'ERROR', "There was an error creating the file. Make sure you run Blender with admin rights." - - # self.libraries = sorted(self.libraries, key=lambda lib: sortlibs(lib)) - dd("adding library", path) - global libraries - libraries = get_libraries() - return "INFO", "Library added" - - def load_library(self): - self.empty_list(True) - if not self.current_library: - return 'ERROR', "Library not found!." - - path = self.current_library.path - - dd("loading library", self.lib_index, path) - - if check_path(path): - self.filters = False - self.cat_index = -1 - - categories = Categories(self.categories) - self.cats = categories.read(True) - self.load_categories() - - for mat in self.all_materials: - self.all_materials.remove(0) - - for mat in list_materials(self.current_library.path, True): - item = self.all_materials.add() - item.name = mat - for cat in self.cats: - if mat in cat[1]: - item.category = cat[0] - break - - self.update_list() - else: - return 'ERROR', "Library not found!" - - def update_list(self): - # THIS HAS TO SORT - self.empty_list() - if self.current_library: - current_category = self.current_category - # sorteditems = sorted(self.all_materials, key=lambda x: x.name) - for mat in self.all_materials: - # print(current_category, mat.category) - if not self.filters or (self.filters and mat.category == current_category) or \ - current_category == "": - item = self.materials.add() - item.name = mat.name - item.category = mat.category - - def empty_list(self, cats=False): - # self.mat_index = -1 - for it in self.materials: - self.materials.remove(0) - - if cats: - for c in self.categories: - self.categories.remove(0) - - # CATEGORIES - @property - def current_category(self): - # print(self.mat_index) - if check_index(self.categories, self.cat_index): - return self.categories[self.cat_index].name - return "" - - def load_categories(self): - - for c in self.categories: - self.categories.remove(0) - - for c in self.cats: - cat = self.categories.add() - cat.name = c[0] - - def add_category(self, name): - if name: - name = name.strip().title() - dd("add category", name) - categories = Categories(self.categories) - - categories.add(name) - """ - if lib: - cat = xml.find("category", name, lib, create = True) - self.load_categories() - else: - return 'ERROR', "Library not found" - """ - def remove_category(self): - dd("removing category", self.current_category) - categories = Categories(self.categories) - categories.remove(self.cat_index) - - def set_category(self): - mat = self.active_material - # dd(lib, mat, self.current_category) - if mat: - # set mat to category - if self.cat_index > -1: - dd(self.current_category) - cat = self.current_category - if cat == self.all_materials[self.mat_index].category: - return - cmd = """ + if not (send_command(cmd, "createlib.py")): + return 'ERROR', "There was an error creating the file. Make sure you run Blender with admin rights." + + #self.libraries = sorted(self.libraries, key=lambda lib: sortlibs(lib)) + dd("adding library", path) + global libraries + libraries = get_libraries() + return "INFO", "Library added" + + def load_library(self): + self.empty_list(True) + if not self.current_library: + return 'ERROR', "Library not found!." + + path = self.current_library.path + + dd("loading library", self.lib_index, path) + + if check_path(path): + self.filter = False + self.cat_index = -1 + + categories = Categories(self.categories) + self.cats = categories.read(True) + self.load_categories() + + for mat in self.all_materials: + self.all_materials.remove(0) + + for mat in list_materials(self.current_library.path, True): + item = self.all_materials.add() + item.name = mat + for cat in self.cats: + if mat in cat[1]: + item.category = cat[0] + break + + self.update_list() + else: + return 'ERROR', "Library not found!." + + def update_list(self): + ### THIS HAS TO SORT + self.empty_list() + if self.current_library: + current_category = self.current_category + #sorteditems = sorted(self.all_materials, key=lambda x: x.name) + for mat in self.all_materials: + #print(current_category, mat.category) + if not self.filter or (self.filter and mat.category == current_category) or current_category == "": + item = self.materials.add() + item.name = mat.name + item.category = mat.category + + def empty_list(self, cats = False): + #self.mat_index = -1 + for it in self.materials: + self.materials.remove(0) + + if cats: + for c in self.categories: + self.categories.remove(0) + + ### CATEGORIES + @property + def current_category(self): + #print(self.mat_index) + if check_index(self.categories, self.cat_index): + return self.categories[self.cat_index].name + return "" + + def load_categories(self): + + for c in self.categories: + self.categories.remove(0) + + for c in self.cats: + cat = self.categories.add() + cat.name = c[0] + + def add_category(self, name): + if name: + name = name.strip().title() + dd("add category", name) + categories = Categories(self.categories) + + categories.add(name) + +# if lib: +# cat = xml.find("category", name, lib, create = True) +# self.load_categories() +# else: +# return 'ERROR', "Library not found" + def remove_category(self): + dd("removing category", self.current_category) + categories = Categories(self.categories) + categories.remove(self.cat_index) + + def set_category(self): + mat = self.active_material + #dd(lib, mat, self.current_category) + if mat: + #set mat to category + if self.cat_index>-1: + dd(self.current_category) + cat = self.current_category + if cat == self.all_materials[self.mat_index].category: + return + cmd = """ import bpy try: - mat = bpy.data.materials['%s'] + mat = bpy.data.materials['%s'] except: - mat = None + mat = None if mat: - mat['category'] = "%s" - bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True) + mat['category'] = "%s" + bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True) """ % (mat.name, cat, winpath(self.current_library.path)) - if send_command(cmd): - self.all_materials[self.mat_index].category = cat - mat.category = cat - else: - return "WARNING", "There was an error." - - # catnode = xml.find("category", self.current_category, lib, True) - # matnode = xml.find("material", mat.name, lib) - # if matnode: - # catnode.appendChild(matnode) - # else: - # matnode = xml.find("material", mat.name, catnode, True) - # xml.save() - # mat.category = cat - # self.current_library.materials[self.mat_index].category = cat - # remove mat from any category - else: - """ - matnode = xml.find("material", mat.name, lib) - if matnode: - xml.deleteNode(matnode) - """ - mat.category = "" - self.current_library.materials[self.mat_index].category = "" - else: - return "WARNING", "Select a material" - - def get_material(self, name, link=False): - with bpy.data.libraries.load(self.current_library.path, link, False) as (data_from, data_to): - data_to.materials = [name] - if link: - print(name + " linked.") - else: - print(name + " appended.") - - def apply(self, context, preview=False): - name = self.active_material.name - if not name: - return "WARNING", "Select a material from the list." - - linked = self.link or preview - force = self.force_import or linked - - objects = [] - active = context.object - dummy = self.get_dummy(context) - - # setup objects - if preview: - if context.mode == "EDIT_MESH": - return "WARNING", "Can't preview on EDIT MODE" - - if dummy != active: - self.last_selected = context.object.name - context.scene.objects.active = dummy - objects.append(dummy) - # apply - else: - objects = [obj for obj in context.selected_objects if hasattr(obj.data, "materials")] - - if not objects: - return "INFO", "Please select an object" - - if dummy == context.object and not preview: - if (len(objects) == 1 and dummy.select): - return "ERROR", "Apply is disabled for the Material Preview Object" - try: - last = context.scene.objects[self.last_selected] - if last in context.selected_objects: - context.scene.objects.active = last - else: - self.last_selected = "" - except: - context.scene.objects.active = None - dummy.select = False -# objects = context.selected_objects - - material = None - - # mira si hay materiales linkados de la libreria actual - for mat in bpy.data.materials: - try: - samelib = bpy.path.relpath(mat.library.filepath) == bpy.path.relpath(self.current_library.path) - except: - samelib = False - - if mat.name == name and mat.library and samelib: - material = mat - dd("encontre linked", name, "no importo nada") - break - - if not force: - # busca materiales no linkados - for mat in bpy.data.materials: - if mat.name == name and not mat.library: - material = mat - dd("encontre no linkado", name, "no importo nada") - break - - if not material: - # go get it - dd("voy a buscarlo") - nmats = len(bpy.data.materials) - self.get_material(name, linked) - if nmats == len(bpy.data.materials) and not linked: - return "ERROR", name + " doesn't exists at library " + str(linked) - else: - for mat in reversed(bpy.data.materials): - if mat.name[0:len(name)] == name: - # careful on how blender writes library paths - try: - samelib = bpy.path.relpath(mat.library.filepath) == \ - bpy.path.relpath(self.current_library.path) - except: - samelib = False - - if linked and mat.library and samelib: - material = mat - dd(name, "importado con link") - break - else: - if not mat.library: - dd(name, "importado sin link") - material = mat - break - if material: - material.use_fake_user = False - material.user_clear() - - # print ("Material", material) - - # if material: - # maybe some test cases doesnt return a material, gotta take care of that - # i cannot think of any case like that right now - # maybe import linked when the database isnt sync - if context.mode == "EDIT_MESH": - obj = context.object - dd(material) - index = -1 - for i, mat in enumerate(obj.data.materials): - if mat == material: - index = i - break - - if index == -1: - obj.data.materials.append(material) - index = len(obj.data.materials) - 1 - dd(index) - import bmesh - bm = bmesh.from_edit_mesh(obj.data) - for f in bm.faces: - if f.select: - f.material_index = index - - else: - for obj in objects: - index = obj.active_material_index - if index < len(obj.material_slots): - obj.material_slots[index].material = None - obj.material_slots[index].material = material - else: - obj.data.materials.append(material) - - if not linked: - bpy.ops.object.make_local(type="SELECT_OBDATA_MATERIAL") - - def add_material(self, mat): - - if not mat: - return 'WARNING', "Select a material from the scene." - - name = mat.name - thispath = winpath(bpy.data.filepath) - libpath = winpath(self.current_library.path) - - if not thispath: - return 'WARNING', "Save this file before export." - - if not libpath: - return 'WARNING', "Library not found!." - - elif bpy.data.is_dirty: - bpy.ops.wm.save_mainfile(check_existing=True) - - if mat.library: - return 'WARNING', 'Cannot export linked materials.' - - dd("adding material", name, libpath) - - overwrite = "" - if name in list_materials(libpath): - overwrite = ''' + if send_command(cmd): + self.all_materials[self.mat_index].category = cat + mat.category = cat + else: + return "WARNING", "There was an error." + +# catnode = xml.find("category", self.current_category, lib, True) +# matnode = xml.find("material", mat.name, lib) +# if matnode: +# catnode.appendChild(matnode) +# else: +# matnode = xml.find("material", mat.name, catnode, True) +# xml.save() +# mat.category = cat +# self.current_library.materials[self.mat_index].category = cat + #remove mat from any category + else: + matnode = xml.find("material", mat.name, lib) + if matnode: + xml.deleteNode(matnode) + mat.category = "" + self.current_library.materials[self.mat_index].category = "" + else: + return "WARNING", "Select a material" + + def get_material(self, name, link=False): + with bpy.data.libraries.load(self.current_library.path, link, False) as (data_from, data_to): + data_to.materials = [name] + if link: + print(name + " linked.") + else: + print(name + " appended.") + + def apply(self, context, preview=False): + name = self.active_material.name + if not name: return "WARNING", "Select a material from the list." + + linked = self.link or preview + force = self.force_import or linked + + objects = [] + active = context.object + dummy = self.get_dummy(context) + + #setup objects + if preview: + if context.mode == "EDIT_MESH": + return "WARNING", "Can't preview on EDIT MODE" + if dummy!= active: + self.last_selected = context.object.name + context.scene.objects.active = dummy + objects.append(dummy) + #apply + else: + objects = [obj for obj in context.selected_objects if hasattr(obj.data, "materials")] + + if not objects: + return "INFO", "Please select an object" + + if dummy == context.object and not preview: + if (len(objects)==1 and dummy.select): + return "ERROR", "Apply is disabled for the Material Preview Object" + try: + last = context.scene.objects[self.last_selected] + if last in context.selected_objects: + context.scene.objects.active = last + else: + self.last_selected = "" + except: + context.scene.objects.active = None + dummy.select = False + #objects = context.selected_objects + + material = None + + #mira si hay materiales linkados de la libreria actual + for mat in bpy.data.materials: + try: + samelib = bpy.path.relpath(mat.library.filepath) == bpy.path.relpath(self.current_library.path) + except: + samelib = False + + if mat.name == name and mat.library and samelib: + material = mat + dd("encontre linked", name, "no importo nada") + break + + if not force: + #busca materiales no linkados + for mat in bpy.data.materials: + if mat.name == name and not mat.library: + material = mat + dd("encontre no linkado", name, "no importo nada") + break + + if not material: + #go get it + dd("voy a buscarlo") + nmats = len(bpy.data.materials) + self.get_material(name, linked) + if nmats == len(bpy.data.materials) and not linked: + return "ERROR", name + " doesn't exists at library " + str(linked) + else: + for mat in reversed(bpy.data.materials): + if mat.name[0:len(name)] == name: + #careful on how blender writes library paths + try: + samelib = bpy.path.relpath(mat.library.filepath) == bpy.path.relpath(self.current_library.path) + except: + samelib = False + + if linked and mat.library and samelib: + material = mat + dd(name, "importado con link") + break + else: + if not mat.library: + dd(name, "importado sin link") + material = mat + break + if material: + material.use_fake_user = False + material.user_clear() + + #print ("Material", material) + + #if material: + #maybe some test cases doesnt return a material, gotta take care of that + #i cannot think of any case like that right now + #maybe import linked when the database isnt sync + if context.mode == "EDIT_MESH": + obj = context.object + dd(material) + index = -1 + for i, mat in enumerate(obj.data.materials): + if mat == material: + index = i + break + + if index == -1: + obj.data.materials.append(material) + index = len(obj.data.materials)-1 + dd(index) + import bmesh + bm = bmesh.from_edit_mesh(obj.data) + for f in bm.faces: + if f.select: + f.material_index = index + + else: + for obj in objects: + index = obj.active_material_index + if index < len(obj.material_slots): + obj.material_slots[index].material = None + obj.material_slots[index].material = material + else: + obj.data.materials.append(material) + + if not linked: + bpy.ops.object.make_local(type="SELECT_OBDATA_MATERIAL") + + def add_material(self, mat): + + if not mat: + return 'WARNING', "Select a material from the scene." + + name = mat.name + thispath = winpath(bpy.data.filepath) + libpath = winpath(self.current_library.path) + + if not thispath: + return 'WARNING', "Save this file before export." + + if not libpath: + return 'WARNING', "Library not found!." + + elif bpy.data.is_dirty: + bpy.ops.wm.save_mainfile(check_existing=True) + + if mat.library: + return 'WARNING', 'Cannot export linked materials.' + + dd("adding material", name, libpath) + + overwrite = "" + if name in list_materials(libpath): + overwrite = ''' mat = bpy.data.materials["%s"] mat.name = "tmp" mat.use_fake_user = False -mat.user_clear()''' % name - - cmd = ''' +mat.user_clear()''' % name + + cmd = ''' import bpy{0} with bpy.data.libraries.load("{1}") as (data_from, data_to): - data_to.materials = ["{2}"] + data_to.materials = ["{2}"] mat = bpy.data.materials["{2}"] mat.use_fake_user=True bpy.ops.file.pack_all() bpy.ops.wm.save_mainfile(filepath="{3}", check_existing=False, compress=True) '''.format(overwrite, thispath, name, libpath) - - if send_command(cmd): - # self.load_library() - if not overwrite: - item = self.all_materials.add() - item.name = name - if "category" in mat.keys(): - item.category = mat['category'] - # reorder all_materials - items = sorted([[item.name, item.category] for item in self.all_materials], - key=lambda x: x[0]) - - self.all_materials.clear() - for it in items: - item = self.all_materials.add() - item.name = it[0] - item.category = it[1] - - self.update_list() - - return 'INFO', "Material added." - else: - print("Save Material Error: Run Blender with administrative priviledges.") - return 'WARNING', "There was an error saving the material" - - def remove_material(self): - name = self.active_material.name - libpath = winpath(self.current_library.path) - if name and libpath and name in list_materials(libpath): - cmd = '''import bpy + + if send_command(cmd): + #self.load_library() + if not overwrite: + item = self.all_materials.add() + item.name = name + if "category" in mat.keys(): + item.category = mat['category'] + #reorder all_materials + items = sorted([[item.name, item.category] for item in self.all_materials], key = lambda x: x[0]) + + self.all_materials.clear() + for it in items: + item = self.all_materials.add() + item.name = it[0] + item.category = it[1] + + self.update_list() + + return 'INFO', "Material added." + else: + print("Save Material Error: Run Blender with administrative priviledges.") + return 'WARNING', "There was an error saving the material" + + def remove_material(self): + name = self.active_material.name + libpath = winpath(self.current_library.path) + if name and libpath and name in list_materials(libpath): + cmd = '''import bpy mat = bpy.data.materials["%s"] mat.use_fake_user = False mat.user_clear() -bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True)''' % (name, libpath) - if send_command(cmd, "removemat.py"): - self.all_materials.remove(self.mat_index) - self.update_list() - else: - return 'ERROR', "There was an error." - return "INFO", name + " removed." - - def get_dummy(self, context): - dummy_name = "Material_Preview_Dummy" - dummy_mesh = "Material_Preview_Mesh" - scn = context.scene - try: - dummy = scn.objects[dummy_name] - except: - # create dummy - try: - me = bpy.data.meshes(dummy_mesh) - except: - me = bpy.data.meshes.new(dummy_mesh) - dummy = bpy.data.objects.new(dummy_name, me) - scn.objects.link(dummy) - - dummy.hide = True - dummy.hide_render = True - dummy.hide_select = True - return dummy - - +bpy.ops.wm.save_mainfile(filepath="%s", check_existing=False, compress=True)''' % (name , libpath) + if send_command(cmd, "removemat.py"): + self.all_materials.remove(self.mat_index) + self.update_list() + else: + return 'ERROR', "There was an error." + return "INFO", name + " removed." + + def get_dummy(self, context): + dummy_name = "Material_Preview_Dummy" + dummy_mesh = "Material_Preview_Mesh" + scn = context.scene + try: + dummy = scn.objects[dummy_name] + except: + #create dummy + try: + me = bpy.data.meshes(dummy_mesh) + except: + me = bpy.data.meshes.new(dummy_mesh) + dummy = bpy.data.objects.new(dummy_name, me) + scn.objects.link(dummy) + + dummy.hide = True + dummy.hide_render = True + dummy.hide_select = True + return dummy + bpy.utils.register_class(matlibProperties) -bpy.types.Scene.matlib = PointerProperty(type=matlibProperties) - - -# MENUS -class matlibLibsMenu(Menu): - bl_idname = "matlib.libs_menu" - bl_label = "Libraries Menu" - bl_description = "Main Categories Menu" - - def draw(self, context): - layout = self.layout - libs = libraries - # layout.operator("matlib.operator", text="Default Library").cmd = "lib-1" - - for i, lib in enumerate(libs): - layout.operator("matlib.operator", text=lib.shortname).cmd = "lib" + str(i) - - -class matlibCatsMenu(Menu): - bl_idname = "matlib.cats_menu" - bl_label = "Categories Menu" - bl_description = "Sub Categories Menu" - - def draw(self, context): - layout = self.layout - cats = context.scene.matlib.categories - layout.operator("matlib.operator", text="All").cmd = "cat-1" - - for i, cat in enumerate(cats): - layout.operator("matlib.operator", text=cat.name).cmd = "cat" + str(i) - - -# OPERATORS - -class matlibOperator(Operator): - """Add, Remove, Reload, Apply, Preview, Clean Material""" - bl_label = "New" - bl_idname = "matlib.operator" - __doc__ = "Add, Remove, Reload, Apply, Preview, Clean Material" - - category = StringProperty( - name="Category" - ) - filepath = StringProperty( - options={'HIDDEN'} - ) - cmd = StringProperty( - name="Command", - options={'HIDDEN'} - ) - filter_glob = StringProperty( - default="*.blend", - options={'HIDDEN'} - ) - - @classmethod - def poll(cls, context): - return context.active_object is not None - - def draw(self, context): - layout = self.layout - # cmd = LIBRARY_ADD - if self.cmd == "LIBRARY_ADD": - # layout.label("Select a blend file as library or") - # layout.label("Type a name to create a new library.") - layout.prop(self, "category", text="Library") - elif self.cmd == "FILTER_ADD": - layout.prop(self, "category") - - def invoke(self, context, event): - cmd = self.cmd - print("invoke", cmd) - - if cmd == "LIBRARY_ADD": - self.filepath = matlib_path + os.path.sep - dd("filepath", self.filepath, matlib_path) - # context.window_manager.fileselect_add(self) - context.window_manager.invoke_props_dialog(self) - return {'RUNNING_MODAL'} - elif cmd == "FILTER_ADD": - context.window_manager.invoke_props_dialog(self) - return {'RUNNING_MODAL'} - return self.execute(context) - - def execute(self, context): - # TODO: execute doesnt trigger remove - success = "" - matlib = context.scene.matlib - - if self.cmd == "init": - print("initialize") - return {'FINISHED'} - - # Library Commands - if self.cmd[0:3] == "lib": - index = int(self.cmd[3::]) - matlib.lib_index = index - # success = matlib.load_library() - elif self.cmd == "LIBRARY_ADD": - dd("execute lib add") - libname = self.category - if libname[-6::] != ".blend": - libname += ".blend" - libname = os.path.join(matlib_path, libname) - print(libname) - - success = matlib.add_library(libname, True) - for i, l in enumerate(libraries): - if l.name == self.category: - matlib.lib_index = i - break - - elif self.cmd == "RELOAD": - success = matlib.reload() - - if not matlib.current_library: - self.report({'ERROR'}, "Select a Library") - return {'CANCELLED'} - - if self.cmd == "FILTER_ADD": - success = matlib.add_category(self.category) - for i, cat in enumerate(matlib.categories): - if cat.name == self.category: - matlib.cat_index = i - break - - elif self.cmd == "FILTER_REMOVE": - matlib.remove_category() - - elif self.cmd == "FILTER_SET": - success = matlib.set_category() - - elif self.cmd[0:3] == "cat": - index = int(self.cmd[3::]) - matlib.cat_index = index - - # Common Commands - elif self.cmd == "ADD": - success = matlib.add_material(context.object.active_material) - - elif self.cmd == "REMOVE": - success = matlib.remove_material() - - elif self.cmd == "APPLY": - success = matlib.apply(context) - - elif self.cmd == "PREVIEW": - success = matlib.apply(context, True) - - elif self.cmd == "FLUSH": - # release dummy materials - dummy = matlib.get_dummy(context) - if dummy == context.object: - try: - context.scene.objects.active = scn.objects[matlib.last_selected] - except: - pass - - for slot in dummy.material_slots: - slot.material = None - i = 0 - for mat in bpy.data.materials: - if mat.users == 0: - i += 1 - print(mat.name, "removed.") - bpy.data.materials.remove(mat) - - plural = "s" - if i == 1: - plural = "" - - self.report({'INFO'}, str(i) + " material" + plural + " removed.") - - # CONVERT - elif self.cmd == "CONVERT": - return {'FINISHED'} - lib = matlib.current_library - if lib: - - path = os.path.join(matlib_path, "www") - if not os.path.exists(path): - os.mkdir(path) - path = os.path.join(path, lib.shortname) - if not os.path.exists(path): - os.mkdir(path) - - path = winpath(path) - libpath = winpath(lib.name) - - print(path) - print(libpath) - -# decirle a la libreria que cree un fichero blend por cada material que tenga. - cmd = """ +bpy.types.Scene.matlib = PointerProperty(type = matlibProperties) + +### MENUS +class matlibLibsMenu(bpy.types.Menu): + bl_idname = "matlib.libs_menu" + bl_label = "Libraries Menu" + + def draw(self, context): + layout = self.layout + libs = libraries + #layout.operator("matlib.operator", text="Default Library").cmd="lib-1" + for i, lib in enumerate(libs): + layout.operator("matlib.operator", text=lib.shortname).cmd="lib"+str(i) + +class matlibCatsMenu(bpy.types.Menu): + bl_idname = "matlib.cats_menu" + bl_label = "Categories Menu" + + def draw(self, context): + layout = self.layout + cats = context.scene.matlib.categories + layout.operator("matlib.operator", text="All").cmd="cat-1" + for i, cat in enumerate(cats): + layout.operator("matlib.operator", text=cat.name).cmd="cat"+str(i) + +### OPERATORS + +class matlibOperator(bpy.types.Operator): + """Add, Remove, Reload, Apply, Preview, Clean Material""" + bl_label = "New" + bl_idname = "matlib.operator" + __doc__ = "Add, Remove, Reload, Apply, Preview, Clean Material" + + category = StringProperty(name="Category") + filepath = StringProperty(options={'HIDDEN'}) + cmd = bpy.props.StringProperty(name="Command", options={'HIDDEN'}) + filter_glob = StringProperty(default="*.blend", options={'HIDDEN'}) + @classmethod + def poll(cls, context): + return context.active_object is not None + + def draw(self, context): + layout = self.layout + #cmd = LIBRARY_ADD + if self.cmd == "LIBRARY_ADD": + #layout.label("Select a blend file as library or") + #layout.label("Type a name to create a new library.") + layout.prop(self, "category", text="Library") + elif self.cmd == "FILTER_ADD": + layout.prop(self, "category") + + def invoke(self, context, event): + + cmd = self.cmd + print("invoke", cmd) + + if cmd == "LIBRARY_ADD": + self.filepath = matlib_path + os.path.sep + dd("filepath", self.filepath, matlib_path) + #context.window_manager.fileselect_add(self) + context.window_manager.invoke_props_dialog(self) + return {'RUNNING_MODAL'} + elif cmd == "FILTER_ADD": + context.window_manager.invoke_props_dialog(self) + return {'RUNNING_MODAL'} + return self.execute(context) + + ### TODO: execute doesnt trigger remove + def execute(self, context): + + success = "" + matlib = context.scene.matlib + + if self.cmd == "init": + print("initialize") + return {'FINISHED'} + + #Library Commands + if self.cmd[0:3] == "lib": + index = int(self.cmd[3::]) + matlib.lib_index = index + #success = matlib.load_library() + elif self.cmd == "LIBRARY_ADD": + dd("execute lib add") + libname = self.category + if libname[-6::] != ".blend": libname+= ".blend" + libname = os.path.join(matlib_path, libname) + print(libname) + + success = matlib.add_library(libname, True) + for i, l in enumerate(libraries): + if l.name == self.category: + matlib.lib_index = i + break + + elif self.cmd == "RELOAD": + success = matlib.reload() + + if not matlib.current_library: + self.report({'ERROR'}, "Select a Library") + return {'CANCELLED'} + + if self.cmd == "FILTER_ADD": + success = matlib.add_category(self.category) + for i, cat in enumerate(matlib.categories): + if cat.name == self.category: + matlib.cat_index = i + break + + elif self.cmd == "FILTER_REMOVE": + matlib.remove_category() + + elif self.cmd == "FILTER_SET": + success = matlib.set_category() + + elif self.cmd[0:3] == "cat": + index = int(self.cmd[3::]) + matlib.cat_index = index + + #Common Commands + elif self.cmd == "ADD": + success = matlib.add_material(context.object.active_material) + + elif self.cmd == "REMOVE": + success = matlib.remove_material() + + + elif self.cmd == "APPLY": + success = matlib.apply(context) + + elif self.cmd == "PREVIEW": + success = matlib.apply(context, True) + + elif self.cmd=="FLUSH": + #release dummy materials + dummy = matlib.get_dummy(context) + if dummy == context.object: + try: + context.scene.objects.active = scn.objects[matlib.last_selected] + except: + pass + + for slot in dummy.material_slots: + slot.material = None + i=0 + for mat in bpy.data.materials: + if mat.users==0: + i+=1 + print (mat.name, "removed.") + bpy.data.materials.remove(mat) + + plural = "s" + if i==1: + plural = "" + + self.report({'INFO'}, str(i) + " material"+plural+" removed.") + + ### CONVERT + elif self.cmd == "CONVERT": + return {'FINISHED'} + lib = matlib.current_library + if lib: + + path = os.path.join(matlib_path, "www") + if not os.path.exists(path): + os.mkdir(path) + path = os.path.join(path, lib.shortname) + if not os.path.exists(path): + os.mkdir(path) + + path = winpath(path) + libpath = winpath(lib.name) + + print(path) + print(libpath) + + #decirle a la libreria que cree un fichero blend por cada material que tenga. + cmd = """ print(30*"+") import bpy, os def list_materials(): - list = [] - with bpy.data.libraries.load("{0}") as (data_from, data_to): - for mat in data_from.materials: - list.append(mat) - return sorted(list) - -def get_material(name, link=False): - with bpy.data.libraries.load("{0}", link, False) as (data_from, data_to): - data_to.materials = [name] - if link: - print(name + " linked.") - else: - print(name + " appended.") - + list = [] + with bpy.data.libraries.load("{0}") as (data_from, data_to): + for mat in data_from.materials: + list.append(mat) + return sorted(list) + +def get_material(name, link=False): + with bpy.data.libraries.load("{0}", link, False) as (data_from, data_to): + data_to.materials = [name] + if link: + print(name + " linked.") + else: + print(name + " appended.") + for scn in bpy.data.scenes: - for obj in scn.objects: - scn.objects.unlink(obj) - obj.user_clear() - bpy.data.objects.remove(obj) + for obj in scn.objects: + scn.objects.unlink(obj) + obj.user_clear() + bpy.data.objects.remove(obj) def clean_materials(): - for mat in bpy.data.materials: - mat.user_clear() - bpy.data.materials.remove(mat) - + for mat in bpy.data.materials: + mat.user_clear() + bpy.data.materials.remove(mat) + bin = bpy.app.binary_path mats = list_materials() bpy.context.user_preferences.filepaths.save_version = 0 for mat in mats: - clean_materials() - matpath = os.path.join("{1}", mat + ".blend") - print(matpath) - get_material(mat) - material = bpy.data.materials[0] - material.use_fake_user = True - bpy.ops.wm.save_mainfile(filepath = matpath, compress=True, check_existing=False) + clean_materials() + matpath = os.path.join("{1}", mat + ".blend") + print(matpath) + get_material(mat) + material = bpy.data.materials[0] + material.use_fake_user = True + bpy.ops.wm.save_mainfile(filepath = matpath, compress=True, check_existing=False) """.format(libpath, path) - print(cmd) - send_command(cmd, "createlib.py") - - if type(success).__name__ == "tuple": - print(success) - self.report({success[0]}, success[1]) - - return {'FINISHED'} - - -class matlibvxPanel(Panel): - bl_label = "Material Library VX" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(self, context): - return context.active_object.active_material is not None - - def draw(self, context): - layout = self.layout - matlib = context.scene.matlib - """ - # hyper ugly trick but i dont know how to init classes at register time - if matlibProperties.init: - matlibProperties.init = False - matlib.__init__() - """ - # libaries - row = layout.row(align=True) - if matlib.current_library: - text = matlib.current_library.shortname - else: - text = "Select Library" - row.menu("matlib.libs_menu", text=text) - if matlib.active_material: - row.label(matlib.active_material.category) - else: - row.label("") - - # search - if not matlib.hide_search: - row = layout.row() - row.prop_search(matlib, "search", matlib, "materials", text="", icon="VIEWZOOM") - - # list - col = self.layout.column(align=True) - row = col.row(align=True) - row.template_list("UI_UL_list", " ", matlib, "materials", matlib, "mat_index", rows=6) - - col = self.layout.column(align=True) - row = col.row(align=True) - # operators - row.operator("matlib.operator", icon="MATERIAL", text="Apply").cmd = "APPLY" - row.operator("matlib.operator", icon="COLOR", text="Preview").cmd = "PREVIEW" - - col = self.layout.column(align=True) - row = col.row(align=True) - row.operator("matlib.operator", icon="ZOOMIN", text="Add Mat").cmd = "ADD" - row.operator("matlib.operator", icon="ZOOMOUT", text="Remove Mat").cmd = "REMOVE" - - col = self.layout.column(align=True) - row = col.row(align=True) - row.operator("matlib.operator", icon="FILE_REFRESH", text="Reload").cmd = "RELOAD" - row.operator("matlib.operator", icon="GHOST_DISABLED", text="Flush Unused").cmd = "FLUSH" - - col = self.layout.column(align=True) - row = col.row(align=True) - col.prop(matlib, "show_prefs", icon="MODIFIER", text="Advanced") - - # prefs - if matlib.show_prefs: - row = layout.row() - row.prop(matlib, "force_import") - row.prop(matlib, "link") - row = layout.row() - row.prop(matlib, "hide_search") - # row = layout.row(align=True) - # row = layout.row() - # row.operator("matlib.operator", icon="URL", text="Convert Library").cmd = "CONVERT" - # categories - row = layout.row() - row.operator("matlib.operator", icon="ZOOMIN", text="Add library").cmd = "LIBRARY_ADD" - row = layout.row(align=True) - text = "All" - if matlib.current_category: - text = matlib.current_category - - if addon_settings() == "normal": - col = self.layout.column(align=True) - row = col.row(align=True) - row.menu("matlib.cats_menu", text=text) - col = self.layout.column(align=True) - row = col.row(align=True) - row.prop(matlib, "filters", icon="FILTER", text="Filter Category") - row.operator("matlib.operator", icon="FILE_PARENT", text="Set Filter").cmd = "FILTER_SET" - col = self.layout.column(align=True) - row = col.row(align=True) - row.operator("matlib.operator", icon="ZOOMIN", text="Add Filter").cmd = "FILTER_ADD" - row.operator("matlib.operator", icon="ZOOMOUT", text="Remove Filter").cmd = "FILTER_REMOVE" - else: - row.menu("matlib.cats_menu", text=text) - row.prop(matlib, "filters", icon="FILTER", text="") - row.operator("matlib.operator", icon="FILE_PARENT", text="").cmd = "FILTER_SET" - row.operator("matlib.operator", icon="ZOOMIN", text="").cmd = "FILTER_ADD" - row.operator("matlib.operator", icon="ZOOMOUT", text="").cmd = "FILTER_REMOVE" - - -class matlibvxPref(AddonPreferences): - bl_idname = __name__ - - use_brushes_menu_type = EnumProperty( - name="Choose Panel layout", - description="", - items=[('compact', "Icon only panels", - "Use more compact layout"), - ('normal', "Icon and text panels", - "Use an usually spaced layout") - ], - default='normal' - ) - - def draw(self, context): - layout = self.layout - - col = layout.column(align=True) - row = col.row(align=True) - row.prop(self, "use_brushes_menu_type", expand=True) - - -classes = ( - matlibvxPanel, - matlibOperator, - matlibLibsMenu, - matlibCatsMenu, - matlibvxPref, - ) - + print(cmd) + send_command(cmd, "createlib.py") + + if type(success).__name__ == "tuple": + print(success) + self.report({success[0]}, success[1]) + + return {'FINISHED'} + +class matlibvxPanel(bpy.types.Panel): + bl_label = "Material Library VX" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + + @classmethod + def poll(self, context): + return context.active_object.active_material!=None + + def draw(self, context): + layout = self.layout + matlib = context.scene.matlib + + #hyper ugly trick but i dont know how to init classes at register time +# if matlibProperties.init: +# matlibProperties.init = False +# matlib.__init__() + + #libaries + row = layout.row(align=True) + if matlib.current_library: + text = matlib.current_library.shortname + else: + text = "Select a Library" + + row.menu("matlib.libs_menu",text=text) + row.operator("matlib.operator", icon="ZOOMIN", text="").cmd = "LIBRARY_ADD" + if matlib.active_material: + row.label(matlib.active_material.category) + else: + row.label("") +# +# #search + if not matlib.hide_search: + row = layout.row(align=True) + row.prop_search(matlib, "search", matlib, "materials", text="", icon="VIEWZOOM") + +# #list + row = layout.row() + row.template_list("UI_UL_list", " ", matlib, "materials", matlib, "mat_index", rows=6) + col = row.column(align=True) + row = layout.row() + + #operators + col.operator("matlib.operator", icon="ZOOMIN", text="").cmd = "ADD" + col.operator("matlib.operator", icon="ZOOMOUT", text="").cmd = "REMOVE" + col.operator("matlib.operator", icon="FILE_REFRESH", text="").cmd = "RELOAD" + col.operator("matlib.operator", icon="MATERIAL", text="").cmd = "APPLY" + col.operator("matlib.operator", icon="COLOR", text="").cmd = "PREVIEW" + col.operator("matlib.operator", icon="GHOST_DISABLED", text="").cmd = "FLUSH" + col.prop(matlib, "show_prefs", icon="MODIFIER", text="") + + #categories + row = layout.row(align=True) + text = "All" + if matlib.current_category: text = matlib.current_category + row.menu("matlib.cats_menu",text=text) + row.prop(matlib, "filter", icon="FILTER", text="") + row.operator("matlib.operator", icon="FILE_PARENT", text="").cmd="FILTER_SET" + row.operator("matlib.operator", icon="ZOOMIN", text="").cmd="FILTER_ADD" + row.operator("matlib.operator", icon="ZOOMOUT", text="").cmd="FILTER_REMOVE" + + #prefs + if matlib.show_prefs: + row = layout.row() + row.prop(matlib, "force_import") + row.prop(matlib, "link") + row = layout.row() + row.prop(matlib, "hide_search") +# row = layout.row(align=True) + #row = layout.row() + #row.operator("matlib.operator", icon="URL", text="Convert Library").cmd="CONVERT" + + row = layout.row() + if (matlib.current_library): + row.label(matlib.current_library.name) + else: + row.label("Library not found!.") + +classes = [matlibvxPanel, matlibOperator, matlibLibsMenu, matlibCatsMenu] +#print(bpy.context.scene) def register(): - for cls in classes: - bpy.utils.register_class(cls) - + for c in classes: + bpy.utils.register_class(c) def unregister(): - for cls in classes: - bpy.utils.unregister_class(cls) - + for c in classes: + bpy.utils.unregister_class(c) if __name__ == "__main__": - register()
\ No newline at end of file + register()
\ No newline at end of file |