Skip to content

Commit eb90c1e

Browse files
author
legionfu
committed
local flows
1 parent 7cf255f commit eb90c1e

File tree

3 files changed

+188
-26
lines changed

3 files changed

+188
-26
lines changed

javascript/state.core.js

Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ state.core = (function () {
101101
fetch('/lightdiffusionflow/local/need_preload')
102102
.then(response => response.json())
103103
.then(data => {
104-
//console.log(`fn_timer`)
104+
console.log(`fn_timer`)
105105
if (data != ""){
106106
//state.core.actions.handleLightDiffusionFlow([{"name":data}]);
107107
const btn1 = gradioApp().querySelector(`button#set_lightdiffusionflow_file`);
@@ -150,6 +150,28 @@ state.core = (function () {
150150

151151
}
152152

153+
function get_js_local_data(){
154+
155+
if(state.utils.getCurSeed('txt2img') != undefined){
156+
store.set(`txt2img_seed`,state.utils.getCurSeed('txt2img'))
157+
}
158+
if(state.utils.getCurSeed('img2img') != undefined){
159+
store.set(`img2img_seed`,state.utils.getCurSeed('img2img'))
160+
}
161+
162+
stored_config = store.getAll()
163+
164+
for (let key in stored_config){
165+
if(key.indexOf("allow-preview") !== -1 && key.indexOf("ext-control-net") !== -1)
166+
{
167+
console.log("allow-preview改成false")
168+
stored_config[key] = "false"
169+
}
170+
}
171+
172+
return stored_config
173+
}
174+
153175
function get_imgs_elem_key(){
154176

155177
fetch('/lightdiffusionflow/local/get_imgs_elem_key') //初始化部分图片组件id, 后续设置onchanged事件
@@ -632,20 +654,20 @@ state.core = (function () {
632654

633655
exportState: function () {
634656

635-
if(state.utils.getCurSeed('txt2img') != undefined){
636-
store.set(`txt2img_seed`,state.utils.getCurSeed('txt2img'))
637-
}
638-
if(state.utils.getCurSeed('img2img') != undefined){
639-
store.set(`img2img_seed`,state.utils.getCurSeed('img2img'))
640-
}
641-
657+
// if(state.utils.getCurSeed('txt2img') != undefined){
658+
// store.set(`txt2img_seed`,state.utils.getCurSeed('txt2img'))
659+
// }
660+
// if(state.utils.getCurSeed('img2img') != undefined){
661+
// store.set(`img2img_seed`,state.utils.getCurSeed('img2img'))
662+
// }
663+
let stored_config = get_js_local_data()
642664

643665
fetch('/lightdiffusionflow/local/lightdiffusionflow_config?data2export=true')
644666
.then(response => response.json())
645667
.then(config => {
646668

647669
config = JSON.parse(config)
648-
stored_config = store.getAll()
670+
//stored_config = store.getAll()
649671

650672
let data = {
651673
method: 'POST',
@@ -668,13 +690,13 @@ state.core = (function () {
668690
}
669691
}
670692

671-
for (let key in stored_config){
672-
if(key.indexOf("allow-preview") !== -1 && key.indexOf("ext-control-net") !== -1)
673-
{
674-
console.log("allow-preview改成false")
675-
stored_config[key] = "false"
676-
}
677-
}
693+
// for (let key in stored_config){
694+
// if(key.indexOf("allow-preview") !== -1 && key.indexOf("ext-control-net") !== -1)
695+
// {
696+
// console.log("allow-preview改成false")
697+
// stored_config[key] = "false"
698+
// }
699+
// }
678700

679701
var checkTime = function (i) {
680702
if (i < 10) { i = "0" + i; }
@@ -718,6 +740,39 @@ state.core = (function () {
718740
//config = JSON.stringify(store.getAll(), null, 4);
719741
//fetch(`/lightdiffusionflow/local/ExportLightDiffusionFlow?config=${config}`)
720742
},
743+
saveFlowToLocal: function saveFlowToLocal(){
744+
var checkTime = function (i) {
745+
if (i < 10) { i = "0" + i; }
746+
return i;
747+
}
748+
let nowdate = new Date();
749+
let year = String(nowdate.getFullYear())
750+
let month = String(checkTime(nowdate.getMonth() + 1))
751+
let day = String(checkTime(nowdate.getDate()))
752+
let h = String(checkTime(nowdate.getHours()))
753+
let m = String(checkTime(nowdate.getMinutes()))
754+
let s = String(checkTime(nowdate.getSeconds()))
755+
let time_str = year+month+day+h+m+s
756+
757+
filename = 'flow-'+time_str+'.flow'
758+
filename = prompt("Save workflow as:", filename);
759+
if (!filename) return;
760+
if (!filename.toLowerCase().endsWith(".flow")) {
761+
filename += ".flow";
762+
}
763+
if(filename != ".flow"){
764+
let stored_config = get_js_local_data()
765+
let data = {
766+
method: 'POST',
767+
headers: { 'Content-Type': 'application/json' },
768+
body: JSON.stringify({
769+
"file_name":filename,
770+
"file_data":stored_config
771+
})
772+
}
773+
fetch("/lightdiffusionflow/local/save_flow_to_local",data)
774+
}
775+
},
721776

722777
handleLightDiffusionFlow: function (fileInput){
723778
actions.preset_output_log("start")

scripts/lightdiffusionflow_config.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ def import_completed():
2323

2424
def import_completed_info():
2525
return "Import Completed!"
26+
27+
def save_completed():
28+
return "<b style='color:LimeGreen;'>Save Completed!</b>"
29+
30+
def save_failed():
31+
return "<b style='color:Red;'>Save Failed!</b>"
2632

2733
def alternative_option(target_value, new_value):
2834
return f'''Note: '<b style='color:Orange;'>{target_value}</b>' not found,<br>\
@@ -77,10 +83,16 @@ def importing_image(image_name):
7783

7884
def import_completed():
7985
return "<b style='color:LimeGreen;'>导入完成!</b>"
80-
86+
8187
def import_completed_info():
8288
return "导入完成!"
8389

90+
def save_completed():
91+
return "<b style='color:LimeGreen;'>保存完毕!</b>"
92+
93+
def save_failed():
94+
return "<b style='color:Red;'>保存失败!</b>"
95+
8496
def alternative_option(target_value, new_value):
8597
return f'''注意: 未找到选项'<b style='color:Orange;'>{target_value}</b>',<br>\
8698
已使用近似选项'<b style='color:Orange;'>{new_value}</b>'代替.'''

scripts/state_api.py

Lines changed: 104 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from modules.generation_parameters_copypaste import paste_fields, registered_param_bindings, parse_generation_parameters
2121
from modules.sd_models import checkpoints_list
2222
from modules import ui_components
23+
from modules.paths_internal import data_path
2324
import launch
2425

2526
from scripts import lightdiffusionflow_version, lightdiffusionflow_config
@@ -28,7 +29,7 @@
2829

2930
# current_path = os.path.abspath(os.path.dirname(__file__))
3031
# sys.path.append(os.path.join(current_path,"lib"))
31-
32+
api = None
3233
workflow_json = {}
3334
State_Comps = {} # 当前页面的按钮组件
3435
invisible_buttons = {}
@@ -44,7 +45,13 @@
4445
txt2img_script_container = None
4546
img2img_script_container = None
4647

47-
local_flows_path = "lightdiffusionflow"
48+
local_flows_path = "models/LightDiffusionFlow"
49+
flows_path = os.path.join(data_path, local_flows_path)
50+
flows_path = flows_path.replace("/","\\")
51+
if(not os.path.isdir(flows_path)):
52+
os.mkdir(flows_path)
53+
54+
local_flow_list = []
4855
Need_Preload = False
4956
Preload_File = r""
5057
File_extension = ".flow"
@@ -54,6 +61,7 @@
5461
save_style_symbol = '\U0001f4be' # 💾
5562
apply_style_symbol = '\U0001f4cb' # 📋
5663

64+
5765
def test_func():
5866
gr.Warning("hello")
5967
# global extensions_conponents, extensions_id_conponents
@@ -97,16 +105,20 @@ def test_func():
97105
def custom_msg_box():
98106
global g_msg_info
99107
if(g_msg_info != ""):
108+
print(f"gr.Info({g_msg_info})")
100109
gr.Info(g_msg_info)
101-
g_msg_info = ""
110+
111+
def clear_markup(html_str):
112+
clearly_str = html_str
113+
results = re.findall("(<.+?>)",clearly_str)
114+
for res in results:
115+
clearly_str = clearly_str.replace(res,"")
116+
return clearly_str
102117

103118
def add_output_log(msg:str="", style:str=""):
104119
global Output_Log
105120
if(msg != ""):
106-
clear_msg = msg
107-
results = re.findall("(<.+?>)",msg)
108-
for res in results:
109-
clear_msg = clear_msg.replace(res,"")
121+
clear_msg = clear_markup(msg)
110122
print(clear_msg)
111123
Output_Log += f"<p style='color:rgb(192,192,192);{style}'>{msg}</p>"
112124

@@ -202,6 +214,37 @@ def SearchingCheckPointByHashFromCivitai(hash:str):
202214
pass
203215
return {}
204216

217+
def refresh_local_flows(*inputs):
218+
print("refresh_local_flows")
219+
global local_flow_list,local_flows_path
220+
flows_path = os.path.join(data_path, local_flows_path)
221+
local_flow_list = [f for f in os.listdir(flows_path) if os.path.isfile(
222+
os.path.join(flows_path, f)) and os.path.splitext(f)[-1] == '.flow']
223+
print(inputs)
224+
print(local_flow_list)
225+
ret = []
226+
for dd in inputs:
227+
if dd in local_flow_list:
228+
selected = dd
229+
else:
230+
selected = None
231+
ret.append(gr.Dropdown.update(choices=local_flow_list, value=selected))
232+
#ret = [gr.Dropdown.update(choices=local_flow_list, value=selected) for i in inputs]
233+
return ret
234+
235+
def apply_local_flow(selected):
236+
global local_flow_list,local_flows_path
237+
global Need_Preload,Preload_File
238+
239+
if(selected != "" and selected != None):
240+
flow_path = os.path.join(data_path, local_flows_path, selected)
241+
if(os.path.exists(flow_path)):
242+
print("OK,Local File!")
243+
print(flow_path)
244+
Preload_File = flow_path
245+
Need_Preload = True
246+
gr.Info(clear_markup(OutputPrompt.startimport()))
247+
205248
def set_lightdiffusionflow_file():
206249
global Preload_File
207250
return Preload_File
@@ -784,6 +827,9 @@ class png_info_params(BaseModel):
784827
class file_params(BaseModel):
785828
file_path:str
786829

830+
class savefile_params(BaseModel):
831+
file_name:str
832+
file_data:dict
787833

788834
class StateApi():
789835

@@ -819,7 +865,9 @@ def start(self, _: gr.Blocks, app: FastAPI):
819865
# 传入一个文件路径,返回文件内容
820866
self.add_api_route('/local/read_file', self.read_file, methods=['POST'])
821867
self.add_api_route('/local/need_preload', self.need_preload, methods=['GET'])
822-
868+
# 保存当前配置到本地文件夹
869+
self.add_api_route('/local/save_flow_to_local', self.saveFlowToLocal, methods=['POST'])
870+
823871
self.add_api_route('/set_preload', self.set_preload, methods=['POST'])
824872

825873
def get_config(self):
@@ -1011,6 +1059,41 @@ def need_preload(self):
10111059
return Preload_File
10121060
return ""
10131061

1062+
def saveFlowToLocal(self, data_to_save:savefile_params):
1063+
global local_flows_path
1064+
global add_output_log
1065+
1066+
overall_data = {}
1067+
print(data_to_save.file_name)
1068+
print(data_to_save.file_data)
1069+
filedata = data_to_save.file_data
1070+
1071+
# python处理的图片和dropdown信息
1072+
overall_data = json.loads(self.get_lightdiffusionflow_config(True))
1073+
for key in filedata.keys():
1074+
if(filedata[key] != ""):
1075+
overall_data[key] = filedata[key]
1076+
1077+
# Lora信息
1078+
params = config_params(config_data=overall_data)
1079+
lora_info = self.parse_lora_info(params)
1080+
for key in lora_info.keys():
1081+
overall_data[key] = lora_info[key]
1082+
1083+
# 过滤掉一些没用的默认值的信息
1084+
overall_data = config_filter(overall_data)
1085+
1086+
flow_path = os.path.join(data_path, local_flows_path, data_to_save.file_name)
1087+
print(flow_path)
1088+
if(not os.path.exists(flow_path)):
1089+
with open(flow_path,"w") as f:
1090+
#json.dump(overall_data,f)
1091+
f.write(json.dumps(overall_data, ensure_ascii=False, indent=4))
1092+
add_output_log(OutputPrompt.save_completed())
1093+
else:
1094+
add_output_log(OutputPrompt.save_failed())
1095+
1096+
return flow_path
10141097

10151098
class Script(scripts.Script):
10161099

@@ -1147,6 +1230,13 @@ def after_component(self, component, **kwargs):
11471230
target_comps.append(State_Comps["json2js"]) # 触发事件传递json给js
11481231
#target_comps.append(State_Comps["outlog"][0])
11491232
#target_comps.append(State_Comps["outlog"][1]) # 因为显示日志的窗口分txt2img和img2img两个位置 所以两个位置同步导出
1233+
1234+
for i in range(len(State_Comps["local_flows"])):
1235+
#State_Comps["local_flows"]
1236+
State_Comps["refresh"][i].click(refresh_local_flows, inputs=State_Comps["local_flows"],outputs=State_Comps["local_flows"])
1237+
State_Comps["apply"][i].click(apply_local_flow, inputs=[State_Comps["local_flows"][i]],outputs=[])
1238+
State_Comps["save"][i].click(fn=None,_js="state.core.actions.saveFlowToLocal", inputs=[],outputs=[])
1239+
11501240

11511241
for btn in State_Comps["export"]:
11521242
btn.click(None,_js="state.core.actions.exportState") #, inputs=[],outputs=[]
@@ -1236,10 +1326,15 @@ def custom_ui(self):
12361326
if(Flow_Save_mode == "Core"):
12371327
save_mode = " (only ControlNet)"
12381328

1329+
global local_flow_list,local_flows_path
1330+
flows_path = os.path.join(data_path, local_flows_path)
1331+
local_flow_list = [f for f in os.listdir(flows_path) if os.path.isfile(
1332+
os.path.join(flows_path, f)) and os.path.splitext(f)[-1] == '.flow']
1333+
12391334
with gr.Accordion('LightDiffusionFlow '+lightdiffusionflow_version.lightdiffusionflow_version + save_mode, open=True, visible=True, elem_id=cur_mode+'_lightdiffusionflow'):
12401335

12411336
with gr.Row():
1242-
State_Comps["local_flows"].append(gr.Dropdown(label="", show_label=False ,value='',elem_id=cur_mode+'_ldf_local_flows'))
1337+
State_Comps["local_flows"].append(gr.Dropdown(label="", show_label=False ,choices=local_flow_list,value='',elem_id=cur_mode+'_ldf_local_flows'))
12431338
State_Comps["apply"].append(ui_components.ToolButton(value=paste_symbol,elem_id=cur_mode+'_ldf_apply'))
12441339
State_Comps["save"].append(ui_components.ToolButton(value=save_style_symbol,elem_id=cur_mode+'_ldf_save'))
12451340
State_Comps["refresh"].append(ui_components.ToolButton(value=refresh_symbol,elem_id=cur_mode+'_ldf_refresh'))

0 commit comments

Comments
 (0)