Imports System.ComponentModel Imports System.IO Imports System.Windows.Forms.Integration Imports EgtUILib 'Imports System.Text.RegularExpressions Public Class SceneManagerViewModel Implements INotifyPropertyChanged ' riferimento alla finestra principale Private m_rfMainWindowViewModel As MainWindowViewModel Friend bProtectKey As Boolean = True Private m_ShowPanel As ShowPanelView Public ReadOnly Property ShowPanel As ShowPanelView Get If IsNothing(m_ShowPanel) Then m_ShowPanel = New ShowPanelView m_ShowPanel.DataContext = New ShowPanelViewModel(Me) End If Return m_ShowPanel End Get End Property Private m_ViewPanel As ViewPanelView Public ReadOnly Property ViewPanel As ViewPanelView Get If IsNothing(m_ViewPanel) Then m_ViewPanel = New ViewPanelView m_ViewPanel.DataContext = New ViewPanelViewModel(Me) End If Return m_ViewPanel End Get End Property Private m_PopUpViewPanel As PopUpViewPanelView Public ReadOnly Property PopUpViewPanel As PopUpViewPanelView Get If IsNothing(m_PopUpViewPanel) Then m_PopUpViewPanel = New PopUpViewPanelView m_PopUpViewPanel.DataContext = New PopUpViewPanelViewModel(Me) End If Return m_PopUpViewPanel End Get End Property Private m_InstrumentPanel As InstrumentPanelView Public ReadOnly Property InstrumentPanel As InstrumentPanelView Get If IsNothing(m_InstrumentPanel) Then m_InstrumentPanel = New InstrumentPanelView m_InstrumentPanel.DataContext = New InstrumentPanelViewModel(Me) End If Return m_InstrumentPanel End Get End Property Private m_RefreshPanel As RefreshPanelView Public ReadOnly Property RefreshPanel As RefreshPanelView Get If IsNothing(m_RefreshPanel) Then m_RefreshPanel = New RefreshPanelView m_RefreshPanel.DataContext = New RefreshPanelViewModel(Me) End If Return m_RefreshPanel End Get End Property Private m_StatusBar As StatusBarView Public ReadOnly Property StatusBar As StatusBarView Get If IsNothing(m_StatusBar) Then m_StatusBar = New StatusBarView m_StatusBar.DataContext = New StatusBarViewModel(Me) End If Return m_StatusBar End Get End Property 'PROJECT PAGE'S SCENE FIELDS AND PROPERTIES ' Reference to the ProjectScene Private WithEvents m_ProjectScene As New Scene Public ReadOnly Property ProjectScene As Scene Get Return m_ProjectScene End Get End Property ' Property used to bind the scene to the WindowsFormsHost in XAML Private m_ProjectSceneHost As WindowsFormsHost Public ReadOnly Property ProjectSceneHost As WindowsFormsHost Get If IsNothing(m_ProjectSceneHost) Then m_ProjectSceneHost = New WindowsFormsHost() With {.Child = m_ProjectScene} ' Creazione scena PreInitializeScene() If Not m_ProjectScene.Init() Then bProtectKey = False EgtOutLog(EgtMsg(5129)) m_ProjectSceneHost.Child = Nothing ' Box di avviso chiave mancante MessageBox.Show(EgtMsg(MSG_MISSINGKEYWD + 2) & vbCrLf & EgtMsg(MSG_MISSINGKEYWD + 3), EgtMsg(MSG_MISSINGKEYWD + 1), MessageBoxButton.OK, MessageBoxImage.Error) ' Chiudo il programma Application.Current.Shutdown() ' Verifico abilitazione prodotto ElseIf (IniFile.m_nKeyOptions And KEY_OPT.DOORCREATOR) = 0 Then MsgBox(EgtMsg(MSG_MISSINGKEYWD + 5), MsgBoxStyle.OkOnly, EgtMsg(MSG_MISSINGKEYWD + 1)) ' Chiudo il programma Application.Current.Shutdown() ' Tutto bene Else EgtSetCurrentContext(m_ProjectScene.GetCtx) PostInitializeScene() m_ProjectScene.SetStatusNull() End If End If Return m_ProjectSceneHost End Get End Property ' ''#Region "Messages" ' '' Public ReadOnly Property RefreshMsg As String ' '' Get ' '' Return EgtMsg(50301) ' '' End Get ' '' End Property ' ''#End Region ' ''#Region "ToolTip" ' '' Public ReadOnly Property RefreschToolTip As String ' '' Get ' '' Return EgtMsg(50301) ' '' End Get ' '' End Property ' ''#End Region ' Scene controller Private WithEvents m_Controller As New Controller ' definizione comando Private m_CmdRefreshBtn As ICommand Sub New(ByRef MainWindowViewModel As MainWindowViewModel) m_rfMainWindowViewModel = MainWindowViewModel End Sub Private Sub PreInitializeScene() ' imposto colore di default Dim DefColor As New Color3d(0, 0, 0) GetPrivateProfileColor(S_GEOMDB, K_DEFAULTCOLOR, DefColor) m_ProjectScene.SetDefaultMaterial(DefColor) ' imposto colori sfondo Dim BackTopColor As New Color3d(192, 192, 192) GetPrivateProfileColor(S_SCENE, K_BACKTOP, BackTopColor) Dim BackBotColor As New Color3d(BackTopColor) GetPrivateProfileColor(S_SCENE, K_BACKBOTTOM, BackBotColor) m_ProjectScene.SetViewBackground(BackTopColor, BackBotColor) ' imposto colore di evidenziazione Dim MarkColor As New Color3d(255, 255, 0) GetPrivateProfileColor(S_SCENE, K_MARK, MarkColor) m_ProjectScene.SetMarkMaterial(MarkColor) ' imposto colore per superfici selezionate Dim SelSurfColor As New Color3d(255, 255, 192) GetPrivateProfileColor(S_SCENE, K_SELSURF, SelSurfColor) m_ProjectScene.SetSelSurfMaterial(SelSurfColor) ' imposto tipo e colore del rettangolo di zoom Dim bOutline As Boolean = True Dim ZwColor As New Color3d(0, 0, 0) GetPrivateProfileZoomWin(S_SCENE, K_ZOOMWIN, bOutline, ZwColor) m_ProjectScene.SetZoomWinAttribs(bOutline, ZwColor) ' imposto colore della linea di distanza Dim DstLnColor As New Color3d(255, 0, 0) GetPrivateProfileColor(S_SCENE, K_DISTLINE, DstLnColor) m_ProjectScene.SetDistLineMaterial(DstLnColor) ' imposto parametri OpenGL Dim nDriver As Integer = GetPrivateProfileInt(S_OPENGL, K_DRIVER, 3) Dim b2Buff As Boolean = (GetPrivateProfileInt(S_OPENGL, K_DOUBLEBUFFER, 1) <> 0) Dim nColorBits As Integer = GetPrivateProfileInt(S_OPENGL, K_COLORBITS, 32) Dim nDepthBits As Integer = GetPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32) m_ProjectScene.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits) End Sub Private Sub PostInitializeScene() ' Impostazioni Controller m_Controller.SetScene(m_ProjectScene) Dim bLuaReg As Boolean = (GetPrivateProfileInt(S_GENERAL, K_COMMANDLOG, 0) <> 0) Dim nShowMode As Integer = GetPrivateProfileInt(S_SCENE, K_SHOWMODE, SM.SHADING) Dim nShowCurveDir As Integer = GetPrivateProfileInt(S_SCENE, K_CURVEDIR, 0) End Sub 'questo metodo restituisce l'errore letto nel file CurrDoor.txt Friend Sub ShowGraphicError() Dim FileContent() As String ' controllo se esite il file CurrDoor.txt If Not File.Exists(IniFile.m_sTempDir & "\" & TEMP_FILE_TXT) Then Return FileContent = File.ReadAllLines(IniFile.m_sTempDir & "\" & TEMP_FILE_TXT) ' se il file esiste ma è vuoto If FileContent.Count = 0 Then MessageBox.Show(EgtMsg(50107), EgtMsg(50101), MessageBoxButton.OK, MessageBoxImage.Error) End If Dim IndexLine As Integer = 0 Dim nMsgErr As Integer = 0 ' leggo il valore numerico (se il valore non è numerico è passato di default il valore 0) nMsgErr = RegexFunction.ErrDraw(FileContent(IndexLine)) ' passo alla riga succesiva IndexLine += 1 ' se il valore è maggiore di zero allora è un errore If nMsgErr > 0 Then ' salto tutte le righe vuote While String.IsNullOrEmpty(FileContent(IndexLine)) AndAlso IndexLine < FileContent.Count IndexLine += 1 End While DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).m_MsgGraphic = FileContent(IndexLine) 'MessageBox.Show(FileContent(IndexLine), "Error", MessageBoxButton.OK, MessageBoxImage.Error) ' se compare u errore disattivo il righello DirectCast(Me.InstrumentPanel.DataContext, InstrumentPanelViewModel).GetDistIsChecked = False ' rendo visibile il bottone dell'errore DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).ButtonVisibility = Visibility.Visible DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).MsgError = EgtMsg(50101) & nMsgErr ' altrimenti un avvertimento ElseIf nMsgErr < 0 Then While String.IsNullOrEmpty(FileContent(IndexLine)) AndAlso IndexLine < FileContent.Count IndexLine += 1 End While DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).m_MsgGraphic = FileContent(IndexLine) 'MessageBox.Show(FileContent(IndexLine), "Warning", MessageBoxButton.OK, MessageBoxImage.Warning) DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).ButtonVisibility = Visibility.Visible DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).MsgError = EgtMsg(50144) & nMsgErr End If If nMsgErr = 0 Then 'DirectCast(Me.StatusBar.DataContext, StatusBarViewModel).StatusOutput = String.Empty DirectCast(Me.RefreshPanel.DataContext, RefreshPanelViewModel).ButtonVisibility = Visibility.Collapsed End If End Sub #Region "COMMAND" #Region "RefreshBtnCommand" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property RefreshBtnCommand As ICommand Get If m_CmdRefreshBtn Is Nothing Then m_CmdRefreshBtn = New Command(AddressOf RefreshBtn) End If Return m_CmdRefreshBtn End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub RefreshBtn() Dim rfDoorParametersViewModel As DoorParametersViewModel = DirectCast(m_rfMainWindowViewModel.DoorParameters.DataContext, DoorParametersViewModel) Dim CurrDoorPath As String = IniFile.m_sTempDir & "\" & TEMP_FILE If Not IsNothing(rfDoorParametersViewModel.CurrDoor) AndAlso Not String.IsNullOrWhiteSpace(DirectCast(m_rfMainWindowViewModel.DoorManager.DataContext, DoorManagerViewModel).SelectedDoor) Then DdfFile.WriteDDF(rfDoorParametersViewModel.CurrDoor, CurrDoorPath, True) ExecDoors(m_ProjectScene, CurrDoorPath) End If ShowGraphicError() End Sub #End Region ' RefreshBtnCommand #End Region ' Command #Region "EVENTS" Sub m_ProjectScene_OnChangedSnapPointType(sender As Object, nSpType As EgtUILib.EgtInterface.SP, bForced As Boolean) Handles m_ProjectScene.OnChangedSnapPointType Dim rfStatusBarViewModel As StatusBarViewModel = DirectCast(m_StatusBar.DataContext, StatusBarViewModel) For SnapIndex = 0 To rfStatusBarViewModel.SnapPointTypeList.Count - 1 Dim TempSnapPoint As SPItem = rfStatusBarViewModel.SnapPointTypeList(SnapIndex) If TempSnapPoint.SPValue = nSpType Then rfStatusBarViewModel.SnapPointSelect = TempSnapPoint End If Next End Sub Sub m_ProjectScene_OnShowDistance(sender As Object, sDistance As String) Handles m_ProjectScene.OnShowDistance ' se deseleziono il righello Dim rfStatusBarViewModel As StatusBarViewModel = DirectCast(m_StatusBar.DataContext, StatusBarViewModel) Dim rfInstrumentPanel As InstrumentPanelViewModel = DirectCast(m_InstrumentPanel.DataContext, InstrumentPanelViewModel) ' restituisco una stringa vuota alla textblock che contiene la distanza rfStatusBarViewModel.StatusOutput = sDistance End Sub #End Region Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Public Sub NotifyPropertyChanged(propName As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName)) End Sub End Class