Plotter.java

/*
 * Created on 2008/12/05
 * Copyright (C) 2008 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.mklab.nfc.matrix.DoubleMatrix;


/**
 * グラフを描画するためのクラスです。
 * 
 * @author koga
 * @version $Revision$, 2008/12/05
 */
public abstract class Plotter {

  /** 線の番号 */
  protected Map<SystemInputOutputKey, Integer> lineNumbers;
  /** 線の名前 */
  protected Map<SystemInputOutputKey, String> lineNames;
  /** 選択可能な色の数 */
  protected int colorSize = 6;

  /**
   * グラフの線の名前を設定します。
   * 
   * @param lineNumber 線の番号
   * @param name 線の名前
   */
  public abstract void setGraphLineName(final int lineNumber, final String name);

  /**
   * 線の名前を返します。
   * 
   * @param lineNumber 線の番号
   * @return 線の名前
   */
  public abstract String getGraphLineName(final int lineNumber);

  /**
   * 線の表示・非表示を設定します。
   * 
   * @param lineNumber 線の番号
   * @param visible 線の表示・非表示
   */
  public abstract void setGraphLineVisible(final int lineNumber, final boolean visible);

  /**
   * 線の表示・非表示を返します。
   * 
   * @param lineNumber 線の番号
   * @return 線の表示・非表示
   */
  public abstract boolean isGraphLineVisible(final int lineNumber);

  /**
   * 線のタイプ(色)を設定します。
   * 
   * @param lineNumber 線の番号
   * @param type 線のタイプ(色)
   */
  public abstract void setGraphLineType(final int lineNumber, final int type);

  /**
   * 線のタイプを返します。
   * 
   * @param lineNumber 線の番号
   * @return 線のタイプ
   */
  public abstract int getGraphLineType(final int lineNumber);

  /**
   * 線の幅を設定します。
   * 
   * @param lineNumber 線の番号
   * @param width 線の幅
   */
  public abstract void setGraphLineWidth(final int lineNumber, final int width);

  /**
   * 線の幅を返します。
   * 
   * @param lineNumber 線の番号
   * @return 線の幅
   */
  public abstract int getGraphLineWidth(final int lineNumber);

  /**
   * フォントの大きさを設定します。
   * 
   * @param fontSize フォントの大きさ
   */
  public abstract void setGraphFontSize(final int fontSize);

  /**
   * フォントの大きさを返します。
   * 
   * @return フォントの大きさ
   */
  public abstract int getGraphFontSize();

  /**
   * 線の名前を設定します。
   * 
   * @param key システムの入出力番号キー
   * @param name 線の名前
   */
  public void setLineName(SystemInputOutputKey key, final String name) {
    this.lineNames.put(key, name);
    setGraphLineName(this.lineNumbers.get(key).intValue(), name);
  }

  /**
   * 線の表示・非表示を設定します。
   * 
   * @param key システムの入出力番号キー
   * @param visible 線の表示・非表示
   */
  public void setLineVisible(SystemInputOutputKey key, final boolean visible) {
    setGraphLineVisible(this.lineNumbers.get(key).intValue(), visible);
  }

  /**
   * 線のタイプ(色)を設定します。
   * 
   * @param key システムの入出力番号キー
   * @param type 線のタイプ(色)
   */
  public void setLineType(SystemInputOutputKey key, final int type) {
    setGraphLineType(this.lineNumbers.get(key).intValue(), type);
  }

  /**
   * 線の幅を設定します。
   * 
   * @param key システムの入出力番号キー
   * @param width 線の幅
   */
  public void setLineWidth(SystemInputOutputKey key, final int width) {
    setGraphLineWidth(this.lineNumbers.get(key).intValue(), width);
  }

  /**
   * 線の幅を返します。
   * 
   * @param key システムの入出力番号キー
   * @return 線の幅
   */
  public int getLineWidth(SystemInputOutputKey key) {
    return getGraphLineWidth(this.lineNumbers.get(key).intValue());
  }

  /**
   * 線のタイプを返します。
   * 
   * @param key システムの入出力番号キー
   * @return 線のタイプ
   */
  public int getLineType(SystemInputOutputKey key) {
    return getGraphLineType(this.lineNumbers.get(key).intValue());
  }

  /**
   * 線の表示・非表示を返します。
   * 
   * @param key システムの入出力番号キー
   * @return 線の表示・非表示
   */
  public boolean isLineVisible(SystemInputOutputKey key) {
    return isGraphLineVisible(this.lineNumbers.get(key).intValue());
  }

  /**
   * 線の名前を返します。
   * 
   * @param key システムの入出力番号キー
   * @return 線の名前
   */
  public String getLineName(SystemInputOutputKey key) {
    return getGraphLineName(this.lineNumbers.get(key).intValue());
  }

  /**
   * システムの入出力番号キーのリストを返します。
   * 
   * @return システムの入出力番号キーのリスト
   */
  public List<SystemInputOutputKey> getKeyList() {
    return new ArrayList<>(this.lineNumbers.keySet());
  }

  /**
   * 線のタイプ(色)の初期を行います。
   */
  public void initializeLineTypes() {
    int colorCount = 0;
    for (final SystemInputOutputKey key : getKeyList()) {
      setLineType(key, colorCount++ % this.colorSize);
    }
  }

  /**
   * フォントの大きさを設定します。
   * 
   * @param fontSize フォントの大きさ
   */
  public void setFontSize(final int fontSize) {
    setGraphFontSize(fontSize);
  }

  /**
   * フォントの大きさを返します。
   * 
   * @return フォントの大きさ
   */
  public int getFontSize() {
    return getGraphFontSize();
  }

  /**
   * 線の名前とタイプ(色)を設定します。
   * 
   * @param magnitudes 大きさと位相のリスト
   */
  public void setupLineNameAndType(final List<DoubleMatrix> magnitudes) {
    this.lineNames = new TreeMap<>();
    this.lineNumbers = new TreeMap<>();

    int inputNumber = 1;
    int lineNumber = 1;

    for (final DoubleMatrix magnitudeColumn : magnitudes) {
      for (int outputNumber = 1; outputNumber <= magnitudeColumn.getRowSize(); outputNumber++) {
        final DoubleMatrix magnitude = magnitudeColumn.getRowVector(outputNumber);

        if (magnitude.isZero()) {
          continue;
        }

        final SystemInputOutputKey key = new SystemInputOutputKey(inputNumber, outputNumber);
        this.lineNames.put(key, "G(" + outputNumber + "," + inputNumber + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        this.lineNumbers.put(key, Integer.valueOf(lineNumber++));
      }

      inputNumber++;
    }
  }
}