first commit
commit
39371ee333
|
|
@ -0,0 +1,254 @@
|
|||
#!/usr/bin/python
|
||||
#encoding:utf-8
|
||||
import os, sys
|
||||
|
||||
curr = os.path.dirname(sys.argv[0])
|
||||
if curr != "":
|
||||
os.system("cd " + curr)
|
||||
|
||||
from psd_tools import PSDImage
|
||||
from PIL import Image
|
||||
import hashlib
|
||||
import utils
|
||||
import export_outline
|
||||
import json
|
||||
|
||||
def parse_psd(path):
|
||||
global scale
|
||||
global versions
|
||||
|
||||
file_name = os.path.split(path)[1]
|
||||
|
||||
log = []
|
||||
|
||||
log.append("开始检测:{}".format(file_name))
|
||||
|
||||
psd = PSDImage.open(path)
|
||||
try:
|
||||
image = psd.composite()
|
||||
except Exception as e:
|
||||
log.append("文件无法打开" + repr(e))
|
||||
|
||||
has_base = False
|
||||
has_finish = False
|
||||
lines = {}
|
||||
patch_stages = {}
|
||||
auto_stages = {}
|
||||
|
||||
#patch的末尾数字
|
||||
patch_end = []
|
||||
line_end = []
|
||||
|
||||
max_width = 0
|
||||
max_height = 0
|
||||
|
||||
for item in psd.descendants():
|
||||
if not item.is_group():
|
||||
nArr = item.name.split('_')
|
||||
|
||||
if item.name == "base":
|
||||
max_width = item.width
|
||||
max_height = item.height
|
||||
break
|
||||
|
||||
for item in psd.descendants():
|
||||
if not item.is_group():
|
||||
nArr = item.name.split('_')
|
||||
|
||||
if item.name == "base":
|
||||
max_width = item.width
|
||||
max_height = item.height
|
||||
|
||||
if item.name.strip() != item.name:
|
||||
log.append("命名中存在空格:{}".format(item.name))
|
||||
|
||||
if nArr[0] == 'base':
|
||||
if has_base:
|
||||
log.append("存在多个base图层")
|
||||
has_base = True
|
||||
elif nArr[0] == 'finish':
|
||||
if has_finish:
|
||||
log.append("存在多个finish图层")
|
||||
has_finish = True
|
||||
elif nArr[0] == 'line':
|
||||
#以前存在line_1,整图轮廓的情况,这种情况视为无line
|
||||
if len(nArr) > 2:
|
||||
if nArr[1] not in lines:
|
||||
lines[nArr[1]] = []
|
||||
if nArr[2] in lines[nArr[1]]:
|
||||
log.append("存在重复图层:{}".format(item.name))
|
||||
lines[nArr[1]].append(nArr[2])
|
||||
else:
|
||||
pass
|
||||
|
||||
line_end.append(item.name.replace("line", ""))
|
||||
elif nArr[0] == 'patch' or nArr[0] == 'patchrp':
|
||||
if nArr[1] not in patch_stages:
|
||||
patch_stages[nArr[1]] = []
|
||||
|
||||
patch_stages[nArr[1]].append(nArr[2])
|
||||
|
||||
patch_end.append(item.name.replace("patch", ""))
|
||||
elif nArr[0] == 'auto':
|
||||
if nArr[1] not in auto_stages:
|
||||
auto_stages[nArr[1]] = []
|
||||
|
||||
auto_stages[nArr[1]].append(nArr[2])
|
||||
elif nArr[0] == 'thumbnail' or nArr[0] == 'role' or nArr[0] == 'rptmp':
|
||||
pass
|
||||
else:
|
||||
log.append("命名错误:{}\n".format(item.name))
|
||||
|
||||
#空图层检测
|
||||
if item.width <= 0 or item.height <= 0:
|
||||
log.append("存在空图层:{}\n".format(item.name))
|
||||
|
||||
#横坐标越界检测
|
||||
if item.offset[0] < 0 or (item.offset[0] + item.width) > max_width:
|
||||
log.append("横坐标越界{}\n".format(item.name))
|
||||
|
||||
#纵坐标越界检测
|
||||
if item.offset[1] < 0 or (item.offset[1] + item.height) > max_height:
|
||||
log.append("纵坐标越界{}\n".format(item.name))
|
||||
|
||||
if not has_base:
|
||||
log.append("未检测到base图层\n")
|
||||
|
||||
if not has_finish:
|
||||
log.append("未检测到finish图层\n")
|
||||
|
||||
for stage in patch_stages:
|
||||
tmp = {}
|
||||
for item in patch_stages[stage]:
|
||||
if item in tmp:
|
||||
log.append("存在重复图层:patch_{}_{}".format(stage, item))
|
||||
else:
|
||||
tmp[item] = 0
|
||||
|
||||
for stage in auto_stages:
|
||||
tmp = {}
|
||||
for item in auto_stages[stage]:
|
||||
if item in tmp:
|
||||
log.append("存在重复图层:auto_{}_{}".format(stage, item))
|
||||
else:
|
||||
tmp[item] = 0
|
||||
|
||||
if len(lines) > 0 and len(patch_stages) != len(lines):
|
||||
log.append("阶段与线稿不对应,线稿:{} 关卡:".format(len(lines), len(patch_stages)))
|
||||
|
||||
for item in patch_end:
|
||||
if item not in line_end:
|
||||
log.append("patch图层找不到描线:patch{}".format(item))
|
||||
|
||||
for item in line_end:
|
||||
if item not in patch_end:
|
||||
log.append("描线找不到patch图层:line{}".format(item))
|
||||
|
||||
log.append("检测结束")
|
||||
|
||||
if len(log) == 2:
|
||||
return True, len(lines) > 0
|
||||
else:
|
||||
for a_log in log:
|
||||
print(a_log)
|
||||
return False, len(lines) > 0
|
||||
|
||||
def convert_2_zip_file(path):
|
||||
file_info_arr = os.path.split(path)
|
||||
file_path = file_info_arr[0]
|
||||
file_name = os.path.split(path)[1]
|
||||
|
||||
#检测成功,压缩到zip
|
||||
os.chdir(file_path)
|
||||
file_name_without_ex = file_name.split(".")[0]
|
||||
utils.zip_file("{}.psd".format(file_name_without_ex), "{}.zip".format(file_name_without_ex))
|
||||
os.chdir("../")
|
||||
os.remove(path)
|
||||
|
||||
###生成version文件
|
||||
def make_version_file(remake):
|
||||
version_file = 'version.json';
|
||||
|
||||
if remake:
|
||||
if os.path.exists(version_file):
|
||||
os.remove(version_file)
|
||||
|
||||
if not os.path.exists(version_file):
|
||||
with open(version_file, 'w') as f:
|
||||
json.dump({}, f, sort_keys=True, indent=4)
|
||||
|
||||
###加载版本文件
|
||||
def load_version():
|
||||
global versions
|
||||
make_version_file(False);
|
||||
with open('version.json', 'r') as f:
|
||||
try:
|
||||
versions = json.load(f)
|
||||
except:
|
||||
#删除版本文件并重新生成
|
||||
make_version_file(True);
|
||||
|
||||
def write_version():
|
||||
with open('version.json', 'w') as f:
|
||||
json.dump(versions, f, sort_keys=True, indent=4)
|
||||
|
||||
if __name__ == '__main__':
|
||||
load_version()
|
||||
deal_psdid = []
|
||||
is_force = sys.argv[1] if len(sys.argv) > 1 else False
|
||||
for root , dirs, files in os.walk('./'):
|
||||
for name in files:
|
||||
src_file = os.path.join(root, name)
|
||||
|
||||
if name.endswith('.psd') or name.endswith('.zip'):
|
||||
file_info_arr = os.path.split(src_file)
|
||||
file_path = file_info_arr[0]
|
||||
file_name = file_info_arr[1]
|
||||
key = file_name.split("_")[0]
|
||||
try:
|
||||
i_key = int(key)
|
||||
except Exception as e:
|
||||
print("资源命名错误,请查询是否存在特殊字符:{}".format(name))
|
||||
continue
|
||||
|
||||
if key not in deal_psdid:
|
||||
deal_psdid.append(key)
|
||||
else:
|
||||
print("存在重复关卡:{}".format(key))
|
||||
|
||||
if name.endswith('.psd') or (name.endswith('.zip') and is_force):
|
||||
file_info_arr = os.path.split(src_file)
|
||||
file_path = file_info_arr[0]
|
||||
file_name = file_info_arr[1]
|
||||
|
||||
key = file_name.split("_")[0]
|
||||
hash_old = ""
|
||||
if key in versions:
|
||||
hash_old = versions[key]
|
||||
|
||||
if os.path.exists(src_file):
|
||||
hash_now = ""
|
||||
if name.endswith('.psd'):
|
||||
hash_now = utils.calc_hash(src_file)
|
||||
|
||||
if hash_now != hash_old or is_force:
|
||||
psd_file = src_file
|
||||
if name.endswith('.zip'):
|
||||
utils.unzip_file(src_file)
|
||||
psd_file = "{}.psd".format(os.path.splitext(psd_file)[0])
|
||||
hash_now = utils.calc_hash(psd_file)
|
||||
|
||||
try:
|
||||
ret, has_line = parse_psd(psd_file)
|
||||
if ret:
|
||||
if not has_line:
|
||||
export_outline.export_outline(psd_file)
|
||||
|
||||
#检测成功,压缩到zip
|
||||
convert_2_zip_file(psd_file)
|
||||
versions[key] = hash_now
|
||||
write_version();
|
||||
except Exception as e:
|
||||
print(name + " 解析失败:" + repr(e) + ",请检查命名规范,比如auto_1_1=>auto_1 或 patch_1_1=>patch_1")
|
||||
elif hash_now == hash_old:
|
||||
convert_2_zip_file(src_file)
|
||||
Loading…
Reference in New Issue