diff options
author | koray kavukcuoglu <koray@kavukcuoglu.org> | 2015-06-18 12:46:46 +0300 |
---|---|---|
committer | koray kavukcuoglu <koray@kavukcuoglu.org> | 2015-06-18 12:46:46 +0300 |
commit | 2cb4e4f940a852150fd61b097ae4c2ab86ae9ffc (patch) | |
tree | e84c66f868e93124795afde0820f4211108c6ef7 | |
parent | fbf41c34f41ce4487fa732b8d5ec19d37fefcac1 (diff) |
use graphviz lib interface instead of dumping dot file
-rw-r--r-- | graphviz.lua | 36 |
1 files 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 |