feat: Added D2_LoraList / D2_XYFolderImages

This commit is contained in:
da2el-ai
2024-11-12 21:17:27 +09:00
parent c023a8d50e
commit 73cbb75ea4
5 changed files with 130 additions and 31 deletions
+6 -13
View File
@@ -1,7 +1,6 @@
import torch
import math
import os
import glob
import json
import hashlib
import re
@@ -101,24 +100,18 @@ class D2_FolderImageQueue:
CATEGORY = "D2"
######
def run(self, folder = "", extension="*.*", start_at=0, batch_count=1):
files = D2_FolderImageQueue.get_files(folder, extension)
def run(self, folder = "", extension="*.*", start_at=0, auto_queue=True, image_count=""):
files = util.get_files(folder, extension)
image_path = files[start_at - 1]
return {
"result": (image_path,),
"ui": {"message":(image_path, start_at,)}
"ui": {
"image_count": (len(files),),
"start_at": (start_at,),
}
}
@classmethod
def get_files(cls, folder, extension):
search_pattern = os.path.join(folder, extension)
file_list = glob.glob(search_pattern)
# ソートして絶対パスに変換
file_list = sorted(file_list, key=lambda x: os.path.basename(x))
file_list = [os.path.abspath(file) for file in file_list]
return file_list
"""
対象画像枚数を取得
+73 -15
View File
@@ -66,7 +66,6 @@ class D2_XYPlot:
x_len = len(x_array)
y_len = len(y_array)
total = x_len * y_len
print("//////////// - ", index, " / ", total)
# 採用する値
x_value = x_array[index % x_len]
@@ -83,10 +82,6 @@ class D2_XYPlot:
x_annotation = {"title":x_title, "values":x_array},
y_annotation = {"title":y_title, "values":y_array},
print(x_value)
print(y_value)
print(trigger)
return {
"result": (x_value, y_value, x_annotation, y_annotation, trigger,),
"ui": {
@@ -216,7 +211,6 @@ class D2_XYGridImage:
"""
D2 XY Checkpoint List
Checkpointのフルパスを取得できる Checkpoint List
"""
class D2_XYCheckpointList:
@@ -225,26 +219,57 @@ class D2_XYCheckpointList:
ckpt_input = ["None"] +folder_paths.get_filename_list("checkpoints")
inputs = {
"required": {
"separator": (util.SEPARATOR,),
"ckpt_count": ("INT", {"default": 3, "min": 0, "max": 50, "step": 1}),
}
}
for i in range(1, 50):
inputs["required"][f"ckpt_name_{i}"] = (ckpt_input,)
return inputs
RETURN_TYPES = ("LIST","STRING",)
RETURN_NAMES = ("list","list_str")
RETURN_TYPES = ("STRING", "LIST")
RETURN_NAMES = ("STRING", "LIST")
FUNCTION = "run"
CATEGORY = "D2/XY Plot"
def run(self, ckpt_count, **kwargs):
def run(self, separator, ckpt_count, **kwargs):
ckpt_list = [kwargs.get(f"ckpt_name_{i}") for i in range(1, ckpt_count + 1)]
ckpt_list_str = "\n".join(ckpt_list)
ckpt_list_str = util.list_to_text(ckpt_list, separator)
return (ckpt_list, ckpt_list_str,)
"""
D2 XY Lora List
"""
class D2_XYLoraList:
@classmethod
def INPUT_TYPES(cls):
lora_input = ["None"] +folder_paths.get_filename_list("loras")
inputs = {
"required": {
"separator": (util.SEPARATOR,),
"lora_count": ("INT", {"default": 3, "min": 0, "max": 50, "step": 1}),
}
}
for i in range(1, 50):
inputs["required"][f"lora_name_{i}"] = (lora_input,)
return inputs
RETURN_TYPES = ("STRING", "LIST")
RETURN_NAMES = ("STRING", "LIST")
FUNCTION = "run"
CATEGORY = "D2/XY Plot"
def run(self, separator, lora_count, **kwargs):
lora_list = [kwargs.get(f"lora_name_{i}") for i in range(1, lora_count + 1)]
lora_list_str = util.list_to_text(lora_list, separator)
return (lora_list, lora_list_str,)
"""
D2 XYPromptSR
@@ -287,7 +312,7 @@ class D2_XYListToString:
return {
"required": {
"LIST": ("LIST",),
"separator": (["Line break", ",", ";"],),
"separator": (util.SEPARATOR,),
}
}
@@ -297,20 +322,53 @@ class D2_XYListToString:
CATEGORY = "D2/XY Plot"
def run(self, LIST, separator):
separator = "\n" if separator == "Line break" else separator
output = separator.join(LIST)
return (output,)
output = util.list_to_text(LIST, separator)
return {
"result": (output,),
}
"""
D2 XY Folder Images
フォルダ内画像を渡す
"""
class D2_XYFolderImages:
@classmethod
def INPUT_TYPES(cls):
return {
"required":{
"folder": ("STRING", {"default": ""}),
"extension": ("STRING", {"default": "*.*"}),
"separator": (util.SEPARATOR,),
},
}
RETURN_TYPES = ("STRING", "LIST",)
RETURN_NAMES = ("STRING", "LIST",)
FUNCTION = "run"
CATEGORY = "D2/XY Plot"
######
def run(self, folder, extension, separator):
files = util.get_files(folder, extension)
output = util.list_to_text(files, separator)
return {
"result": (output, files,),
}
NODE_CLASS_MAPPINGS = {
"D2 XY Plot": D2_XYPlot,
"D2 XY Grid Image": D2_XYGridImage,
"D2 XY Checkpoint List": D2_XYCheckpointList,
"D2 XY Lora List": D2_XYLoraList,
"D2 XY Prompt SR": D2_XYPromptSR,
"D2 XY List To String": D2_XYListToString,
"D2 XY Folder Images": D2_XYFolderImages,
}
+19 -1
View File
@@ -1,6 +1,7 @@
import os
import yaml
import math
import glob
import shutil
from PIL import Image
import numpy as np
@@ -12,7 +13,7 @@ from comfy.cli_args import args
MAX_RESOLUTION = 16384
SEPARATOR = ["Line break", ",", ";"]
"""
入出力をANYにするもの
@@ -21,6 +22,13 @@ class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
"""
リストを文字結合する
"""
def list_to_text(list, separator):
separator = "\n" if separator == "Line break" else separator
return separator.join(list)
"""
設定ファイルを読み込む
@@ -50,6 +58,16 @@ def get_config_path(filename):
config_path = get_root_path() / 'config'
return config_path / filename
"""
ファイルリスト取得
"""
def get_files(folder, extension):
search_pattern = os.path.join(folder, extension)
file_list = glob.glob(search_pattern)
# ソートして絶対パスに変換
file_list = sorted(file_list, key=lambda x: os.path.basename(x))
file_list = [os.path.abspath(file) for file in file_list]
return file_list
"""
+2 -2
View File
@@ -3,10 +3,10 @@ import { findWidgetByName, handleWidgetsVisibility } from "./utils.js";
app.registerExtension({
name: "Comfy.D2.D2_CheckpointList",
name: "Comfy.D2.D2_XYCheckpointList",
nodeCreated(node) {
if (node.constructor.title == "D2 Checkpoint List"){
if (node.constructor.title == "D2 XY Checkpoint List"){
if (node.widgets){
const countWidget = findWidgetByName(node, "ckpt_count");
let widgetValue = countWidget.value;
+30
View File
@@ -0,0 +1,30 @@
import { app } from "/scripts/app.js";
import { findWidgetByName, handleWidgetsVisibility } from "./utils.js";
app.registerExtension({
name: "Comfy.D2.D2_XYLoraList",
nodeCreated(node) {
if (node.constructor.title == "D2 XY Lora List"){
if (node.widgets){
const countWidget = findWidgetByName(node, "lora_count");
let widgetValue = countWidget.value;
handleWidgetsVisibility(node, widgetValue, ["lora_name"])
// lora_count.value の再定義
Object.defineProperty(countWidget, 'value', {
get() {
return widgetValue;
},
set(newVal) {
if (newVal !== widgetValue) {
widgetValue = newVal;
handleWidgetsVisibility(node, newVal, ["lora_name"])
}
}
});
}
}
}
});