summaryrefslogtreecommitdiff
path: root/graphics/pgf/base/source/InterfaceFromOGDF.c++
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pgf/base/source/InterfaceFromOGDF.c++
Initial commit
Diffstat (limited to 'graphics/pgf/base/source/InterfaceFromOGDF.c++')
-rw-r--r--graphics/pgf/base/source/InterfaceFromOGDF.c++105
1 files changed, 105 insertions, 0 deletions
diff --git a/graphics/pgf/base/source/InterfaceFromOGDF.c++ b/graphics/pgf/base/source/InterfaceFromOGDF.c++
new file mode 100644
index 0000000000..248ee0b19e
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromOGDF.c++
@@ -0,0 +1,105 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+#include <ogdf/basic/geometry.h>
+
+
+using namespace ogdf;
+
+namespace scripting {
+
+
+ void ogdf_runner::bridge ()
+ {
+ graph = Graph();
+ graph_attributes = GraphAttributes (graph,
+ GraphAttributes::nodeGraphics |
+ GraphAttributes::edgeGraphics |
+ GraphAttributes::nodeLevel |
+ GraphAttributes::edgeIntWeight |
+ GraphAttributes::edgeDoubleWeight |
+ GraphAttributes::nodeWeight);
+
+ pgfgd_SyntacticDigraph* g = parameters->syntactic_digraph;
+
+ int n = g->vertices.length;
+ int m = g->syntactic_edges.length;
+
+ node* nodes = new node [n];
+
+ for (int i=0; i < n; i++) {
+ nodes[i] = graph.newNode();
+
+ // Compute width and height
+ double x1, x2,y1,y2;
+ x1 = x2 = y1 = y2 = 0;
+
+ int first = 1;
+
+ pgfgd_Path* path = g->vertices.array[i]->path;
+
+ for (int j = 1; j < path->length; j++)
+ if (!path->strings[j]) {
+ double x = path->coordinates[j].x;
+ double y = path->coordinates[j].y;
+
+ if (first) {
+ x1 = x2 = x;
+ y1 = y2 = y;
+ first = 0;
+ } else {
+ x1 = x < x1 ? x : x1;
+ x2 = x > x2 ? x : x2;
+ y1 = y < y1 ? y : y1;
+ y2 = y > y2 ? y : y2;
+ }
+ }
+
+ graph_attributes.width(nodes[i]) = x2-x1;
+ graph_attributes.height(nodes[i]) = y2-y1;
+ }
+
+ for (int i=0; i < m; i++) {
+ int tail = g->syntactic_edges.array[i]->tail->array_index;
+ int head = g->syntactic_edges.array[i]->head->array_index;
+
+ graph.newEdge(nodes[tail], nodes[head]);
+ }
+ }
+
+ void ogdf_runner::unbridge ()
+ {
+ pgfgd_SyntacticDigraph* g = parameters->syntactic_digraph;
+
+ node v;
+ int i;
+ for (i = 0, v = graph.firstNode(); v; v=v->succ(), i++) {
+ g->vertices.array[i]->pos.x = graph_attributes.x(v);
+ g->vertices.array[i]->pos.y = graph_attributes.y(v);
+ }
+
+ edge e;
+ for (i = 0, e = graph.firstEdge(); e; e=e->succ(), i++) {
+ pgfgd_Edge* ed = g->syntactic_edges.array[i];
+
+ DPolyline bend = graph_attributes.bends(e);
+
+ if (bend.begin().valid()) {
+ bend.unify();
+ bend.normalize();
+
+ // We start with a moveto:
+ pgfgd_path_clear (ed);
+
+ pgfgd_path_append_moveto_tail(ed);
+
+ for (List<DPoint>::iterator it = bend.begin(); it.valid(); it++)
+ pgfgd_path_append_lineto(ed, (*it).m_x, (*it).m_y);
+
+ // We end with a lineto:
+ pgfgd_path_append_lineto_head(ed);
+ }
+ }
+ }
+
+}