package com.imegumii; import guru.nidi.graphviz.engine.Format; import guru.nidi.graphviz.engine.Graphviz; import guru.nidi.graphviz.model.Label; import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.model.Node; import guru.nidi.graphviz.parse.Parser; import java.io.*; import static guru.nidi.graphviz.model.Factory.graph; import static guru.nidi.graphviz.model.Factory.node; /** * Created by kenny on 18-5-2017. */ public class Graph { public static String generateGraphString(Automata a) { String text = "digraph finite_state_machine {\nrankdir=LR;\nsize=\"8,5\";\n"; if(a.eindStates.size() > 0) { text += "node [shape=cirlce, peripheries=2];"; for (String s : a.eindStates) { text += "\"" + s + "\" "; } text += ";"; } if(a.beginStates.size() > 0) { text += "\nnode [shape = point];\n"; for (String s : a.beginStates) { text += "\" \" -> \"" + s + "\" [label = \" \"];"; } } text += "\nnode [shape = circle];\n"; for(Transition t : a.transistions) { String s = ""; if(t.symbol == Transition.EPSILON) s = "$"; else s = t.symbol + ""; text += "\"" + t.vanState + "\" -> \"" + t.naarState + "\" [ label = \"" + s + "\"];\n"; } text += "}"; return text; } public static String generateImageString(Automata a) { String text = "digraph {\nrankdir=LR;\n"; if(a.eindStates.size() > 0) { for (String s : a.eindStates) { text += "\"" + s + "\" [peripheries=2]\n"; } } if(a.beginStates.size() > 0) { text += "\nstart [shape = point];\n"; for (String s : a.beginStates) { text += "\"start\" -> \"" + s + "\" [label = \" \", color=aquamarine4];"; } } for(Transition t : a.transistions) { String s = ""; if(t.symbol == Transition.EPSILON) s = "$"; else s = t.symbol + ""; text += "\"" + t.vanState + "\" -> \"" + t.naarState + "\" [ label = \"" + s + "\"];\n"; } text += "}"; return text; } public static synchronized File generateImage(Automata a) { return generateImage(a, null); } public static synchronized File generateImage(Automata a, String fileName) { File f; if (fileName != null) { f = new File("images/" + fileName + ".png"); } else { f = new File("images/" + a.hashCode() + ".png"); } try { MutableGraph g = Parser.read(Graph.generateImageString(a)); Graphviz.fromGraph(g).width(Math.max(a.states.size() * 150, 750)).render(Format.PNG).toFile(f); } catch (IOException e) { e.printStackTrace(); } return f; } }