178 lines
6.9 KiB
Python
178 lines
6.9 KiB
Python
import json
|
|
from pathlib import Path
|
|
from server import PromptServer
|
|
import server
|
|
|
|
class Harronode:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
words_path = Path(__file__).parent / "words.json"
|
|
with open(words_path, "r") as file:
|
|
data = json.load(file)
|
|
colors = data.get("colors", [])
|
|
styles = data.get("styles", [])
|
|
accents = data.get("accents", [])
|
|
content = data.get("content", [])
|
|
|
|
# setup inputs for the node
|
|
inputs = {
|
|
"required": {
|
|
"prompt": ("STRING", {"default": "", "multiline": True}),
|
|
"text_on_image": ("STRING", {"default": "", "multiline": True}),
|
|
"text_weight": ("FLOAT", {"default": 1.0, "min":0.5, "max":1.5, "step": 0.01}),
|
|
"color_count": ("INT", {"default": 1, "min": 0, "max": 3, "step": 1}),
|
|
"style_count": ("INT", {"default": 1, "min": 1, "max": 2, "step": 1}),
|
|
"accent_count": ("INT", {"default": 1, "min": 0, "max": 3, "step": 1}),
|
|
"content_count": ("INT", {"default": 1, "min": 0, "max": 3, "step": 1})
|
|
}
|
|
}
|
|
|
|
for i in range (1, 4):
|
|
inputs["required"][f"color_{i}"] = (colors, {"default": colors[0] if colors else None})
|
|
|
|
for i in range (1, 3):
|
|
inputs["required"][f"style_{i}"] = (styles, {"default": styles[0] if styles else None})
|
|
|
|
for i in range (1, 4):
|
|
inputs["required"][f"accent_{i}"] = (accents, {"default": accents[0] if accents else None})
|
|
|
|
for i in range (1, 4):
|
|
inputs["required"][f"content_{i}"] = (content, {"default": content[0] if content else None})
|
|
|
|
return inputs
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
FUNCTION = "doTheThing"
|
|
CATEGORY = "Harronode/PromptBuilder"
|
|
|
|
def doTheThing(self, *args, **kwargs):
|
|
output = kwargs['prompt']
|
|
return(output,) # comma outputs a tuple with a single record instead of a bunch of records all containing the prompt
|
|
|
|
class PromptEditor:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
|
|
inputs = {
|
|
"optional": {
|
|
"prompt": ("STRING", {"forceInput": True}) # forceInput makes it an input node
|
|
},
|
|
"required": {
|
|
"mode": (["Edit", "Bypass"],{}),
|
|
"promptEditor": ("STRING", {"default": "", "multiline": True})
|
|
},
|
|
"hidden": {
|
|
"unique_id": "UNIQUE_ID",
|
|
"extra_pnginfo": "EXTRA_PNGINFO"
|
|
},
|
|
}
|
|
return inputs
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
FUNCTION = "EditPrompt"
|
|
CATEGORY = "Harronode/PromptBuilder"
|
|
|
|
def EditPrompt(self, *args, **kwargs):
|
|
print("EditPrompt")
|
|
output = ''
|
|
prompt = ''
|
|
unique_id = kwargs["unique_id"]
|
|
extra_pnginfo = kwargs["extra_pnginfo"]
|
|
mode = kwargs["mode"]
|
|
promptEditor = kwargs["promptEditor"]
|
|
if "prompt" in kwargs:
|
|
prompt = kwargs["prompt"]
|
|
if unique_id and extra_pnginfo and "workflow" in extra_pnginfo:
|
|
workflow = extra_pnginfo["workflow"]
|
|
target_id = unique_id
|
|
node = None
|
|
# try to find the node in the workflow so we can get all the values of it
|
|
for node in workflow["nodes"]:
|
|
if str(node["id"]) == target_id:
|
|
break
|
|
# if the node is found, set the value of the textbox (3rd input, 0-indexed) to the prompt
|
|
if node:
|
|
print(node)
|
|
if mode == "Edit":
|
|
server.PromptServer.instance.send_sync("harronode-populate-promptEditor", {"node_id": unique_id, "value": prompt,})
|
|
output = promptEditor,
|
|
else:
|
|
# just set the output to the string we input
|
|
output = prompt,
|
|
return (output,)
|
|
|
|
def onprompt_populate_prompt(json_data):
|
|
try:
|
|
prompt = json_data['prompt']
|
|
updated_widget_values = {}
|
|
for k, v in prompt.items():
|
|
if 'class_type' in v and (v['class_type'] == 'Harronode'):
|
|
inputs = v['inputs']
|
|
if isinstance(inputs['prompt'], str):
|
|
inputs['prompt'] = prompt_builder.build_prompt(inputs)
|
|
# server.PromptServer.instance.send_sync("harronode-node-feedback", {"node_id": k, "widget_name": "prompt", "type": "STRING", "value": inputs['prompt']})
|
|
updated_widget_values[k] = inputs['prompt']
|
|
except Exception as e:
|
|
print(f"[WARN] ComfyUI-Harronode: Error on prompt\n{e}")
|
|
|
|
def harroonprompt(json_data):
|
|
try:
|
|
onprompt_populate_prompt(json_data)
|
|
except Exception as e:
|
|
print(f"[WARN] ComfyUI-Harronode: Error on prompt - autopopulation of prompt will not work.\n{e}")
|
|
|
|
return json_data
|
|
|
|
class prompt_builder:
|
|
def build_prompt(inputs):
|
|
# Initialize the prompt builder string
|
|
text = ""
|
|
text = text + "('"
|
|
text = text + inputs["text_on_image"]
|
|
text_weight = inputs["text_weight"]
|
|
text = text + f"':{text_weight:.2f}) text logo, "
|
|
color_count = inputs["color_count"]
|
|
# gather colors
|
|
if color_count > 0:
|
|
color1 = inputs["color_1"]
|
|
color2 = inputs["color_2"]
|
|
color3 = inputs["color_3"]
|
|
for i in range(1, color_count + 1):
|
|
variable_name = f"color{i}"
|
|
color_value = locals()[variable_name]
|
|
text = text + color_value + ", "
|
|
style_count = inputs["style_count"]
|
|
# gather styles
|
|
if style_count > 0:
|
|
style1 = inputs["style_1"]
|
|
style2 = inputs["style_2"]
|
|
for i in range(1, style_count + 1):
|
|
variable_name = f"style{i}"
|
|
style_value = locals()[variable_name]
|
|
text = text + style_value + ", "
|
|
accent_count = inputs["accent_count"]
|
|
# gather accents
|
|
if accent_count > 0:
|
|
accent1 = inputs["accent_1"]
|
|
accent2 = inputs["accent_2"]
|
|
accent3 = inputs["accent_3"]
|
|
for i in range(1, accent_count + 1):
|
|
variable_name = f"accent{i}"
|
|
accent_value = locals()[variable_name]
|
|
text = text + accent_value + ", "
|
|
content_count = inputs["content_count"]
|
|
# gather contents
|
|
if content_count > 0:
|
|
content1 = inputs["content_1"]
|
|
content2 = inputs["content_2"]
|
|
content3 = inputs["content_3"]
|
|
for i in range(1, content_count + 1):
|
|
variable_name = f"content{i}"
|
|
content_value = locals()[variable_name]
|
|
text = text + content_value + ", "
|
|
return text
|
|
|
|
server.PromptServer.instance.add_on_prompt_handler(harroonprompt)
|