Option Explicit On Option Strict On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call INI_STATE() End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click '初期状態 Call INI_STATE() End Sub Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click 'Default軸セット DataGridView1.Rows.Clear() If RadioButton1.Checked = True Then Call DGVSIZE() Call DGVXN() Call DGVYL_large() ElseIf RadioButton2.Checked = True Then Call DGVSIZE() Call DGVXN() Call DGVYL_small() ElseIf RadioButton3.Checked = True Then Call DGVSIZE() Call DGVXL() Call DGVYL_large() ElseIf RadioButton4.Checked = True Then Call DGVSIZE() Call DGVXL() Call DGVYL_small() End If End Sub Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click Call main() End Sub Private Sub DGVSIZE() '描画サイズ Dim ir As Integer ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "HSIZE, DHL, DHR" DataGridView1.Item(1, ir).Value = 500 DataGridView1.Item(2, ir).Value = 60 DataGridView1.Item(3, ir).Value = 50 DataGridView1.Item(4, ir).Value = "---" ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "VSIZE, DVL, DVU" DataGridView1.Item(1, ir).Value = 300 DataGridView1.Item(2, ir).Value = 30 DataGridView1.Item(3, ir).Value = 30 DataGridView1.Item(4, ir).Value = "---" End Sub Private Sub DGVXN() '振動数軸(普通軸) Dim ir As Integer ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "xmin, xmax, dx, slogx" DataGridView1.Item(1, ir).Value = 0.0 DataGridView1.Item(2, ir).Value = 30.0 DataGridView1.Item(3, ir).Value = 2.0 DataGridView1.Item(4, ir).Value = "N" End Sub Private Sub DGVXL() '周期軸(対数) Dim ir As Integer ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "xmin, xmax, dx, slogx" DataGridView1.Item(1, ir).Value = -2.0 DataGridView1.Item(2, ir).Value = 1.0 DataGridView1.Item(3, ir).Value = 1.0 DataGridView1.Item(4, ir).Value = "L" End Sub Private Sub DGVYL_small() '弱振スペクトル軸(対数) Dim ir As Integer ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "yminP3, ymaxP3, dyP3, slogy" DataGridView1.Item(1, ir).Value = -3.0 DataGridView1.Item(2, ir).Value = 2.0 DataGridView1.Item(3, ir).Value = 1.0 DataGridView1.Item(4, ir).Value = "L" ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "yminPA, ymaxPA, dyPA, ---" DataGridView1.Item(1, ir).Value = -1.0 DataGridView1.Item(2, ir).Value = 2.0 DataGridView1.Item(3, ir).Value = 1.0 DataGridView1.Item(4, ir).Value = "---" End Sub Private Sub DGVYL_large() '強振スペクトル軸(対数) Dim ir As Integer ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "yminP3, ymaxP3, dyP3, slogy" DataGridView1.Item(1, ir).Value = -3.0 DataGridView1.Item(2, ir).Value = 3.0 DataGridView1.Item(3, ir).Value = 1.0 DataGridView1.Item(4, ir).Value = "L" ir = DataGridView1.Rows.Add() DataGridView1.Item(0, ir).Value = "yminPA, ymaxPA, dyPA, ---" DataGridView1.Item(1, ir).Value = -1.0 DataGridView1.Item(2, ir).Value = 3.0 DataGridView1.Item(3, ir).Value = 1.0 DataGridView1.Item(4, ir).Value = "---" End Sub Private Sub INI_STATE() '初期状態セト Me.ClientSize = New Size(580, 340) DataGridView1.Visible = True CheckBox1.Visible = True GroupBox1.Visible = True GroupBox2.Visible = True PictureBox1.Visible = False PictureBox2.Visible = False CheckBox1.Text = "ピーク周波数(周期)図示" CheckBox1.Checked = False DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).Width = 170 DataGridView1.Columns(0).HeaderText = "項目" DataGridView1.Columns(1).Width = 40 DataGridView1.Columns(1).HeaderText = "C1" DataGridView1.Columns(2).Width = 40 DataGridView1.Columns(2).HeaderText = "C2" DataGridView1.Columns(3).Width = 40 DataGridView1.Columns(3).HeaderText = "C3" DataGridView1.Columns(4).Width = 40 DataGridView1.Columns(4).HeaderText = "C4" GroupBox1.Text = "軸Default選定" RadioButton2.Checked = True RadioButton1.Text = "強振,x:振動数" RadioButton2.Text = "弱振,x:振動数" RadioButton3.Text = "強振,x:周期" RadioButton4.Text = "弱振,x:周期" GroupBox2.Text = "操作上の注意" Label1.Text = "1. [初期状態]ボタンでこの画面に戻ります" Label2.Text = "2. [Default軸set]ボタンで右側のボタンで選択した軸の値をセットします" Label3.Text = "3. [描画実行]ボタンで描画するファイルを選定し描画を実行します" Label4.Text = "4. DataGridView中の数値を変更し描画条件を変更できます" Label5.Text = "5. [Default軸set]ボタンを押すと軸数値はDefaultに戻るので注意!" DataGridView1.Rows.Clear() Call DGVSIZE() Call DGVXN() Call DGVYL_small() End Sub Private Sub main() Dim kpt As Integer '拡大率(画面表示:1,ファイル保存:2) Dim HSIZE As Integer '画像横寸法(px) Dim DHL As Integer '画像左余白寸法:縦軸描画用(px) Dim DHR As Integer '画像右余白寸法(px) Dim VSIZE As Integer '画像縦寸法(px) Dim DVL As Integer '画像下余白寸法:横軸描画用(px) Dim DVU As Integer '画像上余白寸法(px) Dim sxjiku As String 'x軸名(単位含む) Dim xmin As Double 'x軸最小値 Dim xmax As Double 'x軸最大値 Dim dx As Double 'x軸増分 Dim slogx As String 'x軸の種類(L:対数,N:普通) Dim syjiku As String 'y軸名(単位含む) Dim ymin As Double 'y軸最小値 Dim ymax As Double 'y軸最大値 Dim dy As Double 'y軸増分 Dim slogy As String 'y軸の種類(L:対数,N:普通) Dim kxi0 As Integer Dim kxf0 As Integer Dim kyi0 As Integer Dim kyf0 As Integer Dim fname() As String Dim datax(,) As Double Dim datay(,) As Double Dim datafs1(,) As Double Dim datafs2(,) As Double Dim datafsr(,) As Double Dim nd() As Integer 'データ数(入力はデータ数,プログラム上数値はデータ数−1) Dim sleg1() As String '分子凡例名 Dim sleg2() As String '分母凡例名 Dim band() As Double '平滑化バンド幅 Dim nn As Integer Dim i As Integer Dim k As Integer Dim pi As Double = Math.PI Dim thePicBox As PictureBox = PictureBox1 Dim bmp As Bitmap Dim g As Graphics Dim sr As System.IO.StreamReader Dim sw As System.IO.StreamWriter Dim dat As String Dim sbuf() As String Dim delim() As Char = {","c} Dim fnameR As String = "" Dim fnameW As String = "" Dim fnameD As String = "" Dim scom As String = "" Dim Tscom As String = "" Dim fact0 As Double = 0.0000001 Dim nfp As Integer Dim kfp() As Integer Dim wx() As Double Dim wy() As Double Dim nrow As Integer = 99 Dim ncol As Integer = 99999 ReDim fname(nrow) ReDim datax(nrow, ncol) ReDim datay(nrow, ncol) ReDim datafs1(nrow, ncol) ReDim datafs2(nrow, ncol) ReDim datafsr(nrow, ncol) ReDim nd(nrow) ReDim sleg1(nrow) ReDim sleg2(nrow) ReDim band(nrow) ReDim kfp(CInt(ncol / 2)) ReDim wx(ncol) ReDim wy(ncol) Dim yminP3 As Double : Dim ymaxP3 As Double : Dim dyP3 As Double 'PLOT3用 Dim yminPA As Double : Dim ymaxPA As Double : Dim dyPA As Double 'PLOTA用 DataGridView1.Visible = False CheckBox1.Visible = False GroupBox1.Visible = False GroupBox2.Visible = False HSIZE = CInt(DataGridView1(1, 0).Value) DHL = CInt(DataGridView1(2, 0).Value) DHR = CInt(DataGridView1(3, 0).Value) VSIZE = CInt(DataGridView1(1, 1).Value) DVL = CInt(DataGridView1(2, 1).Value) DVU = CInt(DataGridView1(3, 1).Value) xmin = CDbl(DataGridView1(1, 2).Value) xmax = CDbl(DataGridView1(2, 2).Value) dx = CDbl(DataGridView1(3, 2).Value) slogx = CStr(DataGridView1(4, 2).Value) yminP3 = CDbl(DataGridView1(1, 3).Value) ymaxP3 = CDbl(DataGridView1(2, 3).Value) dyP3 = CDbl(DataGridView1(3, 3).Value) slogy = CStr(DataGridView1(4, 3).Value) yminPA = CDbl(DataGridView1(1, 4).Value) ymaxPA = CDbl(DataGridView1(2, 4).Value) dyPA = CDbl(DataGridView1(3, 4).Value) sxjiku = "振動数 (Hz)" 'slogx="N" If slogx = "L" Then sxjiku = "周期 (sec)" '処理ファイル名読み込み OpenFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory() If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fnameR = OpenFileDialog1.FileName sr = New System.IO.StreamReader(fnameR, System.Text.Encoding.Default) dat = sr.ReadLine() : sbuf = dat.Split(delim) : nn = CInt(sbuf(0)) - 1 : Tscom = sbuf(1) For k = 0 To nn dat = sr.ReadLine() : sbuf = dat.Split(delim) : fname(k) = sbuf(0) fname(k) = System.IO.Path.GetDirectoryName(fnameR) & "\" & fname(k) Next k sr.Close() 'データ読み込み For k = 0 To nn sr = New System.IO.StreamReader(fname(k), System.Text.Encoding.Default) dat = sr.ReadLine() : sbuf = dat.Split(delim) : sleg1(k) = sbuf(1) dat = sr.ReadLine() : sbuf = dat.Split(delim) : sleg2(k) = sbuf(1) dat = sr.ReadLine() : sbuf = dat.Split(delim) dat = sr.ReadLine() : sbuf = dat.Split(delim) : band(k) = CDbl(sbuf(1)) dat = sr.ReadLine() : sbuf = dat.Split(delim) : nd(k) = CInt(sbuf(1)) - 1 dat = sr.ReadLine() i = 0 Do Until sr.EndOfStream dat = sr.ReadLine() sbuf = dat.Split(delim) datax(k, i) = CDbl(sbuf(0)) datafs1(k, i) = CDbl(sbuf(3)) datafs2(k, i) = CDbl(sbuf(4)) datafsr(k, i) = CDbl(sbuf(5)) i = i + 1 Loop sr.Close() nd(k) = i - 1 Console.WriteLine(fname(k) & " " & k.ToString("0") & " " & nd(k).ToString("0")) Next k 'スペクトル比が極大値となる周波数 fnameW = System.IO.Path.GetDirectoryName(fnameR) & "\file-" & Tscom & ".csv" sw = New System.IO.StreamWriter(fnameW, False, System.Text.Encoding.Default) dat = "ピーク周波数・sp比" : sw.WriteLine(dat) For k = 0 To nn Call PEAKF(k, nd, datax, datafsr, nfp, kfp, wx, wy) 'ピーク周波数・sp比書き込み dat = System.IO.Path.GetFileName(fname(k)) : sw.WriteLine(dat) dat = "周波数(Hz)" For i = 0 To 9 dat = dat & "," & wx(i).ToString("0.000") Next i sw.WriteLine(dat) dat = "sp比" For i = 0 To 9 dat = dat & "," & wy(i).ToString("0.000") Next i sw.WriteLine(dat) Next k sw.Close() '対数値処理 For k = 0 To nn If slogx = "L" Then '周波数を周期に変換 For i = 1 To nd(k) datax(k, i) = 1.0 / datax(k, i) Next i datax(k, 0) = datax(k, 1) * 2.0 For i = 0 To nd(k) If datax(k, i) < fact0 Then datax(k, i) = fact0 datax(k, i) = Math.Log10(datax(k, i)) Next i '順番の逆転 For i = 0 To nd(k) : wx(i) = datax(k, i) : Next i For i = 0 To nd(k) : datax(k, i) = wx(nd(k) - i) : Next i End If If slogy = "L" Then For i = 0 To nd(k) If datafs1(k, i) < fact0 Then datafs1(k, i) = fact0 If datafs2(k, i) < fact0 Then datafs2(k, i) = fact0 If datafsr(k, i) < fact0 Then datafsr(k, i) = fact0 datafs1(k, i) = Math.Log10(datafs1(k, i)) datafs2(k, i) = Math.Log10(datafs2(k, i)) datafsr(k, i) = Math.Log10(datafsr(k, i)) Next i End If If slogx = "L" Then '順番の逆転(x軸=logとした場合x軸を周期とするため順番を逆転させる) For i = 0 To nd(k) : wy(i) = datafs1(k, i) : Next i For i = 0 To nd(k) : datafs1(k, i) = wy(nd(k) - i) : Next i For i = 0 To nd(k) : wy(i) = datafs2(k, i) : Next i For i = 0 To nd(k) : datafs2(k, i) = wy(nd(k) - i) : Next i For i = 0 To nd(k) : wy(i) = datafsr(k, i) : Next i For i = 0 To nd(k) : datafsr(k, i) = wy(nd(k) - i) : Next i End If Next k 'プロット領域定義 kxi0 = DHL kxf0 = HSIZE - DHR kyi0 = DVU kyf0 = VSIZE - DVL '---------------------------------------- '基礎sp+天端sp+スペクトル比の重ね書き '---------------------------------------- syjiku = "フーリエスペクトル(gal*sec),フーリエスペクトル比" ymin = yminP3 : ymax = ymaxP3 : dy = dyP3 For k = 0 To nn scom = System.IO.Path.GetFileNameWithoutExtension(fname(k)) scom = scom & " (band=" & band(k) & "Hz)" For i = 0 To 1 Select Case i Case 0 '画面描画 kpt = 1 thePicBox = PictureBox1 thePicBox.Visible = False Case 1 '画像書き出し kpt = 2 thePicBox = PictureBox2 thePicBox.Visible = False End Select thePicBox.Size = New Size(kpt * HSIZE, kpt * VSIZE) bmp = New Bitmap(thePicBox.Width, thePicBox.Height) thePicBox.Image = bmp g = Graphics.FromImage(thePicBox.Image) g.FillRectangle(Brushes.White, 0, 0, thePicBox.Width, thePicBox.Height) Call PLOT3(g, kpt, sxjiku, syjiku, xmin, xmax, dx, ymin, ymax, dy, kxi0, kxf0, kyi0, kyf0, k, sleg1, sleg2, nd, datax, datafs1, datafs2, datafsr, scom, slogx, slogy) g.Dispose() Next i fnameD = System.IO.Path.GetDirectoryName(fnameR) & "\fig-" & System.IO.Path.GetFileNameWithoutExtension(fname(k)) & ".png" PictureBox2.Image.Save(fnameD, System.Drawing.Imaging.ImageFormat.Png) Next k '---------------------------------------- '全スペクトル比の重ね書き '---------------------------------------- syjiku = "フーリエスペクトル比" ymin = yminPA : ymax = ymaxPA : dy = dyPA For k = 0 To nn For i = 0 To nd(k) datay(k, i) = datafsr(k, i) Next i Next k For i = 0 To 1 Select Case i Case 0 '画面描画 kpt = 1 thePicBox = PictureBox1 thePicBox.Visible = True Case 1 '画像書き出し kpt = 2 thePicBox = PictureBox2 thePicBox.Visible = False End Select thePicBox.Size = New Size(kpt * HSIZE, kpt * VSIZE) bmp = New Bitmap(thePicBox.Width, thePicBox.Height) thePicBox.Image = bmp g = Graphics.FromImage(thePicBox.Image) g.FillRectangle(Brushes.White, 0, 0, thePicBox.Width, thePicBox.Height) Call PLOTA(g, kpt, sxjiku, syjiku, xmin, xmax, dx, ymin, ymax, dy, kxi0, kxf0, kyi0, kyf0, nn, nd, datax, datay, Tscom, slogx, slogy) g.Dispose() Next i PictureBox1.Left = 0 PictureBox1.Top = ToolStrip1.Height Me.ClientSize = New Size(PictureBox1.Width, PictureBox1.Height + ToolStrip1.Height) fnameD = System.IO.Path.GetDirectoryName(fnameR) & "\fig-" & Tscom & ".png" PictureBox2.Image.Save(fnameD, System.Drawing.Imaging.ImageFormat.Png) End Sub Private Sub PEAKF(ByVal k As Integer, ByRef nd() As Integer, ByRef datax(,) As Double, ByRef datafsr(,) As Double, _ ByRef nfp As Integer, ByRef kfp() As Integer, ByRef wx() As Double, ByRef wy() As Double) Dim j As Integer j = -1 For i = 1 To nd(k) - 1 If (datafsr(k, i - 1) < datafsr(k, i)) And (datafsr(k, i) > datafsr(k, i + 1)) Then '極大値となる番号の検索 j = j + 1 : kfp(j) = i End If Next i nfp = j 'SP比の大きい順の並び替え For i = 0 To nfp wx(i) = datax(k, kfp(i)) wy(i) = datafsr(k, kfp(i)) Next i Call SORT(nfp, wx, wy) End Sub Private Sub SORT(ByVal nd As Integer, ByRef xd() As Double, ByRef yd() As Double) Dim i As Integer Dim j As Integer Dim work As Double 'ydの大きい順でのソート For i = 0 To nd - 1 For j = i + 1 To nd If yd(i) < yd(j) Then work = xd(i) : xd(i) = xd(j) : xd(j) = work work = yd(i) : yd(i) = yd(j) : yd(j) = work End If Next j Next i End Sub Private Function KRENGE(ByVal kk As Integer, ByVal k1 As Integer, ByVal k2 As Integer) As Integer '与えられた整数kkが与えられた範囲k1〜k2に含まれるかの判断 '0:範囲外 '1:範囲内 KRENGE = 0 If (k1 <= kk) And (kk <= k2) Then KRENGE = 1 End Function Private Sub PLOT3(ByVal g As Graphics, ByVal kpt As Integer, ByVal sxjiku As String, ByVal syjiku As String, _ ByVal xmin As Double, ByVal xmax As Double, ByVal dx As Double, _ ByVal ymin As Double, ByVal ymax As Double, ByVal dy As Double, _ ByVal kxi0 As Integer, ByVal kxf0 As Integer, ByVal kyi0 As Integer, ByVal kyf0 As Integer, _ ByVal k As Integer, ByRef sleg1() As String, ByRef sleg2() As String, _ ByVal nd() As Integer, ByRef datax(,) As Double, _ ByRef datafs1(,) As Double, ByRef datafs2(,) As Double, ByRef datafsr(,) As Double, _ ByVal scom As String, ByVal slogx As String, ByVal slogy As String) Dim i As Integer Dim j As Integer Dim kxi As Integer : Dim kxf As Integer Dim kyi As Integer : Dim kyf As Integer Dim xx As Double : Dim yy As Double Dim kxx As Integer : Dim kyy As Integer Dim kxx1 As Integer : Dim kyy1 As Integer Dim kxx2 As Integer : Dim kyy2 As Integer Dim str As String Dim f As New Font("MS ゴシック", kpt * 8) Dim TextSize1 As New System.Drawing.SizeF Dim TextSize2 As New System.Drawing.SizeF Dim wx() As Double Dim wy() As Double kxi = kpt * kxi0 : kxf = kpt * kxf0 : kyi = kpt * kyi0 : kyf = kpt * kyf0 '座標軸 Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black) LPen.DashStyle = Drawing2D.DashStyle.Dot If slogx = "N" Then Call DRN_XJIKU(g, f, LPen, kpt, xmin, xmax, dx, kxi, kxf, kyi, kyf) If slogy = "N" Then Call DRN_YJIKU(g, f, LPen, kpt, ymin, ymax, dy, kxi, kxf, kyi, kyf) If slogx = "L" Then Call DRL_XJIKU(g, f, LPen, kpt, xmin, xmax, kxi, kxf, kyi, kyf) If slogy = "L" Then Call DRL_YJIKU(g, f, LPen, kpt, ymin, ymax, kxi, kxf, kyi, kyf) '枠線描画 g.DrawRectangle(New Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi) 'y軸名描画 str = syjiku TextSize2 = g.MeasureString(str, f) TextSize1 = g.MeasureString("-1.0", f) kxx = CInt(kxi - kpt * 10 - TextSize1.Width - TextSize2.Height) kyy = CInt((kyi + kyf) / 2 + TextSize2.Width / 2) Call INC_STR(g, f, str, kxx, kyy, -90) 'x軸名描画 str = sxjiku TextSize2 = g.MeasureString(str, f) kxx = CInt((kxi + kxf) / 2 - TextSize2.Width / 2) kyy = CInt(kyf + kpt * 5 + TextSize1.Height) Call INC_STR(g, f, str, kxx, kyy, 0) 'データを線で連結 ReDim wx(nd(k)) ReDim wy(nd(k)) For i = 0 To nd(k) : wx(i) = datax(k, i) : Next i For j = 0 To 2 Select Case j Case 0 : For i = 0 To nd(k) : wy(i) = datafs1(k, i) : Next i Case 1 : For i = 0 To nd(k) : wy(i) = datafs2(k, i) : Next i Case 2 : For i = 0 To nd(k) : wy(i) = datafsr(k, i) : Next i End Select xx = wx(0) yy = wy(0) kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) For i = 1 To nd(k) xx = wx(i) yy = wy(i) kxx2 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) kyy2 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) If KRENGE(kxx1, kxi, kxf) * KRENGE(kyy1, kyi, kyf) * KRENGE(kxx2, kxi, kxf) * KRENGE(kyy2, kyi, kyf) = 1 Then Select Case j Case 0 : g.DrawLine(New Pen(Color.Red, 3), kxx1, kyy1, kxx2, kyy2) Case 1 : g.DrawLine(New Pen(Color.Blue, 3), kxx1, kyy1, kxx2, kyy2) Case 2 : g.DrawLine(New Pen(Color.Black, 3), kxx1, kyy1, kxx2, kyy2) End Select End If If kxf < kxx2 Then Exit For kxx1 = kxx2 kyy1 = kyy2 Next i If kyf < kyy2 Then kyy2 = kyf Select Case j Case 0 : str = sleg1(k) Case 1 : str = sleg2(k) Case 2 : str = "sp比" End Select TextSize2 = g.MeasureString(str, f) kxx = kxf + kpt * 2 kyy = kyy2 - CInt(TextSize2.Height / 2) Select Case j Case 0 : g.DrawString(str, f, Brushes.Red, kxx, kyy) Case 1 : g.DrawString(str, f, Brushes.Blue, kxx, kyy) Case 2 : g.DrawString(str, f, Brushes.Black, kxx, kyy) End Select Next j '左上コメント str = scom TextSize2 = g.MeasureString(str, f) kxx = CInt(kxi + kpt * 2) kyy = CInt(kyi - TextSize2.Height - kpt * 1) g.DrawString(str, f, Brushes.Black, kxx, kyy) '右上コメント(文字着色:後ろ側の文字列より描画) For j = 0 To 3 Select Case j Case 0 : str = sleg2(k) Case 1 : str = "/" Case 2 : str = sleg1(k) Case 3 : str = "sp比=" End Select TextSize2 = g.MeasureString(str, f) kyy = CInt(kyi - TextSize2.Height - kpt * 1) If j = 0 Then kxx = CInt(kxf - kpt * 2 - TextSize2.Width) Else kxx = kxx - CInt(TextSize2.Width) End If Select Case j Case 0 : g.DrawString(str, f, Brushes.Blue, kxx, kyy) Case 1 : g.DrawString(str, f, Brushes.Black, kxx, kyy) Case 2 : g.DrawString(str, f, Brushes.Red, kxx, kyy) Case 3 : g.DrawString(str, f, Brushes.Black, kxx, kyy) End Select Next j If CheckBox1.Checked = True Then 'スペクトル比が極大値となる周波数 Dim nfp As Integer Dim kfp() As Integer ReDim kfp(nd(k)) Call PEAKF(k, nd, datax, datafsr, nfp, kfp, wx, wy) f = New Font("MS ゴシック", kpt * 9) '上位10個の記載 For i = 0 To nfp If 10 < i Then Exit For If wx(i) < xmax Then str = wx(i).ToString("0.00") If slogx = "L" Then str = Math.Pow(10, wx(i)).ToString("0.00") TextSize2 = g.MeasureString(str, f) xx = wx(i) yy = wy(i) kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) kxx = kxx - CInt(TextSize2.Height / 2) kyy = kyy - 2 * kpt Call INC_STR(g, f, str, kxx, kyy, -90) End If Next i End If f.Dispose() End Sub Private Sub PLOTA(ByVal g As Graphics, ByVal kpt As Integer, ByVal sxjiku As String, ByVal syjiku As String, _ ByVal xmin As Double, ByVal xmax As Double, ByVal dx As Double, _ ByVal ymin As Double, ByVal ymax As Double, ByVal dy As Double, _ ByVal kxi0 As Integer, ByVal kxf0 As Integer, ByVal kyi0 As Integer, ByVal kyf0 As Integer, _ ByVal nn As Integer, ByVal nd() As Integer, ByRef datax(,) As Double, ByRef datay(,) As Double, _ ByVal Tscom As String, ByVal slogx As String, ByVal slogy As String) Dim i As Integer Dim kxi As Integer : Dim kxf As Integer Dim kyi As Integer : Dim kyf As Integer Dim xx As Double : Dim yy As Double Dim kxx As Integer : Dim kyy As Integer Dim kxx1 As Integer : Dim kyy1 As Integer Dim kxx2 As Integer : Dim kyy2 As Integer Dim str As String Dim f As New Font("MS ゴシック", kpt * 8) Dim TextSize1 As New System.Drawing.SizeF Dim TextSize2 As New System.Drawing.SizeF kxi = kpt * kxi0 : kxf = kpt * kxf0 : kyi = kpt * kyi0 : kyf = kpt * kyf0 '座標軸 Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black) LPen.DashStyle = Drawing2D.DashStyle.Dot If slogx = "N" Then Call DRN_XJIKU(g, f, LPen, kpt, xmin, xmax, dx, kxi, kxf, kyi, kyf) If slogy = "N" Then Call DRN_YJIKU(g, f, LPen, kpt, ymin, ymax, dy, kxi, kxf, kyi, kyf) If slogx = "L" Then Call DRL_XJIKU(g, f, LPen, kpt, xmin, xmax, kxi, kxf, kyi, kyf) If slogy = "L" Then Call DRL_YJIKU(g, f, LPen, kpt, ymin, ymax, kxi, kxf, kyi, kyf) '枠線描画 g.DrawRectangle(New Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi) 'y軸名描画 str = syjiku TextSize2 = g.MeasureString(str, f) TextSize1 = g.MeasureString("-1.0", f) kxx = CInt(kxi - kpt * 10 - TextSize1.Width - TextSize2.Height) kyy = CInt((kyi + kyf) / 2 + TextSize2.Width / 2) Call INC_STR(g, f, str, kxx, kyy, -90) 'x軸名描画 str = sxjiku TextSize2 = g.MeasureString(str, f) kxx = CInt((kxi + kxf) / 2 - TextSize2.Width / 2) kyy = CInt(kyf + kpt * 5 + TextSize1.Height) Call INC_STR(g, f, str, kxx, kyy, 0) 'データを線で連結 For k = 0 To nn xx = datax(k, 0) yy = datay(k, 0) kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) For i = 1 To nd(k) xx = datax(k, i) yy = datay(k, i) kxx2 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) kyy2 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) If KRENGE(kxx1, kxi, kxf) * KRENGE(kyy1, kyi, kyf) * KRENGE(kxx2, kxi, kxf) * KRENGE(kyy2, kyi, kyf) = 1 Then g.DrawLine(New Pen(Color.Black, 1), kxx1, kyy1, kxx2, kyy2) End If kxx1 = kxx2 kyy1 = kyy2 Next i Next k '左上コメント str = Tscom TextSize2 = g.MeasureString(str, f) kxx = CInt(kxi + kpt * 2) kyy = CInt(kyi - TextSize2.Height - kpt * 1) g.DrawString(str, f, Brushes.Black, kxx, kyy) '右上コメント(データ数) str = "n=" & (nn + 1).ToString("0") TextSize2 = g.MeasureString(str, f) kxx = CInt(kxf - kpt * 2 - TextSize2.Width) kyy = CInt(kyi - TextSize2.Height - kpt * 1) g.DrawString(str, f, Brushes.Black, kxx, kyy) f.Dispose() End Sub Private Sub INC_STR(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal str As String, _ ByVal kxx As Integer, ByVal kyy As Integer, ByVal ang As Single) '軸名描画 g.ScaleTransform(1.0, 1.0) '横・縦の表示比率を設定 g.TranslateTransform(kxx, kyy) '表示位置の設定(表示位置を原点とする座標移動) g.RotateTransform(ang) '表示角度を指定 g.DrawString(str, f, Brushes.Black, 0, 0) '描画実行 g.ResetTransform() '単位行列にリセット End Sub Private Sub DRN_XJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal xmin As Double, ByVal xmax As Double, ByVal dx As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim ix As Integer Dim xx As Double Dim wv As Double Dim str As String Dim kxx As Integer Dim TextSize1 As New System.Drawing.SizeF '普通x軸描画 ix = CInt((xmax - xmin) / dx) For i = 0 To ix xx = xmin + CDbl(i) * dx kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) wv = xmin + CDbl(i) * dx str = wv.ToString("0") If CInt(dx * 1000.0) Mod 10 <> 0 Then str = wv.ToString("0.000") If CInt(dx * 1000.0) Mod 10 = 0 And CInt(dx * 100.0) Mod 10 <> 0 Then str = wv.ToString("0.00") If (CInt(dx * 1000.0) Mod 10 = 0 And CInt(dx * 100.0) Mod 10 = 0) And CInt(dx * 10.0) Mod 10 <> 0 Then str = wv.ToString("0.0") TextSize1 = g.MeasureString(str, f) g.DrawLine(LPen, kxx, kyi, kxx, kyf) g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3) Next i End Sub Private Sub DRN_YJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal ymin As Double, ByVal ymax As Double, ByVal dy As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim iy As Integer Dim yy As Double Dim wv As Double Dim str As String Dim kyy As Integer Dim TextSize1 As New System.Drawing.SizeF '普通y軸描画 iy = CInt((ymax - ymin) / dy) For i = 0 To iy yy = ymin + CDbl(i) * dy kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) wv = ymin + CDbl(i) * dy str = wv.ToString("0") If CInt(dy * 1000.0) Mod 10 <> 0 Then str = wv.ToString("0.000") If CInt(dy * 1000.0) Mod 10 = 0 And CInt(dy * 100.0) Mod 10 <> 0 Then str = wv.ToString("0.00") If (CInt(dy * 1000.0) Mod 10 = 0 And CInt(dy * 100.0) Mod 10 = 0) And CInt(dy * 10.0) Mod 10 <> 0 Then str = wv.ToString("0.0") TextSize1 = g.MeasureString(str, f) g.DrawLine(LPen, kxi, kyy, kxf, kyy) g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2) Next i End Sub Private Sub DRL_XJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal xmin As Double, ByVal xmax As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim j As Integer Dim xx As Double Dim str As String Dim kxx As Integer Dim TextSize1 As New System.Drawing.SizeF '対数x軸描画 For i = CInt(xmin) To CInt(xmax) - 1 For j = 1 To 9 xx = System.Math.Log(CDbl(j) * System.Math.Pow(10.0, CDbl(i))) / System.Math.Log(10.0) kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) g.DrawLine(LPen, kxx, kyi, kxx, kyf) Next j Next i For i = CInt(xmin) To CInt(xmax) xx = CDbl(i) kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) str = CStr(System.Math.Pow(10.0, CDbl(i))) TextSize1 = g.MeasureString(str, f) g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3) Next i End Sub Private Sub DRL_YJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal ymin As Double, ByVal ymax As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim j As Integer Dim yy As Double Dim str As String Dim kyy As Integer Dim TextSize1 As New System.Drawing.SizeF '対数y軸描画 For i = CInt(ymin) To CInt(ymax) - 1 For j = 1 To 9 yy = System.Math.Log(CDbl(j) * System.Math.Pow(10.0, CDbl(i))) / System.Math.Log(10.0) kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) g.DrawLine(LPen, kxi, kyy, kxf, kyy) Next j Next i For i = CInt(ymin) To CInt(ymax) yy = CDbl(i) kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) str = CStr(System.Math.Pow(10.0, CDbl(i))) TextSize1 = g.MeasureString(str, f) g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2) Next i End Sub End Class