[Bf-blender-cvs] [c836becf175] builtin-simulation-nodes: initial duplicate node tree avoidance

Jacques Lucke noreply at git.blender.org
Thu Mar 19 15:52:04 CET 2020


Commit: c836becf175c61de03a70c63abd63ad7f3ecb7df
Author: Jacques Lucke
Date:   Thu Mar 19 15:51:56 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rBc836becf175c61de03a70c63abd63ad7f3ecb7df

initial duplicate node tree avoidance

===================================================================

M	release/scripts/startup/bl_operators/node.py

===================================================================

diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py
index d049512bafe..183089f2889 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -420,6 +420,76 @@ class NODE_OT_export_group_template(Operator):
         save_group_as_json(group, file_path)
         return {'FINISHED'}
 
+def property_has_given_value(owner, prop_name, value):
+    prop = owner.bl_rna.properties[prop_name]
+    if prop.type in {'BOOLEAN', 'INT', 'STRING', 'ENUM'}:
+        return getattr(owner, prop_name) == value
+    elif prop.type == 'FLOAT':
+        if prop.array_length <= 1:
+            return getattr(owner, prop_name) == value
+        else:
+            return tuple(getattr(owner, prop_name)) == tuple(value)
+    else:
+        assert False
+
+def group_matches_json_data(group, json_data):
+    if len(group.nodes) != len(json_data["nodes"]):
+        return False
+    if len(group.links) != len(json_data["links"]):
+        return False
+    if len(group.inputs) != len(json_data["inputs"]):
+        return False
+    if len(group.outputs) != len(json_data["outputs"]):
+        return False
+
+    for node_data in json_data["nodes"]:
+        node = group.nodes.get(node_data["name"])
+        if node is None:
+            return False
+        if node.bl_idname != node_data["bl_idname"]:
+            return False
+
+        if node.bl_idname in {"NodeGroupInput", "NodeGroupOutput"}:
+            pass
+        elif node.bl_idname == "SimulationNodeGroup":
+            # TODO
+            ...
+        else:
+            for key, value in node_data["properties"].items():
+                if getattr(node, key) != value:
+                    return False
+            if len(node.inputs) != len(node_data["inputs"]):
+                return False
+            if len(node.outputs) != len(node_data["outputs"]):
+                return False
+            for sock_data, sock in zip(node_data["inputs"], node.inputs):
+                if hasattr(sock, "default_value"):
+                    if not property_has_given_value(sock, "default_value", sock_data["default_value"]):
+                        return False
+
+    for sock_data, sock in zip(json_data["inputs"], group.inputs):
+        if sock_data["bl_socket_idname"] != sock.bl_socket_idname:
+            return False
+        if sock_data["name"] != sock.name:
+            return False
+
+    for sock_data, sock in zip(json_data["outputs"], group.outputs):
+        if sock_data["bl_socket_idname"] != sock.bl_socket_idname:
+            return False
+        if sock_data["name"] != sock.name:
+            return False
+
+    link_cache = set()
+    for link in group.links:
+        link_cache.add((
+            link.from_node.name, list(link.from_node.outputs).index(link.from_socket),
+            link.to_node.name, list(link.to_node.inputs).index(link.to_socket)))
+    for link_data in json_data["links"]:
+        if (link_data["from"][0], link_data["from"][2], link_data["to"][0], link_data["to"][2]) not in link_cache:
+            return False
+
+    return True
+
 def get_or_create_node_group(directory, group_name):
     main_file_path = os.path.join(directory, group_name + ".json")
 
@@ -427,6 +497,10 @@ def get_or_create_node_group(directory, group_name):
         json_str = f.read()
     json_data = json.loads(json_str)
 
+    for potential_group in bpy.data.node_groups:
+        if group_matches_json_data(potential_group, json_data):
+            return potential_group
+
     group = bpy.data.node_groups.new(json_data["name"], "SimulationNodeTree")
 
     dependencies = {}



More information about the Bf-blender-cvs mailing list