Option Explicit On Option Strict On Public Class Form1 Private nys As Integer '作図フラグ Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim fnameR As String = "" Dim fnameW As String = "" Label1.Text = "" Label2.Text = "" If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fnameR = OpenFileDialog1.FileName If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fnameW = SaveFileDialog1.FileName Label1.Text = fnameR Label2.Text = fnameW Dim fm2 As New Form2() fm2.Show() nys = 0 : Call PLOT() nys = 1 : Call PLOT() nys = 2 : Call PLOT() End Sub Private Sub PLOT() Dim bmp As Bitmap Dim g As Graphics Dim fname1 As String Dim fname2 As String Dim pname As String Dim sr As System.IO.StreamReader Dim dat As String Dim sbuf() As String Dim delim() As Char = {","c} Dim NODT As Integer Dim NELT As Integer Dim kakom(,) As Integer Dim matno() As Integer Dim datax() As Double Dim datay() As Double Dim i As Integer Dim j As Integer Dim ne As Integer Dim kpt As Integer Select Case nys Case 0 : kpt = 1 Case 1 : kpt = CInt(ToolStripTextBox1.Text) Case 2 : kpt = CInt(ToolStripTextBox1.Text) End Select Dim xmin As Double : Dim xmax As Double : Dim dx As Double Dim ymin As Double : Dim ymax As Double : Dim dy As Double Dim kxi As Integer : Dim kxf As Integer : Dim ds As Double Dim kyi As Integer : Dim kyf As Integer Dim xx As Double : Dim yy As Double Dim kxx1 As Integer : Dim kyy1 As Integer Dim kxx2 As Integer : Dim kyy2 As Integer Dim kxx3 As Integer : Dim kyy3 As Integer Dim f As New Font("MS ゴシック", 12) Dim TextSize As New System.Drawing.SizeF Dim HSIZE As Integer Dim VSIZE As Integer Dim node1 As Integer Dim node2 As Integer Dim node3 As Integer Dim points(2) As Point Dim str As String Dim dbrush As SolidBrush = New SolidBrush(ColorTranslator.FromHtml("#ffffcc")) 'データ入力 fname1 = Label2.Text sr = New System.IO.StreamReader(fname1, System.Text.Encoding.Default) dat = sr.ReadLine() : sbuf = dat.Split(delim) NODT = CInt(sbuf(0)) NELT = CInt(sbuf(1)) ReDim kakom(NELT, 3) ReDim matno(NELT) ReDim datax(NODT) ReDim datay(NODT) For ne = 1 To NELT dat = sr.ReadLine() : sbuf = dat.Split(delim) For j = 1 To 3 kakom(ne, j) = CInt(sbuf(j - 1)) Next j matno(ne) = CInt(sbuf(3)) Next ne For i = 1 To NODT dat = sr.ReadLine() : sbuf = dat.Split(delim) datax(i) = CDbl(sbuf(0)) datay(i) = CDbl(sbuf(1)) Next i sr.Close() xmin = datax(1) : xmax = xmin ymin = datay(1) : ymax = ymin For i = 1 To NODT If datax(i) < xmin Then xmin = datax(i) If xmax < datax(i) Then xmax = datax(i) If datay(i) < ymin Then ymin = datay(i) If ymax < datay(i) Then ymax = datay(i) Next i dx = xmax - xmin dy = ymax - ymin 'PictureBoxのサイズ設定 If dx < dy Then ds = 900.0 / dy Else ds = 900.0 / dx End If HSIZE = (CInt(ds * dx) + 100) * kpt VSIZE = (CInt(ds * dy) + 100) * kpt kxi = 50 * kpt : kxf = HSIZE - 50 * kpt kyi = 50 * kpt : kyf = VSIZE - 50 * kpt '画像書き出し PictureBox1.Size = New Size(HSIZE, VSIZE) PictureBox1.Visible = False bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height) PictureBox1.Image = bmp g = Graphics.FromImage(PictureBox1.Image) g.FillRectangle(Brushes.White, 0, 0, PictureBox1.Width, PictureBox1.Height) 'メッシュ図 For ne = 1 To NELT node1 = kakom(ne, 1) node2 = kakom(ne, 2) node3 = kakom(ne, 3) xx = datax(node1) : kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node1) : kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) xx = datax(node2) : kxx2 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node2) : kyy2 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) xx = datax(node3) : kxx3 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node3) : kyy3 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) points(0) = New Point(kxx1, kyy1) points(1) = New Point(kxx2, kyy2) points(2) = New Point(kxx3, kyy3) Select Case matno(ne) Case 1 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ffffcc")) Case 2 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ffcccc")) Case 3 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ccffcc")) Case 4 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ccffff")) Case 5 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ccccff")) Case 6 : dbrush = New SolidBrush(ColorTranslator.FromHtml("#ffccff")) End Select g.FillPolygon(dbrush, points) Next ne For ne = 1 To NELT node1 = kakom(ne, 1) node2 = kakom(ne, 2) node3 = kakom(ne, 3) xx = datax(node1) : kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node1) : kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) xx = datax(node2) : kxx2 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node2) : kyy2 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) xx = datax(node3) : kxx3 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(node3) : kyy3 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) points(0) = New Point(kxx1, kyy1) points(1) = New Point(kxx2, kyy2) points(2) = New Point(kxx3, kyy3) If nys = 0 Then g.DrawPolygon(New Pen(Color.Black, 1 * kpt), points) Else g.DrawPolygon(New Pen(Color.Gray, 1 * kpt), points) End If Next ne Select Case nys Case 1 '節点番号 For i = 1 To NODT xx = datax(i) : kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = datay(i) : kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) str = i.ToString g.DrawString(str, f, Brushes.Blue, kxx1, kyy1) Next i Case 2 '要素番号 For ne = 1 To NELT node1 = kakom(ne, 1) node2 = kakom(ne, 2) node3 = kakom(ne, 3) xx = (datax(node1) + datax(node2) + datax(node3)) / 3.0 : kxx1 = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) yy = (datay(node1) + datay(node2) + datay(node3)) / 3.0 : kyy1 = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) str = ne.ToString TextSize = g.MeasureString(str, f) g.DrawString(str, f, Brushes.Red, kxx1 - TextSize.Width / 2, kyy1 - TextSize.Height / 2) Next ne End Select '画像保存 fname2 = Label2.Text pname = System.IO.Path.GetDirectoryName(fname2) & "\" & System.IO.Path.GetFileNameWithoutExtension(fname2) fname2 = pname & nys.ToString & ".png" PictureBox1.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png) f.Dispose() g.Dispose() '画像表示 System.Diagnostics.Process.Start(fname2) '要素面積確認 Dim area() As Double Dim amean As Double Dim amax As Double Dim amin As Double ReDim area(NELT) For ne = 1 To NELT area(ne) = CALA(ne, kakom, datax, datay) Next ne amean = 0.0 amax = area(1) amin = area(1) For ne = 1 To NELT amean = amean + area(ne) If amax < area(ne) Then amax = area(ne) If area(ne) < amin Then amin = area(ne) Next ne amean = amean / CDbl(NELT) Label3.Text = "NODT=" & NODT.ToString & " " & "NELT=" & NELT.ToString Label4.Text = "mean area of elements=" & amean.ToString Label5.Text = "maximum area of elements=" & amax.ToString Label6.Text = "minimum area of elements=" & amin.ToString If amin <= 0.0 Then MessageBox.Show("要素面積<=0", "要素分割不良") End Sub Private Function CALA(ByVal ne As Integer, ByRef kakom(,) As Integer, _ ByRef datax() As Double, ByRef datay() As Double) As Double Dim i As Integer Dim j As Integer Dim k As Integer i = kakom(ne, 1) : j = kakom(ne, 2) : k = kakom(ne, 3) CALA = 0.5 * ((datax(k) - datax(j)) * datay(i) + (datax(i) - datax(k)) * datay(j) + (datax(j) - datax(i)) * datay(k)) End Function Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ToolStripLabel1.Text = "節点図・要素図拡大比率" ToolStripTextBox1.Text = "1" End Sub End Class