Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-05-04 18:35:26 +0300
committerJacques Lucke <jacques@blender.org>2020-05-04 18:35:26 +0300
commit220bcdaa1511a1520cddae111ab6bc2b7f922c07 (patch)
tree9ac3207477dfa7d6c64c719af363b0bd8b4be41b
parenta9051f41062907387477d68248efa96f83eb9b03 (diff)
Add dot exporter
-rw-r--r--source/blender/blenkernel/BKE_node_tree_ref.hh2
-rw-r--r--source/blender/blenkernel/intern/node_tree_ref.cc41
2 files changed, 43 insertions, 0 deletions
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