7.0 KiB
7.0 KiB
Documentation
- Class name: ttN xyPlot
- Category: ttN/legacy
- Output node: False
ttN xyPlot节点专门用于在特定的可视化框架中生成和处理XY图。它主要负责验证图表类型、管理图表变量,以及协调基于XY坐标的图像生成。该节点集成了多种功能,以确保视觉呈现的创建既高效又能适应不同类型的数据输入。
Input types
Required
- grid_spacing
- 决定图表中网格点之间的间距,影响图表的分辨率和视觉密度。
- Comfy dtype: INT
- Python dtype: int
- latent_id
- 标识要在图表中使用的特定潜在变量,影响数据的表示和可视化。
- Comfy dtype: INT
- Python dtype: int
- output_individuals
- 控制是否输出单个数据点,影响图表可视化的细节级别。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- flip_xy
- 指定是否应翻转X和Y轴,改变图表的方向。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- x_axis
- 定义X轴的数据类型或类别,塑造数据的解释和绘制方式。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- x_values
- 要在X轴上绘制的值列表,决定图表中具体点的位置和排列。
- Comfy dtype: STRING
- Python dtype: List[str]
- y_axis
- 指定Y轴的数据类型或类别,影响图表的数据解释和可视化。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- y_values
- 用于在Y轴上绘制的值集合,决定图表点的位置和组织。
- Comfy dtype: STRING
- Python dtype: List[str]
Output types
- xyPlot
- 生成的XY图数据,封装了绘制点的可视化表示。
- Comfy dtype: XYPLOT
- Python dtype: Dict[str, Any]
Usage tips
- Infra type:
CPU - Common nodes: unknown
Source code
class ttN_XYPlot:
version = '1.2.0'
lora_list = ["None"] + folder_paths.get_filename_list("loras")
lora_strengths = {"min": -4.0, "max": 4.0, "step": 0.01}
token_normalization = ["none", "mean", "length", "length+mean"]
weight_interpretation = ["comfy", "A1111", "compel", "comfy++"]
loader_dict = {
"ckpt_name": folder_paths.get_filename_list("checkpoints"),
"vae_name": ["Baked-VAE"] + folder_paths.get_filename_list("vae"),
"clip_skip": {"min": -24, "max": -1, "step": 1},
"lora1_name": lora_list,
"lora1_model_strength": lora_strengths,
"lora1_clip_strength": lora_strengths,
"lora1_model&clip_strength": lora_strengths,
"lora2_name": lora_list,
"lora2_model_strength": lora_strengths,
"lora2_clip_strength": lora_strengths,
"lora2_model&clip_strength": lora_strengths,
"lora3_name": lora_list,
"lora3_model_strength": lora_strengths,
"lora3_clip_strength": lora_strengths,
"lora3_model&clip_strength": lora_strengths,
"positive": [],
"positive_token_normalization": token_normalization,
"positive_weight_interpretation": weight_interpretation,
"negative": [],
"negative_token_normalization": token_normalization,
"negative_weight_interpretation": weight_interpretation,
}
sampler_dict = {
"lora_name": lora_list,
"lora_model_strength": lora_strengths,
"lora_clip_strength": lora_strengths,
"lora_model&clip_strength": lora_strengths,
"steps": {"min": 1, "max": 100, "step": 1},
"cfg": {"min": 0.0, "max": 100.0, "step": 1.0},
"sampler_name": comfy.samplers.KSampler.SAMPLERS,
"scheduler": comfy.samplers.KSampler.SCHEDULERS,
"denoise": {"min": 0.0, "max": 1.0, "step": 0.01},
"seed": ['increment', 'decrement', 'randomize'],
}
plot_dict = {**sampler_dict, **loader_dict}
plot_values = ["None",]
plot_values.append("---------------------")
for k in sampler_dict:
plot_values.append(f'sampler: {k}')
plot_values.append("---------------------")
for k in loader_dict:
plot_values.append(f'loader: {k}')
def __init__(self):
pass
rejected = ["None", "---------------------"]
@classmethod
def INPUT_TYPES(s):
return {
"required": {
#"info": ("INFO", {"default": "Any values not set by xyplot will be taken from the KSampler or connected pipeLoader", "multiline": True}),
"grid_spacing": ("INT",{"min": 0, "max": 500, "step": 5, "default": 0,}),
"latent_id": ("INT",{"min": 0, "max": 100, "step": 1, "default": 0, }),
"output_individuals": (["False", "True"],{"default": "False"}),
"flip_xy": (["False", "True"],{"default": "False"}),
"x_axis": (ttN_XYPlot.plot_values, {"default": 'None'}),
"x_values": ("STRING",{"default": '', "multiline": True, "placeholder": 'insert values seperated by "; "'}),
"y_axis": (ttN_XYPlot.plot_values, {"default": 'None'}),
"y_values": ("STRING",{"default": '', "multiline": True, "placeholder": 'insert values seperated by "; "'}),
},
"hidden": {
"plot_dict": (ttN_XYPlot.plot_dict,),
"ttNnodeVersion": ttN_XYPlot.version,
},
}
RETURN_TYPES = ("XYPLOT", )
RETURN_NAMES = ("xyPlot", )
FUNCTION = "plot"
CATEGORY = "ttN/legacy"
def plot(self, grid_spacing, latent_id, output_individuals, flip_xy, x_axis, x_values, y_axis, y_values):
def clean_values(values):
original_values = values.split("; ")
cleaned_values = []
for value in original_values:
# Strip the semi-colon
cleaned_value = value.strip(';').strip()
if cleaned_value == "":
continue
# Try to convert the cleaned_value back to int or float if possible
try:
cleaned_value = int(cleaned_value)
except ValueError:
try:
cleaned_value = float(cleaned_value)
except ValueError:
pass
# Append the cleaned_value to the list
cleaned_values.append(cleaned_value)
return cleaned_values
if x_axis in self.rejected:
x_axis = "None"
x_values = []
else:
x_values = clean_values(x_values)
if y_axis in self.rejected:
y_axis = "None"
y_values = []
else:
y_values = clean_values(y_values)
if flip_xy == "True":
x_axis, y_axis = y_axis, x_axis
x_values, y_values = y_values, x_values
xy_plot = {"x_axis": x_axis,
"x_vals": x_values,
"y_axis": y_axis,
"y_vals": y_values,
"grid_spacing": grid_spacing,
"latent_id": latent_id,
"output_individuals": output_individuals}
return (xy_plot, )