Imports System.Windows.Threading Imports EgtWPFLib5 Imports System.IO Public Class ProbingPanelVM Inherits VMBase Public Enum ProbingModes As Integer STANDARD = 0 PROPERTIES = 1 End Enum Public Enum Properties As Integer NULL = 0 SKINNED = 1 EXTRUDED = 2 NOTHING_ = 3 End Enum ' Path di EgtCAM5 Private m_EgtCAM5Path As String Private m_CncFilePath As String Private m_DataFilePath As String Private m_CheckFileName As String Private m_DataFileName As String Private m_PartProgFileName As String ' Timer d'attesa Private m_Timer As New DispatcherTimer Private m_DDFPath As String Public ReadOnly Property DDFPath As String Get Return m_DDFPath End Get End Property Private m_DoorProperty As Properties Public ReadOnly Property DoorProperty As Properties Get Return m_DoorProperty End Get End Property Public ReadOnly Property DoorType As String Get Select Case m_DoorProperty Case Properties.SKINNED Return "Skinned" Case Properties.EXTRUDED Return "Extruded" Case Properties.NOTHING_ Return "Nothing" Case Else Return "" End Select End Get End Property Private m_DoorProperty_Visibility As Visibility Public ReadOnly Property DoorProperty_Visibility As Visibility Get Return m_DoorProperty_Visibility End Get End Property Private m_DoorMeasuring As Boolean Public Property DoorMeasuring As Boolean Get Return m_DoorMeasuring End Get Set(value As Boolean) m_DoorMeasuring = value End Set End Property Private m_DoorMeasuring_Visibility As Visibility Public ReadOnly Property DoorMeasuring_Visibility As Visibility Get Return m_DoorMeasuring_Visibility End Get End Property Private m_Width As String Public Property Width As String Get Return m_Width End Get Set(value As String) m_Width = value End Set End Property Private m_Height As String Public Property Height As String Get Return m_Height End Get Set(value As String) m_Height = value End Set End Property Private m_Thickness As String Public Property Thickness As String Get Return m_Thickness End Get Set(value As String) m_Thickness = value End Set End Property Private m_Status As String Public Property Status As String Get Return m_Status End Get Set(value As String) m_Status = value End Set End Property Public Property Progress_Value As Double Get Return m_Timer_Time / m_Timer_TimeOut * 100 End Get Set(value As Double) End Set End Property Private m_OpenDDF_IsEnabled As Boolean Public Property OpenDDF_IsEnabled As Boolean Get Return m_OpenDDF_IsEnabled End Get Set(value As Boolean) m_OpenDDF_IsEnabled = value End Set End Property Private m_Generate_IsEnabled As Boolean Public Property Generate_IsEnabled As Boolean Get Return m_Generate_IsEnabled End Get Set(value As Boolean) m_Generate_IsEnabled = value End Set End Property Private m_Timer_IsEnabled As Boolean = False Public Property Timer_IsEnabled As Boolean Get Return m_Timer_IsEnabled End Get Set(value As Boolean) m_Timer_IsEnabled = value End Set End Property ' Tempo per cui il timer resta in attesa, espresso in secondi Private m_Timer_TimeOut As Integer Private m_Timer_Time As Integer ' Modalità di tastatura Private m_ProbingMode As ProbingModes = ProbingModes.PROPERTIES ' definizione comandi Private m_cmdOpenDDF As ICommand Private m_cmdCancel As ICommand Private m_cmdGenerate As ICommand #Region "CONSTRUCTOR" Sub New() ' Leggo path EgtCAM5 Dim sTemp As String = "" GetMainPrivateProfileString(S_GENERAL, K_EGTCAM5PATH, "", sTemp) ' verifico che esista il file d'esecuzione If File.Exists(sTemp) Then m_EgtCAM5Path = sTemp Else MessageBox.Show("Can't find EgtCAM5 in the configured path." & Environment.NewLine & "Try to check in the Config.ini file." & Environment.NewLine & "The program will close", "Error!", MessageBoxButton.OK) End End If ' Leggo path CNC File GetMainPrivateProfileString(S_GENERAL, K_CNCFILEPATH, "", sTemp) ' verifico che esista il file d'esecuzione If Directory.Exists(sTemp) Then m_CncFilePath = sTemp Else MessageBox.Show("Can't find CNC file path." & Environment.NewLine & "Try to check in the Config.ini file." & Environment.NewLine & "The program will close", "Error!", MessageBoxButton.OK) End End If ' Leggo path Data File GetMainPrivateProfileString(S_GENERAL, K_DATAFILEPATH, "", sTemp) ' verifico che esista il file d'esecuzione If Directory.Exists(sTemp) Then m_DataFilePath = sTemp Else MessageBox.Show("Can't find Data path." & Environment.NewLine & "Try to check in the Config.ini file." & Environment.NewLine & "The program will close", "Error!", MessageBoxButton.OK) End End If ' Leggo nome Part Program File GetMainPrivateProfileString(S_GENERAL, K_PARTPROGRAMFILENAME, "", sTemp) ' verifico che non sia vuoto If Not String.IsNullOrWhiteSpace(sTemp) Then m_PartProgFileName = sTemp Else m_PartProgFileName = "Door.cnc" End If ' Leggo nome Data File GetMainPrivateProfileString(S_GENERAL, K_DATAFILENAME, "", sTemp) ' verifico che non sia vuoto If Not String.IsNullOrWhiteSpace(sTemp) Then m_DataFileName = sTemp Else m_DataFileName = "Data.dat" End If ' Leggo nome Check File GetMainPrivateProfileString(S_GENERAL, K_CHECKFILENAME, "", sTemp) ' verifico che non sia vuoto If Not String.IsNullOrWhiteSpace(sTemp) Then m_CheckFileName = sTemp Else m_CheckFileName = "PCHK.txt" End If ' settaggi timer AddHandler m_Timer.Tick, AddressOf WaitingTimer_Tick m_Timer.Interval = TimeSpan.FromMilliseconds(1000) ' Leggo timeout Dim nTemp As Integer = 0 GetMainPrivateProfileString(S_GENERAL, K_PROBINGTIMEOUT, "60", sTemp) If Not String.IsNullOrWhiteSpace(sTemp) And Integer.TryParse(sTemp, nTemp) Then m_Timer_TimeOut = nTemp Else m_Timer_TimeOut = 60 End If ' Leggo modalità di tastatura m_ProbingMode = GetMainPrivateProfileInt(S_GENERAL, K_PROBINGMODE, 1) If m_ProbingMode = ProbingModes.PROPERTIES Then m_DoorProperty_Visibility = Visibility.Visible m_DoorMeasuring_Visibility = Visibility.Collapsed Else m_DoorProperty_Visibility = Visibility.Collapsed m_DoorMeasuring_Visibility = Visibility.Visible End If NotifyPropertyChanged("DoorProperty_Visibility") NotifyPropertyChanged("DoorMeasuring_Visibility") ' Attivo bottone apertura DDF EnableDDFButton(True) End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Private Sub SetStatus(sValue As String) m_Status = sValue NotifyPropertyChanged("Status") End Sub Private Sub ResetStatus() m_Status = "" NotifyPropertyChanged("Status") End Sub Private Sub WaitingTimer_Tick(sender As Object, e As System.EventArgs) ' incremento il contatore m_Timer_Time += 1 NotifyPropertyChanged("Progress_Value") ' se trova il file di fine tastatura Dim EndProbeFilePath As String = m_DataFilePath & m_CheckFileName If File.Exists(EndProbeFilePath) Then ' fermo il timer m_Timer.Stop() m_Timer_Time = 0 m_Timer_IsEnabled = False NotifyPropertyChanged("Progress_Value") NotifyPropertyChanged("Timer_IsEnabled") SetStatus("Probe completed") ' lancio calcolo porta da file tastatura GenAfterProbe() EnableDDFButton(True) End If ' verifico che non sia finito il tempo di attesa If m_Timer_Time >= m_Timer_TimeOut Then m_Timer.Stop() m_Timer_Time = 0 m_Timer_IsEnabled = False NotifyPropertyChanged("Progress_Value") NotifyPropertyChanged("Timer_IsEnabled") SetStatus("Error in probing, can't find the probe file") EnableDDFButton(True) End If End Sub Private Sub GenAfterProbe() ' verifico se esiste il file dati del probe Dim DataFile As String = m_DataFilePath & m_DataFileName If Not File.Exists(DataFile) Then SetStatus("Can't find the Probe Data File") Return End If SetStatus("Start recalculating door from probe dimensions") ' copio file probe data in cartella ddf Try File.Delete(Path.GetDirectoryName(m_DDFPath) & "\" & "Data.dat") File.Copy(DataFile, Path.GetDirectoryName(m_DDFPath) & "\" & "Data.dat", True) Catch ex As Exception SetStatus("Error in copying the Probe Data File to the PC") Return End Try ' cancello file probe data sul CN Try File.Delete(DataFile) Catch ex As Exception SetStatus("Error in deleting the Probe Data File on the CNC" & Environment.NewLine & "Please, delete it manually") System.Threading.Thread.Sleep(2000) End Try ' cancello file txt e cnc del ddf Try File.Delete(Path.ChangeExtension(m_DDFPath, ".txt")) File.Delete(Path.ChangeExtension(m_DDFPath, ".cnc")) Catch ex As Exception End Try ' Lancio il programma in cieco per generazione porta ricalcolata Dim GenFilePath As String = Path.ChangeExtension(m_DDFPath, ".cnc") SetStatus("Generating the Part Program") Try Dim CommandLine As String = """" & m_DDFPath & """ " & "4" Process.Start(m_EgtCAM5Path, CommandLine) Dim bTxtOk As Boolean = False For I = 0 To 150 ' aspetto che venga generato il txt del ddf If Not bTxtOk AndAlso File.Exists(Path.ChangeExtension(m_DDFPath, ".txt")) Then bTxtOk = True ' pausa necessaria, altrimenti copia un file vuoto! System.Threading.Thread.Sleep(1000) End If If bTxtOk AndAlso File.Exists(GenFilePath) Then SetStatus("Part program correctly generated") Exit Try End If ' Aspetto e costringo ad aggiornare UI System.Threading.Thread.Sleep(100) UpdateUI() Next SetStatus("Error in Part Program generation!") Return Catch ex As Exception SetStatus("Error in Part Program generation!") Return End Try SetStatus("Copying the Part Program to the CNC") ' copio il programma sul CN Try Dim NcFilePath As String = m_CncFilePath & "\" & m_PartProgFileName & ".cnc" File.Delete(Path.ChangeExtension(NcFilePath, ".prb")) File.Delete(Path.ChangeExtension(NcFilePath, ".cnc")) System.Threading.Thread.Sleep(100) File.Copy(Path.ChangeExtension(m_DDFPath, ".cnc"), NcFilePath, True) SetStatus("Part program copied to the CNC, activate it and start the machine") Catch ex As Exception SetStatus("Error in copying the Part Program to the CNC") Return End Try End Sub #End Region ' METHODS #Region "COMMANDS" #Region "OpenDDF" ' Returns a command that manage the MainWindow_Unloaded command Public ReadOnly Property OpenDDF_Command() As ICommand Get If m_cmdOpenDDF Is Nothing Then m_cmdOpenDDF = New Command(AddressOf OpenDDF) End If Return m_cmdOpenDDF End Get End Property ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Sub OpenDDF(ByVal param As Object) ' verifico che non sia in corso una tastatura If m_Timer.IsEnabled Then Return Dim Path_IsValid As Boolean = False ' Direttorio corrente per file DDF Dim sDir As String = String.Empty GetMainPrivateProfileString(S_DOORS, K_DDFDIR, "", sDir) ' apro finestra di scelta file Dim OpenFileDialogWnd As New Microsoft.Win32.OpenFileDialog With { .Title = "Open DDF", .Filter = "DDF File(*.ddf)|*.ddf", .FilterIndex = 1, .InitialDirectory = sDir} If Not OpenFileDialogWnd.ShowDialog Then Return ' segno path ottenuta Dim TempPath As String = OpenFileDialogWnd.FileName ' verifico di aver ricevuto una path valida If File.Exists(TempPath) And Path.GetExtension(TempPath) = ".ddf" Then m_DDFPath = TempPath Path_IsValid = True ' segno path in ini file WriteMainPrivateProfileString(S_DOORS, K_DDFDIR, System.IO.Path.GetDirectoryName(TempPath)) Else m_DDFPath = String.Empty Path_IsValid = False End If ' se path valida If Path_IsValid Then ' provo a leggere il file Dim FileContent As String() = File.ReadAllLines(m_DDFPath) If FileContent.Length = 0 Then Map.refStatusBarVM.SetOutputMessage("Impossible to read this DDF file", MSG_TYPE.ERROR_) Return End If ' scansiono il contenuto del file Dim bPropertiesFounded As Boolean = False Dim bSizeFounded As Boolean = False Dim bWidthFounded As Boolean = False Dim bHeightFounded As Boolean = False Dim bThicknessFounded As Boolean = False For LineIndex As Integer = 0 To FileContent.Count - 1 Dim sFileLine As String = FileContent(LineIndex) ' se riga vuota, salto alla prossima If String.IsNullOrWhiteSpace(sFileLine) Then Continue For ' se riga di commento, salto alla prossima If sFileLine(0) = "#" Then Continue For ' elimino commento all'interno della riga If sFileLine.Contains("#") Then Strings.Left(sFileLine, InStr(sFileLine, "#")) End If ' cerco la proprietà If sFileLine.Contains("properties:") Then If sFileLine.Contains("skinned") Then m_DoorProperty = Properties.SKINNED ElseIf sFileLine.Contains("extruded") Then m_DoorProperty = Properties.EXTRUDED Else m_DoorProperty = Properties.NOTHING_ End If bPropertiesFounded = True End If ' cerco dimensioni porta If Not bSizeFounded And sFileLine.Contains("size:") Then bSizeFounded = True Continue For End If If Not bThicknessFounded And bHeightFounded Then bThicknessFounded = CheckDoorDimension(sFileLine, "thickness:", m_Thickness) End If If Not bHeightFounded And bWidthFounded Then bHeightFounded = CheckDoorDimension(sFileLine, "height:", m_Height) End If If Not bWidthFounded And bSizeFounded Then bWidthFounded = CheckDoorDimension(sFileLine, "width:", m_Width) End If Next ' se non ho trovato dimensioni, errore e disattivo interfaccia If Not bSizeFounded Or Not bThicknessFounded Then Map.refStatusBarVM.SetOutputMessage("Impossible to read this DDF file", MSG_TYPE.ERROR_) m_Generate_IsEnabled = False Return Else Map.refStatusBarVM.SetOutputMessage("DDF correctly opened", 5, MSG_TYPE.INFO) m_Generate_IsEnabled = True End If ' se non ho trovato opzioni, setto a NULL If Not bPropertiesFounded Then m_DoorProperty = Properties.NOTHING_ Else Map.refStatusBarVM.SetOutputMessage("Impossible to read this DDF file", MSG_TYPE.ERROR_) ' disabilito interfaccia m_Generate_IsEnabled = False End If ' resetto stato ResetStatus() ' aggiorno valori interfaccia NotifyPropertyChanged("Generate_IsEnabled") NotifyPropertyChanged("DDFPath") NotifyPropertyChanged("DoorType") NotifyPropertyChanged("Width") NotifyPropertyChanged("Height") NotifyPropertyChanged("Thickness") End Sub Private Function CheckDoorDimension(sFileLine As String, sKey As String, ByRef sDimension As String) As Boolean If sFileLine.Contains(sKey) Then CleanValueString(sFileLine, sKey, sDimension) Return True Else Map.refStatusBarVM.SetOutputMessage("Impossible to read this DDF file", MSG_TYPE.ERROR_) Return False End If End Function Private Sub CleanValueString(sFileLine As String, sKey As String, ByRef sResult As String) Dim sTemp As String = sFileLine sTemp = sTemp.Replace(sKey, "") sTemp = sTemp.Trim() sResult = sTemp End Sub #End Region ' OpenDDF #Region "Generate" ' Returns a command that manage the MainWindow_Unloaded command Public ReadOnly Property Generate_Command() As ICommand Get If m_cmdGenerate Is Nothing Then m_cmdGenerate = New Command(AddressOf Generate) End If Return m_cmdGenerate End Get End Property ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Sub Generate(ByVal param As Object) ' se modalità proprietà e nessuna proprietà impostata do errore ed esco If m_ProbingMode = ProbingModes.PROPERTIES And m_DoorProperty = Properties.NULL Then Map.refStatusBarVM.SetOutputMessage("Error, proprerty not readed!", MSG_TYPE.ERROR_) Return End If ' disabilito bottone apri DDF EnableDDFButton(False) ' cancello file txt e cnc del ddf Try File.Delete(Path.ChangeExtension(m_DDFPath, ".txt")) File.Delete(Path.ChangeExtension(m_DDFPath, ".cnc")) Catch ex As Exception End Try ' Verifico se generazione normale o con misurazione Dim bIsMeasureProbing As Boolean = False If m_ProbingMode = ProbingModes.PROPERTIES Then bIsMeasureProbing = m_DoorProperty = Properties.SKINNED Else bIsMeasureProbing = m_DoorMeasuring End If ' Inizio generazione primo PartProgram per entrambe le modalità Dim sProgramMsg As String = If(bIsMeasureProbing, "Probing Part Program", "Part Program") Dim GenFileExtension As String = If(bIsMeasureProbing, ".prb", ".cnc") Dim GenFilePath As String = Path.ChangeExtension(m_DDFPath, GenFileExtension) SetStatus("Generating the " & sProgramMsg) ' Lancio il programma in cieco per generazione normale Try Dim CommandLine As String = """" & m_DDFPath & """ " & If(bIsMeasureProbing, "3", "2") Process.Start(m_EgtCAM5Path, CommandLine) Dim bTxtOk As Boolean = False For I = 0 To 150 ' aspetto che venga generato il txt del ddf If Not bTxtOk AndAlso File.Exists(Path.ChangeExtension(m_DDFPath, ".txt")) Then bTxtOk = True ' pausa necessaria, altrimenti copia un file vuoto! System.Threading.Thread.Sleep(1000) End If If bTxtOk AndAlso File.Exists(GenFilePath) Then SetStatus(sProgramMsg & " correctly generated") Exit Try End If ' Aspetto e costringo ad aggiornare UI System.Threading.Thread.Sleep(100) UpdateUI() Next SetStatus("Error in " & sProgramMsg & " generation!") EnableDDFButton(True) Return Catch ex As Exception SetStatus("Error in " & sProgramMsg & " generation!") EnableDDFButton(True) Return End Try SetStatus("Copying the " & sProgramMsg & " to the CNC") ' copio il programma sul CN Try Dim NcFilePath As String = m_CncFilePath & "\" & m_PartProgFileName & GenFileExtension File.Delete(Path.ChangeExtension(NcFilePath, ".prb")) File.Delete(Path.ChangeExtension(NcFilePath, ".cnc")) System.Threading.Thread.Sleep(100) File.Copy(Path.ChangeExtension(m_DDFPath, GenFileExtension), NcFilePath, True) SetStatus(sProgramMsg & " copied to the CNC, activate it and start the machine") Catch ex As Exception SetStatus("Error in copying the " & sProgramMsg & " to the CNC") EnableDDFButton(True) Return End Try ' se skinned If bIsMeasureProbing Then ' cancello file di fine tastatura precedente Dim EndProbeFilePath As String = m_DataFilePath & m_CheckFileName Try File.Delete(EndProbeFilePath) Catch ex As Exception SetStatus("Error in deleting the probe end file on the CNC" & Environment.NewLine & "Please, delete it manually") End Try ' avvio timer d'attesa m_Timer.Start() m_Timer_Time = 0 m_Timer_IsEnabled = True NotifyPropertyChanged("Progress_Value") NotifyPropertyChanged("Timer_IsEnabled") Else EnableDDFButton(True) End If End Sub Private Sub EnableDDFButton(value As Boolean) ' abilito bottone apri DDF m_OpenDDF_IsEnabled = value NotifyPropertyChanged("OpenDDF_IsEnabled") End Sub #End Region ' Generate #Region "Cancel" ' Returns a command that manage the MainWindow_Unloaded command Public ReadOnly Property Cancel_Command() As ICommand Get If m_cmdCancel Is Nothing Then m_cmdCancel = New Command(AddressOf Cancel) End If Return m_cmdCancel End Get End Property ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Sub Cancel(ByVal param As Object) ' se timer non attivo esco If Not m_Timer.IsEnabled Then Return ' ferma il timer di attesa m_Timer.Stop() m_Timer_Time = 0 m_Timer_IsEnabled = False NotifyPropertyChanged("Progress_Value") NotifyPropertyChanged("Timer_IsEnabled") SetStatus("Probing waiting cycle manually interrupted") ' abilito bottone apri DDF m_OpenDDF_IsEnabled = True NotifyPropertyChanged("OpenDDF_IsEnabled") End Sub #End Region ' Cancel #End Region ' COMMANDS End Class