Public Class Draw_Grating Private Shared guiPanelL, guiPanelW As Integer Private Shared DirSymbolPoints As New Dictionary(Of String, Integer()) Private Shared ArrowSymbolPoints As New Dictionary(Of String, Integer()) Public Shared measureLabels As New Dictionary(Of String, Integer()) Public Shared sideSquareMesLine As New Dictionary(Of String, Integer()) Public Shared Sub Load_DrawingPanel() AddHandler GUI.DrawingPanel.Paint, AddressOf DrawingPanel_Paint Get_DrawboxParameters() Create_DirSymbolPoints() Create_ArrowSymbolPoints() ' Initialize start points Data.Init_GrossAreaPoints() Data.Init_GratingPoints() Update_GratingPoints() End Sub ' --- Retrive parameters for the drawing box --- Private Shared Sub Get_DrawboxParameters() guiPanelL = GUI.DrawingPanel.Size.Width guiPanelW = GUI.DrawingPanel.Size.Height Data.guiPanelMidX = guiPanelL / 2 Data.guiPanelMidY = guiPanelW / 2 Data.guiMaxDrawL = guiPanelL - 80 Data.guiMaxDrawW = guiPanelW - 80 Data.drawAR = Data.guiMaxDrawL / Data.guiMaxDrawW Data.gratingAR = Data.gratingL / Data.gratingW End Sub ' --- Create points for grating direction symbol --- Private Shared Sub Create_DirSymbolPoints() DirSymbolPoints.Add("p1", {-30 + Data.guiPanelMidX, -2 + Data.guiPanelMidY}) DirSymbolPoints.Add("p2", {20 + Data.guiPanelMidX, -2 + Data.guiPanelMidY}) DirSymbolPoints.Add("p3", {12 + Data.guiPanelMidX, -10 + Data.guiPanelMidY}) DirSymbolPoints.Add("p4", {15 + Data.guiPanelMidX, -13 + Data.guiPanelMidY}) DirSymbolPoints.Add("p5", {30 + Data.guiPanelMidX, 2 + Data.guiPanelMidY}) DirSymbolPoints.Add("p6", {-20 + Data.guiPanelMidX, 2 + Data.guiPanelMidY}) DirSymbolPoints.Add("p7", {-12 + Data.guiPanelMidX, 10 + Data.guiPanelMidY}) DirSymbolPoints.Add("p8", {-15 + Data.guiPanelMidX, 13 + Data.guiPanelMidY}) DirSymbolPoints.Add("p9", {-30 + Data.guiPanelMidX, -2 + Data.guiPanelMidY}) End Sub ' --- Create points for arrow symbol --- Private Shared Sub Create_ArrowSymbolPoints() Dim offset As Integer = 20 ArrowSymbolPoints.Add("p1", {offset, guiPanelW - offset}) ArrowSymbolPoints.Add("p2", {offset, guiPanelW - offset - 40}) ArrowSymbolPoints.Add("p3", {offset - 5, guiPanelW - offset - 35}) ArrowSymbolPoints.Add("p4", {offset, guiPanelW - offset - 40}) ArrowSymbolPoints.Add("p5", {offset + 5, guiPanelW - offset - 35}) ArrowSymbolPoints.Add("p6", {offset, guiPanelW - offset - 40}) ArrowSymbolPoints.Add("p7", {offset, guiPanelW - offset}) ArrowSymbolPoints.Add("p8", {offset + 40, guiPanelW - offset}) ArrowSymbolPoints.Add("p9", {offset + 35, guiPanelW - offset - 5}) ArrowSymbolPoints.Add("p10", {offset + 40, guiPanelW - offset}) ArrowSymbolPoints.Add("p11", {offset + 35, guiPanelW - offset + 5}) End Sub ' --- Updates all the gratings points --- Public Shared Sub Update_GratingPoints() Data.gratingAR = Data.gratingL / Data.gratingW If Data.gratingAR < Data.drawAR Then ' Change draw width Data.scaleDiff = Data.gratingW / Data.guiMaxDrawW ' Gross area points Data.grossAreaPoints.Rows(0)("GUI X") = Data.guiPanelMidX - Data.gratingL / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(0)("GUI Y") = Data.guiPanelMidY - Data.guiMaxDrawW / 2 Data.grossAreaPoints.Rows(1)("GUI X") = Data.guiPanelMidX + Data.gratingL / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(1)("GUI Y") = Data.guiPanelMidY - Data.guiMaxDrawW / 2 Data.grossAreaPoints.Rows(2)("GUI X") = Data.guiPanelMidX + Data.gratingL / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(2)("GUI Y") = Data.guiPanelMidY + Data.guiMaxDrawW / 2 Data.grossAreaPoints.Rows(3)("GUI X") = Data.guiPanelMidX - Data.gratingL / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(3)("GUI Y") = Data.guiPanelMidY + Data.guiMaxDrawW / 2 ' Grating points Data.gratingPoints.Rows(0)("GUI X") = Data.guiPanelMidX - Data.gratingL / (Data.scaleDiff * 2) Data.gratingPoints.Rows(0)("GUI Y") = Data.guiPanelMidY - Data.guiMaxDrawW / 2 Data.gratingPoints.Rows(1)("GUI X") = Data.guiPanelMidX + Data.gratingL / (Data.scaleDiff * 2) Data.gratingPoints.Rows(1)("GUI Y") = Data.guiPanelMidY - Data.guiMaxDrawW / 2 Data.gratingPoints.Rows(2)("GUI X") = Data.guiPanelMidX + Data.gratingL / (Data.scaleDiff * 2) Data.gratingPoints.Rows(2)("GUI Y") = Data.guiPanelMidY + Data.guiMaxDrawW / 2 Data.gratingPoints.Rows(3)("GUI X") = Data.guiPanelMidX - Data.gratingL / (Data.scaleDiff * 2) Data.gratingPoints.Rows(3)("GUI Y") = Data.guiPanelMidY + Data.guiMaxDrawW / 2 Else ' Change draw height Data.scaleDiff = Data.gratingL / Data.guiMaxDrawL ' Gross area points Data.grossAreaPoints.Rows(0)("GUI X") = Data.guiPanelMidX - Data.guiMaxDrawL / 2 Data.grossAreaPoints.Rows(0)("GUI Y") = Data.guiPanelMidY - Data.gratingW / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(1)("GUI X") = Data.guiPanelMidX + Data.guiMaxDrawL / 2 Data.grossAreaPoints.Rows(1)("GUI Y") = Data.guiPanelMidY - Data.gratingW / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(2)("GUI X") = Data.guiPanelMidX + Data.guiMaxDrawL / 2 Data.grossAreaPoints.Rows(2)("GUI Y") = Data.guiPanelMidY + Data.gratingW / (Data.scaleDiff * 2) Data.grossAreaPoints.Rows(3)("GUI X") = Data.guiPanelMidX - Data.guiMaxDrawL / 2 Data.grossAreaPoints.Rows(3)("GUI Y") = Data.guiPanelMidY + Data.gratingW / (Data.scaleDiff * 2) ' Grating points Data.gratingPoints.Rows(0)("GUI X") = Data.guiPanelMidX - Data.guiMaxDrawL / 2 Data.gratingPoints.Rows(0)("GUI Y") = Data.guiPanelMidY - Data.gratingW / (Data.scaleDiff * 2) Data.gratingPoints.Rows(1)("GUI X") = Data.guiPanelMidX + Data.guiMaxDrawL / 2 Data.gratingPoints.Rows(1)("GUI Y") = Data.guiPanelMidY - Data.gratingW / (Data.scaleDiff * 2) Data.gratingPoints.Rows(2)("GUI X") = Data.guiPanelMidX + Data.guiMaxDrawL / 2 Data.gratingPoints.Rows(2)("GUI Y") = Data.guiPanelMidY + Data.gratingW / (Data.scaleDiff * 2) Data.gratingPoints.Rows(3)("GUI X") = Data.guiPanelMidX - Data.guiMaxDrawL / 2 Data.gratingPoints.Rows(3)("GUI Y") = Data.guiPanelMidY + Data.gratingW / (Data.scaleDiff * 2) End If ' Gross area points Data.grossAreaPoints.Rows(0)("X") = (-Data.gratingL / 2) / 1000 Data.grossAreaPoints.Rows(0)("Y") = (Data.gratingW / 2) / 1000 Data.grossAreaPoints.Rows(1)("X") = (Data.gratingL / 2) / 1000 Data.grossAreaPoints.Rows(1)("Y") = (Data.gratingW / 2) / 1000 Data.grossAreaPoints.Rows(2)("X") = (Data.gratingL / 2) / 1000 Data.grossAreaPoints.Rows(2)("Y") = (-Data.gratingW / 2) / 1000 Data.grossAreaPoints.Rows(3)("X") = (-Data.gratingL / 2) / 1000 Data.grossAreaPoints.Rows(3)("Y") = (-Data.gratingW / 2) / 1000 ' Grating points Data.gratingPoints.Rows(0)("X") = (-Data.gratingL / 2) / 1000 Data.gratingPoints.Rows(0)("Y") = (Data.gratingW / 2) / 1000 Data.gratingPoints.Rows(1)("X") = (Data.gratingL / 2) / 1000 Data.gratingPoints.Rows(1)("Y") = (Data.gratingW / 2) / 1000 Data.gratingPoints.Rows(2)("X") = (Data.gratingL / 2) / 1000 Data.gratingPoints.Rows(2)("Y") = (-Data.gratingW / 2) / 1000 Data.gratingPoints.Rows(3)("X") = (-Data.gratingL / 2) / 1000 Data.gratingPoints.Rows(3)("Y") = (-Data.gratingW / 2) / 1000 GUI.DrawingPanel.Refresh() End Sub ' --- Draw all the lines for the panel and grating --- Public Shared Sub DrawingPanel_Paint(sender As Object, e As PaintEventArgs) ' Draw grating gross area (red) Dim penCon As Pen = New Pen(Color.Red, 2) penCon.DashPattern = {4, 6} e.Graphics.DrawLine(penCon, Data.grossAreaPoints(0)("GUI X"), Data.grossAreaPoints(0)("GUI Y"), Data.grossAreaPoints(1)("GUI X"), Data.grossAreaPoints(1)("GUI Y")) e.Graphics.DrawLine(penCon, Data.grossAreaPoints(1)("GUI X"), Data.grossAreaPoints(1)("GUI Y"), Data.grossAreaPoints(2)("GUI X"), Data.grossAreaPoints(2)("GUI Y")) e.Graphics.DrawLine(penCon, Data.grossAreaPoints(2)("GUI X"), Data.grossAreaPoints(2)("GUI Y"), Data.grossAreaPoints(3)("GUI X"), Data.grossAreaPoints(3)("GUI Y")) e.Graphics.DrawLine(penCon, Data.grossAreaPoints(3)("GUI X"), Data.grossAreaPoints(3)("GUI Y"), Data.grossAreaPoints(0)("GUI X"), Data.grossAreaPoints(0)("GUI Y")) ' Draw grating direction symbol Dim symPen As Pen = New Pen(Color.Black, 1) For i = 1 To DirSymbolPoints.Count - 1 e.Graphics.DrawLine(symPen, DirSymbolPoints("p" & i)(0), DirSymbolPoints("p" & i)(1), DirSymbolPoints("p" & i + 1)(0), DirSymbolPoints("p" & i + 1)(1)) Next ' Draw arrow symbol For i = 1 To ArrowSymbolPoints.Count - 1 e.Graphics.DrawLine(symPen, ArrowSymbolPoints("p" & i)(0), ArrowSymbolPoints("p" & i)(1), ArrowSymbolPoints("p" & i + 1)(0), ArrowSymbolPoints("p" & i + 1)(1)) Next ' Draw measure labels For i = 0 To measureLabels.Count - 1 Dim mesName As String = measureLabels.Keys(i) e.Graphics.DrawString(measureLabels(mesName)(0), New Font("Microsoft Sans Serif", 7), Brushes.Black, New Point(measureLabels(mesName)(1), measureLabels(mesName)(2))) Next 'Stöd measurement linje för sidesquare Dim penMes As Pen = New Pen(Color.Gray, 1) For i = 0 To sideSquareMesLine.Count - 1 Dim mesName As String = sideSquareMesLine.Keys(i) e.Graphics.DrawLine(penMes, sideSquareMesLine(mesName)(0), sideSquareMesLine(mesName)(1), sideSquareMesLine(mesName)(2), sideSquareMesLine(mesName)(3)) If Data.pointsMeasurements(mesName)(2) = 1 OrElse Data.pointsMeasurements(mesName)(2) = 3 Then e.Graphics.DrawLine(penMes, sideSquareMesLine(mesName)(0), sideSquareMesLine(mesName)(1) + 2, sideSquareMesLine(mesName)(0), sideSquareMesLine(mesName)(1) - 2) e.Graphics.DrawLine(penMes, sideSquareMesLine(mesName)(2), sideSquareMesLine(mesName)(1) + 2, sideSquareMesLine(mesName)(2), sideSquareMesLine(mesName)(1) - 2) Else e.Graphics.DrawLine(penMes, sideSquareMesLine(mesName)(0) + 2, sideSquareMesLine(mesName)(1), sideSquareMesLine(mesName)(0) - 2, sideSquareMesLine(mesName)(1)) e.Graphics.DrawLine(penMes, sideSquareMesLine(mesName)(0) + 2, sideSquareMesLine(mesName)(3), sideSquareMesLine(mesName)(0) - 2, sideSquareMesLine(mesName)(3)) End If Next ' Draw angle recess help lines Dim Pendot As Pen = New Pen(Color.Gray, 1) Pendot.DashPattern = {2, 4} For i = 0 To Data.angleRecessPoints.Rows.Count - 1 Dim angleQuadrant As String = Data.angleRecessPoints.Rows(i)("QUADRANT") Dim p1XGUI, p1YGUI, p2XGUI, p2YGUI As Integer For Each DR As DataRow In Data.gratingPoints.Rows If DR("NAME").Split("_")(0) = "CA" & angleQuadrant Then Dim index As Integer = Data.gratingPoints.Rows.IndexOf(DR) p1XGUI = Data.gratingPoints.Rows(index)("GUI X") p1YGUI = Data.gratingPoints.Rows(index)("GUI Y") p2XGUI = Data.gratingPoints.Rows(index + 1)("GUI X") p2YGUI = Data.gratingPoints.Rows(index + 1)("GUI Y") Exit For End If Next e.Graphics.DrawLine(Pendot, Data.angleRecessPoints.Rows(i)("GUI X"), Data.angleRecessPoints.Rows(i)("GUI Y"), p1XGUI, p1YGUI) e.Graphics.DrawLine(Pendot, Data.angleRecessPoints.Rows(i)("GUI X"), Data.angleRecessPoints.Rows(i)("GUI Y"), p2XGUI, p2YGUI) Next ' Draw actual grating (black) Dim pen As Pen = New Pen(Color.Black, 2) For i = 0 To Data.gratingPoints.Rows.Count - 1 Dim pTemp1(2) As Integer Dim pTemp2(2) As Integer pTemp1(0) = Data.gratingPoints.Rows(i)("GUI X") pTemp1(1) = Data.gratingPoints.Rows(i)("GUI Y") Try pTemp2(0) = Data.gratingPoints.Rows(i + 1)("GUI X") pTemp2(1) = Data.gratingPoints.Rows(i + 1)("GUI Y") Catch ex As Exception pTemp2(0) = Data.gratingPoints.Rows(0)("GUI X") pTemp2(1) = Data.gratingPoints.Rows(0)("GUI Y") End Try e.Graphics.DrawLine(pen, pTemp1(0), pTemp1(1), pTemp2(0), pTemp2(1)) Next End Sub End Class