| import os |
| import folder_paths |
| import comfy.samplers, comfy.supported_models |
|
|
| from nodes import LatentFromBatch, RepeatLatentBatch |
| from ..config import MAX_SEED_NUM |
|
|
| from ..libs.log import log_node_warn |
| from ..libs.utils import get_sd_version |
| from ..libs.conditioning import prompt_to_cond, set_cond |
|
|
| from .. import easyCache |
|
|
| |
| class pipeIn: |
| def __init__(self): |
| pass |
|
|
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": {}, |
| "optional": { |
| "pipe": ("PIPE_LINE",), |
| "model": ("MODEL",), |
| "pos": ("CONDITIONING",), |
| "neg": ("CONDITIONING",), |
| "latent": ("LATENT",), |
| "vae": ("VAE",), |
| "clip": ("CLIP",), |
| "image": ("IMAGE",), |
| "xyPlot": ("XYPLOT",), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID"}, |
| } |
|
|
| RETURN_TYPES = ("PIPE_LINE",) |
| RETURN_NAMES = ("pipe",) |
| FUNCTION = "flush" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def flush(self, pipe=None, model=None, pos=None, neg=None, latent=None, vae=None, clip=None, image=None, xyplot=None, my_unique_id=None): |
|
|
| model = model if model is not None else pipe.get("model") |
| if model is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Model missing from pipeLine") |
| pos = pos if pos is not None else pipe.get("positive") |
| if pos is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Pos Conditioning missing from pipeLine") |
| neg = neg if neg is not None else pipe.get("negative") |
| if neg is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Neg Conditioning missing from pipeLine") |
| vae = vae if vae is not None else pipe.get("vae") |
| if vae is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "VAE missing from pipeLine") |
| clip = clip if clip is not None else pipe.get("clip") if pipe is not None and "clip" in pipe else None |
| |
| |
| if latent is not None: |
| samples = latent |
| elif image is None: |
| samples = pipe.get("samples") if pipe is not None else None |
| image = pipe.get("images") if pipe is not None else None |
| elif image is not None: |
| if pipe is None: |
| batch_size = 1 |
| else: |
| batch_size = pipe["loader_settings"]["batch_size"] if "batch_size" in pipe["loader_settings"] else 1 |
| samples = {"samples": vae.encode(image[:, :, :, :3])} |
| samples = RepeatLatentBatch().repeat(samples, batch_size)[0] |
|
|
| if pipe is None: |
| pipe = {"loader_settings": {"positive": "", "negative": "", "xyplot": None}} |
|
|
| xyplot = xyplot if xyplot is not None else pipe['loader_settings']['xyplot'] if xyplot in pipe['loader_settings'] else None |
|
|
| new_pipe = { |
| **pipe, |
| "model": model, |
| "positive": pos, |
| "negative": neg, |
| "vae": vae, |
| "clip": clip, |
|
|
| "samples": samples, |
| "images": image, |
| "seed": pipe.get('seed') if pipe is not None and "seed" in pipe else None, |
|
|
| "loader_settings": { |
| **pipe["loader_settings"], |
| "xyplot": xyplot |
| } |
| } |
| del pipe |
|
|
| return (new_pipe,) |
|
|
| |
| class pipeOut: |
| def __init__(self): |
| pass |
|
|
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": { |
| "pipe": ("PIPE_LINE",), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID"}, |
| } |
|
|
| RETURN_TYPES = ("PIPE_LINE", "MODEL", "CONDITIONING", "CONDITIONING", "LATENT", "VAE", "CLIP", "IMAGE", "INT",) |
| RETURN_NAMES = ("pipe", "model", "pos", "neg", "latent", "vae", "clip", "image", "seed",) |
| FUNCTION = "flush" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def flush(self, pipe, my_unique_id=None): |
| model = pipe.get("model") |
| pos = pipe.get("positive") |
| neg = pipe.get("negative") |
| latent = pipe.get("samples") |
| vae = pipe.get("vae") |
| clip = pipe.get("clip") |
| image = pipe.get("images") |
| seed = pipe.get("seed") |
|
|
| return pipe, model, pos, neg, latent, vae, clip, image, seed |
|
|
| |
| class pipeEdit: |
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": { |
| "clip_skip": ("INT", {"default": -1, "min": -24, "max": 0, "step": 1}), |
|
|
| "optional_positive": ("STRING", {"default": "", "multiline": True}), |
| "positive_token_normalization": (["none", "mean", "length", "length+mean"],), |
| "positive_weight_interpretation": (["comfy", "A1111", "comfy++", "compel", "fixed attention"],), |
|
|
| "optional_negative": ("STRING", {"default": "", "multiline": True}), |
| "negative_token_normalization": (["none", "mean", "length", "length+mean"],), |
| "negative_weight_interpretation": (["comfy", "A1111", "comfy++", "compel", "fixed attention"],), |
|
|
| "a1111_prompt_style": ("BOOLEAN", {"default": False}), |
| "conditioning_mode": (['replace', 'concat', 'combine', 'average', 'timestep'], {"default": "replace"}), |
| "average_strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), |
| "old_cond_start": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| "old_cond_end": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| "new_cond_start": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| "new_cond_end": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001}), |
| }, |
| "optional": { |
| "pipe": ("PIPE_LINE",), |
| "model": ("MODEL",), |
| "pos": ("CONDITIONING",), |
| "neg": ("CONDITIONING",), |
| "latent": ("LATENT",), |
| "vae": ("VAE",), |
| "clip": ("CLIP",), |
| "image": ("IMAGE",), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID", "prompt":"PROMPT"}, |
| } |
|
|
| RETURN_TYPES = ("PIPE_LINE", "MODEL", "CONDITIONING", "CONDITIONING", "LATENT", "VAE", "CLIP", "IMAGE") |
| RETURN_NAMES = ("pipe", "model", "pos", "neg", "latent", "vae", "clip", "image") |
| FUNCTION = "edit" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def edit(self, clip_skip, optional_positive, positive_token_normalization, positive_weight_interpretation, optional_negative, negative_token_normalization, negative_weight_interpretation, a1111_prompt_style, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end, pipe=None, model=None, pos=None, neg=None, latent=None, vae=None, clip=None, image=None, my_unique_id=None, prompt=None): |
|
|
| model = model if model is not None else pipe.get("model") |
| if model is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Model missing from pipeLine") |
| vae = vae if vae is not None else pipe.get("vae") |
| if vae is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "VAE missing from pipeLine") |
| clip = clip if clip is not None else pipe.get("clip") |
| if clip is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Clip missing from pipeLine") |
| if image is None: |
| image = pipe.get("images") if pipe is not None else None |
| samples = latent if latent is not None else pipe.get("samples") |
| if samples is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Latent missing from pipeLine") |
| else: |
| batch_size = pipe["loader_settings"]["batch_size"] if "batch_size" in pipe["loader_settings"] else 1 |
| samples = {"samples": vae.encode(image[:, :, :, :3])} |
| samples = RepeatLatentBatch().repeat(samples, batch_size)[0] |
|
|
| pipe_lora_stack = pipe.get("lora_stack") if pipe is not None and "lora_stack" in pipe else [] |
|
|
| steps = pipe["loader_settings"]["steps"] if "steps" in pipe["loader_settings"] else 1 |
| if pos is None and optional_positive != '': |
| pos, positive_wildcard_prompt, model, clip = prompt_to_cond('positive', model, clip, clip_skip, |
| pipe_lora_stack, optional_positive, positive_token_normalization,positive_weight_interpretation, |
| a1111_prompt_style, my_unique_id, prompt, easyCache, True, steps) |
| pos = set_cond(pipe['positive'], pos, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end) |
| pipe['loader_settings']['positive'] = positive_wildcard_prompt |
| pipe['loader_settings']['positive_token_normalization'] = positive_token_normalization |
| pipe['loader_settings']['positive_weight_interpretation'] = positive_weight_interpretation |
| if a1111_prompt_style: |
| pipe['loader_settings']['a1111_prompt_style'] = True |
| else: |
| pos = pipe.get("positive") |
| if pos is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Pos Conditioning missing from pipeLine") |
|
|
| if neg is None and optional_negative != '': |
| neg, negative_wildcard_prompt, model, clip = prompt_to_cond("negative", model, clip, clip_skip, pipe_lora_stack, optional_negative, |
| negative_token_normalization, negative_weight_interpretation, |
| a1111_prompt_style, my_unique_id, prompt, easyCache, True, steps) |
| neg = set_cond(pipe['negative'], neg, conditioning_mode, average_strength, old_cond_start, old_cond_end, new_cond_start, new_cond_end) |
| pipe['loader_settings']['negative'] = negative_wildcard_prompt |
| pipe['loader_settings']['negative_token_normalization'] = negative_token_normalization |
| pipe['loader_settings']['negative_weight_interpretation'] = negative_weight_interpretation |
| if a1111_prompt_style: |
| pipe['loader_settings']['a1111_prompt_style'] = True |
| else: |
| neg = pipe.get("negative") |
| if neg is None: |
| log_node_warn(f'pipeIn[{my_unique_id}]', "Neg Conditioning missing from pipeLine") |
| if pipe is None: |
| pipe = {"loader_settings": {"positive": "", "negative": "", "xyplot": None}} |
|
|
| new_pipe = { |
| **pipe, |
| "model": model, |
| "positive": pos, |
| "negative": neg, |
| "vae": vae, |
| "clip": clip, |
|
|
| "samples": samples, |
| "images": image, |
| "seed": pipe.get('seed') if pipe is not None and "seed" in pipe else None, |
| "loader_settings":{ |
| **pipe["loader_settings"] |
| } |
| } |
| del pipe |
|
|
| return (new_pipe, model,pos, neg, latent, vae, clip, image) |
|
|
| |
| class pipeEditPrompt: |
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": { |
| "pipe": ("PIPE_LINE",), |
| "positive": ("STRING", {"default": "", "multiline": True}), |
| "negative": ("STRING", {"default": "", "multiline": True}), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID", "prompt": "PROMPT"}, |
| } |
|
|
| RETURN_TYPES = ("PIPE_LINE",) |
| RETURN_NAMES = ("pipe",) |
| FUNCTION = "edit" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def edit(self, pipe, positive, negative, my_unique_id=None, prompt=None): |
| model = pipe.get("model") |
| if model is None: |
| log_node_warn(f'pipeEdit[{my_unique_id}]', "Model missing from pipeLine") |
|
|
| from ..modules.kolors.loader import is_kolors_model |
| model_type = get_sd_version(model) |
| if model_type == 'sdxl' and is_kolors_model(model): |
| from ..modules.kolors.text_encode import chatglm3_adv_text_encode |
| auto_clean_gpu = pipe["loader_settings"]["auto_clean_gpu"] if "auto_clean_gpu" in pipe["loader_settings"] else False |
| chatglm3_model = pipe["chatglm3_model"] if "chatglm3_model" in pipe else None |
| |
| log_node_warn("Positive encoding...") |
| positive_embeddings_final = chatglm3_adv_text_encode(chatglm3_model, positive, auto_clean_gpu) |
| log_node_warn("Negative encoding...") |
| negative_embeddings_final = chatglm3_adv_text_encode(chatglm3_model, negative, auto_clean_gpu) |
| else: |
| clip_skip = pipe["loader_settings"]["clip_skip"] if "clip_skip" in pipe["loader_settings"] else -1 |
| lora_stack = pipe.get("lora_stack") if pipe is not None and "lora_stack" in pipe else [] |
| clip = pipe.get("clip") if pipe is not None and "clip" in pipe else None |
| positive_token_normalization = pipe["loader_settings"]["positive_token_normalization"] if "positive_token_normalization" in pipe["loader_settings"] else "none" |
| positive_weight_interpretation = pipe["loader_settings"]["positive_weight_interpretation"] if "positive_weight_interpretation" in pipe["loader_settings"] else "comfy" |
| negative_token_normalization = pipe["loader_settings"]["negative_token_normalization"] if "negative_token_normalization" in pipe["loader_settings"] else "none" |
| negative_weight_interpretation = pipe["loader_settings"]["negative_weight_interpretation"] if "negative_weight_interpretation" in pipe["loader_settings"] else "comfy" |
| a1111_prompt_style = pipe["loader_settings"]["a1111_prompt_style"] if "a1111_prompt_style" in pipe["loader_settings"] else False |
| |
| positive_embeddings_final, positive_wildcard_prompt, model, clip = prompt_to_cond('positive', model, clip, |
| clip_skip, lora_stack, |
| positive, |
| positive_token_normalization, |
| positive_weight_interpretation, |
| a1111_prompt_style, |
| my_unique_id, prompt, |
| easyCache, |
| model_type=model_type) |
| negative_embeddings_final, negative_wildcard_prompt, model, clip = prompt_to_cond('negative', model, clip, |
| clip_skip, lora_stack, |
| negative, |
| negative_token_normalization, |
| negative_weight_interpretation, |
| a1111_prompt_style, |
| my_unique_id, prompt, |
| easyCache, |
| model_type=model_type) |
| new_pipe = { |
| **pipe, |
| "model": model, |
| "positive": positive_embeddings_final, |
| "negative": negative_embeddings_final, |
| } |
| del pipe |
|
|
| return (new_pipe,) |
|
|
|
|
| |
| class pipeToBasicPipe: |
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": { |
| "pipe": ("PIPE_LINE",), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID"}, |
| } |
|
|
| RETURN_TYPES = ("BASIC_PIPE",) |
| RETURN_NAMES = ("basic_pipe",) |
| FUNCTION = "doit" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def doit(self, pipe, my_unique_id=None): |
| new_pipe = (pipe.get('model'), pipe.get('clip'), pipe.get('vae'), pipe.get('positive'), pipe.get('negative')) |
| del pipe |
| return (new_pipe,) |
|
|
| |
| class pipeBatchIndex: |
| @classmethod |
| def INPUT_TYPES(s): |
| return {"required": {"pipe": ("PIPE_LINE",), |
| "batch_index": ("INT", {"default": 0, "min": 0, "max": 63}), |
| "length": ("INT", {"default": 1, "min": 1, "max": 64}), |
| }, |
| "hidden": {"my_unique_id": "UNIQUE_ID"},} |
|
|
| RETURN_TYPES = ("PIPE_LINE",) |
| RETURN_NAMES = ("pipe",) |
| FUNCTION = "doit" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def doit(self, pipe, batch_index, length, my_unique_id=None): |
| samples = pipe["samples"] |
| new_samples, = LatentFromBatch().frombatch(samples, batch_index, length) |
| new_pipe = { |
| **pipe, |
| "samples": new_samples |
| } |
| del pipe |
| return (new_pipe,) |
|
|
| |
| class pipeXYPlot: |
| 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}, |
| "lora_name": lora_list, |
| "lora_model_strength": lora_strengths, |
| "lora_clip_strength": lora_strengths, |
| "positive": [], |
| "negative": [], |
| } |
|
|
| sampler_dict = { |
| "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": {"min": 0, "max": MAX_SEED_NUM}, |
| } |
|
|
| plot_dict = {**sampler_dict, **loader_dict} |
|
|
| plot_values = ["None", ] |
| plot_values.append("---------------------") |
| for k in sampler_dict: |
| plot_values.append(f'preSampling: {k}') |
| plot_values.append("---------------------") |
| for k in loader_dict: |
| plot_values.append(f'loader: {k}') |
|
|
| def __init__(self): |
| pass |
|
|
| rejected = ["None", "---------------------", "Nothing"] |
|
|
| @classmethod |
| def INPUT_TYPES(s): |
| return { |
| "required": { |
| "grid_spacing": ("INT", {"min": 0, "max": 500, "step": 5, "default": 0, }), |
| "output_individuals": (["False", "True"], {"default": "False"}), |
| "flip_xy": (["False", "True"], {"default": "False"}), |
| "x_axis": (pipeXYPlot.plot_values, {"default": 'None'}), |
| "x_values": ( |
| "STRING", {"default": '', "multiline": True, "placeholder": 'insert values seperated by "; "'}), |
| "y_axis": (pipeXYPlot.plot_values, {"default": 'None'}), |
| "y_values": ( |
| "STRING", {"default": '', "multiline": True, "placeholder": 'insert values seperated by "; "'}), |
| }, |
| "optional": { |
| "pipe": ("PIPE_LINE",) |
| }, |
| "hidden": { |
| "plot_dict": (pipeXYPlot.plot_dict,), |
| }, |
| } |
|
|
| RETURN_TYPES = ("PIPE_LINE",) |
| RETURN_NAMES = ("pipe",) |
| FUNCTION = "plot" |
|
|
| CATEGORY = "EasyUse/Pipe" |
|
|
| def plot(self, grid_spacing, output_individuals, flip_xy, x_axis, x_values, y_axis, y_values, pipe=None, font_path=None): |
| def clean_values(values): |
| original_values = values.split("; ") |
| cleaned_values = [] |
|
|
| for value in original_values: |
| |
| cleaned_value = value.strip(';').strip() |
|
|
| if cleaned_value == "": |
| continue |
|
|
| |
| try: |
| cleaned_value = int(cleaned_value) |
| except ValueError: |
| try: |
| cleaned_value = float(cleaned_value) |
| except ValueError: |
| pass |
|
|
| |
| 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, |
| "custom_font": font_path, |
| "grid_spacing": grid_spacing, |
| "output_individuals": output_individuals} |
|
|
| if pipe is not None: |
| new_pipe = pipe.copy() |
| new_pipe['loader_settings'] = { |
| **pipe['loader_settings'], |
| "xyplot": xy_plot |
| } |
| del pipe |
| return (new_pipe, xy_plot,) |
|
|
| |
| import platform |
| class pipeXYPlotAdvanced: |
| if platform.system() == "Windows": |
| system_root = os.environ.get("SystemRoot") |
| user_root = os.environ.get("USERPROFILE") |
| font_dir = os.path.join(system_root, "Fonts") if system_root else None |
| user_font_dir = os.path.join(user_root, "AppData","Local","Microsoft","Windows", "Fonts") if user_root else None |
|
|
| |
| elif platform.system() == "Linux": |
| font_dir = "/usr/share/fonts/truetype" |
| user_font_dir = None |
| elif platform.system() == "Darwin": |
| font_dir = "/System/Library/Fonts" |
| user_font_dir = None |
| else: |
| font_dir = None |
| user_font_dir = None |
|
|
| @classmethod |
| def INPUT_TYPES(s): |
| files_list = [] |
| if s.font_dir and os.path.exists(s.font_dir): |
| font_dir = s.font_dir |
| files_list = files_list + [f for f in os.listdir(font_dir) if os.path.isfile(os.path.join(font_dir, f)) and f.lower().endswith(".ttf")] |
|
|
| if s.user_font_dir and os.path.exists(s.user_font_dir): |
| files_list = files_list + [f for f in os.listdir(s.user_font_dir) if os.path.isfile(os.path.join(s.user_font_dir, f)) and f.lower().endswith(".ttf")] |
|
|
| 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",), |
| "font": (["None"] + files_list,) |
| }, |
| "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, font=None, my_unique_id=None): |
| font_path = os.path.join(self.font_dir, font) if font != "None" else None |
| if font_path and not os.path.exists(font_path): |
| font_path = os.path.join(self.user_font_dir, font) |
|
|
| if X is not None: |
| if isinstance(X, tuple): |
| X = X[0] |
| x_axis = X.get('axis') |
| x_values = X.get('values') |
| else: |
| x_axis = "Nothing" |
| x_values = [""] |
| if Y is not None: |
| if isinstance(Y, tuple): |
| Y = Y[0] |
| y_axis = Y.get('axis') |
| y_values = Y.get('values') |
| else: |
| y_axis = "Nothing" |
| y_values = [""] |
|
|
| if pipe is not None: |
| new_pipe = pipe.copy() |
| 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': |
| seed = new_pipe.get('seed') or 0 |
| value = x_values |
| x_values = [] |
| for index in range(value): |
| x_values.append(str(seed + index)) |
| x_values = "; ".join(x_values) |
| if y_axis == 'advanced: Seeds++ Batch': |
| seed = new_pipe.get('seed') or 0 |
| value = y_values |
| y_values = [] |
| for index in range(value): |
| y_values.append(str(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, font_path) |
|
|
|
|
| NODE_CLASS_MAPPINGS = { |
| "easy pipeIn": pipeIn, |
| "easy pipeOut": pipeOut, |
| "easy pipeEdit": pipeEdit, |
| "easy pipeEditPrompt": pipeEditPrompt, |
| "easy pipeToBasicPipe": pipeToBasicPipe, |
| "easy pipeBatchIndex": pipeBatchIndex, |
| "easy XYPlot": pipeXYPlot, |
| "easy XYPlotAdvanced": pipeXYPlotAdvanced |
| } |
|
|
| NODE_DISPLAY_NAME_MAPPINGS = { |
| "easy pipeIn": "Pipe In", |
| "easy pipeOut": "Pipe Out", |
| "easy pipeEdit": "Pipe Edit", |
| "easy pipeEditPrompt": "Pipe Edit Prompt", |
| "easy pipeBatchIndex": "Pipe Batch Index", |
| "easy pipeToBasicPipe": "Pipe -> BasicPipe", |
| "easy XYPlot": "XY Plot", |
| "easy XYPlotAdvanced": "XY Plot Advanced" |
| } |