[Bf-blender-cvs] [220bcdaa151] node-tree-ref: Add dot exporter

Jacques Lucke noreply at git.blender.org
Tue May 5 15:13:10 CEST 2020


Commit: 220bcdaa1511a1520cddae111ab6bc2b7f922c07
Author: Jacques Lucke
Date:   Mon May 4 17:35:26 2020 +0200
Branches: node-tree-ref
https://developer.blender.org/rB220bcdaa1511a1520cddae111ab6bc2b7f922c07

Add dot exporter

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

M	source/blender/blenkernel/BKE_node_tree_ref.hh
M	source/blender/blenkernel/intern/node_tree_ref.cc

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

diff --git a/source/blender/blenkernel/BKE_node_tree_ref.hh b/source/blender/blenkernel/BKE_node_tree_ref.hh
index cd62b199ff7..46728e0119c 100644
--- a/source/blender/blenkernel/BKE_node_tree_ref.hh
+++ b/source/blender/blenkernel/BKE_node_tree_ref.hh
@@ -154,6 +154,8 @@ class NodeTreeRef : BLI::NonCopyable, BLI::NonMovable {
 
   bNodeTree *btree() const;
 
+  std::string to_dot() const;
+
  private:
   /* Utility functions used by constructor. */
   InputSocketRef &find_input_socket(Map<bNode *, NodeRef *> &node_mapping,
diff --git a/source/blender/blenkernel/intern/node_tree_ref.cc b/source/blender/blenkernel/intern/node_tree_ref.cc
index 3bf589fbb87..e8eb29543bb 100644
--- a/source/blender/blenkernel/intern/node_tree_ref.cc
+++ b/source/blender/blenkernel/intern/node_tree_ref.cc
@@ -16,6 +16,8 @@
 
 #include "BKE_node_tree_ref.hh"
 
+#include "BLI_dot_export.hh"
+
 namespace BKE {
 
 NodeTreeRef::NodeTreeRef(bNodeTree *btree)
@@ -125,4 +127,43 @@ void NodeTreeRef::find_targets_skipping_reroutes(OutputSocketRef &socket,
   }
 }
 
+std::string NodeTreeRef::to_dot() const
+{
+  namespace Dot = BLI::DotExport;
+
+  Dot::DirectedGraph digraph;
+  digraph.set_rankdir(Dot::Attr_rankdir::LeftToRight);
+
+  Map<const NodeRef *, Dot::NodeWithSocketsRef> dot_nodes;
+
+  for (const NodeRef *node : m_nodes_by_id) {
+    Dot::Node &dot_node = digraph.new_node("");
+    dot_node.set_background_color("white");
+
+    Vector<std::string> input_names;
+    Vector<std::string> output_names;
+    for (const InputSocketRef *socket : node->inputs()) {
+      input_names.append(socket->name());
+    }
+    for (const OutputSocketRef *socket : node->outputs()) {
+      output_names.append(socket->name());
+    }
+
+    dot_nodes.add_new(node,
+                      Dot::NodeWithSocketsRef(dot_node, node->name(), input_names, output_names));
+  }
+
+  for (const OutputSocketRef *from_socket : m_output_sockets) {
+    for (const InputSocketRef *to_socket : from_socket->directly_linked_sockets()) {
+      Dot::NodeWithSocketsRef &from_dot_node = dot_nodes.lookup(&from_socket->node());
+      Dot::NodeWithSocketsRef &to_dot_node = dot_nodes.lookup(&to_socket->node());
+
+      digraph.new_edge(from_dot_node.output(from_socket->index()),
+                       to_dot_node.input(to_socket->index()));
+    }
+  }
+
+  return digraph.to_dot_string();
+}
+
 }  // namespace BKE



More information about the Bf-blender-cvs mailing list