diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /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); + } + } + } + +} |