From 2cb4e4f940a852150fd61b097ae4c2ab86ae9ffc Mon Sep 17 00:00:00 2001 From: koray kavukcuoglu Date: Thu, 18 Jun 2015 10:46:46 +0100 Subject: use graphviz lib interface instead of dumping dot file --- graphviz.lua | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/graphviz.lua b/graphviz.lua index b549696..4d7ed69 100644 --- a/graphviz.lua +++ b/graphviz.lua @@ -88,7 +88,7 @@ where `n` is the number of nodes in the graph. Coordinates are in the interval [0, 1]. ]] -function graph.graphvizLayout(g, algorithm) +function graph.graphvizLayout(g, algorithm, fname) if not graphvizOk or not cgraphOk then error("graphviz library could not be loaded.") end @@ -98,7 +98,9 @@ function graph.graphvizLayout(g, algorithm) local algorithm = algorithm or "dot" assert(0 == graphviz.gvLayout(context, graphvizGraph, algorithm), "graphviz layout failed") - assert(0 == graphviz.gvRender(context, graphvizGraph, algorithm, nil), + -- the algorithm that is passed is a loyout algorithm not a rendering + -- format, which is typically like png, svg or dot + assert(0 == graphviz.gvRender(context, graphvizGraph, 'dot', nil), "graphviz render failed") -- Extract bounding box. @@ -117,6 +119,19 @@ function graph.graphvizLayout(g, algorithm) positions[id][2] = y end + -- if a file name is given, then render to that file + if fname then + local context = graphviz.gvContext() + local graphvizGraph = cgraph.agmemread(g:todot()) + assert(0 == graphviz.gvLayout(context, graphvizGraph, algorithm), + "graphviz layout failed") + assert(0 == graphviz.gvRender(context, graphvizGraph, 'svg', io.open(fname .. '.svg','w')), + "graphviz render failed") + graphviz.gvFreeLayout(context, graphvizGraph) + cgraph.agclose(graphvizGraph) + graphviz.gvFreeContext(context) + end + -- Clean up. graphviz.gvFreeLayout(context, graphvizGraph) cgraph.agclose(graphvizGraph) @@ -126,20 +141,15 @@ end function graph.dot(g,title,fname) - local gv = g:todot(title) - local fngv = (fname or os.tmpname()) .. '.dot' - local fgv = io.open(fngv,'w') - fgv:write(gv) - fgv:close() - local fnsvg = (fname or os.tmpname()) .. '.svg' - os.execute('dot -Tsvg -o ' .. fnsvg .. ' ' .. fngv) - if not fname then + local qt_display = fname == nil + fname = fname or os.tmpname() + local fnsvg = fname .. '.svg' + graph.graphvizLayout(g, 'dot', fname) + if qt_display then require 'qtsvg' - local qs = qt.QSvgWidget(fnsvg) + local qs = qt.QSvgWidget(fname .. '.svg') qs:show() - os.remove(fngv) os.remove(fnsvg) - -- print(fngv,fnpng) return qs end end -- cgit v1.2.3