From 0b74b8b05d7588b7960a13b45a8d828afa51eb63 Mon Sep 17 00:00:00 2001 From: Brendan Parmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 7 Sep 2024 18:30:03 -0500 Subject: [PATCH 01/18] docs: added info about extensions platform to installation instructions Signed-off-by: Brendan Parmer <51296046+BrendanParmer@users.noreply.github.com> --- docs/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 938568f..8e8106d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,6 +18,10 @@ Blender's node-based editors are powerful, yet accessible tools, and I wanted to NodeToPython v3.2.1 is supported for Blender 3.0 - 4.2 on Windows, macOS, and Linux. ## Installation +### Blender Extensions Platform +NodeToPython is now on the official [Blender Extensions Platform](https://extensions.blender.org/add-ons/node-to-python/)! See https://extensions.blender.org/about/ for installation instructions and more info. + +### GitHub 1. Download the `NodeToPython.zip` file from the [latest release](https://github.com/BrendanParmer/NodeToPython/releases) * If you download other options, you'll need to rename the zip and the first folder to "NodeToPython" so Blender can properly import the add-on 2. In Blender, navigate to `Edit > Preferences > Add-ons` @@ -53,4 +57,4 @@ This tool is provided under the MIT license and is intended for lawful use only. In particular, this tool generates code that requires the Blender Python API, which is licensed under the GNU General Public License (GPL). Code generated by this tool that incorporates or uses the Blender Python API must comply with the GPL requirements. For more details on the GPL, please see https://www.gnu.org/licenses/gpl-3.0.html. For more details on Blender's licensing, please see https://www.blender.org/about/license/ -**Disclaimer**: The authors of this tool are not legal professionals. This notice is provided for informational purposes only and should not be construed as legal advice. For specific legal advice related to the use of this tool and compliance with the GPL or other legal matters, please consult a qualified attorney. \ No newline at end of file +**Disclaimer**: The authors of this tool are not legal professionals. This notice is provided for informational purposes only and should not be construed as legal advice. For specific legal advice related to the use of this tool and compliance with the GPL or other legal matters, please consult a qualified attorney. From 623c7c29431843e44fbef51c98ddec58b9b4ed16 Mon Sep 17 00:00:00 2001 From: "1029920178@qq.com" <1029910278@qq.com> Date: Tue, 5 Nov 2024 03:37:45 +0800 Subject: [PATCH 02/18] fix: node socket interface menu is now correctly handle --- NodeToPython/ntp_operator.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index babd60d..88fa913 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -12,7 +12,7 @@ import datetime import os import shutil -from typing import TextIO +from typing import TextIO, Callable from .license_templates import license_templates from .ntp_node_tree import NTP_NodeTree @@ -66,6 +66,9 @@ class NTP_Operator(Operator): def __init__(self): super().__init__() + # Call function after all the writes, such as the menu switch node and the menu socket + self._write_after_link: list[Callable] | None = None + # File (TextIO) or string (StringIO) the add-on/script is generated into self._file: TextIO = None @@ -538,6 +541,15 @@ def _set_tree_socket_defaults(self, socket_interface: NodeTreeInterfaceSocket, dv = socket_interface.default_value + # notice that the Node Socket Menu should be assign value after link to a menu switch node + if type(socket_interface) is bpy.types.NodeTreeInterfaceSocketMenu: + if not self._write_after_link: + self._write_after_link = [] + + self._write_after_link.append( + lambda _var=socket_var, _dv=dv: self._write(f"{_var}.default_value = '{_dv}'")) + return + if type(socket_interface) == bpy.types.NodeTreeInterfaceSocketColor: dv = vec4_to_py_str(dv) elif type(dv) in {mathutils.Vector, mathutils.Euler}: @@ -1329,6 +1341,10 @@ def _init_links(self, node_tree: NodeTree) -> None: f".outputs[{input_idx}], " f"{out_node_var}.inputs[{output_idx}])") + if self._write_after_link: + for _func in self._write_after_link: + _func() + def _set_node_tree_properties(self, node_tree: NodeTree) -> None: nt_var = self._node_tree_vars[node_tree] From 4f443dbb8b3248b75229a86e65a01f70d83de91d Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:37:45 -0600 Subject: [PATCH 03/18] fix: no menu linked cases, functions only executed per tree, minor cleanup --- NodeToPython/ntp_operator.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index 88fa913..767d6c3 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -66,8 +66,8 @@ class NTP_Operator(Operator): def __init__(self): super().__init__() - # Call function after all the writes, such as the menu switch node and the menu socket - self._write_after_link: list[Callable] | None = None + # Write functions after nodes are mostly initialized and linked up + self._write_after_links: list[Callable] = [] # File (TextIO) or string (StringIO) the add-on/script is generated into self._file: TextIO = None @@ -541,16 +541,21 @@ def _set_tree_socket_defaults(self, socket_interface: NodeTreeInterfaceSocket, dv = socket_interface.default_value - # notice that the Node Socket Menu should be assign value after link to a menu switch node if type(socket_interface) is bpy.types.NodeTreeInterfaceSocketMenu: - if not self._write_after_link: - self._write_after_link = [] - - self._write_after_link.append( - lambda _var=socket_var, _dv=dv: self._write(f"{_var}.default_value = '{_dv}'")) + if dv == "": + self.report({'WARNING'}, + "NodeToPython: No menu found for socket " + f"{socket_interface.name}" + ) + return + + self._write_after_links.append( + lambda _socket_var=socket_var, _dv=enum_to_py_str(dv): ( + self._write(f"{_socket_var}.default_value = {_dv}") + ) + ) return - - if type(socket_interface) == bpy.types.NodeTreeInterfaceSocketColor: + elif type(socket_interface) == bpy.types.NodeTreeInterfaceSocketColor: dv = vec4_to_py_str(dv) elif type(dv) in {mathutils.Vector, mathutils.Euler}: dv = vec3_to_py_str(dv) @@ -796,6 +801,8 @@ def _set_input_defaults(self, node: Node) -> None: #menu elif input.bl_idname == 'NodeSocketMenu': + if input.default_value == '': + continue default_val = enum_to_py_str(input.default_value) # images @@ -1341,9 +1348,10 @@ def _init_links(self, node_tree: NodeTree) -> None: f".outputs[{input_idx}], " f"{out_node_var}.inputs[{output_idx}])") - if self._write_after_link: - for _func in self._write_after_link: - _func() + for _func in self._write_after_links: + _func() + self._write_after_links = [] + def _set_node_tree_properties(self, node_tree: NodeTree) -> None: nt_var = self._node_tree_vars[node_tree] From 511447fe7b958de3345ad62dc098e86cc7264020 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:45:32 -0600 Subject: [PATCH 04/18] docs: add contributors file --- CONTRIBUTORS.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 CONTRIBUTORS.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..94b05c4 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +* [Brendan Parmer](https://github.com/BrendanParmer) +* [Carlsu](https://github.com/carls3d) +* [atticus-lv](https://github.com/atticus-lv) \ No newline at end of file From a3a26038de01646edd9e1f6c6ea52a4ee823ad5b Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:52:32 -0600 Subject: [PATCH 05/18] feat: bump NTP version --- NodeToPython/__init__.py | 2 +- NodeToPython/blender_manifest.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NodeToPython/__init__.py b/NodeToPython/__init__.py index 6782b87..e37c738 100644 --- a/NodeToPython/__init__.py +++ b/NodeToPython/__init__.py @@ -2,7 +2,7 @@ "name": "Node to Python", "description": "Convert Blender node groups to a Python add-on!", "author": "Brendan Parmer", - "version": (3, 2, 1), + "version": (3, 2, 2), "blender": (3, 0, 0), "location": "Node", "category": "Node", diff --git a/NodeToPython/blender_manifest.toml b/NodeToPython/blender_manifest.toml index 0d6cd63..8c63634 100644 --- a/NodeToPython/blender_manifest.toml +++ b/NodeToPython/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "node_to_python" -version = "3.2.1" +version = "3.2.2" name = "Node To Python" tagline = "Turn node groups into Python code" maintainer = "Brendan Parmer " From 1a520d16defcca739817a77780372f14f8ee5858 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 21:53:58 -0600 Subject: [PATCH 06/18] other: version bumps --- NodeToPython/__init__.py | 2 +- NodeToPython/blender_manifest.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NodeToPython/__init__.py b/NodeToPython/__init__.py index e37c738..efe61f0 100644 --- a/NodeToPython/__init__.py +++ b/NodeToPython/__init__.py @@ -2,7 +2,7 @@ "name": "Node to Python", "description": "Convert Blender node groups to a Python add-on!", "author": "Brendan Parmer", - "version": (3, 2, 2), + "version": (3, 3, 0), "blender": (3, 0, 0), "location": "Node", "category": "Node", diff --git a/NodeToPython/blender_manifest.toml b/NodeToPython/blender_manifest.toml index 8c63634..332fccb 100644 --- a/NodeToPython/blender_manifest.toml +++ b/NodeToPython/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "node_to_python" -version = "3.2.2" +version = "3.3.0" name = "Node To Python" tagline = "Turn node groups into Python code" maintainer = "Brendan Parmer " @@ -12,7 +12,7 @@ website = "https://github.com/BrendanParmer/NodeToPython" tags = ["Development", "Compositing", "Geometry Nodes", "Material", "Node"] blender_version_min = "4.2.0" -blender_version_max = "4.3.0" +blender_version_max = "4.4.0" license = [ "SPDX:MIT", From 4269432f7bbaca022ecf2d605069b672f3c6e86d Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:17:58 -0600 Subject: [PATCH 07/18] fix: bpy_prop_array import location change --- NodeToPython/ntp_operator.py | 8 ++++++-- NodeToPython/utils.py | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index d925aac..0fc8607 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -1,7 +1,6 @@ import bpy from bpy.types import Context, Operator from bpy.types import Node, NodeTree -from bpy_types import bpy_types if bpy.app.version < (4, 0, 0): from bpy.types import NodeSocketInterface @@ -9,6 +8,11 @@ from bpy.types import NodeTreeInterfacePanel, NodeTreeInterfaceSocket from bpy.types import NodeTreeInterfaceItem +if bpy.app.version >= (4, 3, 0): + from bpy.types import bpy_prop_array +else: + from bpy_types.bpy_types import bpy_prop_array + import datetime import os import shutil @@ -574,7 +578,7 @@ def _set_tree_socket_defaults(self, socket_interface: NodeTreeInterfaceSocket, dv = vec4_to_py_str(dv) elif type(dv) in {mathutils.Vector, mathutils.Euler}: dv = vec3_to_py_str(dv) - elif type(dv) == bpy_types.bpy_prop_array: + elif type(dv) == bpy_prop_array: dv = array_to_py_str(dv) elif type(dv) == str: dv = str_to_py_str(dv) diff --git a/NodeToPython/utils.py b/NodeToPython/utils.py index d411290..bc01c88 100644 --- a/NodeToPython/utils.py +++ b/NodeToPython/utils.py @@ -1,7 +1,11 @@ import bpy -from bpy_types import bpy_types import mathutils +if bpy.app.version >= (4, 3, 0): + from bpy.types import bpy_prop_array +else: + from bpy_types.bpy_types import bpy_prop_array + import keyword import re @@ -106,7 +110,7 @@ def vec4_to_py_str(vec4) -> str: """ return f"({vec4[0]}, {vec4[1]}, {vec4[2]}, {vec4[3]})" -def array_to_py_str(array: bpy_types.bpy_prop_array) -> str: +def array_to_py_str(array: bpy_prop_array) -> str: """ Converts a bpy_prop_array into a string From abb7b47e4114b6538ceaf23addceaec3d58c3345 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:27:48 -0600 Subject: [PATCH 08/18] feat: default group node width --- NodeToPython/ntp_operator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index 0fc8607..9ee85d6 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -1381,7 +1381,11 @@ def _set_node_tree_properties(self, node_tree: NodeTree) -> None: color_tag_str = enum_to_py_str(node_tree.color_tag) self._write(f"{nt_var}.color_tag = {color_tag_str}") desc_str = str_to_py_str(node_tree.description) - self._write(f"{nt_var}.description = {desc_str}\n") + self._write(f"{nt_var}.description = {desc_str}") + if bpy.app.version >= (4, 3, 0): + default_width = node_tree.default_group_node_width + self._write(f"{nt_var}.default_group_node_width = {default_width}") + self._write("\n") def _hide_hidden_sockets(self, node: Node) -> None: """ From 380d60cd0fa26f4b68b97ae29e64cdc2c9355125 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:28:11 -0600 Subject: [PATCH 09/18] feat: warning propagation --- NodeToPython/ntp_operator.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index 9ee85d6..f3d5178 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -339,6 +339,11 @@ def _create_node(self, node: Node, node_tree_var: str) -> str: # hide if node.hide: self._write(f"{node_var}.hide = True") + + # Warning propagation + if bpy.app.version >= (4, 3, 0): + self._write(f"{node_var}.warning_propagation = " + f"{enum_to_py_str(node.warning_propagation)}") return node_var def _set_settings_defaults(self, node: Node) -> None: From 30c473688f071b89e7e34ca33091348df2d5c20e Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:39:44 -0600 Subject: [PATCH 10/18] feat: auto-generated 4.3 node_settings --- NodeToPython/node_settings.py | 148 ++++++++++++++++++++++++++++++++-- 1 file changed, 143 insertions(+), 5 deletions(-) diff --git a/NodeToPython/node_settings.py b/NodeToPython/node_settings.py index b771df0..2a332ea 100644 --- a/NodeToPython/node_settings.py +++ b/NodeToPython/node_settings.py @@ -48,12 +48,12 @@ class NTPNodeSetting(NamedTuple): name_: str st_: ST min_version_: tuple = (3, 0, 0) - max_version_: tuple = (4, 3, 0) + max_version_: tuple = (4, 4, 0) class NodeInfo(NamedTuple): attributes_: list[NTPNodeSetting] min_version_: tuple = (3, 0, 0) - max_version_: tuple = (4, 3, 0) + max_version_: tuple = (4, 4, 0) node_settings : dict[str, NodeInfo] = { 'CompositorNodeAlphaOver' : NodeInfo( @@ -161,11 +161,17 @@ class NodeInfo(NamedTuple): NTPNodeSetting("gain", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("gamma", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("gamma", ST.COLOR, min_version_=(3, 5, 0)), + NTPNodeSetting("input_temperature", ST.FLOAT, min_version_=(4, 3, 0)), + NTPNodeSetting("input_tint", ST.FLOAT, min_version_=(4, 3, 0)), + NTPNodeSetting("input_whitepoint", ST.COLOR, min_version_=(4, 3, 0)), NTPNodeSetting("lift", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("lift", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("offset", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("offset", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("offset_basis", ST.FLOAT), + NTPNodeSetting("output_temperature", ST.FLOAT, min_version_=(4, 3, 0)), + NTPNodeSetting("output_tint", ST.FLOAT, min_version_=(4, 3, 0)), + NTPNodeSetting("output_whitepoint", ST.COLOR, min_version_=(4, 3, 0)), NTPNodeSetting("power", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("power", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("slope", ST.VEC3, max_version_=(3, 5, 0)), @@ -652,6 +658,7 @@ class NodeInfo(NamedTuple): NTPNodeSetting("file_slots", ST.FILE_SLOTS), NTPNodeSetting("format", ST.IMAGE_FORMAT_SETTINGS), NTPNodeSetting("layer_slots", ST.LAYER_SLOTS), + NTPNodeSetting("save_as_render", ST.BOOL, min_version_=(4, 3, 0)), ] ), @@ -961,6 +968,13 @@ class NodeInfo(NamedTuple): ] ), + 'FunctionNodeHashValue' : NodeInfo( + [ + NTPNodeSetting("data_type", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'FunctionNodeInputBool' : NodeInfo( [ NTPNodeSetting("boolean", ST.BOOL), @@ -1003,6 +1017,13 @@ class NodeInfo(NamedTuple): ] ), + 'FunctionNodeIntegerMath' : NodeInfo( + [ + NTPNodeSetting("operation", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'FunctionNodeInvertMatrix' : NodeInfo( [], min_version_ = (4, 2, 0) @@ -1018,6 +1039,11 @@ class NodeInfo(NamedTuple): max_version_ = (3, 2, 0) ), + 'FunctionNodeMatrixDeterminant' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + 'FunctionNodeMatrixMultiply' : NodeInfo( [], min_version_ = (4, 2, 0) @@ -1119,7 +1145,9 @@ class NodeInfo(NamedTuple): ), 'FunctionNodeValueToString' : NodeInfo( - [] + [ + NTPNodeSetting("data_type", ST.ENUM, min_version_=(4, 3, 0)), + ] ), 'GeometryNodeAccumulateField' : NodeInfo( @@ -1302,6 +1330,11 @@ class NodeInfo(NamedTuple): ] ), + 'GeometryNodeCurvesToGreasePencil' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeCustomGroup' : NodeInfo( [ NTPNodeSetting("node_tree", ST.NODE_TREE), @@ -1423,6 +1456,22 @@ class NodeInfo(NamedTuple): min_version_ = (3, 1, 0) ), + 'GeometryNodeForeachGeometryElementInput' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeForeachGeometryElementOutput' : NodeInfo( + [ + NTPNodeSetting("active_generation_index", ST.INT), + NTPNodeSetting("active_input_index", ST.INT), + NTPNodeSetting("active_main_index", ST.INT), + NTPNodeSetting("domain", ST.ENUM), + NTPNodeSetting("inspection_index", ST.INT), + ], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeGeometryToInstance' : NodeInfo( [], min_version_ = (3, 1, 0) @@ -1435,6 +1484,41 @@ class NodeInfo(NamedTuple): min_version_ = (4, 1, 0) ), + 'GeometryNodeGizmoDial' : NodeInfo( + [ + NTPNodeSetting("color_id", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeGizmoLinear' : NodeInfo( + [ + NTPNodeSetting("color_id", ST.ENUM), + NTPNodeSetting("draw_style", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeGizmoTransform' : NodeInfo( + [ + NTPNodeSetting("use_rotation_x", ST.BOOL), + NTPNodeSetting("use_rotation_y", ST.BOOL), + NTPNodeSetting("use_rotation_z", ST.BOOL), + NTPNodeSetting("use_scale_x", ST.BOOL), + NTPNodeSetting("use_scale_y", ST.BOOL), + NTPNodeSetting("use_scale_z", ST.BOOL), + NTPNodeSetting("use_translation_x", ST.BOOL), + NTPNodeSetting("use_translation_y", ST.BOOL), + NTPNodeSetting("use_translation_z", ST.BOOL), + ], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeGreasePencilToCurves' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeGridToMesh' : NodeInfo( [], min_version_ = (4, 2, 0) @@ -1458,6 +1542,21 @@ class NodeInfo(NamedTuple): ] ), + 'GeometryNodeImportOBJ' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeImportPLY' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + + 'GeometryNodeImportSTL' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeIndexOfNearest' : NodeInfo( [], min_version_ = (3, 6, 0) @@ -1976,6 +2075,13 @@ class NodeInfo(NamedTuple): min_version_ = (3, 1, 0) ), + 'GeometryNodeMergeLayers' : NodeInfo( + [ + NTPNodeSetting("mode", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeMeshBoolean' : NodeInfo( [ NTPNodeSetting("operation", ST.ENUM), @@ -2305,6 +2411,11 @@ class NodeInfo(NamedTuple): [] ), + 'GeometryNodeSetGeometryName' : NodeInfo( + [], + min_version_ = (4, 3, 0) + ), + 'GeometryNodeSetID' : NodeInfo( [] ), @@ -2469,6 +2580,7 @@ class NodeInfo(NamedTuple): 'GeometryNodeToolSetSelection' : NodeInfo( [ NTPNodeSetting("domain", ST.ENUM), + NTPNodeSetting("selection_type", ST.ENUM, min_version_=(4, 3, 0)), ], min_version_ = (4, 0, 0) ), @@ -2536,6 +2648,13 @@ class NodeInfo(NamedTuple): ] ), + 'GeometryNodeWarning' : NodeInfo( + [ + NTPNodeSetting("warning_type", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'NodeFrame' : NodeInfo( [ NTPNodeSetting("label_size", ST.INT), @@ -2561,7 +2680,9 @@ class NodeInfo(NamedTuple): ), 'NodeReroute' : NodeInfo( - [] + [ + NTPNodeSetting("socket_idname", ST.STRING, min_version_=(4, 3, 0)), + ] ), 'ShaderNodeAddShader' : NodeInfo( @@ -2637,6 +2758,14 @@ class NodeInfo(NamedTuple): ] ), + 'ShaderNodeBsdfMetallic' : NodeInfo( + [ + NTPNodeSetting("distribution", ST.ENUM), + NTPNodeSetting("fresnel_type", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'ShaderNodeBsdfPrincipled' : NodeInfo( [ NTPNodeSetting("distribution", ST.ENUM), @@ -2989,6 +3118,13 @@ class NodeInfo(NamedTuple): ] ), + 'ShaderNodeTexGabor' : NodeInfo( + [ + NTPNodeSetting("gabor_type", ST.ENUM), + ], + min_version_ = (4, 3, 0) + ), + 'ShaderNodeTexGradient' : NodeInfo( [ NTPNodeSetting("gradient_type", ST.ENUM), @@ -3168,7 +3304,9 @@ class NodeInfo(NamedTuple): ), 'ShaderNodeVolumeScatter' : NodeInfo( - [] + [ + NTPNodeSetting("phase", ST.ENUM, min_version_=(4, 3, 0)), + ] ), 'ShaderNodeWavelength' : NodeInfo( From 3de5cf53ca451be3bbe6adf2ffe4350866ac8e4c Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:58:06 -0600 Subject: [PATCH 11/18] feat: whitepoint color balance correction method --- NodeToPython/compositor/operator.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/NodeToPython/compositor/operator.py b/NodeToPython/compositor/operator.py index 682517d..eb798fc 100644 --- a/NodeToPython/compositor/operator.py +++ b/NodeToPython/compositor/operator.py @@ -107,7 +107,7 @@ def _set_color_balance_settings(self, node: CompositorNodeColorBalance NTPNodeSetting("gamma", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("lift", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("lift", ST.COLOR, min_version_=(3, 5, 0))] - else: + elif node.correction_method == 'OFFSET_POWER_SLOPE': lst = [NTPNodeSetting("correction_method", ST.ENUM), NTPNodeSetting("offset", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("offset", ST.COLOR, min_version_=(3, 5, 0)), @@ -116,6 +116,17 @@ def _set_color_balance_settings(self, node: CompositorNodeColorBalance NTPNodeSetting("power", ST.COLOR, min_version_=(3, 5, 0)), NTPNodeSetting("slope", ST.VEC3, max_version_=(3, 5, 0)), NTPNodeSetting("slope", ST.COLOR, min_version_=(3, 5, 0))] + elif node.correction_method == 'WHITEPOINT': + lst = [NTPNodeSetting("correction_method", ST.ENUM), + NTPNodeSetting("input_temperature", ST.FLOAT), + NTPNodeSetting("input_tint", ST.FLOAT), + NTPNodeSetting("output_temperature", ST.FLOAT), + NTPNodeSetting("output_tint", ST.FLOAT)] + else: + self.report({'ERROR'}, + f"Unknown color balance correction method " + f"{enum_to_py_str(node.correction_method)}") + return color_balance_info = self._node_infos['CompositorNodeColorBalance'] self._node_infos['CompositorNodeColorBalance'] = color_balance_info._replace(attributes_ = lst) From 3feabb6413e192224ffa7caff3bfc3c5e0bd47b8 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:38:29 -0600 Subject: [PATCH 12/18] tools: bpy docs download stability --- tools/node_settings_generator/parse_nodes.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tools/node_settings_generator/parse_nodes.py b/tools/node_settings_generator/parse_nodes.py index ab42e73..9465f59 100644 --- a/tools/node_settings_generator/parse_nodes.py +++ b/tools/node_settings_generator/parse_nodes.py @@ -97,17 +97,17 @@ def download_file(filepath: str, version: Version, local_path: str) -> bool: if not os.path.exists(os.path.dirname(local_path)): os.makedirs(os.path.dirname(local_path)) - while True: + NUM_TRIES = 10 + for i in range(NUM_TRIES): try: with urllib.request.urlopen(req) as response: with open(local_path, 'wb') as file: file.write(response.read()) break - except urllib.error.HTTPError as e: - if e.code == 429: - time.sleep(1.0) - else: - raise + except Exception as e: + if i == NUM_TRIES - 1: + raise e + time.sleep(1.0) print(f"Downloaded {file_url} to {local_path}") return True @@ -121,14 +121,18 @@ def get_subclasses(current: str, parent: str, root_path: str, if not os.path.exists(current_path): download_file(relative_path, version, current_path) + if os.path.getsize(current_path) == 0: + download_file(relative_path, version, current_path) + with open(current_path, "r") as current_file: current_html = current_file.read() soup = BeautifulSoup(current_html, "html.parser") - sections = soup.find_all(id=f"{current.lower()}-{parent.lower()}") + main_id = f"{current.lower()}-{parent.lower()}" + sections = soup.find_all(id=main_id) if not sections: - raise ValueError(f"{version.tuple_str()} {current}: Couldn't find main section") + raise ValueError(f"{version.tuple_str()} {current}: Couldn't find main section with id {main_id}") section = sections[0] paragraphs = section.find_all("p") From 2352763bcdcc139d7f3965c6a326adbb2a32b218 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:39:03 -0600 Subject: [PATCH 13/18] tools: add foreach item types, organization --- tools/node_settings_generator/types_utils.py | 33 +++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tools/node_settings_generator/types_utils.py b/tools/node_settings_generator/types_utils.py index 5bf5201..1d385c9 100644 --- a/tools/node_settings_generator/types_utils.py +++ b/tools/node_settings_generator/types_utils.py @@ -9,6 +9,7 @@ class ST(Enum): COLOR = auto() ENUM = auto() ENUM_SET = auto() + EULER = auto() FLOAT = auto() INT = auto() STRING = auto() @@ -18,31 +19,33 @@ class ST(Enum): VEC4 = auto() # Special settings - BAKE_ITEMS = auto() - COLOR_RAMP = auto() - CURVE_MAPPING = auto() - ENUM_DEFINITION = auto() - INDEX_SWITCH_ITEMS = auto() - NODE_TREE = auto() - REPEAT_OUTPUT_ITEMS = auto() - SIM_OUTPUT_ITEMS = auto() + BAKE_ITEMS = auto() + CAPTURE_ATTRIBUTE_ITEMS = auto() + COLOR_RAMP = auto() + CURVE_MAPPING = auto() + ENUM_DEFINITION = auto() + ENUM_ITEM = auto() + FOREACH_GEO_ELEMENT_GENERATION_ITEMS = auto() + FOREACH_GEO_ELEMENT_INPUT_ITEMS = auto() + FOREACH_GEO_ELEMENT_MAIN_ITEMS = auto() + INDEX_SWITCH_ITEMS = auto() + MENU_SWITCH_ITEMS = auto() + NODE_TREE = auto() + REPEAT_OUTPUT_ITEMS = auto() + SIM_OUTPUT_ITEMS = auto() # Image IMAGE = auto() #needs refactor IMAGE_USER = auto() #needs refactor # Currently unimplemented - CAPTURE_ATTRIBUTE_ITEMS = auto() #TODO NTP v3.2 CRYPTOMATTE_ENTRIES = auto() - ENUM_ITEM = auto() #TODO NTP v3.2 - EULER = auto() #TODO NTP v3.2 FILE_SLOTS = auto() FONT = auto() IMAGE_FORMAT_SETTINGS = auto() LAYER_SLOTS = auto() MASK = auto() MATERIAL = auto() #TODO asset library - MENU_SWITCH_ITEMS = auto() #TODO NTP v3.2 MOVIE_CLIP = auto() OBJECT = auto() #TODO asset library PARTICLE_SYSTEM = auto() @@ -59,6 +62,9 @@ class ST(Enum): ST.CURVE_MAPPING, ST.ENUM_DEFINITION, ST.FILE_SLOTS, + ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS, + ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS, + ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS, ST.IMAGE_FORMAT_SETTINGS, ST.IMAGE_USER, ST.INDEX_SWITCH_ITEMS, @@ -100,6 +106,9 @@ class ST(Enum): "NodeEnumItem" : ST.ENUM_ITEM, "NodeGeometryBakeItems" : ST.BAKE_ITEMS, "NodeGeometryCaptureAttributeItems" : ST.CAPTURE_ATTRIBUTE_ITEMS, + "NodeGeometryForeachGeometryElementGenerationItems": ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS, + "NodeGeometryForeachGeometryElementInputItems" : ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS, + "NodeGeometryForeachGeometryElementMainItems": ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS, "NodeGeometryRepeatOutputItems" : ST.REPEAT_OUTPUT_ITEMS, "NodeGeometrySimulationOutputItems" : ST.SIM_OUTPUT_ITEMS, "NodeIndexSwitchItems" : ST.INDEX_SWITCH_ITEMS, From 10f936b9a9f16bcd872751375cdd5351cd2a895d Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:39:36 -0600 Subject: [PATCH 14/18] feat: foreach element zones --- NodeToPython/geometry/node_tree.py | 7 ++++- NodeToPython/geometry/operator.py | 8 ++++-- NodeToPython/node_settings.py | 14 +++++++--- NodeToPython/ntp_operator.py | 43 ++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/NodeToPython/geometry/node_tree.py b/NodeToPython/geometry/node_tree.py index 73b3565..7ebca4f 100644 --- a/NodeToPython/geometry/node_tree.py +++ b/NodeToPython/geometry/node_tree.py @@ -4,9 +4,12 @@ if bpy.app.version >= (3, 6, 0): from bpy.types import GeometryNodeSimulationInput -if bpy.app.version > (4, 0, 0): +if bpy.app.version >= (4, 0, 0): from bpy.types import GeometryNodeRepeatInput +if bpy.app.version >= (4, 3, 0): + from bpy.types import GeometryNodeForeachGeometryElementInput + from ..ntp_node_tree import NTP_NodeTree class NTP_GeoNodeTree(NTP_NodeTree): @@ -16,3 +19,5 @@ def __init__(self, node_tree: GeometryNodeTree, var: str): self.sim_inputs: list[GeometryNodeSimulationInput] = [] if bpy.app.version >= (4, 0, 0): self.repeat_inputs: list[GeometryNodeRepeatInput] = [] + if bpy.app.version >= (4, 3, 0): + self.foreach_element_inputs: list[GeometryNodeForeachGeometryElementInput] = [] diff --git a/NodeToPython/geometry/operator.py b/NodeToPython/geometry/operator.py index 5e1a7b7..4cd5cfd 100644 --- a/NodeToPython/geometry/operator.py +++ b/NodeToPython/geometry/operator.py @@ -51,14 +51,16 @@ def _process_node(self, node: Node, ntp_nt: NTP_GeoNodeTree) -> None: if node.bl_idname == 'GeometryNodeSimulationInput': ntp_nt.sim_inputs.append(node) - elif node.bl_idname == 'GeometryNodeRepeatInput': ntp_nt.repeat_inputs.append(node) + elif node.bl_idname == 'GeometryNodeForeachGeometryElementInput': + ntp_nt.foreach_element_inputs.append(node) self._hide_hidden_sockets(node) if node.bl_idname not in {'GeometryNodeSimulationInput', - 'GeometryNodeRepeatInput'}: + 'GeometryNodeRepeatInput', + 'GeometryNodeForeachGeometryElementInput'}: self._set_socket_defaults(node) if bpy.app.version >= (3, 6, 0): @@ -143,6 +145,8 @@ def _process_node_tree(self, node_tree: GeometryNodeTree) -> None: self._process_zones(ntp_nt.sim_inputs) if bpy.app.version >= (4, 0, 0): self._process_zones(ntp_nt.repeat_inputs) + if bpy.app.version >= (4, 3, 0): + self._process_zones(ntp_nt.foreach_element_inputs) #set look of nodes self._set_parents(node_tree) diff --git a/NodeToPython/node_settings.py b/NodeToPython/node_settings.py index 2a332ea..20e8e4e 100644 --- a/NodeToPython/node_settings.py +++ b/NodeToPython/node_settings.py @@ -9,6 +9,7 @@ class ST(Enum): COLOR = auto() ENUM = auto() ENUM_SET = auto() + EULER = auto() FLOAT = auto() INT = auto() STRING = auto() @@ -17,26 +18,28 @@ class ST(Enum): VEC3 = auto() VEC4 = auto() BAKE_ITEMS = auto() + CAPTURE_ATTRIBUTE_ITEMS = auto() COLOR_RAMP = auto() CURVE_MAPPING = auto() ENUM_DEFINITION = auto() + ENUM_ITEM = auto() + FOREACH_GEO_ELEMENT_GENERATION_ITEMS = auto() + FOREACH_GEO_ELEMENT_INPUT_ITEMS = auto() + FOREACH_GEO_ELEMENT_MAIN_ITEMS = auto() INDEX_SWITCH_ITEMS = auto() + MENU_SWITCH_ITEMS = auto() NODE_TREE = auto() REPEAT_OUTPUT_ITEMS = auto() SIM_OUTPUT_ITEMS = auto() IMAGE = auto() IMAGE_USER = auto() - CAPTURE_ATTRIBUTE_ITEMS = auto() CRYPTOMATTE_ENTRIES = auto() - ENUM_ITEM = auto() - EULER = auto() FILE_SLOTS = auto() FONT = auto() IMAGE_FORMAT_SETTINGS = auto() LAYER_SLOTS = auto() MASK = auto() MATERIAL = auto() - MENU_SWITCH_ITEMS = auto() MOVIE_CLIP = auto() OBJECT = auto() PARTICLE_SYSTEM = auto() @@ -1467,7 +1470,10 @@ class NodeInfo(NamedTuple): NTPNodeSetting("active_input_index", ST.INT), NTPNodeSetting("active_main_index", ST.INT), NTPNodeSetting("domain", ST.ENUM), + NTPNodeSetting("generation_items", ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS), + NTPNodeSetting("input_items", ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS), NTPNodeSetting("inspection_index", ST.INT), + NTPNodeSetting("main_items", ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS), ], min_version_ = (4, 3, 0) ), diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index f3d5178..febfaf4 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -446,6 +446,12 @@ def _set_settings_defaults(self, node: Node) -> None: self._capture_attribute_items(attr, f"{node_var}.{attr_name}") elif st == ST.MENU_SWITCH_ITEMS: self._menu_switch_items(attr, f"{node_var}.{attr_name}") + elif st == ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS: + self._foreach_geo_element_generation_items(attr, f"{node_var}.{attr_name}") + elif st == ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS: + self._foreach_geo_element_input_items(attr, f"{node_var}.{attr_name}") + elif st == ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS: + self._foreach_geo_element_main_items(attr, f"{node_var}.{attr_name}") if bpy.app.version < (4, 0, 0): def _set_group_socket_defaults(self, socket_interface: NodeSocketInterface, @@ -1277,6 +1283,43 @@ def _menu_switch_items(self, menu_switch_items: bpy.types.NodeMenuSwitchItems, m desc_str = str_to_py_str(item.description) self._write(f"{menu_switch_items_str}[{i}].description = {desc_str}") + if bpy.app.version >= (4, 3, 0): + def _foreach_geo_element_generation_items(self, + generation_items: bpy.types.NodeGeometryForeachGeometryElementGenerationItems, + generation_items_str: str + ) -> None: + self._write(f"{generation_items_str}.clear()") + for i, item in enumerate(generation_items): + socket_type = enum_to_py_str(item.socket_type) + name_str = str_to_py_str(item.name) + self._write(f"{generation_items_str}.new({socket_type}, {name_str})") + + item_str = f"{generation_items_str}[{i}]" + + ad = enum_to_py_str(item.domain) + self._write(f"{item_str}.domain = {ad}") + + def _foreach_geo_element_input_items(self, + input_items: bpy.types.NodeGeometryForeachGeometryElementInputItems, + input_items_str: str + ) -> None: + self._write(f"{input_items_str}.clear()") + for i, item in enumerate(input_items): + socket_type = enum_to_py_str(item.socket_type) + name_str = str_to_py_str(item.name) + self._write(f"{input_items_str}.new({socket_type}, {name_str})") + + def _foreach_geo_element_main_items(self, + main_items: bpy.types.NodeGeometryForeachGeometryElementMainItems, + main_items_str: str + ) -> None: + self._write(f"{main_items_str}.clear()") + for i, item in enumerate(main_items): + socket_type = enum_to_py_str(item.socket_type) + name_str = str_to_py_str(item.name) + self._write(f"{main_items_str}.new({socket_type}, {name_str})") + + def _set_parents(self, node_tree: NodeTree) -> None: """ Sets parents for all nodes, mostly used to put nodes in frames From c93efdd3225b532c4d893a8c76faa5672111f76a Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 23 Nov 2024 16:59:29 -0600 Subject: [PATCH 15/18] feat: clean up zone processing --- NodeToPython/geometry/node_tree.py | 9 +++++---- NodeToPython/geometry/operator.py | 16 ++++------------ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/NodeToPython/geometry/node_tree.py b/NodeToPython/geometry/node_tree.py index 7ebca4f..5c875c5 100644 --- a/NodeToPython/geometry/node_tree.py +++ b/NodeToPython/geometry/node_tree.py @@ -1,5 +1,5 @@ import bpy -from bpy.types import GeometryNodeTree +from bpy.types import GeometryNodeTree, GeometryNode if bpy.app.version >= (3, 6, 0): from bpy.types import GeometryNodeSimulationInput @@ -15,9 +15,10 @@ class NTP_GeoNodeTree(NTP_NodeTree): def __init__(self, node_tree: GeometryNodeTree, var: str): super().__init__(node_tree, var) + self.zone_inputs_: dict[list[GeometryNode]] = {} if bpy.app.version >= (3, 6, 0): - self.sim_inputs: list[GeometryNodeSimulationInput] = [] + self.zone_inputs_["GeometryNodeSimulationInput"] = [] if bpy.app.version >= (4, 0, 0): - self.repeat_inputs: list[GeometryNodeRepeatInput] = [] + self.zone_inputs_["GeometryNodeRepeatInput"] = [] if bpy.app.version >= (4, 3, 0): - self.foreach_element_inputs: list[GeometryNodeForeachGeometryElementInput] = [] + self.zone_inputs_["GeometryNodeForeachGeometryElementInput"] = [] diff --git a/NodeToPython/geometry/operator.py b/NodeToPython/geometry/operator.py index 4cd5cfd..cf2485c 100644 --- a/NodeToPython/geometry/operator.py +++ b/NodeToPython/geometry/operator.py @@ -49,12 +49,8 @@ def _process_node(self, node: Node, ntp_nt: NTP_GeoNodeTree) -> None: self._group_io_settings(node, "output", ntp_nt) ntp_nt.outputs_set = True - if node.bl_idname == 'GeometryNodeSimulationInput': - ntp_nt.sim_inputs.append(node) - elif node.bl_idname == 'GeometryNodeRepeatInput': - ntp_nt.repeat_inputs.append(node) - elif node.bl_idname == 'GeometryNodeForeachGeometryElementInput': - ntp_nt.foreach_element_inputs.append(node) + if node.bl_idname in ntp_nt.zone_inputs_: + ntp_nt.zone_inputs_[node.bl_idname].append(node) self._hide_hidden_sockets(node) @@ -141,12 +137,8 @@ def _process_node_tree(self, node_tree: GeometryNodeTree) -> None: for node in node_tree.nodes: self._process_node(node, ntp_nt) - if bpy.app.version >= (3, 6, 0): - self._process_zones(ntp_nt.sim_inputs) - if bpy.app.version >= (4, 0, 0): - self._process_zones(ntp_nt.repeat_inputs) - if bpy.app.version >= (4, 3, 0): - self._process_zones(ntp_nt.foreach_element_inputs) + for zone_list in ntp_nt.zone_inputs_.values(): + self._process_zones(zone_list) #set look of nodes self._set_parents(node_tree) From 5f70ad8690981017a03a571a15c8a0011cdba26e Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:01:59 -0600 Subject: [PATCH 16/18] fix: import bpy_prop_array weirdness --- NodeToPython/ntp_operator.py | 5 +---- NodeToPython/utils.py | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index febfaf4..34b025f 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -8,10 +8,7 @@ from bpy.types import NodeTreeInterfacePanel, NodeTreeInterfaceSocket from bpy.types import NodeTreeInterfaceItem -if bpy.app.version >= (4, 3, 0): - from bpy.types import bpy_prop_array -else: - from bpy_types.bpy_types import bpy_prop_array +from bpy.types import bpy_prop_array import datetime import os diff --git a/NodeToPython/utils.py b/NodeToPython/utils.py index bc01c88..5f84414 100644 --- a/NodeToPython/utils.py +++ b/NodeToPython/utils.py @@ -1,10 +1,8 @@ import bpy import mathutils -if bpy.app.version >= (4, 3, 0): - from bpy.types import bpy_prop_array -else: - from bpy_types.bpy_types import bpy_prop_array + +from bpy.types import bpy_prop_array import keyword import re From 4b8608820f4bc9534fd8b08f6d2c91298935ef5b Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:07:56 -0600 Subject: [PATCH 17/18] feat: don't explicitly set warning propagation if default --- NodeToPython/ntp_operator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NodeToPython/ntp_operator.py b/NodeToPython/ntp_operator.py index 34b025f..5442a56 100644 --- a/NodeToPython/ntp_operator.py +++ b/NodeToPython/ntp_operator.py @@ -339,8 +339,9 @@ def _create_node(self, node: Node, node_tree_var: str) -> str: # Warning propagation if bpy.app.version >= (4, 3, 0): - self._write(f"{node_var}.warning_propagation = " - f"{enum_to_py_str(node.warning_propagation)}") + if node.warning_propagation != 'ALL': + self._write(f"{node_var}.warning_propagation = " + f"{enum_to_py_str(node.warning_propagation)}") return node_var def _set_settings_defaults(self, node: Node) -> None: From c128afa80cfa1c8972ab9bd79fa53e2a3f17d1c9 Mon Sep 17 00:00:00 2001 From: BrendanParmer <51296046+BrendanParmer@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:16:50 -0600 Subject: [PATCH 18/18] refactor: more zone cleanup --- NodeToPython/geometry/node_tree.py | 8 ++++---- NodeToPython/geometry/operator.py | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/NodeToPython/geometry/node_tree.py b/NodeToPython/geometry/node_tree.py index 5c875c5..8129276 100644 --- a/NodeToPython/geometry/node_tree.py +++ b/NodeToPython/geometry/node_tree.py @@ -15,10 +15,10 @@ class NTP_GeoNodeTree(NTP_NodeTree): def __init__(self, node_tree: GeometryNodeTree, var: str): super().__init__(node_tree, var) - self.zone_inputs_: dict[list[GeometryNode]] = {} + self.zone_inputs: dict[list[GeometryNode]] = {} if bpy.app.version >= (3, 6, 0): - self.zone_inputs_["GeometryNodeSimulationInput"] = [] + self.zone_inputs["GeometryNodeSimulationInput"] = [] if bpy.app.version >= (4, 0, 0): - self.zone_inputs_["GeometryNodeRepeatInput"] = [] + self.zone_inputs["GeometryNodeRepeatInput"] = [] if bpy.app.version >= (4, 3, 0): - self.zone_inputs_["GeometryNodeForeachGeometryElementInput"] = [] + self.zone_inputs["GeometryNodeForeachGeometryElementInput"] = [] diff --git a/NodeToPython/geometry/operator.py b/NodeToPython/geometry/operator.py index cf2485c..114f509 100644 --- a/NodeToPython/geometry/operator.py +++ b/NodeToPython/geometry/operator.py @@ -49,14 +49,12 @@ def _process_node(self, node: Node, ntp_nt: NTP_GeoNodeTree) -> None: self._group_io_settings(node, "output", ntp_nt) ntp_nt.outputs_set = True - if node.bl_idname in ntp_nt.zone_inputs_: - ntp_nt.zone_inputs_[node.bl_idname].append(node) + if node.bl_idname in ntp_nt.zone_inputs: + ntp_nt.zone_inputs[node.bl_idname].append(node) self._hide_hidden_sockets(node) - if node.bl_idname not in {'GeometryNodeSimulationInput', - 'GeometryNodeRepeatInput', - 'GeometryNodeForeachGeometryElementInput'}: + if node.bl_idname not in ntp_nt.zone_inputs: self._set_socket_defaults(node) if bpy.app.version >= (3, 6, 0): @@ -137,7 +135,7 @@ def _process_node_tree(self, node_tree: GeometryNodeTree) -> None: for node in node_tree.nodes: self._process_node(node, ntp_nt) - for zone_list in ntp_nt.zone_inputs_.values(): + for zone_list in ntp_nt.zone_inputs.values(): self._process_zones(zone_list) #set look of nodes