Files
CavinHuang-comfyui-nodes-docs/docs/easy XYPlotAdvanced.md
2024-05-26 20:35:16 +08:00

11 KiB
Raw Permalink Blame History

Documentation

该节点提供高级XY绘图功能,专为满足管道线路的需求而设计。它与各种数据类型和设置集成,以生成可视化图表,提供对管道内数据结构和关系的洞察。节点的设计强调适应性和易用性,确保用户能够快速生成有意义的可视化图表,而无需进行广泛的配置。

Input types

Required

  • pipe
    • ‘pipe’参数是此节点的主干,代表从中提取和可视化数据的管道线路。它对节点的运行至关重要,因为它包含了绘图所需的所有必要信息和设置。
    • Comfy dtype: PIPE_LINE
    • Python dtype: Dict
  • grid_spacing
    • ‘grid_spacing’参数决定了图表中网格线之间的间距,影响可视化的整体清晰度和可读性。它在以易于理解的方式呈现数据点和趋势方面发挥着重要作用。
    • Comfy dtype: INT
    • Python dtype: int
  • output_individuals
    • ‘output_individuals’参数允许用户控制是否在图表中单独显示各个数据点。这对于分析特定数据点及其在数据集中的关系非常重要。
    • Comfy dtype: BOOL
    • Python dtype: bool
  • flip_xy
    • ‘flip_xy’参数允许用户翻转X轴和Y轴,这在某些数据可视化场景中非常有用,尤其是当传统方向不是最佳选择时。
    • Comfy dtype: BOOL
    • Python dtype: bool

Optional

  • X
    • ‘X’参数代表X轴的配置,包括轴标签和相关值。它对于定义图表的水平维度至关重要,并且可以通过各种模型和设置进行定制。
    • Comfy dtype: X_Y
    • Python dtype: Dict
  • Y
    • ‘Y’参数对应于Y轴的配置,指定轴标签和相应的值。它对于建立图表的垂直维度至关重要,并且可以通过不同的模型和设置进行调整。
    • Comfy dtype: X_Y
    • Python dtype: Dict

Output types

  • pipe
    • ‘pipe’输出是输入‘pipe’的更新版本,现在包含了生成的XY图表信息。它代表了管道的进展,将可视化结果重新整合到数据流中,以便进一步分析或处理。
    • Comfy dtype: PIPE_LINE
    • Python dtype: Dict

Usage tips

  • Infra type: CPU

Source code

class pipeXYPlotAdvanced:

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'pipe': ('PIPE_LINE',), 'grid_spacing': ('INT', {'min': 0, 'max': 500, 'step': 5, 'default': 0}), 'output_individuals': (['False', 'True'], {'default': 'False'}), 'flip_xy': (['False', 'True'], {'default': 'False'})}, 'optional': {'X': ('X_Y',), 'Y': ('X_Y',)}, 'hidden': {'my_unique_id': 'UNIQUE_ID'}}
    RETURN_TYPES = ('PIPE_LINE',)
    RETURN_NAMES = ('pipe',)
    FUNCTION = 'plot'
    CATEGORY = 'EasyUse/Pipe'

    def plot(self, pipe, grid_spacing, output_individuals, flip_xy, X=None, Y=None, my_unique_id=None):
        if X != None:
            x_axis = X.get('axis')
            x_values = X.get('values')
        else:
            x_axis = 'Nothing'
            x_values = ['']
        if Y != None:
            y_axis = Y.get('axis')
            y_values = Y.get('values')
        else:
            y_axis = 'Nothing'
            y_values = ['']
        if pipe is not None:
            new_pipe = pipe
            positive = pipe['loader_settings']['positive'] if 'positive' in pipe['loader_settings'] else ''
            negative = pipe['loader_settings']['negative'] if 'negative' in pipe['loader_settings'] else ''
            if x_axis == 'advanced: ModelMergeBlocks':
                models = X.get('models')
                vae_use = X.get('vae_use')
                if models is None:
                    raise Exception('models is not found')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'models': models, 'vae_use': vae_use}
            if y_axis == 'advanced: ModelMergeBlocks':
                models = Y.get('models')
                vae_use = Y.get('vae_use')
                if models is None:
                    raise Exception('models is not found')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'models': models, 'vae_use': vae_use}
            if x_axis in ['advanced: Lora', 'advanced: Checkpoint']:
                lora_stack = X.get('lora_stack')
                _lora_stack = []
                if lora_stack is not None:
                    for lora in lora_stack:
                        _lora_stack.append({'lora_name': lora[0], 'model': pipe['model'], 'clip': pipe['clip'], 'model_strength': lora[1], 'clip_strength': lora[2]})
                del lora_stack
                x_values = '; '.join(x_values)
                lora_stack = pipe['lora_stack'] + _lora_stack if 'lora_stack' in pipe else _lora_stack
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'lora_stack': lora_stack}
            if y_axis in ['advanced: Lora', 'advanced: Checkpoint']:
                lora_stack = Y.get('lora_stack')
                _lora_stack = []
                if lora_stack is not None:
                    for lora in lora_stack:
                        _lora_stack.append({'lora_name': lora[0], 'model': pipe['model'], 'clip': pipe['clip'], 'model_strength': lora[1], 'clip_strength': lora[2]})
                del lora_stack
                y_values = '; '.join(y_values)
                lora_stack = pipe['lora_stack'] + _lora_stack if 'lora_stack' in pipe else _lora_stack
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'lora_stack': lora_stack}
            if x_axis == 'advanced: Seeds++ Batch':
                if new_pipe['seed']:
                    value = x_values
                    x_values = []
                    for index in range(value):
                        x_values.append(str(new_pipe['seed'] + index))
                    x_values = '; '.join(x_values)
            if y_axis == 'advanced: Seeds++ Batch':
                if new_pipe['seed']:
                    value = y_values
                    y_values = []
                    for index in range(value):
                        y_values.append(str(new_pipe['seed'] + index))
                    y_values = '; '.join(y_values)
            if x_axis == 'advanced: Positive Prompt S/R':
                if positive:
                    x_value = x_values
                    x_values = []
                    for (index, value) in enumerate(x_value):
                        (search_txt, replace_txt, replace_all) = value
                        if replace_all:
                            txt = replace_txt if replace_txt is not None else positive
                            x_values.append(txt)
                        else:
                            txt = positive.replace(search_txt, replace_txt, 1) if replace_txt is not None else positive
                            x_values.append(txt)
                    x_values = '; '.join(x_values)
            if y_axis == 'advanced: Positive Prompt S/R':
                if positive:
                    y_value = y_values
                    y_values = []
                    for (index, value) in enumerate(y_value):
                        (search_txt, replace_txt, replace_all) = value
                        if replace_all:
                            txt = replace_txt if replace_txt is not None else positive
                            y_values.append(txt)
                        else:
                            txt = positive.replace(search_txt, replace_txt, 1) if replace_txt is not None else positive
                            y_values.append(txt)
                    y_values = '; '.join(y_values)
            if x_axis == 'advanced: Negative Prompt S/R':
                if negative:
                    x_value = x_values
                    x_values = []
                    for (index, value) in enumerate(x_value):
                        (search_txt, replace_txt, replace_all) = value
                        if replace_all:
                            txt = replace_txt if replace_txt is not None else negative
                            x_values.append(txt)
                        else:
                            txt = negative.replace(search_txt, replace_txt, 1) if replace_txt is not None else negative
                            x_values.append(txt)
                    x_values = '; '.join(x_values)
            if y_axis == 'advanced: Negative Prompt S/R':
                if negative:
                    y_value = y_values
                    y_values = []
                    for (index, value) in enumerate(y_value):
                        (search_txt, replace_txt, replace_all) = value
                        if replace_all:
                            txt = replace_txt if replace_txt is not None else negative
                            y_values.append(txt)
                        else:
                            txt = negative.replace(search_txt, replace_txt, 1) if replace_txt is not None else negative
                            y_values.append(txt)
                    y_values = '; '.join(y_values)
            if 'advanced: ControlNet' in x_axis:
                x_value = x_values
                x_values = []
                cnet = []
                for (index, value) in enumerate(x_value):
                    cnet.append(value)
                    x_values.append(str(index))
                x_values = '; '.join(x_values)
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'cnet_stack': cnet}
            if 'advanced: ControlNet' in y_axis:
                y_value = y_values
                y_values = []
                cnet = []
                for (index, value) in enumerate(y_value):
                    cnet.append(value)
                    y_values.append(str(index))
                y_values = '; '.join(y_values)
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'cnet_stack': cnet}
            if 'advanced: Pos Condition' in x_axis:
                x_values = '; '.join(x_values)
                cond = X.get('cond')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'positive_cond_stack': cond}
            if 'advanced: Pos Condition' in y_axis:
                y_values = '; '.join(y_values)
                cond = Y.get('cond')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'positive_cond_stack': cond}
            if 'advanced: Neg Condition' in x_axis:
                x_values = '; '.join(x_values)
                cond = X.get('cond')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'negative_cond_stack': cond}
            if 'advanced: Neg Condition' in y_axis:
                y_values = '; '.join(y_values)
                cond = Y.get('cond')
                new_pipe['loader_settings'] = {**pipe['loader_settings'], 'negative_cond_stack': cond}
            del pipe
        return pipeXYPlot().plot(grid_spacing, output_individuals, flip_xy, x_axis, x_values, y_axis, y_values, new_pipe)