Files
egtbeamwall/EgtBEAMWALL.ViewerOptimizer/ProdManager/ProdManagerVM.vb
T
Emmanuele Sassi 51a2cbf17c EgtBEAMWALL 2.4a5 :
- ricompilazione per cambio versione
- Aggiunta nuova gestione parametri Q per pareti
2022-01-31 08:47:53 +01:00

387 lines
14 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.IO
Imports EgtBEAMWALL.Core
Imports EgtBEAMWALL.Core.ConstBeam
Imports EgtBEAMWALL.DataLayer.DatabaseModels
Imports EgtUILib
Imports EgtWPFLib5
Public Class ProdManagerVM
Inherits VMBase
#Region "FIELDS & PROPERTIES"
Private m_ProdManager_IsEnabled As Boolean = True
Public ReadOnly Property ProdManager_IsEnabled As Boolean
Get
Return m_ProdManager_IsEnabled
End Get
End Property
Private m_CurrProd As ProdFileVM
Friend Property CurrProd As ProdFileVM
Get
Return m_CurrProd
End Get
Set(value As ProdFileVM)
m_CurrProd = value
End Set
End Property
Private m_TempCurrProd As ProdFileVM
Friend Property TempCurrProd As ProdFileVM
Get
Return m_TempCurrProd
End Get
Set(value As ProdFileVM)
m_TempCurrProd = value
End Set
End Property
' indice ultimo progetto
Private m_nLastProdId As Integer
Friend ReadOnly Property nLastProdId As Integer
Get
Return m_nLastProdId
End Get
End Property
Public ReadOnly Property nProdType As BWType
Get
Return If(Not IsNothing(CurrProd), CurrProd.nType, BWType.NULL)
End Get
End Property
Friend m_MruFiles As New MruList
Public ReadOnly Property MruFileNames As ObservableCollection(Of String)
Get
Dim IdAndBTLFileNames As New ObservableCollection(Of String)
For Each FileName In m_MruFiles.FileNames.ToList()
Dim PdId As Integer = 0
Dim sPdId As String = Path.GetFileNameWithoutExtension(DirectCast(FileName, String).Replace("__", "_"))
Integer.TryParse(sPdId, PdId)
Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId)
If IsNothing(PdFileM) Then
m_MruFiles.Remove(FileName)
Else
Dim PdFileVM = New ProdFileVM(PdFileM)
IdAndBTLFileNames.Add(sPdId & " | " & PdFileVM.sBTLFileName)
End If
Next
Return IdAndBTLFileNames
End Get
End Property
' Definizione comandi
Private m_cmdOpen As ICommand
Private m_cmdOpenMruFile As ICommand
Private m_cmdSave As ICommand
Private m_cmdGoToProj As ICommand
#Region "ToolTip"
'Proprietà ToolTip
Public ReadOnly Property OpenToolTip As String
Get
Return EgtMsg(MSG_TOPCOMMANDBAR + 2)
End Get
End Property
Public ReadOnly Property SaveToolTip As String
Get
Return EgtMsg(MSG_TOPCOMMANDBAR + 3)
End Get
End Property
Public ReadOnly Property AddProj_ToolTip As String
Get
Return EgtMsg(61921)
End Get
End Property
Public ReadOnly Property GoToProj_ToolTip As String
Get
Return EgtMsg(61922)
End Get
End Property
#End Region ' ToolTip
#End Region ' Fields & Properties
#Region "CONSTRUCTOR"
Sub New()
' Creo riferimento a questa classe in Map
Map.SetRefProdManagerVM(Me)
' Leggo ultimo indice di progetto
m_nLastProdId = GetMainPrivateProfileInt(S_GENERAL, K_PRODSINDEX, 1)
' Impostazioni MruLists
m_MruFiles.Init(S_MRUPRODFILES, 8)
End Sub
#End Region ' CONSTRUCTOR
#Region "METHODS"
Friend Function InitNewProject(ByRef nProjId As Integer, ByRef nProdId As Integer, ByRef sProjectDir As String) As Boolean
' richiedo indice nuovo progetto
nProdId = DbControllers.m_ProdController.GetNextIndex(nProjId)
If nProdId <= 0 Then Return False
sProjectDir = refMainWindowVM.MainWindowM.sProdsDir & "\" & nProdId.ToString("0000")
' creo cartella nuovo progetto
If Not Directory.Exists(sProjectDir) Then
Directory.CreateDirectory(sProjectDir)
Else
Dim di As System.IO.DirectoryInfo = New DirectoryInfo(sProjectDir)
For Each file As FileInfo In di.EnumerateFiles()
file.Delete()
Next
For Each dir As DirectoryInfo In di.EnumerateDirectories()
dir.Delete(True)
Next
End If
Return True
End Function
Public Function SetCurrProd(nProdId As Integer) As Boolean
Dim CurrProdM As ProdFileM = DbControllers.m_ProdController.FindCoreByProdId(nProdId)
If IsNothing(CurrProdM) Then Return False
Map.refProdManagerVM.CurrProd = New ProdFileVM(CurrProdM)
Return True
End Function
Public Sub ResetCurrProd()
CurrProd = Nothing
End Sub
Friend Sub SetProdManagerIsEnabled(bIsEnabled As Boolean)
m_ProdManager_IsEnabled = bIsEnabled
NotifyPropertyChanged(NameOf(ProdManager_IsEnabled))
End Sub
#End Region ' METHODS
#Region "COMMANDS"
#Region "OpenCommand"
''' <summary>
''' Returns a command that do Open.
''' </summary>
Public ReadOnly Property OpenCommand As ICommand
Get
If m_cmdOpen Is Nothing Then
m_cmdOpen = New Command(AddressOf Open)
End If
Return m_cmdOpen
End Get
End Property
''' <summary>
''' Execute the Open. This method is invoked by the OpenCommand.
''' </summary>
Friend Sub Open()
' verifico se progetto modificato, e chiedo se salvare
If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return
OpenProject(Nothing)
End Sub
Friend Sub OpenProject(TempCurrPd As ProdFileVM)
m_TempCurrProd = TempCurrPd
Dim sFilePath As String = ""
' se la string è vuota
Dim OpenProjectFileDialogVM As OpenProjectFileDialogVM = Nothing
If IsNothing(TempCurrProd) Then
' apro dialogo di scelta file
OpenProjectFileDialogVM = New OpenProjectFileDialogVM
Dim OpenFile As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM)
Dim DialogResult As Boolean? = OpenFile.EgtShowDialog(ProjectType.PROD)
If IsNothing(DialogResult) OrElse Not DialogResult Then Return
sFilePath = OpenProjectFileDialogVM.SelProject.sProdPath
TempCurrProd = OpenProjectFileDialogVM.SelProject
Else
sFilePath = If(Not IsNothing(TempCurrProd.sProdPath), TempCurrProd.sProdPath, "")
End If
If File.Exists(sFilePath) Then
' se la macchina del progetto in apertura non è tra le macchine disponibili lo segnalo e apro un progetto vuoto
If IsNothing(Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = Map.refProdManagerVM.TempCurrProd.sMachine)) Then
' rimuovo il file in apertura dalla lista degli MRU
Map.refProdManagerVM.m_MruFiles.Remove(sFilePath)
MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error
Map.refProjManagerVM.NewProject()
Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList()))
Else
If Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) Then
Map.refProjectVM.SetOptimizePanel_Visibility(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM OrElse (Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO)))
Map.refTopPanelVM.UpdateQParameterVisibility()
'SectionXMaterial.SetType(Map.refProjectVM.BTLStructureVM.nPROJTYPE)
'' aggiorno le colonne in base al tipo progetto
'Map.refRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE)
'Map.refPartInRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE)
'm_CurrProd = TempCurrProd
'DbControllers.m_ProdController.LockByProdId(m_CurrProd.nProdId, True)
'' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel
'Map.refCALCPanelVM.LoadMachineList()
'' seleziono primo gruppo
'Map.refProjectVM.MachGroupPanelVM.SelFirstMachGroup()
End If
End If
' imposto flag secondo tipo di progetto (travi o pareti)
Dim sBTLFlag As String = If( TempCurrProd.nType = Core.ConstBeam.BWType.BEAM, K_BTLFLAG, K_WALLBTLFLAG)
Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR)
EgtBeamSetFlag( nFlag)
Else
MessageBox.Show(EgtMsg(61871))
Map.refSceneHostVM.MainController.NewProject()
Map.refMainWindowVM.SetTitle("New - EgtBEAMWALL")
End If
' aggiorno titolo
Map.refMainWindowVM.UpdateTitle()
NotifyPropertyChanged(NameOf(MruFileNames))
End Sub
#End Region ' OpenCommand
#Region "OpenMruFileCommand"
''' <summary>
''' Returns a command that do Open.
''' </summary>
Public ReadOnly Property OpenMruFileCommand As ICommand
Get
If m_cmdOpenMruFile Is Nothing Then
m_cmdOpenMruFile = New Command(AddressOf OpenMruFile)
End If
Return m_cmdOpenMruFile
End Get
End Property
''' <summary>
''' Execute the Open. This method is invoked by the OpenCommand.
''' </summary>
Public Sub OpenMruFile(ByVal param As Object)
' verifico se progetto modificato, e chiedo se salvare
If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return
' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo
Dim PdId As Integer = 0
Dim arrStrPdId As String() = DirectCast(param, String).Split("|")
Integer.TryParse(arrStrPdId(0), PdId)
Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId)
Dim PdFileVM = New ProdFileVM(PdFileM)
OpenProject(PdFileVM)
End Sub
#End Region ' OpenMruFileCommand
#Region "SaveCommand"
''' <summary>
''' Returns a command that do Save.
''' </summary>
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
''' <summary>
''' Execute the Save. This method is invoked by the SaveCommand.
''' </summary>
Public Sub Save()
If IsNothing(m_CurrProd) Then Return
Map.refSceneHostVM.SaveProject()
Map.refMainWindowVM.UpdateTitle()
Dim MyMachGroupList As New List(Of MyMachGroupM)
If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then
For Each MachGroup In Map.refProjectVM.MachGroupPanelVM.m_MyMachGroupPanelM.MachGroupMList
MyMachGroupList.Add(MachGroup)
Next
End If
' aggiorno pezzi su Db
DbControllers.m_ProdController.UpdateMachGroup(CurrProd.nProdId, MyMachGroupList)
' verifico se Reset Macchina modificato e nel caso aggiorno DB e CurrProj
If Map.refCALCPanelVM.IsMachineModified() Then
DbControllers.m_ProdController.UpdateMachine(Map.refProdManagerVM.CurrProd.nProdId, Map.refCALCPanelVM.SelectedMachine.Name)
Map.refProdManagerVM.CurrProd.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name)
' ciclo sulla lista di ProjId associati
For Each ProjId In Map.refProdManagerVM.CurrProd.nProjIdList
' aggiorno la Macchina per i ProjId associati sul DB
DbControllers.m_ProjController.UpdateMachine(ProjId, Map.refCALCPanelVM.SelectedMachine.Name)
' se uno dei Proj interessati equivale al Proj correntemente aperto setto la Macchina dello stesso
' (poichè il progetto corrente non viene riaperto e riletto dal DB)
If ProjId = Map.refProjManagerVM.CurrProj.nProjId Then Map.refProjManagerVM.CurrProj.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name)
Next
Map.refCALCPanelVM.ResetMachineModified()
End If
' se nuovo progetto
If m_CurrProd.bIsNew Then
' resetto stato new
' DbControllers.m_ProdController.Reset(CurrProd.nProjId)
m_CurrProd.bIsNew = False
End If
NotifyPropertyChanged(NameOf(MruFileNames))
End Sub
#End Region ' SaveCommand
#Region "GoToProj"
''' <summary>
''' Returns a command that do Open.
''' </summary>
Public ReadOnly Property GoToProj_Command As ICommand
Get
If m_cmdGoToProj Is Nothing Then
m_cmdGoToProj = New Command(AddressOf GoToProj)
End If
Return m_cmdGoToProj
End Get
End Property
''' <summary>
''' Execute the Open. This method is invoked by the OpenCommand.
''' </summary>
Friend Sub GoToProj()
If IsNothing(m_CurrProd) Then Return
' recupero Proj associati da Db
Dim ProjFileMList As List(Of ProjFileM) = DbControllers.m_ProjController.GetByProdAsc(m_CurrProd.nProdId)
Dim nProjId As Integer = 0
' verifico se salvare progetto corrente
Dim VerifyResult As MessageBoxResult = ProdFileVM.VerifyProjectModification(Map.refProdManagerVM.CurrProd)
If VerifyResult = MessageBoxResult.Cancel Then Return
' se piu' di uno
If IsNothing(ProjFileMList) Then
Return
ElseIf ProjFileMList.Count = 1 AndAlso ProjFileMList(0).nProjId > 0 Then
nProjId = ProjFileMList(0).nProjId
ElseIf ProjFileMList.Count > 1 Then
Dim ProjFileVMList As New List(Of ProjectFileVM)
For Each Project In ProjFileMList
ProjFileVMList.Add(New ProjFileVM(Project))
Next
' apro finestra di scelta
Dim OpenProjectFileDialogVM As New OpenProjectFileDialogVM
Dim ChooseProjFileDialog As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM)
Dim DialogResult As Boolean? = ChooseProjFileDialog.EgtShowDialog(ProjectType.PROJ, ProjFileVMList)
If IsNothing(DialogResult) OrElse Not DialogResult Then Return
' se proj selezionato
If Not IsNothing(OpenProjectFileDialogVM.SelProject.nProdId) AndAlso OpenProjectFileDialogVM.SelProject.nProdId > 0 Then
nProjId = OpenProjectFileDialogVM.SelProject.nProjId
End If
Else Return
End If
' apro progetto proj
Map.refProjManagerVM.SetCurrProj(nProjId)
' ricarico progetto se il prod e' nullo (quindi e' stato cancellato)
Map.refProjManagerVM.CurrProj.SetReloadProject(IsNothing(CurrProd) OrElse VerifyResult = MessageBoxResult.No)
' vado in pagina proj
Map.refMainMenuVM.SetSelPage(Pages.VIEW, False)
End Sub
#End Region ' GoToProj
#End Region ' Commands
End Class