VMSI's picture
Upload 281 files
0690950
import os
from typing import Union, List, Callable
from modules import scripts
from modules.processing import StableDiffusionProcessing, StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img
def __set_value(p: StableDiffusionProcessing, script: type, index: int, value):
args = list(p.script_args)
if isinstance(p, StableDiffusionProcessingTxt2Img):
all_scripts = scripts.scripts_txt2img.scripts
else:
all_scripts = scripts.scripts_img2img.scripts
froms = [x.args_from for x in all_scripts if isinstance(x, script)]
for idx in froms:
assert idx is not None
args[idx + index] = value
p.script_args = type(p.script_args)(args)
def to_bool(v: str):
if len(v) == 0: return False
v = v.lower()
if 'true' in v: return True
if 'false' in v: return False
try:
w = int(v)
return bool(w)
except:
acceptable = ['True', 'False', '1', '0']
s = ', '.join([f'`{v}`' for v in acceptable])
raise ValueError(f'value must be one of {s}.')
class AxisOptions:
def __init__(self, AxisOption: type, axis_options: list):
self.AxisOption = AxisOption
self.target = axis_options
self.options = []
def __enter__(self):
self.options.clear()
return self
def __exit__(self, ex_type, ex_value, trace):
if ex_type is not None:
return
for opt in self.options:
self.target.append(opt)
self.options.clear()
def create(self, name: str, type_fn: Callable, action: Callable, choices: Union[List[str],None]):
if choices is None or len(choices) == 0:
opt = self.AxisOption(name, type_fn, action)
else:
opt = self.AxisOption(name, type_fn, action, choices=lambda: choices)
return opt
def add(self, axis_option):
self.target.append(axis_option)
__init = False
def init_xyz(script: type, ext_name: str):
global __init
if __init:
return
for data in scripts.scripts_data:
name = os.path.basename(data.path)
if name != 'xy_grid.py' and name != 'xyz_grid.py':
continue
if not hasattr(data.module, 'AxisOption'):
continue
if not hasattr(data.module, 'axis_options'):
continue
AxisOption = data.module.AxisOption
axis_options = data.module.axis_options
if not isinstance(AxisOption, type):
continue
if not isinstance(axis_options, list):
continue
try:
create_options(ext_name, script, AxisOption, axis_options)
except:
pass
__init = True
def create_options(ext_name: str, script: type, AxisOptionClass: type, axis_options: list):
with AxisOptions(AxisOptionClass, axis_options) as opts:
def define(param: str, index: int, type_fn: Callable, choices: List[str] = []):
def fn(p, x, xs):
__set_value(p, script, index, x)
name = f'{ext_name} {param}'
return opts.create(name, type_fn, fn, choices)
options = [
define('Enabled', 0, to_bool, choices=['false', 'true']),
define('Targets', 1, str),
define('Weight', 2, float),
define('Disable for Negative Prompt', 3, to_bool, choices=['false', 'true']),
define('Strong', 4, to_bool, choices=['false', 'true']),
define('Padding', 5, str),
define('Interpolation', 6, str, choices=['Lerp', 'SLerp']),
]
for opt in options:
opts.add(opt)