import re
import colorsys
import json
import pandas as pd
def colorStringProcessRGB(color_str):
color_str = color_str.strip()
if color_str.startswith("#"):
color_str = color_str[1:]
if len(color_str) == 3:
r = int(color_str[0]*2, 16)
g = int(color_str[1]*2, 16)
b = int(color_str[2]*2, 16)
return r, g, b
elif len(color_str) == 6:
r = int(color_str[0:2], 16)
g = int(color_str[2:4], 16)
b = int(color_str[4:6], 16)
return r, g, b
else:
raise ValueError("Invalid HEX color format")
match00 = re.match(r"rgb\((\s*[0-9\.]+\s*),(\s*[0-9\.]+\s*),(\s*[0-9\.]+\s*)\)", color_str)
if match00 is not None:
r = round(float(match00.group(1)))
g = round(float(match00.group(2)))
b = round(float(match00.group(3)))
return r, g, b
match00 = re.match(r"rgba\((\s*[0-9\.]+\s*),(\s*[0-9\.]+\s*),(\s*[0-9\.]+\s*),(\s*[0-9\.]+\s*)\)", color_str)
if match00 is not None:
r = round(float(match00.group(1)))
g = round(float(match00.group(2)))
b = round(float(match00.group(3)))
return r, g, b
match00 = re.match(r"hsl\((\s*[0-9\.]+\s*),(\s*[0-9\.]+%\s*),(\s*[0-9\.]+%\s*)\)", color_str)
if match00 is not None:
h = float(match00.group(1))
s = float(match00.group(2).replace("%",""))
l = float(match00.group(3).replace("%",""))
r, g, b = colorsys.hls_to_rgb(h/360.0, l/100.0, s/100.0)
r = round(r * 255)
g = round(g * 255)
b = round(b * 255)
return r, g, b
raise ValueError("Invalid color string format")
def cdiParametersListFileGet(input_path, output_path):
with open(input_path, "r", encoding="utf8") as file:
data_raw = json.load(file)
data_result = cdiParametersListGet(data_raw)
with open(output_path, "w", encoding="utf8") as file:
json.dump(data_result, file, ensure_ascii=False)
return 0
def cdiParametersListGet(data_raw):
data_result = {}
for param in data_raw["Parameters"]:
pid = param["Id"]
pnom = param["Name"]
if pid in data_result:
raise ValueError(f"Duplicate parameter ID found: {pid}")
else:
data_result[pid] = {"Name": pnom}
return data_result
def cdiParametersGroupsDataFileGet(input_path, output_path):
with open(input_path, "r", encoding="utf8") as file:
data_raw = json.load(file)
data_result = cdiParametersGroupsDataGet(data_raw)
with open(output_path, "w", encoding="utf8") as file:
json.dump(data_result, file, ensure_ascii=False)
return 0
## 目前仅处理单层分组
def cdiParametersGroupsDataGet(data_raw):
data_result = {}
for group in data_raw["ParameterGroups"]:
gid = group["Id"]
gnom = group["Name"]
data_result[gid] = {"Name":gnom, "Parameters":{}}
for param in data_raw["Parameters"]:
pid = param["Id"]
pnom = param["Name"]
pgid = param["GroupId"]
if pgid in data_result:
data_result[pgid]["Parameters"][pid] = {"Name": pnom}
else:
raise ValueError(f"unknown group ID : {pgid}")
return data_result
def parametersListTextGet(parameters_list_dict):
df = pd.DataFrame(([id, parameters_list_dict[id]["Name"]] for id in parameters_list_dict), columns=["id", "name"])
df["text"] = df.apply(lambda row : row["id"] + " : " + row["name"], axis=1)
return df
def parameterPresetDataFramePreviewGet(parameter_preset_dict):
result_list = []
text_list = []
for ppid, ppdata in parameter_preset_dict.items():
text_list.clear()
for pid in ppdata:
pname = ppdata[pid]["Name"]
text_list.append(f"{pid} : {pname}")
result_list.append([ppid, text_list.copy()])
df = pd.DataFrame(result_list, columns=["预设名称", "参数列表"])
return df
def expressionParametersMigration(parameters_list: list|dict, data_acceptor, data_donor):
data_result = data_acceptor.copy()
pdata_acceptor = dict((prm["Id"],prm) for prm in data_acceptor["Parameters"])
pdata_donor = dict((prm["Id"],prm) for prm in data_donor["Parameters"])
pdata_result = pdata_acceptor.copy()
for parameter in parameters_list:
if parameter in pdata_donor:
pdata_result[parameter] = pdata_donor[parameter]
else:
if parameter in pdata_result:
del pdata_result[parameter]
parameters_list_result = list((pdata for pid, pdata in pdata_result.items()))
data_result["Parameters"] = parameters_list_result
return data_result
def expressionParametersMigrationByGroups(parameters_groups: dict, data_acceptor, data_donor):
parameters_list = []
for gid, gdata in parameters_groups.items():
for param in gdata["Parameters"]:
if param not in parameters_list:
parameters_list.append(param)
data_result = expressionParametersMigration(parameters_list, data_acceptor, data_donor)
return data_result
## 引用:
## gr.Markdown("新表情的参数会覆盖原有的同名参数,目前有『迁移』『叠加』两种操作。
『迁移』和之前一样会删掉参考列表中原表情有而新表情没有的参数,『叠加』则不会。
当参数列表包含所有相关参数时,其『迁移』结果新表情将会完全覆盖原表情,『叠加』结果则类似于VTS的表情叠加。")
## 起名可能不大准确,总之就是这么回事。
def expressionParametersOverlay(parameters_list: list|dict, data_acceptor, data_donor):
data_result = data_acceptor.copy()
pdata_acceptor = dict((prm["Id"],prm) for prm in data_acceptor["Parameters"])
pdata_donor = dict((prm["Id"],prm) for prm in data_donor["Parameters"])
pdata_result = pdata_acceptor.copy()
for parameter in parameters_list:
## 就是没有else部分
if parameter in pdata_donor:
pdata_result[parameter] = pdata_donor[parameter]
parameters_list_result = list((pdata for pid, pdata in pdata_result.items()))
data_result["Parameters"] = parameters_list_result
return data_result
def expressionParametersOverlayByGroups(parameters_groups: dict, data_acceptor, data_donor):
parameters_list = []
for gid, gdata in parameters_groups.items():
for param in gdata["Parameters"]:
if param not in parameters_list:
parameters_list.append(param)
data_result = expressionParametersOverlay(parameters_list, data_acceptor, data_donor)
return data_result
######
#color_str = "rgb(190.71875, 42.242530153508774, 42.242530153508774)"
#color_str = "rgba(190.71875, 42.242530153508774, 42.242530153508774, 1)"
#r, g, b = colorStringProcessRGB(color_str)
#print(r, g, b)
#cdiParametersListFileGet("data/general_model_Juumon/general_model_Juumon.cdi3.json", "data/cdiParametersList.json")
#cdiParametersGroupsDataFileGet("data/general_model_Juumon/general_model_Juumon.cdi3.json", "data/cdiParametersGroupsData.json")
#with open("data/test.exp3.json", "r", encoding="utf8") as file:
# data = json.load(file)
#expressionParametersMigration(["Param2", "HC82"], data, {"Parameters":[]})