11 KiB
11 KiB
Documentation
- Class name: pipeXYPlotAdvanced
- Category: EasyUse/Pipe
- Output node: False
- Repo Ref: https://github.com/yolain/ComfyUI-Easy-Use.git
该节点提供高级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)