Imports EgtWPFLib5 Imports EgtBEAMWALL.Core Imports EgtUILib Imports System.Collections.ObjectModel Imports System.IO Imports EgtBEAMWALL.DataLayer.DatabaseModels Imports System.Windows.Threading Public Class OnlyProdManagerVM 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_OpenProj_Timer As New DispatcherTimer Private m_bOpenProj As Boolean = False Private m_nProjIdToOpen As Integer = GDB_ID.NULL Private m_OnlyProdManager_IsEnabled As Boolean = True Public ReadOnly Property OnlyProdManager_IsEnabled As Boolean Get Return m_OnlyProdManager_IsEnabled End Get End Property Friend Sub SetOnlyProdManagerIsEnabled(bIsEnabled As Boolean) m_OnlyProdManager_IsEnabled = bIsEnabled NotifyPropertyChanged(NameOf(OnlyProdManager_IsEnabled)) End Sub Friend Property CurrProj As ProjFileVM Get Return ProjectManagerVM.CurrProj End Get Set(value As ProjFileVM) ProjectManagerVM.CurrProj = value End Set End Property Friend Property CurrProd As ProdFileVM Get Return ProjectManagerVM.CurrProd End Get Set(value As ProdFileVM) ProjectManagerVM.CurrProd = value End Set End Property Private m_TempCurrProd As ProdFileVM Friend Property TempCurrProd As ProdFileVM Get Return m_TempCurrProd End Get Set(value As ProdFileVM) m_TempCurrProd = value End Set End Property Friend m_MruFiles As New MruList Public ReadOnly Property MruFileNames As ObservableCollection(Of String) Get Dim IdAndBTLFileNames As New ObservableCollection(Of String) For Each FileName In m_MruFiles.FileNames.ToList() Dim PdId As Integer = 0 Dim sPdId As String = Path.GetFileNameWithoutExtension(DirectCast(FileName, String).Replace("__", "_")) Integer.TryParse(sPdId, PdId) Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId) If IsNothing(PdFileM) Then m_MruFiles.Remove(FileName) Else Dim PdFileVM = New ProdFileVM(PdFileM) IdAndBTLFileNames.Add(sPdId & " | " & PdFileVM.sBTLFileName) End If Next Return IdAndBTLFileNames End Get End Property Private m_GoToSupervisor_Visibility As Visibility Public ReadOnly Property GoToSupervisor_Visibility As Visibility Get Return m_GoToSupervisor_Visibility 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 Private m_AddProj_Visibility As Visibility Public ReadOnly Property AddProj_Visibility As Visibility Get Return m_AddProj_Visibility End Get End Property ' indice ultimo progetto Private m_nLastProdId As Integer Friend ReadOnly Property nLastProdId As Integer Get Return m_nLastProdId End Get End Property Public ReadOnly Property nProjType As BWType Get Return If(Not IsNothing(CurrProj), CurrProj.nType, BWType.NULL) End Get End Property Public ReadOnly Property nProdType As BWType Get Return If(Not IsNothing(CurrProd), CurrProd.nType, BWType.NULL) 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_cmdImportBTL As ICommand Private m_cmdUpdateBTL As ICommand Private m_cmdExportProject As ICommand Private m_cmdImportProject As ICommand Private m_cmdAddProj As ICommand Private m_cmdGoToSupervisor 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 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 ImportProject_ToolTip As String Get Return EgtMsg(61839) End Get End Property Public ReadOnly Property ExportProject_ToolTip As String Get Return EgtMsg(61838) End Get End Property Public ReadOnly Property GoToSupervisor_ToolTip As String Get Return EgtMsg(61974) End Get End Property Public ReadOnly Property AddProj_ToolTip As String Get Return EgtMsg(61921) End Get End Property #End Region ' ToolTip #End Region ' Field & Properties #Region "CONSTRUCTORS" Sub New() Map.SetRefOnlyProdManagerVM(Me) ' Leggo ultimo indice di progetto m_nLastProdId = 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 ' abilito passaggio a supervisore If Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.SUPERVISOR) Then m_GoToSupervisor_Visibility = Visibility.Visible Else m_GoToSupervisor_Visibility = Visibility.Collapsed End If ' attivo bottone AddProj If GetMainPrivateProfileInt(S_GENERAL, K_ADDPROJ, 0) = 1 Then m_AddProj_Visibility = Visibility.Visible Else m_AddProj_Visibility = Visibility.Collapsed End If ' Leggo ultimo indice di progetto m_nLastProdId = GetMainPrivateProfileInt(S_GENERAL, K_PRODSINDEX, 1) ' Impostazioni MruLists m_MruFiles.Init(S_MRUPRODFILES, 8) ' imposto timer di apertura da ottimizzatore m_OpenProj_Timer.Interval = TimeSpan.FromMilliseconds(500) AddHandler m_OpenProj_Timer.Tick, AddressOf OpenProject_Tick m_OpenProj_Timer.Start() End Sub #End Region ' Constructors #Region "METHODS" 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 Private Function InitNewProj(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 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 Friend Function InitNewProd(ByRef nProjId As Integer, ByRef nProdId As Integer, ByRef sProjectDir As String) As Boolean ' richiedo indice nuovo progetto nProdId = DbControllers.m_ProdController.GetNextIndex(nProjId, Map.refMainWindowVM.MainWindowM.GetKeyNumber()) If nProdId <= 0 Then Return False sProjectDir = refMainWindowVM.MainWindowM.sProdsDir & "\" & nProdId.ToString("0000") ' creo cartella nuovo progetto If Not Directory.Exists(sProjectDir) Then Directory.CreateDirectory(sProjectDir) Else Dim di As 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 Sub ReloadBTLStructure() Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(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 Public Function SetCurrProd(nProdId As Integer) As Boolean Return ProjectManagerVM.SetCurrProd(nProdId) End Function Public Sub OpenProject_Tick() If Not m_bOpenProj Then Return m_bOpenProj = False If Map.refMainMenuVM.SelPage = Pages.ONLYPRODPAGE Then ' recupero progetto da Id Dim DbProject As ProdFileM DbProject = DbControllers.m_ProdController.FindCoreByProdId(m_nProjIdToOpen) Dim ProjectVM As New ProdFileVM(DbProject) ' verifico se progetto modificato, e chiedo se salvare If Not ProjFileVM.VerifyProjectModification(ProjectManagerVM.CurrProj, ProjectType.PROJ) Then Return OpenProject(ProjectVM) End If m_nProjIdToOpen = GDB_ID.NULL End Sub Private Sub NewProdFromProj() ' inizializzo nuovo progetto PROD Dim nProdId As Integer = 0 Dim sProdDir As String = "" InitNewProd(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 UpdateCurrProj() ' imposto currprod SetCurrProd(nProdId) ' imposto TempCurrProd TempCurrProd = CurrProd ' setto flag nuovo progetto in prod CurrProd.bIsNew = True Else ' elimino da DB DbControllers.m_ProdController.DeleteProd(nProdId, True) 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 ' riapro progetto prod OpenProject(TempCurrProd) 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 Public Sub OpenOnlyProjectFromSupervisor(ProjIdToOpen As Integer) If Not IsNothing(ProjectManagerVM.CurrProd) Then m_nProjIdToOpen = ProjIdToOpen m_bOpenProj = True End If End Sub #End Region ' Methods #Region "COMMANDS" #Region "New" ''' ''' Returns a command that do New. ''' 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 New. This method is invoked by the NewCommand. ''' 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 OnlyProdProjectTypeWndV(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 PROJ Dim nProjId As Integer = 0 Dim sProjDir As String = "" InitNewProj(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)) ' inizializzo nuovo progetto PROD NewProdFromProj() 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 ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return OpenProject(Nothing) End Sub Friend Sub OpenProject(TempCurrPd As ProdFileVM) m_TempCurrProd = TempCurrPd Dim sFilePath As String = "" ' se la string è vuota If IsNothing(TempCurrProd) 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 OnlyProdNewOpenProjectFileDialogV(Application.Current.MainWindow, OpenProdFileDialogVM) Dim DialogResult As Boolean? = OpenFile.EgtShowDialog(ProjectType.PROD) If IsNothing(DialogResult) OrElse Not DialogResult Then Return sFilePath = OpenProdFileDialogVM.SelProject.ProdFileVM.sProdPath m_TempCurrProd = OpenProdFileDialogVM.SelProject.ProdFileVM Else Dim OpenProjectFileDialogVM As OpenProjectFileDialogVM = Nothing ' apro dialogo di scelta file OpenProjectFileDialogVM = New OpenProjectFileDialogVM Dim OpenFile As New OnlyProdOpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM) Dim DialogResult As Boolean? = OpenFile.EgtShowDialog(ProjectType.PROD) If IsNothing(DialogResult) OrElse Not DialogResult Then Return sFilePath = OpenProjectFileDialogVM.SelProject.sProdPath TempCurrProd = OpenProjectFileDialogVM.SelProject End If Else sFilePath = If(Not IsNothing(TempCurrProd.sProdPath), TempCurrProd.sProdPath, "") End If LoadingWndHelper.OpenLoadingWnd(ActiveIds.OPENPROD, 3, EgtMsg(63004), EgtMsg(63001), 50) ' Optimization opening ' Loading project geometries If File.Exists(sFilePath) Then ' se la macchina del progetto in apertura non è tra le macchine disponibili lo segnalo e apro un progetto vuoto If IsNothing(Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = TempCurrProd.sMachine)) Then ' rimuovo il file in apertura dalla lista degli MRU m_MruFiles.Remove(sFilePath) MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error NewProject() Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList())) Else If Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) Then Map.refProjectVM.SetOptimizePanel_Visibility(True) If Not IsNothing(Map.refTopPanelVM) Then Map.refTopPanelVM.UpdateQParameterVisibility() End If End If ' imposto flag secondo tipo di progetto (travi o pareti) Dim sBTLFlag As String = If(TempCurrProd.nType = Core.ConstBeam.BWType.BEAM, K_BTLFLAG, K_WALLBTLFLAG) Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR) EgtBeamSetFlag(nFlag) Else MessageBox.Show(EgtMsg(61871)) Map.refSceneHostVM.MainController.NewProject() Map.refMainWindowVM.SetTitle("New - EgtBEAMWALL") End If ' aggiorno lista possibili nesting Map.refOptimizePanelVM.UpdateOriginTypeList(EgtGetFirstNameInGroup(GDB_ID.ROOT, "RawParts") <> GDB_ID.NULL) ' aggiorno visibilità bottone Muovi pezzi Map.refRawPartManagerVM.UpdateMovePartInRawPartVisibility() ' resetto eventuale visualizzazione statistiche Map.refInstrumentPanelVM.ResetStatisticsIsChecked() ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() ' mostro tutti i pezzi If Not IsNothing(Map.refProjectVM.MachGroupPanelVM.MachGroupVMList) AndAlso Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count <= 0 Then Map.refShowBeamPanelVM.ShowAll(True) NotifyPropertyChanged(NameOf(MruFileNames)) LoadingWndHelper.CloseLoadingWnd(ActiveIds.OPENPROD) 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 ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return ' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo Dim PdId As Integer = 0 Dim arrStrPdId As String() = DirectCast(param, String).Split("|") Integer.TryParse(arrStrPdId(0), PdId) Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId) Dim PdFileVM = New ProdFileVM(PdFileM) OpenProject(PdFileVM) End Sub #End Region ' OpenMruFileCommand #Region "SaveCommand" ''' ''' 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 ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub SaveCmd() Save(True) End Sub Public Function Save(Optional bShowLoading As Boolean = False) As Boolean If IsNothing(CurrProd) Then Return False If bShowLoading Then LoadingWndHelper.OpenLoadingWnd(ActiveIds.SAVEPROD, 2, EgtMsg(63007), EgtMsg(63012), 70) ' Project saving ' Saving geometry Dim bOk As Boolean = Map.refSceneHostVM.SaveProject() If bShowLoading Then LoadingWndHelper.UpdateLoadingWnd(ActiveIds.SAVEPROD, 2, EgtMsg(63013), 70, 100) ' Saving data on Db 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 If Not DbControllers.m_ProdController.UpdateMachGroup(CurrProd.nProdId, MyMachGroupList) And bShowLoading Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.SAVEPROD) Return False End If ' verifico se Reset Macchina modificato e nel caso aggiorno DB e CurrProj If Map.refCALCPanelVM.IsMachineModified() Then DbControllers.m_ProdController.UpdateMachine(CurrProd.nProdId, Map.refCALCPanelVM.SelectedMachine.Name) CurrProd.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) ' ciclo sulla lista di ProjId associati For Each ProjId In CurrProd.nProjIdList ' aggiorno la Macchina per i ProjId associati sul DB DbControllers.m_ProjController.UpdateMachine(ProjId, Map.refCALCPanelVM.SelectedMachine.Name) ' se uno dei Proj interessati equivale al Proj correntemente aperto setto la Macchina dello stesso ' (poichè il progetto corrente non viene riaperto e riletto dal DB) If ProjId = CurrProj.nProjId Then CurrProj.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) Next Map.refCALCPanelVM.ResetMachineModified() End If ' se nuovo progetto If CurrProd.bIsNew Then ' resetto stato new CurrProd.bIsNew = False End If Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) If bShowLoading Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.SAVEPROD) Return bOk End Function #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 ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel 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 OnlyProdProjectTypeWndV(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 InitNewProj(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 If bOk Then ' salvo il progetto bOk = EgtSaveFile(sProjFileName, NGE.CMPTEXT) ' inizializzo nuovo progetto PROD NewProdFromProj() 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 #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(CurrProd) Then Return ' verifico se progetto modificato, e chiedo se salvare If CurrProd.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, 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 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 nProdType = 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 OnlyProdUpdateOrAppendWndV(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 OnlyProdUpdateBTLWndV(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 = CurrProd.nProdId 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 = CurrProd.nProdId 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) Dim sDestPath As String = CurrProd.sProdDirPath & "\" & Path.GetFileNameWithoutExtension(sFile) While File.Exists(sDestPath & ".btl") 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 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(CurrProd) = MessageBoxResult.Cancel Then Return Nothing If IsNothing(CurrProd) Then Return Nothing Case Pages.ONLYPRODPAGE If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return Nothing If IsNothing(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 = CurrProd.nProdId.ToString("0000") & " - " & CurrProd.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 OrElse Map.refMainMenuVM.SelPage = Pages.ONLYPRODPAGE 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, CurrProd.sMachine) EgtSetInfo(nImpExpPartId, BTL_GEN_PROJTYPE, CurrProd.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(CurrProd.nProdId > 0, CurrProd.sProdDirPath, CurrProd.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 TempCurrProd As ProjectFileVM = CurrProd ' lista di tutti gli errori riscontrati Dim ErrorList As New List(Of String) 'If Not ProjFileVM.VerifyProjectModification(CurrProj, ProjectType.PROJ) Then Return If ProdFileVM.VerifyProjectModification(TempCurrProd) 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 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 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 nProdId As Integer = 0 Dim sProdDir As String = "" 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 = "" InitNewProj(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 CurrProd = Nothing ' carico Machgroup che non verrebbero altrimenti importati Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList())) ' inizializzo nuovo progetto PROD InitNewProd(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() ' imposto progetto corrente If NewProjIdList.Count > 0 Then SetCurrProj(NewProjIdList(0)) SetCurrProd(nProdId) OpenProject(CurrProd) ' Da controllare End If WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEXPDIR, Path.GetDirectoryName(ImportDlg.FileName)) LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT) End Sub #End Region ' ImportProject #Region "AddProj" ''' ''' Returns a command that do Save. ''' Public ReadOnly Property AddProj_Command As ICommand Get If m_cmdAddProj Is Nothing Then m_cmdAddProj = New Command(AddressOf AddProj) End If Return m_cmdAddProj End Get End Property ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub AddProj() ' verifico se progetto modificato, e chiedo se salvare If IsNothing(CurrProd) Then Return Dim bNewProject As Boolean = False Dim sProjectDirPath As String = "" sProjectDirPath = CurrProd.sProdDirPath Dim VerifyResult As MessageBoxResult = MessageBoxResult.None ' verifico se progetto modificato, e chiedo se salvare If EgtGetModified() OrElse CurrProd.bIsNew OrElse Map.refCALCPanelVM.IsMachineModified() Then VerifyResult = MessageBox.Show(EgtMsg(61875), "", If(CurrProd.bIsNew, MessageBoxButton.OKCancel, MessageBoxButton.YesNoCancel), MessageBoxImage.Question) Select Case VerifyResult Case MessageBoxResult.Yes, MessageBoxResult.OK ' salvo proj Save() Case MessageBoxResult.Cancel Return Case Else ' No EgtResetModified() OpenProject(CurrProd) End Select Else EgtResetModified() End If ' faccio scegliere proj da aggiungere Dim OpenProjectFileDialogVM As New OpenProjectFileDialogVM Dim ChooseProdFileDialog As New OnlyProdOpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM) Dim DialogResult As Boolean? = ChooseProdFileDialog.EgtShowDialog(ProjectType.PROJ, True) If IsNothing(DialogResult) OrElse Not DialogResult Then Return If IsNothing(OpenProjectFileDialogVM.SelProject.nProjId) OrElse OpenProjectFileDialogVM.SelProject.nProjId <= 0 Then Return ' verifico che il proj selezionato non abbia prod If Not IsNothing(OpenProjectFileDialogVM.SelProject.nProdId) AndAlso OpenProjectFileDialogVM.SelProject.nProdId > 0 Then ' verifico che non sia uno di quelli gia' collegati a questo Prod Dim bFound As Boolean = False For Each nProjId As Integer In CurrProd.nProjIdList If nProjId = OpenProjectFileDialogVM.SelProject.nProjId Then bFound = True Exit For End If Next If bFound Then MessageBox.Show("Selezionato progetto che fa gia' parte di questa produzione!", "Errore", MessageBoxButton.OK, MessageBoxImage.Error) Else MessageBox.Show("Progetto gia' collegato ad una produzione!", "Errore", MessageBoxButton.OK, MessageBoxImage.Error) End If Return End If ' verifico che sia associato alla stessa macchina If OpenProjectFileDialogVM.SelProject.sMachine <> CurrProd.sMachine Then MessageBox.Show("Progetto per una macchina diversa da quella del progetto corrente!", "Errore", MessageBoxButton.OK, MessageBoxImage.Error) Return End If ' inserisco proj nel prod corrente Dim bOk As Boolean = EgtInsertFile(OpenProjectFileDialogVM.SelProject.sProjPath) ' lo salvo bOk = bOk AndAlso Save(False) If bOk Then ' riporto aggiunta proj a prod su Db DbControllers.m_ProdController.AddProj(CurrProd.nProdId, OpenProjectFileDialogVM.SelProject.nProjId) 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 ' aggiorno CurrProd Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(CurrProd.nProdId) CurrProd.ProdFileM.SetProjIdList(PdFileM.nProjIdList) ' ricarico BTLPartList OpenProject(CurrProd) End Sub #End Region ' AddProj #Region "GoToSupervisor" ''' ''' Returns a command that do Open. ''' Public ReadOnly Property GoToSupervisor_Command As ICommand Get If m_cmdGoToSupervisor Is Nothing Then m_cmdGoToSupervisor = New Command(AddressOf GoToSupervisor) End If Return m_cmdGoToSupervisor End Get End Property ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Friend Sub GoToSupervisor() If IsNothing(CurrProd) Then Return ' apro supervisore Dim sSupervisorName As String = "EgtBEAMWALL.SupervisorR32" ' recupero processo del supervisore Dim localProc As Process() = Process.GetProcessesByName(sSupervisorName) If localProc.Length > 0 Then For Each p As Process In localProc ' porto in primo piano il Supervisor BringWindowToFront(p.MainWindowHandle) Exit For Next Else Dim sSupervisorPath As String = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory) & "\" & sSupervisorName & ".exe" Try Process.Start(sSupervisorPath, "1 " & CurrProd.nProdId) Catch ex As Exception EgtOutLog("Error: impossible starting supervisor from path " & sSupervisorPath) End Try End If ' mando richiesta di apertura progetto in supervisore DbControllers.m_StatusMapController.UpdateAction(DbControllers.m_SupervisorId, CurrProd.nProdId, CurrProd.nProdId, StatusMapItemType.Comm, StatusMapOpType.ChangeProdInSupervisorRequest, "") End Sub #End Region ' GoToSupervisor #End Region ' Commands End Class