From 6ddd546a1d27c3a88a5cd436d49f84c103fe45eb Mon Sep 17 00:00:00 2001 From: Roberto Saccon Date: Sat, 2 Dec 2023 05:35:27 +0100 Subject: [PATCH] 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 --- api/tree.py | 28 +++++++++++++--- api/types.py | 92 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 104 insertions(+), 16 deletions(-) diff --git a/api/tree.py b/api/tree.py index 39b3f8e..4d0edd8 100644 --- a/api/tree.py +++ b/api/tree.py @@ -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() diff --git a/api/types.py b/api/types.py index aaf797a..3a02153 100644 --- a/api/types.py +++ b/api/types.py @@ -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