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へ

2 Responses to “iDotメモ3(データファイルのロード)”

  1. Furthermore, please check with the practitioner the areas where you accumulate
    one of the most muscle tension and stress. Another theorist, Vladimir Bekterev coined in the term “reflexology long ago in 1917. Clients who’re perhaps having a difficult time to get a good sleep at the end with the day or the ones that are being bothered with indigestion or another digestive system problems.

    Have a look at my webpage homedics shiatsu massager with heat

  2. first dating より:

    You’ve been single and unattached for quite a while now and also you wonder why there’s just no blossoming romance happening to you when you’ve tiresomely frequented lots of bars
    (or wherever single women or men gather) trying to bump into the next boyfriend or girlfriend.
    Men can join an online dating sites site with some few corresponding fees
    and infrequently for free. She’s dealt with her great amount of hushed name-calling
    and bitter searches for years.

    Also visit my web page … first dating

Leave a Reply

CAPTCHA