[Bf-blender-cvs] [4713680eefc] builtin-simulation-nodes: initial import group template operator

Jacques Lucke noreply at git.blender.org
Thu Mar 19 15:10:17 CET 2020


Commit: 4713680eefce7a16de1e3c1444b9cc1654400008
Author: Jacques Lucke
Date:   Thu Mar 19 15:10:09 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rB4713680eefce7a16de1e3c1444b9cc1654400008

initial import group template operator

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

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 ff0bd543f15..d049512bafe 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -420,6 +420,65 @@ class NODE_OT_export_group_template(Operator):
         save_group_as_json(group, file_path)
         return {'FINISHED'}
 
+def get_or_create_node_group(directory, group_name):
+    main_file_path = os.path.join(directory, group_name + ".json")
+
+    with open(main_file_path, "r") as f:
+        json_str = f.read()
+    json_data = json.loads(json_str)
+
+    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(directory, dependency_name)
+
+    for node_data in json_data["nodes"]:
+        node = group.nodes.new(node_data["bl_idname"])
+        node.name = node_data["name"]
+        node.location = node_data["location"]
+        node.select = False
+
+        if node.bl_idname in {"NodeGroupInput", "NodeGroupOutput"}:
+            pass
+        elif node.bl_idname == "SimulationNodeGroup":
+            node.node_tree = dependencies[node_data["group_name"]]
+        else:
+            for key, value in node_data["properties"].items():
+                setattr(node, key, value)
+
+            for sock_data, sock in zip(node_data["inputs"], node.inputs):
+                if hasattr(sock, "default_value"):
+                    sock.default_value = sock_data["default_value"]
+
+    for sock_data in json_data["inputs"]:
+        group.inputs.new(sock_data["bl_socket_idname"], sock_data["name"])
+
+    for sock_data in json_data["outputs"]:
+        group.outputs.new(sock_data["bl_socket_idname"], sock_data["name"])
+
+    for link_data in json_data["links"]:
+        from_socket = group.nodes[link_data["from"][0]].outputs[link_data["from"][2]]
+        to_socket = group.nodes[link_data["to"][0]].inputs[link_data["to"][2]]
+        group.links.new(from_socket, to_socket)
+
+    return group
+
+class NODE_OT_import_group_template(Operator):
+    bl_idname = "node.import_group_template"
+    bl_label = "Import Node Group Template"
+
+    directory: StringProperty()
+    filename: StringProperty()
+
+    def invoke(self, context, event):
+        context.window_manager.fileselect_add(self)
+        return {'RUNNING_MODAL'}
+
+    def execute(self, context):
+        assert self.filename.endswith(".json")
+        get_or_create_node_group(self.directory, self.filename[:-len(".json")])
+        return {'FINISHED'}
 
 classes = (
     NodeSetting,
@@ -430,4 +489,5 @@ classes = (
     NODE_OT_collapse_hide_unused_toggle,
     NODE_OT_tree_path_parent,
     NODE_OT_export_group_template,
+    NODE_OT_import_group_template
 )



More information about the Bf-blender-cvs mailing list