Imports System.Collections.ObjectModel Imports System.IO Imports EgtUILib Imports EgtWPFLib5 Imports EgtBEAMWALL.Core Public Class ConfigurationPageVM Inherits VMBase ' flag modifica parametri Macchina Friend bModifyMachParam As Boolean ' Definizione comandi Private m_cmdSave As ICommand Public ReadOnly Property MachinePanelVM As MachinePanelVM Get Return Map.refMachinePanelVM End Get End Property Private m_ConfigMachTableList As New ObservableCollection(Of MachTable) Public Property ConfigMachTableList As ObservableCollection(Of MachTable) Get Return m_ConfigMachTableList End Get Set(value As ObservableCollection(Of MachTable)) m_ConfigMachTableList = value End Set End Property Public ReadOnly Property Custom_Visibility As Visibility Get If QBTLParamVMList(0).bIsP Then Return Visibility.Collapsed Else Return Visibility.Visible End If End Get End Property ' lista dei parametri Q di un Process Private m_QBTLParamVMList_View As CollectionView = Nothing Protected m_QBTLParamVMList As New ObservableCollection(Of QBTLParamVM) Public Property QBTLParamVMList As ObservableCollection(Of QBTLParamVM) Get Return m_QBTLParamVMList End Get Set(value As ObservableCollection(Of QBTLParamVM)) m_QBTLParamVMList = value End Set End Property Private m_PRCList As New ObservableCollection(Of PRC) Public ReadOnly Property PRCList As ObservableCollection(Of PRC) Get Return m_PRCList End Get End Property Private m_LanguageList As New ObservableCollection(Of Language) Public ReadOnly Property LanguageList As ObservableCollection(Of Language) Get Return m_LanguageList End Get End Property Private m_UnitMeasureList As List(Of String) = New List(Of String)({"inch", "mm"}) Public ReadOnly Property UnitMeasureList As List(Of String) Get Return m_UnitMeasureList End Get End Property Private m_SelectedLanguage As Language Public Property SelectedLanguage As Language Get Return m_SelectedLanguage End Get Set(value As Language) If value IsNot m_SelectedLanguage Then m_SelectedLanguage = value End If End Set End Property Public Property SelMeasureUnit As Integer Get Return If(EgtUiUnitsAreMM(), MeasureUnitOpt.MM, MeasureUnitOpt.INCH) End Get Set(value As Integer) ' salvo unità di misura precedente Dim PrevMeasureUnit As MeasureUnitOpt = If(EgtUiUnitsAreMM(), MeasureUnitOpt.MM, MeasureUnitOpt.INCH) If value <> PrevMeasureUnit Then ' cambio unità di misura EgtSetUiUnits(DirectCast(value, MeasureUnitOpt) = MeasureUnitOpt.MM) End If End Set End Property Private m_SectionTime As Double Public Property SectionTime As String Get Return DoubleToString(m_SectionTime, 5) End Get Set(value As String) Dim dVal As Double = 0 If StringToDouble(value, dVal) AndAlso dVal > 0 Then m_SectionTime = dVal End If End Set End Property Private m_PartTime As Double Public Property PartTime As String Get Return DoubleToString(m_PartTime, 5) End Get Set(value As String) Dim dVal As Double = 0 If StringToDouble(value, dVal) AndAlso dVal > 0 Then m_PartTime = dVal End If End Set End Property #Region "Messages" Public ReadOnly Property L_Msg As String Get Return EgtMsg(61803) End Get End Property Public ReadOnly Property T_Msg As String Get Return EgtMsg(61804) End Get End Property Public ReadOnly Property PRC_Msg As String Get Return EgtMsg(61805) End Get End Property Public ReadOnly Property Type_Msg As String Get Return EgtMsg(61850) End Get End Property Public ReadOnly Property NAM_Msg As String Get Return EgtMsg(61608) End Get End Property Public ReadOnly Property Description_Msg As String Get Return EgtMsg(61603) End Get End Property Public ReadOnly Property Default_Msg As String Get Return EgtMsg(61802) End Get End Property Public ReadOnly Property Min_Msg As String Get Return EgtMsg(61616) End Get End Property Public ReadOnly Property Max_Msg As String Get Return EgtMsg(61617) End Get End Property Public ReadOnly Property CurrentLanguage_Msg As String Get Return EgtMsg(6501) End Get End Property Public ReadOnly Property LanguageAdvert_Msg As String Get Return EgtMsg(6502) End Get End Property Public ReadOnly Property MMUnits_Msg As String Get Return EgtMsg(6540) End Get End Property Public ReadOnly Property Nesting_Msg As String Get Return EgtMsg(61829) End Get End Property Public ReadOnly Property SectionTime_Msg As String Get Return EgtMsg(61806) End Get End Property Public ReadOnly Property PartTime_Msg As String Get Return EgtMsg(61807) End Get End Property Public ReadOnly Property DisplayIndex_Msg As String Get Return EgtMsg(61842) End Get End Property Public ReadOnly Property ColumnName_Msg As String Get Return EgtMsg(61843) End Get End Property Public ReadOnly Property CanUserReorder_Msg As String Get Return EgtMsg(61844) End Get End Property Public ReadOnly Property CanUserResize_Msg As String Get Return EgtMsg(61845) End Get End Property Public ReadOnly Property CanUserSort_Msg As String Get Return EgtMsg(61846) End Get End Property Public ReadOnly Property IsReadOnly_Msg As String Get Return EgtMsg(61847) End Get End Property Public ReadOnly Property Visible_Msg As String Get Return EgtMsg(61848) End Get End Property #End Region ' Messages #Region "Constructor" Sub New() ' imposto riferimento in Map Map.SetRefConfigurationPageVM(Me) ' Leggo nome lingua corrente Dim sLanguage As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_MESSAGES, "", sLanguage) ' Leggo elenco lingue disponibili da file ini e imposto lingua corrente Dim nIndex As Integer = 1 While True Dim ReadLanguage As Language = GetMainPrivateProfileLanguage(S_LANGUAGES, K_LANGUAGE & nIndex) If IsNothing(ReadLanguage) Then Exit While m_LanguageList.Add(ReadLanguage) If String.Compare(ReadLanguage.Name, sLanguage, True) = 0 Then m_SelectedLanguage = ReadLanguage End If nIndex += 1 End While ' Inizializzo la lingua corrente m_SelectedLanguage = m_LanguageList(0) Dim sMsgName As String = String.Empty IniFile.GetMainPrivateProfileString(S_GENERAL, K_MESSAGES, "", sMsgName) For Each Language In m_LanguageList If Language.Name = sMsgName Then m_SelectedLanguage = Language Exit For End If Next ' leggo SectionTime e PartTime GetMainPrivateProfileString(S_NEST, K_SECTIONTIME, "", SectionTime) GetMainPrivateProfileString(S_NEST, K_PARTTIME, "", PartTime) ' assegno le liste dei parametri della macchina corrente alla ConfigMachTableList alla pagina di Configurazione ConfigMachTableList = CurrentMachine.MachTableList ' carico i parametri Q dei Process letti dall'ini GetQParamsList() ' carico la lista di tutti i parametri Q ciclando su ogni Process di PRCList If Not IsNothing(QBTLParamVMList) Then QBTLParamVMList.Clear() End If For Each PRCItem In PRCList For Each QBTLParam In PRCItem.QBTLParamVMList QBTLParamVMList.Add(QBTLParam) Next Next NotifyPropertyChanged(NameOf(QBTLParamVMList)) ' setto il grouping a 2 livelli (GRP e, sotto, PRC col nome completo) per la DataGrid m_QBTLParamVMList_View = CollectionViewSource.GetDefaultView(m_QBTLParamVMList) m_QBTLParamVMList_View.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(QBTLParamVM.GroupType))) m_QBTLParamVMList_View.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(QBTLParamVM.ghDesc))) End Sub #End Region ' Constructor #Region "SaveCommand" ''' ''' Returns a command that do Save. ''' Public ReadOnly Property SaveCommand As ICommand Get If m_cmdSave Is Nothing Then m_cmdSave = New Command(AddressOf Save) End If Return m_cmdSave End Get End Property ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub Save() WriteMachParams() WriteMachParamsLua() WriteProcessParams(PRCList.ToList()) WriteMainPrivateProfileString(S_GENERAL, K_MESSAGES, m_SelectedLanguage.Name) WriteMainPrivateProfileString(S_SCENE, K_MMUNITS, SelMeasureUnit.ToString()) WriteMainPrivateProfileString(S_NEST, K_SECTIONTIME, DoubleToString(m_SectionTime, 5)) WriteMainPrivateProfileString(S_NEST, K_PARTTIME, DoubleToString(m_PartTime, 5)) End Sub #End Region ' SaveCommand #Region "Methods" ' funzione che scrive i parametri modificati sul file INI Public Sub WriteMachParams() For Each MachTableItem In ConfigMachTableList For Each MachParamItem In MachTableItem.MachParamList If MachParamItem.IsModified Then Dim sMachParamType As String = String.Empty Select Case MachParamItem.nType Case MachParamType.DOUBLE_ sMachParamType = "d" Case MachParamType.STRING_ sMachParamType = "s" Case MachParamType.LENGTH sMachParamType = "l" End Select Dim MachParamString As String = sMachParamType & "," & MachParamItem.sName & "," & MachParamItem.sValue & "," & MachParamItem.sDescription Dim bOk = WriteMachPrivateProfileString(MachParamItem.nParentTable, MachParamItem.nParamIndex, MachParamString) If Not bOk Then MessageBox.Show(EgtMsg(61859), EgtMsg(30007)) Return End If MachParamItem.IsModifiedReset() End If Next Next ' se macchina di tipo BOTH copio il file appena scritto nella cartella Beam nella cartella Wall o viceversa If CurrentMachine.nType = MachineType.BOTH Then If CurrentMachine.sMachParamIniFile.Contains("\" & K_BEAM & "\") Then File.Copy(CurrentMachine.sMachParamIniFile, CurrentMachine.sMachParamIniFile.Replace("\" & K_BEAM & "\", "\" & K_WALL & "\"), True) Else File.Copy(CurrentMachine.sMachParamIniFile, CurrentMachine.sMachParamIniFile.Replace("\" & K_WALL & "\", "\" & K_BEAM & "\"), True) End If End If End Sub ' funzione che scrive i parametri modificati sul file LUA Private Function WriteMachParamsLua() As Boolean ' inizio routine di scrittura Dim NewTs3DataFileContent = New List(Of String) Dim sMachineStr As String = String.Empty For Each MachTableItem In ConfigMachTableList NewTs3DataFileContent.Add("local " & MachTableItem.sName & " = {") sMachineStr &= " " & MachTableItem.sName & "=" & MachTableItem.sName & "," For Each MachParamItem In MachTableItem.MachParamList NewTs3DataFileContent.Add(" " & MachParamItem.sName & "=" & MachParamItem.sValue & ",") Next NewTs3DataFileContent.Last().TrimEnd(",") NewTs3DataFileContent.Add("}") NewTs3DataFileContent.Add("") Next NewTs3DataFileContent.Add("local Machine = {" & sMachineStr.TrimEnd(",") & "}") NewTs3DataFileContent.Add("return Machine") Dim FilePath As String = CurrentMachine.sMachDir & "\" & If(CurrentMachine.nType = MachineType.BEAM, BEAM_DIR, WALL_DIR) & "\" & TS3DATA_FILE File.WriteAllLines(FilePath, NewTs3DataFileContent, Text.Encoding.UTF8) ' se macchina di tipo BOTH copio il file appena scritto nella cartella Wall nella cartella Beam If CurrentMachine.nType = MachineType.BOTH Then File.Copy(FilePath, CurrentMachine.sMachDir & "\" & BEAM_DIR & "\" & TS3DATA_FILE, True) Return True End Function ' funzione che verifica la modifica dei valori in Configurazione e ne chiede il salvataggio Friend Sub VerifyConfigPageModification() ' Prima ciclo sui parametri Macchina Dim bExitFor = False For Each MachTableItem In ConfigMachTableList For Each MachParamItem In MachTableItem.MachParamList If MachParamItem.IsModified Then If MessageBox.Show(EgtMsg(61860), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then ' scrivo i parametri Macchina WriteMachParams() WriteMachParamsLua() Else ' se da non salvare li resetto ed esco dai For CreateMachParams() bExitFor = True Exit For End If End If Next If bExitFor Then Exit For Next ' Ora ciclo sui parametri Q Dim bAskToSaveDefaultValues As Boolean = False bExitFor = False For Each PRCItem In PRCList For Each QParam In PRCItem.QBTLParamVMList If QParam.bIsModified Then bAskToSaveDefaultValues = True ' esco dai For bExitFor = True Exit For End If Next If bExitFor Then Exit For Next ' se nel ciclo è stato trovato almeno un valore modificato chiedo il salvataggio If bAskToSaveDefaultValues Then If MessageBox.Show(EgtMsg(61861), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then ' se si è scelto di salvare i valori li scrivo WriteProcessParams(PRCList.ToList()) End If ' in ogni caso ricarico i valori (in modo da resettare i flag di modifica) GetQParamsList() ' carico la lista di tutti i parametri Q ciclando su ogni Process di PRCList If Not IsNothing(QBTLParamVMList) Then QBTLParamVMList.Clear() End If For Each PRCItem In PRCList For Each QBTLParam In PRCItem.QBTLParamVMList QBTLParamVMList.Add(QBTLParam) Next Next NotifyPropertyChanged(NameOf(QBTLParamVMList)) End If End Sub ' funzione che verifica l'inserimento della password quando si edita un parametro Macchina Friend Function VerifyConfigPagePassword() As Boolean ' Display message, title, and default value. Dim InputPwdWndVM As New InputPwdWndVM() Dim InputPwdWnd As New InputPwdWndV(Application.Current.MainWindow, InputPwdWndVM) If InputPwdWnd.ShowDialog() Then ' Lettura PWD dall'INI e confronto Dim sPwdIni As String = String.Empty If GetMainPrivateProfileString(S_MACH, K_PASSWORD, "", sPwdIni) <> 0 Then If sPwdIni = InputPwdWndVM.sPassword Then Return True End If End If Return False End Function Public Sub GetQParamsList() m_PRCList.Clear() ' carico lista process Dim TempPRCList As New ObservableCollection(Of Integer) ' prima cerco i process L (GRPType = 0) Dim GRPType As Integer = 0 GetBeamPrivateProfileProcessList(GRPType, TempPRCList) For Each PRC In TempPRCList ' leggo gruppi Dim GRPList As New ObservableCollection(Of Integer) GetBeamPrivateProfileGRPList(GRPType, PRC, GRPList) m_PRCList.Add(New PRC(If(GRPList.Count > 0, GRPList(0), GRPType), PRC, GetBeamPrivateProfileName(GRPType, PRC), CreateProcessParams(GRPType, PRC, False))) Next ' ora cerco i process T (GRPType = 1) GRPType = 1 GetBeamPrivateProfileProcessList(GRPType, TempPRCList) For Each PRC In TempPRCList ' leggo gruppi Dim GRPList As New ObservableCollection(Of Integer) GetBeamPrivateProfileGRPList(GRPType, PRC, GRPList) m_PRCList.Add(New PRC(If(GRPList.Count > 0, GRPList(0), GRPType), PRC, GetBeamPrivateProfileName(GRPType, PRC), CreateProcessParams(GRPType, PRC, False))) Next End Sub ' funzione che crea l'elenco dei parametri P o Q di un Process Public Function CreateProcessParams(GRPType As Integer, PRC As Integer, IsP As Boolean) Dim ParamIndex As Integer = 1 Dim TempList As New List(Of QBTLParamVM) Dim NewBTLParam As BTLParamM = Nothing ' leggo tutti i parametri P o Q del Process ParamIndex = 1 TempList = New List(Of QBTLParamVM) If IsP Then While BTLIniFile.GetBeamPrivateProfileParam(GRPType, PRC, IsP, ParamIndex, Nothing, NewBTLParam) TempList.Add(New QBTLParamVM(NewBTLParam, GRPType, PRC)) ParamIndex += 1 End While Else If CurrentMachine.nType = MachineType.BOTH Then ' se macchina di tipo BOTH carico i Q di tipo BEAM e poi di tipo WALL While BTLIniFile.GetBeamPrivateProfileParam(GRPType, PRC, IsP, ParamIndex, Nothing, NewBTLParam, MachineType.BEAM) TempList.Add(New QBTLParamVM(NewBTLParam, GRPType, PRC)) ParamIndex += 1 End While ParamIndex = 1 While BTLIniFile.GetBeamPrivateProfileParam(GRPType, PRC, IsP, ParamIndex, Nothing, NewBTLParam, MachineType.WALL) TempList.Add(New QBTLParamVM(NewBTLParam, GRPType, PRC)) ParamIndex += 1 End While Else ' altrimenti carico solo quelli corrispondenti al tipo della macchina selezionata While BTLIniFile.GetBeamPrivateProfileParam(GRPType, PRC, IsP, ParamIndex, Nothing, NewBTLParam, CurrentMachine.nType) TempList.Add(New QBTLParamVM(NewBTLParam, GRPType, PRC)) ParamIndex += 1 End While End If End If Return TempList End Function ' funzione che scrive l'elenco dei parametri P o Q di un Process Public Sub WriteProcessParams(PRCList As List(Of PRC)) For Each PRCItem In PRCList Dim nPRCParamIndex As Integer = 1 Dim sPrevType As String = String.Empty For Each PRCParam In PRCItem.QBTLParamVMList If PRCParam.bIsModified Then ' costruisco la stringa da scrivere nel parametro Dim sType As String = "" If PRCParam.nType = 1 Then sType = "d" ElseIf PRCParam.nType = 4 Then sType = "l" End If If sPrevType <> PRCParam.sBWType Then nPRCParamIndex = 1 Dim sPRCParam As String = sType & "," & If(PRCParam.bIsP, "P", "Q") & PRCParam.nId.ToString("D2") & "," & PRCParam.sMin & "," & PRCParam.sMax & "," & PRCParam.sDefault & "," & PRCParam.sDescription WritePrivateProfileString(CalcBeamPrivateProfileGRP(PRCItem.nGRP) & "." & PRCItem.nPRC, If(PRCParam.bIsP, "P", "Q" & PRCParam.sBWType) & nPRCParamIndex, sPRCParam, m_sBTLIniFile) ' resetto il flag per il valore modificato PRCParam.bIsModified = False End If sPrevType = PRCParam.sBWType nPRCParamIndex += 1 Next Next End Sub #End Region ' Methods End Class Public Class MachParam Inherits VMBase ' table a cui appartiene il parametro Private m_nParentTable As Integer Friend ReadOnly Property nParentTable As Integer Get Return m_nParentTable End Get End Property ' indice del parametro Private m_nParamIndex As Integer Friend ReadOnly Property nParamIndex As Integer Get Return m_nParamIndex End Get End Property ' tipo della variabile Private m_nType As MachParamType Friend ReadOnly Property nType As MachParamType Get Return m_nType End Get End Property ' parametri da struttura Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value End Set End Property ' parametri da geometria Private m_IsModifiedValue As Boolean = False Private m_dValue As Double Private m_sValue As String Public Property sValue As String Get Select Case nType Case MachParamType.DOUBLE_ Return DoubleToString(m_dValue, 3) Case MachParamType.LENGTH Return LenToString(m_dValue, 3) Case Else ' stringhe Return m_sValue End Select Return If(nType = MachParamType.LENGTH, LenToString(m_dValue, 3), DoubleToString(m_dValue, 3)) End Get Set(value As String) Dim dNewValue As Double ' verifico se valore immesso è diverso dall'originale If nParentTable > 0 Then Dim sOrigValue As String = String.Empty Dim dOrigValue As Double MachParamIniFile.GetMachPrivateProfileParamValue(nParentTable, nParamIndex, sOrigValue) ' trasformo valori Select Case nType Case MachParamType.DOUBLE_ StringToDouble(value, dNewValue) StringToDouble(sOrigValue, dOrigValue) Case MachParamType.LENGTH StringToLen(value, dNewValue) StringToLen(sOrigValue, dOrigValue) Case Else ' per string non faccio nulla End Select m_IsModifiedValue = dNewValue <> dOrigValue End If ' se valore immesso è diverso e password non inserita If m_IsModifiedValue AndAlso Not Map.refConfigurationPageVM.bModifyMachParam Then Map.refConfigurationPageVM.bModifyMachParam = Map.refConfigurationPageVM.VerifyConfigPagePassword() If Not Map.refConfigurationPageVM.bModifyMachParam Then NotifyPropertyChanged("sValue") m_IsModifiedValue = False Return End If End If Select Case nType Case MachParamType.DOUBLE_, MachParamType.LENGTH UpdateParamValue(dNewValue, "") Case Else UpdateParamValue(0, value) End Select End Set End Property Public Property dValue As Double Get Return m_dValue End Get Set(value As Double) m_dValue = value NotifyPropertyChanged("sValue") End Set End Property ' descrizione del parametro Private m_sDescription As String Public Property sDescription As String Get Return m_sDescription End Get Set(value As String) m_sDescription = value End Set End Property Private Sub StdInit(nParentTable As Integer, nParamIndex As Integer, Type As MachParamType, sName As String, sDescription As String) m_nParentTable = nParentTable m_nParamIndex = nParamIndex m_nType = Type m_sName = sName m_sDescription = MsgToString(sDescription) End Sub ' new per double e length Sub New(nParentTable As Integer, nParamIndex As Integer, nType As MachParamType, sParamName As String, dValue As Double, sDescription As String) StdInit(nParentTable, nParamIndex, nType, sParamName, sDescription) m_dValue = dValue 'sValue = DoubleToString(dValue, 3) End Sub ' new per stringhe Sub New(nParentTable As Integer, nParamIndex As Integer, nType As MachParamType, sParamName As String, sDescription As String) StdInit(nParentTable, nParamIndex, nType, sParamName, sDescription) End Sub ' new per parametro vuoto Sub New(nType As MachParamType, nParamIndex As Integer, sParamName As String) StdInit(Nothing, nParamIndex, nType, sParamName, "") End Sub Friend Sub UpdateParamValue(dNewValue As Double, sNewValue As String, Optional bDraw As Boolean = True) Select Case nType Case MachParamType.DOUBLE_, MachParamType.LENGTH m_dValue = dNewValue Case MachParamType.STRING_ m_sValue = sNewValue End Select End Sub Public ReadOnly Property IsModified() As Boolean Get Return m_IsModifiedValue End Get End Property Public Sub IsModifiedReset() m_IsModifiedValue = False End Sub End Class Public Class MachTable Inherits VMBase ' nome della table Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value End Set End Property Private m_MachParamList As New ObservableCollection(Of MachParam) Public Property MachParamList As ObservableCollection(Of MachParam) Get Return m_MachParamList End Get Set(value As ObservableCollection(Of MachParam)) m_MachParamList = value End Set End Property Sub New(Name As String, ParamList As ObservableCollection(Of MachParam)) sName = Name MachParamList = ParamList End Sub End Class ' Tipo parametro nel file di configurazione Macchina Public Enum MachParamType As Integer DOUBLE_ = 1 STRING_ = 2 COMBO = 3 LENGTH = 4 CHECKBOX = 5 End Enum