| | |
| | |
| | |
| | |
| |
|
| | import os |
| | import sys |
| | import comfy.controlnet |
| | import comfy.sd |
| | import folder_paths |
| | from nodes import ControlNetApplyAdvanced |
| | from ..categories import icons |
| |
|
| | sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "comfy")) |
| |
|
| | |
| | |
| | class CR_ApplyControlNet: |
| | @classmethod |
| | def INPUT_TYPES(s): |
| | return {"required": {"conditioning": ("CONDITIONING", ), |
| | "control_net": ("CONTROL_NET", ), |
| | "image": ("IMAGE", ), |
| | "switch": ([ |
| | "On", |
| | "Off"],), |
| | "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}) |
| | }} |
| | RETURN_TYPES = ("CONDITIONING", "STRING", ) |
| | RETURN_NAMES = ("CONDITIONING", "show_help", ) |
| | FUNCTION = "apply_controlnet" |
| |
|
| | CATEGORY = icons.get("Comfyroll/ControlNet") |
| |
|
| | def apply_controlnet(self, conditioning, control_net, image, switch, strength): |
| | show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-apply-controlnet" |
| | if strength == 0 or switch == "Off": |
| | return (conditioning, show_help, ) |
| |
|
| | c = [] |
| | control_hint = image.movedim(-1,1) |
| | for t in conditioning: |
| | n = [t[0], t[1].copy()] |
| | c_net = control_net.copy().set_cond_hint(control_hint, strength) |
| | if 'control' in t[1]: |
| | c_net.set_previous_controlnet(t[1]['control']) |
| | n[1]['control'] = c_net |
| | c.append(n) |
| | return (c, show_help, ) |
| |
|
| | |
| | |
| | class CR_ControlNetStack: |
| |
|
| | controlnets = ["None"] + folder_paths.get_filename_list("controlnet") |
| | |
| | @classmethod |
| | def INPUT_TYPES(cls): |
| | |
| | return {"required": { |
| | }, |
| | "optional": { |
| | "switch_1": (["Off","On"],), |
| | "controlnet_1": (cls.controlnets,), |
| | "controlnet_strength_1": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), |
| | "start_percent_1": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | "end_percent_1": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | |
| | "switch_2": (["Off","On"],), |
| | "controlnet_2": (cls.controlnets,), |
| | "controlnet_strength_2": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), |
| | "start_percent_2": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | "end_percent_2": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | |
| | "switch_3": (["Off","On"],), |
| | "controlnet_3": (cls.controlnets,), |
| | "controlnet_strength_3": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), |
| | "start_percent_3": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | "end_percent_3": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| | "image_1": ("IMAGE",), |
| | "image_2": ("IMAGE",), |
| | "image_3": ("IMAGE",), |
| | "controlnet_stack": ("CONTROL_NET_STACK",) |
| | }, |
| | } |
| |
|
| | RETURN_TYPES = ("CONTROL_NET_STACK", "STRING", ) |
| | RETURN_NAMES = ("CONTROLNET_STACK", "show_help", ) |
| | FUNCTION = "controlnet_stacker" |
| | CATEGORY = icons.get("Comfyroll/ControlNet") |
| |
|
| | def controlnet_stacker(self, switch_1, controlnet_1, controlnet_strength_1, start_percent_1, end_percent_1, |
| | switch_2, controlnet_2, controlnet_strength_2, start_percent_2, end_percent_2, |
| | switch_3, controlnet_3, controlnet_strength_3, start_percent_3, end_percent_3, |
| | image_1=None, image_2=None, image_3=None, controlnet_stack=None): |
| |
|
| | |
| | controlnet_list= [] |
| | |
| | if controlnet_stack is not None: |
| | controlnet_list.extend([l for l in controlnet_stack if l[0] != "None"]) |
| | |
| | if controlnet_1 != "None" and switch_1 == "On" and image_1 is not None: |
| | controlnet_path = folder_paths.get_full_path("controlnet", controlnet_1) |
| | controlnet_1 = comfy.controlnet.load_controlnet(controlnet_path) |
| | controlnet_list.extend([(controlnet_1, image_1, controlnet_strength_1, start_percent_1, end_percent_1)]), |
| |
|
| | if controlnet_2 != "None" and switch_2 == "On" and image_2 is not None: |
| | controlnet_path = folder_paths.get_full_path("controlnet", controlnet_2) |
| | controlnet_2 = comfy.controlnet.load_controlnet(controlnet_path) |
| | controlnet_list.extend([(controlnet_2, image_2, controlnet_strength_2, start_percent_2, end_percent_2)]), |
| |
|
| | if controlnet_3 != "None" and switch_3 == "On" and image_3 is not None: |
| | controlnet_path = folder_paths.get_full_path("controlnet", controlnet_3) |
| | controlnet_3 = comfy.controlnet.load_controlnet(controlnet_path) |
| | controlnet_list.extend([(controlnet_3, image_3, controlnet_strength_3, start_percent_3, end_percent_3)]), |
| |
|
| | show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-multi-controlnet-stack" |
| |
|
| | return (controlnet_list, show_help, ) |
| | |
| | |
| | |
| | class CR_ApplyControlNetStack: |
| | @classmethod |
| | def INPUT_TYPES(s): |
| | return {"required": {"base_positive": ("CONDITIONING", ), |
| | "base_negative": ("CONDITIONING",), |
| | "switch": (["Off","On"],), |
| | "controlnet_stack": ("CONTROL_NET_STACK", ), |
| | } |
| | } |
| |
|
| | RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "STRING", ) |
| | RETURN_NAMES = ("base_pos", "base_neg", "show_help", ) |
| | FUNCTION = "apply_controlnet_stack" |
| | CATEGORY = icons.get("Comfyroll/ControlNet") |
| |
|
| | def apply_controlnet_stack(self, base_positive, base_negative, switch, controlnet_stack=None,): |
| | show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/ControlNet-Nodes#cr-apply-multi-controlnet-stack" |
| |
|
| | if switch == "Off": |
| | return (base_positive, base_negative, show_help, ) |
| | |
| | if controlnet_stack is not None: |
| | for controlnet_tuple in controlnet_stack: |
| | controlnet_name, image, strength, start_percent, end_percent = controlnet_tuple |
| | |
| | if type(controlnet_name) == str: |
| | controlnet_path = folder_paths.get_full_path("controlnet", controlnet_name) |
| | controlnet = comfy.sd.load_controlnet(controlnet_path) |
| | else: |
| | controlnet = controlnet_name |
| | |
| | controlnet_conditioning = ControlNetApplyAdvanced().apply_controlnet(base_positive, base_negative, |
| | controlnet, image, strength, |
| | start_percent, end_percent) |
| |
|
| | base_positive, base_negative = controlnet_conditioning[0], controlnet_conditioning[1] |
| |
|
| | return (base_positive, base_negative, show_help, ) |
| |
|
| | |
| | |
| | |
| | |
| | ''' |
| | NODE_CLASS_MAPPINGS = { |
| | "CR Apply ControlNet": CR_ApplyControlNet, |
| | "CR Multi-ControlNet Stack":CR_ControlNetStack, |
| | "CR Apply Multi-ControlNet":CR_ApplyControlNetStack, |
| | } |
| | ''' |
| |
|
| |
|