Extract profile filter nodes

This commit is contained in:
2026-06-26 22:53:34 +02:00
parent 49fe509aa7
commit efe13beb79
5 changed files with 342 additions and 224 deletions
+10 -221
View File
@@ -404,6 +404,10 @@ try:
NODE_CLASS_MAPPINGS as CAMERA_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as CAMERA_NODE_DISPLAY_NAME_MAPPINGS,
)
from .node_profile_filter import (
NODE_CLASS_MAPPINGS as PROFILE_FILTER_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as PROFILE_FILTER_NODE_DISPLAY_NAME_MAPPINGS,
)
from .node_route_config import (
NODE_CLASS_MAPPINGS as ROUTE_CONFIG_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as ROUTE_CONFIG_NODE_DISPLAY_NAME_MAPPINGS,
@@ -417,9 +421,6 @@ try:
build_character_manual_config_json,
build_character_profile_json,
build_characteristics_config_json,
build_ethnicity_list_json,
build_filter_config_json,
build_generation_profile_json,
build_hair_config_json,
build_hardcore_action_filter_json,
build_hardcore_position_pool_json,
@@ -449,7 +450,6 @@ try:
character_softcore_outfit_values,
character_woman_body_choices,
ethnicity_choices,
generation_profile_choices,
hardcore_position_family_choices,
hardcore_position_focus_choices,
hardcore_position_key_choices,
@@ -474,6 +474,10 @@ except ImportError:
NODE_CLASS_MAPPINGS as CAMERA_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as CAMERA_NODE_DISPLAY_NAME_MAPPINGS,
)
from node_profile_filter import (
NODE_CLASS_MAPPINGS as PROFILE_FILTER_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as PROFILE_FILTER_NODE_DISPLAY_NAME_MAPPINGS,
)
from node_route_config import (
NODE_CLASS_MAPPINGS as ROUTE_CONFIG_NODE_CLASS_MAPPINGS,
NODE_DISPLAY_NAME_MAPPINGS as ROUTE_CONFIG_NODE_DISPLAY_NAME_MAPPINGS,
@@ -487,9 +491,6 @@ except ImportError:
build_character_manual_config_json,
build_character_profile_json,
build_characteristics_config_json,
build_ethnicity_list_json,
build_filter_config_json,
build_generation_profile_json,
build_hair_config_json,
build_hardcore_action_filter_json,
build_hardcore_position_pool_json,
@@ -519,7 +520,6 @@ except ImportError:
character_softcore_outfit_values,
character_woman_body_choices,
ethnicity_choices,
generation_profile_choices,
hardcore_position_family_choices,
hardcore_position_focus_choices,
hardcore_position_key_choices,
@@ -724,213 +724,6 @@ class SxCPPromptBuilder:
)
class SxCPGenerationProfile:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"profile": (generation_profile_choices(), {"default": "balanced"}),
"clothing_override": (["profile_default", "random", "full", "minimal"], {"default": "profile_default"}),
"poses_override": (["profile_default", "random", "standard", "evocative"], {"default": "profile_default"}),
"expression_enabled": ("BOOLEAN", {"default": True}),
"expression_intensity_mode": (["profile_default", "random", "fixed"], {"default": "profile_default"}),
"expression_intensity": ("FLOAT", {"default": -1.0, "min": -1.0, "max": 1.0, "step": 0.01}),
"backside_bias": ("FLOAT", {"default": -1.0, "min": -1.0, "max": 1.0, "step": 0.01}),
"minimal_clothing_ratio": ("FLOAT", {"default": -1.0, "min": -1.0, "max": 1.0, "step": 0.01}),
"standard_pose_ratio": ("FLOAT", {"default": -1.0, "min": -1.0, "max": 1.0, "step": 0.01}),
"trigger_policy": (["profile_default", "prepend_trigger", "do_not_prepend"], {"default": "profile_default"}),
}
}
RETURN_TYPES = (SXCP_GENERATION_PROFILE, "STRING")
RETURN_NAMES = ("generation_profile", "summary")
FUNCTION = "build"
CATEGORY = "prompt_builder"
def build(
self,
profile,
clothing_override,
poses_override,
expression_enabled,
expression_intensity_mode,
expression_intensity,
backside_bias,
minimal_clothing_ratio,
standard_pose_ratio,
trigger_policy,
):
config = build_generation_profile_json(
profile=profile,
clothing_override=clothing_override,
poses_override=poses_override,
expression_enabled=expression_enabled,
expression_intensity_mode=expression_intensity_mode,
expression_intensity=expression_intensity,
backside_bias=backside_bias,
minimal_clothing_ratio=minimal_clothing_ratio,
standard_pose_ratio=standard_pose_ratio,
trigger_policy=trigger_policy,
)
parsed = json.loads(config)
if not parsed.get("expression_enabled", True):
expression_summary = "expression disabled"
elif float(parsed.get("expression_intensity", 0.5)) < 0:
expression_summary = "expression random"
else:
expression_summary = f"expression {parsed['expression_intensity']}"
summary = f"{parsed['profile']}: {parsed['clothing']}, {parsed['poses']}, {expression_summary}"
return config, summary
class SxCPAdvancedFilters:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"include_european": ("BOOLEAN", {"default": True}),
"include_mediterranean_mena": ("BOOLEAN", {"default": True}),
"include_latina": ("BOOLEAN", {"default": True}),
"include_east_asian": ("BOOLEAN", {"default": True}),
"include_southeast_asian": ("BOOLEAN", {"default": True}),
"include_south_asian": ("BOOLEAN", {"default": True}),
"include_black_african": ("BOOLEAN", {"default": True}),
"include_indigenous": ("BOOLEAN", {"default": True}),
"include_mixed": ("BOOLEAN", {"default": True}),
"include_plus_size": ("BOOLEAN", {"default": True}),
"figure": (["random", "curvy", "balanced", "bombshell"], {"default": "random"}),
}
}
RETURN_TYPES = (SXCP_FILTER_CONFIG,)
RETURN_NAMES = ("filter_config",)
FUNCTION = "build"
CATEGORY = "prompt_builder"
def build(
self,
include_european,
include_mediterranean_mena,
include_latina,
include_east_asian,
include_southeast_asian,
include_south_asian,
include_black_african,
include_indigenous,
include_mixed,
include_plus_size,
figure,
):
return (
build_filter_config_json(
figure=figure,
include_european=include_european,
include_mediterranean_mena=include_mediterranean_mena,
include_latina=include_latina,
include_east_asian=include_east_asian,
include_southeast_asian=include_southeast_asian,
include_south_asian=include_south_asian,
include_black_african=include_black_african,
include_indigenous=include_indigenous,
include_mixed=include_mixed,
include_plus_size=include_plus_size,
),
)
class SxCPEthnicityList:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"include_european": ("BOOLEAN", {"default": False}),
"include_mediterranean_mena": ("BOOLEAN", {"default": False}),
"include_latina": ("BOOLEAN", {"default": False}),
"include_east_asian": ("BOOLEAN", {"default": False}),
"include_southeast_asian": ("BOOLEAN", {"default": False}),
"include_south_asian": ("BOOLEAN", {"default": False}),
"include_black_african": ("BOOLEAN", {"default": False}),
"include_indigenous": ("BOOLEAN", {"default": False}),
"include_mixed": ("BOOLEAN", {"default": False}),
"include_asian": ("BOOLEAN", {"default": False}),
"include_white_asian": ("BOOLEAN", {"default": False}),
"include_western_european": ("BOOLEAN", {"default": False}),
"include_french_european": ("BOOLEAN", {"default": False}),
"include_germanic_european": ("BOOLEAN", {"default": False}),
"include_nordic_european": ("BOOLEAN", {"default": False}),
"include_celtic_european": ("BOOLEAN", {"default": False}),
"include_slavic_european": ("BOOLEAN", {"default": False}),
"include_baltic_european": ("BOOLEAN", {"default": False}),
"include_alpine_european": ("BOOLEAN", {"default": False}),
"include_balkan_european": ("BOOLEAN", {"default": False}),
"include_greek_mediterranean": ("BOOLEAN", {"default": False}),
"include_italian_mediterranean": ("BOOLEAN", {"default": False}),
"include_iberian_mediterranean": ("BOOLEAN", {"default": False}),
"strict_excludes": ("BOOLEAN", {"default": True}),
}
}
RETURN_TYPES = (SXCP_ETHNICITY_LIST, SXCP_FILTER_CONFIG, "STRING")
RETURN_NAMES = ("ethnicity_list", "filter_config", "summary")
FUNCTION = "build"
CATEGORY = "prompt_builder"
def build(
self,
include_european,
include_mediterranean_mena,
include_latina,
include_east_asian,
include_southeast_asian,
include_south_asian,
include_black_african,
include_indigenous,
include_mixed,
include_asian,
include_white_asian,
include_western_european,
include_french_european,
include_germanic_european,
include_nordic_european,
include_celtic_european,
include_slavic_european,
include_baltic_european,
include_alpine_european,
include_balkan_european,
include_greek_mediterranean,
include_italian_mediterranean,
include_iberian_mediterranean,
strict_excludes,
):
result = build_ethnicity_list_json(
include_european=include_european,
include_mediterranean_mena=include_mediterranean_mena,
include_latina=include_latina,
include_east_asian=include_east_asian,
include_southeast_asian=include_southeast_asian,
include_south_asian=include_south_asian,
include_black_african=include_black_african,
include_indigenous=include_indigenous,
include_mixed=include_mixed,
include_asian=include_asian,
include_white_asian=include_white_asian,
include_western_european=include_western_european,
include_french_european=include_french_european,
include_germanic_european=include_germanic_european,
include_nordic_european=include_nordic_european,
include_celtic_european=include_celtic_european,
include_slavic_european=include_slavic_european,
include_baltic_european=include_baltic_european,
include_alpine_european=include_alpine_european,
include_balkan_european=include_balkan_european,
include_greek_mediterranean=include_greek_mediterranean,
include_italian_mediterranean=include_italian_mediterranean,
include_iberian_mediterranean=include_iberian_mediterranean,
strict_excludes=strict_excludes,
)
return result["ethnicity"], result["filter_config"], result["summary"]
class _SxCPHairAxisNode:
AXIS = "color"
PREFIX = "include"
@@ -2199,9 +1992,8 @@ NODE_CLASS_MAPPINGS = {
NODE_CLASS_MAPPINGS.update(SEED_RESOLUTION_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(CAMERA_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(ROUTE_CONFIG_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update(PROFILE_FILTER_NODE_CLASS_MAPPINGS)
NODE_CLASS_MAPPINGS.update({
"SxCPGenerationProfile": SxCPGenerationProfile,
"SxCPEthnicityList": SxCPEthnicityList,
"SxCPHairLength": SxCPHairLength,
"SxCPHairColor": SxCPHairColor,
"SxCPHairStyle": SxCPHairStyle,
@@ -2214,7 +2006,6 @@ NODE_CLASS_MAPPINGS.update({
"SxCPHardcorePositionPool": SxCPHardcorePositionPool,
"SxCPHardcoreActionFilter": SxCPHardcoreActionFilter,
"SxCPCharacterManualDetails": SxCPCharacterManualDetails,
"SxCPAdvancedFilters": SxCPAdvancedFilters,
"SxCPPromptBuilderFromConfigs": SxCPPromptBuilderFromConfigs,
"SxCPWomanSlot": SxCPWomanSlot,
"SxCPManSlot": SxCPManSlot,
@@ -2236,9 +2027,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
NODE_DISPLAY_NAME_MAPPINGS.update(SEED_RESOLUTION_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(CAMERA_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(ROUTE_CONFIG_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update(PROFILE_FILTER_NODE_DISPLAY_NAME_MAPPINGS)
NODE_DISPLAY_NAME_MAPPINGS.update({
"SxCPGenerationProfile": "SxCP Generation Profile",
"SxCPEthnicityList": "SxCP Ethnicity List",
"SxCPHairLength": "SxCP Hair Length",
"SxCPHairColor": "SxCP Hair Color",
"SxCPHairStyle": "SxCP Hair Style/Cut",
@@ -2251,7 +2041,6 @@ NODE_DISPLAY_NAME_MAPPINGS.update({
"SxCPHardcorePositionPool": "SxCP Hardcore Position Pool",
"SxCPHardcoreActionFilter": "SxCP Hardcore Action Filter",
"SxCPCharacterManualDetails": "SxCP Character Manual Details",
"SxCPAdvancedFilters": "SxCP Advanced Filters",
"SxCPPromptBuilderFromConfigs": "SxCP Prompt Builder From Configs",
"SxCPWomanSlot": "SxCP Woman Slot",
"SxCPManSlot": "SxCP Man Slot",