VCSSLによる制御・自動処理

リニアングラフ2Dは、プログラミング言語VCSSLによる制御をサポートしています。 うまく活用すると、連番ファイルを自動処理でプロットさせたり、読み込んだデータを変換(加工)してプロットさせる事などができます。

- 目次 -

VCSSLについて

VCSSLは、日常計算から3次元コンピューターグラフィックスまでを幅広くカバーするプログラミング言語です。C言語系のシンプルな文法を採用しており、容易に習得する事ができます。

プログラミング言語 VCSSL 公式サイト
https://www.vcssl.org/ja-jp/
ダウンロードページ
https://www.vcssl.org/ja-jp/download/

VCSSLのランタイムは、リニアングラフ2Dに同梱されており、リニアングラフ2Dの「 プログラム / Program 」メニューから手軽に利用する事ができます。

プログラムの作成と実行

VCSSLはスクリプト言語なので、プログラムは一般のテキストエディタで記述し、拡張子「.vcssl」を付けて保存するだけで作成できます。 作ったプログラムは、リニアングラフ2Dのメニューバーにある、「 プログラム / Program 」 メニューから選択実行できます。

なお、便利なプログラムを作成した場合、「 RinearnGraph2DProgram 」フォルダに入れておくと、 「 プログラム / Program 」メニューに表示され、すぐに実行できるようになります。

Graph2D API について

VCSSLからリニアングラフ2Dを制御するには、tool.Graph2D APIを使用します。 ここではGraph2D APIの一部の機能のみを使用します。全機能を参照するには、下記URLをご参照ください。

tool.Graph2D API 詳細仕様
https://www.vcssl.org/ja-jp/lib/tool/Graph2D

プログラム例

ファイルをプロットする

以下は座標値データファイル「 test.tsv 」をプロットする、最も単純なプログラムです。 なお、「//」で始まる行はコメントであり、処理の際には読み飛ばされます。


//リニアングラフ2Dを制御するライブラリをインポート
import tool.Graph2D;

//リニアングラフ2Dを起動( x位置, y位置, 幅, 高さ, タイトル )
int graph = newGraph2D( 0, 0, 700, 700, "Graph" ) ;

//座標値データファイル「 test.tsv 」をプロットする
setGraph2DFile( graph, "test.tsv" );
code/Launch.vcssl

線プロットオプションを設定する

続いて、点プロットオプションを無効にし、線プロットオプションのみを有効にするプログラムです。


import tool.Graph2D;

int graph = newGraph2D( 0, 0, 700, 700, "Graph" ) ;
setGraph2DFile( graph, "test.tsv" );

//点プロットを無効にする
setGraph2DOption( graph, "WITH_POINTS", false );

//線プロットを有効にする
setGraph2DOption( graph, "WITH_LINES", true );
code/Option.vcssl

グラフを画像ファイルに出力する

以下はグラフを画像ファイル「test.png」に出力するプログラムです。


import tool.Graph2D;

int graph = newGraph2D( 0, 0, 700, 700, "Graph" ) ;

setGraph2DFile( graph, "test.tsv" );

//グラフを画像ファイル「 test.png 」に出力( グラフID, 画像ファイル名, 画像形式 )
exportGraph2D( graph, "test.png", "PNG" );
code/Export.vcssl

連番の座標値データファイルを次々とプロットし、連番の画像ファイルに出力する

続いて応用です。VCSSLプログラムから見て「test」フォルダの中にある、連番の座標値データファイル「test0.tsv」〜「test100.tsv」を次々とプロットし、 画像ファイル「test0.png」〜「test100.png」に出力していくプログラムです。


import tool.Graph2D;

int graph = newGraph2D( 0, 0, 700, 700, "Graph" ) ;

//変数iを1から100まで変更しながらループ
for( int i=0; i<=100; i++ ){

  setGraph2DFile( graph, "./test/test"+i+".tsv" );
  exportGraph2D( graph, "./test/test" + i + ".png", "PNG" );

  //100ミリ秒スリープ(アニメーションウェイト)
  sleep( 100 );

}
code/Serial.vcssl

座標値データファイルを読み込み、値を変換してプロットする

最後に、座標値データファイル「test.tsv」を読み込み、Y値をsin( Y値 )に変換した上でプロットするプログラムです。最初に、「test.tsv」が空白改行を含む場合を扱います。


import tool.Graph2D;
import Math;

// 座標値データファイル「test.tsv」を、TSV形式の読み込みモードで開く
int file = open( "test.tsv", READ_TSV );

// ファイル行数を取得
int lineN = countln( file );

double value[]; // 1行のX、Y値を控える数値配列
string newData = ""; // 新しいデータを控える文字列変数

for( int i=0; i<lineN; i++ ){
  value = readln( file );  //1行のデータを配列で取得し、次の行へ
  if( length(value,0) == 0 ){
    //空白行はそのまま改行 (EOLはシステムによって定義されている改行コード値)
    newData += EOL;
  }else{
    //空白でない行はY値をsin(Y値)に変換して書き出し、改行
    newData += value[0] + "	" + sin( value[1] ) + EOL;
  }
}

//ファイルアクセスを閉じる
close( file );

int graph = newGraph2D( 0, 0, 700, 700, "Graph" );

//変換後の文字列データからグラフにプロット
setGraph2DData( graph, newData );
code/Transform.vcssl

上述のプログラムは、文字列の結合処理を伴うために低速です。test.tsvが空白改行を含まない場合は、以下のように数値の配列を直接リニアングラフ2Dへ転送する方が、はるかに高速です。


import tool.Graph2D;
import Math; //sin新関数を使用するのに必要

// 座標値データファイル「test.tsv」を、TSV形式の読み込みモードで開く
int file = open( "test.tsv", READ_TSV );

// ファイル行数を取得
int lineN = countln( file );

double value[ ]; // 1行のX、Y、Z値を控える数値配列

double x[lineN]; // 全行のX値を控える数値配列
double y[lineN]; // 全行のX値を控える数値配列

for( int i=0; i<lineN; i++ ){

  //1行のデータを配列で取得し、次の行へ
  value = readln( file );
  x[i] = value[0];
  y[i] = sin( value[1] ); // Y値はsin(Y値)に変換

}

//ファイルアクセスを閉じる
close( file );

int graph = newGraph2D( 0, 0, 700, 700, "Graph" );

//変換後の数値データ配列からグラフにプロット
setGraph2DData( graph, x, y );
code/TransformFast.vcssl

今度の処理は非常に高速で、起動とほぼ同時に変換が完了します。