File size: 7,532 Bytes
5ee8620
 
18720f0
 
 
5ee8620
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18720f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5ee8620
 
 
 
 
18720f0
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
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("新表情的参数会覆盖原有的同名参数,目前有『迁移』『叠加』两种操作。<br>『迁移』和之前一样会删掉参考列表中原表情有而新表情没有的参数,『叠加』则不会。<br>当参数列表包含所有相关参数时,其『迁移』结果新表情将会完全覆盖原表情,『叠加』结果则类似于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":[]})