diff --git a/__init__.py b/__init__.py index 0e9f227..48c7aed 100644 --- a/__init__.py +++ b/__init__.py @@ -3,7 +3,8 @@ from .nodes.prompt_generate import GeneratePrompt from .nodes.prompt_scenery import SceneryPrompt from .nodes.prompt_negative import NegativePrompt from .nodes.prompt_light import LightPrompt -from .nodes.prompt_style import DrawStylePrompt +from .nodes.prompt_draw_artist import DrawArtistPrompt +from .nodes.prompt_draw_style import DrawStylePrompt from .nodes.prompt_portrait import PortraitPrompt from .nodes.prompt_portrait import PortraitSkinPrompt from .nodes.prompt_portrait import PortraitFashionPrompt @@ -26,6 +27,7 @@ NODE_CLASS_MAPPINGS = { "SceneryPrompt" : SceneryPrompt, "NegativePrompt" : NegativePrompt, "LightPrompt" : LightPrompt, + "DrawArtistPrompt" : DrawArtistPrompt, "DrawStylePrompt" : DrawStylePrompt, "PortraitPrompt": PortraitPrompt, "PortraitSkinPrompt": PortraitSkinPrompt, @@ -52,6 +54,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "SceneryPrompt": "Generate Scenery Prompt", "NegativePrompt": "Generate Negative Prompt", "LightPrompt": "Generate Light Prompt", + "DrawArtistPrompt" : "Generate Draw Artist Prompt", "DrawStylePrompt" : "Generate Draw Style Prompt", "PortraitPrompt": "Portrait Prompt", "PortraitSkinPrompt": "Portrait Skin Prompt", diff --git a/assets/config.json b/assets/config.json index 432a5c9..cd90086 100644 --- a/assets/config.json +++ b/assets/config.json @@ -1,4 +1,13 @@ { + "languages": [ + "Chinese", + "English" + ], + "assets": { + "default": "zh", + "Chinese": "zh", + "English": "en" + }, "classifies": [ "action", "age", diff --git a/modules/build_prompt.py b/modules/build_prompt.py index b360600..1612dfa 100644 --- a/modules/build_prompt.py +++ b/modules/build_prompt.py @@ -111,7 +111,7 @@ class BuildPrompt: return prompt - def generate_prompt(self, seed, styles="", artists=""): + def generate_prompt(self, seed): length = len(self._dataset) if length == 0: @@ -937,7 +937,65 @@ class BuildPromptManager: return output_prompt + # 生成绘画艺术提示词 + def generate_draw_artist_prompt(self, + draw_artist_1=EMPTY_OPTION, + draw_artist_1_weight=1, + draw_artist_2=EMPTY_OPTION, + draw_artist_2_weight=0, + draw_artist_3=EMPTY_OPTION, + draw_artist_3_weight=0, + draw_artist_4=EMPTY_OPTION, + draw_artist_4_weight=0, + draw_artist_5=EMPTY_OPTION, + draw_artist_5_weight=0, + seed=0 + ): + prompt_words = [] + if draw_artist_1_weight > 0: + if draw_artist_1 == RANDOM_OPTION: + draw_artist_1 = self.draw_artist_prompt.choice_prompt(seed) + prompt_words.append(buildPromptWeight(draw_artist_1, draw_artist_1_weight)) + elif draw_artist_1 != EMPTY_OPTION: + prompt_words.append(buildPromptWeight(draw_artist_1, draw_artist_1_weight)) + + if draw_artist_2_weight > 0: + if draw_artist_2 == RANDOM_OPTION: + draw_artist_2 = self.draw_artist_prompt.choice_prompt(seed + 1) + prompt_words.append(buildPromptWeight(draw_artist_2, draw_artist_2_weight)) + elif draw_artist_2 != EMPTY_OPTION: + prompt_words.append(buildPromptWeight(draw_artist_2, draw_artist_2_weight)) + + if draw_artist_3_weight > 0: + if draw_artist_3 == RANDOM_OPTION: + draw_artist_3 = self.draw_artist_prompt.choice_prompt(seed + 2) + prompt_words.append(buildPromptWeight(draw_artist_3, draw_artist_3_weight)) + elif draw_artist_3 != EMPTY_OPTION: + prompt_words.append(buildPromptWeight(draw_artist_3, draw_artist_3_weight)) + + if draw_artist_4_weight > 0: + if draw_artist_4 == RANDOM_OPTION: + draw_artist_4 = self.draw_artist_prompt.choice_prompt(seed + 3) + prompt_words.append(buildPromptWeight(draw_artist_4, draw_artist_4_weight)) + elif draw_artist_4 != EMPTY_OPTION: + prompt_words.append(buildPromptWeight(draw_artist_4, draw_artist_4_weight)) + + if draw_artist_5_weight > 0: + if draw_artist_5 == RANDOM_OPTION: + draw_artist_5 = self.draw_artist_prompt.choice_prompt(seed + 4) + prompt_words.append(buildPromptWeight(draw_artist_5, draw_artist_5_weight)) + elif draw_artist_5 != EMPTY_OPTION: + prompt_words.append(buildPromptWeight(draw_artist_5, draw_artist_5_weight)) + + output_prompt = "" + if len(prompt_words) > 0: + output_prompt = ', '.join(prompt_words) + + return output_prompt + + + # 生成绘画风格提示词 def generate_draw_style_prompt(self, draw_style_1=EMPTY_OPTION, diff --git a/nodes/prompt_draw_artist.py b/nodes/prompt_draw_artist.py new file mode 100644 index 0000000..d675bdf --- /dev/null +++ b/nodes/prompt_draw_artist.py @@ -0,0 +1,158 @@ +import os +from ..modules.build_prompt import buildOptionList, buildPromptWeight, build_prompt_manager +from ..modules.build_prompt import EMPTY_OPTION, RANDOM_OPTION, DEFAULT_OPTION +from ..modules.config import config + + +# Draw Artist Prompt 绘画艺术提示词 +class DrawArtistPrompt: + + @classmethod + def INPUT_TYPES(s): + max_float_value = 2 + return { + "required": { + # 语言选择 + "language": (config.languages, { + "default": config.languages[0] + }), + # 绘画艺术 + "draw_artist_1": (buildOptionList(build_prompt_manager.draw_artist_prompt.get_dataset()), { + "default": EMPTY_OPTION, + }), + # 绘画艺术权重 + "draw_artist_1_weight": ("FLOAT", { + "default": 1, + "min": 0, + "max": max_float_value, + "round": 0.01, + "step": 0.05, + "display": "slider", + }), + # 绘画艺术 + "draw_artist_2": (buildOptionList(build_prompt_manager.draw_artist_prompt.get_dataset()), { + "default": EMPTY_OPTION, + }), + # 绘画艺术权重 + "draw_artist_2_weight": ("FLOAT", { + "default": 0, + "min": 0, + "max": max_float_value, + "round": 0.01, + "step": 0.05, + "display": "slider", + }), + # 绘画艺术 + "draw_artist_3": (buildOptionList(build_prompt_manager.draw_artist_prompt.get_dataset()), { + "default": EMPTY_OPTION, + }), + # 绘画艺术权重 + "draw_artist_3_weight": ("FLOAT", { + "default": 0, + "min": 0, + "max": max_float_value, + "round": 0.01, + "step": 0.05, + "display": "slider", + }), + # 绘画艺术 + "draw_artist_4": (buildOptionList(build_prompt_manager.draw_artist_prompt.get_dataset()), { + "default": EMPTY_OPTION, + }), + # 绘画艺术权重 + "draw_artist_4_weight": ("FLOAT", { + "default": 0, + "min": 0, + "max": max_float_value, + "round": 0.01, + "step": 0.05, + "display": "slider", + }), + # 绘画艺术 + "draw_artist_5": (buildOptionList(build_prompt_manager.draw_artist_prompt.get_dataset()), { + "default": EMPTY_OPTION, + }), + # 绘画艺术权重 + "draw_artist_5_weight": ("FLOAT", { + "default": 0, + "min": 0, + "max": max_float_value, + "round": 0.01, + "step": 0.05, + "display": "slider", + }), + # 随机种子值 + "seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF}), + # 启用 + "enable": ("BOOLEAN", {"default": True}), + # 预设提示词 + "preset_prompt": ("STRING", { + "multiline": True, + "default": "" + }) + }, + "optional": { + "input_prompt": ("STRING", {"forceInput": True}), + } + } + + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "prompt_generate" + CATEGORY = "PromptWrapper" + + + def prompt_generate(self, + language="", + draw_artist_1=EMPTY_OPTION, + draw_artist_1_weight=1, + draw_artist_2=EMPTY_OPTION, + draw_artist_2_weight=0, + draw_artist_3=EMPTY_OPTION, + draw_artist_3_weight=0, + draw_artist_4=EMPTY_OPTION, + draw_artist_4_weight=0, + draw_artist_5=EMPTY_OPTION, + draw_artist_5_weight=0, + seed=0, + enable=True, + preset_prompt="", + input_prompt="" + ): + + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) + + prompt_words = [] + + if input_prompt != "": + prompt_words.append(input_prompt) + + if preset_prompt != "": + prompt_words.append(preset_prompt) + + if enable == True: + draw_artist_prompt = build_prompt_manager.generate_draw_artist_prompt( + draw_artist_1=draw_artist_1, + draw_artist_1_weight=draw_artist_1_weight, + draw_artist_2=draw_artist_2, + draw_artist_2_weight=draw_artist_2_weight, + draw_artist_3=draw_artist_3, + draw_artist_3_weight=draw_artist_3_weight, + draw_artist_4=draw_artist_4, + draw_artist_4_weight=draw_artist_4_weight, + draw_artist_5=draw_artist_5, + draw_artist_5_weight=draw_artist_5_weight, + seed=seed + ) + + if draw_artist_prompt != "": + prompt_words.append(draw_artist_prompt) + + output_prompt = "" + if len(prompt_words) > 0: + output_prompt = ", ".join(prompt_words) + + return (output_prompt, ) + \ No newline at end of file diff --git a/nodes/prompt_style.py b/nodes/prompt_draw_style.py similarity index 95% rename from nodes/prompt_style.py rename to nodes/prompt_draw_style.py index c82e142..d0ff8e2 100644 --- a/nodes/prompt_style.py +++ b/nodes/prompt_draw_style.py @@ -13,8 +13,8 @@ class DrawStylePrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0] }), # 绘画风格 "draw_style_1": (buildOptionList(build_prompt_manager.draw_style_prompt.get_dataset()), { @@ -121,8 +121,8 @@ class DrawStylePrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] diff --git a/nodes/prompt_generate.py b/nodes/prompt_generate.py index 1edab67..56ff1ff 100644 --- a/nodes/prompt_generate.py +++ b/nodes/prompt_generate.py @@ -13,8 +13,8 @@ class GeneratePrompt: def INPUT_TYPES(s): return { "required": { - "language": (["Chinese", "English"], { - "default": "Chinese" + "language": (config.languages, { + "default": config.languages[0] }), "classify": (buildOptionList(config.classifies, True, False), { "default": DEFAULT_OPTION @@ -49,7 +49,7 @@ class GeneratePrompt: if classify != EMPTY_OPTION: # 获取Script的目录路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory - language_dir = "zh" if language == "Chinese" else "en" + language_dir = config.assets[language] if language in config.assets else config.assets["default"] classify_datas = buildClassifyDatas(classify) file_name = f"{classify_datas}.jsonl" diff --git a/nodes/prompt_light.py b/nodes/prompt_light.py index b52c531..1203415 100644 --- a/nodes/prompt_light.py +++ b/nodes/prompt_light.py @@ -13,8 +13,8 @@ class LightPrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0], }), # 光的类型 "light_type": (buildOptionList(build_prompt_manager.light_type_prompt.get_dataset()), { @@ -91,8 +91,8 @@ class LightPrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] diff --git a/nodes/prompt_negative.py b/nodes/prompt_negative.py index 251fff8..7e63d56 100644 --- a/nodes/prompt_negative.py +++ b/nodes/prompt_negative.py @@ -1,5 +1,6 @@ import os from ..modules.build_prompt import BuildPrompt +from ..modules.config import config @@ -10,7 +11,9 @@ class NegativePrompt: def INPUT_TYPES(s): return { "required": { - "language": (["Chinese", "English"],), + "language": (config.languages, { + "default": config.languages[0] + }), "seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF}), "preset_prompt": ("STRING", { "multiline": True, @@ -28,7 +31,7 @@ class NegativePrompt: # 获取Script的目录路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory - language_dir = "zh" if language == "Chinese" else "en" + language_dir = config.assets[language] if language in config.assets else config.assets["default"] data_file = os.path.join(script_dir, "..", "assets", language_dir, "negative_datas.jsonl") build = BuildPrompt(data_file) diff --git a/nodes/prompt_portrait.py b/nodes/prompt_portrait.py index fc4657f..2003997 100644 --- a/nodes/prompt_portrait.py +++ b/nodes/prompt_portrait.py @@ -13,8 +13,8 @@ class PortraitPrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0] }), # 镜头角度 "lens_angle": (buildOptionList(build_prompt_manager.lens_angle_prompt.get_dataset()), { @@ -299,8 +299,8 @@ class PortraitPrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] @@ -373,8 +373,8 @@ class PortraitSkinPrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0] }), # 皮肤 "skin": (buildOptionList(build_prompt_manager.skin_prompt.get_dataset()), { @@ -579,8 +579,9 @@ class PortraitSkinPrompt: preset_prompt="", input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] @@ -634,8 +635,8 @@ class PortraitFashionPrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0] }), # 衣服 "clothes": (buildOptionList(build_prompt_manager.clothes_prompt.get_dataset()), { @@ -967,8 +968,8 @@ class PortraitFashionPrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] @@ -1044,8 +1045,8 @@ class PortraitPosePrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese", + "language": (config.languages, { + "default": config.languages[0] }), # 姿态 "pose": (buildOptionList(build_prompt_manager.pose_prompt.get_dataset()), { @@ -1212,8 +1213,8 @@ class PortraitPosePrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] @@ -1267,8 +1268,8 @@ class PortraitCosmeticPrompt: return { "required": { # 语言选择 - "language": (["Chinese", "English"],{ - "default": "Chinese" + "language": (config.languages, { + "default": config.languages[0] }), # 化妆风格 "makeup_style": (buildOptionList(build_prompt_manager.makeup_style_prompt.get_dataset()), { @@ -1388,8 +1389,8 @@ class PortraitCosmeticPrompt: input_prompt="" ): - language = "zh" if language == "Chinese" else "en" - build_prompt_manager.reload_build_prompt_datas(language) + language_dir = config.assets[language] if language in config.assets else config.assets["default"] + build_prompt_manager.reload_build_prompt_datas(language_dir) prompt_words = [] diff --git a/nodes/prompt_randoms.py b/nodes/prompt_randoms.py index 3e1e557..974b595 100644 --- a/nodes/prompt_randoms.py +++ b/nodes/prompt_randoms.py @@ -14,8 +14,8 @@ class RandomsPrompt: return { "required": { # 选择语言 - "language": (["Chinese", "English"], { - "default": "Chinese" + "language": (config.languages, { + "default": config.languages[0] }), "classify1": (buildOptionList(config.classifies, True, False), { "default": DEFAULT_OPTION @@ -66,7 +66,7 @@ class RandomsPrompt: if enable == True: # 获取Script的目录路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory - language_dir = "zh" if language == "Chinese" else "en" + language_dir = config.assets[language] if language in config.assets else config.assets["default"] classifys = [classify1, classify2, classify3, classify4, classify5, classify6, classify7, classify8] for classify in classifys: @@ -101,8 +101,8 @@ class RandomsWeightPrompt: return { "required": { # 选择语言 - "language": (["Chinese", "English"], { - "default": "Chinese" + "language": (config.languages, { + "default": config.languages[0] }), "classify1": (buildOptionList(config.classifies, True, False), { "default": DEFAULT_OPTION @@ -219,7 +219,7 @@ class RandomsWeightPrompt: if enable == True: # 获取Script的目录路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory - language_dir = "zh" if language == "Chinese" else "en" + language_dir = config.assets[language] if language in config.assets else config.assets["default"] classify_weights = [(classify1, classify1_weight), (classify2, classify2_weight), (classify3, classify3_weight), (classify4, classify4_weight), (classify5, classify5_weight), (classify6, classify6_weight), (classify7, classify7_weight), (classify8, classify8_weight)] diff --git a/nodes/prompt_scenery.py b/nodes/prompt_scenery.py index e1115f0..d5e54e3 100644 --- a/nodes/prompt_scenery.py +++ b/nodes/prompt_scenery.py @@ -4,25 +4,6 @@ from ..modules.build_prompt import EMPTY_OPTION, RANDOM_OPTION, DEFAULT_OPTION from ..modules.config import config -styles = [ - EMPTY_OPTION, RANDOM_OPTION -] - -artists = [ - EMPTY_OPTION, RANDOM_OPTION, "popular", "greg mode", "3D", "abstract", "angular", - "anime", "architecture", "art nouveau", "art deco", "baroque", "bauhaus", "cartoon", - "character", "children's illustration", "cityscape", "cinema", "clean", "cloudscape", - "collage", "colorful", "comics", "cubism", "dark", "detailed", "digital", "expressionism", - "fantasy", "fashion", "fauvism", "figurativism", "gore", "graffiti", "graphic design", - "high contrast", "horror", "impressionism", "installation", "landscape", "light", - "line drawing", "low contrast", "luminism", "magical realism", "manga", "melanin", - "messy", "monochromatic", "nature", "nudity", "photography", "pop art", "portrait", - "primitivism", "psychedelic", "realism", "renaissance", "romanticism", - "scene", "sci-fi", "sculpture", "seascape", "space", "stained glass", "still life", - "storybook realism", "street art", "streetscape", "surrealism", "symbolism", "textile", - "ukiyo-e", "vibrant", "watercolor", "whimsical" -] - # Scenery Prompt @@ -33,11 +14,9 @@ class SceneryPrompt: return { "required": { # 选择语言 - "language": (["Chinese", "English"], { - "default": "Chinese" + "language": (config.languages, { + "default": config.languages[0] }), - "style": (styles, { "default": DEFAULT_OPTION }), - "artist": (artists, { "default": DEFAULT_OPTION }), "seed": ("INT", { "default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF }), # 预设前缀提示词 "preset_prefix": ("STRING", { @@ -60,19 +39,16 @@ class SceneryPrompt: FUNCTION = "generate_prompt" CATEGORY = "PromptWrapper" - def generate_prompt(self, language, style, artist, seed, + def generate_prompt(self, language, seed, preset_prefix="", preset_suffix="", input_prompt=""): - - styles = (style,) - artists = (artist,) # 获取Script的目录路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # Script directory - language_dir = "zh" if language == "Chinese" else "en" + language_dir = config.assets[language] if language in config.assets else config.assets["default"] data_file = os.path.join(script_dir, "..", "assets", language_dir, "scenery_datas.jsonl") build = BuildPrompt(data_file) - scenery_prompt = build.generate_prompt(seed, styles, artists) + scenery_prompt = build.generate_prompt(seed) prompt_words = [] diff --git a/pyproject.toml b/pyproject.toml index 858cd81..077cfa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ComfyUI-PromptWrapper" description = "ComfyUI nodes for PromptWrapper, Mainly for prompt word translation, Chinese translation into English or English translation into Chinese." -version = "1.2.0" +version = "1.3.0" license = {file = "LICENSE"} [project.urls]