X2021/Wardrobe/GUI.vb

300 lines
10 KiB
VB.net

Imports XCCLibrary
Public Class GUI
Dim filesFolder As String = "C:\Users\Anton\Documents\Exjobb"
Dim HLCtFolder As String = "C:\Users\Anton\Documents\Exjobb\X2021"
Dim containerPanel As Panel
Dim containerX, containerY, containerW, containerH, containerMidX, containerMidY As Integer
Dim gratingMaxL As Decimal = 1200
Dim gratingMaxW As Decimal = 1200
Dim drawW As Integer = 1
Dim drawH As Integer = 1
Dim drawAspect, gratingAspect As Decimal
Dim scaleDiff As Decimal = 1
Public pCon1(3) As Decimal 'pCon(0) = pixel X, pCon(2) = SW X, etc.
Public pCon2(3) As Decimal
Public pCon3(3) As Decimal
Public pCon4(3) As Decimal
Dim points As New Dictionary(Of String, Decimal())
Dim pointsOrder As New List(Of String)
Dim PointButtons As New List(Of Button)
Dim angleCounter As Integer
' --- Start method when GUI loads ---
Sub GUI_load() Handles MyBase.Load
containerPanel = DrawingPanel
AddHandler containerPanel.Paint, AddressOf DrawingPanel_Paint
Get_DrawboxParameters()
Set_ContainerPointsX()
Set_ContainerPointsY()
Update_GratingDimensions()
Create_StartPoints()
Program.Load_XCC(filesFolder, HLCtFolder)
End Sub
' --- Retrive parameters for the drawing box ---
Private Sub Get_DrawboxParameters()
containerX = containerPanel.Location.X 'Behövs ej nu
containerY = containerPanel.Location.Y 'Behövs ej nu
containerW = containerPanel.Size.Width
containerH = containerPanel.Size.Height
containerMidX = containerW / 2
containerMidY = containerH / 2
drawW = containerW - 60
drawH = containerH - 60
drawAspect = drawW / drawH
End Sub
' --- Set containers points X-values ---
Private Sub Set_ContainerPointsX()
pCon1(0) = containerMidX - drawW / 2
pCon2(0) = containerMidX + drawW / 2
pCon3(0) = containerMidX + drawW / 2
pCon4(0) = containerMidX - drawW / 2
End Sub
' --- Set containers points Y-values ---
Private Sub Set_ContainerPointsY()
pCon1(1) = containerMidY - drawH / 2
pCon2(1) = containerMidY - drawH / 2
pCon3(1) = containerMidY + drawH / 2
pCon4(1) = containerMidY + drawH / 2
End Sub
' --- Sets the start points for the grating ---
Private Sub Create_StartPoints()
For i = 1 To 4
points.Add("p" & i, CallByName(Me, "pCon" & i, vbGet))
pointsOrder.Add("p" & i)
Next
End Sub
' --- Draw all the lines for the container and grating ---
Private Sub DrawingPanel_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
Dim penCon As Pen = New Pen(Color.DarkRed, 1)
penCon.DashPattern = {4, 8}
e.Graphics.DrawLine(penCon, CInt(pCon1(0)), CInt(pCon1(1)), CInt(pCon2(0)), CInt(pCon2(1)))
e.Graphics.DrawLine(penCon, CInt(pCon2(0)), CInt(pCon2(1)), CInt(pCon3(0)), CInt(pCon3(1)))
e.Graphics.DrawLine(penCon, CInt(pCon3(0)), CInt(pCon3(1)), CInt(pCon4(0)), CInt(pCon4(1)))
e.Graphics.DrawLine(penCon, CInt(pCon4(0)), CInt(pCon4(1)), CInt(pCon1(0)), CInt(pCon1(1)))
Dim pen As Pen = New Pen(Color.Black, 1)
For i = 0 To pointsOrder.Count - 1
Dim pTemp1() As Decimal
Dim pTemp2() As Decimal
pTemp1 = points(pointsOrder(i))
Try
pTemp2 = points(pointsOrder(i + 1))
Catch ex As Exception
pTemp2 = points(pointsOrder(0))
End Try
e.Graphics.DrawLine(pen, CInt(pTemp1(0)), CInt(pTemp1(1)), CInt(pTemp2(0)), CInt(pTemp2(1)))
Next
End Sub
' --- Generate a table containing all the points X- and Y-values ---
Private Function Create_PointTable()
Dim pointTable As New DataTable
pointTable.Columns.Add("X", GetType(Decimal))
pointTable.Columns.Add("Y", GetType(Decimal))
For i = 0 To pointsOrder.Count - 1
Dim pTemp() As Decimal
pTemp = points(pointsOrder(i))
pointTable.Rows.Add()
pointTable.Rows(i)("X") = pTemp(2)
pointTable.Rows(i)("Y") = pTemp(3)
Next
Return pointTable
End Function
' ---------------------------------- GUI interactions ----------------------------------
Private Sub SettingsButton_Click(sender As Object, e As EventArgs) Handles SettingsButton.Click
Program.Update_KB()
End Sub
Private Sub WidthBox_TextChanged(sender As Object, e As EventArgs) Handles WidthBox.TextChanged
If WidthBox.Text <> "" Then
If CDec(WidthBox.Text) > 0 Then
gratingMaxW = CDec(WidthBox.Text)
Update_GratingDimensions()
End If
End If
End Sub
Private Sub LengthBox_TextChanged(sender As Object, e As EventArgs) Handles LengthBox.TextChanged
If LengthBox.Text <> "" Then
If CDec(LengthBox.Text) > 0 Then
gratingMaxL = CDec(LengthBox.Text)
Update_GratingDimensions()
End If
End If
End Sub
Private Sub Update_GratingDimensions()
gratingAspect = gratingMaxW / gratingMaxL
If gratingAspect > drawAspect Then
'Change draw height
scaleDiff = gratingMaxW / drawW
pCon1(1) = containerMidY - gratingMaxL / (scaleDiff * 2)
pCon2(1) = containerMidY - gratingMaxL / (scaleDiff * 2)
pCon3(1) = containerMidY + gratingMaxL / (scaleDiff * 2)
pCon4(1) = containerMidY + gratingMaxL / (scaleDiff * 2)
Set_ContainerPointsX()
Else
'Change draw width
scaleDiff = gratingMaxL / drawH
pCon1(0) = containerMidX - gratingMaxW / (scaleDiff * 2)
pCon2(0) = containerMidX + gratingMaxW / (scaleDiff * 2)
pCon3(0) = containerMidX + gratingMaxW / (scaleDiff * 2)
pCon4(0) = containerMidX - gratingMaxW / (scaleDiff * 2)
Set_ContainerPointsY()
End If
'Redraw grating
Me.Refresh()
'SW X-values
pCon1(2) = (-gratingMaxW / 2) / 1000
pCon2(2) = (gratingMaxW / 2) / 1000
pCon3(2) = (gratingMaxW / 2) / 1000
pCon4(2) = (-gratingMaxW / 2) / 1000
'SW Y-values
pCon1(3) = (gratingMaxL / 2) / 1000
pCon2(3) = (gratingMaxL / 2) / 1000
pCon3(3) = (-gratingMaxL / 2) / 1000
pCon4(3) = (-gratingMaxL / 2) / 1000
End Sub
' --- When angle button is pressed ---
Private Sub AngleButton_Click(sender As Object, e As EventArgs) Handles AngleButton.Click
' Create Buttons for all clickable points
For i = 0 To pointsOrder.Count - 1
PointButtons.Add(New Button)
PointButtons(i).Width = 30
PointButtons(i).Height = 30
PointButtons(i).Left = points(pointsOrder(i))(0) - PointButtons(i).Width / 2
PointButtons(i).Top = points(pointsOrder(i))(1) - PointButtons(i).Height / 2
PointButtons(i).Name = pointsOrder(i) & "_Button"
PointButtons(i).Text = ""
PointButtons(i).BackColor = Color.FromArgb(50, Color.Red)
PointButtons(i).FlatStyle = FlatStyle.Flat
PointButtons(i).FlatAppearance.BorderSize = 0
PointButtons(i).FlatAppearance.MouseOverBackColor = Color.Red
PointButtons(i).FlatAppearance.MouseDownBackColor = Color.DarkRed
Dim gp As New Drawing.Drawing2D.GraphicsPath
gp.AddEllipse(New Rectangle(New Point(0, 0), New Size(30, 30)))
PointButtons(i).Region = New Region(gp)
containerPanel.Controls.Add(PointButtons(i))
AddHandler PointButtons(i).Click, AddressOf PointButton_Click
Next
angleCounter = angleCounter + 1
End Sub
' --- When a point button for angle recess is pressed ---
Private Sub PointButton_Click(sender As Button, e As EventArgs)
'Determine which point is being pressed
Dim pointPressed As String = sender.Name.Split("_")(0)
Dim index As Integer = pointsOrder.IndexOf(pointPressed)
'Retrive that points coords
Dim pXP As Decimal = points(pointPressed)(0)
Dim pYP As Decimal = points(pointPressed)(1)
Dim pXSW As Decimal = points(pointPressed)(2)
Dim pYSW As Decimal = points(pointPressed)(3)
Dim d1P As Decimal = AngleD1.Text / scaleDiff
Dim d2P As Decimal = AngleD2.Text / scaleDiff
Dim d1SW As Decimal = AngleD1.Text / 1000
Dim d2SW As Decimal = AngleD2.Text / 1000
If pXP < containerMidX Then
If pYP > containerMidY Then
'Kvadrant 4
points.Add("pA" & angleCounter * 2 - 1, {pXP + d1P, pYP, pXSW + d1SW, pYSW})
points.Add("pA" & angleCounter * 2, {pXP, pYP - d2P, pXSW, pYSW + d2SW})
Else
'Kvadrant 1
points.Add("pA" & angleCounter * 2 - 1, {pXP, pYP + d2P, pXSW, pYSW - d2SW})
points.Add("pA" & angleCounter * 2, {pXP + d1P, pYP, pXSW + d1SW, pYSW})
End If
Else
If pYP > containerMidY Then
'Kvadrant 3
points.Add("pA" & angleCounter * 2 - 1, {pXP, pYP - d2P, pXSW, pYSW + d2SW})
points.Add("pA" & angleCounter * 2, {pXP - d1P, pYP, pXSW - d1SW, pYSW})
Else
'Kvadrant 2
points.Add("pA" & angleCounter * 2 - 1, {pXP - d1P, pYP, pXSW - d1SW, pYSW})
points.Add("pA" & angleCounter * 2, {pXP, pYP + d2P, pXSW, pYSW - d2SW})
End If
End If
'Insert two new points
pointsOrder.Insert(index + 1, "pA" & angleCounter * 2 - 1)
pointsOrder.Insert(index + 2, "pA" & angleCounter * 2)
pointsOrder.RemoveAt(index)
For i = 0 To PointButtons.Count - 1
RemoveHandler PointButtons(0).Click, AddressOf PointButton_Click
containerPanel.Controls.RemoveByKey(PointButtons(0).Name)
PointButtons.RemoveAt(0)
Next
'Redraw grating
Me.Refresh()
End Sub
' --- When export to SW button is pressed ---
Private Sub ExportSWButton_Click(sender As Object, e As EventArgs) Handles ExportSWButton.Click
Program.Build_Grating()
'Test för att SW API
Dim pointTable As New DataTable
pointTable = Create_PointTable()
Program.Export_SW(pointTable)
Program.Create_Drawing()
End Sub
End Class