Files
CavinHuang-comfyui-nodes-docs/docs/CR Multi-ControlNet Stack.md
2024-05-26 20:35:16 +08:00

5.6 KiB

Documentation

CR_ControlNetStack 是一个用于管理和应用多个 ControlNet 配置的节点,以顺序方式进行。它允许用户切换各个 ControlNet 的开关,调整它们的影响力度,并定义它们应该应用的范围。这个节点对于微调图像生成过程的控制和方向至关重要,确保了高度的定制化和精确度。

Input types

Optional

  • switch_1
    • 开关参数决定第一个 ControlNet 是否在栈中激活。它在控制节点内控制信号流中起着关键作用,可以启用或禁用特定的影响层。
    • Comfy dtype: COMBO['Off', 'On']
    • Python dtype: str
  • controlnet_1
    • controlnet_1 参数指定了栈中要使用的第一个 ControlNet。它对于定义要应用的控制类型至关重要,并且对图像生成过程的结果有显著影响。
    • Comfy dtype: COMBO[]
    • Python dtype: str
  • controlnet_strength_1
    • controlnet_strength_1 参数调整第一个 ControlNet 影响的强度。它是微调节点内不同控制层之间平衡的关键因素。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • start_percent_1
    • start_percent_1 参数定义了图像生成过程中第一个 ControlNet 开始生效的起始百分比。它对于控制控制信号的空间分布很重要。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • end_percent_1
    • end_percent_1 参数标志着图像生成过程中第一个 ControlNet 影响结束的百分比。它对于确定控制应用的范围至关重要。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • image_1
    • image_1 参数代表与第一个 ControlNet 相关联的图像。它对于为控制机制提供视觉上下文和指导至关重要。
    • Comfy dtype: IMAGE
    • Python dtype: PIL.Image

Output types

  • CONTROLNET_STACK
    • CONTROLNET_STACK 输出包含已编译的激活 ControlNets 列表及其各自的设置,准备应用于图像生成过程。
    • Comfy dtype: CONTROL_NET_STACK
    • Python dtype: List[Tuple[comfy.controlnet.ControlNet, PIL.Image, float, float, float]]
  • show_help
    • show_help 输出提供了一个 URL 到文档,以获取有关使用 CR_ControlNetStack 节点的进一步指导。
    • Comfy dtype: STRING
    • Python dtype: str

Usage tips

  • Infra type: CPU

Source code

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)