X2021/Wardrobe/SolidWorks/Individual_Frame_3D.vb

345 lines
15 KiB
VB.net

Imports XCCLibrary
Imports SldWorks
Public Class Individual_Frame_3D
Private Shared designName As String
Public Shared cuttingList As New Dictionary(Of Integer, Integer())
Public Shared sideFrameLengths As New Dictionary(Of String, Integer)
Public Shared Sub Build_Frame(gratingParameters As DataRow, parentID As Integer)
Dim frameDT As New DataTable
frameDT = Generate_FrameData(gratingParameters)
For i = 0 To frameDT.Rows.Count - 1
If frameDT.Rows(i)("TYPE") = "SIDE" Then
sideFrameLengths.Add("Frame " & sideFrameLengths.Count + 1, frameDT.Rows(i)("LENGTH"))
End If
Next
cuttingList = Generate_CuttingList(frameDT, sideFrameLengths)
Dim inst_ As Integer
Dim sideFrame As Integer = 0
For i = 0 To frameDT.Rows.Count - 1
Dim HLCtName As String
If frameDT.Rows(i)("TYPE") = "CORNER" Then
HLCtName = "frame_l_corner"
Else
HLCtName = "frame_l_straight"
End If
inst_ = ExternalClass.instantiate_parts(parentID, HLCtName, "")
ExternalClass.modify_parameter_value("DP_HEIGHT", inst_, 30) 'FIXA
ExternalClass.modify_parameter_value("DP_WIDTH", inst_, 40) 'FIXA
ExternalClass.modify_parameter_value("DP_ROTATION", inst_, frameDT.Rows(i)("ROTATION"))
ExternalClass.modify_parameter_value("DP_OFFSET_W", inst_, frameDT.Rows(i)("OFFSET_W"))
ExternalClass.modify_parameter_value("DP_OFFSET_L", inst_, frameDT.Rows(i)("OFFSET_L"))
If frameDT.Rows(i)("TYPE") = "SIDE" Then
sideFrame += 1
Dim cutOffset1 As Integer = 0
For j = 0 To cuttingList.Count - 1
For k = 0 To cuttingList.ElementAt(j).Value.Count - 1
If sideFrame = cuttingList.ElementAt(j).Value(k) Then
For l = 1 To k
cutOffset1 += sideFrameLengths("Frame " & cuttingList.ElementAt(j).Value(l - 1))
Next
End If
Next
Next
ExternalClass.modify_parameter_value("DP_CUTOFFSET1", inst_, cutOffset1)
ExternalClass.modify_parameter_value("DP_CUTOFFSET2", inst_, 2000 - frameDT.Rows(i)("LENGTH") - cutOffset1)
End If
Next
End Sub
Private Shared Function Generate_FrameData(gratingParameters As DataRow)
Dim DT As New DataTable
DT.Columns.Add("TYPE", GetType(String))
DT.Columns.Add("LENGTH", GetType(Integer))
DT.Columns.Add("SIDE", GetType(Integer))
DT.Columns.Add("CORNER", GetType(Integer))
DT.Columns.Add("ROTATION", GetType(Integer))
DT.Columns.Add("OFFSET_W", GetType(Integer))
DT.Columns.Add("OFFSET_L", GetType(Integer))
Dim DTRow As DataRow
Dim corners As New Dictionary(Of String, Boolean)
For i = 0 To Data.gratingPoints.Rows.Count - 1
Dim i2, i0 As Integer
If i = 0 Then
i0 = Data.gratingPoints.Rows.Count - 1
Else
i0 = i - 1
End If
If i = Data.gratingPoints.Rows.Count - 1 Then
i2 = 0
Else
i2 = i + 1
End If
If Data.gratingPoints.Rows(i)("RECESS OK") Then
Dim firstOK, secondOK As Boolean
If Data.gratingPoints.Rows(i)("X") = Data.gratingPoints.Rows(i0)("X") Then
If Math.Abs(Data.gratingPoints.Rows(i)("Y") - Data.gratingPoints.Rows(i0)("Y")) * 1000 >= 210 Then
firstOK = True
Else
firstOK = False
End If
Else
If Math.Abs(Data.gratingPoints.Rows(i)("X") - Data.gratingPoints.Rows(i0)("X")) * 1000 >= 210 Then
firstOK = True
Else
firstOK = False
End If
End If
If Data.gratingPoints.Rows(i)("X") = Data.gratingPoints.Rows(i2)("X") Then
If Math.Abs(Data.gratingPoints.Rows(i)("Y") - Data.gratingPoints.Rows(i2)("Y")) * 1000 >= 210 Then
secondOK = True
Else
secondOK = False
End If
Else
If Math.Abs(Data.gratingPoints.Rows(i)("X") - Data.gratingPoints.Rows(i2)("X")) * 1000 >= 210 Then
secondOK = True
Else
secondOK = False
End If
End If
If firstOK = True AndAlso secondOK = True Then
corners.Add(Data.gratingPoints.Rows(i)("NAME"), True)
DTRow = DT.NewRow
DTRow("TYPE") = "CORNER"
DTRow("CORNER") = Data.gratingPoints.Rows(i)("QUADRANT")
DTRow("ROTATION") = (Data.gratingPoints.Rows(i)("QUADRANT") - 1) * 90
If DTRow("CORNER") = 1 Then
DTRow("OFFSET_W") = gratingParameters("WIDTH")
DTRow("OFFSET_L") = 0
ElseIf DTRow("CORNER") = 2 Then
DTRow("OFFSET_W") = gratingParameters("WIDTH")
DTRow("OFFSET_L") = gratingParameters("LENGTH")
ElseIf DTRow("CORNER") = 3 Then
DTRow("OFFSET_W") = 0
DTRow("OFFSET_L") = gratingParameters("LENGTH")
Else
DTRow("OFFSET_W") = 0
DTRow("OFFSET_L") = 0
End If
DT.Rows.Add(DTRow)
Else
corners.Add(Data.gratingPoints.Rows(i)("NAME"), False)
End If
End If
Next
For i = 0 To Data.gratingPoints.Rows.Count - 1
Dim i2 As Integer
If i = Data.gratingPoints.Rows.Count - 1 Then
i2 = 0
Else
i2 = i + 1
End If
Dim sideFrame As Boolean = False
If Data.gratingPoints.Rows(i)("X") = Data.gratingPoints.Rows(i2)("X") Then
If Data.gratingPoints.Rows(i)("X") = Data.grossAreaPoints.Rows(0)("X") Or Data.gratingPoints.Rows(i)("X") = Data.grossAreaPoints.Rows(1)("X") Then
sideFrame = True
End If
ElseIf Data.gratingPoints.Rows(i)("Y") = Data.gratingPoints.Rows(i2)("Y") Then
If Data.gratingPoints.Rows(i)("Y") = Data.grossAreaPoints.Rows(0)("Y") Or Data.gratingPoints.Rows(i)("Y") = Data.grossAreaPoints.Rows(3)("Y") Then
sideFrame = True
End If
End If
If sideFrame = True Then
DTRow = DT.NewRow
DTRow("TYPE") = "SIDE"
Dim extraCorner1 As Integer = 0
Dim extraCorner2 As Integer = 0
Dim numOfP As Integer = 0
If Data.gratingPoints.Rows(i)("NAME").substring(0, 1) = "P" AndAlso Data.gratingPoints.Rows(i2)("NAME").substring(0, 1) = "P" Then
numOfP = 2
If corners(Data.gratingPoints.Rows(i)("NAME")) = False Then
extraCorner1 = 200
End If
If corners(Data.gratingPoints.Rows(i2)("NAME")) = False Then
extraCorner2 = 200
End If
ElseIf Data.gratingPoints.Rows(i)("NAME").substring(0, 1) = "P" Then
numOfP = 1
If corners(Data.gratingPoints.Rows(i)("NAME")) = False Then
extraCorner1 = 200
End If
ElseIf Data.gratingPoints.Rows(i2)("NAME").substring(0, 1) = "P" Then
numOfP = 1
If corners(Data.gratingPoints.Rows(i2)("NAME")) = False Then
extraCorner2 = 200
End If
End If
If Data.gratingPoints.Rows(i)("X") = Data.gratingPoints.Rows(i2)("X") Then
If Data.gratingPoints.Rows(i)("Y") > Data.gratingPoints.Rows(i2)("Y") Then
DTRow("SIDE") = 3
DTRow("LENGTH") = (Data.gratingPoints.Rows(i)("Y") - Data.gratingPoints.Rows(i2)("Y")) * 1000 - 20 - numOfP * 200 + extraCorner1 + extraCorner2
If Data.gratingPoints.Rows(i2)("NAME").substring(0, 1) = "P" Then
DTRow("OFFSET_W") = 210 - extraCorner2
Else
DTRow("OFFSET_W") = Data.gratingW / 2 + Data.gratingPoints.Rows(i2)("Y") * 1000 + 10
End If
DTRow("OFFSET_L") = gratingParameters("LENGTH")
Else
DTRow("SIDE") = 1
DTRow("LENGTH") = (Data.gratingPoints.Rows(i2)("Y") - Data.gratingPoints.Rows(i)("Y")) * 1000 - 20 - numOfP * 200 + extraCorner1 + extraCorner2
If Data.gratingPoints.Rows(i)("NAME").substring(0, 1) = "P" Then
DTRow("OFFSET_W") = DTRow("LENGTH") + 210 - extraCorner1
Else
DTRow("OFFSET_W") = DTRow("LENGTH") + Data.gratingW / 2 + Data.gratingPoints.Rows(i)("Y") * 1000 + 10
End If
DTRow("OFFSET_L") = 0
End If
Else
If Data.gratingPoints.Rows(i)("X") > Data.gratingPoints.Rows(i2)("X") Then
DTRow("SIDE") = 4
DTRow("LENGTH") = (Data.gratingPoints.Rows(i)("X") - Data.gratingPoints.Rows(i2)("X")) * 1000 - 20 - numOfP * 200 + extraCorner1 + extraCorner2
DTRow("OFFSET_W") = 0
If Data.gratingPoints.Rows(i2)("NAME").substring(0, 1) = "P" Then
DTRow("OFFSET_L") = 210 - extraCorner2
Else
DTRow("OFFSET_L") = Data.gratingL / 2 + Data.gratingPoints.Rows(i2)("X") * 1000 + 10
End If
Else
DTRow("SIDE") = 2
DTRow("LENGTH") = (Data.gratingPoints.Rows(i2)("X") - Data.gratingPoints.Rows(i)("X")) * 1000 - 20 - numOfP * 200 + extraCorner1 + extraCorner2
DTRow("OFFSET_W") = gratingParameters("WIDTH")
If Data.gratingPoints.Rows(i)("NAME").substring(0, 1) = "P" Then
DTRow("OFFSET_L") = DTRow("LENGTH") + 210 - extraCorner1
Else
DTRow("OFFSET_L") = DTRow("LENGTH") + Data.gratingL / 2 + Data.gratingPoints.Rows(i)("X") * 1000 + 10
End If
End If
End If
DTRow("ROTATION") = 360 - DTRow("SIDE") * 90
If DTRow("LENGTH") >= 125 Then
DT.Rows.Add(DTRow)
End If
End If
Next
Return DT
End Function
Private Shared Function Generate_CuttingList(frameDT As DataTable, sideFrameLengths As Dictionary(Of String, Integer))
Dim frameLengths As New Dictionary(Of String, Integer)
For i = 0 To sideFrameLengths.Count - 1
frameLengths.Add(sideFrameLengths.ElementAt(i).Key, sideFrameLengths.ElementAt(i).Value)
Next
Dim cuttingList As New Dictionary(Of Integer, Integer())
While frameLengths.Count > 0
Dim frameCutList As New Dictionary(Of String, Integer)
frameCutList.Add(frameLengths.ElementAt(0).Key, frameLengths.ElementAt(0).Value)
frameLengths.Remove(frameLengths.ElementAt(0).Key)
For i = 0 To 100
Dim lengthRemaining As Integer = 2000
For j = 0 To frameCutList.Count - 1
lengthRemaining -= frameCutList.ElementAt(j).Value
Next
Dim restLength As Integer = 2000
Dim frameID As String = ""
For j = 0 To frameLengths.Count - 1
If lengthRemaining - frameLengths.ElementAt(j).Value > 0 AndAlso lengthRemaining - frameLengths.ElementAt(j).Value < restLength Then
restLength = lengthRemaining - frameLengths.ElementAt(j).Value
frameID = frameLengths.ElementAt(j).Key
End If
Next
If frameID = "" Then
Exit For
Else
frameCutList.Add(frameID, frameLengths(frameID))
frameLengths.Remove(frameID)
End If
Next
Dim cutFrameIDs(frameCutList.Count - 1) As Integer
For i = 0 To frameCutList.Count - 1
cutFrameIDs(i) = frameCutList.ElementAt(i).Key.Split(" ")(1)
Next
cuttingList.Add(cuttingList.Count + 1, cutFrameIDs)
End While
Return cuttingList
End Function
Public Shared Sub Generate_End_Frame_Pieces()
Dim swApp As SldWorks.SldWorks
swApp = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application"), SldWorks.SldWorks)
Dim boolstatus As Boolean
Dim longstatus As Integer, longwarnings As Integer
For j = 0 To cuttingList.Count - 1
Dim Part = swApp.OpenDoc6(Settings.HLCtFolder & "\HLCt\frame_l_straight.SLDPRT", 1, 0, "", longstatus, longwarnings)
longstatus = Part.SaveAs3(Individual.filepath & "\Temp\frame_l_end_piece" & j + 1 & ".SLDPRT", 0, 0) 'FIXA ettan
Dim swEquationMgr As EquationMgr
swEquationMgr = Part.GetEquationMgr()
Dim counter As String = 0
For i = 0 To swEquationMgr.GetCount() - 1
Dim equationName = swEquationMgr.Equation(i)
Dim tempName = equationName.Substring(1, equationName.Length - 2)
tempName = tempName.Split("""")(0)
equationName = equationName.Split("=")(0) & "= "
If tempName = "DP_HEIGHT" Then
swEquationMgr.Equation(i) = equationName & 30 'FIXA
counter += 1
ElseIf tempName = "DP_WIDTH" Then
swEquationMgr.Equation(i) = equationName & 40 'FIXA
counter += 1
ElseIf tempName = "DP_CUTOFFSET1" Then
Dim cutLength As Integer = 0
For k = 0 To cuttingList.ElementAt(j).Value.Count - 1
cutLength += sideFrameLengths("Frame " & cuttingList.ElementAt(j).Value(k))
Next
swEquationMgr.Equation(i) = equationName & cutLength
counter += 1
ElseIf tempName.Split("_")(0) = "DP" Then
swEquationMgr.Equation(i) = equationName & 0
counter += 1
End If
If counter = 7 Then
Exit For
End If
Next
boolstatus = Part.EditRebuild3()
Dim swErrors As Integer
Dim swWarnings As Integer
boolstatus = Part.Save3(1, swErrors, swWarnings)
swApp.CloseDoc(Individual.filepath & "\Temp\frame_l_end_piece" & j + 1 & ".SLDPRT")
Next
End Sub
End Class