100 lines
4.4 KiB
Markdown
100 lines
4.4 KiB
Markdown
# Documentation
|
|
- Class name: RangeFloat
|
|
- Category: EasyUse/Logic/Type
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/yolain/ComfyUI-Easy-Use.git
|
|
|
|
该节点便于在指定范围内生成一系列浮点数,根据用户定义的模式和参数。它抽象了创建范围的过程,允许对起始值、终止值和步长值进行精确控制,以及步数和端点的包含性。
|
|
|
|
# Input types
|
|
## Required
|
|
- range_mode
|
|
- 模式参数决定了生成范围序列所用的逻辑。它是必要的,因为它为节点设置了操作上下文,决定了范围是由固定的'步长'还是指定的'步数'生成。
|
|
- Comfy dtype: COMBO[String]
|
|
- Python dtype: str
|
|
- start
|
|
- 起始参数定义了范围的初始值。它至关重要,因为它设定了生成范围序列的基线,影响整个输出。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: decimal.Decimal
|
|
- stop
|
|
- 终止参数标记了范围的终点。它很重要,因为它与起始值一起,定义了生成范围序列的边界。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: decimal.Decimal
|
|
- step
|
|
- 步长参数决定了范围序列中每个值之间的增量。它的值直接影响生成序列的粒度和模式。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: decimal.Decimal
|
|
- end_mode
|
|
- 结束模式参数决定终止值是否包含在范围序列中。这影响了终点的包含性,从而影响了输出的组成。
|
|
- Comfy dtype: COMBO[String]
|
|
- Python dtype: str
|
|
## Optional
|
|
- num_steps
|
|
- 步数参数指定了范围序列中期望的步数。它很重要,因为它直接影响节点产生的值的数量。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
|
|
# Output types
|
|
- range
|
|
- 范围输出提供了生成的浮点数序列,这是节点操作的核心结果。它封装了范围生成过程的精髓。
|
|
- Comfy dtype: LIST[FLOAT]
|
|
- Python dtype: List[float]
|
|
- range_sizes
|
|
- 范围大小输出提供了每个单独生成的范围序列中的值的数量,提供了对输出的分布和结构的洞察。
|
|
- Comfy dtype: LIST(INT)
|
|
- Python dtype: List[int]
|
|
|
|
# Usage tips
|
|
- Infra type: CPU
|
|
|
|
# Source code
|
|
```
|
|
class RangeFloat:
|
|
|
|
def __init__(self) -> None:
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s) -> Dict[str, Dict[str, Any]]:
|
|
return {'required': {'range_mode': (['step', 'num_steps'], {'default': 'step'}), 'start': ('FLOAT', {'default': 0, 'min': -4096, 'max': 4096, 'step': 0.1}), 'stop': ('FLOAT', {'default': 0, 'min': -4096, 'max': 4096, 'step': 0.1}), 'step': ('FLOAT', {'default': 0, 'min': -4096, 'max': 4096, 'step': 0.1}), 'num_steps': ('INT', {'default': 0, 'min': -4096, 'max': 4096, 'step': 1}), 'end_mode': (['Inclusive', 'Exclusive'], {'default': 'Inclusive'})}}
|
|
RETURN_TYPES = ('FLOAT', 'INT')
|
|
RETURN_NAMES = ('range', 'range_sizes')
|
|
INPUT_IS_LIST = True
|
|
OUTPUT_IS_LIST = (True, True)
|
|
FUNCTION = 'build_range'
|
|
CATEGORY = 'EasyUse/Logic/Type'
|
|
|
|
@staticmethod
|
|
def _decimal_range(range_mode: String, start: Decimal, stop: Decimal, step: Decimal, num_steps: Int, inclusive: bool) -> Iterator[float]:
|
|
if range_mode == 'step':
|
|
ret_val = start
|
|
if inclusive:
|
|
stop = stop + step
|
|
direction = 1 if step > 0 else -1
|
|
while (ret_val - stop) * direction < 0:
|
|
yield float(ret_val)
|
|
ret_val += step
|
|
elif range_mode == 'num_steps':
|
|
step = (stop - start) / (num_steps - 1)
|
|
direction = 1 if step > 0 else -1
|
|
ret_val = start
|
|
for _ in range(num_steps):
|
|
if (ret_val - stop) * direction > 0:
|
|
break
|
|
yield float(ret_val)
|
|
ret_val += step
|
|
|
|
def build_range(self, range_mode, start, stop, step, num_steps, end_mode) -> Tuple[List[float], List[int]]:
|
|
error_if_mismatched_list_args(locals())
|
|
getcontext().prec = 12
|
|
start = [Decimal(s) for s in start]
|
|
stop = [Decimal(s) for s in stop]
|
|
step = [Decimal(s) for s in step]
|
|
ranges = []
|
|
range_sizes = []
|
|
for (range_mode, e_start, e_stop, e_step, e_num_steps, e_end_mode) in zip_with_fill(range_mode, start, stop, step, num_steps, end_mode):
|
|
vals = list(self._decimal_range(range_mode, e_start, e_stop, e_step, e_num_steps, e_end_mode == 'Inclusive'))
|
|
ranges.extend(vals)
|
|
range_sizes.append(len(vals))
|
|
return (ranges, range_sizes)
|
|
``` |