Imports System.IO Imports System.Collections.ObjectModel Imports EgtUILib Public Module CurrentMachine ' Flag modalità Office Private m_bOffice As Boolean = False ' File ini della macchina Private m_sMachIniFile As String = String.Empty ' Percorso della cartella della macchina Private m_sMachDir As String = String.Empty ' Massimo id della lista materiali nel file ini Private m_MaxIdMat As Integer = 0 ' Materiale correntemente attivo (dell'ultimo grezzo impostato) Private m_CurrMat As Material = Nothing ' Flag per visualizzazione TcPos, Testa/uscita e Note utente Private m_nShowToolChanger As Integer = 0 ' 0=no, 1=tutti utensili, 2=solo lame Private m_bShowHeadExit As Boolean = False Private m_nShowUserNotes As Integer = 0 ' 0=no, 1=tutti utensili, 2=solo lame ' Flag che indica se WaterJet presente Private m_bWaterJet As Boolean = False ' Abilitazione DB WaterJet Private m_bFromDBWaterJet As Boolean = False Friend ReadOnly Property sMachIniFile As String Get Return m_sMachIniFile End Get End Property Friend ReadOnly Property bWaterJet As Boolean Get Return m_bWaterJet End Get End Property Friend ReadOnly Property bFromDBWaterJet As Boolean Get Return m_bFromDBWaterJet End Get End Property Friend ReadOnly Property ShowToolChanger As Integer Get Return m_nShowToolChanger End Get End Property Public ReadOnly Property bShowHeadExit As Boolean Get Return m_bShowHeadExit End Get End Property Friend ReadOnly Property ShowUserNotes As Integer Get Return m_nShowUserNotes End Get End Property ' Lista dei materiali Private m_Materials As New ObservableCollection(Of Material) Public ReadOnly Property Materials As ObservableCollection(Of Material) Get Return m_Materials End Get End Property ' Lista delle qualità di lavorazioni disponibili nel WaterJet Private m_Qualities As New ObservableCollection(Of String) Friend ReadOnly Property Qualities As ObservableCollection(Of String) Get Return m_Qualities End Get End Property ' Lista dei Materiali nel caso WaterJet Private m_WjMaterialList As New ObservableCollection(Of EgtWPFLib5.WjMaterial) Public Property WjMaterialList As ObservableCollection(Of EgtWPFLib5.WjMaterial) Get Return m_WjMaterialList End Get Set(value As ObservableCollection(Of EgtWPFLib5.WjMaterial)) m_WjMaterialList = value End Set End Property Public Sub AddMaterial(value As Material) For Each Material In Materials If Material.nId = value.nId Then Exit Sub End If Next WritePrivateProfileMaterial(S_MATERIALS, K_MATERIAL & m_MaxIdMat + 1, value, sMachIniFile) m_MaxIdMat += 1 m_Materials.Add(value) End Sub Public Sub RemoveMaterial(value As Material) ' Se è il materiale corrente lo tolgo If Not IsNothing(CurrMat) AndAlso CurrMat.nId = value.nId Then CurrMat = Nothing End If ' Rimuovo il materiale dall'elenco Dim Index As Integer For Index = 0 To Materials.Count - 1 If Materials(Index).nId = value.nId Then m_Materials.Remove(Materials(Index)) Exit For End If Next Dim TempMat As Material = Nothing For I = Index To m_MaxIdMat - 1 GetPrivateProfileMaterial(S_MATERIALS, K_MATERIAL & I + 2, TempMat, sMachIniFile) WritePrivateProfileMaterial(S_MATERIALS, K_MATERIAL & I + 1, TempMat, sMachIniFile) Next WritePrivateProfileMaterial(S_MATERIALS, K_MATERIAL & m_MaxIdMat, Nothing, sMachIniFile) m_MaxIdMat -= 1 ' Rimuovo il materiale dall'elenco di tutte le lavorazioni Dim MachiningName As String = String.Empty Dim bFound As Boolean = EgtMdbGetFirstMachining(MCH_MY.SAWING, MachiningName) While bFound EgtMdbSetCurrMachining(MachiningName) SearchAndRemoveMat(value.nId) bFound = EgtMdbGetNextMachining(MCH_MY.SAWING, MachiningName) End While bFound = EgtMdbGetFirstMachining(MCH_MY.DRILLING, MachiningName) While bFound EgtMdbSetCurrMachining(MachiningName) SearchAndRemoveMat(value.nId) bFound = EgtMdbGetNextMachining(MCH_MY.DRILLING, MachiningName) End While bFound = EgtMdbGetFirstMachining(MCH_MY.MILLING, MachiningName) While bFound EgtMdbSetCurrMachining(MachiningName) SearchAndRemoveMat(value.nId) bFound = EgtMdbGetNextMachining(MCH_MY.DRILLING, MachiningName) End While End Sub ' Funzione che dato l'Id di un materiale lo rimuove dalla lavorazione corrente Public Sub SearchAndRemoveMat(valueId As Integer) Dim SysNotes As String = String.Empty EgtMdbGetCurrMachiningParam(MCH_MP.SYSNOTES, SysNotes) If SysNotes <> String.Empty Then Dim MachiningMaterials() = SysNotes.Split(";".ToCharArray) SysNotes = String.Empty For Each Material In MachiningMaterials Dim Param() As String = Material.Split(",".ToCharArray) If Param(0) <> valueId.ToString Then SysNotes &= Material & ";" End If Next If SysNotes(SysNotes.Length - 1) = ";" Then SysNotes = SysNotes.Substring(0, SysNotes.Length - 1) End If EgtMdbSetCurrMachiningParam(MCH_MP.SYSNOTES, SysNotes) End If EgtMdbSaveCurrMachining() End Sub Public Property CurrMat As Material Get Return m_CurrMat End Get Set(value As Material) If Not IsNothing(value) Then Dim CurrMatId As String = value.nId.ToString Dim sKey As String = If(m_bOffice, K_CURROFFICEMATERIAL, K_CURRMATERIAL) If bWaterJet And bFromDBWaterJet Then WritePrivateProfileString(S_MATERIALS, sKey, CurrMatId & "." & value.nSubId, sMachIniFile) Else WritePrivateProfileString(S_MATERIALS, sKey, CurrMatId, sMachIniFile) End If m_CurrMat = value End If m_CurrMat = value End Set End Property Public Function SetCurrMatByName(sMatName As String) As Boolean ' Reset del materiale corrente CurrMat = Nothing ' Verifico il nome If String.IsNullOrWhiteSpace(sMatName) Then Return False ' Cerco il nome nella lista dei materiali For Index = 0 To Materials.Count - 1 If String.Compare(Materials(Index).sName, sMatName, True) = 0 Then CurrMat = Materials(Index) Return True End If Next Return False End Function 'Sub InitCurrentMachine(sMachinesRootDir As String, sMachineName As String, ' bKeyProdLine As Boolean, bKeyMill As Boolean, bKeyWJ As Boolean, Optional bOffice As Boolean = False) Sub InitCurrentMachine(sMachIniFile As String) m_sMachIniFile = sMachIniFile m_sMachDir = Path.GetDirectoryName(m_sMachIniFile) ' Pulisco la lista dei materiali m_Materials.Clear() m_MaxIdMat = 0 ' Leggo la lista dei materiali Dim Material As Material = Nothing Dim nIndex As Integer = 1 m_bWaterJet = (GetPrivateProfileInt(S_TOOLS, K_WATERJET, 0, sMachIniFile) > 0) m_bFromDBWaterJet = (GetPrivateProfileInt(S_MATERIALS, K_FROMDBWATERJET, 0, sMachIniFile) > 0) If bWaterJet And bFromDBWaterJet Then LoadWJMaterial(True) Else While (GetPrivateProfileMaterial(S_MATERIALS, K_MATERIAL & nIndex, Material, sMachIniFile)) m_Materials.Add(Material) nIndex += 1 End While End If ' Salvo massimo indice a cui sono arrivato per usarlo quando devo aggiungere nuovi elementi alla lista m_MaxIdMat = nIndex - 1 ' Leggo abilitazione visualizzazione TcPos, Head/exit e Note m_nShowToolChanger = GetPrivateProfileInt(S_TOOLS, K_SHOWTOOLCHANGER, 0, sMachIniFile) m_bShowHeadExit = (GetPrivateProfileInt(S_TOOLS, K_SHOWHEADEXIT, 0, sMachIniFile) > 0) m_nShowUserNotes = GetPrivateProfileInt(S_TOOLS, K_SHOWUSERNOTES, 0, sMachIniFile) ' Leggo materiale correntemente attivo Dim sCurrMatId As String = String.Empty Dim sKey As String = If(m_bOffice, K_CURROFFICEMATERIAL, K_CURRMATERIAL) EgtUILib.GetPrivateProfileString(S_MATERIALS, sKey, "0", sCurrMatId, sMachIniFile) If bWaterJet And bFromDBWaterJet Then Dim sCurrMatIds As String() sCurrMatIds = sCurrMatId.Split("."c) If sCurrMatIds.Length > 1 Then Dim nCurrMatId As Integer Dim nCurrSubMatId As Integer If Not Integer.TryParse(sCurrMatIds(0), nCurrMatId) Then nCurrMatId = 0 If Not Integer.TryParse(sCurrMatIds(1), nCurrSubMatId) Then nCurrSubMatId = 0 For Each Material In Materials If Material.nId = nCurrMatId AndAlso Material.nSubId = nCurrSubMatId Then m_CurrMat = Material Exit For End If Next End If Else Dim nCurrMatId As Integer If Not Integer.TryParse(sCurrMatId, nCurrMatId) Then nCurrMatId = 0 For Each Material In Materials If Material.nId = nCurrMatId Then m_CurrMat = Material Exit For End If Next End If End Sub Public Function GetPrivateProfileMaterial( ByVal lpAppName As String, ByVal lpKeyName As String, ByRef Material As Material, ByVal lpFileName As String) As Boolean Dim sVal As String = String.Empty GetPrivateProfileString(lpAppName, lpKeyName, "", sVal, lpFileName) Dim sItems() As String = sVal.Split(",".ToCharArray) If sItems.Count() = 2 Then Dim nId As Integer = 0 StringToInt(sItems(0), nId) Material = New Material(nId, sItems(1)) Return True End If Return False End Function Public Function WritePrivateProfileMaterial( ByVal lpAppName As String, ByVal lpKeyName As String, ByVal Material As Material, ByVal lpFileName As String) As Boolean Dim MatStr As String = Nothing If Not IsNothing(Material) Then MatStr = Material.nId.ToString & "," & Material.sName End If If WritePrivateProfileString(lpAppName, lpKeyName, MatStr, sMachIniFile) Then Return True End If Return False End Function Public Sub LoadWJMaterial(Optional bIsStart As Boolean = False) Dim TempCurrMat As Material = CurrMat ' Svuoto l'attuale lista di materiali m_Materials.Clear() ' Leggo valori da file .data e li carico nelle proprietà Dim sFilePath As String = m_sMachDir & WaterjetDbWindowVM.WATERJETDB_PATH Dim Local_MaterialList = New ObservableCollection(Of EgtWPFLib5.WjMaterial) Local_MaterialList = EgtWPFLib5.WaterjetDbWindowVM.LoadWjMaterials(sFilePath) ' definisco la lista delle qualità m_Qualities.Add("") m_Qualities.Add("Q1") m_Qualities.Add("Q2") m_Qualities.Add("Q3") m_Qualities.Add("Q4") m_Qualities.Add("Q5") m_Qualities.Add("QExtra") ' costruisco la lista Dim i As Integer = 0 Dim sName As String = String.Empty For i = 0 To Local_MaterialList.Count - 1 sName = Local_MaterialList(i).Name Dim j As Integer = 0 For j = 0 To Local_MaterialList(i).SubMaterialList.Count - 1 m_Materials.Add(New Material(i + 1, sName & "." & Local_MaterialList(i).SubMaterialList(j).Name, j + 1)) Next Next If Not bIsStart Then CurrMat = TempCurrMat End Sub End Module Public Class Material Private m_nId As Integer Private m_sName As String Private m_nSubId As Integer Public ReadOnly Property nId As Integer Get Return m_nId End Get End Property Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value End Set End Property Public ReadOnly Property nSubId As Integer Get Return m_nSubId End Get End Property Sub New(sName As String, MaterialList As ObservableCollection(Of Material)) Dim nMaxId As Integer = 0 For Each Material In MaterialList If Material.nId > nMaxId Then nMaxId = Material.nId End If Next m_nId = nMaxId + 1 m_sName = sName End Sub Sub New(nId As Integer, sName As String) m_nId = nId m_sName = sName End Sub Sub New(nId As Integer, sName As String, nSubId As Integer) m_nId = nId m_sName = sName m_nSubId = nSubId End Sub End Class