Files
tono/backend/nodes/value_io.py
2026-04-02 00:40:09 -07:00

57 lines
2.0 KiB
Python

from __future__ import annotations
from backend.node_registry import register_node
from backend.execution_context import emit_table, emit_value
from backend.data_types import RecordTable
from backend.nodes.helpers import _measurement_entry, _measurement_value, _scalar_payload, parse_number_with_unit
@register_node(display_name="Value Display")
class ValueIO:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"number_input": ("STRING", {
"text_input": True,
"default": "0",
"placeholder": "e.g. 1.5 nm",
"hide_when_input_connected": "value",
"hide_label": True,
}),
"measurement": ("STRING", {
"default": "",
"choices_from_measure_input": "value",
"show_when_source_type": {
"value": ["RECORD_TABLE"],
},
}),
},
"optional": {
"value": ("FLOAT", {
"accepted_types": ["RECORD_TABLE"],
"socket_only": True,
}),
},
}
OUTPUTS = (
('FLOAT', 'value'),
)
FUNCTION = "display_value"
DESCRIPTION = "Display a FLOAT, or a selected numeric row from a measurement table, and pass the value through unchanged."
def display_value(self, number_input: str = "0", value=None, measurement: str = "") -> tuple:
unit = ""
if isinstance(value, RecordTable):
emit_table(value)
row = _measurement_entry(value, measurement)
numeric = _measurement_value(value, measurement)
unit = row.get("unit", "") if isinstance(row.get("unit"), str) else ""
elif value is not None:
numeric = float(value)
else:
numeric, unit = parse_number_with_unit(str(number_input))
emit_value(_scalar_payload(numeric, unit))
return (numeric,)