193 lines
5.2 KiB
Python
193 lines
5.2 KiB
Python
import bpy
|
|
import os
|
|
from os import listdir,mkdir,scandir
|
|
from os.path import join,dirname,splitext,isdir,exists,basename
|
|
from bpy.types import Operator, Panel, PropertyGroup
|
|
from bpy.props import *
|
|
import subprocess
|
|
import json
|
|
|
|
|
|
id_type = {"Action" : "actions", "Armature":"armatures", "Brush":"brushes", "CacheFile":"cache_files", "Camera":"cameras",
|
|
"Curve":"curves", "FreestyleLineStyle":"linestyles", "GreasePencil":"grease_pencil", "Group":"groups",
|
|
"Image":"images", "Key":"shape_keys", "Light":"lights", "Lattice":"lattices", "Library":"librairies", "Mask":"masks",
|
|
"Material":"materials", "Mesh":"meshes", "MetaBall":"metaballs", "MovieClip":"movieclips", "NodeTree":"node_groups",
|
|
"Object":"objects", "PaintCurve":"paint_curves", "Palette":"palettes", "ParticleSettings":"particles",
|
|
"Scene":"scenes", "Screen":"screens", "Sound":"sounds", "Speaker":"speakers", "Text":"texts", "Texture":"textures",
|
|
"Collection":"collections", "VectorFont":"fonts", "WindowManager":"window_managers", "World":"worlds"}
|
|
|
|
|
|
|
|
def report(var,message,type='INFO') :
|
|
print([a for a in locals()])
|
|
print([a for a in globals()])
|
|
|
|
|
|
if 'self' in var :
|
|
var['self'].report({type}, message)
|
|
|
|
else :
|
|
print('')
|
|
print(type)
|
|
print(message)
|
|
|
|
def read_json(path):
|
|
jsonFile = path
|
|
if os.path.exists(jsonFile):
|
|
try :
|
|
with open(jsonFile) as data_file:
|
|
return (json.load(data_file))
|
|
except :
|
|
print("the file %s not json readable"%jsonFile)
|
|
return
|
|
|
|
|
|
|
|
def search_filter(search,str) :
|
|
return search.lower() in str.lower()
|
|
|
|
def title(string) :
|
|
return string.replace('_',' ').replace('-',' ').title()
|
|
|
|
def arg_name(string) :
|
|
return string.replace(' ','_').replace('-','_').lower().strip('_')
|
|
|
|
def open_folder(path) :
|
|
try:
|
|
os.startfile(path)
|
|
except:
|
|
subprocess.Popen(['xdg-open', path])
|
|
|
|
|
|
def dic_to_args(dic):
|
|
import collections
|
|
args = collections.OrderedDict()
|
|
|
|
prop_type = {
|
|
str: StringProperty,
|
|
bool: BoolProperty,
|
|
float: FloatProperty,
|
|
int : IntProperty
|
|
}
|
|
|
|
for k, v in dic.items() :
|
|
if k in ('icon','description') or not isinstance(k,str):
|
|
continue
|
|
|
|
if isinstance(v,str) :
|
|
if '/' in v or '\\' in v :
|
|
args[k] = StringProperty(default=v,subtype = "FILE_PATH")
|
|
else :
|
|
args[k] = StringProperty(default=v)
|
|
|
|
elif isinstance(v,bool) :
|
|
args[k] = BoolProperty(default=v)
|
|
|
|
elif isinstance(v, float) :
|
|
args[k] = FloatProperty(default=v,precision=3)
|
|
|
|
elif isinstance(v,int) :
|
|
args[k] = IntProperty(default=v)
|
|
|
|
elif isinstance(v, dict) :
|
|
if v.get("items") and isinstance(v["items"],(tuple,list)) :
|
|
args[k] = EnumProperty(items = [(i,i,"") for i in v["items"]])
|
|
|
|
elif v.get("collection") and isinstance(v["collection"],str) :
|
|
if v["collection"] not in id_type :
|
|
print("Collection %s not supported must be in %s"%(v["collection"],id_type))
|
|
#args[k] = PointerProperty(type = getattr(bpy.types,v["collection"]))
|
|
else :
|
|
args[k] = PointerProperty(type = getattr(bpy.types,v["collection"]),poll = v.get('poll'))
|
|
else:
|
|
args[k] = prop_type[type(v['default'])](**v)
|
|
|
|
|
|
|
|
return args
|
|
|
|
|
|
def read_info(script_path) :
|
|
import collections
|
|
|
|
if isinstance(script_path,list) :
|
|
lines =script_path
|
|
else :
|
|
with open(script_path,encoding="utf-8") as f:
|
|
lines = f.read().splitlines()
|
|
|
|
info = {}
|
|
for i,l in enumerate(lines) :
|
|
if i >= 10 :
|
|
return info,lines
|
|
|
|
if l.startswith("info") :
|
|
info_start = i
|
|
info_str = l
|
|
|
|
while info_str.endswith(',') or not info_str.endswith('}') or i == len(lines)-1:
|
|
i+=1
|
|
info_str+= lines[i]
|
|
|
|
info_end = i
|
|
|
|
opening_brace_index = info_str.find('{')
|
|
|
|
try :
|
|
info = eval(info_str[opening_brace_index:])
|
|
except :
|
|
print('The info header in the file %s cannot be read'%script_path)
|
|
break
|
|
|
|
info = [(k,v) for k,v in info.items()]
|
|
info.sort(key = lambda x : info_str.find(x[0]))
|
|
|
|
info = collections.OrderedDict(info)
|
|
|
|
del lines[info_start:info_end+1]
|
|
|
|
break
|
|
|
|
# remove backspace
|
|
for i in range(len(lines)) :
|
|
if lines[0] :
|
|
break
|
|
else :
|
|
lines.pop(0)
|
|
|
|
for i in range(len(lines)) :
|
|
if lines[-1] :
|
|
break
|
|
else :
|
|
lines.pop(-1)
|
|
|
|
return info,lines
|
|
|
|
def dic_to_str(dic,keys= None,spaces = 4) :
|
|
if not keys :
|
|
keys = sorted(dic)
|
|
|
|
line = '{\n'
|
|
for k in keys :
|
|
v = dic[k]
|
|
|
|
line += ' '*spaces
|
|
|
|
if isinstance(k,str) :
|
|
line +="'%s'"%k
|
|
else :
|
|
line += "%s"%k
|
|
|
|
line += ' : '
|
|
|
|
if isinstance(v,str) :
|
|
line +="'%s'"%v
|
|
else :
|
|
line += "%s"%v
|
|
|
|
line += ',\n'
|
|
|
|
line += '}\n\n'
|
|
|
|
return line
|