Imports System.Collections.ObjectModel Imports System.IO Imports System.Threading Imports System.Windows.Threading Imports EgtBEAMWALL.Core Imports EgtBEAMWALL.Core.ConstGen Imports EgtBEAMWALL.Core.ConstIni Imports EgtUILib Imports EgtWPFLib5 Public Class MainWindowVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private m_SupervisorCommThread As Thread Private m_Supervisor_Timer As New DispatcherTimer Private m_SplashScreen_Timer As New DispatcherTimer Private m_WaitAfterRender As Integer = 0 ' Riferimento al Model della MainWindow Private m_MainWindowM As MainWindowM Friend ReadOnly Property MainWindowM As MainWindowM Get Return m_MainWindowM End Get End Property ' Variabile che indica che il programma è stato avviato correttamente (sia la mappa che l'ambiente Egt) Private m_bInitStatus As Boolean Friend ReadOnly Property bInitStatus As Boolean Get Return m_bInitStatus End Get End Property ' Titolo Private m_Title As String = "" Public ReadOnly Property Title As String Get Return m_Title End Get End Property ' proprietà che seleziona la giusta pagina del TabControl Public Property nSelTabPage As Integer Get Select Case Map.refMainMenuVM.SelPage Case Pages.EMPTY, Pages.OPTIMIZERPAGE Return 0 Case Pages.CONFIG Return 1 Case Pages.CONFIGPROGRAM Return 2 Case Else Return -1 End Select End Get Set(value As Integer) End Set End Property Private m_MachinePanelVM As MachinePanelVM Public ReadOnly Property MachinePanelVM As MachinePanelVM Get Return m_MachinePanelVM End Get End Property 'Friend m_SupervisorStop As Boolean = False Private BlockedWnd As BlockedWndV Private m_Window_Opacity As Double = 0.2 Public ReadOnly Property Window_Opacity As Double Get Return m_Window_Opacity End Get End Property ' definizione comandi Private m_cmdAboutBox As ICommand Private m_cmdCloseApplication As ICommand #End Region ' FIELDS & PROPERTIES #Region "CONSTRUCTOR" Sub New() ' Avvio l'inizializzazione della mappa passandogli il riferimento al MainWindowVM Map.BeginInit(Me) ' Creo Model della MainWindow m_MainWindowM = New MainWindowM ' inizializzo machine panel m_MachinePanelVM = New MachinePanelVM ' inizializzo contatore per blocco da supervisore m_Supervisor_Timer.Interval = TimeSpan.FromMilliseconds(500) AddHandler m_Supervisor_Timer.Tick, AddressOf SupervisorTimer_Tick m_Supervisor_Timer.Start() ' imposto e avvio contatore SplashScreen m_SplashScreen_Timer.Interval = TimeSpan.FromMilliseconds(5) AddHandler m_SplashScreen_Timer.Tick, AddressOf SplashScreenTimer_Tick If Not IsNothing(MapV.refSplashScreenV) Then m_SplashScreen_Timer.Start() End If End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Friend Sub SetTitle(sTitle As String) m_Title = sTitle NotifyPropertyChanged(NameOf(Title)) End Sub Public Sub UpdateTitle() m_Title = "" Select Case Map.refMainMenuVM.SelPage Case Pages.CONFIG m_Title = "Configuration Page" Case Pages.OPTIMIZERPAGE If GetMainPrivateProfileInt(S_GENERAL, K_PROJECTMODE, 0) = 1 Then If Not IsNothing(ProjectManagerVM.CurrProd) Then If ProjectManagerVM.CurrProd.bIsNew Then m_Title = "New - " m_Title &= ProjectManagerVM.CurrProd.nProdId.ToString("0000") & " - " & ProjectManagerVM.CurrProd.sName End If Else If Not IsNothing(ProjectManagerVM.CurrProd) Then If ProjectManagerVM.CurrProd.bIsNew Then m_Title = "New - " m_Title &= ProjectManagerVM.CurrProd.nProdId.ToString("0000") & " - " & ProjectManagerVM.CurrProd.sBTLFileName End If End If End Select m_Title &= " - AEdifica" NotifyPropertyChanged(NameOf(Title)) End Sub Friend Sub ContentRendered() ' segno su contatore splashscreen render finito m_WaitAfterRender = 1 DbControllers.Init() ' chiamata a caso su Db per inizializzarlo DbControllers.m_ProjController.FindByProjDbId(0) ' Verifico che l'inizializzazione di tutte le parti del programma sia andata a buon fine If Map.EndInit() Then m_bInitStatus = True ' altrimenti chiudo il programma Else m_bInitStatus = False End If ' imposto MainWindow per finestra di Loading LoadingWndHelper.SetMainWindow(Application.Current.MainWindow) ' creazione manager dei processi MyExecProcessManager.Init() ' seleziono pagina da aprire Map.refMainMenuVM.SelPage = Pages.OPTIMIZERPAGE ' leggo riga di comando Dim nCommandType As Integer = 0 Dim nPage As Pages = Pages.OPTIMIZERPAGE Dim nProdId As Integer = 0 If ProcessCommandLine(nCommandType, nPage, nProdId) Then Select Case nCommandType Case 1 Map.refProdManagerVM.SetCurrProd(nProdId) Map.refProdManagerVM.SetCurrProj(Map.refProdManagerVM.CurrProd.nProjId) Case 2 ' pagina gia' impostata nella variabile End Select Else ' setto il primo file dalla lista degli MRU come progetto corrente da aprire Dim sLastProjectPath As String = String.Empty GetMainPrivateProfileString(S_MRUPRODFILES, K_FILE & "1", String.Empty, sLastProjectPath) If Not String.IsNullOrWhiteSpace(sLastProjectPath) AndAlso File.Exists(sLastProjectPath) Then ' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo Dim nProjId As Integer = 0 Dim sProjId As String = Path.GetFileNameWithoutExtension(sLastProjectPath) Integer.TryParse(sProjId, nProjId) Dim ProdFileM = DbControllers.m_ProdController.FindCoreByProdId(nProjId) If Not IsNothing(ProdFileM) Then Dim ProdFileVM = New ProdFileVM(ProdFileM) Map.refProdManagerVM.OpenProject(ProdFileVM) End If End If End If ' inizializzo thread di aggiornamento e comunicazione con DB ' creo thread gestione macchina m_SupervisorCommThread = New Thread(Sub() SupervisorCommThread.SupervisorCommThreadFunction() End Sub) m_SupervisorCommThread.SetApartmentState(ApartmentState.STA) ' avvio thread di gestione della macchina che avvia la connessione m_SupervisorCommThread.Start() ' verifico se richiedere di fare backup If Map.refConfigurationPageVM.SelReminder.Id <> 0 Then Dim sBackupFolder As String = Map.refMainWindowVM.MainWindowM.sDataDir & "\Backup" Dim nYear As Integer = 0 Dim nMonth As Integer = 0 Dim nDay As Integer = 0 Dim LastBackupDate As Date = Date.MinValue ' verifico se esiste backup If Directory.Exists(sBackupFolder) Then ' cerco ultimo backup Dim YearDirList() As String = Directory.GetDirectories(sBackupFolder) For YearIndex = YearDirList.Length - 1 To 0 Step -1 nYear = 0 Integer.TryParse(Path.GetFileName(YearDirList(YearIndex)), nYear) Dim sYearDir As String = sBackupFolder & "\" & nYear Dim MonthDirList() As String = Directory.GetDirectories(sYearDir) For MonthIndex = MonthDirList.Length - 1 To 0 Step -1 nMonth = 0 Integer.TryParse(Path.GetFileName(MonthDirList(MonthIndex)), nMonth) Dim sMonthDir As String = sYearDir & "\" & nMonth Dim DayDirList() As String = Directory.GetDirectories(sMonthDir) For DayIndex = DayDirList.Length - 1 To 0 Step -1 nDay = 0 Integer.TryParse(Path.GetFileName(DayDirList(DayIndex)), nDay) Dim sDayDir As String = sMonthDir & "\" & nDay Dim VersionList() As String = Directory.GetFiles(sDayDir) If VersionList.Length > 0 Then Dim nMaxVersion As Int64 = 0 For Each item As String In VersionList Dim nTmp As Int64 = 0 Int64.TryParse(Path.GetFileNameWithoutExtension(item), nTmp) nMaxVersion = Math.Max(nMaxVersion, nTmp) Next If nMaxVersion > 0 Then LastBackupDate = New Date(nYear, nMonth, nDay) Exit For End If End If Next If LastBackupDate <> Date.MinValue Then Exit For Next If LastBackupDate <> Date.MinValue Then Exit For Next End If Dim TimeFromLastBackup As TimeSpan = DateTime.Now - LastBackupDate If TimeFromLastBackup > TimeSpan.FromDays(Map.refConfigurationPageVM.SelReminder.Id) Then If EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, String.Format(EgtMsg(61987), Map.refConfigurationPageVM.SelReminder.Name), EgtMsg(15002), MessageBoxButton.YesNo, MessageBoxImage.Warning) = MessageBoxResult.Yes Then Map.refConfigurationPageVM.Backup(True) End If End If End If End Sub Private Sub SplashScreenTimer_Tick() If m_WaitAfterRender > 1 Then m_Window_Opacity = 1 NotifyPropertyChanged(NameOf(Window_Opacity)) ' chiudo SplashScreen MapV.refSplashScreenV.Close() m_SplashScreen_Timer.Stop() ElseIf m_WaitAfterRender > 0 Then m_WaitAfterRender += 1 End If End Sub Friend Function ProcessCommandLine(ByRef nCommandType As Integer, ByRef nPage As Pages, ByRef nProdId As Integer) As Boolean ' Se non ci sono veri parametri su linea di comando, esco (il primo è sempre il nome del programma) If Environment.GetCommandLineArgs.Count() <= 1 Then Return False ' Recupero primo parametro che dovrebbe essere il tipo di modalita' riga di comando Dim sFile As String = Environment.GetCommandLineArgs(1) If String.IsNullOrWhiteSpace(sFile) OrElse Not Integer.TryParse(sFile, nCommandType) OrElse nCommandType <= 0 Then Return False Select Case nCommandType Case 1 ' apri progetto in ottimizzatore ' recupero secondo parametro Dim sProdId As String = Environment.GetCommandLineArgs(2) If Not Integer.TryParse(sProdId, nProdId) OrElse nProdId <= 0 Then Return False nPage = Pages.MACHINING Return True Case 2 ' apri pagina specifica senza progetto specifico ' recupero secondo parametro Dim sPage As String = Environment.GetCommandLineArgs(2) If Not Integer.TryParse(sPage, nPage) OrElse (nPage <> Pages.OPTIMIZERPAGE) Then Return False Return True End Select Return False End Function Friend Sub KeyDown(PressedKey As Key) ' Con ESC esco dall'azione corrente Select Case PressedKey Case Key.Escape ' se in modifica L250 If Map.refFreeContourManagerVM.bIsActive Then ' se in modifica testo angolo di inclinazione If Map.refFreeContourManagerVM.bIsModifyingTextAngle Then Map.refFreeContourManagerVM.CloseIsModifyingTextAngle(False) ElseIf Map.refFreeContourManagerVM.bIsCreatingPath Then Map.refFreeContourManagerVM.CreatingPathEnd() ElseIf Map.refFreeContourManagerVM.bIsOpeningCurveCompo Then Map.refFreeContourManagerVM.CloseIsOpeningCurveCompo() End If ' reset Azione corrente Map.refSceneHostVM.MainController.ResetStatus() Map.refFreeContourInputVM.ResetInputBox() End If ' se misura attiva, la disattivo If Map.refInstrumentPanelVM.GetDistIsChecked Then Map.refInstrumentPanelVM.SetGetDistance_IsChecked(False) End If ' se Reset Macchina è aperto If Map.refCALCPanelVM.ChooseMachine_Visibility = Visibility.Visible Then Map.refCALCPanelVM.CloseResetMachine() End If ' pulisco output Map.refMyStatusBarVM.ClearOutputMessage() End Select End Sub Friend m_ManagingSupervisorStop As Boolean = False Private Sub SupervisorTimer_Tick() If SupervisorCommThread.bViewerOptimizerBlocked And Not m_ManagingSupervisorStop Then m_ManagingSupervisorStop = True BlockedWnd = New BlockedWndV(Application.Current.MainWindow, New BlockedWndVM) BlockedWnd.ShowDialog() ElseIf Not SupervisorCommThread.bViewerOptimizerBlocked And m_ManagingSupervisorStop Then m_ManagingSupervisorStop = False BlockedWnd.Close() End If End Sub #End Region ' METHODS #Region "COMMANDS" #Region "AboutBoxCommand" ' Returns a command that manage the MainWindow_Unloaded command Public ReadOnly Property AboutBoxCommand() As ICommand Get If m_cmdAboutBox Is Nothing Then m_cmdAboutBox = New Command(AddressOf AboutBox) End If Return m_cmdAboutBox End Get End Property ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Sub AboutBox(ByVal param As Object) Dim AboutBoxWindow As New AboutBoxV With { .Owner = Application.Current.MainWindow } AboutBoxWindow.ShowDialog() End Sub #End Region ' AboutBoxCommand #Region "CloseApplicationCommand" ' Returns a command that manage the MainWindow_Unloaded command Public ReadOnly Property CloseApplicationCommand() As ICommand Get If m_cmdCloseApplication Is Nothing Then m_cmdCloseApplication = New Command(AddressOf CloseApplication) End If Return m_cmdCloseApplication End Get End Property ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. Public Sub CloseApplication(e As System.ComponentModel.CancelEventArgs) If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt OrElse Keyboard.IsKeyDown(Key.F4) Then Return End If ' verifico se sono in modifica percorso libero If Map.refFreeContourManagerVM.bIsActive Then EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(61994)) Return End If ' verifico se sto facendo backup If Map.refConfigurationPageVM.bBackupRunning Then EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62101), EgtMsg(15002), MessageBoxButton.OK, MessageBoxImage.Warning) 'Backup running! Impossible closing the software until finish the backup process! Return End If If Map.refConfigurationPageVM.bRestoreRunning Then EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62102), EgtMsg(15002), MessageBoxButton.OK, MessageBoxImage.Warning) 'Restore running! Impossible closing the software until finish the restore process! Return End If ' Gestisco eventuale file corrente modificato Dim bOk As Boolean = True Select Case Map.refMainMenuVM.SelPage Case Pages.CONFIG ' Verifica modifica parametri Macchina e chiedo il salvataggio Map.refConfigurationPageVM.VerifyConfigPageModification() Case Pages.OPTIMIZERPAGE bOk = ProdFileVM.VerifyProjectModification(ProjectManagerVM.CurrProd) <> MessageBoxResult.Cancel End Select ' se salvataggio annullato, rimango If Not bOk Then e.Cancel = True Return End If Dim bAllowClose As Boolean = Map.refSceneHostVM.MainController.ManageModified() ' Salvo impostazione macchina corrente Map.refMachinePanelVM.SaveCurrentMachine() ' Se non confermata chiusura, esco If Not bAllowClose Then Return ' termino thread di comunicazione con Db ed altri programmi SupervisorCommThread.StopThread() ' salvo modo di visualizzazione WriteMainPrivateProfileString(S_SCENE, K_SHOWMODE, EgtGetShowMode().ToString) ' salvo visualizzazione assemblato WriteMainPrivateProfileString(S_SCENE, K_SHOWBUILDING, If(Map.refShowBeamPanelVM.ShowBuilding_IsChecked, 1, 0)) ' Salvo nome ultimo file (per gestire bene multi istanza) Dim sFilePath As String = String.Empty If EgtGetCurrFilePath(sFilePath) Then WriteMainPrivateProfileString(S_GENERAL, K_LASTPROJ, sFilePath) ' tolgo lock da file aperto If Not IsNothing(ProjectManagerVM.CurrProd) Then DbControllers.m_ProdController.LockByProdId(ProjectManagerVM.CurrProd.nProdId, False, Map.refMainWindowVM.MainWindowM.GetKeyNumber()) End If ' chiudo esecutore Engine MyExecProcessManager.Close() ' salvo tabelle If Map.refPartListVM.PartColumns.Count > 0 AndAlso Map.refRawPartListVM.RawPartColumns.Count > 0 AndAlso Map.refRawPartListVM.PartInRawPartColumns.Count > 0 AndAlso Map.refFeatureInPartInRawPartListVM.FeatureInPartInRawPartColumns.Count > 0 AndAlso Map.refPParameterListVM.PParameterListColumns.Count > 0 Then Dim DataGridColumnDictionary As New Dictionary(Of String, ObservableCollection(Of EgwWPFBaseLib.ColumnLayout)) From {{S_PARTLIST, Map.refPartListVM.PartColumns}, {S_RAWPARTLIST_BEAM, Map.refRawPartListVM.RawPartColumns}, {S_PARTINRAWPARTLIST_BEAM, Map.refRawPartListVM.PartInRawPartColumns}, {S_FEATUREINPARTINRAWPARTLIST, Map.refFeatureInPartInRawPartListVM.FeatureInPartInRawPartColumns}, {S_PARAMETERLIST_P, Map.refPParameterListVM.PParameterListColumns}} EgwWPFBaseLib.EgwDataGrid.WriteColumnLayout(DataGridColumnsIniFile.m_sDataGridColumnsIniFile, DataGridColumnDictionary) End If ' Termino il Model m_MainWindowM.Close() ' Termino il programma Application.Current.Shutdown() End Sub #End Region ' CloseApplicationCommand #End Region ' COMMANDS End Class