From cad7c67fa619a89ede2295384448e34844679ec4 Mon Sep 17 00:00:00 2001 From: Mr_pepe_69 <79142532+mr-pepe69@users.noreply.github.com> Date: Sat, 9 May 2026 01:53:04 -0300 Subject: [PATCH] Added new nodes that were in WAS as new nodes. Some old nodes from was are not supported anymore so i upload the as my own, made then with a help of claude. --- __init__.py | 4 +- nodes.py | 166 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 12 +--- 3 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 nodes.py diff --git a/__init__.py b/__init__.py index 03bf803..39a8c6b 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +1,3 @@ -from .string_select import * +from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] diff --git a/nodes.py b/nodes.py new file mode 100644 index 0000000..d5a7b0b --- /dev/null +++ b/nodes.py @@ -0,0 +1,166 @@ +# nodes.py +# Combined: SimpleNumberCounter, SimpleConstantNumber, SimpleLogicBoolean, StringFromList, LoadTextFile + +import math + +# ── Counter state ──────────────────────────────────────────────────────────── +_counter_state = {"value": 0} + + +def wrapIndex(index, length): + if length == 0: + print("ezXY: Divide by zero error, returning 0.") + return 0, 0 + index_mod = int(math.fmod(index, length)) + wraps = index // length + return index_mod, wraps + + +class SimpleNumberCounter: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "mode": (["increment", "decrement", "increment_to_stop", "decrement_to_stop"],), + "stop": ("FLOAT", {"default": 100.0, "min": 0.0, "max": 99999.0, "step": 1.0}), + "start": ("INT", {"default": 0, "min": 0, "max": 99999}), + "step": ("INT", {"default": 1, "min": 0, "max": 99999}), + }, + "optional": { + "reset_bool": ("NUMBER",), + } + } + + FUNCTION = "count" + CATEGORY = "Simple Utils" + RETURN_TYPES = ("NUMBER", "FLOAT", "INT") + RETURN_NAMES = ("number", "float", "int") + + @classmethod + def IS_CHANGED(cls, **kwargs): + return float("nan") + + def count(self, mode, stop, start, step, reset_bool=None): + global _counter_state + if reset_bool is not None and float(reset_bool) > 0: + _counter_state["value"] = start + v = _counter_state["value"] + if mode in ("increment", "increment_to_stop"): + next_v = v + step + if next_v >= stop: + next_v = start + _counter_state["value"] = next_v + else: + next_v = v - step + if next_v < 0: + next_v = int(stop) + _counter_state["value"] = next_v + return (float(v), float(v), int(v)) + + +class SimpleConstantNumber: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "value": ("FLOAT", {"default": 1.0, "min": -99999.0, "max": 99999.0, "step": 1.0}), + } + } + + FUNCTION = "output" + CATEGORY = "Simple Utils" + RETURN_TYPES = ("NUMBER", "FLOAT", "INT") + RETURN_NAMES = ("NUMBER", "FLOAT", "INT") + + def output(self, value): + return (float(value), float(value), int(value)) + + +class SimpleLogicBoolean: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "boolean": ("BOOLEAN", {"default": True}), + } + } + + FUNCTION = "output" + CATEGORY = "Simple Utils" + RETURN_TYPES = ("BOOLEAN", "NUMBER", "INT", "FLOAT") + RETURN_NAMES = ("BOOLEAN", "NUMBER", "INT", "FLOAT") + + def output(self, boolean): + v = 1 if boolean else 0 + return (boolean, float(v), int(v), float(v)) + + +class StringFromList: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "list_input": ("STRING", {"forceInput": True},), + "index": ("INT", {"default": 0, "min": -999, "max": 999, "step": 1}), + }, + } + + RETURN_TYPES = ("STRING", "INT", "INT",) + RETURN_NAMES = ("list item", "size", "wraps",) + INPUT_IS_LIST = True + OUTPUT_IS_LIST = (True, False, True) + FUNCTION = "pick" + CATEGORY = "ezXY/utility" + + def pick(self, list_input, index): + length = len(list_input) + wraps_list, item_list = [], [] + for i in index: + index_mod, wraps = wrapIndex(i, length) + wraps_list.append(wraps) + item_list.append(list_input[index_mod]) + return (item_list, length, wraps_list,) + + +class LoadTextFile: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "file_path": ("STRING", {"default": "/input/yourfile.txt", "multiline": False}), + } + } + + FUNCTION = "load" + CATEGORY = "Simple Utils" + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("STRING",) + + @classmethod + def IS_CHANGED(cls, **kwargs): + return float("nan") + + def load(self, file_path): + try: + with open(file_path, "r", encoding="utf-8") as f: + return (f.read(),) + except Exception as e: + print(f"[LoadTextFile] Error reading '{file_path}': {e}") + return ("",) + + +NODE_CLASS_MAPPINGS = { + "Number Counter": SimpleNumberCounter, + "Constant Number": SimpleConstantNumber, + "Logic Boolean": SimpleLogicBoolean, + "StringFromList": StringFromList, + "LoadTextFile": LoadTextFile, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "Number Counter": "Number Counter (Simple)", + "Constant Number": "Constant Number (Simple)", + "Logic Boolean": "Logic Boolean (Simple)", + "StringFromList": "String From List", + "LoadTextFile": "Load Text File (Simple)", +} diff --git a/pyproject.toml b/pyproject.toml index 88b362e..ae0454c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,8 @@ [project] -name = "ComfyUI-SelectStringFromListWithIndex" -description = "This node is a node made by GMapeSplat/ComfyUI_ezXY that i copied while his node doesn't work" +name = "simple-counter-nodes" +description = "Simple counter, constant number, logic boolean, and string from list nodes — no WAS dependency" version = "1.0.0" -license = {file = "LICENSE"} - -[project.urls] -Repository = "https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex" -# Used by Comfy Registry https://comfyregistry.org [tool.comfy] -PublisherId = "wirytiox" -DisplayName = "ComfyUI-SelectStringFromListWithIndex" +DisplayName = "Simple Counter Nodes" Icon = ""