[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