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