Imports System.Collections.ObjectModel
Imports System.IO
Imports System.Windows.Threading
Imports EgtBEAMWALL.Core
Imports EgtBEAMWALL.DataLayer.DatabaseModels
Imports EgtUILib
Imports EgtWPFLib5
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
Private m_IsStartBtnOpen As Boolean = False
Public Property IsStartBtnOpen As Boolean
Get
Return m_IsStartBtnOpen
End Get
Set(value As Boolean)
m_IsStartBtnOpen = value
End Set
End Property
Friend Sub SetIsStartBtnOpen(bIsStartBtnOpen As Boolean)
m_IsStartBtnOpen = bIsStartBtnOpen
NotifyPropertyChanged(NameOf(IsStartBtnOpen))
End Sub
Private m_IsSaveBtnOpen As Boolean = False
Public Property IsSaveBtnOpen As Boolean
Get
Return m_IsSaveBtnOpen
End Get
Set(value As Boolean)
m_IsSaveBtnOpen = value
End Set
End Property
Friend Sub SetIsSaveBtnOpen(bIsSaveBtnOpen As Boolean)
m_IsSaveBtnOpen = bIsSaveBtnOpen
NotifyPropertyChanged(NameOf(IsSaveBtnOpen))
End Sub
Private m_IsBtlBtnOpen As Boolean = False
Public Property IsBtlBtnOpen As Boolean
Get
Return m_IsBtlBtnOpen
End Get
Set(value As Boolean)
m_IsBtlBtnOpen = value
End Set
End Property
Friend Sub SetIsBtlBtnOpen(bIsBtlBtnOpen As Boolean)
m_IsBtlBtnOpen = bIsBtlBtnOpen
NotifyPropertyChanged(NameOf(IsBtlBtnOpen))
End Sub
' 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_cmdAddBTL As ICommand
Private m_cmdGoToSupervisor As ICommand
Private m_cmdShowPopUpStartBtnCmd As ICommand
Private m_cmdShowPopUpSaveBtnCmd As ICommand
Private m_cmdShowPopUpBtlBtnCmd 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 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 String) 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 dati creazione progetto
DbControllers.m_ProjController.Update(New ProjModel() With {.ProjId = nProjId,
.DtCreated = DateTime.Now(),
.PType = nType,
.Machine = Machine})
'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(0))
' 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
' 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)
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
' riapro progetto prod
OpenProject(TempCurrProd)
' 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
End Sub
Private Function CreateNewProd(Optional bFromImportBtl As Boolean = True) As Boolean
' creo proj
Dim nProjId As Integer = 0
Dim sBTLFileName As String = ""
Dim nType As BWType = BWType.NULL
Dim Machine As MyMachine = Nothing
If bFromImportBtl Then
If Not CreateNewProj(Nothing, nProjId, sBTLFileName, nType, Machine) Then
EgtOutLog("Errore! Creazione nuovo prod fallita!")
Return False
End If
Else
If Not CreateNewEmptyProj(nProjId, nType, Machine) Then
EgtOutLog("Errore! Creazione nuovo prod vuoto fallita!")
Return False
End If
End If
' inizializzo nuovo progetto PROD
Dim nProdId As Integer = 0
Dim sProdDir As String = ""
If Not InitNewProd(nProjId, nProdId, sProdDir) Then
EgtOutLog("Errore! Impossibile creare nuovo progetto!")
Return False
End If
' setto il PType del Prod
DbControllers.m_ProdController.UpdatePType(nProdId, nType)
' setto la Macchina associata al Prod
DbControllers.m_ProdController.UpdateMachine(nProdId, Machine.Name)
' creo cartella per Proj
Dim sProjDirPath As String = sProdDir & "\Projs\" & nProjId.ToString("0000")
Try
Directory.CreateDirectory(sProjDirPath)
Catch ex As Exception
EgtOutLog("Errore! Impossibile creare cartella del Proj!")
End Try
' copio file importato
Dim sImportFileTempPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\" & sBTLFileName
Dim sImportFileProdPath As String = sProjDirPath & "\" & sBTLFileName
If File.Exists(sImportFileTempPath) Then
Try
File.Copy(sImportFileTempPath, sImportFileProdPath)
Catch ex As Exception
EgtOutLog("Errore! Impossibile copiare il file importato nella cartella del progetto!")
End Try
Try
File.Delete(sImportFileTempPath)
Catch ex As Exception
EgtOutLog("Errore! Impossibile cancellare il file importato dalla cartella Temp!")
End Try
End If
' salvo il progetto
Dim sProdFileName As String = sProdDir & "\" & nProdId.ToString("0000") & ".nge"
If Not EgtSaveFile(sProdFileName, NGE.CMPTEXT) Then
'' elimino da DB
''DbControllers.m_ProdController.DeleteProd(nProdId, True)
EgtOutLog("Errore! Impossibile salvare il progetto!")
Return False
End If
' resetto stato new del proj
DbControllers.m_ProjController.ResetNew(nProjId)
' imposto currprod
SetCurrProd(nProdId)
' recupero indice di modifica progetto quando caricato
Dim CommIndex As Integer = -1
Dim ActiveSessionList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetProd(m_SupervisorId)
For Each ActiveSession In ActiveSessionList
If Not IsNothing(ProjectManagerVM.CurrProd) AndAlso ActiveSession.ItemId = ProjectManagerVM.CurrProd.nProdId Then
CommIndex = ActiveSession.Index
End If
Next
' carico gruppi di lavorazione
Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList()))
If IsNothing(Map.refProjectVM.MachGroupPanelVM) Then
If Not IsNothing(ProjectManagerVM.CurrProd) Then
OpenProject(ProjectManagerVM.CurrProd)
Else
NewProject()
End If
MessageBox.Show(Application.Current.MainWindow, "Error! Failed loading MachGroups!", EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error opening file
EgtOutLog("Errore! Caricamento dei gruppi di lavorazione fallito!")
Return False
End If
' fisso indice sessione di comunicazione
If CommIndex > -1 Then
ProjectManagerVM.CurrProd.SetModificationIndex(CommIndex)
End If
' calcolo volumi pezzi
For Each Part In Map.refProjectVM.BTLStructureVM.BTLPartVMList
Part.CalcBTLPartVolume()
Next
'' imposto macchina del progetto
'Map.refMachinePanelVM.SelectedMachine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = ProjectManagerVM.CurrProd.sMachine)
SectionXMaterial.SetType(nType)
Core.ViewPanelVM.UpdateBWType(nType)
' aggiorno le colonne in base al tipo progetto
Map.refRawPartListVM.UpdateColumns(nType)
Map.refFeatureInPartInRawPartListVM.UpdateColumns(nType)
' gestisco visibilita' bottoni
Map.refProjectVM.SetOnlyProdOptimizePanel_Visibility(Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO))
' aggiorno lista possibili nesting
Map.refOptimizePanelVM.UpdateOriginTypeList(EgtGetFirstNameInGroup(GDB_ID.ROOT, "RawParts") <> GDB_ID.NULL)
' aggiorno visibilità bottone Muovi pezzi
Map.refRawPartManagerVM.UpdateMovePartInRawPartVisibility()
' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel
Map.refCALCPanelVM.LoadMachineList()
Map.refPartManagerVM.LockVisibilityUpdate()
' seleziono primo pezzo
If Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count > 0 Then
Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList(0))
End If
'LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63006), 70, 100) ' Loading graphics
'LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL)
' 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 nome macchina in statusbar
Map.refMyStatusBarVM.RefreshMachName()
Return True
End Function
Private Function CreateNewProj(ProdFileVM As ProdFileVM, Optional ByRef nProjId As Integer = 0, Optional ByRef sBTLFileName As String = "", Optional ByRef nType As BWType = BWType.NULL, Optional ByRef Machine As MyMachine = Nothing) As Boolean
'If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return
Dim sDir As String = String.Empty
GetMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, "", sDir)
' apro finestra scelta file
Dim sImportFilePath As String = ""
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
sImportFilePath = BTLDlg.FileName
Else
Return False
End If
Dim sProjDir As String = ""
' verifico se non e' tra i BTL gia' importati
sBTLFileName = Path.GetFileName(sImportFilePath)
Dim nAlreadyImported As Integer = DbControllers.m_ProjController.AlreadyImported(Path.GetFileNameWithoutExtension(sImportFilePath))
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 False
End Select
End If
End If
If IsNothing(ProdFileVM) Then
' 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
If Map.refMachinePanelVM.MachineList.Count = 1 AndAlso DirectCast(Map.refMachinePanelVM.MachineList(0), MyMachine).nType <> MachineType.BOTH Then
Machine = DirectCast(Map.refMachinePanelVM.MachineList(0), MyMachine)
nType = Machine.nType
Else
Dim ProjectTypeWndVM As New ProjectTypeWndVM()
Dim ProjectTypeWnd As New OnlyProdProjectTypeWndV(Application.Current.MainWindow, ProjectTypeWndVM)
If ProjectTypeWnd.ShowDialog() Then
Machine = ProjectTypeWndVM.SelMachine
nType = ProjectTypeWndVM.nSelType
Else
Return False
End If
End If
'LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' creo progetto per file BTL
If Not CreateFirstBTLProj(sImportFilePath, nType, Machine, nProjId, sProjDir) Then Return False
Else
' creo progetto per file BTL
If Not AddNewBTLProj(sImportFilePath, ProdFileVM, nProjId, sProjDir) Then Return False
End If
' carico filtri di ricerca
Map.refProjectVM.BTLStructureVM.LoadFilters()
' gestisco log di importazione
ManageImportLog(nProjId, sProjDir)
'LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL)
Return True
End Function
Private Function CreateFirstBTLProj(sImportFilePath As String, nType As BWType, Machine As MyMachine, ByRef nProjId As Integer, ByRef sProjDir As String) As Boolean
'If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return False
'LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' copio file BTL
Dim sBtlCopyPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\" & Path.GetFileName(sImportFilePath)
Dim bOk = False
Try
File.Copy(sImportFilePath, sBtlCopyPath, True)
bOk = True
Catch ex As Exception
EgtOutLog("Errore! Impossibile copiare il file BTL!")
Return False
End Try
' inizializzo nuovo progetto
If Not InitNewProj(nProjId, sProjDir, nType, Machine.Name) Then
EgtOutLog("Errore! Impossibile creare indice nuovo progetto!")
' elimino file Btl copiato
Try
File.Delete(sBtlCopyPath)
Catch ex As Exception
EgtOutLog("Errore! Eliminazione file BTL copiato fallita!")
End Try
Return False
End If
' verifico tipo di file e recupero flag di importazione
Dim nFileType As Integer = EgtGetFileType(sBtlCopyPath)
If nFileType <> FT.BTL AndAlso nFileType <> FT.BTLX Then
MessageBox.Show(Application.Current.MainWindow, EgtMsg(10005), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' File type unknown - Error
EgtOutLog("Errore! Estensione progetto sconosciuta!")
Return False
End If
Dim sBTLFlag As String
If nType = BWType.BEAM Then
sBTLFlag = K_BTLFLAG
Else
sBTLFlag = K_WALLBTLFLAG
End If
Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR)
' importo file
If Not EgtNewFile() Then
EgtOutLog("Errore! Impossibile creare nuovo progetto!")
Return False
End If
Select Case nFileType
Case FT.BTL
If Not EgtImportBtl(sBtlCopyPath, nFlag) Then
EgtOutLog("Errore! Inserimento nel progetto del file BTL fallito!")
' elimino file Btl copiato
Try
File.Delete(sBtlCopyPath)
Catch ex As Exception
EgtOutLog("Errore! Eliminazione file BTL copiato fallita!")
End Try
'Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly
' elimino da Db
' CheckMe impostata come cancellazione FISICA dal DB...
DbControllers.m_ProjController.DeleteProj(nProjId, False)
Return False
End If
Case FT.BTLX
If Not EgtImportBtlx(sBtlCopyPath, 0) Then
EgtOutLog("Errore! Inserimento nel progetto del file BTL fallito!")
' elimino file Btl copiato
Try
File.Delete(sBtlCopyPath)
Catch ex As Exception
EgtOutLog("Errore! Eliminazione file BTL copiato fallita!")
End Try
'Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly
' elimino da Db
' CheckMe impostata come cancellazione FISICA dal DB...
DbControllers.m_ProjController.DeleteProj(nProjId, False)
Return False
End If
End Select
If EgtGetFirstPart() = GDB_ID.NULL Then
MessageBox.Show("Imported file is Empty!", "Warning!", MessageBoxButton.OK, MessageBoxImage.Warning)
Return False
End If
' imposto CurrentMachine
InitCurrentMachine(Machine)
' imposto flag secondo tipo di progetto (travi o pareti)
EgtBeamSetFlag(nFlag)
' LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTBTL, 2, EgtMsg(63005), 50, 70) ' Loading parts
' aggiungo informazioni su pezzi
Dim nPartId As Integer = EgtGetFirstPart()
While nPartId <> GDB_ID.NULL
' scrivo in ogni pezzo ProjId
EgtSetInfo(nPartId, BTL_PRT_PROJ, nProjId)
nPartId = EgtGetNextPart(nPartId)
' scrivo Id negli outline
Dim nPRId As Integer = 1
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia feature
If EgtExistsInfo(nOutlineId, MGR_FTR_PRC) Then
EgtSetInfo(nOutlineId, MGR_FTR_PRID, nPRId)
nPRId += 1
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
End While
' scrivo info proj e type su layer BtlInfo
Dim nBTLInfoLayer As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO)
EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, nProjId)
EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType)
' scrivo info proj su layer AsseBase
Dim nAsseBaseLayer As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE)
EgtSetInfo(nAsseBaseLayer, BTL_PRT_PROJ, nProjId)
' leggo struttura BTL per liste
Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(0))
' aggiorno Db
Dim ExportDate As DateTime
Dim sBTLFileName As String = Path.GetFileNameWithoutExtension(sImportFilePath)
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, Machine.Name)
' 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
Return True
End Function
Private Function AddNewBTLProj(sImportFilePath As String, ProdFileVM As ProdFileVM, ByRef nProjId As Integer, ByRef sProjDir As String) As Boolean
'If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return False
'LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' inizializzo nuovo progetto
If Not InitNewProj(nProjId, sProjDir, ProdFileVM.nType, ProdFileVM.sMachine) Then
EgtOutLog("Errore! Impossibile creare indice nuovo progetto!")
Return False
End If
' creo cartella per Proj
Dim sProjDirPath As String = ProdFileVM.sProdDirPath & "\Projs\" & nProjId.ToString("0000")
Try
Directory.CreateDirectory(sProjDirPath)
Catch ex As Exception
EgtOutLog("Errore! Impossibile creare cartella del Proj!")
End Try
' copio file BTL
Dim sBtlCopyPath As String = sProjDirPath & "\" & Path.GetFileName(sImportFilePath)
Dim bOk = False
Try
File.Copy(sImportFilePath, sBtlCopyPath, True)
Catch ex As Exception
EgtOutLog("Errore! Impossibile copiare il file BTL!")
Return False
End Try
' verifico tipo di file e recupero flag di importazione
Dim nFileType As Integer = EgtGetFileType(sBtlCopyPath)
If nFileType <> FT.BTL AndAlso nFileType <> FT.BTLX Then
MessageBox.Show(Application.Current.MainWindow, EgtMsg(10005), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' File type unknown - Error
EgtOutLog("Errore! Estensione progetto sconosciuta!")
Return False
End If
Dim sBTLFlag As String
If nType = BWType.BEAM Then
sBTLFlag = K_BTLFLAG
Else
sBTLFlag = K_WALLBTLFLAG
End If
Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR)
' importo file
Dim nGroupQty As Integer = EgtGetGroupObjs(GDB_ID.ROOT)
Dim nLastPartId As Integer = EgtGetLastPart(GDB_ID.ROOT)
Select Case nFileType
Case FT.BTL
If Not EgtImportBtl(sBtlCopyPath, nFlag) Then
EgtOutLog("Errore! Inserimento nel progetto del file BTL fallito!")
' elimino file Btl copiato
Try
File.Delete(sBtlCopyPath)
Catch ex As Exception
EgtOutLog("Errore! Eliminazione file BTL copiato fallita!")
End Try
'Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly
' elimino da Db
' CheckMe impostata come cancellazione FISICA dal DB...
DbControllers.m_ProjController.DeleteProj(nProjId, False)
Return False
End If
Case FT.BTLX
If Not EgtImportBtlx(sBtlCopyPath, 0) Then
EgtOutLog("Errore! Inserimento nel progetto del file BTL fallito!")
' elimino file Btl copiato
Try
File.Delete(sBtlCopyPath)
Catch ex As Exception
EgtOutLog("Errore! Eliminazione file BTL copiato fallita!")
End Try
'Map.refShowBeamPanelVM.ShowBuilding_IsChecked = bAssembly
' elimino da Db
' CheckMe impostata come cancellazione FISICA dal DB...
DbControllers.m_ProjController.DeleteProj(nProjId, False)
Return False
End If
End Select
' verifico che abbia importato qualcosa
If EgtGetGroupObjs(GDB_ID.ROOT) <= nGroupQty Then
MessageBox.Show("Imported file is Empty!", "Warning!", MessageBoxButton.OK, MessageBoxImage.Warning)
Return False
End If
'LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTBTL, 2, EgtMsg(63005), 50, 70) ' Loading parts
' aggiungo informazioni su pezzi
Dim nPartId As Integer = EgtGetNextPart(nLastPartId)
While nPartId <> GDB_ID.NULL
' scrivo in ogni pezzo ProjId
EgtSetInfo(nPartId, BTL_PRT_PROJ, nProjId)
' scrivo Id negli outline
Dim nPRId As Integer = 1
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia feature
If EgtExistsInfo(nOutlineId, MGR_FTR_PRC) Then
EgtSetInfo(nOutlineId, MGR_FTR_PRID, nPRId)
nPRId += 1
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
nPartId = EgtGetNextPart(nPartId)
End While
' scrivo info proj e type su layer BtlInfo
Dim nBTLInfoLayer As Integer = EgtGetLastNameInGroup(GDB_ID.ROOT, BTLINFO)
EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, nProjId)
EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType)
' scrivo info proj su layer AsseBase
Dim nAsseBaseLayer As Integer = EgtGetLastNameInGroup(GDB_ID.ROOT, ASSEBASE)
EgtSetInfo(nAsseBaseLayer, BTL_PRT_PROJ, nProjId)
' leggo struttura BTL per liste
Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(0))
Dim sProjFileName As String = sProjDir & "\" & nProjId.ToString("0000") & ".nge"
Dim bFirstPart As Boolean = EgtGetFirstPart() <> GDB_ID.NULL
If bOk Then '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)
Else
EgtOutLog("Errore nell'importazione BTL")
End If
' aggiorno Db
Dim ExportDate As DateTime
Dim sBTLFileName As String = Path.GetFileNameWithoutExtension(sImportFilePath)
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, ProdFileVM.nType, ProdFileVM.sMachine)
' salvo il progetto
Map.refSceneHostVM.SaveProject()
' riporto aggiunta proj a prod su Db
DbControllers.m_ProdController.AddProj(ProdFileVM.nProdId, nProjId)
' resetto stato new del proj
DbControllers.m_ProjController.ResetNew(nProjId)
' se progetto pareti e vista ruotata
If ProdFileVM.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.SetOnlyProdOptimizePanel_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)
'If bOk Then
' ' salvo il progetto
' bOk = EgtSaveFile(sProjFileName, NGE.CMPTEXT)
'End If
'' carico filtri di ricerca
'Map.refProjectVM.BTLStructureVM.LoadFilters()
'' gestisco log di importazione
'ManageImportLog(nProjId, sProjDir)
'LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL)
Return True
End Function
Private Function CreateNewEmptyProj(ByRef nProjId As Integer, ByRef nType As BWType, ByRef Machine As MyMachine) As Boolean
'If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return
Dim sProjDir As String = ""
' 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
If Map.refMachinePanelVM.MachineList.Count = 1 AndAlso DirectCast(Map.refMachinePanelVM.MachineList(0), MyMachine).nType <> MachineType.BOTH Then
Machine = DirectCast(Map.refMachinePanelVM.MachineList(0), MyMachine)
nType = Machine.nType
Else
Dim ProjectTypeWndVM As New ProjectTypeWndVM()
Dim ProjectTypeWnd As New OnlyProdProjectTypeWndV(Application.Current.MainWindow, ProjectTypeWndVM)
If ProjectTypeWnd.ShowDialog() Then
Machine = ProjectTypeWndVM.SelMachine
nType = ProjectTypeWndVM.nSelType
Else
Return False
End If
End If
'LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' creo progetto vuoto
If Not CreateFirstEmptyProj(nType, Machine, nProjId, sProjDir) Then Return False
' carico filtri di ricerca
Map.refProjectVM.BTLStructureVM.LoadFilters()
'LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL)
Return True
End Function
Private Function CreateFirstEmptyProj(nType As BWType, Machine As MyMachine, ByRef nProjId As Integer, ByRef sProjDir As String) As Boolean
'If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return False
'LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' inizializzo nuovo progetto
If Not InitNewProj(nProjId, sProjDir, nType, Machine.Name) Then
EgtOutLog("Errore! Impossibile creare indice nuovo progetto!")
Return False
End If
Dim sBTLFlag As String
If nType = BWType.BEAM Then
sBTLFlag = K_BTLFLAG
Else
sBTLFlag = K_WALLBTLFLAG
End If
' creo file
If Not EgtNewFile() Then
EgtOutLog("Errore! Impossibile creare nuovo progetto!")
Return False
End If
' imposto CurrentMachine
InitCurrentMachine(Machine)
' imposto flag secondo tipo di progetto (travi o pareti)
Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR)
EgtBeamSetFlag(nFlag)
' LoadingWndHelper.UpdateLoadingWnd(ActiveIds.IMPORTBTL, 2, EgtMsg(63005), 50, 70) ' Loading parts
' aggiungo informazioni su pezzi
Dim nPartId As Integer = EgtGetFirstPart()
While nPartId <> GDB_ID.NULL
' scrivo in ogni pezzo ProjId
EgtSetInfo(nPartId, BTL_PRT_PROJ, nProjId)
nPartId = EgtGetNextPart(nPartId)
' scrivo Id negli outline
Dim nPRId As Integer = 1
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia feature
If EgtExistsInfo(nOutlineId, MGR_FTR_PRC) Then
EgtSetInfo(nOutlineId, MGR_FTR_PRID, nPRId)
nPRId += 1
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
End While
' scrivo info proj e type su layer BtlInfo
Dim nBTLInfoLayer As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO)
EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, nProjId)
EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType)
' scrivo info proj su layer AsseBase
Dim nAsseBaseLayer As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE)
EgtSetInfo(nAsseBaseLayer, BTL_PRT_PROJ, nProjId)
' leggo struttura BTL per liste
Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(0))
' aggiorno Db
Dim ExportDate As DateTime
Dim sBTLFileName As String = " New - EgtBEAMWALL"
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, Machine.Name)
' aggiungo primo pezzo
Map.refProjectVM.BTLStructureVM.AddPart(nProjId)
Return True
End Function
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 ProdFileVM.VerifyProjectModification(CurrProd) Then Return
CreateNewProd(False)
Map.refMainWindowVM.UpdateTitle()
NotifyPropertyChanged(NameOf(MruFileNames))
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.Name)
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, ProjectManagerVM.CurrProd.sMachine)
SetCurrProj(nProjId)
End If
Map.refProjectVM.SetOnlyProdOptimizePanel_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 Function OpenProject(TempCurrPd As ProdFileVM) As Boolean
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 True
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 True
sFilePath = OpenProjectFileDialogVM.SelProject.sProdPath
m_TempCurrProd = OpenProjectFileDialogVM.SelProject
End If
Else
sFilePath = If(Not IsNothing(m_TempCurrProd.sProdPath), m_TempCurrProd.sProdPath, "")
End If
LoadingWndHelper.OpenLoadingWnd(ActiveIds.OPENPROD, 3, EgtMsg(63004), EgtMsg(63001), 50) ' Optimization opening ' Loading project geometries
If Not File.Exists(sFilePath) Then
MessageBox.Show(EgtMsg(61871))
EgtOutLog("Errore! File da aprire non trovato!")
Return False
End If
' se la macchina del progetto in apertura non è tra le macchine disponibili lo segnalo ed esco
Dim OpenProjectMachine As MyMachine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = m_TempCurrProd.sMachine)
If IsNothing(OpenProjectMachine) 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
EgtOutLog("Errore! Macchina del progetto da aprire non trovata!")
Return False
End If
If Not EgtOpenFile(sFilePath) Then
m_MruFiles.Remove(sFilePath)
If Not IsNothing(ProjectManagerVM.CurrProd) AndAlso sFilePath <> ProjectManagerVM.CurrProd.sProdPath Then
OpenProject(ProjectManagerVM.CurrProd)
Else
NewProject()
End If
MessageBox.Show(Application.Current.MainWindow, EgtMsg(10003) & " '" & sFilePath & "'", EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error opening file
EgtOutLog("Errore! Caricamento del progetto fallito!")
Return False
End If
' imposto CurrentMachine
InitCurrentMachine(OpenProjectMachine)
' Procedo a seconda del risultato
LoadingWndHelper.UpdateLoadingWnd(ActiveIds.OPENPROD, 2, EgtMsg(63005), 50, 70) ' Loading part list
' leggo struttura BTL
Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(0))
If IsNothing(Map.refProjectVM.BTLStructureVM) Then
m_MruFiles.Remove(sFilePath)
If Not IsNothing(ProjectManagerVM.CurrProd) AndAlso sFilePath <> ProjectManagerVM.CurrProd.sProdPath Then
OpenProject(ProjectManagerVM.CurrProd)
Else
NewProject()
End If
MessageBox.Show(Application.Current.MainWindow, EgtMsg(10003) & " '" & sFilePath & "'", EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error opening file
EgtOutLog("Errore! Caricamento dei pezzi btl fallito!")
Return False
End If
' imposto progetto corrente
Dim OldProd As ProdFileVM = ProjectManagerVM.CurrProd
ProjectManagerVM.CurrProd = TempCurrProd
DbControllers.m_ProdController.LockByProdId(ProjectManagerVM.CurrProd.nProdId, True, Map.refMainWindowVM.MainWindowM.GetKeyNumber())
' recupero indice di modifica progetto quando caricato
Dim CommIndex As Integer = -1
Dim ActiveSessionList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetProd(m_SupervisorId)
For Each ActiveSession In ActiveSessionList
If Not IsNothing(ProjectManagerVM.CurrProd) AndAlso ActiveSession.ItemId = ProjectManagerVM.CurrProd.nProdId Then
CommIndex = ActiveSession.Index
End If
Next
LoadingWndHelper.UpdateLoadingWnd(ActiveIds.OPENPROD, 3, EgtMsg(63002), 70, 100) ' Loading machining groups
LoadingWndHelper.UpdateLoadingWnd(ActiveIds.GOTOPROD, 3, EgtMsg(63002), 50, 100) ' Loading machining groups
' carico gruppi di lavorazione
Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList()))
If IsNothing(Map.refProjectVM.MachGroupPanelVM) Then
m_MruFiles.Remove(sFilePath)
If Not IsNothing(OldProd) AndAlso sFilePath <> OldProd.sProdPath Then
OpenProject(OldProd)
Else
NewProject()
End If
MessageBox.Show(Application.Current.MainWindow, EgtMsg(10003) & " '" & sFilePath & "'", EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error opening file
EgtOutLog("Errore! Caricamento dei gruppi di lavorazione fallito!")
Return False
End If
' imposto flag secondo tipo di progetto (travi o pareti)
Dim sBTLFlag As String = If(m_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)
' fisso indice sessione di comunicazione
If CommIndex > -1 Then
ProjectManagerVM.CurrProd.SetModificationIndex(CommIndex)
End If
' 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
' se salvato, carico progetto in lista mru
If Not Map.refOnlyProdManagerVM.TempCurrProd.bIsNew Then
m_MruFiles.Add(sFilePath)
End If
' carico filtri di ricerca
Map.refProjectVM.BTLStructureVM.LoadFilters()
' imposto macchina del progetto
Map.refMachinePanelVM.SelectedMachine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = ProjectManagerVM.CurrProd.sMachine)
SectionXMaterial.SetType(ProjectManagerVM.CurrProd.nType)
Core.ViewPanelVM.UpdateBWType(ProjectManagerVM.CurrProd.nType)
' aggiorno le colonne in base al tipo progetto
Map.refRawPartListVM.UpdateColumns(ProjectManagerVM.CurrProd.nType)
Map.refFeatureInPartInRawPartListVM.UpdateColumns(ProjectManagerVM.CurrProd.nType)
' gestisco visibilita' bottoni
Map.refProjectVM.SetOnlyProdOptimizePanel_Visibility(True)
' aggiorno lista possibili nesting
Map.refOptimizePanelVM.UpdateOriginTypeList(EgtGetFirstNameInGroup(GDB_ID.ROOT, "RawParts") <> GDB_ID.NULL)
' aggiorno visibilità bottone Muovi pezzi
Map.refRawPartManagerVM.UpdateMovePartInRawPartVisibility()
' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel
Map.refCALCPanelVM.LoadMachineList()
' seleziono primo pezzo
If Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count > 0 Then
Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList(0))
End If
' aggiorno titolo
Map.refMainWindowVM.UpdateTitle()
' refresh lista mru
NotifyPropertyChanged(NameOf(MruFileNames))
' aggiorno nome macchina in statusbar
Map.refMyStatusBarVM.RefreshMachName()
LoadingWndHelper.CloseLoadingWnd(ActiveIds.OPENPROD)
Return True
End Function
#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
If Not Map.refSceneHostVM.SaveProject() Then
m_MruFiles.Remove(CurrProd.sProdPath)
Dim sMsg As String = EgtMsg(10004) & " '" & CurrProd.sProdPath & "'" 'Error saving file
MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error
EgtOutLog("Salvataggio progetto non riuscito")
Return False
End If
If bShowLoading Then LoadingWndHelper.UpdateLoadingWnd(ActiveIds.SAVEPROD, 2, EgtMsg(63013), 70, 100) ' Saving data on Db
' aggiorno pezzi su 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
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()
' aggiorno nome macchina in statusbar
Map.refMyStatusBarVM.RefreshMachName()
End If
' se nuovo progetto
If CurrProd.bIsNew Then
' resetto stato new
CurrProd.bIsNew = False
Else
' Aggiungo file a lista Mru
m_MruFiles.Add(CurrProd.sProdPath)
End If
Map.refMainWindowVM.UpdateTitle()
NotifyPropertyChanged(NameOf(MruFileNames))
If bShowLoading Then LoadingWndHelper.CloseLoadingWnd(ActiveIds.SAVEPROD)
Return True
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 Not CreateNewProd() Then
Dim sErrMsg As String = "Errore! Creazione del progetto fallita!"
MessageBox.Show(sErrMsg)
EgtOutLog(sErrMsg)
End If
Return
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
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.Name)
'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, ProjectManagerVM.CurrProd.sMachine)
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.SetOnlyProdOptimizePanel_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
If Map.refShowBeamPanelVM.bShowAll Then
' verifico se assemblato e lo annullo per salvataggio
bShowBuilding = Map.refShowBeamPanelVM.ShowBuilding_IsChecked
If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False)
' se vista singolo pezzo
Else
bShowSolid = Map.refShowBeamPanelVM.ShowSolid_IsChecked
If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, False, False)
' se pezzo selezionato lo segno e metto vista tutti
If Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then
nSelPartId = Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId
End If
Map.refProjectVM.BTLStructureVM.ShowAll(False)
End If
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 = 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 EgtImportBtl(sFile, nFlag)
' 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
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)
' aggiungo informazioni su pezzi
Dim nPartId As Integer = EgtGetFirstPart(GDB_ID.ROOT)
While nPartId <> GDB_ID.NULL
' scrivo in ogni pezzo ProjId
EgtSetInfo(nPartId, BTL_PRT_PROJ, ProjectManagerVM.CurrProd.nProjId)
' scrivo Id negli outline
Dim nPRId As Integer = 1
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia feature
If EgtExistsInfo(nOutlineId, MGR_FTR_PRC) Then
EgtSetInfo(nOutlineId, MGR_FTR_PRID, nPRId)
nPRId += 1
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
nPartId = EgtGetNextPart(nPartId)
End While
' scrivo info proj e type su layer BtlInfo
Dim nBTLInfoLayer As Integer = EgtGetLastNameInGroup(GDB_ID.ROOT, BTLINFO)
EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, ProjectManagerVM.CurrProd.nProjId)
EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType)
' 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
For Each BTLPartToOverwriteWith In UpdateBTLWndVM.BTLPartList
If BTLPartToOverwriteWith.bInsert Then
Dim BTLPartToUpdate As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPDN = BTLPartToOverwriteWith.nPDN)
' se BTLPartToUpdate è Nothing significa che il pezzo è nuovo e quindi basta accodarlo senza eliminare nulla
If Not IsNothing(BTLPartToUpdate) Then
Dim nPartToDeleteId As Integer = BTLPartToUpdate.nPartId
Dim nCurrPartId = EgtGetCurrPart()
EgtErase(nPartToDeleteId)
nCurrPartId = EgtGetCurrPart()
' verifico se rimuovere sezione dalla lista
If Not Map.refProjectVM.BTLStructureVM.BTLPartVMList.Any(Function(x) x IsNot BTLPartToUpdate AndAlso x.Section = BTLPartToUpdate.Section) Then
Map.refProjectVM.BTLStructureVM.SectionList.Remove(BTLPartToUpdate.Section)
End If
' rimuovo dalla lista pezzi
Dim Index As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList.IndexOf(BTLPartToUpdate)
Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Nothing)
Map.refProjectVM.BTLStructureVM.BTLPartVMList.RemoveAt(Index)
End If
End If
Next
' 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 & "\Projs\" & ProjectManagerVM.CurrProd.nProjIdList(0).ToString("0000") & "\" & 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
If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return Nothing
If IsNothing(CurrProd) Then Return Nothing
' 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() <> System.Windows.Forms.DialogResult.OK Then Return Nothing
If ExportDlg.ShowDialog() <> True 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
'If Map.refMainMenuVM.SelPage = Pages.VIEW OrElse Map.refMainMenuVM.SelPage = Pages.ONLYPRODPAGE Then
' Configuration.ShowAllPieces(bShowBuilding)
'End If
Dim bShowBuilding As Boolean = False
If Map.refShowBeamPanelVM.bShowAll Then
' verifico se assemblato e lo annullo per salvataggio
bShowBuilding = Map.refShowBeamPanelVM.ShowBuilding_IsChecked
If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False)
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)
Dim Machine As Machine = Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = sMachine)
'' se la macchina del progetto in apertura non è tra le macchine disponibili lo segnalo e apro un progetto vuoto
'If IsNothing(Machine) Then
' LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTPROJECT)
' MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error
' Return
'End If
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.Name)
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 Save()
If bOk Then
'' copio file BTL e progetto
'Dim sBTLFromPath As String = sProjectimportDir & "\" & BTLFileNameList(nProjIndex) & ".btl"
'Dim sProjFileName As String = CurrProd.sProdDirPath & "\Projs\" & ProjectManagerVM.CurrProd.nProjIdList(0).ToString("0000") & "\" & 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
' lancio verifica perche' importato
Map.refCALCPanelVM.VerifyAll(ProjectType.PROJ)
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)
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()
If Not CreateNewProj(CurrProd, 0) Then
MessageBox.Show("Errore! Aggiunta file fallita!")
End If
Return
' 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 "AddBTL"
'''
''' Returns a command that do Save.
'''
Public ReadOnly Property AddBTL_Command As ICommand
Get
If m_cmdAddBTL Is Nothing Then
m_cmdAddBTL = New Command(AddressOf AddBTL)
End If
Return m_cmdAddBTL
End Get
End Property
'''
''' Execute the Save. This method is invoked by the SaveCommand.
'''
Public Sub AddBTL()
'' verifico ci sia un progetto aperto
If IsNothing(CurrProd) Then Return
' apro finestra scelta file
Dim sDir As String = String.Empty
GetMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, "", sDir)
Dim sFile As String = ""
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
Dim nNewProjId 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
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
End If
''LoadingWndHelper.OpenLoadingWnd(ActiveIds.IMPORTBTL, 3, EgtMsg(63008), EgtMsg(63009), 50) ' BTL file importing ' Reading BTL file
' inizializzo nuovo progetto
InitNewProj(nNewProjId, sProjDir, CurrProd.nType, CurrProd.sMachine)
''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 = CurrProd.sProdDirPath & "\" & 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
' aggiungo file BTL
'Dim nPartCount As Integer = EgtGetPartCount()
If bOk Then
bOk = Map.refSceneHostVM.MainController.InsertProject(sBtlCopyPath, False)
End If
Dim sProjFileName As String = sProjDir & "\" & nNewProjId.ToString("0000") & ".nge"
' Dim nNewPartCount As Integer = EgtGetPartCount()
If bOk Then ' AndAlso nNewPartCount > nPartCount 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(nNewProjId, sBTLFileName, sBTLFileName, Map.refProjectVM.BTLStructureVM.sLISTNAME, ExportDate, nType, ProjectManagerVM.CurrProd.sMachine)
SetCurrProj(nNewProjId)
' 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.SetOnlyProdOptimizePanel_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(nNewProjId, 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(nNewProjId, sProjDir)
'' aggiorno titolo
'Map.refMainWindowVM.UpdateTitle()
'LoadingWndHelper.CloseLoadingWnd(ActiveIds.IMPORTBTL)
'' 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, nNewProjId)
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 ' AddBTL
#Region "ShowPopUpStartBtnCommand"
Public ReadOnly Property ShowPopUpStartBtnCommand As ICommand
Get
If m_cmdShowPopUpStartBtnCmd Is Nothing Then
m_cmdShowPopUpStartBtnCmd = New Command(AddressOf ShowPopUpStartBtn)
End If
Return m_cmdShowPopUpStartBtnCmd
End Get
End Property
Public Sub ShowPopUpStartBtn(ByVal param As Object)
If m_IsStartBtnOpen Then
SetIsStartBtnOpen(False)
Else
SetIsStartBtnOpen(True)
End If
End Sub
#End Region ' ShowPopUpStartBtnCommand
#Region "ShowPopUpSaveBtnCommand"
Public ReadOnly Property ShowPopUpSaveBtnCommand As ICommand
Get
If m_cmdShowPopUpSaveBtnCmd Is Nothing Then
m_cmdShowPopUpSaveBtnCmd = New Command(AddressOf ShowPopUpSaveBtn)
End If
Return m_cmdShowPopUpSaveBtnCmd
End Get
End Property
Public Sub ShowPopUpSaveBtn(ByVal param As Object)
If m_IsSaveBtnOpen Then
SetIsSaveBtnOpen(False)
Else
SetIsSaveBtnOpen(True)
End If
End Sub
#End Region ' ShowPopUpSaveBtnCommand
#Region "ShowPopUpBtlBtnCommand"
Public ReadOnly Property ShowPopUpBtlBtnCommand As ICommand
Get
If m_cmdShowPopUpBtlBtnCmd Is Nothing Then
m_cmdShowPopUpBtlBtnCmd = New Command(AddressOf ShowPopUpBtlBtn)
End If
Return m_cmdShowPopUpBtlBtnCmd
End Get
End Property
Public Sub ShowPopUpBtlBtn(ByVal param As Object)
If m_IsBtlBtnOpen Then
SetIsBtlBtnOpen(False)
Else
SetIsBtlBtnOpen(True)
End If
End Sub
#End Region ' ShowPopUpBtlBtnCommand
#End Region ' Commands
End Class