From 89ee0bb4d8082ac7e7954efe3af58469b4d01a35 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 21 Jan 2023 14:17:24 -0600 Subject: [PATCH 1/3] feat: set defaults for some attributes if they exist in a blend file --- materials.py | 6 +++--- utils.py | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/materials.py b/materials.py index 17d74d1..4fa843a 100644 --- a/materials.py +++ b/materials.py @@ -4,10 +4,10 @@ from .utils import * #node input sockets that are messy to set default values for -dont_set_defaults = {'NodeSocketCollection', +dont_set_defaults = {#'NodeSocketCollection', 'NodeSocketGeometry', - 'NodeSocketMaterial', - 'NodeSocketObject', + #'NodeSocketMaterial', + #'NodeSocketObject', 'NodeSocketShader', 'NodeSocketTexture', 'NodeSocketVirtual'} diff --git a/utils.py b/utils.py index 05e5c13..5f41944 100644 --- a/utils.py +++ b/utils.py @@ -346,12 +346,20 @@ def set_input_defaults(node, dont_set_defaults: set, file: TextIO, inner: str, for i, input in enumerate(node.inputs): if input.bl_idname not in dont_set_defaults and not input.is_linked: socket_var = f"{node_var}.inputs[{i}]" + + #colors if input.bl_idname == 'NodeSocketColor': default_val = vec4_to_py_str(input.default_value) + + #vector types elif "Vector" in input.bl_idname: default_val = vec3_to_py_str(input.default_value) + + #strings elif input.bl_idname == 'NodeSocketString': default_val = str_to_py_str(input.default_value) + + #images elif input.bl_idname == 'NodeSocketImage': print("Input is linked: ", input.is_linked) img = input.default_value @@ -359,6 +367,22 @@ def set_input_defaults(node, dont_set_defaults: set, file: TextIO, inner: str, save_image(img, addon_dir) load_image(img, file, inner, f"{socket_var}.default_value") default_val = None + + #materials + elif input.bl_idname == 'NodeSocketMaterial': + in_file_inputs(input, file, inner, socket_var, "materials") + default_val = None + + #collections + elif input.bl_idname == 'NodeSocketCollection': + in_file_inputs(input, file, inner, socket_var, "collections") + default_val = None + + #objects + elif input.bl_idname == 'NodeSocketObject': + in_file_inputs(input, file, inner, socket_var, "objects") + default_val = None + else: default_val = input.default_value if default_val is not None: @@ -367,6 +391,23 @@ def set_input_defaults(node, dont_set_defaults: set, file: TextIO, inner: str, f" = {default_val}\n")) file.write("\n") +def in_file_inputs(input, file: TextIO, inner: str, socket_var: str, type: str): + """ + Sets inputs for a node input if one already exists in the blend file + + Parameters: + input (bpy.types.NodeSocket): input socket we're setting the value for + file (TextIO): file we're writing the add-on into + inner (str): indentation string + socket_var (str): variable name we're using for the socket + type (str): from what section of bpy.data to pull the default value from + """ + + name = str_to_py_str(input.default_value.name) + file.write(f"{inner}if {name} in bpy.data.{type}:\n") + file.write((f"{inner}\t{socket_var}.default_value = " + f"bpy.data.{type}[{name}]\n")) + def set_parents(node_tree, file: TextIO, inner: str, node_vars: dict): """ Sets parents for all nodes, mostly used to put nodes in frames From 5807de02d27119714f478a7a741cf8f18a2671ab Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 21 Jan 2023 14:19:12 -0600 Subject: [PATCH 2/3] feat: set defaults for textures if they exist in a blend file --- materials.py | 2 +- utils.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/materials.py b/materials.py index 4fa843a..411a92f 100644 --- a/materials.py +++ b/materials.py @@ -9,7 +9,7 @@ #'NodeSocketMaterial', #'NodeSocketObject', 'NodeSocketShader', - 'NodeSocketTexture', + #'NodeSocketTexture', 'NodeSocketVirtual'} node_settings = { diff --git a/utils.py b/utils.py index 5f41944..7eabffa 100644 --- a/utils.py +++ b/utils.py @@ -382,7 +382,12 @@ def set_input_defaults(node, dont_set_defaults: set, file: TextIO, inner: str, elif input.bl_idname == 'NodeSocketObject': in_file_inputs(input, file, inner, socket_var, "objects") default_val = None - + + #textures + elif input.bl_idname == 'NodeSocketTexture': + in_file_inputs(input, file, inner, socket_var, "textures") + default_val = None + else: default_val = input.default_value if default_val is not None: From 3c96b43c7e2a3942a6671baadf6dbb3fd72f78cb Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 21 Jan 2023 14:30:22 -0600 Subject: [PATCH 3/3] refactor: dont_set_defaults set moved to utils.py --- geo_nodes.py | 11 +---------- materials.py | 12 +----------- utils.py | 11 +++++++---- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/geo_nodes.py b/geo_nodes.py index 9e75917..dc3ea13 100644 --- a/geo_nodes.py +++ b/geo_nodes.py @@ -10,14 +10,6 @@ 'NodeSocketInt', 'NodeSocketVector'} -#node input sockets that are messy to set default values for -dont_set_defaults = {'NodeSocketCollection', - 'NodeSocketGeometry', - 'NodeSocketMaterial', - 'NodeSocketObject', - 'NodeSocketTexture', - 'NodeSocketVirtual'} - geo_node_settings = { #attribute "GeometryNodeAttributeStatistic" : ["data_type", "domain"], @@ -317,8 +309,7 @@ def process_geo_nodes_group(node_tree, level): elif node.bl_idname in curve_nodes: curve_node_settings(node, file, inner, node_var) - set_input_defaults(node, dont_set_defaults, file, inner, - node_var, addon_dir) + set_input_defaults(node, file, inner, node_var, addon_dir) set_parents(node_tree, file, inner, node_vars) set_locations(node_tree, file, inner, node_vars) diff --git a/materials.py b/materials.py index 411a92f..d3310df 100644 --- a/materials.py +++ b/materials.py @@ -3,15 +3,6 @@ from .utils import * -#node input sockets that are messy to set default values for -dont_set_defaults = {#'NodeSocketCollection', - 'NodeSocketGeometry', - #'NodeSocketMaterial', - #'NodeSocketObject', - 'NodeSocketShader', - #'NodeSocketTexture', - 'NodeSocketVirtual'} - node_settings = { #input "ShaderNodeAmbientOcclusion" : ["samples", "inside", "only_local"], @@ -188,8 +179,7 @@ def process_mat_node_group(node_tree, level): elif node.bl_idname in curve_nodes: curve_node_settings(node, file, inner, node_var) - set_input_defaults(node, dont_set_defaults, file, inner, - node_var, addon_dir) + set_input_defaults(node, file, inner, node_var, addon_dir) set_parents(node_tree, file, inner, node_vars) set_locations(node_tree, file, inner, node_vars) set_dimensions(node_tree, file, inner, node_vars) diff --git a/utils.py b/utils.py index 7eabffa..a97713f 100644 --- a/utils.py +++ b/utils.py @@ -8,6 +8,11 @@ image_dir_name = "imgs" +#node input sockets that are messy to set default values for +dont_set_defaults = {'NodeSocketGeometry', + 'NodeSocketShader', + 'NodeSocketVirtual'} + def clean_string(string: str, lower: bool = True) -> str: """ Cleans up a string for use as a variable or file name @@ -325,15 +330,13 @@ def curve_node_settings(node, file: TextIO, inner: str, node_var: str): file.write(f"{inner}#update curve after changes\n") file.write(f"{mapping}.update()\n") -def set_input_defaults(node, dont_set_defaults: set, file: TextIO, inner: str, - node_var: str, addon_dir: str): +def set_input_defaults(node, file: TextIO, inner: str, node_var: str, + addon_dir: str): """ Sets defaults for input sockets Parameters: node (bpy.types.Node): node we're setting inputs for - dont_set_defaults (set): set of sockets we shouldn't attempt to set - default values for file (TextIO): file we're generating the add-on into inner (str): indentation node_var (str): variable name we're using for the copied node