added poor man's inpainting script

This commit is contained in:
AUTOMATIC
2022-09-04 01:29:43 +03:00
parent af133859f0
commit 7350c71259
7 changed files with 193 additions and 51 deletions

View File

@@ -18,6 +18,9 @@ class Script:
def ui(self, is_img2img):
pass
def show(self, is_img2img):
return True
def run(self, *args):
raise NotImplementedError()
@@ -25,7 +28,7 @@ class Script:
return ""
scripts = []
scripts_data = []
def load_scripts(basedir):
@@ -49,10 +52,8 @@ def load_scripts(basedir):
for key, script_class in module.__dict__.items():
if type(script_class) == type and issubclass(script_class, Script):
obj = script_class()
obj.filename = path
scripts_data.append((script_class, path))
scripts.append(obj)
except Exception:
print(f"Error loading script: {filename}", file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr)
@@ -69,52 +70,75 @@ def wrap_call(func, filename, funcname, *args, default=None, **kwargs):
return default
def setup_ui(is_img2img):
titles = [wrap_call(script.title, script.filename, "title") or f"{script.filename} [error]" for script in scripts]
class ScriptRunner:
def __init__(self):
self.scripts = []
dropdown = gr.Dropdown(label="Script", choices=["None"] + titles, value="None", type="index")
def setup_ui(self, is_img2img):
for script_class, path in scripts_data:
script = script_class()
script.filename = path
inputs = [dropdown]
if not script.show(is_img2img):
continue
for script in scripts:
script.args_from = len(inputs)
controls = script.ui(is_img2img)
self.scripts.append(script)
for control in controls:
control.visible = False
titles = [wrap_call(script.title, script.filename, "title") or f"{script.filename} [error]" for script in self.scripts]
inputs += controls
script.args_to = len(inputs)
dropdown = gr.Dropdown(label="Script", choices=["None"] + titles, value="None", type="index")
inputs = [dropdown]
def select_script(index):
if index > 0:
script = scripts[index-1]
args_from = script.args_from
args_to = script.args_to
else:
args_from = 0
args_to = 0
for script in self.scripts:
script.args_from = len(inputs)
return [ui.gr_show(True if i == 0 else args_from <= i < args_to) for i in range(len(inputs))]
controls = wrap_call(script.ui, script.filename, "ui", is_img2img)
dropdown.change(
fn=select_script,
inputs=[dropdown],
outputs=inputs
)
if controls is None:
continue
return inputs
for control in controls:
control.visible = False
inputs += controls
script.args_to = len(inputs)
def select_script(script_index):
if 0 < script_index <= len(self.scripts):
script = self.scripts[script_index-1]
args_from = script.args_from
args_to = script.args_to
else:
args_from = 0
args_to = 0
return [ui.gr_show(True if i == 0 else args_from <= i < args_to) for i in range(len(inputs))]
dropdown.change(
fn=select_script,
inputs=[dropdown],
outputs=inputs
)
return inputs
def run(p: StableDiffusionProcessing, *args):
script_index = args[0] - 1
def run(self, p: StableDiffusionProcessing, *args):
script_index = args[0]
if script_index < 0 or script_index >= len(scripts):
return None
if script_index == 0:
return None
script = scripts[script_index]
script = self.scripts[script_index-1]
script_args = args[script.args_from:script.args_to]
processed = script.run(p, *script_args)
if script is None:
return None
return processed
script_args = args[script.args_from:script.args_to]
processed = script.run(p, *script_args)
return processed
scripts_txt2img = ScriptRunner()
scripts_img2img = ScriptRunner()