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 ' resetto validazione del pezzo primo pezzo If PartVMList.Count > 0 Then PartVMList(0).ResetCalcPart() Else ResetCalcMachGroup() 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 NotifyPropertyChanged(NameOf(sStartCut)) 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() ' Aggiorno stato da stati feature CalcGlobalUpdate() NotifyPropertyChanged(NameOf(CALC_FALL_Visibility)) 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 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 sono già in oridne Dim bSort As Boolean = True For PartIndex = 0 To PartVMList.Count - 1 If PartVMList(PartIndex).nPartId <> TempPartList(PartIndex).nPartId Then bSort = False Exit For End If Next If bSort Then Return ' resetto offset primo pezzo Dim FirstBeam As BeamVM = DirectCast(PartVMList(0), BeamVM) FirstBeam.ResetOffset() For PartIndex = 0 To TempPartList.Count - 1 If PartVMList(PartIndex).nPartId <> TempPartList(PartIndex).nPartId Then PartVMList.Move(PartVMList.IndexOf(TempPartList(PartIndex)), PartIndex) End If Next ReDrawBeamMachgroup() ' aggiorno offset primo pezzo FirstBeam = DirectCast(PartVMList(0), BeamVM) FirstBeam.m_BeamM.UpdateOffset() FirstBeam.NotifyPropertyChanged(NameOf(FirstBeam.sOffset)) End Sub Friend Overrides Function Copy() As MyMachGroupVM EgtResetCurrMachGroup() ' recupero lista dei pezzi BTL originali Dim PartList As New List(Of BTLPartVM) For Each Part In m_PartVMList PartList.Add(Part.RetrieveBTLPartFromPart()) Next ' verifico che nessun pezzo da copiare abbia raggiunto il numero massimo If Not VerifyPartCount(PartList) Then Return Nothing ' creo nuovo gruppo di lavorazione Map.refMachGroupPanelVM.AddMachGroup() Dim nCurrMachGroup As Integer = EgtGetCurrMachGroup() Dim sCurrMachGroupName As String = "" EgtGetMachGroupName(nCurrMachGroup, sCurrMachGroupName) ' scrivo dati per variabili P di comunicazione con la macchina in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_PRODID, Map.refProdManagerVM.CurrProd.nProdId) EgtSetInfo(nCurrMachGroup, MGR_RPT_PATTID, nCurrMachGroup) ' scrivo dati costruzione grezzo in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_BARLEN, dL) For Index = 0 To m_PartVMList.Count - 1 ' creo copia del pezzo Dim nPartDuploId As Integer = EgtDuploNew(PartList(Index).nPartId) ' elimino valori calcolo dell'originale MyMachGroupPanelVM.DuploRemoveProjCalc(nPartDuploId) ' lo rendo std EgtSetMode(nPartDuploId, GDB_MD.STD) ' scrivo dati costruzione grezzo in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & 1, nPartDuploId & "," & m_PartVMList(Index).sPOSX) Next Dim BeamMachGroup As BeamMachGroupVM = Map.refMachGroupPanelVM.GetLastMachGroup() ' eseguo script creazione grezzo Dim sLogPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\RawPartLog.txt" If Not ExecBeam(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdType.RAWPART, False) Then BeamMachGroup.DeleteMachGroup() Dim LogFile As String() = File.ReadAllLines(sLogPath) If LogFile.Count >= 2 AndAlso Not IsNothing(LogFile(1)) Then MessageBox.Show(LogFile(1), EgtMsg(30007), MessageBoxButton.OK, MessageBoxImage.Error) End If Return Nothing End If ' aggiorno contatore pezzi usati in Prod For Each Part In PartList Part.RefreshPartInProd() Next 'aggiorno lista pezzi BeamMachGroup.m_BeamMachGroupM.RefreshPartList() BeamMachGroup.m_BeamMachGroupM.RefreshGroupData() ' aggiorno dati ultilizzo barra BeamMachGroup.UpdateUsage() EgtSetView(VT.ISO_SW, False) Return BeamMachGroup End Function Private Function VerifyPartCount(SelParts As List(Of BTLPartVM)) As Boolean Dim sPartToAdd As String = "Raggiunto numero di pezzi da produrre per:" Dim bPartToAdd As Boolean = False For Each Part In SelParts ' verifico se ci sono pezzi da aggiungere If Not Part.CanAddPartToCount() Then bPartToAdd = True sPartToAdd &= Environment.NewLine & "- PDN" & Part.nPDN & " | BTL QTY " & Part.nCNT & " | ADDED QTY " & Part.nADDED End If Next sPartToAdd &= Environment.NewLine & "Aggiungerli?" If bPartToAdd Then If MessageBox.Show(sPartToAdd, "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then For Each Part In SelParts If Not Part.CanAddPartToCount() Then Part.AddNewPartToAdded() Next Else Return False End If End If Return True End Function #End Region ' METHODS #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 e.Action = NotifyCollectionChangedAction.Add Then 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 End If If e.Action = NotifyCollectionChangedAction.Remove Then 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 If If e.Action = NotifyCollectionChangedAction.Move Then Dim ItemVM As PartVM = e.OldItems(0) m_BeamMachGroupM.PartMList.RemoveAt(e.OldStartingIndex) m_BeamMachGroupM.PartMList.Insert(e.NewStartingIndex, ItemVM.PartM) 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