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" ' Nome file NGE con i pezzi selezionati per effettuare UpdateBTL Friend Const UPDATEBTL_NGE As String = "UpdateBTL.nge" Private m_ProjManager_IsEnabled As Boolean = True Public ReadOnly Property ProjManager_IsEnabled As Boolean Get Return m_ProjManager_IsEnabled End Get End Property Friend Property CurrProj As ProjFileVM Get Return ProjectManagerVM.CurrProj End Get Set(value As ProjFileVM) ProjectManagerVM.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(NameOf(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 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 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) If IsNothing(PjFileM) Then m_MruFiles.Remove(FileName) Else IdAndBTLFileNames.Add(sPjId & " | " & PjFileM.sBTLFileName) End If Next Return IdAndBTLFileNames End Get End Property Private m_UpdateBTL_Visibility As Visibility = Visibility.Collapsed Public Property UpdateBTL_Visibility As Visibility Get Return m_UpdateBTL_Visibility End Get Set(value As Visibility) m_UpdateBTL_Visibility = value End Set End Property Public ReadOnly Property GoToProd_Visibility As Visibility Get Return If(Map.refMainMenuVM.SelPage = Pages.ONLYPRODPAGE, Visibility.Collapsed, Visibility.Visible) 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_cmdUpdateBTL 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(30501) End Get End Property Public ReadOnly Property OpenToolTip As String Get Return EgtMsg(30502) End Get End Property Public ReadOnly Property SaveToolTip As String Get Return EgtMsg(30503) End Get End Property Public ReadOnly Property SaveAsToolTip As String Get Return EgtMsg(30504) End Get End Property Public ReadOnly Property InsertToolTip As String Get Return EgtMsg(30505) 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) ' leggo attivazione update btl If GetMainPrivateProfileInt(S_GENERAL, K_UPDATEBTL, 0) > 0 Then UpdateBTL_Visibility = Visibility.Visible End If 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(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) 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 = ProjectManagerVM.CurrProd ' setto flag nuovo progetto in prod ProjectManagerVM.CurrProd.bIsNew = True Else ' elimino da DB DbControllers.m_ProdController.DeleteProd(nProdId, True) End If End Sub Private Function InitNewProject(ByRef nProjId As Integer, ByRef sProjectDir As String, nType As BWType, Machine As Machine) As Boolean ' se non ho ricevuto numero progetto da sovrascrivere If nProjId = 0 Then ' richiedo indice nuovo progetto nProjId = DbControllers.m_ProjController.GetNextIndex(Map.refMainWindowVM.MainWindowM.GetKeyNumber()) End If ' 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) Return DbControllers.m_ProjController.Update(New ProjModel() With {.ProjId = nProjId, .DtExported = dtExportDate, .ListName = sListName}) End Function ''' ''' Aggiornamento descrizione del PROJ con nuova colonna ''' ''' ''' ''' Private Function UpdateDescription(nProjId As Integer, Description As String) Return DbControllers.m_ProjController.UpdateDescription(nProjId, Description) End Function Public Function SetCurrProj(nProjId As Integer) As Boolean Return ProjectManagerVM.SetCurrProj(nProjId) 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 Private Sub ReloadBTLStructure() Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(ProjectManagerVM.CurrProj.nProjId)) ' verifico se volume pezzi calcolato Dim bIsCalculated As Boolean = False For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList If BTLPart.BTLPartM.dVolume > 0 Then Continue For bIsCalculated = True BTLPart.CalcBTLPartVolume() Next If bIsCalculated Then Dim CurrProject As String = "" EgtGetCurrFilePath(CurrProject) EgtSaveFile(CurrProject, NGE.CMPTEXT) End If 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 AndAlso 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 ProjectManagerVM.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) Core.ViewPanelVM.UpdateBWType(nType) Map.refPartManagerVM.LockVisibilityUpdate() ' imposto flag secondo tipo di progetto (travi o pareti) Dim sBTLFlag As String = If(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) DbControllers.m_ProjController.UpdateInfo(nProjId, "Hand made", "Hand made", "", Date.MinValue, nType, Map.refMachinePanelVM.SelectedMachine.Name) SetCurrProj(nProjId) End If Map.refProjectVM.SetOptimizePanel_Visibility(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO)) 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(ReceivedCurrProj As ProjFileVM) Dim bStart As Boolean = IsNothing(m_TempCurrProj) m_TempCurrProj = ReceivedCurrProj ' se la stringa è vuota If IsNothing(TempCurrProj) Then If GetMainPrivateProfileInt(S_GENERAL, K_PROJECTMODE, 0) = 1 Then Dim OpenProdFileDialogVM As NewOpenProjectFileDialogVM = Nothing ' apro dialogo di scelta Prod OpenProdFileDialogVM = New NewOpenProjectFileDialogVM Dim OpenFile As New NewOpenProjectFileDialogV(Application.Current.MainWindow, OpenProdFileDialogVM) Dim DialogResult As Boolean? = OpenFile.EgtShowDialog(ProjectType.PROJ) If IsNothing(DialogResult) OrElse Not DialogResult Then Return Dim TempProd As ProdItem = OpenProdFileDialogVM.SelProject If TempProd.ProjFileList.Count > 1 Then ' apro dialogo di scelta Proj Dim OpenProjFileDialogVM As OpenProjectFileDialogVM = Nothing OpenProjFileDialogVM = New OpenProjectFileDialogVM Dim ProjOpenFile As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjFileDialogVM) Dim ProjDialogResult As Boolean? = ProjOpenFile.EgtShowDialog(ProjectType.PROJ, OpenProdFileDialogVM.SelProject.ProjFileList) If IsNothing(DialogResult) OrElse Not ProjDialogResult Then Return TempCurrProj = OpenProjFileDialogVM.SelProject ElseIf TempProd.ProjFileList.Count = 1 Then TempCurrProj = OpenProdFileDialogVM.SelProject.ProjFileList(0) Else Return End If Else Dim OpenProjectFileDialogVM As OpenProjectFileDialogVM = Nothing ' 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 End If LoadingWndHelper.OpenLoadingWnd(ActiveIds.OPENPROJ, 3, EgtMsg(63000), EgtMsg(63001), 50) ' Project opening ' Loading project geometries ' imposto ProjId di caricamento ProjectManagerVM.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) Core.ViewPanelVM.UpdateBWType(TempCurrProj.nType) ' imposto flag secondo tipo di progetto (travi o pareti) Dim sBTLFlag As String = If(TempCurrProj.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) ' 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.refProjManagerVM.TempCurrProj.sMachine)) Then ' rimuovo il file in apertura dalla lista degli MRU Dim ProjId As Integer = ProjectManagerVM.nLoadingProjId Dim PjFileVM As ProjFileVM If Not IsNothing(ProjId) AndAlso ProjId <> 0 Then PjFileVM = New ProjFileVM(DbControllers.m_ProjController.FindByProjIdConv(ProjId)) If Not IsNothing(PjFileVM.ProjFileM) AndAlso Not IsNothing(PjFileVM.sProjPath) Then Map.refProjManagerVM.m_MruFiles.Remove(PjFileVM.sProjPath) End If MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error If bStart Then Map.refProjManagerVM.NewProject() Else If Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) Then Map.refProjectVM.SetOptimizePanel_Visibility(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO)) Map.refPartManagerVM.LockVisibilityUpdate() End If End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) LoadingWndHelper.CloseLoadingWnd(ActiveIds.OPENPROJ) 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 SaveCmd) End If Return m_cmdSave End Get End Property Public Sub SaveCmd() Save(True) End Sub ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub Save(Optional bShowLoading As Boolean = False) If IsNothing(CurrProj) Then Return Dim bShowBuilding As Boolean = False Dim bShowSolid As Boolean = False If bShowLoading Then LoadingWndHelper.OpenLoadingWnd(ActiveIds.SAVEPROJ, 1, EgtMsg(63007), "", 100) ' Project saving ' se vista tutti i pezzi Configuration.ShowAllPieces(bShowBuilding, bShowSolid, True, False) ' imposto ProjId di caricamento ProjectManagerVM.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 CurrProj.bIsNew Then ' resetto stato new DbControllers.m_ProjController.ResetNew(CurrProj.nProjId) 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(GDB_ID.NULL, True, False) ' verifico se Reset Macchina modificato e nel caso aggiorno DB e CurrProj If Map.refCALCPanelVM.IsMachineModified() Then DbControllers.m_ProjController.UpdateMachine(ProjectManagerVM.CurrProj.nProjId, Map.refCALCPanelVM.SelectedMachine.Name) ProjectManagerVM.CurrProj.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) ' se esiste un Prod associato al Proj corrente aggiorno anche questo Prod nel DB If ProjectManagerVM.CurrProj.nProdId > 0 Then DbControllers.m_ProdController.UpdateMachine(ProjectManagerVM.CurrProj.nProdId, Map.refCALCPanelVM.SelectedMachine.Name) Map.refCALCPanelVM.ResetMachineModified() End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) If bShowLoading Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.SAVEPROJ) 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", .InitialDirectory = If(Directory.Exists(sDir), sDir, ""), .CheckFileExists = True, .ValidateNames = True} If BTLDlg.ShowDialog() Then sFile = BTLDlg.FileName Else Return End If End If Dim nProjId As Integer = 0 Dim sProjDir As String = "" ' verifico se non e' tra i BTL gia' importati Dim sBTLFileName As String = Path.GetFileNameWithoutExtension(sFile) Dim nAlreadyImported As Integer = DbControllers.m_ProjController.AlreadyImported(sBTLFileName) If nAlreadyImported > 0 Then ' recupero progetto con lo stesso nome Dim ToDeleteProj As ProjFileM = DbControllers.m_ProjController.FindByProjIdConv(nAlreadyImported) ' se esiste gia' un'ottimizzazione If ToDeleteProj.nProdId > 0 Then Select Case MessageBox.Show(EgtMsg(61942), "Information", MessageBoxButton.YesNo, MessageBoxImage.Information) ' BTL file already imported and optimized. Do you want to import it again? Case MessageBoxResult.Yes ' lo importo, quindi non devo fare nulla Case MessageBoxResult.No Return End Select Else ' se non ha ottimizazione, chiedo se sovrascriverlo Select Case MessageBox.Show(EgtMsg(61943), "Information", MessageBoxButton.YesNoCancel, MessageBoxImage.Information) ' BTL file already imported. Do you want to overwrite it? Case MessageBoxResult.Yes ' cancello BTLParts su DB DbControllers.m_ProjController.UpdateBtlParts(nAlreadyImported, New List(Of BTLPartM)) ' cancello nome BTL DbControllers.m_ProjController.UpdateInfo(nAlreadyImported, DateTime.Now.ToString(), DateTime.Now.ToString(), "", DateTime.MinValue, BWType.NULL, "") nProjId = nAlreadyImported sProjDir = refMainWindowVM.MainWindowM.sProjsDir & "\" & nProjId.ToString("0000") Case MessageBoxResult.No ' lo importo, quindi non devo fare nulla Case MessageBoxResult.Cancel Return End Select End If End If ' se si ha una sola macchina disponibile (non BOTH) setto il progetto 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 AndAlso 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 LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file ' inizializzo nuovo progetto InitNewProject(nProjId, sProjDir, nType, Machine) SetCurrProj(nProjId) ' imposto il tipo di parametri Q da utilizzare BTLIniFile.m_nBTLBWType = nType ' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel Map.refCALCPanelVM.LoadMachineList() ' imposto ProjId di caricamento ProjectManagerVM.nLoadingProjId = nProjId ' copio file BTL Dim sBtlCopyPath As String = sProjDir & "\" & Path.GetFileName(sFile) Dim bOk = False Try File.Copy(sFile, sBtlCopyPath, True) bOk = True Catch ex As Exception EgtOutLog("Impossibile copiare il file") bOk = False End Try ' disattivo temporaneamente bottone assemblato per non prendere il riferimento sbagliato durante importazione Dim bAssembly As Boolean = Map.refShowBeamPanelVM.ShowBuilding_IsChecked Map.refShowBeamPanelVM.ShowBuilding_IsChecked = False ' importo file If bOk Then bOk = Map.refSceneHostVM.MainController.ImportProject(sBtlCopyPath, False) End If Dim sProjFileName As String = sProjDir & "\" & nProjId.ToString("0000") & ".nge" Dim bFirstPart As Boolean = EgtGetFirstPart() <> GDB_ID.NULL If bOk OrElse bFirstPart Then ' salvo path di importazione WriteMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, Path.GetDirectoryName(sFile)) ' salvo il progetto bOk = EgtSaveFile(sProjFileName, NGE.CMPTEXT) SectionXMaterial.SetType(nType) Core.ViewPanelVM.UpdateBWType(nType) ' imposto flag secondo tipo di progetto (travi o pareti) Dim sBTLFlag As String = If(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 EgtOutLog("Errore nell'importazione BTL") End If If bOk Then ' aggiorno Db 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, sBTLFileName, Map.refProjectVM.BTLStructureVM.sLISTNAME, ExportDate, nType, Map.refMachinePanelVM.SelectedMachine.Name) SetCurrProj(nProjId) ' se progetto pareti e vista ruotata If nType = BWType.WALL AndAlso (CurrentMachine.ViewDir = VT.ISO_NW OrElse CurrentMachine.ViewDir = VT.ISO_NE) Then ' ruoto le pareti di 180 per raddrizzarle rispetto alla vista For Each Wall In Map.refProjectVM.BTLStructureVM.BTLPartVMList Wall.Rotation(True, Map.refProjectVM.BTLStructureVM.nPROJTYPE, True, 180, False) Next End If ' calcolo volumi pezzi For Each Part In Map.refProjectVM.BTLStructureVM.BTLPartVMList Part.CalcBTLPartVolume() Next Map.refProjectVM.SetOptimizePanel_Visibility(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO)) Map.refPartManagerVM.LockVisibilityUpdate() LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63006), 70, 100) ' Loading graphics Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly ' mostro tutti i pezzi Map.refShowBeamPanelVM.ShowAll(True) Else Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly ' elimino da Db ' CheckMe impostata come cancellazione FISICA dal DB... DbControllers.m_ProjController.DeleteProj(nProjId, False) End If ' carico filtri di ricerca Map.refProjectVM.BTLStructureVM.LoadFilters() ' gestisco log di importazione ManageImportLog(nProjId, sProjDir) ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL) End Sub Private Sub ManageImportLog(nProjId As Integer, sProjDir As String) Dim LogFile As New List(Of String) Using FileStream As New FileStream(Map.refMainWindowVM.MainWindowM.sLogFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) Dim StreamReader As New StreamReader(FileStream) Dim Line As String = StreamReader.ReadLine() While Not StreamReader.EndOfStream Line = StreamReader.ReadLine() LogFile.Add(Line) End While StreamReader.Close() End Using If LogFile.Count > 0 Then ' recupero ultima occorrenza di import Dim sLastImport As String = LogFile.LastOrDefault(Function(x) x.Contains("ImportBtl")) ' verifico linee successive Dim nLastImportIndex As Integer = -1 If Not String.IsNullOrWhiteSpace(sLastImport) Then nLastImportIndex = LogFile.IndexOf(sLastImport) End If Dim sImportMessage As String = sLastImport & Environment.NewLine Dim sImportLog As New List(Of String)({sLastImport}) If nLastImportIndex > 0 Then Dim bGlobalError As Boolean = False ' ciclo sulle righe successive For Index = nLastImportIndex + 1 To LogFile.Count - 1 Dim sLogLine As String = LogFile(Index).Trim() ' verifico se fanno parte dell'import Dim bStartWithError As Boolean = sLogLine.StartsWith("Error") Dim bStartWithInfo As Boolean = sLogLine.StartsWith("Info") If Not bStartWithError And Not bStartWithInfo Then Exit For If bStartWithError Then If Not bGlobalError Then bGlobalError = True sImportMessage &= sLogLine & Environment.NewLine End If sImportLog.Add(sLogLine) Next ' salvo file ImportLog nel progetto Try File.WriteAllLines(sProjDir & "\" & nProjId.ToString("0000") & "-ImportLog.txt", sImportLog) Catch ex As Exception ' End Try ' se almeno un errore, mostro log If bGlobalError Then MessageBox.Show(Application.Current.MainWindow, sImportMessage, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If End If End If End Sub #End Region ' ImportBTL #Region "UpdateBTL" ''' ''' Returns a command that do UpdateBTL. ''' Public ReadOnly Property UpdateBTL_Command As ICommand Get If m_cmdUpdateBTL Is Nothing Then m_cmdUpdateBTL = New Command(AddressOf UpdateBTL) End If Return m_cmdUpdateBTL End Get End Property ''' ''' Execute the UpdateBTL. This method is invoked by the UpdateBTLCommand. ''' Public Sub UpdateBTL(Optional sFile As String = "", Optional bWithDlg As Boolean = True) If IsNothing(CurrProj) Then Return ' verifico se progetto modificato, e chiedo se salvare If 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 MessageBox.Show(EgtMsg(61892), "", MessageBoxButton.OK, MessageBoxImage.Exclamation) Return End Select End If ' se vista tutti i pezzi Dim bShowBuilding As Boolean = False Dim bShowSolid As Boolean = False Dim nSelPartId As Integer = GDB_ID.NULL Configuration.ShowAllPieces(bShowBuilding, bShowSolid, nSelPartId, True) Dim sDir As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, "", 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", .InitialDirectory = If(Directory.Exists(sDir), sDir, ""), .CheckFileExists = True, .ValidateNames = True} If BTLDlg.ShowDialog() Then sFile = BTLDlg.FileName Else ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then ' SelPart.IsSelected = True If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If End If ' salvo lista pezzi del progetto originale Dim OrigPartlist As ObservableCollection(Of BTLPartVM) = Map.refProjectVM.BTLStructureVM.BTLPartVMList ' creo un nuovo contesto su cui aprire il file BTL Dim nCurrCtx As Integer = EgtGetCurrentContext() Dim nTempCtx As Integer = EgtInitContext() ' setto il flag per inizializzazione gestore travi e pareti per importare progetto Dim nFlag As Integer Dim sBTLFlag As String If Map.refProjManagerVM.nProjType = Core.ConstBeam.BWType.BEAM Then sBTLFlag = K_BTLFLAG Else sBTLFlag = K_WALLBTLFLAG End If nFlag = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR) ' inizializzo gestore travi e pareti EgtInitBeamMgr(nFlag) Dim bOk As Boolean = nTempCtx <> 0 If bOk Then ' importo il file BTL bOk = bOk AndAlso Map.refSceneHostVM.MainController.ImportProject(sFile, False) ' carico la lista dei Part importati e rimuovo i parametri generali del BTL Dim AsseBaseId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) Dim BtlInfoId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO) Dim PartToUpdateList As New List(Of BTLPartToUpdate) ' cerco tra i layer BTLInfo While BtlInfoId <> GDB_ID.NULL ' verifico se il layer appartiene al ProjId Dim nBTLInfoLayerProjId As Integer EgtGetInfo(BtlInfoId, BTL_PRT_PROJ, nBTLInfoLayerProjId) ' carico la lista con i PDN dei pezzi del BTL importato Dim nPDN As Integer = 0 Dim sNAM As String = String.Empty Dim nUID As Integer = 0 Dim nPartId As Integer = EgtGetFirstPart() While nPartId <> GDB_ID.NULL Dim UIDList As New List(Of Integer) Dim nIndUID As Integer = 1 ' se devo filtrare un progetto If nBTLInfoLayerProjId > 0 Then ' verifico se il pezzo appartiene al ProjId Dim nPartProjId As Integer EgtGetInfo(nPartId, BTL_PRT_PROJ, nPartProjId) If nPartProjId = nBTLInfoLayerProjId Then EgtGetInfo(nPartId, BTL_PRT_PDN, nPDN) EgtGetInfo(nPartId, BTL_PRT_NAM, sNAM) While EgtGetInfo(nPartId, BTL_PRT_UID & nIndUID, nUID) UIDList.Add(nUID) nIndUID += 1 End While PartToUpdateList.Add(New BTLPartToUpdate(nPartId, nPDN, sNAM, UIDList, OrigPartlist.Any(Function(x) x.nPDN = nPDN))) End If Else ' altrimenti carico tutti EgtGetInfo(nPartId, BTL_PRT_PDN, nPDN) EgtGetInfo(nPartId, BTL_PRT_NAM, sNAM) While EgtGetInfo(nPartId, BTL_PRT_UID & nUID, nUID) UIDList.Add(nUID) nIndUID += 1 End While PartToUpdateList.Add(New BTLPartToUpdate(nPartId, nPDN, sNAM, UIDList, OrigPartlist.Any(Function(x) x.nPDN = nPDN))) End If nPartId = EgtGetNextPart(nPartId) End While EgtErase(BtlInfoId) BtlInfoId = EgtGetNextName(BtlInfoId, BTLINFO) End While ' costruisco un dizionario con gli id dei sottonodi di AsseBase del BTL importato e il valore dell'Info N degli stessi Dim AsseBaseSubNodeDict As New Dictionary(Of Integer, Integer) Dim nAsseBaseSubNodeId As Integer = EgtGetFirstInGroup(AsseBaseId) Dim sAsseBaseUID As String = String.Empty Dim nAsseBaseUID As Integer = 0 While nAsseBaseSubNodeId <> GDB_ID.NULL If EgtGetInfo(nAsseBaseSubNodeId, BTL_ASSEBASE_N, sAsseBaseUID) Then sAsseBaseUID = sAsseBaseUID.Remove(0, 4) Integer.TryParse(sAsseBaseUID, nAsseBaseUID) AsseBaseSubNodeDict.Add(nAsseBaseSubNodeId, sAsseBaseUID) End If nAsseBaseSubNodeId = EgtGetNext(nAsseBaseSubNodeId) End While ' salvo il file BTL da cui abbiamo rimosso BtlInfo come file NGE EgtSaveFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE, NGE.CMPTEXT) Dim bAppend As Boolean = False ' se UserLevel > 5 e fra i Part importati ce ne sta almeno 1 con PDN uguale ai Part già presenti ' apro la finestra per chiedere se si vuole aggiornare o accodare If Map.refMainWindowVM.MainWindowM.nUserLevel > 5 Then For Each PartToUpdate In PartToUpdateList Dim bExitFor As Boolean = False For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLStructureM.BTLPartMList If PartToUpdate.nPDN = BTLPart.nPDN Then Dim UpdateOrAppendWndVM As New UpdateOrAppendWndVM() Dim UpdateOrAppendWnd As New UpdateOrAppendWndV(Application.Current.MainWindow, UpdateOrAppendWndVM) If Not UpdateOrAppendWnd.ShowDialog() Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL ReloadBTLStructure() ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then 'SelPart.IsSelected = True If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If ' salvo lo stato del bottone per accodare bAppend = UpdateOrAppendWndVM.AppendIsChecked bExitFor = True Exit For End If Next If bExitFor Then Exit For Next End If ' se selezionato Append li accodo tutti If bAppend Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL del progetto corrente per non avere quella del contesto temporaneo ancora presente ReloadBTLStructure() ' salvo gli id degli AsseBase presenti nel progetto corrente Dim AsseBaseIdList As New List(Of Integer) AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL AsseBaseIdList.Add(AsseBaseId) AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) End While ' calcolo BBox globale del progetto iniziale Dim b3Parts As New BBox3d Dim nProjPartId As Integer = EgtGetFirstPart() Dim nLastProjPartId As Integer = 0 While nProjPartId <> GDB_ID.NULL Dim b3Part As New BBox3d EgtGetBBoxGlob(nProjPartId, GDB_BB.ONLY_VISIBLE, b3Part) b3Parts.Add(b3Part) nLastProjPartId = nProjPartId nProjPartId = EgtGetNextPart(nProjPartId) End While ' inserisco il file importato nel progetto corrente bOk = bOk AndAlso EgtInsertFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE) ' deseleziono tutto EgtDeselectAll() ' ciclo sui pezzi aggiunti Dim nAddedPartId As Integer = EgtGetNextPart(nLastProjPartId) Dim bFirstLoop As Boolean = True Dim LastPartMaxY As Double Dim nIncrPDN As Integer = 0 While nAddedPartId <> GDB_ID.NULL ' incremento il PDN del Part aggiunto rispetto al PDN maggiore attualmente presente EgtSetInfo(nAddedPartId, BTL_PRT_PDN, Map.refProjectVM.BTLStructureVM.BTLStructureM.NewPDN() + nIncrPDN) ' recupero layer del box Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nAddedPartId, "Box") ' recupero box del layer box Dim b3Box As New BBox3d EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box) ' ricaviamo il box globale del part appena aggiunto Dim b3Part As New BBox3d EgtGetBBoxGlob(nAddedPartId, 1, b3Part) ' sposto il pezzo per distanziarlo dall'ultimo di un offset pari a 500 bOk = bOk AndAlso EgtMove(nAddedPartId, New Vector3d(0, If(bFirstLoop, b3Parts.Max.y, LastPartMaxY - b3Part.Min.y) + 500, 0)) bFirstLoop = False ' ricaviamo il box globale del part appena spostato, salviamo la sua Y massima e lo aggiungiamo al box globale di tutti i part EgtGetBBoxGlob(nAddedPartId, 1, b3Part) LastPartMaxY = b3Part.Max.y b3Parts.Add(b3Part) nAddedPartId = EgtGetNextPart(nAddedPartId) nIncrPDN += 1 End While ' aggiungo i part inseriti alla lista Dim nNewPartId As Integer = EgtGetNextPart(nLastProjPartId) While nNewPartId <> GDB_ID.NULL ' aggiungo dati pezzo Dim NewPart As BTLPartM = BTLPartM.CreateBTLPart(nNewPartId) ' aggiungo pezzo alla lista Map.refProjectVM.BTLStructureVM.BTLStructureM.AddBTLPart(NewPart) Dim AddedBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(AddedBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(AddedBTLPart.Section) End If nNewPartId = EgtGetNextPart(nNewPartId) End While ' elimino gli AsseBase del progetto importato AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL Dim CurrAsseBaseId = AsseBaseId AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) If Not AsseBaseIdList.Contains(CurrAsseBaseId) Then EgtErase(CurrAsseBaseId) End While WriteMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, Path.GetDirectoryName(sFile)) Else ' altrimenti apro la finestra con l'elenco dei Part da checkare per l'inserimento nel progetto (unica strada se UserLevel <= 5), ' che prevederà la sovrascrittura di quelli già presenti e l'aggiunta di quelli nuovi Dim UpdateBTLWndVM As New UpdateBTLWndVM(PartToUpdateList) Dim UpdateBTLWnd As New UpdateBTLWndV(Application.Current.MainWindow, UpdateBTLWndVM) If Not UpdateBTLWnd.ShowDialog() Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL ReloadBTLStructure() ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then 'SelPart.IsSelected = True If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If If UpdateBTLWndVM.BTLPartList.Count > 0 Then ' sovrascrivo i Part nel progetto aperto con i Part checkati nella lista Dim BTLPartToOverwriteWithList As New ObservableCollection(Of BTLPartToUpdate) ' Elimino dal TempCtx i Part non checkati For Each BTLPartToOverwriteWith In UpdateBTLWndVM.BTLPartList If BTLPartToOverwriteWith.bInsert Then BTLPartToOverwriteWithList.Add(BTLPartToOverwriteWith) Else ' elimino pezzo copia Dim nCurrPartId = EgtGetCurrPart() EgtErase(BTLPartToOverwriteWith.nPartId) nCurrPartId = EgtGetCurrPart() End If Next ' costruisco un nuovo dizionario dei sottonodi di AsseBase contenente solo quelli corrispondenti agli UID contenuti ' nei soli Part checkati del BTL nella finestra UpdateBTLWnd Dim NewAsseBaseSubNodeDict As New Dictionary(Of Integer, Integer) For Each AsseBaseSubNodeItem In AsseBaseSubNodeDict For Each BTLPartToOverwriteWithItem In BTLPartToOverwriteWithList Dim bExitFor As Boolean = False For Each UIDItem In BTLPartToOverwriteWithItem.UIDList If AsseBaseSubNodeItem.Value = UIDItem Then NewAsseBaseSubNodeDict.Add(AsseBaseSubNodeItem.Key, AsseBaseSubNodeItem.Value) bExitFor = True Exit For End If Next If bExitFor Then Exit For Next Next ' confronto la lista appena costruita con quella originale ed elimino dal contesto i sottonodi con i valori non più presenti For Each AsseBaseSubNodeItem In AsseBaseSubNodeDict If Not NewAsseBaseSubNodeDict.ContainsValue(AsseBaseSubNodeItem.Value) Then EgtErase(AsseBaseSubNodeItem.Key) End If Next ' salvo il file NGE inserito a cui abbiamo rimosso i Part non checkati e gli AsseBase non più associati EgtSaveFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE, NGE.CMPTEXT) ' torno sul contesto corrente EgtDeleteContext(nTempCtx) EgtSetCurrentContext(nCurrCtx) ' rileggo la struttura BTL del progetto corrente per non avere quella del contesto temporaneo ancora presente ReloadBTLStructure() ' elimino i pezzi da sovrascrivere nel progetto corrente Configuration.DeletePieces(UpdateBTLWndVM.BTLPartList) ' salvo gli id degli AsseBase presenti nel progetto corrente Dim AsseBaseIdList As New List(Of Integer) AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL AsseBaseIdList.Add(AsseBaseId) ' elimino i sottonodi di AsseBase da sovrascrivere AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) nAsseBaseSubNodeId = EgtGetFirstInGroup(AsseBaseId) While nAsseBaseSubNodeId <> GDB_ID.NULL If NewAsseBaseSubNodeDict.ContainsKey(nAsseBaseSubNodeId) Then ' se sottonodo da cancellare salvo il suo id e ricavo il seguente prima di cancellarlo Dim nCurrAsseBaseSubNodeId = nAsseBaseSubNodeId nAsseBaseSubNodeId = EgtGetNext(nCurrAsseBaseSubNodeId) bOk = EgtErase(nCurrAsseBaseSubNodeId) Else ' altrimenti ricavo il seguente e basta nAsseBaseSubNodeId = EgtGetNext(nAsseBaseSubNodeId) End If End While AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) End While ' calcolo BBox globale del progetto corrente Dim b3Parts As New BBox3d Dim nProjPartId As Integer = EgtGetFirstPart() Dim nLastProjPartId As Integer = GDB_ID.NULL While nProjPartId <> GDB_ID.NULL Dim b3Part As New BBox3d If EgtGetBBoxGlob(nProjPartId, GDB_BB.ONLY_VISIBLE, b3Part) Then b3Parts.Add(b3Part) End If nLastProjPartId = nProjPartId nProjPartId = EgtGetNextPart(nProjPartId) End While ' se sovrascrivo tutti e bbox esce nullo If b3Parts.IsEmpty Then b3Parts = New BBox3d(Point3d.ORIG) End If ' inserisco il file NGE (ricavato dal BTL importato) nel progetto corrente bOk = bOk AndAlso EgtInsertFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE) ' ciclo su tutti gli AsseBase del progetto corrente Dim nAsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While nAsseBaseId <> GDB_ID.NULL Dim nAsseBaseProjId As Integer Dim nAsseBaseToEraseId As Integer = 0 EgtGetInfo(nAsseBaseId, BTL_PRT_PROJ, nAsseBaseProjId) ' se AsseBase di questo step del ciclo è nuovo e suo ProjId uguale a quello del progetto corrente If Not AsseBaseIdList.Contains(nAsseBaseId) AndAlso nAsseBaseProjId = ProjectManagerVM.CurrProj.nProjId Then ' riloco i sottonodi del nuovo AsseBase nell'AsseBase del progetto aperto col medesimo ProjId Dim AsseBaseSubNodeId As Integer = EgtGetFirstInGroup(nAsseBaseId) While AsseBaseSubNodeId <> GDB_ID.NULL ' ciclo su tutti gli AsseBase per trovare l'id di quello con ProjId uguale al progetto corrente Dim FindAsseBaseId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While FindAsseBaseId <> GDB_ID.NULL Dim SameAsseBaseProjId As Integer EgtGetInfo(FindAsseBaseId, BTL_PRT_PROJ, SameAsseBaseProjId) ' se l'ho trovato esco dal While (FindAsseBaseId è l'id dell'AsseBase in cui vogliamo rilocare i sottonodi) If SameAsseBaseProjId = ProjectManagerVM.CurrProj.nProjId Then Exit While FindAsseBaseId = EgtGetNextName(FindAsseBaseId, ASSEBASE) End While ' salvo id dell'AsseBase corrente per ottenere il seguente prima di rilocarlo Dim CurrAsseBaseSubNodeId = AsseBaseSubNodeId AsseBaseSubNodeId = EgtGetNext(CurrAsseBaseSubNodeId) bOk = bOk AndAlso EgtRelocate(CurrAsseBaseSubNodeId, FindAsseBaseId, GDB_POS.LAST_SON) End While ' salvo id dell'AsseBase per cancellarlo nAsseBaseToEraseId = nAsseBaseId End If ' ricavo id del prossimo AsseBase nAsseBaseId = EgtGetNextName(nAsseBaseId, ASSEBASE) ' se salvato id dell'AsseBase per cancellarlo lo cancello If nAsseBaseToEraseId <> 0 Then bOk = bOk AndAlso EgtErase(nAsseBaseToEraseId) End While ' deseleziono tutto EgtDeselectAll() ' ciclo sui pezzi aggiunti Dim nAddedPartId As Integer = If(nLastProjPartId <> GDB_ID.NULL, EgtGetNextPart(nLastProjPartId), EgtGetFirstPart()) Dim LastPartMaxY As Double While nAddedPartId <> GDB_ID.NULL ' recupero layer del box Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nAddedPartId, "Box") ' recupero box del layer box Dim b3Box As New BBox3d EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box) ' ricaviamo il box globale del part appena aggiunto e ruotato Dim b3Part As New BBox3d EgtGetBBoxGlob(nAddedPartId, 1, b3Part) ' salviamo la Y massima del box globale di tutti i part LastPartMaxY = b3Parts.Max.y ' sposto il pezzo per distanziarlo dall'ultimo di un offset pari a 500 bOk = bOk AndAlso EgtMove(nAddedPartId, New Vector3d(0, LastPartMaxY - b3Part.Min.y + 500, 0)) ' ricaviamo il box globale del part appena spostato e lo aggiungiamo al box globale di tutti i part EgtGetBBoxGlob(nAddedPartId, 1, b3Part) b3Parts.Add(b3Part) ' aggiungo dati pezzo Dim NewPart As BTLPartM = BTLPartM.CreateBTLPart(nAddedPartId) ' aggiungo pezzo alla lista Map.refProjectVM.BTLStructureVM.BTLStructureM.AddBTLPart(NewPart) Dim AddedBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) ' se progetto pareti e vista ruotata If nType = BWType.WALL AndAlso (CurrentMachine.ViewDir = VT.ISO_NW OrElse CurrentMachine.ViewDir = VT.ISO_NE) Then ' ruoto le pareti di 180 per raddrizzarle rispetto alla vista AddedBTLPart.Rotation(True, Map.refProjectVM.BTLStructureVM.nPROJTYPE, True, 180, False) End If ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(AddedBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(AddedBTLPart.Section) End If nAddedPartId = EgtGetNextPart(nAddedPartId) End While WriteMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, Path.GetDirectoryName(sFile)) End If End If ' copio il file originale scelto nel dialog per l'Update nella cartella Proj del progetto corrente If File.Exists(sFile) Then Dim sDestPath As String = ProjectManagerVM.CurrProj.sProjDirPath & "\" & Path.GetFileNameWithoutExtension(sFile) While File.Exists(sDestPath & ".btl") sDestPath = sDestPath & "_1" End While File.Copy(sFile, sDestPath & ".btl", False) End If End If ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then 'SelPart.IsSelected = True If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) End Sub #End Region ' UpdateBTL #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 Function ExportProject(Optional sExportFileName As String = Nothing) As String Select Case Map.refMainMenuVM.SelPage Case Pages.VIEW If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return Nothing If IsNothing(CurrProj) Then Return Nothing Case Pages.MACHINING If ProdFileVM.VerifyProjectModification(ProjectManagerVM.CurrProd) = MessageBoxResult.Cancel Then Return Nothing If IsNothing(ProjectManagerVM.CurrProd) Then Return Nothing Case Else Return Nothing End Select ' 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 IsNothing(sExportFileName) Then 'If ExportDlg.ShowDialog() <> True Then Return Nothing If ExportDlg.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then Return Nothing End If LoadingWndHelper.OpenLoadingWnd(ActiveIds.EXPORTPROJECT, 2, EgtMsg(63010), EgtMsg(63016), 30) ' Project exporting ' Adding export info ' se assemblato me lo segno e lo smonto Dim bShowBuilding As Boolean = False If Map.refMainMenuVM.SelPage = Pages.VIEW Then Configuration.ShowAllPieces(bShowBuilding) End If ' 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 ' aggiungo layer per info di export Dim nImpExpPartId As Integer = EgtCreateGroup(GDB_ID.ROOT) EgtSetName(nImpExpPartId, EXP_PART) ' ci scrivo nome macchina e tipo progetto EgtSetInfo(nImpExpPartId, EXP_MACHINE, CurrProj.sMachine) EgtSetInfo(nImpExpPartId, BTL_GEN_PROJTYPE, CurrProj.nType) LoadingWndHelper.UpdateLoadingWnd(ActiveIds.EXPORTPROJECT, 2, EgtMsg(63017), 30, 100) ' Exporting... ' salvo info inserite Map.refSceneHostVM.SaveProject() ' creo file zip Dim sZipToCreate As String = If(IsNothing(sExportFileName), ExportDlg.FileName, Map.refMainWindowVM.MainWindowM.sTempDir & "\" & sExportFileName & ".ngexp") 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("Error in export file creation!") End Try ' elimino layer di esportazione EgtErase(nImpExpPartId) ' salvo eliminazione info inserite Map.refSceneHostVM.SaveProject() If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) LoadingWndHelper.CloseLoadingWnd(ActiveIds.EXPORTPROJECT) Return sZipToCreate End Function #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() Dim CurrProd As ProjectFileVM = ProjectManagerVM.CurrProd ' 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_LASTNGEXPDIR, "", sDir) 'apro finestra scelta file Dim ImportDlg As New Microsoft.Win32.OpenFileDialog() With {.DefaultExt = ".ngexp", .Filter = "ProjectExport (*.ngexp)|*.ngexp", .InitialDirectory = If(Directory.Exists(sDir), sDir, ""), .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 Try Directory.Delete(sProjectimportDir, True) Catch ex As Exception EgtOutLog("Delete old import project failed!") MessageBox.Show("Importazione Fallita!", "Errore", MessageBoxButton.OK, MessageBoxImage.Error) Return End Try 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 LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTPROJECT, 2, EgtMsg(63018), EgtMsg(63019), 30) ' Project importing ' Loading project ' carico progetto Dim sProjFromPath() As String = Directory.GetFiles(sProjectimportDir, "*.nge") Dim bOk = EgtOpenFile(sProjFromPath(0)) If Not bOk Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) MessageBox.Show("Impossibile aprire il file", "Errore") Return End If ' recupero e verifico se ho a disposizione la macchina con cui e' stato creato il progetto Dim nImpExpPartId = EgtGetFirstNameInGroup(GDB_ID.ROOT, EXP_PART) Dim sMachine As String = "" EgtGetInfo(nImpExpPartId, EXP_MACHINE, sMachine) ' 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 = sMachine)) Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error Return End If Dim Machine As Machine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = sMachine) Dim nType As Integer = BWType.NULL EgtGetInfo(nImpExpPartId, BTL_GEN_PROJTYPE, nType) If IsNothing(Machine) OrElse nType = BWType.NULL Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error Return End If ' elimino part di esportazione EgtErase(nImpExpPartId) LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTPROJECT, 2, EgtMsg(63020), 30, 100) ' Creating imported project ' 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, Machine) NewProjIdList.Add(nNewProjId) ' imposto ProjId di caricamento ProjectManagerVM.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 ' cambio indicazione proj in gruppo di assemblaggio Dim AsseBaseId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL Dim nAsseBaseProj As Integer = 0 EgtGetInfo(AsseBaseId, BTL_PRT_PROJ, nAsseBaseProj) If nAsseBaseProj = nImportProjId Then EgtSetInfo(AsseBaseId, BTL_PRT_PROJ, NewProjIdList(nProjIndex)) Exit While End If AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) End While ' riporto nuovo ProjId nel layer BTLInfo EgtSetInfo(BTLInfoIdList(nProjIndex), BTL_PRT_PROJ, nNewProjId) ' resetto tutti gli stati di CALC For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList BTLPart.ResetCalcTotalPart() Next ' 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") LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) 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, sBTLFileName, Map.refProjectVM.BTLStructureVM.sLISTNAME, ExportDate, nType, Machine.Name) Else ' elimino da Db ' CheckMe impostata come cancellazione FISICA dal DB... DbControllers.m_ProjController.DeleteProj(nNewProjId, False) End If ' 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, Map.refMainWindowVM.MainWindowM.GetKeyNumber()) 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 ' resetto CurrProd per evitare di leggere valori produzione dal Db di quel progetto ProjectManagerVM.CurrProd = Nothing ' 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) ' setto il PType del Prod DbControllers.m_ProdController.UpdatePType(nProdId, nType) ' setto la Macchina associata al Prod DbControllers.m_ProdController.UpdateMachine(nProdId, sMachine) For Each MachGroup As MyMachGroupVM In Map.refProjectVM.MachGroupPanelVM.MachGroupVMList ' aggiorno ProdId sui MachGroup EgtSetInfo(MachGroup.Id, MGR_RPT_PRODID, nProdId) If Map.refMainWindowVM.MainWindowM.nUserLevel < 5 OrElse GetMainPrivateProfileInt(S_MACH, K_EXPORTBWE, 0) <> 1 Then ' resetto tutti gli stati di CALC MachGroup.ResetCalcTotalMachGroup() End If Next If Map.refMainWindowVM.MainWindowM.nUserLevel >= 5 AndAlso GetMainPrivateProfileInt(S_MACH, K_EXPORTBWE, 0) = 1 Then ' riporto info di futuro aggiornamento machgroup nBTLInfoLayerId = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO) While nBTLInfoLayerId <> GDB_ID.NULL EgtSetInfo(nBTLInfoLayerId, IMP_VERIFYMACHGROUP, True) nBTLInfoLayerId = EgtGetNextName(nBTLInfoLayerId, BTLINFO) End While End If ' salvo il progetto PROD EgtSaveFile(sProjFromPath(0), NGE.CMPTEXT) ' 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) bOk = True Catch ex As Exception EgtOutLog("Impossibile copiare il file") bOk = False End Try End If If Map.refMainWindowVM.MainWindowM.nUserLevel >= 5 AndAlso GetMainPrivateProfileInt(S_MACH, K_EXPORTBWE, 0) = 1 Then ' copio tutti i bwe For Each CurrFile In Directory.GetFiles(sProjectimportDir) If Path.GetExtension(CurrFile) = ".bwe" OrElse Path.GetExtension(CurrFile) = ".html" Then File.Copy(CurrFile, sProdDir & "\" & Path.GetFileName(CurrFile)) End If Next End If If bOk Then ' aggiungo altri proj a prod For Each nProjId In NewProjIdList DbControllers.m_ProdController.AddProj(nProdId, nProjId, Map.refMainWindowVM.MainWindowM.GetKeyNumber()) Next Else ' elimino da DB DbControllers.m_ProdController.DeleteProd(nProdId, True) End If 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, Map.refMainWindowVM.MainWindowM.GetKeyNumber()) End If DbControllers.m_ProdController.ResetController() End If ' imposto progetto corrente If NewProjIdList.Count > 0 Then SetCurrProj(NewProjIdList(0)) OpenProject(CurrProj) End If ' ripristino eventuale CurrProd precedente ProjectManagerVM.CurrProd = CurrProd WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEXPDIR, Path.GetDirectoryName(ImportDlg.FileName)) LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) 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(CurrProj) Then Return ' verifico se progetto modificato, e chiedo se salvare Dim bSaved As Boolean = True If 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 ProjectManagerVM.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 LoadingWndHelper.OpenLoadingWnd(ActiveIds.GOTOPROD, 3, EgtMsg(63004), EgtMsg(63011), 10) ' Optimization opening ' Loading environment Dim nProdId As Integer = ProjectManagerVM.CurrProj.nProdId If nProdId > 0 Then ProjectManagerVM.SetCurrProd(nProdId) ProjectManagerVM.CurrProd.SetReloadProject(bSaved) Else 'creo nuova ottimizzazione da progetto corrente NewProdFromProj() End If ' Ricavo il tipo di Warehouse settato nell'INI Dim nDefault As Integer = 2 If GetMainPrivateProfileInt(S_WAREHOUSE, EgtBEAMWALL.Core.ConstIni.K_TYPE, nDefault) = WarehouseType.MEDIUM Then ' Se di tipo Medium confronto le Sezioni del BTL importato con quelle in Warehouse WarehouseWndVM.UpdateSectionXMaterial() End If ' vado in pagina prod Map.refMainMenuVM.SetSelPage(Pages.MACHINING, False) ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() LoadingWndHelper.CloseLoadingWnd(ActiveIds.GOTOPROD) End Sub #End Region ' GoToProd #End Region ' Commands End Class