#はじめに
例えばセンサーなどから、定期的に取得する情報をグラフに表示して、一定区間をスクロールさせて流すといったもので、簡易的なものがほしかたったので、こんな方法を取ったというものです。
色々ともっと良い方法があるかもしれませんが・・・
C#でWindowsフォームアプリケーション(.NET Framework)で作成します。
※最近記事を書いていなくて、ちょっとこんな感じのことをしたので何となく投稿したと言うのもあります
#内容
3つのデータがCSV形式で出力されるログファイルを監視し、グラフに出力する
#Chartの設定でやったこと
- ツールボックスのデータから
Chart
をフォームにドロップ - 凡例が邪魔だったので、プロパティの
グラフ
-Legends
-(コレクション)
を開いて、メンバーを削除 - 系列を増やして、グラフの種類などを変更するため、
グラフ
-Series
-(コレクション)
を開いて、メンバーを2つ追加 - 各系列のプロパティについて、
(グラフ)
-ChartType
よりLine
を選択(折れ線グラフとするため)、また(外観)
-BorderWidth
で線の太さを変更し、Color
で色を変更
#ソースコード
ログの読み込みは次の記事より
C#で簡易ログビューワーの作成 - とりあえずこれでいいんじゃない? - Qiita
int cnt = 0; //変数である必要は無い(Qiitaでのコメントを頂いた事で発覚)
private void FileReaded(object sender, ReadedEventArgs e)
{
if (e.Text.Length == 0)
return;
//グラフ作成
foreach (string s in e.Text.Split(new string[] { "\r\n" }, StringSplitOptions.None))
{
string[] data = s.Split(',');
if (chart1.Series[0].Points.Count <= 100)
{
chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
}
else
{
for (int i = 1; i <= 100; i++)
{
chart1.Series[0].Points[i-1].YValues = chart1.Series[0].Points[i].YValues;
chart1.Series[1].Points[i-1].YValues = chart1.Series[1].Points[i].YValues;
chart1.Series[2].Points[i-1].YValues = chart1.Series[2].Points[i].YValues;
}
chart1.Series[0].Points.RemoveAt(100);
chart1.Series[1].Points.RemoveAt(100);
chart1.Series[2].Points.RemoveAt(100);
chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
}
}
textBox1.Text += e.Text;
textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();
}
100件まではそのままChart
に追加して、100件を超える場合、一つずつ左にずらし、100件目を削除して、追加するといった事をしています。
ログが更新されればスクロールされていきます。
以上