[Bf-blender-cvs] [cdd69f8e6d8] functions-experimental-refactor: dot export

Jacques Lucke noreply at git.blender.org
Thu Oct 31 14:12:57 CET 2019


Commit: cdd69f8e6d8d9a11d29201e591951bb496427c69
Author: Jacques Lucke
Date:   Thu Oct 31 13:32:53 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBcdd69f8e6d8d9a11d29201e591951bb496427c69

dot export

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

M	source/blender/blenkernel/BKE_multi_function_network.h
M	source/blender/blenkernel/intern/multi_function_network.cc
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/blenkernel/BKE_multi_function_network.h b/source/blender/blenkernel/BKE_multi_function_network.h
index 5dd5a272f2d..9ac09956ef5 100644
--- a/source/blender/blenkernel/BKE_multi_function_network.h
+++ b/source/blender/blenkernel/BKE_multi_function_network.h
@@ -40,6 +40,8 @@ class MFBuilderNode : BLI::NonCopyable, BLI::NonMovable {
   ArrayRef<MFBuilderInputSocket *> inputs();
   ArrayRef<MFBuilderOutputSocket *> outputs();
 
+  StringRef name();
+
   uint id();
 
   bool is_function();
@@ -83,6 +85,7 @@ class MFBuilderSocket : BLI::NonCopyable, BLI::NonMovable {
 
   uint index();
   uint id();
+  StringRef name();
 
   bool is_input();
   bool is_output();
@@ -124,6 +127,9 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  public:
   ~MFNetworkBuilder();
 
+  std::string to_dot();
+  void to_dot__clipboard();
+
   MFBuilderFunctionNode &add_function(const MultiFunction &function,
                                       ArrayRef<uint> input_param_indices,
                                       ArrayRef<uint> output_param_indices);
@@ -305,6 +311,11 @@ inline uint MFBuilderNode::id()
   return m_id;
 }
 
+inline StringRef MFBuilderNode::name()
+{
+  return "My Name";
+}
+
 inline bool MFBuilderNode::is_function()
 {
   return !m_is_placeholder;
@@ -361,6 +372,11 @@ inline uint MFBuilderSocket::id()
   return m_id;
 }
 
+inline StringRef MFBuilderSocket::name()
+{
+  return "My Name";
+}
+
 inline bool MFBuilderSocket::is_input()
 {
   return !m_is_output;
diff --git a/source/blender/blenkernel/intern/multi_function_network.cc b/source/blender/blenkernel/intern/multi_function_network.cc
index d97badf2073..b511bd3743b 100644
--- a/source/blender/blenkernel/intern/multi_function_network.cc
+++ b/source/blender/blenkernel/intern/multi_function_network.cc
@@ -1,5 +1,11 @@
+#include <sstream>
+
 #include "BKE_multi_function_network.h"
 
+extern "C" {
+void WM_clipboard_text_set(const char *buf, bool selection);
+}
+
 namespace BKE {
 
 /* MFNetwork Builder
@@ -124,6 +130,119 @@ void MFNetworkBuilder::add_link(MFBuilderOutputSocket &from, MFBuilderInputSocke
   to.m_origin = &from;
 }
 
+namespace DotExport {
+
+static std::string get_id(MFBuilderNode &node)
+{
+  std::stringstream ss;
+  ss << "\"";
+  ss << (void *)&node;
+  ss << "\"";
+  return ss.str();
+}
+
+static std::string get_id(MFBuilderSocket &socket)
+{
+  std::stringstream ss;
+  ss << "\"";
+  ss << (void *)&socket;
+  ss << "\"";
+  return ss.str();
+}
+
+static std::string port_id(MFBuilderSocket &socket)
+{
+  return get_id(socket.node()) + ":" + get_id(socket);
+}
+
+static void insert_node_table(std::stringstream &ss, MFBuilderNode &node)
+{
+  ss << "<table border=\"0\" cellspacing=\"3\">";
+
+  /* Header */
+  ss << "<tr><td colspan=\"3\" align=\"center\"><b>";
+  ss << node.name();
+  ss << "</b></td></tr>";
+
+  /* Sockets */
+  auto inputs = node.inputs();
+  auto outputs = node.outputs();
+  uint socket_max_amount = std::max(inputs.size(), outputs.size());
+  for (uint i = 0; i < socket_max_amount; i++) {
+    ss << "<tr>";
+    if (i < inputs.size()) {
+      MFBuilderInputSocket &socket = *inputs[i];
+      ss << "<td align=\"left\" port=" << get_id(socket) << ">";
+      ss << socket.name();
+      ss << "</td>";
+    }
+    else {
+      ss << "<td></td>";
+    }
+    ss << "<td></td>";
+    if (i < outputs.size()) {
+      MFBuilderOutputSocket &socket = *outputs[i];
+      ss << "<td align=\"right\" port=" << get_id(socket) << ">";
+      ss << socket.name();
+      ss << "</td>";
+    }
+    else {
+      ss << "<td></td>";
+    }
+    ss << "</tr>";
+  }
+
+  ss << "</table>";
+}
+
+static void insert_node(std::stringstream &ss, MFBuilderNode &node)
+{
+  ss << get_id(node) << " ";
+  ss << "[style=\"filled\", fillcolor=\"#FFFFFF\", shape=\"box\"";
+  ss << ", label=<";
+  insert_node_table(ss, node);
+  ss << ">]";
+}
+
+static void insert_link(std::stringstream &ss,
+                        MFBuilderOutputSocket &from,
+                        MFBuilderInputSocket &to)
+{
+  ss << port_id(from) << " -> " << port_id(to);
+}
+
+};  // namespace DotExport
+
+std::string MFNetworkBuilder::to_dot()
+{
+  std::stringstream ss;
+  ss << "digraph MyGraph {" << std::endl;
+  ss << "rankdir=LR" << std::endl;
+
+  for (MFBuilderNode *node : m_node_by_id) {
+    DotExport::insert_node(ss, *node);
+    ss << std::endl;
+  }
+
+  for (MFBuilderNode *node : m_node_by_id) {
+    for (MFBuilderInputSocket *input : node->inputs()) {
+      if (input->origin() != nullptr) {
+        DotExport::insert_link(ss, *input->origin(), *input);
+        ss << std::endl;
+      }
+    }
+  }
+
+  ss << "}\n";
+  return ss.str();
+}
+
+void MFNetworkBuilder::to_dot__clipboard()
+{
+  std::string dot = this->to_dot();
+  WM_clipboard_text_set(dot.c_str(), false);
+}
+
 /* Network
  ********************************************/
 
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 05a72ea5a6a..7880af6cc4f 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -339,6 +339,8 @@ class VTreeMFNetworkBuilder {
 
   std::unique_ptr<VTreeMFNetwork> build()
   {
+    // m_builder->to_dot__clipboard();
+
     Array<int> socket_ids(m_vtree.socket_count(), -1);
     for (uint vsocket_id = 0; vsocket_id < m_vtree.socket_count(); vsocket_id++) {
       MFBuilderSocket *builder_socket = m_socket_map[vsocket_id];



More information about the Bf-blender-cvs mailing list