Imports System.Collections.ObjectModel Imports System.Collections.Specialized Imports System.ComponentModel Imports System.IO Imports EgtBEAMWALL.Core Imports EgtUILib Imports EgtWPFLib5 Public Class BeamMachGroupVM Inherits MyMachGroupVM Public ReadOnly Property m_BeamMachGroupM As BeamMachGroupM Get Return m_MachGroupM End Get End Property Public Property sStartCut As String Get Return LenToString(m_BeamMachGroupM.dStartCut, 3) End Get Set(value As String) Dim dValue As Double If StringToLen(value, dValue) Then Dim dOldValue As Double = m_BeamMachGroupM.dStartCut m_BeamMachGroupM.dStartCut = dValue If Not ReDrawBeamMachgroup() Then ' rispristino vecchio valore m_BeamMachGroupM.dStartCut = dOldValue ReDrawBeamMachgroup() End If m_BeamMachGroupM.dStartCut = dValue EgtDraw() If PartVMList.Count > 0 Then Dim Beam As BeamVM = DirectCast(PartVMList(0), BeamVM) Beam.m_BeamM.UpdateOffset() Beam.NotifyPropertyChanged(NameOf(Beam.sOffset)) End If Else NotifyPropertyChanged(NameOf(sStartCut)) End If End Set End Property Public Property dStartCut As Double Get Return m_BeamMachGroupM.dStartCut End Get Set(value As Double) m_BeamMachGroupM.dStartCut = value End Set End Property Public Property SelBeam As BeamVM Get Return m_SelPart End Get Set(value As BeamVM) m_SelPart = value End Set End Property #Region "CONSTRUCTORS" Sub New(BeamMachGroupM As BeamMachGroupM) MyBase.New(BeamMachGroupM) AddHandler m_BeamMachGroupM.PartAdded, AddressOf OnBeamAdded AddHandler m_BeamMachGroupM.PartRemoved, AddressOf OnBeamRemoved CreateBeamVMList() End Sub #End Region ' CONSTRUCTORS #Region "METHODS" Private Sub CreateBeamVMList() Dim all As List(Of BeamVM) = (From BeamM In m_BeamMachGroupM.GetParts() Select New BeamVM(BeamM, Me)).ToList() For Each BeamVM As BeamVM In all AddHandler BeamVM.PropertyChanged, AddressOf OnBeamVMPropertyChanged Next m_PartVMList = New ObservableCollection(Of PartVM)(all) AddHandler m_PartVMList.CollectionChanged, AddressOf OnBeamVMListChanged End Sub #End Region ' METHODS Public Overrides Sub RefreshPartList() ' leggo StartCut da posizione primo pezzo Dim sInfo As String = "" Dim sSplitInfo() As String Dim bFound As Boolean = False EgtGetInfo(Id, MGR_RPT_PART & 1, sInfo) If Not String.IsNullOrWhiteSpace(sInfo) Then sSplitInfo = sInfo.Split(","c) StringToDouble(sSplitInfo(1), m_BeamMachGroupM.dStartCut) Else m_BeamMachGroupM.dStartCut = 0 End If '''' aggiorno lista pezzi '''PartVMList.Clear() '''Dim nRawPartId As Integer = EgtGetFirstRawPart() '''While nRawPartId <> GDB_ID.NULL ''' Dim nPartId As Integer = EgtGetFirstPartInRawPart(nRawPartId) ''' If nPartId <> GDB_ID.NULL Then ''' Dim NewBeam As BeamVM = New BeamVM(Me, nPartId, nRawPartId) ''' PartVMList.Add(NewBeam) ''' NewBeam.UpdateOffset() ''' End If ''' nRawPartId = EgtGetNextRawPart(nRawPartId) '''End While End Sub Public Overrides Sub RefreshGroupData() End Sub Friend Sub UpdateUsage() m_BeamMachGroupM.SetTotMat(dL) m_BeamMachGroupM.SetMatForPart(0) For Each Part In PartVMList m_BeamMachGroupM.SetMatForPart(m_BeamMachGroupM.dMatForPart + Part.dL) Next NotifyPropertyChanged(NameOf(dUsage)) NotifyPropertyChanged(NameOf(dWaste)) End Sub Friend Function ReDrawBeamMachgroup() As Boolean ' scrivo dati di tutti i pezzi Dim dPosX As Double = m_BeamMachGroupM.dStartCut Dim nIndex As Integer For nIndex = 0 To PartVMList.Count - 1 If nIndex <> 0 Then Dim Beam As BeamVM = DirectCast(PartVMList(nIndex), BeamVM) dPosX += Beam.m_BeamM.dOffset End If PartVMList(nIndex).dPOSX = dPosX EgtSetInfo(Id, MGR_RPT_PART & nIndex + 1, PartVMList(nIndex).nPartId & "," & DoubleToString(dPosX, 3)) dPosX += PartVMList(nIndex).dL Next ' elimino eventuali successive info pezzi di troppo nIndex = PartVMList.Count + 1 Dim sTemp As String = "" While EgtGetInfo(Id, MGR_RPT_PART & nIndex, sTemp) EgtSetInfo(Id, MGR_RPT_PART & nIndex, "") nIndex += 1 End While ' elimino vecchio grezzo ed eseguo script creazione nuovo Dim nRawId As Integer = EgtGetFirstRawPart() While nRawId <> GDB_ID.NULL EgtRemoveRawPart(nRawId) nRawId = EgtGetFirstRawPart() End While If Not ExecBeam(Map.refMainWindowVM.MainWindowM.sTempDir, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdType.RAWPART, False) Then Return False Return True End Function Friend Sub MoveBeam(Beam As BeamVM, MoveDirection As MoveDirections) Dim nBeamIndex As Integer = PartVMList.IndexOf(Beam) If nBeamIndex = 0 AndAlso MoveDirection = MoveDirections.UP Then Return If nBeamIndex = PartVMList.Count - 1 AndAlso MoveDirection = MoveDirections.DOWN Then Return ' se pezzo mosso diventa primo Dim FirstBeam As BeamVM If (nBeamIndex = 1 AndAlso MoveDirection = MoveDirections.UP) OrElse (nBeamIndex = 0 AndAlso MoveDirection = MoveDirections.DOWN) Then '' resetto offset per vecchio primo FirstBeam = DirectCast(PartVMList(0), BeamVM) FirstBeam.ResetOffset() End If PartVMList.Move(nBeamIndex, nBeamIndex + MoveDirection) ReDrawBeamMachgroup() ' aggiorno offset primo pezzo FirstBeam = DirectCast(PartVMList(0), BeamVM) FirstBeam.m_BeamM.UpdateOffset() FirstBeam.NotifyPropertyChanged(NameOf(FirstBeam.sOffset)) End Sub Friend Sub ReorderBeam() Dim TempPartList = PartVMList.OrderBy(Function(x) x.dL).ToList() ' verifico se non sono già in oridne Dim bSort As Boolean = False For PartIndex = 0 To PartVMList.Count - 1 If PartVMList(PartIndex).nPartId <> TempPartList(PartIndex).nPartId Then bSort = True Exit For End If Next If Not bSort Then Return ' resetto offset primo pezzo Dim FirstBeam As BeamVM = DirectCast(PartVMList(0), BeamVM) FirstBeam.ResetOffset() PartVMList.Clear() For Each Part In TempPartList PartVMList.Add(Part) Next ReDrawBeamMachgroup() ' aggiorno offset primo pezzo FirstBeam = DirectCast(PartVMList(0), BeamVM) FirstBeam.m_BeamM.UpdateOffset() FirstBeam.NotifyPropertyChanged(NameOf(FirstBeam.sOffset)) End Sub #Region "COMMANDS" #Region "DeleteMachGroup" ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Overrides Sub DeleteMachGroup() ' elimino tutte le copie Dim nRawPartId As Integer = EgtGetFirstRawPart() Dim nBeamId As Integer = EgtGetFirstPartInRawPart(nRawPartId) While nRawPartId <> GDB_ID.NULL If EgtRemovePartFromRawPart(nBeamId) Then Dim Part As PartVM = PartVMList.FirstOrDefault(Function(x) x.nPartId = nBeamId) Dim BTLPart As BTLPartVM = Part.RetrieveBTLPartFromPart() EgtErase(nBeamId) If Not IsNothing(BTLPart) Then BTLPart.RefreshPartInProd() End If nRawPartId = EgtGetNextRawPart(nRawPartId) nBeamId = EgtGetFirstPartInRawPart(nRawPartId) End While ' elimino MachGroup EgtRemoveMachGroup(Me.Id) ' rimuovo dalla lista grezzi Dim Index As Integer = Map.refMachGroupPanelVM.MachGroupVMList.IndexOf(Me) If Index = 0 Then If Map.refMachGroupPanelVM.MachGroupVMList.Count > 1 Then Map.refMachGroupPanelVM.SelectedMachGroup = Map.refMachGroupPanelVM.MachGroupVMList(0) Else Map.refMachGroupPanelVM.SelectedMachGroup = Nothing EgtDraw() End If ElseIf Index = Map.refMachGroupPanelVM.MachGroupvmList.Count - 1 Then If Map.refMachGroupPanelVM.MachGroupVMList.Count > 1 Then Map.refMachGroupPanelVM.SelectedMachGroup = Map.refMachGroupPanelVM.MachGroupVMList(Map.refMachGroupPanelVM.MachGroupVMList.Count - 2) Else Map.refMachGroupPanelVM.SelectedMachGroup = Nothing EgtDraw() End If Else Map.refMachGroupPanelVM.SelectedMachGroup = Map.refMachGroupPanelVM.MachGroupVMList(Index - 1) End If Map.refMachGroupPanelVM.MachGroupVMList.Remove(Me) End Sub #End Region ' DeleteMachGroup #End Region ' COMMANDS #Region "EVENTS" Private Sub OnBeamAdded(sender As Object, e As PartAddedEventArgs) Dim BeamVM As BeamVM = New BeamVM(e.NewPart, Me) PartVMList.Add(BeamVM) End Sub Private Sub OnBeamRemoved(sender As Object, e As PartAddedEventArgs) Dim BeamVM As BeamVM = PartVMList.FirstOrDefault(Function(x) x.PartM Is e.m_NewPart) If Not IsNothing(BeamVM) Then PartVMList.Remove(BeamVM) End Sub Private Sub OnBeamVMListChanged(sender As Object, e As NotifyCollectionChangedEventArgs) If Not IsNothing(e.NewItems) AndAlso e.NewItems.Count > 0 Then For Each BeamVM As BeamVM In e.NewItems AddHandler BeamVM.PropertyChanged, AddressOf OnBeamVMPropertyChanged Next End If If Not IsNothing(e.OldItems) AndAlso e.OldItems.Count > 0 Then For Each BeamVM As BeamVM In e.OldItems RemoveHandler BeamVM.PropertyChanged, AddressOf OnBeamVMPropertyChanged Next End If End Sub Private Sub OnBeamVMPropertyChanged(sender As Object, e As PropertyChangedEventArgs) 'Select Case e.PropertyName ' Case NameOf(sender.nSelGRP), NameOf(sender.nSelSIDE) 'End Select End Sub #End Region End Class