104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
import random
|
|
import json
|
|
import os
|
|
|
|
class FixedSeedController:
|
|
"""
|
|
A ComfyUI node that generates a random seed and keeps it fixed until manually regenerated.
|
|
Perfect for iterative workflows where you want to keep the same seed across multiple generations.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.current_seed = None
|
|
self.seed_file = os.path.join(os.path.dirname(__file__), "last_seed.json")
|
|
self.load_seed()
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"generate_new_seed": ("BOOLEAN", {
|
|
"default": False,
|
|
"label_on": "Generate New",
|
|
"label_off": "Keep Current"
|
|
}),
|
|
"seed_min": ("INT", {
|
|
"default": 0,
|
|
"min": 0,
|
|
"max": 0xffffffffffffffff,
|
|
"step": 1
|
|
}),
|
|
"seed_max": ("INT", {
|
|
"default": 0xffffffffffffffff,
|
|
"min": 0,
|
|
"max": 0xffffffffffffffff,
|
|
"step": 1
|
|
}),
|
|
},
|
|
"optional": {
|
|
"manual_seed": ("INT", {
|
|
"default": -1,
|
|
"min": -1,
|
|
"max": 0xffffffffffffffff,
|
|
"step": 1,
|
|
"tooltip": "Set to -1 to use random generation, or enter a specific seed"
|
|
}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("INT", "STRING")
|
|
RETURN_NAMES = ("seed", "seed_info")
|
|
FUNCTION = "generate_seed"
|
|
CATEGORY = "utils"
|
|
OUTPUT_NODE = False
|
|
|
|
def load_seed(self):
|
|
"""Load the last used seed from file"""
|
|
try:
|
|
if os.path.exists(self.seed_file):
|
|
with open(self.seed_file, 'r') as f:
|
|
data = json.load(f)
|
|
self.current_seed = data.get('seed', None)
|
|
except Exception as e:
|
|
print(f"Could not load seed: {e}")
|
|
self.current_seed = None
|
|
|
|
def save_seed(self, seed):
|
|
"""Save the current seed to file"""
|
|
try:
|
|
with open(self.seed_file, 'w') as f:
|
|
json.dump({'seed': seed}, f)
|
|
except Exception as e:
|
|
print(f"Could not save seed: {e}")
|
|
|
|
def generate_seed(self, generate_new_seed, seed_min, seed_max, manual_seed=-1):
|
|
"""
|
|
Generate or return the current seed based on parameters
|
|
"""
|
|
# If manual seed is provided (not -1), use it
|
|
if manual_seed >= 0:
|
|
self.current_seed = manual_seed
|
|
self.save_seed(self.current_seed)
|
|
info = f"Manual Seed: {self.current_seed}"
|
|
return (self.current_seed, info)
|
|
|
|
# If we need to generate a new seed or don't have one yet
|
|
if generate_new_seed or self.current_seed is None:
|
|
self.current_seed = random.randint(seed_min, seed_max)
|
|
self.save_seed(self.current_seed)
|
|
info = f"New Random Seed: {self.current_seed}"
|
|
else:
|
|
info = f"Fixed Seed: {self.current_seed}"
|
|
|
|
return (self.current_seed, info)
|
|
|
|
|
|
# Node registration
|
|
NODE_CLASS_MAPPINGS = {
|
|
"FixedSeedController": FixedSeedController
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"FixedSeedController": "Fixed Seed Controller"
|
|
}
|