iDotメモ3(データファイルのロード)

iDot起動または、ツールバーの「Open」ボタンのクリックでファイルのロード処理が起動する。

idot.iDotクラス


/**
* Tries to load the state diagram from the specified file. The file
* is assumed to be in DOT format.
* After the file is loaded, a layout operation (using DOT) is attempted.
*
* @param graphFile
* @return true, if the file was loaded successfully and the laying out
* the graph using DOT completed without errors
*/

protected boolean loadFile(File graphFile) {
  boolean fileLoaded = false;
  try {
    BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(graphFile)));
    long size = graphFile.length();
    if(size > 1024*1024)
      throw new IOException(“File too big (> 1 MB): ” + graphFile);
    StringBuilder sb = new StringBuilder((int) size);
    String line;
    do {
      line = br.readLine();
      if(line != null) {
        sb.append(line).append(‘\n’);
      }
    } while(line != null);
    display.setDotFileContents(sb.toString());
    saveFile = graphFile;
    graphState = null;
    if (Config.print)
      System.out.println(“opened ” + graphFile.getName());
      display.runDOTLayout();//①
    updateTitle();
    fileLoaded = true;
  } catch ( Exception ex ) {
    JOptionPane.showMessageDialog(
      display,
      ”Sorry, an error occurred while loading the graph.\n” +
      ”(“+ ex.getLocalizedMessage() + “)”,
      ”Error Loading Graph”,
      JOptionPane.ERROR_MESSAGE);
    ex.printStackTrace();
  }
  return fileLoaded;
}

①idot.DotDisplayクラスのrunDOTLayout()メソッドをコール

idot.DotDisplayクラス

/**
* Tries to perform the layout of the current graph by executing DOT
* with the current graph content (in DOT format) as input.
* If DOT is executed succesfully, the graph is lo9aded
*/

protected void runDOTLayout() {
  Graph g = null;
  try {
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    ProcessBuilder pb = new ProcessBuilder(dotCommand);//②
    /* If dot gives a lot of warnings the error stream
    * may get full which hangs the program –> have to empty
    * it somehow.
    * Reading it through getErrorStream() would require
    * some extra effort.
    */

    pb.redirectErrorStream(true);
    Process p = pb.start();
    OutputStream os = new BufferedOutputStream(p.getOutputStream());
    InputStream is = new BufferedInputStream(p.getInputStream());
    // pipe graph to dot
    os.write(getDotFileContents().getBytes());
//③
    // dot will only close after getting EOF
    os.close();
    // pipe output to graph layout
    g = dotReader.loadGraph(is);//④
    p.waitFor();
    if(p.exitValue() != 0) {
      System.err.println(“Process ” + dotCommand + ” exited with value ” + p.exitValue());
      throw new IOException(“DOT exit value: ” + p.exitValue());
    }
    setGraph(g);//⑤
  } catch ( Exception ex ) {
    JOptionPane.showMessageDialog(
      this,
      ”Sorry, an error occurred while running DOT.\n” +
      ”(“+ ex.getLocalizedMessage() + “)”,
      ”Error Running DOT”,
      JOptionPane.ERROR_MESSAGE);
    ex.printStackTrace();

    setCursor(Cursor.getDefaultCursor());
  }
}

//**
* Sets the graph shown on this display.
*
* @param g
*/

public void setGraph(Graph g) {
  // update graph
  m_vis.removeGroup(GRAPH_GROUP);
  m_vis.addGraph(GRAPH_GROUP, g);//⑥

  // create data description of labels, setting colors, fonts ahead of time
  Schema edgeLabelSchema = createEdgeLabelSchema();

  m_vis.removeGroup(“edgeLabels”);
  explicitHide((Graph) m_vis.getVisualGroup(GRAPH_GROUP));

  m_vis.addDecorators(“edgeLabels”, GRAPH_EDGES, null, edgeLabelSchema);//⑦

  runFilterUpdate();
  runLayout();//⑧
}

②別プロセスを起動するためProcessBuilderオブジェクトを作成。String配列のdotCommandは{“bin\dot”,”-Tdot”}となっている。
③読み込んだファイルのデータを、別プロセスのアウトプットストリームに書き込む。
この別プロセスでは、nodeの位置決めとedgeの曲線を計算しているようだ。
④idot.util.DotFileReaderクラスのloadGraphメソッドをコールして、prefuse.data.Graphオブジェクトにデータを読み込む。
⑤setGraph()メソッドをコール
⑥prefuse.VisualizationオブジェクトにGraphオブジェクトをGRAPH_GROUPという名前で登録する。
GraphオブジェクトをVisualizationに登録すると自動的にprefuse.visual.VisualGraphオブジェクトが作られる。
VisualGraphオブジェクトは、Graphオブジェクトが持つデータの他、可視化(表示)のために必要な情報(座標、色、サイズなど)を持っている。
⑦edgeのラベル用にDecoratorを登録。Decoratorを登録すると既存のvisual data group(この場合は、GRAPH_EDGESという名前のグループ)に新たなコントロールを追加することができるようになるようだ。具体的には、edgeラベルの表示に使われる。
⑧レイアウトを実行する。レイアウト処理は、idot.DotLayoutクラスに実装されている。

iDotメモ2へ

Leave a Reply

CAPTCHA