[Bf-blender-cvs] [4e15afad9e6] builtin-simulation-nodes: improve node group comparison
Jacques Lucke
noreply at git.blender.org
Sat Mar 21 13:48:33 CET 2020
Commit: 4e15afad9e63479bec9e92d5ee4fdddf14c83fb2
Author: Jacques Lucke
Date: Sat Mar 21 13:40:55 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rB4e15afad9e63479bec9e92d5ee4fdddf14c83fb2
improve node group comparison
===================================================================
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 2b9ae74e73c..aa51b9a453d 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -442,7 +442,7 @@ def property_has_given_value(owner, prop_name, value):
else:
assert False
-def group_matches_json_data(group, json_data):
+def group_matches_json_data(group, json_data, loaded_group_by_name, json_data_by_group_name):
if len(group.nodes) != len(json_data["nodes"]):
return False
if len(group.links) != len(json_data["links"]):
@@ -462,8 +462,16 @@ def group_matches_json_data(group, json_data):
if node.bl_idname in {"NodeGroupInput", "NodeGroupOutput"}:
pass
elif node.bl_idname == "SimulationNodeGroup":
- # TODO
- ...
+ if node.node_tree is None:
+ return False
+ elif node.node_tree == loaded_group_by_name[node_data["group_name"]]:
+ pass
+ elif not group_matches_json_data(node.node_tree,
+ json_data_by_group_name[node_data["group_name"]],
+ loaded_group_by_name,
+ json_data_by_group_name):
+ return False
+
else:
for key, value in node_data["properties"].items():
if getattr(node, key) != value:
@@ -500,22 +508,13 @@ def group_matches_json_data(group, json_data):
return True
-def get_or_create_node_group(group_name):
- file_path = group_name_to_file_path(group_name)
- with open(file_path, "r") as f:
- json_str = f.read()
- json_data = json.loads(json_str)
-
+def get_or_create_node_group(json_data, loaded_group_by_name, json_data_by_group_name):
for potential_group in bpy.data.node_groups:
- if group_matches_json_data(potential_group, json_data):
+ if group_matches_json_data(potential_group, json_data, loaded_group_by_name, json_data_by_group_name):
return potential_group
group = bpy.data.node_groups.new(json_data["name"], "SimulationNodeTree")
- dependencies = {}
- for dependency_name in json_data["dependencies"]:
- dependencies[dependency_name] = get_or_create_node_group(dependency_name)
-
for node_data in json_data["nodes"]:
node = group.nodes.new(node_data["bl_idname"])
node.name = node_data["name"]
@@ -525,7 +524,7 @@ def get_or_create_node_group(group_name):
if node.bl_idname in {"NodeGroupInput", "NodeGroupOutput"}:
pass
elif node.bl_idname == "SimulationNodeGroup":
- node.node_tree = dependencies[node_data["group_name"]]
+ node.node_tree = loaded_group_by_name[node_data["group_name"]]
else:
for key, value in node_data["properties"].items():
setattr(node, key, value)
@@ -547,6 +546,28 @@ def get_or_create_node_group(group_name):
return group
+from collections import OrderedDict
+
+def get_json_data_for_all_groups_to_load(main_group_name):
+ json_data_by_group_name = OrderedDict()
+
+ def load(group_name):
+ if group_name in json_data_by_group_name:
+ return
+ else:
+ file_path = group_name_to_file_path(group_name)
+ with open(file_path, "r") as f:
+ json_str = f.read()
+ json_data = json.loads(json_str)
+ assert group_name == json_data["name"]
+ for dependency_name in json_data["dependencies"]:
+ load(dependency_name)
+ json_data_by_group_name[group_name] = json_data
+
+ load(main_group_name)
+ return json_data_by_group_name
+
+
class NODE_OT_import_group_template(Operator):
bl_idname = "node.import_group_template"
bl_label = "Import Node Group Template"
@@ -555,7 +576,13 @@ class NODE_OT_import_group_template(Operator):
group_name: StringProperty()
def execute(self, context):
- get_or_create_node_group(self.group_name)
+ json_data_by_group_name = get_json_data_for_all_groups_to_load(self.group_name)
+ loaded_group_by_name = dict()
+
+ for group_name, json_data in json_data_by_group_name.items():
+ group = get_or_create_node_group(json_data, loaded_group_by_name, json_data_by_group_name)
+ loaded_group_by_name[group_name] = group
+
return {'FINISHED'}
class NODE_OT_import_group_template_search(bpy.types.Operator):
More information about the Bf-blender-cvs
mailing list