Imports System.Collections.ObjectModel Imports System.IO Imports EgtBEAMWALL.Core Imports EgtBEAMWALL.DataLayer.DatabaseModels Imports EgtUILib Imports EgtWPFLib5 Public Class ProjManagerVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private m_ProjManager_IsEnabled As Boolean = True Public ReadOnly Property ProjManager_IsEnabled As Boolean Get Return m_ProjManager_IsEnabled End Get End Property Private m_CurrProj As ProjFileVM Friend Property CurrProj As ProjFileVM Get Return m_CurrProj End Get Set(value As ProjFileVM) m_CurrProj = value End Set End Property Private m_TempCurrProj As ProjFileVM Friend Property TempCurrProj As ProjFileVM Get Return m_TempCurrProj End Get Set(value As ProjFileVM) m_TempCurrProj = value End Set End Property Private m_IsEnabled As Boolean Public Property IsEnabled As Boolean Get Return m_IsEnabled End Get Set(value As Boolean) If value <> m_IsEnabled Then m_IsEnabled = value NotifyPropertyChanged("IsEnabled") End If End Set End Property ' indice ultimo progetto Private m_nLastProjId As Integer Friend ReadOnly Property nLastProjId As Integer Get Return m_nLastProjId End Get End Property Public ReadOnly Property nProjType As BWType Get Return If(Not IsNothing(CurrProj), CurrProj.nType, BWType.NULL) End Get End Property ' indice progetto in caricamento Private m_nLoadingProjId As Integer = 0 Public ReadOnly Property nLoadingProjId As Integer Get Return m_nLoadingProjId 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 Dim PjId As Integer = 0 Dim sPjId As String = Path.GetFileNameWithoutExtension(DirectCast(FileName, String).Replace("__", "_")) Integer.TryParse(sPjId, PjId) Dim PjFileM = DbControllers.m_ProjController.FindByProjIdConv(PjId) IdAndBTLFileNames.Add(sPjId & " | " & PjFileM.sBTLFileName) Next Return IdAndBTLFileNames End Get End Property ' Definizione comandi Private m_cmdNew As ICommand Private m_cmdOpen As ICommand Private m_cmdOpenMruFile As ICommand Private m_cmdSave As ICommand Private m_cmdSaveAs As ICommand Private m_cmdExport As ICommand Private m_cmdDxfOut As ICommand Private m_cmdImportBTL As ICommand Private m_cmdImportProject As ICommand Private m_cmdExportProject As ICommand Private m_cmdGoToProd As ICommand Private m_cmdSendFeedback As ICommand #Region "ToolTip" 'Proprietà ToolTip Public ReadOnly Property NewToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 1) End Get End Property 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 SaveAsToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 4) End Get End Property Public ReadOnly Property InsertToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 5) End Get End Property Public ReadOnly Property ImportBTL_ToolTip As String Get Return EgtMsg(61840) End Get End Property Public ReadOnly Property UpdateBTL_ToolTip As String Get Return EgtMsg(61834) End Get End Property Public ReadOnly Property ExportProject_ToolTip As String Get Return EgtMsg(61838) End Get End Property Public ReadOnly Property ImportProject_ToolTip As String Get Return EgtMsg(61839) End Get End Property Public ReadOnly Property GoToProd_ToolTip As String Get Return EgtMsg(61835) End Get End Property #End Region ' ToolTip #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New() ' Creo riferimento a questa classe in Map Map.SetRefProjManagerVM(Me) ' Leggo ultimo indice di progetto m_nLastProjId = GetMainPrivateProfileInt(S_GENERAL, K_PROJSINDEX, 1) ' Impostazioni MruLists m_MruFiles.Init(S_MRUPROJFILES, 8) End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Private Sub NewProdFromProj() ' inizializzo nuovo progetto Dim nProdId As Integer = 0 Dim sProdDir As String = "" Map.refProdManagerVM.InitNewProject(m_CurrProj.nProjId, nProdId, sProdDir) ' setto il PType del Prod DbControllers.m_ProdController.UpdatePType(nProdId, CurrProj.nType) ' setto la Macchina associata al Prod DbControllers.m_ProdController.UpdateMachine(nProdId, CurrProj.sMachine) ' copio file progetto Dim sProjPath As String = String.Empty Dim bOk = False Dim sProdPath As String = sProdDir & "\" & nProdId.ToString("0000") & ".nge" If EgtGetCurrFilePath(sProjPath) AndAlso Not String.IsNullOrEmpty(sProjPath) Then Try File.Copy(sProjPath, sProdPath) 'Map.refSceneHostVM.MainController.OpenProject(sProdPath) bOk = True Catch ex As Exception EgtOutLog("Impossibile copiare il file") bOk = False End Try End If If bOk Then ' aggiorno path proj Map.refProjManagerVM.UpdateCurrProj() ' imposto currprod Map.refProdManagerVM.SetCurrProd(nProdId) ' imposto TempCurrProd Map.refProdManagerVM.TempCurrProd = Map.refProdManagerVM.CurrProd ' setto flag nuovo progetto in prod Map.refProdManagerVM.CurrProd.bIsNew = True Else ' elimino da DB DbControllers.m_ProdController.DeleteProd(nProdId) End If End Sub Private Function InitNewProject(ByRef nProjId As Integer, ByRef sProjectDir As String, nType As BWType, Machine As Machine) As Boolean ' richiedo indice nuovo progetto nProjId = DbControllers.m_ProjController.GetNextIndex() ' salvo data creazione progetto DbControllers.m_ProjController.Update(New ProjModel() With {.ProjId = nProjId, .DtCreated = DateTime.Now(), .PType = nType, .Machine = If(Not IsNothing(Machine), Machine.Name, Nothing)}) If nProjId <= 0 Then Return False sProjectDir = refMainWindowVM.MainWindowM.sProjsDir & "\" & nProjId.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 Private Function UpdateProjData(nProjId As Integer, nProdId As Integer, dtExportDate As DateTime, sListName As String) DbControllers.m_ProjController.Update(New ProjModel() With {.ProjId = nProjId, .DtExported = dtExportDate, .ListName = sListName}) End Function Private Function UpdateBTLFileName(nProjId As Integer, BTLFileName As String) DbControllers.m_ProjController.Update(New ProjModel() With {.ProjId = nProjId, .BTLFileName = BTLFileName}) End Function Public Function SetCurrProj(nProjId As Integer) As Boolean Dim Currproj As ProjFileM = DbControllers.m_ProjController.FindByProjIdConv(nProjId) If IsNothing(Currproj) Then Return False m_CurrProj = New ProjFileVM(Currproj) Return True End Function Public Function UpdateCurrProj() As Boolean Return SetCurrProj(CurrProj.nProjId) End Function Public Sub ResetCurrProj() CurrProj = Nothing End Sub Friend Sub SetProjManagerIsEnabled(bIsEnabled As Boolean) m_ProjManager_IsEnabled = bIsEnabled NotifyPropertyChanged(NameOf(ProjManager_IsEnabled)) End Sub #End Region ' METHODS #Region "COMMANDS" #Region "New" ''' ''' Returns a command that do Save. ''' Public ReadOnly Property New_Command As ICommand Get If m_cmdNew Is Nothing Then m_cmdNew = New Command(AddressOf NewProject) End If Return m_cmdNew End Get End Property ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub NewProject() ' verifico se progetto modificato, e chiedo se salvare If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return ' se si ha una sola macchina disponibile (non BOTH) setto il nuovo porgetto a quella macchina e al tipo progetto associato ' altrimenti apro il dialog per scegliere la macchina e il tipo progetto a cui settare il nuovo progetto Dim Machine As Machine = Nothing Dim nType As BWType = BWType.NULL Dim ProjectTypeWndVM As New ProjectTypeWndVM() If ProjectTypeWndVM.MachineList.Count = 1 And DirectCast(ProjectTypeWndVM.SelMachine, MyMachine).nType <> MachineType.BOTH Then Machine = ProjectTypeWndVM.SelMachine nType = DirectCast(Machine, MyMachine).nType Else Dim ProjectTypeWnd As New ProjectTypeWndV(Application.Current.MainWindow, ProjectTypeWndVM) If ProjectTypeWnd.ShowDialog() Then Machine = ProjectTypeWndVM.SelMachine nType = ProjectTypeWndVM.nSelType Else Return End If End If ' creo nuovo progetto If Map.refSceneHostVM.MainController.NewProject() Then ' inizializzo nuovo progetto Dim nProjId As Integer = 0 Dim sProjDir As String = "" InitNewProject(nProjId, sProjDir, nType, Machine) SetCurrProj(nProjId) ' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel Map.refCALCPanelVM.LoadMachineList() Dim sProjFileName As String = sProjDir & "\" & nProjId.ToString("0000") & ".nge" ' imposto ProjId di caricamento m_nLoadingProjId = nProjId ' creo gruppo BTLinfo Dim nBTLInfoLayer As Integer = EgtCreateGroup(GDB_ID.ROOT) EgtSetName(nBTLInfoLayer, BTLINFO) EgtSetLevel(nBTLInfoLayer, GDB_LV.SYSTEM) Map.refProjectVM.BTLStructureVM.BTLStructureM.UpdateBTLInfoLayer() ' scrivo info proj e tipo su layer BtlInfo EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, nProjId) EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType) ' salvo il progetto If EgtSaveFile(sProjFileName, NGE.CMPTEXT) Then SectionXMaterial.SetType(nType) DbControllers.m_ProjController.UpdateInfo(nProjId, "Hand made", "", Date.MinValue, nType, Map.refMachinePanelVM.SelectedMachine.Name) SetCurrProj(nProjId) End If Else MessageBox.Show(EgtMsg(61876)) End If Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) End Sub #End Region ' New #Region "OpenCommand" ''' ''' Returns a command that do Open. ''' 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 ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Friend Sub Open() ' verifico se progetto modificato, e chiedo se salvare If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return OpenProject(Nothing) End Sub Friend Sub OpenProject(TempCurrPj As ProjFileVM) m_TempCurrProj = TempCurrPj ' se la string è vuota Dim OpenProjectFileDialogVM As OpenProjectFileDialogVM = Nothing If IsNothing(TempCurrProj) 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.PROJ) If IsNothing(DialogResult) OrElse Not DialogResult Then Return TempCurrProj = OpenProjectFileDialogVM.SelProject End If ' imposto ProjId di caricamento m_nLoadingProjId = TempCurrProj.nProjId ' se esiste prod prendo quello, altrimenti proj Dim sFilePath As String = "" If Not IsNothing(TempCurrProj.nProdId) AndAlso TempCurrProj.nProdId > 0 Then sFilePath = TempCurrProj.sProdPath Else sFilePath = TempCurrProj.sProjPath End If SectionXMaterial.SetType(TempCurrProj.nType) If Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) Then '' imposto macchina del progetto 'Map.refMachinePanelVM.SelectedMachine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = TempCurrProj.sMachine) '' aggiorno le colonne in base al tipo progetto 'Map.refRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE) 'Map.refPartInRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE) 'm_CurrProj = TempCurrProj 'DbControllers.m_ProjController.LockByProjId(m_CurrProj.nProjId, True) '' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel 'Map.refCALCPanelVM.LoadMachineList() End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) End Sub #End Region ' OpenCommand #Region "OpenMruFileCommand" ''' ''' Returns a command that do Open. ''' 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 ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Public Sub OpenMruFile(ByVal param As Object) ' verifico se progetto modificato, e chiedo se salvare If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return ' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo Dim PjId As Integer = 0 Dim arrStrPjId As String() = DirectCast(param, String).Split("|") Integer.TryParse(arrStrPjId(0), PjId) Dim PjFileM = DbControllers.m_ProjController.FindByProjIdConv(PjId) Dim PjFileVM = New ProjFileVM(PjFileM) OpenProject(PjFileVM) End Sub #End Region ' OpenMruFileCommand #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() If IsNothing(CurrProj) Then Return ' verifico se assemblato e lo annullo per salvataggio Dim bShowBuilding As Boolean = Map.refShowBeamPanelVM.ShowBuilding_IsChecked If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False) ' verifico se solido e lo annullo per salvataggio Dim bShowSolid As Boolean = False If Not Map.refShowBeamPanelVM.bShowAll Then bShowSolid = Map.refShowBeamPanelVM.ShowSolid_IsChecked If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(False) End If ' imposto ProjId di caricamento m_nLoadingProjId = CurrProj.nProjId Map.refSceneHostVM.SaveProject() Map.refMainWindowVM.SetTitle(CurrProj.nProjId.ToString("0000") & " - " & CurrProj.sBTLFileName & " - EgtBEAMWALL") ' aggiorno BTLParts su DB DbControllers.m_ProjController.UpdateBtlParts(CurrProj.nProjId, Map.refProjectVM.BTLStructureVM.BTLStructureM.BTLPartMList) ' se nuovo progetto If m_CurrProj.bIsNew Then ' resetto stato new DbControllers.m_ProjController.ResetNew(CurrProj.nProjId) m_CurrProj.bIsNew = False End If ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(False) ' verifico se Reset Macchina modificato e nel caso aggiorno DB e CurrProj If Map.refCALCPanelVM.IsMachineModified() Then DbControllers.m_ProjController.UpdateMachine(Map.refProjManagerVM.CurrProj.nProjId, Map.refCALCPanelVM.SelectedMachine.Name) Map.refProjManagerVM.CurrProj.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) ' se esiste un Prod associato al Proj corrente aggiorno anche questo Prod nel DB If Map.refProjManagerVM.CurrProj.nProdId > 0 Then DbControllers.m_ProdController.UpdateMachine(Map.refProjManagerVM.CurrProj.nProdId, Map.refCALCPanelVM.SelectedMachine.Name) Map.refCALCPanelVM.ResetMachineModified() End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) End Sub #End Region ' SaveCommand #Region "ImportBTL" ''' ''' Returns a command that do Export. ''' Public ReadOnly Property ImportBTL_Command As ICommand Get If m_cmdImportBTL Is Nothing Then m_cmdImportBTL = New Command(AddressOf ImportBTL) End If Return m_cmdImportBTL End Get End Property ''' ''' Execute the ImportBTL. This method is invoked by the ImportBTLCommand. ''' Public Sub ImportBTL(Optional sFile As String = "", Optional bWithDlg As Boolean = True) If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return Dim sDir As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, "", sDir) If bWithDlg Then ' apro finestra scelta file Dim BTLDlg As New Microsoft.Win32.OpenFileDialog() With { .DefaultExt = ".btl", .Filter = "BTL (*.btl)|*.btl" & "|BTLX (*.btlx)|*.btlx", .CheckFileExists = True, .ValidateNames = True} If BTLDlg.ShowDialog() Then sFile = BTLDlg.FileName Else Return End If End If ' se si ha una sola macchina disponibile (non BOTH) setto il porgetto importato a quella macchina e al tipo progetto associato ' altrimenti apro il dialog per scegliere la macchina e il tipo progetto a cui settare il progetto importato Dim Machine As Machine = Nothing Dim nType As BWType = BWType.NULL Dim ProjectTypeWndVM As New ProjectTypeWndVM() If ProjectTypeWndVM.MachineList.Count = 1 And DirectCast(ProjectTypeWndVM.SelMachine, MyMachine).nType <> MachineType.BOTH Then Machine = ProjectTypeWndVM.SelMachine nType = DirectCast(Machine, MyMachine).nType Else Dim ProjectTypeWnd As New ProjectTypeWndV(Application.Current.MainWindow, ProjectTypeWndVM) If ProjectTypeWnd.ShowDialog() Then Machine = ProjectTypeWndVM.SelMachine nType = ProjectTypeWndVM.nSelType Else Return End If End If ' inizializzo nuovo progetto Dim nProjId As Integer = 0 Dim sProjDir As String = "" InitNewProject(nProjId, sProjDir, nType, Machine) SetCurrProj(nProjId) ' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel Map.refCALCPanelVM.LoadMachineList() ' imposto ProjId di caricamento m_nLoadingProjId = nProjId ' copio file BTL Dim sBtlCopyPath As String = sProjDir & "\" & Path.GetFileName(sFile) Dim bOk = False Try File.Copy(sFile, sBtlCopyPath) bOk = True Catch ex As Exception EgtOutLog("Impossibile copiare il file") bOk = False End Try ' importo file If bOk Then SectionXMaterial.SetType(nType) bOk = Map.refSceneHostVM.MainController.ImportProject(sBtlCopyPath, False) End If Dim sProjFileName As String = sProjDir & "\" & nProjId.ToString("0000") & ".nge" If bOk Then ' salvo il progetto bOk = EgtSaveFile(sProjFileName, NGE.CMPTEXT) Else EgtOutLog("Errore nell'importazione BTL") End If If bOk Then ' aggiorno Db Dim sBTLFileName As String = Path.GetFileNameWithoutExtension(sFile) 'UpdateBTLFileName(nProjId, sBTLFileName) Dim ExportDate As DateTime DateTime.TryParse(Map.refProjectVM.BTLStructureVM.BTLStructureM.m_sEXPDATE & " " & Map.refProjectVM.BTLStructureVM.BTLStructureM.m_sEXPTIME, ExportDate) DbControllers.m_ProjController.UpdateInfo(nProjId, sBTLFileName, Map.refProjectVM.BTLStructureVM.sLISTNAME, ExportDate, nType, Map.refMachinePanelVM.SelectedMachine.Name) SetCurrProj(nProjId) Map.refMainWindowVM.UpdateTitle() ' mostro tutti i pezzi Map.refShowBeamPanelVM.ShowAll() Else ' elimino da Db DbControllers.m_ProjController.DeleteProj(nProjId) End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() End Sub #End Region ' ImportBTL #Region "ExportProject" ''' ''' Returns a command that do Export. ''' Public ReadOnly Property ExportProject_Command As ICommand Get If m_cmdExportProject Is Nothing Then m_cmdExportProject = New Command(AddressOf ExportProject) End If Return m_cmdExportProject End Get End Property ''' ''' Execute the Export. This method is invoked by the ExportCommand. ''' Public Sub ExportProject() If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return If IsNothing(CurrProj) Then Return ' apro finestra di salvataggio progetto Dim ExportDlg As New Microsoft.Win32.SaveFileDialog() With {.DefaultExt = ".ngexp", .Filter = "ProjectExport (*.ngexp)|*.ngexp", .FileName = CurrProj.nProjId.ToString("0000") & " - " & CurrProj.sBTLFileName & " - ProjectExport"} If ExportDlg.ShowDialog() <> True Then Return ' per ogni BTLInfo nel progetto riporto il relativo nome del BTL Dim nBTLInfoProjId As Integer Dim nBTLInfoLayerId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO) While nBTLInfoLayerId <> GDB_ID.NULL ' recupero il ProjId EgtGetInfo(nBTLInfoLayerId, BTL_PRT_PROJ, nBTLInfoProjId) If nBTLInfoProjId > 0 Then ' recupero il BTL file name di questo proj Dim BTLFileNameProj As ProjFileM = DbControllers.m_ProjController.FindByProjIdConv(nBTLInfoProjId) If Not IsNothing(BTLFileNameProj) Then EgtSetInfo(nBTLInfoLayerId, BTLFILENAME, BTLFileNameProj.sBTLFileName) End If End If nBTLInfoLayerId = EgtGetNextName(nBTLInfoLayerId, BTLINFO) End While '' se c'e' un prod collegato 'If Map.refProjManagerVM.CurrProj.nProdId > 0 Then ' ' scrivo quali sono i proj e prod in questo file ' Dim Prod As ProdFileM = DbControllers.m_ProdController.FindCoreByProdId(Map.refProjManagerVM.CurrProj.nProdId) ' EgtSetInfo(Map.refProjectVM.BTLStructureVM.BTLStructureM.nBTLInfoId, EXP_PROD, Map.refProjManagerVM.CurrProj.nProdId) ' For ProjIndex = 0 To Prod.nProjIdList.Count - 1 ' EgtSetInfo(Map.refProjectVM.BTLStructureVM.BTLStructureM.nBTLInfoId, EXP_PROJ & ProjIndex + 1, Prod.nProjIdList(ProjIndex)) ' Next 'Else ' EgtSetInfo(Map.refProjectVM.BTLStructureVM.BTLStructureM.nBTLInfoId, EXP_PROJ & 1, Map.refProjManagerVM.CurrProj.nProjId) 'End If ' salvo info inserite Map.refSceneHostVM.SaveProject() ' creo file zip Dim sZipToCreate As String = ExportDlg.FileName If File.Exists(sZipToCreate) Then File.Delete(sZipToCreate) End If Try Using zip As New Ionic.Zip.ZipFile(sZipToCreate, Console.Out) ' impacchetto tutta la cartella del progetto Dim sProjectDirPath As String = If(CurrProj.nProdId > 0, CurrProj.sProdDirPath, CurrProj.sProjDirPath) For Each sFile As String In Directory.GetFiles(sProjectDirPath) zip.AddItem(sFile, "") Next ' salvo lo zip zip.Save() End Using Catch ex1 As Exception EgtOutLog("Exception in zip: " & ex1.ToString()) MessageBox.Show("Impossibile creare file di export") End Try End Sub #End Region ' ExportProject #Region "ImportProject" ''' ''' Returns a command that do Export. ''' Public ReadOnly Property ImportProject_Command As ICommand Get If m_cmdImportProject Is Nothing Then m_cmdImportProject = New Command(AddressOf ImportProject) End If Return m_cmdImportProject End Get End Property ''' ''' Execute the Export. This method is invoked by the ExportCommand. ''' Public Sub ImportProject() ' lista di tutti gli errori riscontrati Dim ErrorList As New List(Of String) If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return Dim sDir As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, "", sDir) ' apro finestra scelta file Dim ImportDlg As New Microsoft.Win32.OpenFileDialog() With {.DefaultExt = ".ngexp", .Filter = "ProjectExport (*.ngexp)|*.ngexp", .CheckFileExists = True, .ValidateNames = True} If ImportDlg.ShowDialog() <> True Then Return ' creo cartella temporanea di estrazione in Temp Dim sProjectimportDir As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\ProjectImport" If Directory.Exists(sProjectimportDir) Then Directory.Delete(sProjectimportDir, True) End If Directory.CreateDirectory(sProjectimportDir) Try Using zip As New Ionic.Zip.ZipFile(ImportDlg.FileName, Console.Out) ' estraggo file da zip zip.ExtractAll(sProjectimportDir) End Using Catch ex1 As Exception EgtOutLog("Exception in zip: " & ex1.ToString()) MessageBox.Show("Impossibile importare file", "Errore") Return End Try ' carico progetto Dim sProjFromPath() As String = Directory.GetFiles(sProjectimportDir, "*.nge") Dim bOk = EgtOpenFile(sProjFromPath(0)) If Not bOk Then MessageBox.Show("Impossibile aprire il file", "Errore") Return End If ' leggo proj e prod presenti dai layer BTLInfo Dim ImportProjIdList As New List(Of Integer) Dim NewProjIdList As New List(Of Integer) Dim BTLInfoIdList As New List(Of Integer) Dim BTLFileNameList As New List(Of String) Dim CurrImportProjId As Integer Dim nBTLInfoLayerId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO) While nBTLInfoLayerId <> GDB_ID.NULL ' recupero il ProjId EgtGetInfo(nBTLInfoLayerId, BTL_PRT_PROJ, CurrImportProjId) If CurrImportProjId > 0 Then ImportProjIdList.Add(CurrImportProjId) BTLInfoIdList.Add(nBTLInfoLayerId) ' recupero nome file BTL Associato Dim sBTLFileName As String = "" EgtGetInfo(nBTLInfoLayerId, BTLFILENAME, sBTLFileName) BTLFileNameList.Add(sBTLFileName) End If nBTLInfoLayerId = EgtGetNextName(nBTLInfoLayerId, BTLINFO) End While If Not ImportProjIdList.Count > 0 Then MessageBox.Show("Nessun progetto trovato all'interno del file importato", "Errore") End If ' carico i proj For nProjIndex = 0 To ImportProjIdList.Count - 1 Dim nImportProjId As Integer = ImportProjIdList(nProjIndex) ' inizializzo nuovo proj Dim nNewProjId As Integer = 0 Dim sNewProjDir As String = "" InitNewProject(nNewProjId, sNewProjDir, nType, Nothing) NewProjIdList.Add(nNewProjId) ' imposto ProjId di caricamento m_nLoadingProjId = nImportProjId ' costruisco BTLStructure del proj Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(nImportProjId)) ' scrivo info proj su tutti i pezzi di questo progetto For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList EgtSetInfo(BTLPart.nPartId, BTL_PRT_PROJ, nNewProjId) Next ' riporto nuovo ProjId nel layer BTLInfo EgtSetInfo(BTLInfoIdList(nProjIndex), BTL_PRT_PROJ, nNewProjId) ' salvo modifiche fatte al progetto bOk = bOk AndAlso Map.refSceneHostVM.MainController.SaveProject() If bOk Then ' copio file BTL e progetto Dim sBTLFromPath As String = sProjectimportDir & "\" & BTLFileNameList(nProjIndex) & ".btl" Dim sProjFileName As String = sNewProjDir & "\" & nNewProjId.ToString("0000") & ".nge" If sProjFromPath.Count > 0 AndAlso Not String.IsNullOrWhiteSpace(sProjFromPath(0)) Then Try If Not String.IsNullOrWhiteSpace(sBTLFromPath) AndAlso File.Exists(sBTLFromPath) Then Dim sBtlToPath As String = sNewProjDir & "\" & Path.GetFileName(sBTLFromPath) File.Copy(sBTLFromPath, sBtlToPath) Else ErrorList.Add(String.Format("File BTL del progetto {0} non trovato", nImportProjId)) End If File.Copy(sProjFromPath(0), sProjFileName) Catch ex As Exception EgtOutLog("Impossibile copiare il file") MessageBox.Show("Impossibile copiare il file del progetto", "Errore") Return End Try End If ' aggiorno Db Dim sBTLFileName As String = BTLFileNameList(nProjIndex) Dim ExportDate As DateTime DateTime.TryParse(Map.refProjectVM.BTLStructureVM.BTLStructureM.m_sEXPDATE & " " & Map.refProjectVM.BTLStructureVM.BTLStructureM.m_sEXPTIME, ExportDate) DbControllers.m_ProjController.UpdateInfo(nNewProjId, sBTLFileName, Map.refProjectVM.BTLStructureVM.sLISTNAME, ExportDate, BWType.NULL, Map.refMachinePanelVM.SelectedMachine.Name) Else ' elimino da Db DbControllers.m_ProjController.DeleteProj(nNewProjId) End If ' salvo il progetto PROJ Map.refSceneHostVM.SaveProject() ' aggiorno BTLParts su DB DbControllers.m_ProjController.UpdateBtlParts(nNewProjId, Map.refProjectVM.BTLStructureVM.BTLStructureM.BTLPartMList) ' resetto stato new DbControllers.m_ProjController.ResetNew(nNewProjId) ' resetto lock DbControllers.m_ProjController.LockByProjId(nNewProjId, False) DbControllers.m_ProjController.ResetController() Next ' se tutte le operazioni precedenti sono andate a buon fine If bOk Then ' sostituisco indicazione nuovi proj nei pezzi Dim nDuploLayerId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, "DuploBase") Dim nDuploId As Integer = EgtGetFirstInGroup(nDuploLayerId) While nDuploId <> GDB_ID.NULL ' recupero vecchio proj Dim nOldProjId As Integer EgtGetInfo(nDuploId, BTL_PRT_PROJ, nOldProjId) ' lo cerco nella lista Dim nOldProjIndex As Integer = ImportProjIdList.IndexOf(nOldProjId) ' lo sostituisco EgtSetInfo(nDuploId, BTL_PRT_PROJ, NewProjIdList(nOldProjIndex)) nDuploId = EgtGetNext(nDuploId) End While ' carico Machgroup che non verrebbero altrimenti importati Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList())) If Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count > 0 Then ' inizializzo nuovo progetto PROD Dim nProdId As Integer = 0 Dim sProdDir As String = "" Map.refProdManagerVM.InitNewProject(NewProjIdList(0), nProdId, sProdDir) ' copio file progetto Dim sProjPath As String = String.Empty Dim sProdPath As String = sProdDir & "\" & nProdId.ToString("0000") & ".nge" If EgtGetCurrFilePath(sProjPath) AndAlso Not String.IsNullOrEmpty(sProjPath) Then Try File.Copy(sProjPath, sProdPath) 'Map.refSceneHostVM.MainController.OpenProject(sProdPath) bOk = True Catch ex As Exception EgtOutLog("Impossibile copiare il file") bOk = False End Try End If If bOk Then ' aggiungo altri proj a prod For Each nProjId In NewProjIdList DbControllers.m_ProdController.AddProj(nProdId, nProjId) Next Else ' elimino da DB DbControllers.m_ProdController.DeleteProd(nProdId) End If ' salvo il progetto PROD Map.refSceneHostVM.SaveProject() 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(nProdId, MyMachGroupList) ' resetto lock DbControllers.m_ProdController.LockByProdId(nProdId, False) End If DbControllers.m_ProdController.ResetController() End If ' imposto progetto corrente If NewProjIdList.Count > 0 Then SetCurrProj(NewProjIdList(0)) ' costruisco BTLStructure del proj Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(NewProjIdList(0))) ' mostro tutti i pezzi Map.refShowBeamPanelVM.ShowAll() EgtZoom(ZM.ALL, True) ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() End Sub #End Region ' ImportProject #Region "GoToProd" ''' ''' Returns a command that do GoToProd. ''' Public ReadOnly Property GoToProd_Command As ICommand Get If m_cmdGoToProd Is Nothing Then m_cmdGoToProd = New Command(AddressOf GoToProd) End If Return m_cmdGoToProd End Get End Property ''' ''' Execute the GoToProd. This method is invoked by the GoToProd_Command. ''' Public Sub GoToProd(ByVal param As Object) If IsNothing(Map.refProjManagerVM.CurrProj) Then Return ' verifico se progetto modificato, e chiedo se salvare Dim bSaved As Boolean = True If Map.refProjManagerVM.CurrProj.bIsNew Or EgtGetModified() OrElse Map.refCALCPanelVM.IsMachineModified() Then Select Case MessageBox.Show(EgtMsg(61877), "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) Case MessageBoxResult.Yes Save() Case MessageBoxResult.Cancel Return Case Else ' No If Map.refProjManagerVM.CurrProj.bIsNew Then MessageBox.Show(EgtMsg(61878), "", MessageBoxButton.OK, MessageBoxImage.Exclamation) Return End If ' resetto stato modificato Map.refSceneHostVM.MainController.ResetModified() bSaved = False End Select End If Dim nProdId As Integer = Map.refProjManagerVM.CurrProj.nProdId If nProdId > 0 Then Map.refProdManagerVM.SetCurrProd(nProdId) Map.refProdManagerVM.CurrProd.SetReloadProject(Not bSaved) Else ' chiedo se aggiungere ad ottimizzazione già presente o creare nuova Select Case MessageBox.Show("Aggiungere ad ottimizzazione già esistente?", "", MessageBoxButton.YesNoCancel, MessageBoxImage.Information) Case MessageBoxResult.No 'creo nuova ottimizzazione da progetto corrente NewProdFromProj() Case MessageBoxResult.Yes ' chiedo in quale ottimizzazione aggiungere il progetto corrente Dim OpenProjectFileDialogVM As New OpenProjectFileDialogVM Dim ChooseProdFileDialog As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM) Dim DialogResult As Boolean? = ChooseProdFileDialog.EgtShowDialog(ProjectType.PROD, True) If IsNothing(DialogResult) OrElse Not DialogResult Then Return ' se prod selezionato If Not IsNothing(OpenProjectFileDialogVM.SelProject.nProdId) AndAlso OpenProjectFileDialogVM.SelProject.nProdId > 0 Then Dim nCurrCtx As Integer = EgtGetCurrentContext() Dim nTempCtx As Integer = EgtInitContext() Dim bOk As Boolean = nTempCtx <> 0 If bOk Then ' inizializzo gestore lavorazioni bOk = EgtInitMachMgr(Map.refMainWindowVM.MainWindowM.sMachinesRoot, Map.refMainWindowVM.MainWindowM.sToolMakersDir) ' apro il prod bOk = bOk AndAlso EgtOpenFile(OpenProjectFileDialogVM.SelProject.sProdPath) '''' calcolo BBox globale '''Dim b3Parts As BBox3d '''Dim nProdPartId As Integer = EgtGetFirstPart() '''While nProdPartId <> GDB_ID.NULL ''' Dim b3Part As New BBox3d ''' EgtGetBBoxGlob(nProdPartId, 1, b3Part) ''' b3Parts.Add(b3Part) ''' nProdPartId = EgtGetNextPart(nProdPartId) '''End While ' inserisco proj nel prod selezionato bOk = bOk AndAlso EgtInsertFile(Map.refProjManagerVM.CurrProj.sProjPath) ' DA METTERE IN MERGE BTL, NON QUI!!! '''' deseleziono tutto '''EgtDeselectAll() '''' ciclo sui pezzi '''Dim nPartId As Integer = EgtGetFirstPart() '''While nPartId <> GDB_ID.NULL ''' ' se arrivano dal nuovo progetto ''' Dim nCurrProjId As Integer ''' EgtGetInfo(nPartId, PROJ, nCurrProjId) ''' If nCurrProjId = Map.refProjManagerVM.CurrProj.nProjId Then ''' ' sposto i pezzi per non averli sovrapposti ''' EgtMove(nCurrProjId, New Vector3d(0, b3Parts.DimY() + 500, 0)) ''' End If '''End While bOk = bOk AndAlso EgtSaveFile(OpenProjectFileDialogVM.SelProject.sProdPath, NGE.CMPTEXT) ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) End If If bOk Then ' riporto aggiunta proj a prod su Db DbControllers.m_ProdController.AddProj(OpenProjectFileDialogVM.SelProject.nProdId, Map.refProjManagerVM.CurrProj.nProjId) ' imposto currprod Map.refProdManagerVM.SetCurrProd(OpenProjectFileDialogVM.SelProject.nProdId) End If End If Case MessageBoxResult.Cancel Return End Select End If ' vado in pagina prod Map.refMainMenuVM.SetSelPage(Pages.MACHINING, False) ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() End Sub #End Region ' GoToProd #End Region ' Commands End Class