viernes, 6 de julio de 2012

Usar Graphviz desde Java


Graphviz es una herramienta que agrupa varios programas que generan distintos tipos de grafos a partir de archivos con un lenguaje definido. o tambien a travez de una api. (ejemplo de uso de graphviz desde C# para dibujar árbol binario, ejemplo de graphviz para dibujar un arbol B)

primero te descargas el paquete de graphviz y lo instalas
http://www.graphviz.org/Download_windows.php 

eso crea en archivos de programa una carpeta

C:\Archivos de programa\Graphviz 2.28\bin

ahi estan los ejecutables que nos interesan, en este caso por lo que planteas vamos a usar dot.exe que es para dibujar grafos dirigidos jerarquicos.

algo mas del lenguaje dot

http://www.graphviz.org/Documentation/dotguide.pdf

un ejemplo de grafo simple

grafo1.txt

Código:
digraph G
{
    node1;
    node2;
    node3;

    node1 -> node2 [label="linea1"];
    node1 -> node3 [label="linea2"];
    node2 -> node3 [label="linea3"];
}







otro mas

grafo2.txt
Código: 
digraph G
{
    main->parse->execute
    main->init;
    main->cleanup;
    execute->make_string;
    execute->printf
    init->make_string;
    main->printf;
    execute->compare;
}







ahora para generar un jpg a partir de estos codigos, digamos que tenes dos archivos. grafo1.txt y grafo2.txt

se debe invocar en la consola el siguiente comando

Código: 
...path_de_dot...\dot.exe -Tjpg archivo_de_entrada -o archivo_de_salida
a lo mas concreto para nuestros archivos de prueba

Código:
C:\Archivos de programa\Graphviz 2.28\bin\dot.exe -Tjpg grafo1.txt -o grafo1.jpg

y

Código: 
C:\Archivos de programa\Graphviz 2.21\bin\dot.exe -Tjpg grafo2.txt -o grafo2.jpg
ahora para hacer esto desde java. vas a tener que generar el texto que representa el grafo para luego invocar a dot.exe desde java y que te genere el jpg y luego jalar el jpg y mostrarlo en java. (esto es solo una forma, si conseguis el api de graphviz para java, mejor pero ya es otro metodo)

lo que vas a hacer para invocar la generacion es usar Runtime.getRuntime().exec() de java para invocar a dot.exe y mandarle los parametros de tus archivos que queres pasar a jpg.

Código: 






public class Main {
  public static void main(String[] args) {
    System.out.println("Hola Mundo");
    try {
      
      String dotPath = "c:\\Archivos de programa\\Graphviz 2.28\\bin\\dot.exe";
      
      String fileInputPath = "c:\\grafo1.txt";
      String fileOutputPath = "c:\\grafo1.jpg";
      
      String tParam = "-Tjpg";
      String tOParam = "-o";
        
      String[] cmd = new String[5];
      cmd[0] = dotPath;
      cmd[1] = tParam;
      cmd[2] = fileInputPath;
      cmd[3] = tOParam;
      cmd[4] = fileOutputPath;
                  
      Runtime rt = Runtime.getRuntime();
      
      rt.exec( cmd );
      
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
    }

  }
}


Solo tenes que ver donde generas tus archivos de texto para representar los grafos, y luego invocar a dot y que te genere los jpgs. ya de ahi usas los jpgs donde sea necesario...

otros links de referencia

http://java.sun.com/developer/JDCTechTips/2003/tt0304.html

http://blog.taragana.com/index.php/archive/java-runtimeexec-guide/es/

http://www.ibm.com/developerworks/library/l-graphvis/