소스 검색

Merge pull request #14773 from AUTOMATIC1111/rework-set_named_arg

rework set_named_arg
AUTOMATIC1111 1 년 전
부모
커밋
e717eaff86
1개의 변경된 파일20개의 추가작업 그리고 8개의 파일을 삭제
  1. 20 8
      modules/scripts.py

+ 20 - 8
modules/scripts.py

@@ -939,22 +939,34 @@ class ScriptRunner:
             except Exception:
             except Exception:
                 errors.report(f"Error running setup: {script.filename}", exc_info=True)
                 errors.report(f"Error running setup: {script.filename}", exc_info=True)
 
 
-    def set_named_arg(self, args, script_type, arg_elem_id, value):
-        script = next((x for x in self.scripts if type(x).__name__ == script_type), None)
+    def set_named_arg(self, args, script_name, arg_elem_id, value, fuzzy=False):
+        """Locate an arg of a specific script in script_args and set its value
+        Args:
+            args: all script args of process p, p.script_args
+            script_name: the name target script name to
+            arg_elem_id: the elem_id of the target arg
+            value: the value to set
+            fuzzy: if True, arg_elem_id can be a substring of the control.elem_id else exact match
+        Returns:
+            Updated script args
+        when script_name in not found or arg_elem_id is not found in script controls, raise RuntimeError
+        """
+        script = next((x for x in self.scripts if x.name == script_name), None)
         if script is None:
         if script is None:
-            return
+            raise RuntimeError(f"script {script_name} not found")
 
 
         for i, control in enumerate(script.controls):
         for i, control in enumerate(script.controls):
-            if arg_elem_id in control.elem_id:
+            if arg_elem_id in control.elem_id if fuzzy else arg_elem_id == control.elem_id:
                 index = script.args_from + i
                 index = script.args_from + i
 
 
-                if isinstance(args, list):
+                if isinstance(args, tuple):
+                    return args[:index] + (value,) + args[index + 1:]
+                elif isinstance(args, list):
                     args[index] = value
                     args[index] = value
                     return args
                     return args
-                elif isinstance(args, tuple):
-                    return args[:index] + (value,) + args[index+1:]
                 else:
                 else:
-                    return None
+                    raise RuntimeError(f"args is not a list or tuple, but {type(args)}")
+        raise RuntimeError(f"arg_elem_id {arg_elem_id} not found in script {script_name}")
 
 
 
 
 scripts_txt2img: ScriptRunner = None
 scripts_txt2img: ScriptRunner = None