【VB.NET】リアルタイムグラフBitmap展開<その2カーソルと拡大縮小>

リアルタイムグラフのBITMAP展開の目的は、測定直後にデータ処理を行って測定の可否を判断したいことです。

●その1では、bitmapにデータを書き込んでから時々刻々と切り取ってグラフ表示する基本機能を開発しました。【遅いPCだとノウハウが必要です】

その2では、測定したリアルタイムグラフを、波形検索したりX軸、Y軸を拡大する機能、カーソルで値を読み取る機能です。【Bitmapを5枚ほど使って切った貼ったで処理します】

●その3では、カーソル指定のデータに計算処理を行ってDataGridViewに整理してcsvファイルの保存するところまでやります。

●その2で追加した機能

機能1:カーソル機能
マウスの右、左クリックで二本のカーソルを置くことができます。
カーソル用Bitmapに書き込んであるため、
①時間軸をスクロールしてもカーソルが移動して、絶対位置を維持します。

②時間軸を拡大縮小してもカーソルが追従します。

機能2:リアルタイムグラフの拡大、縮小、移動
①X軸(時間軸)の処理
g.DrawImage(cursorBitmap, desRect, srcRect, GraphicsUnit.Pixel)
を駆使して、srcRectで大きな範囲を指定して、desRectに縮小することで
時間軸を長くとれるようにしました。設定は、グラフ下部のXscaleコンボボックスで
1,2,3,4,5,6,7,8,9,10倍まで長くとれるようにしました。波形全体を見たい時に便利です

②Y軸(電圧軸)の処理
Y軸の拡大は、上記DrawImageを使うと電圧精度が1mV以下の桁まで拡大できなくなるの
で、DrawImageを使わないで、生データに拡大係数を掛け算することにしました。
py0 = System.Math.Abs(Int(arr1(0) – ave0)) * yScale + vSy ‘ vSyがY軸拡大率 arr1生データ

③y軸のオフセット移動
ゼロ点をVScrollBarで移動できるようにしました。
※VScrollBarがツールボックスにみあたらない場合
ツールボックス内で右クリックしてアイテムの選択で.NETframeworkコンポーネントの
タブ内に膨大なコンポーネントがあるので、VScrollBarをみつけてチェックをいれると
右クリックした場所のタブ内に追加されて使えるようになります。

ーーーーーカーソル描画Bitmap処理の備忘録ーーーーーーーーーーーーーーーー
6個もBitmapを作って管理しないといけないので、勘違いが発生するので、備忘録しておきます。
●マウスから座標を得る おなじみDOBONネット様のリンクです。感謝です。
マウスポインタの位置を取得、変更(移動)する
上記LINKから下記赤字行をまるごとコピペさせていただきました。

Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick

……… ……..
…………

‘フォーム上の座標でマウスポインタの位置を取得する
‘画面座標でマウスポインタの位置を取得する
Dim sp As System.Drawing.Point = System.Windows.Forms.Cursor.Position
‘画面座標をクライアント座標に変換する
Dim cp As System.Drawing.Point = Me.PointToClient(sp)
‘X座標を取得する
Dim x As Integer = cp.X
‘Y座標を取得する
Dim y As Integer = cp.Y

…….

…….

End Sub

フォーム上の座標から、PictureBox.leftの座標を求める計算をします。
マウスのPictureBoxのX座標cRx,cLx

If e.Button = MouseButtons.Right Then ‘右ボタンクリック

cRflag += 1
cRx_1 = cRx
cRx = cp.X – PictureBox1.Left
…….

End If
If e.Button = MouseButtons.Left Then’左ボタンクリック
cLflag += 1
cLx_1 = cLx
cLx = cp.X – PictureBox1.Left

……..

End If

 

●カーソル処理の基本的な考え方
0:PictureBox1は、リアルタイムグラフ用、PictureBox2は、重心位置表示用グラフ
1:ログした全データは、longBitmapに記録
2:リアルタイム表示用には、sourceBitmapとtrimmedBitamapで切取りながら使いまわします。
3:カーソル処理用にcursorBitmapをlongBitmapからコピーして使いまわします。
cursorBitmapを切り取って表示するためにctrimBitmapを使ってます。

①使っているBitmap

②リアルタイムグラフでのBitmapの使い方
青が全データを記録しているlongBitmapです。
緑がリアルタイム処理用の短いsourceBitmapです。
赤枠がPictureBox1のサイズです。
重要なのは、切取り開始点です。リアルタイム描画の場合は、
sourceBitmapでの開始点startXを使ってますが。
longBitmapでの開始点は、longXです。
マウスのPictureBox座標は、cRx、cLxです。
PictureBox幅は、pW,高さpHとしてあります。

③カーソルの処理
カーソルの線を描くだけなら簡単ですが、それでは、カーソルを移動させたときに
カーソルとグラフ線の重なった部分が欠落してしまいます。
そこで、カーソルを指定した時点で、元データのlongBitmapからcursorBitmapへコピーして
新たなカーソル指定位置へカーソルを描画して、PioctureBoxへ切り取り表示します。
こうすることで、cursorBitmapには、最新のカーソル位置に画像が保持されているので、
グラフをスクロール移動させてもカーソルも一緒に移動してくれるので、データ読みが非常に便利になります。

●VBコード

gistにアップしてあります。
https://gist.github.com/dj1711572002/f2f34047fc4d545a4c5c9bcf808aa6a4

●以後
カーソル間のデータの平均値を計算して、DGVへ記録して、フォースプレートの校正作業の
合理化を進めます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です