ae7768425e
- aggiunti messaggi e tooltip - aggiunte verifiche su comandi - aggiunto backup json per stato e momento di inizio e fine
971 lines
34 KiB
VB.net
971 lines
34 KiB
VB.net
Imports System.Collections.ObjectModel
|
|
Imports System.IO
|
|
Imports Newtonsoft.Json
|
|
Imports System.Windows.Threading
|
|
Imports System.Text.RegularExpressions
|
|
Imports System.Security.Cryptography
|
|
Imports Newtonsoft.Json.Linq
|
|
Imports Effector.Plugin.StoneCut.Door
|
|
Imports System.Globalization
|
|
Imports System.Diagnostics
|
|
Imports Effector.Plugin.Lib
|
|
|
|
Public Class DoorListPageVM
|
|
Inherits VMBase
|
|
|
|
Private m_BackupTimer As New DispatcherTimer
|
|
Private m_WriteCSVTimer As New DispatcherTimer
|
|
Private m_RefreshGraphicsTimer As New DispatcherTimer
|
|
Private m_ExecProcessManager As ExecProcessManager
|
|
|
|
Private m_ReadPartProgramFolderTimer As New DispatcherTimer
|
|
Private m_sPartProgramFolderPath As String
|
|
|
|
Private m_DoorList As New ObservableCollection(Of Door)
|
|
|
|
Private m_bResetList As Boolean = False
|
|
Public ReadOnly Property bResetList As Boolean
|
|
Get
|
|
Return m_bResetList
|
|
End Get
|
|
End Property
|
|
Friend Sub ResetResetList()
|
|
m_bResetList = False
|
|
End Sub
|
|
|
|
Public ReadOnly Property DoorList As ObservableCollection(Of Door)
|
|
Get
|
|
Return m_DoorList
|
|
End Get
|
|
End Property
|
|
|
|
Private m_DDTList As New ObservableCollection(Of String)
|
|
Public ReadOnly Property DDTList As ObservableCollection(Of String)
|
|
Get
|
|
Return m_DDTList
|
|
End Get
|
|
End Property
|
|
|
|
Private m_ManualAddedDoorName As String = "Manual"
|
|
Public ReadOnly Property ManualAddedDoorName As String
|
|
Get
|
|
Return m_ManualAddedDoorName
|
|
End Get
|
|
End Property
|
|
|
|
Private m_bExecButton_IsEnabled As Boolean = True
|
|
Public ReadOnly Property bExecButton_IsEnabled As Boolean
|
|
Get
|
|
Return m_bExecButton_IsEnabled
|
|
End Get
|
|
End Property
|
|
Private Sub SetExecButtonIsEnabled(bValue As Boolean)
|
|
m_bExecButton_IsEnabled = bValue
|
|
NotifyPropertyChanged(NameOf(bExecButton_IsEnabled))
|
|
End Sub
|
|
Private m_nModifyIndex As Integer = 0
|
|
Private m_nBackupindex As Integer = 0
|
|
Private m_bWritingBackup As Boolean = False
|
|
|
|
Private m_sCSVOutDirPath As String = ""
|
|
|
|
Private m_nExecIncrement As Integer = 0
|
|
Private m_nExecutedArgsCount As Integer = 0
|
|
Public ReadOnly Property dExecPercentage As Double
|
|
Get
|
|
If m_bCreatingDdfs Then
|
|
Return 5 / m_nTotCreatingDdf * m_nCurrCreatingDdf
|
|
End If
|
|
If IsNothing(m_ExecProcessManager) Then Return 0
|
|
Dim dExecIncrement As Double = If(m_ExecProcessManager.nArgsInQueue = 0, 0, Math.Min(28, m_nExecIncrement) / 34)
|
|
Return (m_ExecProcessManager.nExecutedArgsCounter + dExecIncrement) / (m_ExecProcessManager.nExecutedArgsCounter + m_ExecProcessManager.nArgsInQueue) * 100
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property sExecPercentage As String
|
|
Get
|
|
Return DoubleToString(dExecPercentage, 1) & "%"
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property ExecPercentage_Visibility As Visibility
|
|
Get
|
|
Return If((Not IsNothing(m_ExecProcessManager) AndAlso m_ExecProcessManager.ExecutionThreadStatus = ExecProcessManager.ExecutionThreadStatuses.RUNNING) OrElse m_bCreatingDdfs, Visibility.Visible, Visibility.Collapsed)
|
|
End Get
|
|
End Property
|
|
|
|
Private m_bCreatingDdfs As Boolean
|
|
Private m_nTotCreatingDdf As Integer
|
|
Private m_nCurrCreatingDdf As Integer
|
|
|
|
#Region "Messages"
|
|
|
|
Public ReadOnly Property Id_Msg As String
|
|
Get
|
|
Return EgtMsg(12001)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property FileName_Msg As String
|
|
Get
|
|
Return EgtMsg(12002)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property Table_Msg As String
|
|
Get
|
|
Return EgtMsg(12003)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property FileDimension_Msg As String
|
|
Get
|
|
Return EgtMsg(12004)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property State_Msg As String
|
|
Get
|
|
Return EgtMsg(12005)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property MachiningStart_Msg As String
|
|
Get
|
|
Return EgtMsg(12006)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property MachiningEnd_Msg As String
|
|
Get
|
|
Return EgtMsg(12007)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property MachiningTime_Msg As String
|
|
Get
|
|
Return EgtMsg(12008)
|
|
End Get
|
|
End Property
|
|
|
|
#End Region ' Messages
|
|
|
|
#Region "Tooltip"
|
|
|
|
Public ReadOnly Property ProduceAll_Tooltip As String
|
|
Get
|
|
Return EgtMsg(12021)
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property ResetProductionQueue_Tooltip As String
|
|
Get
|
|
Return EgtMsg(12022)
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property DeleteAll_Tooltip As String
|
|
Get
|
|
Return EgtMsg(12023)
|
|
End Get
|
|
End Property
|
|
|
|
#End Region ' Tooltip
|
|
|
|
' Definizione comandi
|
|
Private m_cmdProduce As ICommand
|
|
Private m_cmdProduceAll As ICommand
|
|
Private m_cmdResetProductionQueue As ICommand
|
|
Private m_cmdMoveUp As ICommand
|
|
Private m_cmdMoveDown As ICommand
|
|
Private m_cmdNotProduce As ICommand
|
|
Private m_cmdCopy As ICommand
|
|
' Private m_cmdMultipleCopy As ICommand
|
|
Private m_cmdDelete As ICommand
|
|
Private m_cmdDeleteAll As ICommand
|
|
|
|
#Region "CONSTRUCTOR"
|
|
|
|
Sub New()
|
|
' imposto riferimento in Map
|
|
Map.SetRefDoorListPageVM(Me)
|
|
' leggo backup
|
|
Dim sBackupDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, "BackupDir", "", sBackupDirPath)
|
|
Dim sBackupFilePath As String = sBackupDirPath & "\Backup.json"
|
|
Read(sBackupFilePath)
|
|
ResetProductionQueue()
|
|
m_BackupTimer.Interval = New TimeSpan(0, 0, 1)
|
|
AddHandler m_BackupTimer.Tick, AddressOf BackupTimer_Tick
|
|
m_WriteCSVTimer.Interval = New TimeSpan(0, 1, 0)
|
|
AddHandler m_WriteCSVTimer.Tick, AddressOf WriteCSVTimer_Tick
|
|
m_RefreshGraphicsTimer.Interval = New TimeSpan(0, 0, 1)
|
|
AddHandler m_RefreshGraphicsTimer.Tick, AddressOf RefreshGraphicsTimer_Tick
|
|
m_BackupTimer.Start()
|
|
' verifico path salvataggio CSV
|
|
Dim bStartWriteCSV As Boolean = False
|
|
If GetPluginPrivateProfileInt(S_GENERAL, K_ISCSVOUTPUTENABLED, 0) = 1 Then
|
|
bStartWriteCSV = True
|
|
If GetPluginPrivateProfileString(S_GENERAL, K_CSVOUTPUTPATH, "", m_sCSVOutDirPath) = 0 Then
|
|
bStartWriteCSV = False
|
|
MessageBox.Show("Path di salvataggio CSV non impostata! Impossibile creare file CSV!", "Errore!", MessageBoxButton.OK, MessageBoxImage.Error)
|
|
End If
|
|
If bStartWriteCSV AndAlso Not Directory.Exists(m_sCSVOutDirPath) Then
|
|
bStartWriteCSV = False
|
|
MessageBox.Show("Path di salvataggio CSV impostata non esiste! Impossibile creare file CSV!", "Errore!", MessageBoxButton.OK, MessageBoxImage.Error)
|
|
End If
|
|
If bStartWriteCSV Then
|
|
m_WriteCSVTimer.Start()
|
|
End If
|
|
End If
|
|
m_RefreshGraphicsTimer.Start()
|
|
|
|
' leggo path cartella dei partprogram
|
|
GetPluginPrivateProfileString(S_GENERAL, "PartProgramFolder", "", m_sPartProgramFolderPath)
|
|
If Not Directory.Exists(m_sPartProgramFolderPath) Then
|
|
MessageBox.Show("Folder not found! Folder path not configured correctly")
|
|
End If
|
|
' avvio timer di copia file
|
|
AddHandler m_ReadPartProgramFolderTimer.Tick, AddressOf ReadPartProgramFolderTimer_Tick
|
|
m_ReadPartProgramFolderTimer.Interval = TimeSpan.FromSeconds(1)
|
|
m_ReadPartProgramFolderTimer.Start()
|
|
End Sub
|
|
#End Region ' CONSTRUCTOR
|
|
|
|
#Region "METHODS"
|
|
|
|
Private Sub ReadPartProgramFolderTimer_Tick(sender As Object, e As EventArgs)
|
|
Dim FileList() As String = Directory.GetFiles(m_sPartProgramFolderPath)
|
|
If FileList.Count = 0 Then Return
|
|
' copio file e li metto in lista
|
|
Dim sPartProgramDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, "PartProgramDir", "", sPartProgramDirPath)
|
|
For nFileIndex = 0 To FileList.Count - 1
|
|
Dim bFileMove As Boolean = False
|
|
|
|
Dim sNewFilePath As String = sPartProgramDirPath & "\" & Path.GetFileName(FileList(nFileIndex))
|
|
Try
|
|
File.Move(FileList(nFileIndex), sNewFilePath)
|
|
bFileMove = True
|
|
Catch ex As Exception
|
|
MessageBox.Show("Impossible loading file " & FileList(0))
|
|
End Try
|
|
If bFileMove Then
|
|
Dim CurrFileInfo As New FileInfo(sNewFilePath)
|
|
Dim CurrFileLength As Double = CDbl(CurrFileInfo.Length)
|
|
Dim CurrFileLines = File.ReadLines(sNewFilePath).Take(10).ToList()
|
|
Dim nId As Integer = 0
|
|
Dim nTable As Integer = 0
|
|
For nLineIndex = 0 To CurrFileLines.Count - 1
|
|
Dim IdMatch As Match = Regex.Match(CurrFileLines(nLineIndex), ".*\(ID=(\d+)\)")
|
|
If Not IsNothing(IdMatch) AndAlso Not String.IsNullOrWhiteSpace(IdMatch.Value) Then
|
|
Integer.TryParse(IdMatch.Groups(1).Value, nId)
|
|
End If
|
|
Dim TableMatch As Match = Regex.Match(CurrFileLines(nLineIndex), ".*\(TABLE=(\d+)\)")
|
|
If Not IsNothing(TableMatch) AndAlso Not String.IsNullOrWhiteSpace(TableMatch.Value) Then
|
|
Integer.TryParse(TableMatch.Groups(1).Value, nTable)
|
|
End If
|
|
If nId <> 0 AndAlso nTable <> 0 Then Exit For
|
|
Next
|
|
m_DoorList.Add(New Door(nId, Path.GetFileName(FileList(nFileIndex)), nTable, CurrFileLength))
|
|
End If
|
|
Next
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
Public Sub Read(FilePath As String)
|
|
If Not File.Exists(FilePath) Then Return
|
|
Dim sReadedFile As String = File.ReadAllText(FilePath)
|
|
Dim JsonDoorList As List(Of JsonDoor) = JsonConvert.DeserializeObject(Of List(Of JsonDoor))(sReadedFile)
|
|
JsonDoorList = JsonDoorList.OrderBy(Of Integer)(Function(x) x.nListIndex).ToList()
|
|
|
|
Dim TempDoorList As ObservableCollection(Of Door) = New ObservableCollection(Of Door)((From JsonDoor In JsonDoorList
|
|
Select New Door(JsonDoor)).ToList())
|
|
'For Each CurrDoor In TempDoorList
|
|
' If CurrDoor.nState >= Door.PartProgramStates.READY_FOR_PRODUCTION AndAlso CurrDoor.nState < Door.PartProgramStates.MACHINE_1_END Then
|
|
' CurrDoor.SetState(Door.PartProgramStates.VERIFIED, False)
|
|
' End If
|
|
'Next
|
|
'WriteBackup()
|
|
m_DoorList = TempDoorList
|
|
End Sub
|
|
|
|
Public Sub Write(FilePath As String)
|
|
Dim JsonDoorList As New List(Of JsonDoor)
|
|
For nDoorIndex As Integer = 0 To m_DoorList.Count - 1
|
|
JsonDoorList.Add(New JsonDoor(nDoorIndex, m_DoorList(nDoorIndex)))
|
|
Next
|
|
Dim JsonFromWindow As String = JsonConvert.SerializeObject(JsonDoorList, Formatting.Indented)
|
|
If File.Exists(FilePath) Then
|
|
Dim sBackupFilePath As String = Path.ChangeExtension(FilePath, ".bck")
|
|
If File.Exists(sBackupFilePath) Then
|
|
Try
|
|
File.Delete(sBackupFilePath)
|
|
Catch ex As Exception
|
|
Map.refSupervisorFunction.PlgOutLog("Error! Impossible deleting backup file!")
|
|
End Try
|
|
End If
|
|
Try
|
|
File.Move(FilePath, sBackupFilePath)
|
|
Catch ex As Exception
|
|
Map.refSupervisorFunction.PlgOutLog("Error! Impossible renaming backup file!")
|
|
End Try
|
|
End If
|
|
File.WriteAllText(FilePath, JsonFromWindow)
|
|
End Sub
|
|
|
|
Private Sub WriteBackupCmd()
|
|
If m_bWritingBackup Then Return
|
|
m_bWritingBackup = True
|
|
m_nBackupindex = m_nModifyIndex
|
|
Dim sBackupDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, K_BACKUPDIR, "", sBackupDirPath)
|
|
Dim sBackupFilePath As String = sBackupDirPath & "\Backup.json"
|
|
Write(sBackupFilePath)
|
|
m_bWritingBackup = False
|
|
End Sub
|
|
|
|
Friend Sub WriteBackup()
|
|
m_nModifyIndex += 1
|
|
End Sub
|
|
|
|
Private Sub BackupTimer_Tick(sender As Object, e As EventArgs)
|
|
If m_nBackupindex < m_nModifyIndex Then
|
|
WriteBackupCmd()
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub WriteCSVTimer_Tick(sender As Object, e As EventArgs)
|
|
'SaveCSV()
|
|
End Sub
|
|
|
|
Private Sub RefreshGraphicsTimer_Tick(sender As Object, e As EventArgs)
|
|
'If IsNothing(m_ExecProcessManager) Then Return
|
|
'' ciclo su coda risultati
|
|
'Dim ArgumentsResult As ProcessArgsResult = m_ExecProcessManager.ArgumentsResultDequeue
|
|
'While Not IsNothing(ArgumentsResult)
|
|
' ' aggiorno risultato sulla porta
|
|
' Dim CurrRequestDoor As Door = m_DoorList.FirstOrDefault(Function(x) x.nId = ArgumentsResult.ProcessArgs.nId)
|
|
' If Not IsNothing(CurrRequestDoor) Then
|
|
' CurrRequestDoor.SetState(If(ArgumentsResult.nResult = 0, Door.PartProgramStates.VERIFIED, Door.PartProgramStates.VERIFICATION_FAILED))
|
|
' ' elimino file generati
|
|
' Dim sGenDDFDirPath As String = ""
|
|
' GetPluginPrivateProfileString(S_GENERAL, K_GENDDFDIR, "", sGenDDFDirPath)
|
|
' Dim sDoorFileName As String = Path.GetFileNameWithoutExtension(CurrRequestDoor.sFileName) & "_" & CurrRequestDoor.nId
|
|
' Try
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".tok")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2.tok")
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".cnc")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_a.cnc")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_b.cnc")
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2.cnc")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2_a.cnc")
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".html")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2.html")
|
|
' 'If ArgumentsResult.nResult = 0 Then
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".log")
|
|
' 'End If
|
|
' ''File.Delete(sGenDDFDirPath & "\" & CurrRequestDoor.sDDFName & ".nge")
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".nge")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".sest")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2.sest")
|
|
' 'Dim SestFiles() As String = System.IO.Directory.GetFiles(sGenDDFDirPath & "\", sDoorFileName & "*.sest")
|
|
' 'For Each FilePath In SestFiles
|
|
' ' File.Delete(FilePath)
|
|
' 'Next
|
|
' ''File.Delete(sGenDDFDirPath & "\" & CurrRequestDoor.sDDFName & ".txt")
|
|
' File.Delete(sGenDDFDirPath & "\" & sDoorFileName & ".txt")
|
|
' 'File.Delete(sGenDDFDirPath & "\" & sDoorFileName & "_2.txt")
|
|
' Catch ex As Exception
|
|
|
|
' End Try
|
|
' End If
|
|
' ' verifico se ci sono altre porte dello stesso tipo da aggiornare
|
|
' If m_AssociationList.ContainsKey(CurrRequestDoor.nId) Then
|
|
' Dim SameDoorList As List(Of Integer) = m_AssociationList(CurrRequestDoor.nId)
|
|
' For Each CurrDoorId In SameDoorList
|
|
' Dim CurrDoor As Door = m_DoorList.FirstOrDefault(Function(x) x.nId = CurrDoorId)
|
|
' If Not IsNothing(CurrDoor) Then
|
|
' If CopyGenDdfFile(CurrRequestDoor, CurrDoor) Then
|
|
' CurrDoor.SetState(If(ArgumentsResult.nResult = 0, Door.PartProgramStates.VERIFIED, Door.PartProgramStates.VERIFICATION_FAILED))
|
|
' End If
|
|
' End If
|
|
' Next
|
|
' End If
|
|
' WriteBackup()
|
|
' ArgumentsResult = m_ExecProcessManager.ArgumentsResultDequeue
|
|
'End While
|
|
'' aggiorno grafica
|
|
'If m_nExecutedArgsCount <> m_ExecProcessManager.nExecutedArgsCounter Then
|
|
' m_nExecutedArgsCount = m_ExecProcessManager.nExecutedArgsCounter
|
|
' m_nExecIncrement = 0
|
|
'ElseIf m_ExecProcessManager.nCalculatingProcesses > 0 Then
|
|
' m_nExecIncrement += 1
|
|
'End If
|
|
'If Not bExecButton_IsEnabled AndAlso m_ExecProcessManager.ExecutionThreadStatus = ExecProcessManager.ExecutionThreadStatuses.RUNNING Then
|
|
' NotifyPropertyChanged(NameOf(dExecPercentage))
|
|
' NotifyPropertyChanged(NameOf(sExecPercentage))
|
|
'End If
|
|
'If Not bExecButton_IsEnabled AndAlso m_ExecProcessManager.ExecutionThreadStatus = ExecProcessManager.ExecutionThreadStatuses.STOPPED Then
|
|
' SetExecButtonIsEnabled(True)
|
|
'End If
|
|
'NotifyPropertyChanged(NameOf(ExecPercentage_Visibility))
|
|
End Sub
|
|
|
|
Friend Function GetNextDoor() As Door
|
|
Dim NextDoor As Door = m_DoorList.FirstOrDefault(Function(x) x.nState = Door.PartProgramStates.READY_FOR_PRODUCTION)
|
|
If Not IsNothing(NextDoor) Then
|
|
Map.refSupervisorFunction.PlgOutLog("GetNextDoor: door " & NextDoor.nId & " sent to NC")
|
|
NextDoor.SetState(Door.PartProgramStates.SENT_TO_NC)
|
|
WriteBackup()
|
|
End If
|
|
Return NextDoor
|
|
End Function
|
|
|
|
Friend Function NewDoorId() As Integer
|
|
Dim nId As Integer = 1
|
|
If m_DoorList.Count > 0 Then
|
|
Dim nMaxId As Integer = m_DoorList.Max(Of Integer)(Function(x) x.nId)
|
|
nId = nMaxId + 1
|
|
End If
|
|
Return nId
|
|
End Function
|
|
|
|
Friend Sub ResetStateAfterReset()
|
|
'For Each Door In m_DoorList
|
|
' If Door.nState > Door.PartProgramStates.VERIFIED AndAlso Door.nState < Door.PartProgramStates.MACHINE_1_END Then
|
|
' Door.SetState(Door.PartProgramStates.VERIFIED, False)
|
|
' End If
|
|
'Next
|
|
End Sub
|
|
|
|
#End Region ' METHODS
|
|
|
|
#Region "COMMANDS"
|
|
|
|
#Region "Copy"
|
|
|
|
Public ReadOnly Property Copy_Command As ICommand
|
|
Get
|
|
If m_cmdCopy Is Nothing Then
|
|
m_cmdCopy = New Command(AddressOf CopyCmd)
|
|
End If
|
|
Return m_cmdCopy
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub CopyCmd(CurrDoor As Door)
|
|
If IsNothing(CurrDoor) Then Return
|
|
Dim nId As Integer = NewDoorId()
|
|
Dim CopyDoor As Door = CurrDoor.Copy(nId)
|
|
If Not IsNothing(CopyDoor) Then
|
|
m_DoorList.Add(CurrDoor.Copy(nId))
|
|
End If
|
|
End Sub
|
|
|
|
|
|
#End Region ' CopyDoor
|
|
|
|
#Region "MoveUp"
|
|
|
|
Public ReadOnly Property MoveUp_Command As ICommand
|
|
Get
|
|
If m_cmdMoveUp Is Nothing Then
|
|
m_cmdMoveUp = New Command(AddressOf MoveUp)
|
|
End If
|
|
Return m_cmdMoveUp
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub MoveUp(CurrDoor As Object)
|
|
If IsNothing(CurrDoor) Then Return
|
|
Dim nOldIndex As Integer = m_DoorList.IndexOf(CurrDoor)
|
|
If nOldIndex = 0 Then Return
|
|
If (m_DoorList(nOldIndex - 1).nState >= Door.PartProgramStates.READY_FOR_PRODUCTION AndAlso m_DoorList(nOldIndex - 1).nState <> Door.PartProgramStates.NOTPRODUCE) Then Return
|
|
m_DoorList.Move(nOldIndex, nOldIndex - 1)
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
#End Region ' MoveUp
|
|
|
|
#Region "MoveDown"
|
|
|
|
Public ReadOnly Property MoveDown_Command As ICommand
|
|
Get
|
|
If m_cmdMoveDown Is Nothing Then
|
|
m_cmdMoveDown = New Command(AddressOf MoveDown)
|
|
End If
|
|
Return m_cmdMoveDown
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub MoveDown(CurrDoor As Door)
|
|
If IsNothing(CurrDoor) OrElse (CurrDoor.nState >= Door.PartProgramStates.READY_FOR_PRODUCTION AndAlso CurrDoor.nState <> Door.PartProgramStates.NOTPRODUCE) Then Return
|
|
Dim nOldIndex As Integer = m_DoorList.IndexOf(CurrDoor)
|
|
If nOldIndex = m_DoorList.Count - 1 Then Return
|
|
m_DoorList.Move(nOldIndex, nOldIndex + 1)
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
#End Region ' MoveDown
|
|
|
|
#Region "Delete"
|
|
|
|
Public ReadOnly Property Delete_Command As ICommand
|
|
Get
|
|
If m_cmdDelete Is Nothing Then
|
|
m_cmdDelete = New Command(AddressOf Delete)
|
|
End If
|
|
Return m_cmdDelete
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub Delete(CurrDoor As Door)
|
|
If m_DoorList.Count = 0 OrElse IsNothing(CurrDoor) OrElse CurrDoor.nState = PartProgramStates.READY_FOR_PRODUCTION OrElse CurrDoor.nState = PartProgramStates.SENT_TO_NC OrElse CurrDoor.nState = PartProgramStates.MACHINE_START Then Return
|
|
Dim bReset As Boolean = True
|
|
'If Not LuaGetGlobVar("bReset", bReset) OrElse Not bReset Then
|
|
' If (SelDoor.nState >= Door.PartProgramStates.READY_FOR_PRODUCTION AndAlso SelDoor.nState < Door.PartProgramStates.MACHINE_1_END) Then Return
|
|
'End If
|
|
If MessageBox.Show("Sei sicuro di voler cancellare la porta selezionata?", "Avviso", MessageBoxButton.YesNo, MessageBoxImage.Warning) = MessageBoxResult.Yes Then
|
|
' cancello file
|
|
Dim sPartProgramDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, "PartProgramDir", "", sPartProgramDirPath)
|
|
Try
|
|
File.Delete(sPartProgramDirPath & "\" & CurrDoor.sFileName)
|
|
Catch ex As Exception
|
|
|
|
End Try
|
|
m_DoorList.Remove(CurrDoor)
|
|
WriteBackup()
|
|
End If
|
|
End Sub
|
|
|
|
#End Region ' Delete
|
|
|
|
#Region "DeleteAll"
|
|
|
|
Public ReadOnly Property DeleteAll_Command As ICommand
|
|
Get
|
|
If m_cmdDeleteAll Is Nothing Then
|
|
m_cmdDeleteAll = New Command(AddressOf DeleteAll)
|
|
End If
|
|
Return m_cmdDeleteAll
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub DeleteAll()
|
|
If m_DoorList.Count = 0 Then Return
|
|
Dim bReset As Boolean = True
|
|
If MessageBox.Show("Sei sicuro di voler cancellare tutte le porte?", "Info", MessageBoxButton.YesNo, MessageBoxImage.Information) = MessageBoxResult.Yes Then
|
|
For PartProgramIndex = m_DoorList.Count - 1 To 0 Step -1
|
|
' cancello file
|
|
Dim sPartProgramDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, "PartProgramDir", "", sPartProgramDirPath)
|
|
Try
|
|
File.Delete(sPartProgramDirPath & "\" & m_DoorList(PartProgramIndex).sFileName)
|
|
Catch ex As Exception
|
|
|
|
End Try
|
|
m_DoorList.RemoveAt(PartProgramIndex)
|
|
Next
|
|
WriteBackup()
|
|
End If
|
|
End Sub
|
|
|
|
#End Region ' DeleteAll
|
|
|
|
#Region "Produce"
|
|
|
|
Public ReadOnly Property Produce_Command As ICommand
|
|
Get
|
|
If m_cmdProduce Is Nothing Then
|
|
m_cmdProduce = New Command(AddressOf Produce)
|
|
End If
|
|
Return m_cmdProduce
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub Produce(CurrDoor As Door)
|
|
ProduceDoor(CurrDoor)
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
Public Sub ProduceDoor(DoorToProduce As Door, Optional bWriteBackup As Boolean = True)
|
|
If DoorToProduce.nState <> PartProgramStates.NULL Then Return
|
|
If IsNothing(DoorToProduce) Then Return
|
|
' la sposto dopo l'ultima da produrre
|
|
Dim nNewIndex As Integer = m_DoorList.IndexOf(m_DoorList.FirstOrDefault(Function(x) x.nState < Door.PartProgramStates.READY_FOR_PRODUCTION OrElse x.nState = Door.PartProgramStates.NOTPRODUCE))
|
|
Dim nOldIndex As Integer = m_DoorList.IndexOf(DoorToProduce)
|
|
m_DoorList.Move(nOldIndex, nNewIndex)
|
|
DoorToProduce.SetState(Door.PartProgramStates.READY_FOR_PRODUCTION, bWriteBackup)
|
|
End Sub
|
|
|
|
#End Region ' Produce
|
|
|
|
#Region "ProduceAll"
|
|
|
|
Public ReadOnly Property ProduceAll_Command As ICommand
|
|
Get
|
|
If m_cmdProduceAll Is Nothing Then
|
|
m_cmdProduceAll = New Command(AddressOf ProduceAll)
|
|
End If
|
|
Return m_cmdProduceAll
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub ProduceAll()
|
|
If m_DoorList.Count = 0 Then Return
|
|
For nDoorIndex = 0 To m_DoorList.Count - 1
|
|
Dim CurrDoor As Door = m_DoorList(nDoorIndex)
|
|
If CurrDoor.nState <> Door.PartProgramStates.READY_FOR_PRODUCTION AndAlso CurrDoor.nState <> Door.PartProgramStates.SENT_TO_NC AndAlso CurrDoor.nState <> Door.PartProgramStates.MACHINE_START AndAlso CurrDoor.nState <> Door.PartProgramStates.PRODUCED Then
|
|
ProduceDoor(CurrDoor, False)
|
|
End If
|
|
Next
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
#End Region ' ProduceAll
|
|
|
|
#Region "ResetProductionQueue"
|
|
|
|
Public ReadOnly Property ResetProductionQueue_Command As ICommand
|
|
Get
|
|
If m_cmdResetProductionQueue Is Nothing Then
|
|
m_cmdResetProductionQueue = New Command(AddressOf ResetProductionQueueCmd)
|
|
End If
|
|
Return m_cmdResetProductionQueue
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub ResetProductionQueueCmd()
|
|
ResetProductionQueue()
|
|
WriteBackup()
|
|
End Sub
|
|
|
|
Public Sub ResetProductionQueue()
|
|
For Each Door In m_DoorList
|
|
If Door.nState = Door.PartProgramStates.READY_FOR_PRODUCTION OrElse Door.nState = Door.PartProgramStates.SENT_TO_NC Then
|
|
Door.SetState(Door.PartProgramStates.NULL)
|
|
End If
|
|
Next
|
|
m_bResetList = True
|
|
End Sub
|
|
|
|
#End Region ' ResetProductionQueue
|
|
|
|
#End Region ' COMMANDS
|
|
|
|
End Class
|
|
|
|
Public Class Door
|
|
Inherits VMBase
|
|
|
|
Public Enum SWINGTYPE As Integer
|
|
UNDEFINED = 0
|
|
RIGHT = 1
|
|
LEFT = 2
|
|
End Enum
|
|
|
|
Private Shared m_refWriteBackup As Action
|
|
|
|
Public Enum PartProgramStates As Integer
|
|
NULL = 0
|
|
READY_FOR_PRODUCTION = 1
|
|
SENT_TO_NC = 2
|
|
MACHINE_START = 3
|
|
PRODUCED = 4
|
|
NOTPRODUCE = 10
|
|
End Enum
|
|
|
|
Private m_nId As Integer
|
|
Public ReadOnly Property nId As Integer
|
|
Get
|
|
Return m_nId
|
|
End Get
|
|
End Property
|
|
|
|
Private m_sFileName As String
|
|
Public Property sFileName As String
|
|
Get
|
|
Return m_sFileName
|
|
End Get
|
|
Set(value As String)
|
|
m_sFileName = value
|
|
End Set
|
|
End Property
|
|
Public ReadOnly Property sFileNameWithoutExtension As String
|
|
Get
|
|
Return If(String.IsNullOrWhiteSpace(m_sFileName), "", Path.GetFileNameWithoutExtension(m_sFileName))
|
|
End Get
|
|
End Property
|
|
|
|
Private m_nTable As Integer
|
|
Public ReadOnly Property nTable As Integer
|
|
Get
|
|
Return m_nTable
|
|
End Get
|
|
End Property
|
|
|
|
Private m_dFileDimension As Double
|
|
Public ReadOnly Property dFileDimension As Double
|
|
Get
|
|
Return m_dFileDimension
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property sFileDimension As String
|
|
Get
|
|
Return DoubleToString(m_dFileDimension / 1000, 2) & "Kb"
|
|
End Get
|
|
End Property
|
|
|
|
Private m_nState As PartProgramStates = PartProgramStates.NULL
|
|
Public ReadOnly Property nState As PartProgramStates
|
|
Get
|
|
Return m_nState
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property sState As String
|
|
Get
|
|
Select Case m_nState
|
|
Case PartProgramStates.NULL
|
|
Return EgtMsg(12031)
|
|
Case PartProgramStates.READY_FOR_PRODUCTION
|
|
Return EgtMsg(12032)
|
|
Case PartProgramStates.SENT_TO_NC
|
|
Return EgtMsg(12033)
|
|
Case PartProgramStates.MACHINE_START
|
|
Return EgtMsg(12034)
|
|
Case PartProgramStates.PRODUCED
|
|
Return EgtMsg(12035)
|
|
Case PartProgramStates.NOTPRODUCE
|
|
Return EgtMsg(12036)
|
|
Case Else
|
|
Return EgtMsg(12037)
|
|
End Select
|
|
End Get
|
|
End Property
|
|
Friend Sub SetState(value As PartProgramStates, Optional bWriteBackup As Boolean = True, Optional bUpdate As Boolean = True)
|
|
m_nState = value
|
|
If bWriteBackup Then Map.refDoorListPageVM.WriteBackup()
|
|
If bUpdate Then
|
|
NotifyPropertyChanged(NameOf(nState))
|
|
NotifyPropertyChanged(NameOf(sState))
|
|
NotifyPropertyChanged(NameOf(Background))
|
|
End If
|
|
End Sub
|
|
|
|
#Region "Statistics"
|
|
|
|
Private m_dtMachiningStart As DateTime = DateTime.MinValue
|
|
Friend ReadOnly Property dtMachiningStart As DateTime
|
|
Get
|
|
Return m_dtMachiningStart
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property sMachiningStart As String
|
|
Get
|
|
Return ConvertDateTimeToString(m_dtMachiningStart)
|
|
End Get
|
|
End Property
|
|
Friend Sub SetMachiningStart(dtMachiningStart As DateTime)
|
|
m_dtMachiningStart = dtMachiningStart
|
|
NotifyPropertyChanged(NameOf(sMachiningStart))
|
|
End Sub
|
|
'Friend Sub SetMachiningStart(Machining1Start As Long)
|
|
' m_dtMachiningStart = New DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(Machining1Start).ToLocalTime()
|
|
' NotifyPropertyChanged(NameOf(sMachiningStart))
|
|
'End Sub
|
|
|
|
Private m_dtMachiningEnd As DateTime = DateTime.MinValue
|
|
Friend ReadOnly Property dtMachiningEnd As DateTime
|
|
Get
|
|
Return m_dtMachiningEnd
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property sMachiningEnd As String
|
|
Get
|
|
Return ConvertDateTimeToString(m_dtMachiningEnd)
|
|
End Get
|
|
End Property
|
|
Friend Sub SetMachiningEnd(dtMachiningEnd As DateTime)
|
|
m_dtMachiningEnd = dtMachiningEnd
|
|
NotifyPropertyChanged(NameOf(sMachiningEnd))
|
|
NotifyPropertyChanged(NameOf(sMachiningTime))
|
|
End Sub
|
|
|
|
Public ReadOnly Property sMachiningTime As String
|
|
Get
|
|
If m_dtMachiningStart = DateTime.MinValue OrElse m_dtMachiningEnd = DateTime.MinValue Then Return String.Format("{0:c}", TimeSpan.Zero)
|
|
Dim Time As TimeSpan = m_dtMachiningEnd - m_dtMachiningStart
|
|
Return String.Format("{0}:{1:00}:{2:00}", (Time.Days * 24 + Time.Hours), Time.Minutes, Time.Seconds + 1)
|
|
End Get
|
|
End Property
|
|
|
|
#End Region ' Statistics
|
|
|
|
Public ReadOnly Property Background As SolidColorBrush
|
|
Get
|
|
Select Case m_nState
|
|
Case PartProgramStates.NULL
|
|
Return Application.Current.FindResource("Omag_LightGray")
|
|
Case PartProgramStates.READY_FOR_PRODUCTION
|
|
Return Dictionary.Effector_LightBlue_Status
|
|
Case PartProgramStates.NOTPRODUCE
|
|
Return Dictionary.Effector_Yellow_Status
|
|
Case PartProgramStates.MACHINE_START
|
|
Return Dictionary.Effector_Blue_Status
|
|
Case PartProgramStates.PRODUCED
|
|
Return Dictionary.Effector_Gray_Status
|
|
Case Else
|
|
Return Brushes.LightGray
|
|
End Select
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property Foreground As SolidColorBrush
|
|
Get
|
|
Return Brushes.White
|
|
End Get
|
|
End Property
|
|
|
|
' Definizione comandi
|
|
Private m_cmdNotProduce As ICommand
|
|
|
|
#Region "CONSTRUCTOR"
|
|
|
|
Sub New(nId As Integer, sFileName As String, nTable As Integer, dFileDimension As Double)
|
|
m_nId = nId
|
|
m_sFileName = sFileName
|
|
m_nTable = nTable
|
|
m_dFileDimension = dFileDimension
|
|
End Sub
|
|
|
|
Sub New(JsonDoor As JsonDoor)
|
|
m_nId = JsonDoor.nId
|
|
m_sFileName = JsonDoor.sFileName
|
|
m_nTable = JsonDoor.nTable
|
|
m_dFileDimension = JsonDoor.dFileDimension
|
|
m_nState = JsonDoor.nState
|
|
m_dtMachiningStart = JsonDoor.dtMachiningStart
|
|
m_dtMachiningEnd = JsonDoor.dtMachiningEnd
|
|
End Sub
|
|
|
|
#End Region ' CONSTRUCTOR
|
|
|
|
#Region "METHODS"
|
|
|
|
Friend Function Copy(nId As Integer) As Door
|
|
Dim sPartProgramDirPath As String = ""
|
|
GetPluginPrivateProfileString(S_GENERAL, "PartProgramDir", "", sPartProgramDirPath)
|
|
Dim nCopyIndex As Integer = 1
|
|
Dim sFileExtension As String = Path.GetExtension(m_sFileName)
|
|
Dim sFileName As String = Path.GetFileNameWithoutExtension(m_sFileName)
|
|
While File.Exists(sPartProgramDirPath & "\" & sFileName & "_" & nCopyIndex & sFileExtension)
|
|
nCopyIndex += 1
|
|
End While
|
|
Dim bFileCopy As Boolean = False
|
|
Try
|
|
File.Copy(sPartProgramDirPath & "\" & m_sFileName, sPartProgramDirPath & "\" & sFileName & "_" & nCopyIndex & sFileExtension)
|
|
bFileCopy = True
|
|
Catch ex As Exception
|
|
End Try
|
|
If bFileCopy Then
|
|
Return New Door(nId, sFileName & "_" & nCopyIndex & sFileExtension, m_nTable, m_dFileDimension)
|
|
Else Return Nothing
|
|
End If
|
|
End Function
|
|
|
|
#End Region ' METHODS
|
|
|
|
#Region "COMMANDS"
|
|
|
|
#Region "NotProduce"
|
|
|
|
Public ReadOnly Property NotProduce_Command As ICommand
|
|
Get
|
|
If m_cmdNotProduce Is Nothing Then
|
|
m_cmdNotProduce = New Command(AddressOf NotProduce)
|
|
End If
|
|
Return m_cmdNotProduce
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub NotProduce()
|
|
If nState = Door.PartProgramStates.PRODUCED Then Return
|
|
SetState(If(nState = Door.PartProgramStates.NULL, Door.PartProgramStates.NOTPRODUCE, Door.PartProgramStates.NULL))
|
|
End Sub
|
|
|
|
#End Region ' NotProduceDoor
|
|
|
|
#End Region ' COMMANDS
|
|
|
|
End Class
|
|
|
|
Public Class CustomerParameter
|
|
|
|
Private m_sHeader As String
|
|
Public ReadOnly Property sHeader As String
|
|
Get
|
|
Return m_sHeader
|
|
End Get
|
|
End Property
|
|
|
|
Private m_sValue As String
|
|
Public ReadOnly Property sValue As String
|
|
Get
|
|
Return m_sValue
|
|
End Get
|
|
End Property
|
|
Friend Sub SetValue(value As String)
|
|
m_sValue = value
|
|
End Sub
|
|
|
|
Sub New(sHeader As String, sValue As String)
|
|
m_sHeader = sHeader
|
|
m_sValue = sValue
|
|
End Sub
|
|
|
|
End Class
|
|
|
|
Public Class StateToSelColorConverter
|
|
Implements IValueConverter
|
|
|
|
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
|
|
If Not TypeOf value Is PartProgramStates Then Return Brushes.Aqua
|
|
Select Case value
|
|
'Case PartProgramStates.LOADED_FROM_CSV
|
|
' Return Dictionary.Effector_White_SelStatus
|
|
'Case PartProgramStates.VERIFIED
|
|
' Return Dictionary.Effector_Green_SelStatus
|
|
'Case PartProgramStates.VERIFICATION_FAILED
|
|
' Return Dictionary.Effector_Red_SelStatus
|
|
Case PartProgramStates.NOTPRODUCE
|
|
Return Dictionary.Effector_Yellow_SelStatus
|
|
Case PartProgramStates.READY_FOR_PRODUCTION
|
|
Return Dictionary.Effector_LightBlue_SelStatus
|
|
Case PartProgramStates.MACHINE_START
|
|
Return Dictionary.Effector_Blue_SelStatus
|
|
Case PartProgramStates.PRODUCED
|
|
Return Dictionary.Effector_Gray_SelStatus
|
|
Case Else
|
|
Return Dictionary.Effector_White_SelStatus
|
|
End Select
|
|
End Function
|
|
|
|
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
|
|
Throw New NotImplementedException()
|
|
End Function
|
|
|
|
End Class
|
|
|
|
Public Class DDTListToBooleanConverter
|
|
Implements IValueConverter
|
|
|
|
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
|
|
If Not TypeOf value Is ObservableCollection(Of String) Then Return False
|
|
Return DirectCast(value, ObservableCollection(Of String)).Count = 0
|
|
End Function
|
|
|
|
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
|
|
Throw New NotImplementedException()
|
|
End Function
|
|
|
|
End Class |