5.6 KiB
5.6 KiB
Documentation
- Class name: CR_ControlNetStack
- Category: Comfyroll/ControlNet
- Output node: False
- Repo Ref: https://github.com/RockOfFire/ComfyUI_Comfyroll_CustomNodes
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)