|
''' |
|
Thanks @ledahu for contributing |
|
''' |
|
|
|
from modules import scripts |
|
from modules.shared import opts |
|
|
|
from scripts.reactor_helpers import ( |
|
get_model_names, |
|
get_facemodels |
|
) |
|
|
|
|
|
|
|
def find_module(module_names): |
|
if isinstance(module_names, str): |
|
module_names = [s.strip() for s in module_names.split(",")] |
|
for data in scripts.scripts_data: |
|
if data.script_class.__module__ in module_names and hasattr(data, "module"): |
|
return data.module |
|
return None |
|
|
|
def bool_(string): |
|
string = str(string) |
|
if string in ["None", ""]: |
|
return None |
|
elif string.lower() in ["true", "1"]: |
|
return True |
|
elif string.lower() in ["false", "0"]: |
|
return False |
|
else: |
|
raise ValueError(f"Could not convert string to boolean: {string}") |
|
|
|
def choices_bool(): |
|
return ["False", "True"] |
|
|
|
def choices_face_models(): |
|
return get_model_names(get_facemodels) |
|
|
|
def float_applier(value_name:str, min_range:float = 0, max_range:float = 1): |
|
""" |
|
Returns a function that applies the given value to the given value_name in opts.data. |
|
""" |
|
def validate(value_name:str, value:str): |
|
value = float(value) |
|
|
|
if not min_range == 0: |
|
assert value >= min_range, f"Value {value} for {value_name} must be greater than or equal to {min_range}" |
|
if not max_range == 1: |
|
assert value <= max_range, f"Value {value} for {value_name} must be less than or equal to {max_range}" |
|
def apply_float(p, x, xs): |
|
validate(value_name, x) |
|
opts.data[value_name] = float(x) |
|
return apply_float |
|
|
|
def bool_applier(value_name:str): |
|
def apply_bool(p, x, xs): |
|
x_normed = bool_(x) |
|
opts.data[value_name] = x_normed |
|
|
|
return apply_bool |
|
|
|
def str_applier(value_name:str): |
|
def apply_str(p, x, xs): |
|
opts.data[value_name] = x |
|
return apply_str |
|
|
|
|
|
def add_axis_options(xyz_grid): |
|
extra_axis_options = [ |
|
xyz_grid.AxisOption("[ReActor] CodeFormer Weight", float, float_applier("codeformer_weight", 0, 1)), |
|
xyz_grid.AxisOption("[ReActor] Restorer Visibility", float, float_applier("restorer_visibility", 0, 1)), |
|
xyz_grid.AxisOption("[ReActor] Face Mask Correction", str, bool_applier("mask_face"), choices=choices_bool), |
|
xyz_grid.AxisOption("[ReActor] Face Models", str, str_applier("face_model"), choices=choices_face_models), |
|
] |
|
set_a = {opt.label for opt in xyz_grid.axis_options} |
|
set_b = {opt.label for opt in extra_axis_options} |
|
if set_a.intersection(set_b): |
|
return |
|
|
|
xyz_grid.axis_options.extend(extra_axis_options) |
|
|
|
def run(): |
|
xyz_grid = find_module("xyz_grid.py, xy_grid.py") |
|
if xyz_grid: |
|
add_axis_options(xyz_grid) |
|
|