Files
egtbeamwall/EgtBEAMWALL.Optimizer/MainWindow/MainWindowVM.vb
Demetrio Cassarino e603793dc0 EgtBEAMWALL 3.1.3.7:
-modifica a generazione pdf
2026-03-26 15:34:17 +01:00

442 lines
19 KiB
VB.net

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