added more input options

a new InputObject class allows to use the following input options: min, max, name, subtype, tooltip, hide_in_modifer

setting subtype does not work (yet), only the menu label gets changed
pull/46/head
Roberto Saccon 2023-12-02 05:35:27 +01:00
rodzic a1aac89c19
commit 6ddd546a1d
2 zmienionych plików z 104 dodań i 16 usunięć

Wyświetl plik

@ -106,7 +106,10 @@ def tree(name):
node_inputs = get_node_inputs(node_group)
for i, arg in enumerate(inputs.items()):
input_name = arg[0].replace('_', ' ').title()
if hasattr(arg[1][0], 'input_options') and arg[1][0].input_options.name != None:
input_name = arg[1][0].input_options.name
else:
input_name = arg[0].replace('_', ' ').title()
if len(node_inputs) > i:
node_inputs[i].name = input_name
node_input = node_inputs[i]
@ -117,10 +120,25 @@ def tree(name):
node_input = node_group.inputs.new(arg[1][0].socket_type, input_name)
if arg[1][1] != inspect.Parameter.empty:
node_input.default_value = arg[1][1]
if hasattr(arg[1][0], 'min_value'):
node_input.min_value = arg[1][0].min_value
if hasattr(arg[1][0], 'max_value'):
node_input.max_value = arg[1][0].max_value
if hasattr(arg[1][0], 'input_options'):
input_options = arg[1][0].input_options
input_options.process(node_input.type)
node_input.min_value = input_options.min_value
node_input.max_value = input_options.max_value
node_input.bl_subtype_label = input_options.bl_subtype_label # DOES NOT WORK. Do e nee to change a UI property like this: ui_property(object, "property-name", expand=False, text="New Label")
node_input.description = input_options.description
node_input.hide_in_modifier = input_options.hide_in_modifier
else:
# reset all options to defaults ???????
pass
# input_options = InputOptions()
# input_options.process(node_input.type)
# node_input.min_value = input_options.min_value
# node_input.max_value = input_options.max_value
# node_input.bl_subtype_label = input_options.bl_subtype_label
# node_input.description = input_options.description
# node_input.hide_in_modifier = input_options.hide_in_modifier
if arg[1][2] is not None:
if arg[1][2] not in builder_inputs:
builder_inputs[arg[1][2]] = signature.parameters[arg[1][2]].annotation()

Wyświetl plik

@ -6,8 +6,70 @@ from .state import State
from .static.sample_mode import SampleMode
import geometry_script
INT_MIN = -2147483648
INT_MAX = 2147483647
INT_MIN = -INT_MAX -1
class SubtypeInt(enum.Enum):
NONE = 'None'
PERCENTAGE = 'Percentage'
FACTOR = 'Factor'
class SubtypeFloat(enum.Enum):
NONE = 'None'
PERCENTAGE = 'Percentage'
FACTOR = 'Factor'
ANGLE = 'Angle'
TIME = 'Time (Scene Relative)'
TIME_ABSOLUTE = 'Time (Absolute)'
DISTANCE = 'Distance'
class InputOptions:
min_value: int | float
max_value: int | float
bl_subtype_label: str
name: str
description: str
hide_in_modifier: bool
def __init__(
self,
min: int | float | None = None,
max: int | float | None = None,
subtype: SubtypeInt | SubtypeFloat | None = None,
name: str | None = None,
tooltip: str = '',
hide_in_modifier: bool = False
):
self.min_value = min
self.max_value = max
self.bl_subtype_label = subtype.value if subtype != None else None
self.name = name
self.description = tooltip
self.hide_in_modifier = hide_in_modifier
def process(self, node_input_type: str):
if node_input_type == 'INT':
if self.min_value != None and self.max_value == None:
self.max_value = INT_MAX
if self.max_value != None and self.min_value == None:
self.min_value = INT_MIN
if isinstance(self.min_value, float):
self.min_value = int(self.min_value)
if isinstance(self.max_value, float):
self.max_value = int(self.max_value)
if self.bl_subtype_label == None:
self.bl_subtype_label = SubtypeInt.NONE
elif node_input_type == 'VALUE':
if self.min_value != None and self.max_value == None:
self.max_value = float('inf')
if self.max_value != None and self.min_value == None:
self.min_value = float('-inf')
if isinstance(self.min_value, int):
self.min_value = float(self.min_value)
if isinstance(self.max_value, int):
self.max_value = float(self.max_value)
if self.bl_subtype_label == None:
self.bl_subtype_label = SubtypeFloat.NONE
def map_case_name(i):
return ('_' if not i.identifier[0].isalpha() else '') + i.identifier.replace(' ', '_').upper()
@ -35,22 +97,30 @@ def socket_class_to_data_type(socket_class_name):
# The base class all exposed socket types conform to.
class _TypeMeta(type):
def __getitem__(self, args):
if isinstance(args, int):
setattr(self, 'min_value', args)
setattr(self, 'max_value', INT_MAX)
elif isinstance(args, float):
setattr(self, 'min_value', args)
setattr(self, 'max_value', float('inf'))
input_options = None
if isinstance(args, int) or isinstance(args, float):
input_options = InputOptions(min=args)
elif isinstance(args, tuple):
tuple_args = {}
if isinstance(args[0], int) or isinstance(args[0], float):
setattr(self, 'min_value', args[0])
tuple_args['min'] = args[0]
if len(args) > 1 and (isinstance(args[1], int) or isinstance(args[1], float)):
setattr(self, 'max_value', args[1])
tuple_args['max'] = args[1]
if len(tuple_args) > 0:
input_options = InputOptions(**tuple_args)
elif isinstance(args, slice):
slice_args = {}
if isinstance(args.start, int) or isinstance(args.start, float):
setattr(self, 'min_value', args.start)
slice_args['min'] = args.start
if isinstance(args.stop, int) or isinstance(args.stop, float):
setattr(self, 'max_value', args.stop)
slice_args['max'] = args.stop
if len(slice_args) > 0:
input_options = InputOptions(**slice_args)
elif isinstance(args, InputOptions):
input_options = args
if input_options != None:
setattr(self, 'input_options', input_options)
return self