mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-02-11 22:12:33 +08:00
Execution blocking can be done by returning an `ExecutionBlocker` (imported from graph_utils) either in place of results or as a specific output. Any node that uses an `ExecutionBlocker` as input will be skipped. This operates on a per-entry basis when inputs are lists. If the `ExecutionBlocker` is initialized with an error message, that message will be displayed on the first node it's used on (and further downstream nodes will be silently skipped).
195 lines
5.1 KiB
Python
195 lines
5.1 KiB
Python
import re
|
|
import torch
|
|
|
|
class IntConditions:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"a": ("INT", {"default": 0, "min": -0xffffffffffffffff, "max": 0xffffffffffffffff, "step": 1}),
|
|
"b": ("INT", {"default": 0, "min": -0xffffffffffffffff, "max": 0xffffffffffffffff, "step": 1}),
|
|
"operation": (["==", "!=", "<", ">", "<=", ">="],),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("BOOL",)
|
|
FUNCTION = "int_condition"
|
|
|
|
CATEGORY = "Conditions"
|
|
|
|
def int_condition(self, a, b, operation):
|
|
if operation == "==":
|
|
return (a == b,)
|
|
elif operation == "!=":
|
|
return (a != b,)
|
|
elif operation == "<":
|
|
return (a < b,)
|
|
elif operation == ">":
|
|
return (a > b,)
|
|
elif operation == "<=":
|
|
return (a <= b,)
|
|
elif operation == ">=":
|
|
return (a >= b,)
|
|
|
|
|
|
class FloatConditions:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"a": ("FLOAT", {"default": 0, "min": -999999999999.0, "max": 999999999999.0, "step": 1}),
|
|
"b": ("FLOAT", {"default": 0, "min": -999999999999.0, "max": 999999999999.0, "step": 1}),
|
|
"operation": (["==", "!=", "<", ">", "<=", ">="],),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("BOOL",)
|
|
FUNCTION = "float_condition"
|
|
|
|
CATEGORY = "Conditions"
|
|
|
|
def float_condition(self, a, b, operation):
|
|
if operation == "==":
|
|
return (a == b,)
|
|
elif operation == "!=":
|
|
return (a != b,)
|
|
elif operation == "<":
|
|
return (a < b,)
|
|
elif operation == ">":
|
|
return (a > b,)
|
|
elif operation == "<=":
|
|
return (a <= b,)
|
|
elif operation == ">=":
|
|
return (a >= b,)
|
|
|
|
class StringConditions:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"a": ("STRING", {"multiline": False}),
|
|
"b": ("STRING", {"multiline": False}),
|
|
"operation": (["a == b", "a != b", "a IN b", "a MATCH REGEX(b)", "a BEGINSWITH b", "a ENDSWITH b"],),
|
|
"case_sensitive": ("BOOL", {"default": True}),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("BOOL",)
|
|
FUNCTION = "string_condition"
|
|
|
|
CATEGORY = "Conditions"
|
|
|
|
def string_condition(self, a, b, operation, case_sensitive):
|
|
if not case_sensitive:
|
|
a = a.lower()
|
|
b = b.lower()
|
|
|
|
if operation == "a == b":
|
|
return (a == b,)
|
|
elif operation == "a != b":
|
|
return (a != b,)
|
|
elif operation == "a IN b":
|
|
return (a in b,)
|
|
elif operation == "a MATCH REGEX(b)":
|
|
try:
|
|
return (re.match(b, a) is not None,)
|
|
except:
|
|
return (False,)
|
|
elif operation == "a BEGINSWITH b":
|
|
return (a.startswith(b),)
|
|
elif operation == "a ENDSWITH b":
|
|
return (a.endswith(b),)
|
|
|
|
class ToBoolNode:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"value": ("*",),
|
|
},
|
|
"optional": {
|
|
"invert": ("BOOL", {"default": False}),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("BOOL",)
|
|
FUNCTION = "to_bool"
|
|
|
|
CATEGORY = "InversionDemo Nodes"
|
|
|
|
def to_bool(self, value, invert = False):
|
|
if isinstance(value, torch.Tensor):
|
|
if value.max().item() == 0 and value.min().item() == 0:
|
|
result = False
|
|
else:
|
|
result = True
|
|
else:
|
|
try:
|
|
result = bool(value)
|
|
except:
|
|
# Can't convert it? Well then it's something or other. I dunno, I'm not a Python programmer.
|
|
result = True
|
|
|
|
if invert:
|
|
result = not result
|
|
|
|
return (result,)
|
|
|
|
class BoolOperationNode:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"a": ("BOOL",),
|
|
"b": ("BOOL",),
|
|
"op": (["a AND b", "a OR b", "a XOR b", "NOT a"],),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("BOOL",)
|
|
FUNCTION = "bool_operation"
|
|
|
|
CATEGORY = "InversionDemo Nodes"
|
|
|
|
def bool_operation(self, a, b, op):
|
|
if op == "a AND b":
|
|
return (a and b,)
|
|
elif op == "a OR b":
|
|
return (a or b,)
|
|
elif op == "a XOR b":
|
|
return (a ^ b,)
|
|
elif op == "NOT a":
|
|
return (not a,)
|
|
|
|
|
|
CONDITION_NODE_CLASS_MAPPINGS = {
|
|
"IntConditions": IntConditions,
|
|
"FloatConditions": FloatConditions,
|
|
"StringConditions": StringConditions,
|
|
"ToBoolNode": ToBoolNode,
|
|
"BoolOperationNode": BoolOperationNode,
|
|
}
|
|
|
|
CONDITION_NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"IntConditions": "Int Condition",
|
|
"FloatConditions": "Float Condition",
|
|
"StringConditions": "String Condition",
|
|
"ToBoolNode": "To Bool",
|
|
"BoolOperationNode": "Bool Operation",
|
|
}
|