diff --git a/ComfyUI_Resolution-and-Ratio/__init__.py b/ComfyUI_Resolution-and-Ratio/__init__.py deleted file mode 100644 index 4df9d33..0000000 --- a/ComfyUI_Resolution-and-Ratio/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .resolution_and_ratio import ResolutionAndRatio - -NODE_CLASS_MAPPINGS = { - "ResolutionAndRatio": ResolutionAndRatio -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "ResolutionAndRatio": "Resolution and Ratio" -} - -WEB_DIRECTORY = "./web" -__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY'] diff --git a/ComfyUI_Resolution-and-Ratio/resolution_and_ratio.py b/ComfyUI_Resolution-and-Ratio/resolution_and_ratio.py deleted file mode 100644 index f9d700b..0000000 --- a/ComfyUI_Resolution-and-Ratio/resolution_and_ratio.py +++ /dev/null @@ -1,61 +0,0 @@ -import math - -class ResolutionAndRatio: - @classmethod - def INPUT_TYPES(cls): - default_presets = ( - "128x128\n256x256\n512x512\n512x768\n768x768\n1024x1024\n896x1216\n1216x896\n" - "1088x1920\n1920x1088\n1152x1536\n1536x1152\n1536x2048\n2048x1536\n2048x2048" - ) - - return { - "required": { - "width": ("INT", {"default": 1152, "min": 64, "max": 4096, "step": 32}), - "height": ("INT", {"default": 1536, "min": 64, "max": 4096, "step": 32}), - "W_ratio": ("INT", {"default": 3, "min": 1, "max": 100}), - "H_ratio": ("INT", {"default": 4, "min": 1, "max": 100}), - "scale_percent": ("INT", {"default": 100, "min": 10, "max": 200, "step": 5, "display": "slider"}), - "reset": ("BOOLEAN", {"default": False, "label_on": "RESET", "label_off": "RESET"}), - "swap": ("BOOLEAN", {"default": False, "label_on": "SWAP", "label_off": "SWAP"}), - "preset": (["Custom"],), - "custom_presets": ("STRING", {"multiline": True, "default": default_presets}), - }, - } - - RETURN_TYPES = ("INT", "INT") - RETURN_NAMES = ("width", "height") - FUNCTION = "get_resolution" - CATEGORY = "CustomUtils" - - def get_resolution(self, width, height, W_ratio, H_ratio, scale_percent, reset, swap, preset, custom_presets): - # Handle reset (mainly handled by JS, but included for completeness) - if reset: - width = 256 - height = 256 - - # Handle swap - if swap: - width, height = height, width - W_ratio, H_ratio = H_ratio, W_ratio - - # Round to nearest multiple of 32 - width = round(width / 32) * 32 - height = round(height / 32) * 32 - - # Ensure minimum values - width = max(64, width) - height = max(64, height) - - # Ensure maximum values - width = min(4096, width) - height = min(4096, height) - - return (width, height) - - @classmethod - def VALIDATE_INPUTS(cls, width, height, **kwargs): - if width < 64 or height < 64: - return "Width and height must be at least 64" - if width > 4096 or height > 4096: - return "Width and height must not exceed 4096" - return True diff --git a/ComfyUI_Resolution-and-Ratio/web/resolution_and_ratio.js b/ComfyUI_Resolution-and-Ratio/web/resolution_and_ratio.js deleted file mode 100644 index 805dc0c..0000000 --- a/ComfyUI_Resolution-and-Ratio/web/resolution_and_ratio.js +++ /dev/null @@ -1,167 +0,0 @@ -import { app } from "../../scripts/app.js"; - -app.registerExtension({ - name: "Comfy.ResolutionAndRatio", - async beforeRegisterNodeDef(nodeType, nodeData, app) { - if (nodeData.name === "ResolutionAndRatio") { - - const onNodeCreated = nodeType.prototype.onNodeCreated; - nodeType.prototype.onNodeCreated = function () { - onNodeCreated?.apply(this, arguments); - - const getWidget = (name) => this.widgets.find(w => w.name === name); - - const wWidget = getWidget("width"); - const hWidget = getWidget("height"); - const rwWidget = getWidget("W_ratio"); - const rhWidget = getWidget("H_ratio"); - const scalePercentWidget = getWidget("scale_percent"); - const resetWidget = getWidget("reset"); - const swapWidget = getWidget("swap"); - const presetWidget = getWidget("preset"); - const customWidget = getWidget("custom_presets"); - - // Store base resolution for scale calculations - let baseWidth = wWidget.value; - let baseHeight = hWidget.value; - - // Helper function to round to nearest multiple of 32 - const roundTo32 = (val) => Math.round(val / 32) * 32; - - // Helper function to clamp value between min and max - const clamp = (val, min, max) => Math.max(min, Math.min(max, val)); - - // Update base resolution when width/height changes manually - const originalWCallback = wWidget.callback; - wWidget.callback = function() { - baseWidth = wWidget.value; - // Update scale to match current resolution - const currentScale = Math.round((wWidget.value / baseWidth) * 100); - if (currentScale >= 10 && currentScale <= 200) { - scalePercentWidget.value = currentScale; - } - if (originalWCallback) originalWCallback.apply(this, arguments); - }; - - const originalHCallback = hWidget.callback; - hWidget.callback = function() { - baseHeight = hWidget.value; - // Update scale to match current resolution - const currentScale = Math.round((hWidget.value / baseHeight) * 100); - if (currentScale >= 10 && currentScale <= 200) { - scalePercentWidget.value = currentScale; - } - if (originalHCallback) originalHCallback.apply(this, arguments); - }; - - // Scale slider updates resolution in real-time - scalePercentWidget.callback = () => { - const newWidth = roundTo32(baseWidth * scalePercentWidget.value / 100); - const newHeight = roundTo32(baseHeight * scalePercentWidget.value / 100); - - wWidget.value = clamp(newWidth, 64, 4096); - hWidget.value = clamp(newHeight, 64, 4096); - }; - - // Ratio synchronization with 4096 limit - rwWidget.callback = () => { - const newWidth = roundTo32((hWidget.value / rhWidget.value) * rwWidget.value); - const clampedWidth = clamp(newWidth, 64, 4096); - - // If hitting limit, prevent ratio from increasing further - if (newWidth > 4096) { - // Calculate max ratio that keeps width at 4096 - const maxRatio = Math.floor((4096 * rhWidget.value) / hWidget.value); - rwWidget.value = maxRatio; - wWidget.value = 4096; - } else { - wWidget.value = clampedWidth; - } - - // Update base and scale - baseWidth = wWidget.value; - scalePercentWidget.value = 100; - }; - - rhWidget.callback = () => { - const newHeight = roundTo32((wWidget.value / rwWidget.value) * rhWidget.value); - const clampedHeight = clamp(newHeight, 64, 4096); - - // If hitting limit, prevent ratio from increasing further - if (newHeight > 4096) { - // Calculate max ratio that keeps height at 4096 - const maxRatio = Math.floor((4096 * rwWidget.value) / wWidget.value); - rhWidget.value = maxRatio; - hWidget.value = 4096; - } else { - hWidget.value = clampedHeight; - } - - // Update base and scale - baseHeight = hWidget.value; - scalePercentWidget.value = 100; - }; - - // RESET logic - resetWidget.callback = () => { - wWidget.value = 256; - hWidget.value = 256; - rwWidget.value = 1; - rhWidget.value = 1; - scalePercentWidget.value = 100; - baseWidth = 256; - baseHeight = 256; - - // Reset button after a short delay - setTimeout(() => { resetWidget.value = false; }, 200); - }; - - // SWAP logic - swapWidget.callback = () => { - const tempV = wWidget.value; - wWidget.value = hWidget.value; - hWidget.value = tempV; - - const tempR = rwWidget.value; - rwWidget.value = rhWidget.value; - rhWidget.value = tempR; - - const tempBase = baseWidth; - baseWidth = baseHeight; - baseHeight = tempBase; - - // Reset swap button after a short delay - setTimeout(() => { swapWidget.value = false; }, 200); - }; - - // Update preset dropdown from custom presets - const updatePresets = () => { - const lines = customWidget.value.split('\n') - .map(l => l.trim()) - .filter(l => l.toLowerCase().includes('x')); - presetWidget.options.values = ["Custom", ...lines]; - }; - customWidget.callback = updatePresets; - setTimeout(updatePresets, 100); - - // Apply selected preset - presetWidget.callback = (v) => { - if (v !== "Custom") { - const parts = v.toLowerCase().split('x'); - if (parts.length === 2) { - const w = parseInt(parts[0]); - const h = parseInt(parts[1]); - if (!isNaN(w) && !isNaN(h)) { - wWidget.value = clamp(w, 64, 4096); - hWidget.value = clamp(h, 64, 4096); - baseWidth = wWidget.value; - baseHeight = hWidget.value; - scalePercentWidget.value = 100; - } - } - } - }; - }; - } - } -}); \ No newline at end of file