diff options
author | Jacques Lucke <jacques@blender.org> | 2020-05-04 18:35:26 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-05-04 18:35:26 +0300 |
commit | 220bcdaa1511a1520cddae111ab6bc2b7f922c07 (patch) | |
tree | 9ac3207477dfa7d6c64c719af363b0bd8b4be41b | |
parent | a9051f41062907387477d68248efa96f83eb9b03 (diff) |
Add dot exporter
-rw-r--r-- | source/blender/blenkernel/BKE_node_tree_ref.hh | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_tree_ref.cc | 41 |
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 |