| ''' |
| 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) |
|
|